diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2022-01-24 18:38:54 +0100 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2022-01-26 14:54:52 +0100 |
commit | ce0a36d20fa6a49723e8a630be3106ffe5e793fc (patch) | |
tree | 87c7ff104ee1f0ff4a71f281434dcbd15d2f4040 | |
parent | ddaee5d7e6bff2aaa48d0a595805ce6d3f5cd493 (diff) |
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.c | 25 |
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); |