diff options
Diffstat (limited to 'src/libnm-platform/nmp-global-tracker.c')
| -rw-r--r-- | src/libnm-platform/nmp-global-tracker.c | 45 |
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); } } |