merge: branch 'bg/dns'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1506
(cherry picked from commit 6da2f3af4d
)
This commit is contained in:
@@ -1208,8 +1208,12 @@ compute_hash(NMDnsManager *self, const NMGlobalDnsConfig *global, guint8 buffer[
|
|||||||
/* FIXME(ip-config-checksum): this relies on the fact that an IP
|
/* FIXME(ip-config-checksum): this relies on the fact that an IP
|
||||||
* configuration without DNS parameters gives a zero checksum. */
|
* configuration without DNS parameters gives a zero checksum. */
|
||||||
head = _mgr_get_ip_data_lst_head(self);
|
head = _mgr_get_ip_data_lst_head(self);
|
||||||
c_list_for_each_entry (ip_data, head, ip_data_lst)
|
c_list_for_each_entry (ip_data, head, ip_data_lst) {
|
||||||
nm_ip_config_dns_hash(ip_data->l3cd, sum, ip_data->addr_family);
|
nm_l3_config_data_hash_dns(ip_data->l3cd,
|
||||||
|
sum,
|
||||||
|
ip_data->addr_family,
|
||||||
|
ip_data->ip_config_type);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nm_utils_checksum_get_digest_len(sum, buffer, HASH_LEN);
|
nm_utils_checksum_get_digest_len(sum, buffer, HASH_LEN);
|
||||||
|
@@ -12,16 +12,6 @@
|
|||||||
#include "nm-setting-connection.h"
|
#include "nm-setting-connection.h"
|
||||||
#include "nm-dns-plugin.h"
|
#include "nm-dns-plugin.h"
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
NM_DNS_IP_CONFIG_TYPE_REMOVED = -1,
|
|
||||||
|
|
||||||
NM_DNS_IP_CONFIG_TYPE_DEFAULT = 0,
|
|
||||||
NM_DNS_IP_CONFIG_TYPE_BEST_DEVICE,
|
|
||||||
NM_DNS_IP_CONFIG_TYPE_VPN,
|
|
||||||
} NMDnsIPConfigType;
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
|
||||||
|
|
||||||
struct _NMDnsConfigData;
|
struct _NMDnsConfigData;
|
||||||
struct _NMDnsManager;
|
struct _NMDnsManager;
|
||||||
|
|
||||||
|
@@ -509,74 +509,6 @@ nm_ip4_config_class_init(NMIP4ConfigClass *klass)
|
|||||||
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST_ip4, obj_properties_ip4);
|
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST_ip4, obj_properties_ip4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
nm_ip_config_dns_hash(const NML3ConfigData *l3cd, GChecksum *sum, int addr_family)
|
|
||||||
{
|
|
||||||
guint i;
|
|
||||||
int val;
|
|
||||||
const char *const *strarr;
|
|
||||||
const in_addr_t *wins;
|
|
||||||
const char *const *domains;
|
|
||||||
const char *const *searches;
|
|
||||||
const char *const *options;
|
|
||||||
guint num_nameservers;
|
|
||||||
guint num_wins;
|
|
||||||
guint num_domains;
|
|
||||||
guint num_searches;
|
|
||||||
guint num_options;
|
|
||||||
|
|
||||||
g_return_if_fail(l3cd);
|
|
||||||
g_return_if_fail(sum);
|
|
||||||
|
|
||||||
strarr = nm_l3_config_data_get_nameservers(l3cd, addr_family, &num_nameservers);
|
|
||||||
for (i = 0; i < num_nameservers; i++)
|
|
||||||
g_checksum_update(sum, (gpointer) strarr[i], strlen(strarr[i]));
|
|
||||||
|
|
||||||
if (addr_family == AF_INET) {
|
|
||||||
wins = nm_l3_config_data_get_wins(l3cd, &num_wins);
|
|
||||||
for (i = 0; i < num_wins; i++)
|
|
||||||
g_checksum_update(sum, (guint8 *) &wins[i], 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
domains = nm_l3_config_data_get_domains(l3cd, addr_family, &num_domains);
|
|
||||||
for (i = 0; i < num_domains; i++) {
|
|
||||||
g_checksum_update(sum, (const guint8 *) domains[i], strlen(domains[i]));
|
|
||||||
}
|
|
||||||
|
|
||||||
searches = nm_l3_config_data_get_searches(l3cd, addr_family, &num_searches);
|
|
||||||
for (i = 0; i < num_searches; i++) {
|
|
||||||
g_checksum_update(sum, (const guint8 *) searches[i], strlen(searches[i]));
|
|
||||||
}
|
|
||||||
|
|
||||||
options = nm_l3_config_data_get_dns_options(l3cd, addr_family, &num_options);
|
|
||||||
for (i = 0; i < num_options; i++) {
|
|
||||||
g_checksum_update(sum, (const guint8 *) options[i], strlen(options[i]));
|
|
||||||
}
|
|
||||||
|
|
||||||
val = nm_l3_config_data_get_mdns(l3cd);
|
|
||||||
if (val != NM_SETTING_CONNECTION_MDNS_DEFAULT)
|
|
||||||
g_checksum_update(sum, (const guint8 *) &val, sizeof(val));
|
|
||||||
|
|
||||||
val = nm_l3_config_data_get_llmnr(l3cd);
|
|
||||||
if (val != NM_SETTING_CONNECTION_LLMNR_DEFAULT)
|
|
||||||
g_checksum_update(sum, (const guint8 *) &val, sizeof(val));
|
|
||||||
|
|
||||||
val = nm_l3_config_data_get_dns_over_tls(l3cd);
|
|
||||||
if (val != NM_SETTING_CONNECTION_DNS_OVER_TLS_DEFAULT)
|
|
||||||
g_checksum_update(sum, (const guint8 *) &val, sizeof(val));
|
|
||||||
|
|
||||||
/* FIXME(ip-config-checksum): the DNS priority should be considered relevant
|
|
||||||
* and added into the checksum as well, but this can't be done right now
|
|
||||||
* because in the DNS manager we rely on the fact that an empty
|
|
||||||
* configuration (i.e. just created) has a zero checksum. This is needed to
|
|
||||||
* avoid rewriting resolv.conf when there is no change.
|
|
||||||
*
|
|
||||||
* The DNS priority initial value depends on the connection type (VPN or
|
|
||||||
* not), so it's a bit difficult to add it to checksum maintaining the
|
|
||||||
* assumption of checksum(empty)=0
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
/* public */
|
/* public */
|
||||||
|
@@ -51,8 +51,6 @@ NMIPConfig *nm_ip_config_new(int addr_family, NML3Cfg *l3cfg);
|
|||||||
|
|
||||||
void nm_ip_config_take_and_unexport_on_idle(NMIPConfig *self_take);
|
void nm_ip_config_take_and_unexport_on_idle(NMIPConfig *self_take);
|
||||||
|
|
||||||
void nm_ip_config_dns_hash(const NML3ConfigData *l3cd, GChecksum *sum, int addr_family);
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
static inline NML3Cfg *
|
static inline NML3Cfg *
|
||||||
|
@@ -3018,6 +3018,107 @@ nm_l3_config_data_new_from_platform(NMDedupMultiIndex *multi_idx,
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
void
|
||||||
|
nm_l3_config_data_hash_dns(const NML3ConfigData *l3cd,
|
||||||
|
GChecksum *sum,
|
||||||
|
int addr_family,
|
||||||
|
NMDnsIPConfigType dns_ip_config_type)
|
||||||
|
{
|
||||||
|
guint i;
|
||||||
|
int val;
|
||||||
|
const char *const *strarr;
|
||||||
|
const in_addr_t *wins;
|
||||||
|
const char *const *domains;
|
||||||
|
const char *const *searches;
|
||||||
|
const char *const *options;
|
||||||
|
guint num_nameservers;
|
||||||
|
guint num_wins;
|
||||||
|
guint num_domains;
|
||||||
|
guint num_searches;
|
||||||
|
guint num_options;
|
||||||
|
gboolean empty = TRUE;
|
||||||
|
|
||||||
|
g_return_if_fail(l3cd);
|
||||||
|
g_return_if_fail(sum);
|
||||||
|
|
||||||
|
strarr = nm_l3_config_data_get_nameservers(l3cd, addr_family, &num_nameservers);
|
||||||
|
for (i = 0; i < num_nameservers; i++) {
|
||||||
|
g_checksum_update(sum, (gpointer) strarr[i], strlen(strarr[i]));
|
||||||
|
empty = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addr_family == AF_INET) {
|
||||||
|
wins = nm_l3_config_data_get_wins(l3cd, &num_wins);
|
||||||
|
for (i = 0; i < num_wins; i++) {
|
||||||
|
g_checksum_update(sum, (guint8 *) &wins[i], 4);
|
||||||
|
empty = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
domains = nm_l3_config_data_get_domains(l3cd, addr_family, &num_domains);
|
||||||
|
for (i = 0; i < num_domains; i++) {
|
||||||
|
g_checksum_update(sum, (const guint8 *) domains[i], strlen(domains[i]));
|
||||||
|
empty = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
searches = nm_l3_config_data_get_searches(l3cd, addr_family, &num_searches);
|
||||||
|
for (i = 0; i < num_searches; i++) {
|
||||||
|
g_checksum_update(sum, (const guint8 *) searches[i], strlen(searches[i]));
|
||||||
|
empty = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
options = nm_l3_config_data_get_dns_options(l3cd, addr_family, &num_options);
|
||||||
|
for (i = 0; i < num_options; i++) {
|
||||||
|
g_checksum_update(sum, (const guint8 *) options[i], strlen(options[i]));
|
||||||
|
empty = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
val = nm_l3_config_data_get_mdns(l3cd);
|
||||||
|
if (val != NM_SETTING_CONNECTION_MDNS_DEFAULT) {
|
||||||
|
g_checksum_update(sum, (const guint8 *) &val, sizeof(val));
|
||||||
|
empty = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
val = nm_l3_config_data_get_llmnr(l3cd);
|
||||||
|
if (val != NM_SETTING_CONNECTION_LLMNR_DEFAULT) {
|
||||||
|
g_checksum_update(sum, (const guint8 *) &val, sizeof(val));
|
||||||
|
empty = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
val = nm_l3_config_data_get_dns_over_tls(l3cd);
|
||||||
|
if (val != NM_SETTING_CONNECTION_DNS_OVER_TLS_DEFAULT) {
|
||||||
|
g_checksum_update(sum, (const guint8 *) &val, sizeof(val));
|
||||||
|
empty = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty) {
|
||||||
|
int prio = 0;
|
||||||
|
|
||||||
|
/* In the DNS manager we rely on the fact that an empty (i.e. without
|
||||||
|
* any name server, domain, option, etc. parameters) configuration
|
||||||
|
* has a zero checksum. This is needed to avoid rewriting resolv.conf
|
||||||
|
* when not needed. Since the dns-type and the priority are always
|
||||||
|
* present, hash them only when the rest of configuration is not empty.
|
||||||
|
*/
|
||||||
|
g_checksum_update(sum, (const guint8 *) &dns_ip_config_type, sizeof(dns_ip_config_type));
|
||||||
|
nm_l3_config_data_get_dns_priority(l3cd, addr_family, &prio);
|
||||||
|
g_checksum_update(sum, (const guint8 *) &prio, sizeof(prio));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME(ip-config-checksum): the DNS priority should be considered relevant
|
||||||
|
* and added into the checksum as well, but this can't be done right now
|
||||||
|
* because in the DNS manager we rely on the fact that an empty
|
||||||
|
* configuration (i.e. just created) has a zero checksum. This is needed to
|
||||||
|
* avoid rewriting resolv.conf when there is no change.
|
||||||
|
*
|
||||||
|
* The DNS priority initial value depends on the connection type (VPN or
|
||||||
|
* not), so it's a bit difficult to add it to checksum maintaining the
|
||||||
|
* assumption of checksum(empty)=0
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
void
|
void
|
||||||
nm_l3_config_data_merge(NML3ConfigData *self,
|
nm_l3_config_data_merge(NML3ConfigData *self,
|
||||||
const NML3ConfigData *src,
|
const NML3ConfigData *src,
|
||||||
|
@@ -604,4 +604,9 @@ nmtst_l3_config_data_get_best_gateway(const NML3ConfigData *self, int addr_famil
|
|||||||
return nm_platform_ip_route_get_gateway(addr_family, NMP_OBJECT_CAST_IP_ROUTE(rt));
|
return nm_platform_ip_route_get_gateway(addr_family, NMP_OBJECT_CAST_IP_ROUTE(rt));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nm_l3_config_data_hash_dns(const NML3ConfigData *l3cd,
|
||||||
|
GChecksum *sum,
|
||||||
|
int addr_family,
|
||||||
|
NMDnsIPConfigType dns_ip_config_type);
|
||||||
|
|
||||||
#endif /* __NM_L3_CONFIG_DATA_H__ */
|
#endif /* __NM_L3_CONFIG_DATA_H__ */
|
||||||
|
@@ -415,4 +415,12 @@ typedef struct {
|
|||||||
#define _NM_CRYPTO_ERROR _nm_crypto_error_quark()
|
#define _NM_CRYPTO_ERROR _nm_crypto_error_quark()
|
||||||
GQuark _nm_crypto_error_quark(void);
|
GQuark _nm_crypto_error_quark(void);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
NM_DNS_IP_CONFIG_TYPE_REMOVED = -1,
|
||||||
|
|
||||||
|
NM_DNS_IP_CONFIG_TYPE_DEFAULT = 0,
|
||||||
|
NM_DNS_IP_CONFIG_TYPE_BEST_DEVICE,
|
||||||
|
NM_DNS_IP_CONFIG_TYPE_VPN,
|
||||||
|
} NMDnsIPConfigType;
|
||||||
|
|
||||||
#endif /* __NM_LIBNM_BASE_H__ */
|
#endif /* __NM_LIBNM_BASE_H__ */
|
||||||
|
Reference in New Issue
Block a user