l3cfg: fix nm_l3cfg_commit_type_register() to set commit_type and add debug logging

Co-authored-by: Thomas Haller <thaller@redhat.com>
This commit is contained in:
Beniamino Galvani 2021-09-28 22:15:24 +02:00 committed by Thomas Haller
parent f3def63fed
commit 8a06d66d0e
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
5 changed files with 37 additions and 14 deletions

View file

@ -601,7 +601,8 @@ _l3cd_config_add(NML3IPv4LL *self)
self->l3cfg_commit_handle = nm_l3cfg_commit_type_register(self->l3cfg, self->l3cfg_commit_handle = nm_l3cfg_commit_type_register(self->l3cfg,
NM_L3_CFG_COMMIT_TYPE_ASSUME, NM_L3_CFG_COMMIT_TYPE_ASSUME,
self->l3cfg_commit_handle); self->l3cfg_commit_handle,
"ipv4ll");
nm_l3cfg_commit_on_idle_schedule(self->l3cfg, NM_L3_CFG_COMMIT_TYPE_AUTO); nm_l3cfg_commit_on_idle_schedule(self->l3cfg, NM_L3_CFG_COMMIT_TYPE_AUTO);
} }

View file

@ -430,7 +430,8 @@ _lladdr_handle_changed(NML3IPv6LL *self)
self->l3cfg_commit_handle = nm_l3cfg_commit_type_register(self->l3cfg, self->l3cfg_commit_handle = nm_l3cfg_commit_type_register(self->l3cfg,
l3cd ? NM_L3_CFG_COMMIT_TYPE_ASSUME l3cd ? NM_L3_CFG_COMMIT_TYPE_ASSUME
: NM_L3_CFG_COMMIT_TYPE_NONE, : NM_L3_CFG_COMMIT_TYPE_NONE,
self->l3cfg_commit_handle); self->l3cfg_commit_handle,
"ipv6ll");
if (changed) if (changed)
nm_l3cfg_commit_on_idle_schedule(self->l3cfg, NM_L3_CFG_COMMIT_TYPE_AUTO); nm_l3cfg_commit_on_idle_schedule(self->l3cfg, NM_L3_CFG_COMMIT_TYPE_AUTO);

View file

