dns: better track l3cd changes

Update DNS only when something relevant changes:

 - an old l3cd gets removed, without adding a new one

 - a new one is added without removing an old one

 - an old is removed and it differs (in routes and DNS) from the new
   added one
This commit is contained in:
Beniamino Galvani 2022-01-24 18:38:54 +01:00
parent ddaee5d7e6
commit ce0a36d20f

View file

@ -1862,6 +1862,7 @@ nm_dns_manager_set_ip_config(NMDnsManager *self,
gboolean changed = FALSE;
NMDnsConfigIPData *ip_data = NULL;
int dns_priority;
gboolean any_removed = FALSE;
g_return_val_if_fail(NM_IS_DNS_MANAGER(self), FALSE);
g_return_val_if_fail(!l3cd || NM_IS_L3_CONFIG_DATA(l3cd), FALSE);
@ -1919,7 +1920,16 @@ nm_dns_manager_set_ip_config(NMDnsManager *self,
if (!replace_all && l3cd && ip_data_iter->l3cd != l3cd)
continue;
changed = TRUE;
if (!l3cd || ip_config_type == NM_DNS_IP_CONFIG_TYPE_REMOVED
|| nm_l3_config_data_cmp_full(l3cd,
ip_data_iter->l3cd,
NM_L3_CONFIG_CMP_FLAGS_DNS
| NM_L3_CONFIG_CMP_FLAGS_ROUTES_ID)
!= 0) {
changed = TRUE;
}
any_removed = TRUE;
_dns_config_ip_data_free(ip_data_iter);
}
}
@ -1941,8 +1951,6 @@ nm_dns_manager_set_ip_config(NMDnsManager *self,
goto done;
}
changed = TRUE;
if (!data) {
data = g_slice_new(NMDnsConfigData);
*data = (NMDnsConfigData){
@ -1956,12 +1964,17 @@ nm_dns_manager_set_ip_config(NMDnsManager *self,
priv->configs_lst_need_sort = TRUE;
}
if (!ip_data)
if (!ip_data) {
ip_data = _dns_config_ip_data_new(data, addr_family, source_tag, l3cd, ip_config_type);
else
if (!any_removed)
changed = TRUE;
} else {
ip_data->ip_config_type = ip_config_type;
changed = TRUE;
}
priv->ip_data_lst_need_sort = TRUE;
if (changed)
priv->ip_data_lst_need_sort = TRUE;
nm_assert(l3cd);
nm_assert(ip_config_type != NM_DNS_IP_CONFIG_TYPE_REMOVED);