l3cfg: emit signal when NML3ConfigData changes
This commit is contained in:
@@ -302,6 +302,7 @@ static NM_UTILS_ENUM2STR_DEFINE(
|
|||||||
NML3ConfigNotifyType,
|
NML3ConfigNotifyType,
|
||||||
NM_UTILS_ENUM2STR(NM_L3_CONFIG_NOTIFY_TYPE_ACD_EVENT, "acd-event"),
|
NM_UTILS_ENUM2STR(NM_L3_CONFIG_NOTIFY_TYPE_ACD_EVENT, "acd-event"),
|
||||||
NM_UTILS_ENUM2STR(NM_L3_CONFIG_NOTIFY_TYPE_IPV4LL_EVENT, "ipv4ll-event"),
|
NM_UTILS_ENUM2STR(NM_L3_CONFIG_NOTIFY_TYPE_IPV4LL_EVENT, "ipv4ll-event"),
|
||||||
|
NM_UTILS_ENUM2STR(NM_L3_CONFIG_NOTIFY_TYPE_L3CD_CHANGED, "l3cd-changed"),
|
||||||
NM_UTILS_ENUM2STR(NM_L3_CONFIG_NOTIFY_TYPE_PLATFORM_CHANGE, "platform-change"),
|
NM_UTILS_ENUM2STR(NM_L3_CONFIG_NOTIFY_TYPE_PLATFORM_CHANGE, "platform-change"),
|
||||||
NM_UTILS_ENUM2STR(NM_L3_CONFIG_NOTIFY_TYPE_PLATFORM_CHANGE_ON_IDLE, "platform-change-on-idle"),
|
NM_UTILS_ENUM2STR(NM_L3_CONFIG_NOTIFY_TYPE_PLATFORM_CHANGE_ON_IDLE, "platform-change-on-idle"),
|
||||||
NM_UTILS_ENUM2STR(NM_L3_CONFIG_NOTIFY_TYPE_POST_COMMIT, "post-commit"),
|
NM_UTILS_ENUM2STR(NM_L3_CONFIG_NOTIFY_TYPE_POST_COMMIT, "post-commit"),
|
||||||
@@ -348,6 +349,7 @@ _l3_config_notify_data_to_string(const NML3ConfigNotifyData *notify_data,
|
|||||||
{
|
{
|
||||||
char sbuf_addr[NM_UTILS_INET_ADDRSTRLEN];
|
char sbuf_addr[NM_UTILS_INET_ADDRSTRLEN];
|
||||||
char sbuf100[100];
|
char sbuf100[100];
|
||||||
|
char sbufobf[NM_HASH_OBFUSCATE_PTR_STR_BUF_SIZE];
|
||||||
char * s = sbuf;
|
char * s = sbuf;
|
||||||
gsize l = sbuf_size;
|
gsize l = sbuf_size;
|
||||||
in_addr_t addr4;
|
in_addr_t addr4;
|
||||||
@@ -359,6 +361,19 @@ _l3_config_notify_data_to_string(const NML3ConfigNotifyData *notify_data,
|
|||||||
nm_utils_strbuf_seek_end(&s, &l);
|
nm_utils_strbuf_seek_end(&s, &l);
|
||||||
|
|
||||||
switch (notify_data->notify_type) {
|
switch (notify_data->notify_type) {
|
||||||
|
case NM_L3_CONFIG_NOTIFY_TYPE_L3CD_CHANGED:
|
||||||
|
nm_utils_strbuf_append(
|
||||||
|
&s,
|
||||||
|
&l,
|
||||||
|
", l3cd-old=%s",
|
||||||
|
NM_HASH_OBFUSCATE_PTR_STR(notify_data->l3cd_changed.l3cd_old, sbufobf));
|
||||||
|
nm_utils_strbuf_append(
|
||||||
|
&s,
|
||||||
|
&l,
|
||||||
|
", l3cd-new=%s",
|
||||||
|
NM_HASH_OBFUSCATE_PTR_STR(notify_data->l3cd_changed.l3cd_new, sbufobf));
|
||||||
|
nm_utils_strbuf_append(&s, &l, ", commited=%d", notify_data->l3cd_changed.commited);
|
||||||
|
break;
|
||||||
case NM_L3_CONFIG_NOTIFY_TYPE_ACD_EVENT:
|
case NM_L3_CONFIG_NOTIFY_TYPE_ACD_EVENT:
|
||||||
nm_utils_strbuf_append(&s,
|
nm_utils_strbuf_append(&s,
|
||||||
&l,
|
&l,
|
||||||
@@ -424,6 +439,23 @@ _nm_l3cfg_emit_signal_notify_simple(NML3Cfg *self, NML3ConfigNotifyType notify_t
|
|||||||
_nm_l3cfg_emit_signal_notify(self, ¬ify_data);
|
_nm_l3cfg_emit_signal_notify(self, ¬ify_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_nm_l3cfg_emit_signal_notify_l3cd_changed(NML3Cfg * self,
|
||||||
|
const NML3ConfigData *l3cd_old,
|
||||||
|
const NML3ConfigData *l3cd_new,
|
||||||
|
gboolean commited)
|
||||||
|
{
|
||||||
|
NML3ConfigNotifyData notify_data;
|
||||||
|
|
||||||
|
notify_data.notify_type = NM_L3_CONFIG_NOTIFY_TYPE_L3CD_CHANGED;
|
||||||
|
notify_data.l3cd_changed = (typeof(notify_data.l3cd_changed)){
|
||||||
|
.l3cd_old = l3cd_old,
|
||||||
|
.l3cd_new = l3cd_new,
|
||||||
|
.commited = commited,
|
||||||
|
};
|
||||||
|
_nm_l3cfg_emit_signal_notify(self, ¬ify_data);
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -3009,6 +3041,12 @@ _l3cfg_update_combined_config(NML3Cfg * self,
|
|||||||
l3cd_old = g_steal_pointer(&self->priv.p->combined_l3cd_merged);
|
l3cd_old = g_steal_pointer(&self->priv.p->combined_l3cd_merged);
|
||||||
self->priv.p->combined_l3cd_merged = nm_l3_config_data_seal(g_steal_pointer(&l3cd));
|
self->priv.p->combined_l3cd_merged = nm_l3_config_data_seal(g_steal_pointer(&l3cd));
|
||||||
merged_changed = TRUE;
|
merged_changed = TRUE;
|
||||||
|
|
||||||
|
_nm_l3cfg_emit_signal_notify_l3cd_changed(self,
|
||||||
|
l3cd_old,
|
||||||
|
self->priv.p->combined_l3cd_merged,
|
||||||
|
FALSE);
|
||||||
|
|
||||||
if (!to_commit) {
|
if (!to_commit) {
|
||||||
NM_SET_OUT(out_old, g_steal_pointer(&l3cd_old));
|
NM_SET_OUT(out_old, g_steal_pointer(&l3cd_old));
|
||||||
NM_SET_OUT(out_changed_combined_l3cd, TRUE);
|
NM_SET_OUT(out_changed_combined_l3cd, TRUE);
|
||||||
@@ -3020,6 +3058,12 @@ out:
|
|||||||
self->priv.p->combined_l3cd_commited =
|
self->priv.p->combined_l3cd_commited =
|
||||||
nm_l3_config_data_ref(self->priv.p->combined_l3cd_merged);
|
nm_l3_config_data_ref(self->priv.p->combined_l3cd_merged);
|
||||||
commited_changed = TRUE;
|
commited_changed = TRUE;
|
||||||
|
|
||||||
|
_nm_l3cfg_emit_signal_notify_l3cd_changed(self,
|
||||||
|
l3cd_commited_old,
|
||||||
|
self->priv.p->combined_l3cd_commited,
|
||||||
|
TRUE);
|
||||||
|
|
||||||
NM_SET_OUT(out_old, g_steal_pointer(&l3cd_commited_old));
|
NM_SET_OUT(out_old, g_steal_pointer(&l3cd_commited_old));
|
||||||
NM_SET_OUT(out_changed_combined_l3cd, TRUE);
|
NM_SET_OUT(out_changed_combined_l3cd, TRUE);
|
||||||
}
|
}
|
||||||
|
@@ -88,6 +88,12 @@ nm_l3_acd_addr_info_find_track_info(const NML3AcdAddrInfo *addr_info,
|
|||||||
}
|
}
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
/* emitted when the merged/commited NML3ConfigData instance changes.
|
||||||
|
* Note that this gets emitted "under unsafe circumstances". That means,
|
||||||
|
* you should not perform complex operations inside this callback,
|
||||||
|
* and neither should you call into NML3Cfg again (reentrancy). */
|
||||||
|
NM_L3_CONFIG_NOTIFY_TYPE_L3CD_CHANGED,
|
||||||
|
|
||||||
NM_L3_CONFIG_NOTIFY_TYPE_ROUTES_TEMPORARY_NOT_AVAILABLE_EXPIRED,
|
NM_L3_CONFIG_NOTIFY_TYPE_ROUTES_TEMPORARY_NOT_AVAILABLE_EXPIRED,
|
||||||
|
|
||||||
NM_L3_CONFIG_NOTIFY_TYPE_ACD_EVENT,
|
NM_L3_CONFIG_NOTIFY_TYPE_ACD_EVENT,
|
||||||
@@ -117,6 +123,12 @@ struct _NML3IPv4LL;
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
NML3ConfigNotifyType notify_type;
|
NML3ConfigNotifyType notify_type;
|
||||||
union {
|
union {
|
||||||
|
struct {
|
||||||
|
const NML3ConfigData *l3cd_old;
|
||||||
|
const NML3ConfigData *l3cd_new;
|
||||||
|
bool commited;
|
||||||
|
} l3cd_changed;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
NML3AcdAddrInfo info;
|
NML3AcdAddrInfo info;
|
||||||
} acd_event;
|
} acd_event;
|
||||||
|
@@ -187,6 +187,12 @@ _test_l3cfg_signal_notify(NML3Cfg * l3cfg,
|
|||||||
nm_assert(NM_IS_L3_CONFIG_DATA(ti->l3cd));
|
nm_assert(NM_IS_L3_CONFIG_DATA(ti->l3cd));
|
||||||
nm_assert(ti->tag);
|
nm_assert(ti->tag);
|
||||||
}
|
}
|
||||||
|
} else if (notify_data->notify_type == NM_L3_CONFIG_NOTIFY_TYPE_L3CD_CHANGED) {
|
||||||
|
g_assert(!notify_data->l3cd_changed.l3cd_old
|
||||||
|
|| NM_IS_L3_CONFIG_DATA(notify_data->l3cd_changed.l3cd_old));
|
||||||
|
g_assert(!notify_data->l3cd_changed.l3cd_new
|
||||||
|
|| NM_IS_L3_CONFIG_DATA(notify_data->l3cd_changed.l3cd_new));
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (tdata->notify_type) {
|
switch (tdata->notify_type) {
|
||||||
|
Reference in New Issue
Block a user