summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2022-02-07 19:23:27 +0100
committerThomas Haller <thaller@redhat.com>2022-02-09 19:13:05 +0100
commit5489aa596b23890480bc64657c96e2997a762f06 (patch)
tree28b9bb5b66c1396f930df80d8708c8f3ab2da831
parent81f6ba83776a89036983ec226932f5730fa52032 (diff)
downloadNetworkManager-5489aa596b23890480bc64657c96e2997a762f06.tar.gz
platform: return boolean changed value from nmp_route_manager_track()
-rw-r--r--src/libnm-platform/nmp-route-manager.c57
-rw-r--r--src/libnm-platform/nmp-route-manager.h46
2 files changed, 61 insertions, 42 deletions
diff --git a/src/libnm-platform/nmp-route-manager.c b/src/libnm-platform/nmp-route-manager.c
index 6828bb57f9..c5ca02600c 100644
--- a/src/libnm-platform/nmp-route-manager.c
+++ b/src/libnm-platform/nmp-route-manager.c
@@ -286,8 +286,10 @@ _track_data_lookup(GHashTable *by_data, const NMPObject *obj, gconstpointer user
* because it enforces ownership of the now tracked rule. On the other hand,
* a plain nmp_route_manager_untrack_rule() merely forgets about the tracking.
* The purpose here is to set this to %NMP_ROUTE_MANAGER_EXTERN_WEAKLY_TRACKED_USER_TAG.
+ *
+ * Returns: %TRUE, if something changed.
*/
-void
+gboolean
nmp_route_manager_track(NMPRouteManager *self,
NMPObjectType obj_type,
gconstpointer obj,
@@ -300,19 +302,22 @@ nmp_route_manager_track(NMPRouteManager *self,
TrackData *track_data;
TrackObjData *obj_data;
TrackUserTagData *user_tag_data;
- gboolean changed = FALSE;
+ gboolean changed = FALSE;
+ gboolean changed_untrack = FALSE;
guint32 track_priority_val;
gboolean track_priority_present;
- g_return_if_fail(NMP_IS_ROUTE_MANAGER(self));
- g_return_if_fail(obj);
- g_return_if_fail(user_tag);
+ g_return_val_if_fail(NMP_IS_ROUTE_MANAGER(self), FALSE);
+ g_return_val_if_fail(obj, FALSE);
+ g_return_val_if_fail(user_tag, FALSE);
/* The route must not be tied to an interface. We can only handle here
* blackhole/unreachable/prohibit route types. */
- g_return_if_fail(obj_type == NMP_OBJECT_TYPE_ROUTING_RULE
- || (NM_IN_SET(obj_type, NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE)
- && ((const NMPlatformIPRoute *) obj)->ifindex == 0));
+ g_return_val_if_fail(
+ obj_type == NMP_OBJECT_TYPE_ROUTING_RULE
+ || (NM_IN_SET(obj_type, NMP_OBJECT_TYPE_IP4_ROUTE, NMP_OBJECT_TYPE_IP6_ROUTE)
+ && ((const NMPlatformIPRoute *) obj)->ifindex == 0),
+ FALSE);
nm_assert(track_priority != G_MININT32);
@@ -381,8 +386,10 @@ nmp_route_manager_track(NMPRouteManager *self,
TrackData *track_data_untrack;
track_data_untrack = _track_data_lookup(self->by_data, p_obj_stack, user_tag_untrack);
- if (track_data_untrack)
+ if (track_data_untrack) {
_track_data_untrack(self, track_data_untrack, FALSE, TRUE);
+ changed_untrack = TRUE;
+ }
} else
nm_assert_not_reached();
}
@@ -399,6 +406,8 @@ nmp_route_manager_track(NMPRouteManager *self,
NMP_OBJECT_GET_CLASS(track_data->obj)->obj_type_name,
nmp_object_to_string(track_data->obj, NMP_OBJECT_TO_STRING_PUBLIC, NULL, 0));
}
+
+ return changed || changed_untrack;
}
static void
@@ -453,7 +462,7 @@ _track_data_untrack(NMPRouteManager *self,
g_hash_table_remove(self->by_data, track_data);
}
-void
+gboolean
nmp_route_manager_untrack(NMPRouteManager *self,
NMPObjectType obj_type,
gconstpointer obj,
@@ -462,22 +471,27 @@ nmp_route_manager_untrack(NMPRouteManager *self,
NMPObject obj_stack;
const NMPObject *p_obj_stack;
TrackData *track_data;
+ gboolean changed = FALSE;
- g_return_if_fail(NMP_IS_ROUTE_MANAGER(self));
+ g_return_val_if_fail(NMP_IS_ROUTE_MANAGER(self), FALSE);
nm_assert(NM_IN_SET(obj_type,
NMP_OBJECT_TYPE_IP4_ROUTE,
NMP_OBJECT_TYPE_IP6_ROUTE,
NMP_OBJECT_TYPE_ROUTING_RULE));
- g_return_if_fail(obj);
- g_return_if_fail(user_tag);
+ g_return_val_if_fail(obj, FALSE);
+ g_return_val_if_fail(user_tag, FALSE);
p_obj_stack = nmp_object_stackinit(&obj_stack, obj_type, obj);
nm_assert(nmp_object_is_visible(p_obj_stack));
track_data = _track_data_lookup(self->by_data, p_obj_stack, user_tag);
- if (track_data)
+ if (track_data) {
_track_data_untrack(self, track_data, TRUE, FALSE);
+ changed = TRUE;
+ }
+
+ return changed;
}
void
@@ -497,7 +511,7 @@ nmp_route_manager_set_dirty(NMPRouteManager *self, gconstpointer user_tag)
track_data->dirty = TRUE;
}
-void
+gboolean
nmp_route_manager_untrack_all(NMPRouteManager *self,
gconstpointer user_tag,
gboolean all /* or only dirty */)
@@ -505,23 +519,28 @@ nmp_route_manager_untrack_all(NMPRouteManager *self,
TrackData *track_data;
TrackData *track_data_safe;
TrackUserTagData *user_tag_data;
+ gboolean changed = FALSE;
- g_return_if_fail(NMP_IS_ROUTE_MANAGER(self));
- g_return_if_fail(user_tag);
+ g_return_val_if_fail(NMP_IS_ROUTE_MANAGER(self), FALSE);
+ g_return_val_if_fail(user_tag, FALSE);
user_tag_data = g_hash_table_lookup(self->by_user_tag, &user_tag);
if (!user_tag_data)
- return;
+ return FALSE;
c_list_for_each_entry_safe (track_data,
track_data_safe,
&user_tag_data->user_tag_lst_head,
user_tag_lst) {
- if (all || track_data->dirty)
+ if (all || track_data->dirty) {
_track_data_untrack(self, track_data, FALSE, FALSE);
+ changed = TRUE;
+ }
}
if (c_list_is_empty(&user_tag_data->user_tag_lst_head))
g_hash_table_remove(self->by_user_tag, user_tag_data);
+
+ return changed;
}
/*****************************************************************************/
diff --git a/src/libnm-platform/nmp-route-manager.h b/src/libnm-platform/nmp-route-manager.h
index 23e4c2d341..a61a68ca98 100644
--- a/src/libnm-platform/nmp-route-manager.h
+++ b/src/libnm-platform/nmp-route-manager.h
@@ -19,26 +19,26 @@ void nmp_route_manager_unref(NMPRouteManager *self);
#define nm_auto_unref_route_manager nm_auto(_nmp_route_manager_unref)
NM_AUTO_DEFINE_FCN0(NMPRouteManager *, _nmp_route_manager_unref, nmp_route_manager_unref);
-void nmp_route_manager_track(NMPRouteManager *self,
- NMPObjectType obj_type,
- gconstpointer obj,
- gint32 track_priority,
- gconstpointer user_tag,
- gconstpointer user_tag_untrack);
-
-static inline void
+gboolean nmp_route_manager_track(NMPRouteManager *self,
+ NMPObjectType obj_type,
+ gconstpointer obj,
+ gint32 track_priority,
+ gconstpointer user_tag,
+ gconstpointer user_tag_untrack);
+
+static inline gboolean
nmp_route_manager_track_rule(NMPRouteManager *self,
const NMPlatformRoutingRule *routing_rule,
gint32 track_priority,
gconstpointer user_tag,
gconstpointer user_tag_untrack)
{
- nmp_route_manager_track(self,
- NMP_OBJECT_TYPE_ROUTING_RULE,
- routing_rule,
- track_priority,
- user_tag,
- user_tag_untrack);
+ return nmp_route_manager_track(self,
+ NMP_OBJECT_TYPE_ROUTING_RULE,
+ routing_rule,
+ track_priority,
+ user_tag,
+ user_tag_untrack);
}
void nmp_route_manager_track_rule_default(NMPRouteManager *self,
@@ -52,24 +52,24 @@ void nmp_route_manager_track_rule_from_platform(NMPRouteManager *self,
gint32 tracking_priority,
gconstpointer user_tag);
-void nmp_route_manager_untrack(NMPRouteManager *self,
- NMPObjectType obj_type,
- gconstpointer obj,
- gconstpointer user_tag);
+gboolean nmp_route_manager_untrack(NMPRouteManager *self,
+ NMPObjectType obj_type,
+ gconstpointer obj,
+ gconstpointer user_tag);
-static inline void
+static inline gboolean
nmp_route_manager_untrack_rule(NMPRouteManager *self,
const NMPlatformRoutingRule *routing_rule,
gconstpointer user_tag)
{
- nmp_route_manager_untrack(self, NMP_OBJECT_TYPE_ROUTING_RULE, routing_rule, user_tag);
+ return nmp_route_manager_untrack(self, NMP_OBJECT_TYPE_ROUTING_RULE, routing_rule, user_tag);
}
void nmp_route_manager_set_dirty(NMPRouteManager *self, gconstpointer user_tag);
-void nmp_route_manager_untrack_all(NMPRouteManager *self,
- gconstpointer user_tag,
- gboolean all /* or only dirty */);
+gboolean nmp_route_manager_untrack_all(NMPRouteManager *self,
+ gconstpointer user_tag,
+ gboolean all /* or only dirty */);
void nmp_route_manager_sync(NMPRouteManager *self, NMPObjectType obj_type, gboolean keep_deleted);