summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2022-01-24 18:38:54 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2022-01-26 14:54:52 +0100
commitce0a36d20fa6a49723e8a630be3106ffe5e793fc (patch)
tree87c7ff104ee1f0ff4a71f281434dcbd15d2f4040
parentddaee5d7e6bff2aaa48d0a595805ce6d3f5cd493 (diff)
downloadNetworkManager-ce0a36d20fa6a49723e8a630be3106ffe5e793fc.tar.gz
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
-rw-r--r--src/core/dns/nm-dns-manager.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/core/dns/nm-dns-manager.c b/src/core/dns/nm-dns-manager.c
index 8a8ab9eb06..efbf847b71 100644
--- a/src/core/dns/nm-dns-manager.c
+++ b/src/core/dns/nm-dns-manager.c
@@ -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);