summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2022-07-26 17:58:20 +0200
committerThomas Haller <thaller@redhat.com>2022-08-09 08:02:47 +0200
commit3a8864a5858df5628b77c4e8900816c741a4d473 (patch)
tree2b1098da1966f24f21c75ac9efaf273d7e30b4e4
parent370147cf9da093cffc50cf2a298ef2a49d93fe06 (diff)
downloadNetworkManager-3a8864a5858df5628b77c4e8900816c741a4d473.tar.gz
platform: delete conflicting route/rule during nmp_global_tracker_sync()
The ID of an object does not entail all properties/attributes. During sync, if we already have an object with the same ID configured, it may still differ in other aspects. Handle those cases, by deleting such routes/rules before adding the desired object.
-rw-r--r--src/libnm-platform/nmp-global-tracker.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/src/libnm-platform/nmp-global-tracker.c b/src/libnm-platform/nmp-global-tracker.c
index dd3df38d80..c4f50918f8 100644
--- a/src/libnm-platform/nmp-global-tracker.c
+++ b/src/libnm-platform/nmp-global-tracker.c
@@ -691,8 +691,32 @@ nmp_global_tracker_sync(NMPGlobalTracker *self, NMPObjectType obj_type, gboolean
plobj =
nm_platform_lookup_obj(self->platform, NMP_CACHE_ID_TYPE_OBJECT_TYPE, obj_data->obj);
- if (plobj)
- continue;
+ if (plobj) {
+ int c;
+
+ switch (obj_type) {
+ case NMP_OBJECT_TYPE_ROUTING_RULE:
+ c = nm_platform_routing_rule_cmp(NMP_OBJECT_CAST_ROUTING_RULE(obj_data->obj),
+ NMP_OBJECT_CAST_ROUTING_RULE(plobj),
+ NM_PLATFORM_ROUTING_RULE_CMP_TYPE_SEMANTICALLY);
+ break;
+ case NMP_OBJECT_TYPE_IP4_ROUTE:
+ c = nm_platform_ip4_route_cmp(NMP_OBJECT_CAST_IP4_ROUTE(obj_data->obj),
+ NMP_OBJECT_CAST_IP4_ROUTE(plobj),
+ NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY);
+ break;
+ case NMP_OBJECT_TYPE_IP6_ROUTE:
+ c = nm_platform_ip6_route_cmp(NMP_OBJECT_CAST_IP6_ROUTE(obj_data->obj),
+ NMP_OBJECT_CAST_IP6_ROUTE(plobj),
+ NM_PLATFORM_IP_ROUTE_CMP_TYPE_SEMANTICALLY);
+ break;
+ default:
+ nm_assert_not_reached();
+ }
+ if (c == 0)
+ continue;
+ nm_platform_object_delete(self->platform, plobj);
+ }
obj_data->config_state = CONFIG_STATE_ADDED_BY_US;