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.
This commit is contained in:
@@ -691,8 +691,32 @@ nmp_global_tracker_sync(NMPGlobalTracker *self, NMPObjectType obj_type, gboolean
|
|||||||
|
|
||||||
plobj =
|
plobj =
|
||||||
nm_platform_lookup_obj(self->platform, NMP_CACHE_ID_TYPE_OBJECT_TYPE, obj_data->obj);
|
nm_platform_lookup_obj(self->platform, NMP_CACHE_ID_TYPE_OBJECT_TYPE, obj_data->obj);
|
||||||
if (plobj)
|
if (plobj) {
|
||||||
continue;
|
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;
|
obj_data->config_state = CONFIG_STATE_ADDED_BY_US;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user