diff options
author | Thomas Haller <thaller@redhat.com> | 2022-07-26 17:58:20 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2022-08-09 08:02:47 +0200 |
commit | 3a8864a5858df5628b77c4e8900816c741a4d473 (patch) | |
tree | 2b1098da1966f24f21c75ac9efaf273d7e30b4e4 | |
parent | 370147cf9da093cffc50cf2a298ef2a49d93fe06 (diff) | |
download | NetworkManager-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.c | 28 |
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; |