l3cfg: add a "result" structure to nm_l3_config_data_merge()'s add-obj-hook

This commit is contained in:
Thomas Haller 2021-09-06 09:08:22 +02:00
parent 3b92ad8b6d
commit cfebd0e504
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
3 changed files with 29 additions and 21 deletions

View file

@ -2696,7 +2696,7 @@ nm_l3_config_data_merge(NML3ConfigData * self,
const guint32 * default_route_table_x /* length 2, for IS_IPv4 */,
const guint32 * default_route_metric_x /* length 2, for IS_IPv4 */,
const guint32 * default_route_penalty_x /* length 2, for IS_IPv4 */,
NML3ConfigMergeHookAddObj hook_add_addr,
NML3ConfigMergeHookAddObj hook_add_obj,
gpointer hook_user_data)
{
static const guint32 x_default_route_table_x[2] = {RT_TABLE_MAIN, RT_TABLE_MAIN};
@ -2734,19 +2734,22 @@ nm_l3_config_data_merge(NML3ConfigData * self,
&obj,
NMP_OBJECT_TYPE_IP_ADDRESS(IS_IPv4)) {
NMPlatformIPXAddress addr_stack;
const NMPlatformIPAddress *addr = NULL;
NMTernary ip4acd_not_ready = NM_TERNARY_DEFAULT;
const NMPlatformIPAddress *addr = NULL;
NML3ConfigMergeHookResult hook_result = {
.ip4acd_not_ready = NM_OPTION_BOOL_DEFAULT,
};
if (hook_add_addr && !hook_add_addr(src, obj, &ip4acd_not_ready, hook_user_data))
if (hook_add_obj && !hook_add_obj(src, obj, &hook_result, hook_user_data))
continue;
if (IS_IPv4 && ip4acd_not_ready != NM_TERNARY_DEFAULT
&& (!!ip4acd_not_ready) != NMP_OBJECT_CAST_IP4_ADDRESS(obj)->ip4acd_not_ready) {
nm_assert(IS_IPv4 || hook_result.ip4acd_not_ready == NM_OPTION_BOOL_DEFAULT);
if (hook_result.ip4acd_not_ready != NM_OPTION_BOOL_DEFAULT && IS_IPv4
&& (!!hook_result.ip4acd_not_ready)
!= NMP_OBJECT_CAST_IP4_ADDRESS(obj)->ip4acd_not_ready) {
addr_stack.a4 = *NMP_OBJECT_CAST_IP4_ADDRESS(obj);
addr_stack.a4.ip4acd_not_ready = (!!ip4acd_not_ready);
addr_stack.a4.ip4acd_not_ready = (!!hook_result.ip4acd_not_ready);
addr = &addr_stack.ax;
} else
nm_assert(IS_IPv4 || ip4acd_not_ready == NM_TERNARY_DEFAULT);
}
nm_l3_config_data_add_address_full(self,
addr_family,

View file

@ -135,10 +135,14 @@ NML3ConfigData *nm_l3_config_data_new_from_platform(NMDedupMultiIndex * mu
NMPlatform * platform,
NMSettingIP6ConfigPrivacy ipv6_privacy_rfc4941);
typedef gboolean (*NML3ConfigMergeHookAddObj)(const NML3ConfigData *l3cd,
const NMPObject * obj,
NMTernary * out_ip4acd_not_ready,
gpointer user_data);
typedef struct {
NMOptionBool ip4acd_not_ready;
} NML3ConfigMergeHookResult;
typedef gboolean (*NML3ConfigMergeHookAddObj)(const NML3ConfigData * l3cd,
const NMPObject * obj,
NML3ConfigMergeHookResult *result,
gpointer user_data);
void nm_l3_config_data_merge(NML3ConfigData * self,
const NML3ConfigData *src,
@ -146,7 +150,7 @@ void nm_l3_config_data_merge(NML3ConfigData * self,
const guint32 *default_route_table_x /* length 2, for IS_IPv4 */,
const guint32 *default_route_metric_x /* length 2, for IS_IPv4 */,
const guint32 *default_route_penalty_x /* length 2, for IS_IPv4 */,
NML3ConfigMergeHookAddObj hook_add_addr,
NML3ConfigMergeHookAddObj hook_add_obj,
gpointer hook_user_data);
GPtrArray *nm_l3_config_data_get_blacklisted_ip4_routes(const NML3ConfigData *self,

View file

@ -2926,10 +2926,10 @@ typedef struct {
} L3ConfigMergeHookAddObjData;
static gboolean
_l3_hook_add_addr_cb(const NML3ConfigData *l3cd,
const NMPObject * obj,
NMTernary * out_ip4acd_not_ready,
gpointer user_data)
_l3_hook_add_obj_cb(const NML3ConfigData * l3cd,
const NMPObject * obj,
NML3ConfigMergeHookResult *hook_result,
gpointer user_data)
{
const L3ConfigMergeHookAddObjData *hook_data = user_data;
NML3Cfg * self = hook_data->self;
@ -2937,7 +2937,8 @@ _l3_hook_add_addr_cb(const NML3ConfigData *l3cd,
in_addr_t addr;
gboolean acd_bad = FALSE;
nm_assert(out_ip4acd_not_ready && *out_ip4acd_not_ready == NM_TERNARY_DEFAULT);
nm_assert(hook_result);
nm_assert(hook_result->ip4acd_not_ready == NM_OPTION_BOOL_DEFAULT);
if (NMP_OBJECT_GET_TYPE(obj) != NMP_OBJECT_TYPE_IP4_ADDRESS)
return TRUE;
@ -2969,7 +2970,7 @@ _l3_hook_add_addr_cb(const NML3ConfigData *l3cd,
acd_bad = TRUE;
out:
*out_ip4acd_not_ready = acd_bad ? NM_TERNARY_TRUE : NM_TERNARY_FALSE;
hook_result->ip4acd_not_ready = acd_bad ? NM_OPTION_BOOL_TRUE : NM_OPTION_BOOL_FALSE;
return TRUE;
}
@ -3053,7 +3054,7 @@ _l3cfg_update_combined_config(NML3Cfg * self,
l3cd_data->default_route_table_x,
l3cd_data->default_route_metric_x,
l3cd_data->default_route_penalty_x,
_l3_hook_add_addr_cb,
_l3_hook_add_obj_cb,
&hook_data);
}