summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2021-09-15 23:16:25 +0200
committerThomas Haller <thaller@redhat.com>2021-09-15 23:23:19 +0200
commit6b92c89486562866b9951133c19b16ca9cff1eac (patch)
tree6be5ad65b8f031423ae620852e60b2651e0438f6
parent2ab0eba10672f1b66ffb5e6330a9c06363ba1f6e (diff)
downloadNetworkManager-6b92c89486562866b9951133c19b16ca9cff1eac.tar.gz
l3cfg: track platform object in NML3Cfg's object state
NML3Cfg tracks the state of each object (that is addresses and routes). Previously, it had a boolean flag "os_in_platform", that should be true if (and only if) we have a corresponding NMPObject in the platform cache. But NMPObjects are immutable and ref-counted. That means, we can just as well track the reference to the NMPObject from the cache. The advantage is that we have an index (dictionary) to find the object state, and by tracking the platform object, we have it easily accessible.
-rw-r--r--src/core/nm-l3cfg.c57
1 files changed, 31 insertions, 26 deletions
diff --git a/src/core/nm-l3cfg.c b/src/core/nm-l3cfg.c
index a17511d6ed..ce3b56f312 100644
--- a/src/core/nm-l3cfg.c
+++ b/src/core/nm-l3cfg.c
@@ -111,6 +111,13 @@ G_STATIC_ASSERT(G_STRUCT_OFFSET(AcdData, info.addr) == 0);
typedef struct {
const NMPObject *obj;
+ /* Whether obj is currently in the platform cache or not.
+ * Since "obj" is the NMPObject from the merged NML3ConfigData,
+ * the object in platform has the same ID (but may otherwise not
+ * be identical). If this is not NULL, then currently the object
+ * is configured in kernel. */
+ const NMPObject *os_plobj;
+
CList os_lst;
/* If we have a timeout pending, we link the instance to
@@ -138,12 +145,6 @@ typedef struct {
* how often we try that. When the counter reaches zero, we forget about it. */
guint8 os_zombie_count;
- /* whether obj is currently in the platform cache or not.
- * Since "obj" is the NMPObject from the merged NML3ConfigData,
- * the object in platform has the same ID (but may otherwise not
- * be identical). */
- bool os_in_platform : 1;
-
/* whether we ever saw the object in platform. */
bool os_was_in_platform : 1;
@@ -605,7 +606,7 @@ _nm_n_acd_data_probe_new(NML3Cfg *self, in_addr_t addr, guint32 timeout_msec, gp
NMP_OBJECT_TYPE_IP6_ADDRESS, \
NMP_OBJECT_TYPE_IP4_ROUTE, \
NMP_OBJECT_TYPE_IP6_ROUTE)); \
- nm_assert(!_obj_state->os_in_platform || _obj_state->os_was_in_platform); \
+ nm_assert(!_obj_state->os_plobj || _obj_state->os_was_in_platform); \
nm_assert((_obj_state->os_temporary_not_available_timestamp_msec == 0) \
== c_list_is_empty(&_obj_state->os_temporary_not_available_lst)); \
if (_self) { \
@@ -618,10 +619,10 @@ _nm_n_acd_data_probe_new(NML3Cfg *self, in_addr_t addr, guint32 timeout_msec, gp
(_obj_state->os_temporary_not_available_timestamp_msec == 0) \
|| c_list_contains(&_self->priv.p->obj_state_temporary_not_available_lst_head, \
&_obj_state->os_temporary_not_available_lst)); \
- nm_assert(_obj_state->os_in_platform \
- == (!!nm_platform_lookup_entry(_self->priv.platform, \
- NMP_CACHE_ID_TYPE_OBJECT_TYPE, \
- _obj_state->obj))); \
+ nm_assert(_obj_state->os_plobj \
+ == nm_platform_lookup_obj(_self->priv.platform, \
+ NMP_CACHE_ID_TYPE_OBJECT_TYPE, \
+ _obj_state->obj)); \
nm_assert( \
c_list_is_empty(&obj_state->os_zombie_lst) \
? (_obj_state->obj \
@@ -644,15 +645,15 @@ _obj_state_data_get_assume_config_once(const ObjStateData *obj_state)
}
static ObjStateData *
-_obj_state_data_new(const NMPObject *obj, gboolean in_platform)
+_obj_state_data_new(const NMPObject *obj, const NMPObject *plobj)
{
ObjStateData *obj_state;
obj_state = g_slice_new(ObjStateData);
*obj_state = (ObjStateData){
.obj = nmp_object_ref(obj),
- .os_in_platform = in_platform,
- .os_was_in_platform = in_platform,
+ .os_plobj = nmp_object_ref(plobj),
+ .os_was_in_platform = !!plobj,
.os_nm_configured = FALSE,
.os_dirty = FALSE,
.os_temporary_not_available_lst = C_LIST_INIT(obj_state->os_temporary_not_available_lst),
@@ -698,7 +699,7 @@ _obj_state_data_to_string(const ObjStateData *obj_state, char *buf, gsize buf_si
if (obj_state->os_nm_configured)
nm_strbuf_append_str(&buf, &buf_size, ", nm-configured");
- if (obj_state->os_in_platform) {
+ if (obj_state->os_plobj) {
nm_assert(obj_state->os_was_in_platform);
nm_strbuf_append_str(&buf, &buf_size, ", in-platform");
} else if (obj_state->os_was_in_platform)
@@ -758,18 +759,23 @@ _obj_states_externally_removed_track(NML3Cfg *self, const NMPObject *obj, gboole
nm_assert(
in_platform
- == (!!nm_platform_lookup_entry(self->priv.platform, NMP_CACHE_ID_TYPE_OBJECT_TYPE, obj)));
+ ? (obj
+ == nm_platform_lookup_obj(self->priv.platform, NMP_CACHE_ID_TYPE_OBJECT_TYPE, obj))
+ : (!nm_platform_lookup_obj(self->priv.platform, NMP_CACHE_ID_TYPE_OBJECT_TYPE, obj)));
obj_state = g_hash_table_lookup(self->priv.p->obj_state_hash, &obj);
if (!obj_state)
return;
- if (obj_state->os_in_platform == (!!in_platform))
+ if (!in_platform)
+ obj = NULL;
+
+ if (obj_state->os_plobj == obj)
goto out;
if (!in_platform && !c_list_is_empty(&obj_state->os_zombie_lst)) {
/* this is a zombie. We can forget about it.*/
- obj_state->os_in_platform = FALSE;
+ nm_clear_nmp_object(&obj_state->os_plobj);
c_list_unlink(&obj_state->os_zombie_lst);
_LOGD("obj-state: zombie gone (untrack): %s",
_obj_state_data_to_string(obj_state, sbuf, sizeof(sbuf)));
@@ -780,14 +786,14 @@ _obj_states_externally_removed_track(NML3Cfg *self, const NMPObject *obj, gboole
nm_assert(c_list_is_empty(&obj_state->os_zombie_lst));
if (in_platform) {
- obj_state->os_in_platform = TRUE;
+ obj_state->os_plobj = nmp_object_ref(obj);
obj_state->os_was_in_platform = TRUE;
_LOGD("obj-state: appeared in platform: %s",
_obj_state_data_to_string(obj_state, sbuf, sizeof(sbuf)));
goto out;
}
- obj_state->os_in_platform = FALSE;
+ nm_clear_nmp_object(&obj_state->os_plobj);
_LOGD("obj-state: remove from platform: %s",
_obj_state_data_to_string(obj_state, sbuf, sizeof(sbuf)));
@@ -836,9 +842,9 @@ _obj_states_update_all(NML3Cfg *self)
if (!obj_state) {
obj_state =
_obj_state_data_new(obj,
- !!nm_platform_lookup_entry(self->priv.platform,
- NMP_CACHE_ID_TYPE_OBJECT_TYPE,
- obj));
+ nm_platform_lookup_obj(self->priv.platform,
+ NMP_CACHE_ID_TYPE_OBJECT_TYPE,
+ obj));
c_list_link_tail(&self->priv.p->obj_state_lst_head, &obj_state->os_lst);
g_hash_table_add(self->priv.p->obj_state_hash, obj_state);
_LOGD("obj-state: track: %s",
@@ -866,7 +872,7 @@ _obj_states_update_all(NML3Cfg *self)
if (!obj_state->os_dirty)
continue;
- if (obj_state->os_in_platform && obj_state->os_nm_configured) {
+ if (obj_state->os_plobj && obj_state->os_nm_configured) {
c_list_link_tail(&self->priv.p->obj_state_zombie_lst_head,
&obj_state->os_zombie_lst);
obj_state->os_zombie_count = ZOMBIE_COUNT_START;
@@ -932,8 +938,7 @@ _obj_states_sync_filter(/* const NMDedupMultiObj * */ gconstpointer o, gpointer
return TRUE;
}
- if (!obj_state->os_in_platform
- && sync_filter_data->commit_type != NM_L3_CFG_COMMIT_TYPE_REAPPLY)
+ if (!obj_state->os_plobj && sync_filter_data->commit_type != NM_L3_CFG_COMMIT_TYPE_REAPPLY)
return FALSE;
return TRUE;