summary refs log tree commit diff
path: root/src/libnm-platform/nmp-global-tracker.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2023-02-23 17:11:22 +0100
committerMichael Biebl <biebl@debian.org>2023-02-23 17:11:22 +0100
commitb22a7b55d0bc5a7999dccaeacdde745f5ace9d66 (patch)
tree597d2716cfa4b904c98717b874371e0e7b5e0c71 /src/libnm-platform/nmp-global-tracker.c
parent1372848511cb896b80b51ed1a3e9606bd9816631 (diff)
New upstream version 1.42.2 upstream/1.42.2
Diffstat (limited to 'src/libnm-platform/nmp-global-tracker.c')
-rw-r--r--src/libnm-platform/nmp-global-tracker.c45
1 files changed, 32 insertions, 13 deletions
diff --git a/src/libnm-platform/nmp-global-tracker.c b/src/libnm-platform/nmp-global-tracker.c
index 09f1e217..122ba0ea 100644
--- a/src/libnm-platform/nmp-global-tracker.c
+++ b/src/libnm-platform/nmp-global-tracker.c
@@ -1155,11 +1155,12 @@ nmp_global_tracker_track_rule_default(NMPGlobalTracker *self,
     /* track the default rules. See also `man ip-rule`. */
 
     if (NM_IN_SET(addr_family, AF_UNSPEC, AF_INET)) {
+        nmp_global_tracker_track_local_rule(self, addr_family, track_priority, user_tag, NULL);
         nmp_global_tracker_track_rule(self,
                                       &((NMPlatformRoutingRule){
                                           .addr_family = AF_INET,
-                                          .priority    = 0,
-                                          .table       = RT_TABLE_LOCAL,
+                                          .priority    = 32766,
+                                          .table       = RT_TABLE_MAIN,
                                           .action      = FR_ACT_TO_TBL,
                                           .protocol    = RTPROT_KERNEL,
                                       }),
@@ -1169,19 +1170,22 @@ nmp_global_tracker_track_rule_default(NMPGlobalTracker *self,
         nmp_global_tracker_track_rule(self,
                                       &((NMPlatformRoutingRule){
                                           .addr_family = AF_INET,
-                                          .priority    = 32766,
-                                          .table       = RT_TABLE_MAIN,
+                                          .priority    = 32767,
+                                          .table       = RT_TABLE_DEFAULT,
                                           .action      = FR_ACT_TO_TBL,
                                           .protocol    = RTPROT_KERNEL,
                                       }),
                                       track_priority,
                                       user_tag,
                                       NULL);
+    }
+    if (NM_IN_SET(addr_family, AF_UNSPEC, AF_INET6)) {
+        nmp_global_tracker_track_local_rule(self, addr_family, track_priority, user_tag, NULL);
         nmp_global_tracker_track_rule(self,
                                       &((NMPlatformRoutingRule){
-                                          .addr_family = AF_INET,
-                                          .priority    = 32767,
-                                          .table       = RT_TABLE_DEFAULT,
+                                          .addr_family = AF_INET6,
+                                          .priority    = 32766,
+                                          .table       = RT_TABLE_MAIN,
                                           .action      = FR_ACT_TO_TBL,
                                           .protocol    = RTPROT_KERNEL,
                                       }),
@@ -1189,10 +1193,23 @@ nmp_global_tracker_track_rule_default(NMPGlobalTracker *self,
                                       user_tag,
                                       NULL);
     }
-    if (NM_IN_SET(addr_family, AF_UNSPEC, AF_INET6)) {
+}
+
+void
+nmp_global_tracker_track_local_rule(NMPGlobalTracker *self,
+                                    int               addr_family,
+                                    gint32            track_priority,
+                                    gconstpointer     user_tag,
+                                    gconstpointer     user_tag_untrack)
+{
+    g_return_if_fail(NMP_IS_GLOBAL_TRACKER(self));
+
+    nm_assert(NM_IN_SET(addr_family, AF_UNSPEC, AF_INET, AF_INET6));
+
+    if (NM_IN_SET(addr_family, AF_UNSPEC, AF_INET)) {
         nmp_global_tracker_track_rule(self,
                                       &((NMPlatformRoutingRule){
-                                          .addr_family = AF_INET6,
+                                          .addr_family = AF_INET,
                                           .priority    = 0,
                                           .table       = RT_TABLE_LOCAL,
                                           .action      = FR_ACT_TO_TBL,
@@ -1200,18 +1217,20 @@ nmp_global_tracker_track_rule_default(NMPGlobalTracker *self,
                                       }),
                                       track_priority,
                                       user_tag,
-                                      NULL);
+                                      user_tag_untrack);
+    }
+    if (NM_IN_SET(addr_family, AF_UNSPEC, AF_INET6)) {
         nmp_global_tracker_track_rule(self,
                                       &((NMPlatformRoutingRule){
                                           .addr_family = AF_INET6,
-                                          .priority    = 32766,
-                                          .table       = RT_TABLE_MAIN,
+                                          .priority    = 0,
+                                          .table       = RT_TABLE_LOCAL,
                                           .action      = FR_ACT_TO_TBL,
                                           .protocol    = RTPROT_KERNEL,
                                       }),
                                       track_priority,
                                       user_tag,
-                                      NULL);
+                                      user_tag_untrack);
     }
 }