l3cfg: add nm_l3_config_data_cmp()/nm_l3_config_data_equal()

This commit is contained in:
Thomas Haller 2020-07-24 14:01:27 +02:00
parent e3e60bf87d
commit 98e311899d
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
2 changed files with 108 additions and 0 deletions

View file

@ -183,6 +183,20 @@ _garray_inaddr_add (GArray **p_arr,
return TRUE;
}
static int
_garray_inaddr_cmp (const GArray *a, const GArray *b, int addr_family)
{
guint l;
l = nm_g_array_len (a);
NM_CMP_DIRECT (l, nm_g_array_len (b));
if (l > 0)
NM_CMP_DIRECT_MEMCMP (a->data, b->data, l * nm_utils_addr_family_to_size (addr_family));
return 0;
}
/*****************************************************************************/
static gboolean
@ -823,6 +837,90 @@ nm_l3_config_data_set_dns_priority (NML3ConfigData *self,
/*****************************************************************************/
static int
_dedup_multi_index_cmp (const NML3ConfigData *a,
const NML3ConfigData *b,
NMPObjectType obj_type)
{
const NMDedupMultiHeadEntry *h_a = nm_l3_config_data_lookup_objs (a, obj_type);
const NMDedupMultiHeadEntry *h_b = nm_l3_config_data_lookup_objs (b, obj_type);
NMDedupMultiIter iter_a;
NMDedupMultiIter iter_b;
NM_CMP_SELF (h_a, h_b);
NM_CMP_DIRECT (h_a->len, h_b->len);
nm_assert (h_a->len > 0);
nm_dedup_multi_iter_init (&iter_a, h_a);
nm_dedup_multi_iter_init (&iter_b, h_b);
while (TRUE) {
const NMPObject *obj_a;
const NMPObject *obj_b;
gboolean have_a;
gboolean have_b;
have_a = nm_platform_dedup_multi_iter_next_obj (&iter_a, &obj_a, obj_type);
if (!have_a) {
nm_assert (!nm_platform_dedup_multi_iter_next_obj (&iter_b, &obj_b, obj_type));
break;
}
have_b = nm_platform_dedup_multi_iter_next_obj (&iter_b, &obj_b, obj_type);
nm_assert (have_b);
NM_CMP_RETURN (nmp_object_cmp (obj_a, obj_b));
}
return 0;
}
int
nm_l3_config_data_cmp (const NML3ConfigData *a, const NML3ConfigData *b)
{
int IS_IPv4;
NM_CMP_SELF (a, b);
NM_CMP_DIRECT (a->ifindex, b->ifindex);
_dedup_multi_index_cmp (a, b, NMP_OBJECT_TYPE_IP4_ADDRESS);
_dedup_multi_index_cmp (a, b, NMP_OBJECT_TYPE_IP6_ADDRESS);
_dedup_multi_index_cmp (a, b, NMP_OBJECT_TYPE_IP4_ROUTE);
_dedup_multi_index_cmp (a, b, NMP_OBJECT_TYPE_IP6_ROUTE);
for (IS_IPv4 = 1; IS_IPv4 >= 0; IS_IPv4--) {
const int addr_family = IS_IPv4 ? AF_INET : AF_INET6;
NM_CMP_RETURN (nmp_object_cmp (a->best_default_route_x[IS_IPv4], b->best_default_route_x[IS_IPv4]));
NM_CMP_RETURN (_garray_inaddr_cmp (a->nameservers_x[IS_IPv4], b->nameservers_x[IS_IPv4], addr_family));
NM_CMP_RETURN (nm_strv_ptrarray_cmp (a->domains_x[IS_IPv4], b->domains_x[IS_IPv4]));
NM_CMP_RETURN (nm_strv_ptrarray_cmp (a->searches_x[IS_IPv4], b->searches_x[IS_IPv4]));
NM_CMP_RETURN (nm_strv_ptrarray_cmp (a->dns_options_x[IS_IPv4], b->dns_options_x[IS_IPv4]));
NM_CMP_DIRECT (a->dns_priority_x[IS_IPv4], b->dns_priority_x[IS_IPv4]);
}
NM_CMP_RETURN (_garray_inaddr_cmp (a->wins_4, b->wins_4, AF_INET));
NM_CMP_DIRECT (a->mdns, b->mdns);
NM_CMP_DIRECT (a->llmnr, b->llmnr);
NM_CMP_DIRECT (a->flags, b->flags);
/* these fields are not considered by cmp():
*
* - multi_idx
* - ref_count
* - is_sealed
*/
return 0;
}
/*****************************************************************************/
static void
_init_from_connection_ip (NML3ConfigData *self,
int addr_family,

View file

@ -68,6 +68,16 @@ NM_IS_L3_CONFIG_DATA (const NML3ConfigData *self)
/*****************************************************************************/
int nm_l3_config_data_cmp (const NML3ConfigData *a, const NML3ConfigData *b);
static inline gboolean
nm_l3_config_data_equal (const NML3ConfigData *a, const NML3ConfigData *b)
{
return nm_l3_config_data_cmp (a, b) == 0;
}
/*****************************************************************************/
const NMDedupMultiHeadEntry *nm_l3_config_data_lookup_objs (const NML3ConfigData *self, NMPObjectType obj_type);
static inline const NMDedupMultiHeadEntry *