summary refs log tree commit diff
path: root/src/libnm-platform
diff options
context:
space:
mode:
Diffstat (limited to 'src/libnm-platform')
-rw-r--r--src/libnm-platform/nmp-global-tracker.c45
-rw-r--r--src/libnm-platform/nmp-global-tracker.h6
2 files changed, 38 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);
     }
 }
 
diff --git a/src/libnm-platform/nmp-global-tracker.h b/src/libnm-platform/nmp-global-tracker.h
index 08a4d85f..c6d7bc11 100644
--- a/src/libnm-platform/nmp-global-tracker.h
+++ b/src/libnm-platform/nmp-global-tracker.h
@@ -46,6 +46,12 @@ void nmp_global_tracker_track_rule_default(NMPGlobalTracker *self,
                                            gint32            track_priority,
                                            gconstpointer     user_tag);
 
+void nmp_global_tracker_track_local_rule(NMPGlobalTracker *self,
+                                         int               addr_family,
+                                         gint32            track_priority,
+                                         gconstpointer     user_tag,
+                                         gconstpointer     user_tag_untrack);
+
 void nmp_global_tracker_track_rule_from_platform(NMPGlobalTracker *self,
                                                  NMPlatform       *platform,
                                                  int               addr_family,