summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFernando Fernandez Mancera <ffmancera@riseup.net>2023-02-20 17:39:29 +0100
committerFernando Fernandez Mancera <ffmancera@riseup.net>2023-02-21 17:46:30 +0100
commit779cf25606490ef0335bca5cbb355e63ca575c99 (patch)
tree58df08cecf212d1996dc30355dee04dca2647f31
parent934e0192707ac1cedeee492ad728d23c22730b8d (diff)
downloadNetworkManager-779cf25606490ef0335bca5cbb355e63ca575c99.tar.gz
platform: introduce function to globally track local route rule
The new function tracks local route rule in the GlobalTracker properly. It also allow the developer to specify the untrack user tag. (cherry picked from commit 79611e4fcc0c06fd12f7a13ff6fdcb0abc36616e)
-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 09f1e21711..122ba0ea7f 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 08a4d85f41..c6d7bc11d0 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,