@ -3811,6 +3811,7 @@ nm_l3cfg_commit_type_get(NML3Cfg *self)
* @commit_type: the commit type to register * @commit_type: the commit type to register
* @existing_handle: instead of being a new registration, update an existing handle. * @existing_handle: instead of being a new registration, update an existing handle.
* This may be %NULL, which is like having no previous registration. * This may be %NULL, which is like having no previous registration.
* @source: the source of the commit type, for logging.
* *
* NML3Cfg needs to know whether it is in charge of an interface (and how "much"). * NML3Cfg needs to know whether it is in charge of an interface (and how "much").
* By default, it is not in charge, but various users can register themself with * By default, it is not in charge, but various users can register themself with
@ -3823,11 +3824,14 @@ nm_l3cfg_commit_type_get(NML3Cfg *self)
NML3CfgCommitTypeHandle * NML3CfgCommitTypeHandle *
nm_l3cfg_commit_type_register(NML3Cfg * self, nm_l3cfg_commit_type_register(NML3Cfg * self,
NML3CfgCommitType commit_type, NML3CfgCommitType commit_type,
NML3CfgCommitTypeHandle *existing_handle) NML3CfgCommitTypeHandle *existing_handle,
const char * source)
{ {
NML3CfgCommitTypeHandle *handle; NML3CfgCommitTypeHandle *handle;
NML3CfgCommitTypeHandle *h; NML3CfgCommitTypeHandle *h;
gboolean linked; gboolean linked;
NML3CfgCommitTypeHandle *ret = NULL;
char buf[64];
nm_assert(NM_IS_L3CFG(self)); nm_assert(NM_IS_L3CFG(self));
nm_assert(NM_IN_SET(commit_type, nm_assert(NM_IN_SET(commit_type,
@ -3841,21 +3845,24 @@ nm_l3cfg_commit_type_register(NML3Cfg * self,
if (existing_handle) { if (existing_handle) {
if (commit_type == NM_L3_CFG_COMMIT_TYPE_NONE) { if (commit_type == NM_L3_CFG_COMMIT_TYPE_NONE) {
nm_l3cfg_commit_type_unregister(self, existing_handle); nm_l3cfg_commit_type_unregister(self, existing_handle);
return NULL; goto out;
}
if (existing_handle->commit_type == commit_type) {
ret = existing_handle;
goto out;
} }
if (existing_handle->commit_type == commit_type)
return existing_handle;
c_list_unlink_stale(&existing_handle->commit_type_lst); c_list_unlink_stale(&existing_handle->commit_type_lst);
handle = existing_handle; handle = existing_handle;
} else { } else {
if (commit_type == NM_L3_CFG_COMMIT_TYPE_NONE) if (commit_type == NM_L3_CFG_COMMIT_TYPE_NONE)
return NULL; goto out;
handle = g_slice_new(NML3CfgCommitTypeHandle); handle = g_slice_new(NML3CfgCommitTypeHandle);
handle->commit_type = commit_type;
if (c_list_is_empty(&self->priv.p->commit_type_lst_head)) if (c_list_is_empty(&self->priv.p->commit_type_lst_head))
g_object_ref(self); g_object_ref(self);
} }
handle->commit_type = commit_type;
linked = FALSE; linked = FALSE;
c_list_for_each_entry (h, &self->priv.p->commit_type_lst_head, commit_type_lst) { c_list_for_each_entry (h, &self->priv.p->commit_type_lst_head, commit_type_lst) {
if (handle->commit_type >= h->commit_type) { if (handle->commit_type >= h->commit_type) {
@ -3867,7 +3874,15 @@ nm_l3cfg_commit_type_register(NML3Cfg * self,
if (!linked) if (!linked)
c_list_link_tail(&self->priv.p->commit_type_lst_head, &handle->commit_type_lst); c_list_link_tail(&self->priv.p->commit_type_lst_head, &handle->commit_type_lst);
return handle; ret = handle;
out:
_LOGT("commit type register (type \"%s\", source \"%s\", existing " NM_HASH_OBFUSCATE_PTR_FMT
") -> " NM_HASH_OBFUSCATE_PTR_FMT "",
_l3_cfg_commit_type_to_string(commit_type, buf, sizeof(buf)),
source,
NM_HASH_OBFUSCATE_PTR(existing_handle),
NM_HASH_OBFUSCATE_PTR(ret));
return ret;
} }
void void
@ -3880,6 +3895,8 @@ nm_l3cfg_commit_type_unregister(NML3Cfg *self, NML3CfgCommitTypeHandle *handle)
nm_assert(c_list_contains(&self->priv.p->commit_type_lst_head, &handle->commit_type_lst)); nm_assert(c_list_contains(&self->priv.p->commit_type_lst_head, &handle->commit_type_lst));
_LOGT("commit type unregister " NM_HASH_OBFUSCATE_PTR_FMT "", NM_HASH_OBFUSCATE_PTR(handle));
c_list_unlink_stale(&handle->commit_type_lst); c_list_unlink_stale(&handle->commit_type_lst);
if (c_list_is_empty(&self->priv.p->commit_type_lst_head)) if (c_list_is_empty(&self->priv.p->commit_type_lst_head))
g_object_unref(self); g_object_unref(self);

View file

@ -384,7 +384,8 @@ typedef struct _NML3CfgCommitTypeHandle NML3CfgCommitTypeHandle;
NML3CfgCommitTypeHandle *nm_l3cfg_commit_type_register(NML3Cfg * self, NML3CfgCommitTypeHandle *nm_l3cfg_commit_type_register(NML3Cfg * self,
NML3CfgCommitType commit_type, NML3CfgCommitType commit_type,
NML3CfgCommitTypeHandle *existing_handle); NML3CfgCommitTypeHandle *existing_handle,
const char * source);
void nm_l3cfg_commit_type_unregister(NML3Cfg *self, NML3CfgCommitTypeHandle *handle); void nm_l3cfg_commit_type_unregister(NML3Cfg *self, NML3CfgCommitTypeHandle *handle);

View file

@ -371,7 +371,8 @@ test_l3cfg(gconstpointer test_data)
g_signal_connect(l3cfg0, NM_L3CFG_SIGNAL_NOTIFY, G_CALLBACK(_test_l3cfg_signal_notify), tdata); g_signal_connect(l3cfg0, NM_L3CFG_SIGNAL_NOTIFY, G_CALLBACK(_test_l3cfg_signal_notify), tdata);
commit_type_1 = nm_l3cfg_commit_type_register(l3cfg0, NM_L3_CFG_COMMIT_TYPE_UPDATE, NULL); commit_type_1 =
nm_l3cfg_commit_type_register(l3cfg0, NM_L3_CFG_COMMIT_TYPE_UPDATE, NULL, "test1");
if (!nmtst_get_rand_one_case_in(4)) { if (!nmtst_get_rand_one_case_in(4)) {
commit_type_2 = commit_type_2 =
@ -379,7 +380,8 @@ test_l3cfg(gconstpointer test_data)
nmtst_rand_select(NM_L3_CFG_COMMIT_TYPE_NONE, nmtst_rand_select(NM_L3_CFG_COMMIT_TYPE_NONE,
NM_L3_CFG_COMMIT_TYPE_ASSUME, NM_L3_CFG_COMMIT_TYPE_ASSUME,
NM_L3_CFG_COMMIT_TYPE_UPDATE), NM_L3_CFG_COMMIT_TYPE_UPDATE),
NULL); NULL,
"test2");
} else } else
commit_type_2 = NULL; commit_type_2 = NULL;
@ -612,7 +614,8 @@ _test_l3_ipv4ll_signal_notify(NML3Cfg * l3cfg,
tdata->l3cfg_commit_type_1 = tdata->l3cfg_commit_type_1 =
nm_l3cfg_commit_type_register(nm_l3_ipv4ll_get_l3cfg(tdata->l3ipv4ll), nm_l3cfg_commit_type_register(nm_l3_ipv4ll_get_l3cfg(tdata->l3ipv4ll),
NM_L3_CFG_COMMIT_TYPE_UPDATE, NM_L3_CFG_COMMIT_TYPE_UPDATE,
tdata->l3cfg_commit_type_1); tdata->l3cfg_commit_type_1,
"test");
} }
} else if (nm_l3_ipv4ll_get_state(tdata->l3ipv4ll) != NM_L3_IPV4LL_STATE_DEFENDING } else if (nm_l3_ipv4ll_get_state(tdata->l3ipv4ll) != NM_L3_IPV4LL_STATE_DEFENDING
&& tdata->ready_seen > 0) { && tdata->ready_seen > 0) {