dns: merge branch 'th/ip-config-cleanups' into master

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/689
This commit is contained in:
Thomas Haller 2020-11-24 08:53:21 +01:00
commit 04ba2cafa3
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
13 changed files with 313 additions and 253 deletions

View file

@ -101,6 +101,8 @@ ForEachMacros: ['c_list_for_each',
'nm_ip_config_iter_ip4_route_for_each', 'nm_ip_config_iter_ip4_route_for_each',
'nm_ip_config_iter_ip6_address_for_each', 'nm_ip_config_iter_ip6_address_for_each',
'nm_ip_config_iter_ip6_route_for_each', 'nm_ip_config_iter_ip6_route_for_each',
'nm_ip_config_iter_ip_address_for_each',
'nm_ip_config_iter_ip_route_for_each',
'nm_json_array_foreach', 'nm_json_array_foreach',
'nm_json_object_foreach', 'nm_json_object_foreach',
'nm_l3_config_data_iter_ip4_address_for_each', 'nm_l3_config_data_iter_ip4_address_for_each',

View file

@ -3670,7 +3670,8 @@ nm_device_get_route_table(NMDevice *self, int addr_family)
static NMIPRouteTableSyncMode static NMIPRouteTableSyncMode
_get_route_table_sync_mode_stateful(NMDevice *self, int addr_family) _get_route_table_sync_mode_stateful(NMDevice *self, int addr_family)
{ {
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE(self); const int IS_IPv4 = NM_IS_IPv4(addr_family);
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE(self);
NMDedupMultiIter ipconf_iter; NMDedupMultiIter ipconf_iter;
gboolean all_sync_now; gboolean all_sync_now;
gboolean all_sync_eff; gboolean all_sync_eff;
@ -3678,25 +3679,14 @@ _get_route_table_sync_mode_stateful(NMDevice *self, int addr_family)
all_sync_now = _prop_get_ipvx_route_table(self, addr_family) != 0u; all_sync_now = _prop_get_ipvx_route_table(self, addr_family) != 0u;
if (!all_sync_now) { if (!all_sync_now) {
const NMPlatformIPRoute *route;
/* If there's a local route switch to all-sync in order /* If there's a local route switch to all-sync in order
* to properly manage the local table */ * to properly manage the local table */
if (NM_IS_IPv4(addr_family)) { nm_ip_config_iter_ip_route_for_each (&ipconf_iter, priv->con_ip_config_x[IS_IPv4], &route) {
const NMPlatformIP4Route *route; if (nm_platform_route_type_uncoerce(route->type_coerced) == RTN_LOCAL) {
all_sync_now = TRUE;
nm_ip_config_iter_ip4_route_for_each (&ipconf_iter, priv->con_ip_config_4, &route) { break;
if (nm_platform_route_type_uncoerce(route->type_coerced) == RTN_LOCAL) {
all_sync_now = TRUE;
break;
}
}
} else {
const NMPlatformIP6Route *route;
nm_ip_config_iter_ip6_route_for_each (&ipconf_iter, priv->con_ip_config_6, &route) {
if (nm_platform_route_type_uncoerce(route->type_coerced) == RTN_LOCAL) {
all_sync_now = TRUE;
break;
}
} }
} }
} }

View file

@ -804,7 +804,7 @@ add_global_config(NMDnsDnsmasq * self,
} }
static void static void
add_ip_config(NMDnsDnsmasq *self, GVariantBuilder *servers, const NMDnsIPConfigData *ip_data) add_ip_config(NMDnsDnsmasq *self, GVariantBuilder *servers, const NMDnsConfigIPData *ip_data)
{ {
NMIPConfig * ip_config = ip_data->ip_config; NMIPConfig * ip_config = ip_data->ip_config;
gconstpointer addr; gconstpointer addr;
@ -850,7 +850,7 @@ create_update_args(NMDnsDnsmasq * self,
const char * hostname) const char * hostname)
{ {
GVariantBuilder servers; GVariantBuilder servers;
const NMDnsIPConfigData *ip_data; const NMDnsConfigIPData *ip_data;
g_variant_builder_init(&servers, G_VARIANT_TYPE("aas")); g_variant_builder_init(&servers, G_VARIANT_TYPE("aas"));

View file

@ -80,14 +80,18 @@ NM_GOBJECT_PROPERTIES_DEFINE(NMDnsManager, PROP_MODE, PROP_RC_MANAGER, PROP_CONF
static guint signals[LAST_SIGNAL] = {0}; static guint signals[LAST_SIGNAL] = {0};
typedef struct { typedef struct {
GHashTable *configs; GHashTable *configs_dict;
CList ip_config_lst_head; CList configs_lst_head;
GVariant * config_variant;
NMDnsIPConfigData *best_ip_config_4; CList ip_configs_lst_head;
NMDnsIPConfigData *best_ip_config_6; GVariant *config_variant;
bool ip_config_lst_need_sort : 1; NMDnsConfigIPData *best_ip_config_4;
NMDnsConfigIPData *best_ip_config_6;
bool ip_configs_lst_need_sort : 1;
bool configs_lst_need_sort : 1;
bool dns_touched : 1; bool dns_touched : 1;
bool is_stopped : 1; bool is_stopped : 1;
@ -158,7 +162,7 @@ NM_DEFINE_SINGLETON_GETTER(NMDnsManager, nm_dns_manager_get, NM_TYPE_DNS_MANAGER
/*****************************************************************************/ /*****************************************************************************/
static void static void
_ip_config_dns_priority_changed(gpointer config, GParamSpec *pspec, NMDnsIPConfigData *ip_data); _ip_config_dns_priority_changed(gpointer config, GParamSpec *pspec, NMDnsConfigIPData *ip_data);
/*****************************************************************************/ /*****************************************************************************/
@ -207,7 +211,7 @@ static NM_UTILS_LOOKUP_STR_DEFINE(
/*****************************************************************************/ /*****************************************************************************/
static void static void
_ASSERT_config_data(const NMDnsConfigData *data) _ASSERT_dns_config_data(const NMDnsConfigData *data)
{ {
nm_assert(data); nm_assert(data);
nm_assert(NM_IS_DNS_MANAGER(data->self)); nm_assert(NM_IS_DNS_MANAGER(data->self));
@ -215,10 +219,10 @@ _ASSERT_config_data(const NMDnsConfigData *data)
} }
static void static void
_ASSERT_ip_config_data(const NMDnsIPConfigData *ip_data) _ASSERT_dns_config_ip_data(const NMDnsConfigIPData *ip_data)
{ {
nm_assert(ip_data); nm_assert(ip_data);
_ASSERT_config_data(ip_data->data); _ASSERT_dns_config_data(ip_data->data);
nm_assert(NM_IS_IP_CONFIG(ip_data->ip_config)); nm_assert(NM_IS_IP_CONFIG(ip_data->ip_config));
nm_assert(c_list_contains(&ip_data->data->data_lst_head, &ip_data->data_lst)); nm_assert(c_list_contains(&ip_data->data->data_lst_head, &ip_data->data_lst));
nm_assert(ip_data->data->ifindex == nm_ip_config_get_ifindex(ip_data->ip_config)); nm_assert(ip_data->data->ifindex == nm_ip_config_get_ifindex(ip_data->ip_config));
@ -244,23 +248,25 @@ _ASSERT_ip_config_data(const NMDnsIPConfigData *ip_data)
#endif #endif
} }
static NMDnsIPConfigData * static NMDnsConfigIPData *
_ip_config_data_new(NMDnsConfigData *data, NMIPConfig *ip_config, NMDnsIPConfigType ip_config_type) _dns_config_ip_data_new(NMDnsConfigData * data,
NMIPConfig * ip_config,
NMDnsIPConfigType ip_config_type)
{ {
NMDnsIPConfigData *ip_data; NMDnsConfigIPData *ip_data;
_ASSERT_config_data(data); _ASSERT_dns_config_data(data);
nm_assert(NM_IS_IP_CONFIG(ip_config)); nm_assert(NM_IS_IP_CONFIG(ip_config));
nm_assert(ip_config_type != NM_DNS_IP_CONFIG_TYPE_REMOVED); nm_assert(ip_config_type != NM_DNS_IP_CONFIG_TYPE_REMOVED);
ip_data = g_slice_new(NMDnsIPConfigData); ip_data = g_slice_new(NMDnsConfigIPData);
*ip_data = (NMDnsIPConfigData){ *ip_data = (NMDnsConfigIPData){
.data = data, .data = data,
.ip_config = g_object_ref(ip_config), .ip_config = g_object_ref(ip_config),
.ip_config_type = ip_config_type, .ip_config_type = ip_config_type,
}; };
c_list_link_tail(&data->data_lst_head, &ip_data->data_lst); c_list_link_tail(&data->data_lst_head, &ip_data->data_lst);
c_list_link_tail(&NM_DNS_MANAGER_GET_PRIVATE(data->self)->ip_config_lst_head, c_list_link_tail(&NM_DNS_MANAGER_GET_PRIVATE(data->self)->ip_configs_lst_head,
&ip_data->ip_config_lst); &ip_data->ip_config_lst);
g_signal_connect(ip_config, g_signal_connect(ip_config,
@ -269,14 +275,14 @@ _ip_config_data_new(NMDnsConfigData *data, NMIPConfig *ip_config, NMDnsIPConfigT
(GCallback) _ip_config_dns_priority_changed, (GCallback) _ip_config_dns_priority_changed,
ip_data); ip_data);
_ASSERT_ip_config_data(ip_data); _ASSERT_dns_config_ip_data(ip_data);
return ip_data; return ip_data;
} }
static void static void
_ip_config_data_free(NMDnsIPConfigData *ip_data) _dns_config_ip_data_free(NMDnsConfigIPData *ip_data)
{ {
_ASSERT_ip_config_data(ip_data); _ASSERT_dns_config_ip_data(ip_data);
c_list_unlink_stale(&ip_data->data_lst); c_list_unlink_stale(&ip_data->data_lst);
c_list_unlink_stale(&ip_data->ip_config_lst); c_list_unlink_stale(&ip_data->ip_config_lst);
@ -292,15 +298,15 @@ _ip_config_data_free(NMDnsIPConfigData *ip_data)
nm_g_slice_free(ip_data); nm_g_slice_free(ip_data);
} }
static NMDnsIPConfigData * static NMDnsConfigIPData *
_config_data_find_ip_config(NMDnsConfigData *data, NMIPConfig *ip_config) _dns_config_data_find_ip_config(NMDnsConfigData *data, NMIPConfig *ip_config)
{ {
NMDnsIPConfigData *ip_data; NMDnsConfigIPData *ip_data;
_ASSERT_config_data(data); _ASSERT_dns_config_data(data);
c_list_for_each_entry (ip_data, &data->data_lst_head, data_lst) { c_list_for_each_entry (ip_data, &data->data_lst_head, data_lst) {
_ASSERT_ip_config_data(ip_data); _ASSERT_dns_config_ip_data(ip_data);
if (ip_data->ip_config == ip_config) if (ip_data->ip_config == ip_config)
return ip_data; return ip_data;
@ -309,19 +315,20 @@ _config_data_find_ip_config(NMDnsConfigData *data, NMIPConfig *ip_config)
} }
static void static void
_config_data_free(NMDnsConfigData *data) _dns_config_data_free(NMDnsConfigData *data)
{ {
_ASSERT_config_data(data); _ASSERT_dns_config_data(data);
nm_assert(c_list_is_empty(&data->data_lst_head)); nm_assert(c_list_is_empty(&data->data_lst_head));
c_list_unlink_stale(&data->configs_lst);
nm_g_slice_free(data); nm_g_slice_free(data);
} }
static int static int
_ip_config_lst_cmp(const CList *a_lst, const CList *b_lst, const void *user_data) _mgr_get_ip_configs_lst_cmp(const CList *a_lst, const CList *b_lst, const void *user_data)
{ {
const NMDnsIPConfigData *a = c_list_entry(a_lst, NMDnsIPConfigData, ip_config_lst); const NMDnsConfigIPData *a = c_list_entry(a_lst, NMDnsConfigIPData, ip_config_lst);
const NMDnsIPConfigData *b = c_list_entry(b_lst, NMDnsIPConfigData, ip_config_lst); const NMDnsConfigIPData *b = c_list_entry(b_lst, NMDnsConfigIPData, ip_config_lst);
/* Configurations with lower priority value first */ /* Configurations with lower priority value first */
NM_CMP_DIRECT(nm_ip_config_get_dns_priority(a->ip_config), NM_CMP_DIRECT(nm_ip_config_get_dns_priority(a->ip_config),
@ -334,16 +341,39 @@ _ip_config_lst_cmp(const CList *a_lst, const CList *b_lst, const void *user_data
} }
static CList * static CList *
_ip_config_lst_head(NMDnsManager *self) _mgr_get_ip_configs_lst_head(NMDnsManager *self)
{ {
NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE(self); NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE(self);
if (priv->ip_config_lst_need_sort) { if (G_UNLIKELY(priv->ip_configs_lst_need_sort)) {
priv->ip_config_lst_need_sort = FALSE; priv->ip_configs_lst_need_sort = FALSE;
c_list_sort(&priv->ip_config_lst_head, _ip_config_lst_cmp, NULL); c_list_sort(&priv->ip_configs_lst_head, _mgr_get_ip_configs_lst_cmp, NULL);
} }
return &priv->ip_config_lst_head; return &priv->ip_configs_lst_head;
}
static int
_mgr_get_configs_lst_cmp(const CList *a_lst, const CList *b_lst, const void *user_data)
{
const NMDnsConfigData *a = c_list_entry(a_lst, NMDnsConfigData, configs_lst);
const NMDnsConfigData *b = c_list_entry(b_lst, NMDnsConfigData, configs_lst);
NM_CMP_FIELD(b, a, ifindex);
return nm_assert_unreachable_val(0);
}
_nm_unused static CList *
_mgr_get_configs_lst_head(NMDnsManager *self)
{
NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE(self);
if (G_UNLIKELY(priv->configs_lst_need_sort)) {
priv->configs_lst_need_sort = FALSE;
c_list_sort(&priv->configs_lst_head, _mgr_get_configs_lst_cmp, NULL);
}
return &priv->configs_lst_head;
} }
/*****************************************************************************/ /*****************************************************************************/
@ -1077,7 +1107,7 @@ static void
compute_hash(NMDnsManager *self, const NMGlobalDnsConfig *global, guint8 buffer[HASH_LEN]) compute_hash(NMDnsManager *self, const NMGlobalDnsConfig *global, guint8 buffer[HASH_LEN])
{ {
nm_auto_free_checksum GChecksum *sum = NULL; nm_auto_free_checksum GChecksum *sum = NULL;
NMDnsIPConfigData * ip_data; NMDnsConfigIPData * ip_data;
sum = g_checksum_new(G_CHECKSUM_SHA1); sum = g_checksum_new(G_CHECKSUM_SHA1);
nm_assert(HASH_LEN == g_checksum_type_get_length(G_CHECKSUM_SHA1)); nm_assert(HASH_LEN == g_checksum_type_get_length(G_CHECKSUM_SHA1));
@ -1089,7 +1119,7 @@ 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 = _ip_config_lst_head(self); head = _mgr_get_ip_configs_lst_head(self);
c_list_for_each_entry (ip_data, head, ip_config_lst) c_list_for_each_entry (ip_data, head, ip_config_lst)
nm_ip_config_hash(ip_data->ip_config, sum, TRUE); nm_ip_config_hash(ip_data->ip_config, sum, TRUE);
} }
@ -1196,15 +1226,15 @@ _collect_resolv_conf_data(NMDnsManager * self,
else { else {
nm_auto_free_gstring GString *tmp_gstring = NULL; nm_auto_free_gstring GString *tmp_gstring = NULL;
int prio, first_prio = 0; int prio, first_prio = 0;
const NMDnsIPConfigData * ip_data; const NMDnsConfigIPData * ip_data;
const CList * head; const CList * head;
gboolean is_first = TRUE; gboolean is_first = TRUE;
head = _ip_config_lst_head(self); head = _mgr_get_ip_configs_lst_head(self);
c_list_for_each_entry (ip_data, head, ip_config_lst) { c_list_for_each_entry (ip_data, head, ip_config_lst) {
gboolean skip = FALSE; gboolean skip = FALSE;
_ASSERT_ip_config_data(ip_data); _ASSERT_dns_config_ip_data(ip_data);
prio = nm_ip_config_get_dns_priority(ip_data->ip_config); prio = nm_ip_config_get_dns_priority(ip_data->ip_config);
@ -1259,41 +1289,35 @@ _collect_resolv_conf_data(NMDnsManager * self,
*out_nis_domain = rc.nis_domain; *out_nis_domain = rc.nis_domain;
} }
/*****************************************************************************/
static char ** static char **
get_ip_rdns_domains(NMIPConfig *ip_config) get_ip_rdns_domains(NMIPConfig *ip_config)
{ {
int addr_family = nm_ip_config_get_addr_family(ip_config); int addr_family = nm_ip_config_get_addr_family(ip_config);
char ** strv; char ** strv;
GPtrArray * domains = NULL; GPtrArray * domains;
NMDedupMultiIter ipconf_iter; NMDedupMultiIter ipconf_iter;
const NMPlatformIPAddress *address;
const NMPlatformIPRoute * route;
nm_assert_addr_family(addr_family); nm_assert_addr_family(addr_family);
domains = g_ptr_array_sized_new(5); domains = g_ptr_array_sized_new(5);
if (addr_family == AF_INET) { nm_ip_config_iter_ip_address_for_each (&ipconf_iter, ip_config, &address) {
NMIP4Config * ip4 = (gpointer) ip_config; nm_utils_get_reverse_dns_domains_ip(addr_family,
const NMPlatformIP4Address *address; address->address_ptr,
const NMPlatformIP4Route * route; address->plen,
domains);
}
nm_ip_config_iter_ip4_address_for_each (&ipconf_iter, ip4, &address) nm_ip_config_iter_ip_route_for_each (&ipconf_iter, ip_config, &route) {
nm_utils_get_reverse_dns_domains_ip4(address->address, address->plen, domains); if (!NM_PLATFORM_IP_ROUTE_IS_DEFAULT(route)) {
nm_utils_get_reverse_dns_domains_ip(addr_family,
nm_ip_config_iter_ip4_route_for_each (&ipconf_iter, ip4, &route) { route->network_ptr,
if (!NM_PLATFORM_IP_ROUTE_IS_DEFAULT(route)) route->plen,
nm_utils_get_reverse_dns_domains_ip4(route->network, route->plen, domains); domains);
}
} else {
NMIP6Config * ip6 = (gpointer) ip_config;
const NMPlatformIP6Address *address;
const NMPlatformIP6Route * route;
nm_ip_config_iter_ip6_address_for_each (&ipconf_iter, ip6, &address)
nm_utils_get_reverse_dns_domains_ip6(&address->address, address->plen, domains);
nm_ip_config_iter_ip6_route_for_each (&ipconf_iter, ip6, &route) {
if (!NM_PLATFORM_IP_ROUTE_IS_DEFAULT(route))
nm_utils_get_reverse_dns_domains_ip6(&route->network, route->plen, domains);
} }
} }
@ -1307,7 +1331,7 @@ get_ip_rdns_domains(NMIPConfig *ip_config)
} }
static gboolean static gboolean
domain_ht_get_priority(GHashTable *ht, const char *domain, int *out_priority) _domain_track_get_priority(GHashTable *ht, const char *domain, int *out_priority)
{ {
gpointer ptr; gpointer ptr;
@ -1321,11 +1345,11 @@ domain_ht_get_priority(GHashTable *ht, const char *domain, int *out_priority)
/* Check if the domain is shadowed by a parent domain with more negative priority */ /* Check if the domain is shadowed by a parent domain with more negative priority */
static gboolean static gboolean
domain_is_shadowed(GHashTable * ht, _domain_track_is_shadowed(GHashTable * ht,
const char * domain, const char * domain,
int priority, int priority,
const char **out_parent, const char **out_parent,
int * out_parent_priority) int * out_parent_priority)
{ {
char *parent; char *parent;
int parent_priority; int parent_priority;
@ -1335,7 +1359,7 @@ domain_is_shadowed(GHashTable * ht,
nm_assert(!g_hash_table_contains(ht, domain)); nm_assert(!g_hash_table_contains(ht, domain));
if (domain_ht_get_priority(ht, "", &parent_priority)) { if (_domain_track_get_priority(ht, "", &parent_priority)) {
nm_assert(parent_priority <= priority); nm_assert(parent_priority <= priority);
if (parent_priority < 0 && parent_priority < priority) { if (parent_priority < 0 && parent_priority < priority) {
*out_parent = ""; *out_parent = "";
@ -1347,7 +1371,7 @@ domain_is_shadowed(GHashTable * ht,
parent = strchr(domain, '.'); parent = strchr(domain, '.');
while (parent && parent[1]) { while (parent && parent[1]) {
parent++; parent++;
if (domain_ht_get_priority(ht, parent, &parent_priority)) { if (_domain_track_get_priority(ht, parent, &parent_priority)) {
nm_assert(parent_priority <= priority); nm_assert(parent_priority <= priority);
if (parent_priority < 0 && parent_priority < priority) { if (parent_priority < 0 && parent_priority < priority) {
*out_parent = parent; *out_parent = parent;
@ -1362,18 +1386,18 @@ domain_is_shadowed(GHashTable * ht,
} }
static void static void
rebuild_domain_lists(NMDnsManager *self) _mgr_configs_data_construct(NMDnsManager *self)
{ {
NMDnsIPConfigData *ip_data; NMDnsConfigIPData *ip_data;
gs_unref_hashtable GHashTable *ht = NULL; gs_unref_hashtable GHashTable *ht = NULL;
gs_unref_hashtable GHashTable *wildcard_entries = NULL; gs_unref_hashtable GHashTable *wildcard_entries = NULL;
CList * head; CList * head;
int prev_priority = G_MININT; int prev_priority = G_MININT;
head = _ip_config_lst_head(self); head = _mgr_get_ip_configs_lst_head(self);
#if NM_MORE_ASSERTS #if NM_MORE_ASSERTS
/* we call clear_domain_lists() at the end of update. We /* we call _mgr_configs_data_clear() at the end of update. We
* don't expect any domain settings here. */ * don't expect any domain settings here. */
c_list_for_each_entry (ip_data, head, ip_config_lst) { c_list_for_each_entry (ip_data, head, ip_config_lst) {
nm_assert(!ip_data->domains.search); nm_assert(!ip_data->domains.search);
@ -1496,7 +1520,7 @@ rebuild_domain_lists(NMDnsManager *self)
break; break;
/* Remove domains with lower priority */ /* Remove domains with lower priority */
if (domain_ht_get_priority(ht, domain_clean, &old_priority)) { if (_domain_track_get_priority(ht, domain_clean, &old_priority)) {
nm_assert(old_priority <= priority); nm_assert(old_priority <= priority);
if (old_priority < priority) { if (old_priority < priority) {
_LOGT("plugin: drop domain %s%s%s (i=%d, p=%d) because it already exists " _LOGT("plugin: drop domain %s%s%s (i=%d, p=%d) because it already exists "
@ -1511,7 +1535,11 @@ rebuild_domain_lists(NMDnsManager *self)
old_priority); old_priority);
continue; continue;
} }
} else if (domain_is_shadowed(ht, domain_clean, priority, &parent, &parent_priority)) { } else if (_domain_track_is_shadowed(ht,
domain_clean,
priority,
&parent,
&parent_priority)) {
_LOGT("plugin: drop domain %s%s%s (i=%d, p=%d) shadowed by '%s' (p=%d)", _LOGT("plugin: drop domain %s%s%s (i=%d, p=%d) shadowed by '%s' (p=%d)",
NM_PRINT_FMT_QUOTED(!check_default_route, NM_PRINT_FMT_QUOTED(!check_default_route,
"'", "'",
@ -1578,12 +1606,12 @@ rebuild_domain_lists(NMDnsManager *self)
} }
static void static void
clear_domain_lists(NMDnsManager *self) _mgr_configs_data_clear(NMDnsManager *self)
{ {
NMDnsIPConfigData *ip_data; NMDnsConfigIPData *ip_data;
CList * head; CList * head;
head = _ip_config_lst_head(self); head = _mgr_get_ip_configs_lst_head(self);
c_list_for_each_entry (ip_data, head, ip_config_lst) { c_list_for_each_entry (ip_data, head, ip_config_lst) {
nm_clear_g_free(&ip_data->domains.search); nm_clear_g_free(&ip_data->domains.search);
nm_clear_pointer(&ip_data->domains.reverse, g_strfreev); nm_clear_pointer(&ip_data->domains.reverse, g_strfreev);
@ -1593,6 +1621,8 @@ clear_domain_lists(NMDnsManager *self)
} }
} }
/*****************************************************************************/
static gboolean static gboolean
update_dns(NMDnsManager *self, gboolean no_caching, GError **error) update_dns(NMDnsManager *self, gboolean no_caching, GError **error)
{ {
@ -1645,12 +1675,12 @@ update_dns(NMDnsManager *self, gboolean no_caching, GError **error)
&nis_domain); &nis_domain);
if (priv->plugin || priv->sd_resolve_plugin) if (priv->plugin || priv->sd_resolve_plugin)
rebuild_domain_lists(self); _mgr_configs_data_construct(self);
if (priv->sd_resolve_plugin) { if (priv->sd_resolve_plugin) {
nm_dns_plugin_update(priv->sd_resolve_plugin, nm_dns_plugin_update(priv->sd_resolve_plugin,
global_config, global_config,
_ip_config_lst_head(self), _mgr_get_ip_configs_lst_head(self),
priv->hostname, priv->hostname,
NULL); NULL);
} }
@ -1672,7 +1702,7 @@ update_dns(NMDnsManager *self, gboolean no_caching, GError **error)
_LOGD("update-dns: updating plugin %s", plugin_name); _LOGD("update-dns: updating plugin %s", plugin_name);
if (!nm_dns_plugin_update(plugin, if (!nm_dns_plugin_update(plugin,
global_config, global_config,
_ip_config_lst_head(self), _mgr_get_ip_configs_lst_head(self),
priv->hostname, priv->hostname,
&plugin_error)) { &plugin_error)) {
_LOGW("update-dns: plugin %s update failed: %s", plugin_name, plugin_error->message); _LOGW("update-dns: plugin %s update failed: %s", plugin_name, plugin_error->message);
@ -1689,7 +1719,7 @@ plugin_skip:;
/* Clear the generated search list as it points to /* Clear the generated search list as it points to
* strings owned by IP configurations and we can't * strings owned by IP configurations and we can't
* guarantee they stay alive. */ * guarantee they stay alive. */
clear_domain_lists(self); _mgr_configs_data_clear(self);
update_resolv_conf_no_stub(self, update_resolv_conf_no_stub(self,
NM_CAST_STRV_CC(searches), NM_CAST_STRV_CC(searches),
@ -1805,11 +1835,11 @@ plugin_skip:;
/*****************************************************************************/ /*****************************************************************************/
static void static void
_ip_config_dns_priority_changed(gpointer config, GParamSpec *pspec, NMDnsIPConfigData *ip_data) _ip_config_dns_priority_changed(gpointer config, GParamSpec *pspec, NMDnsConfigIPData *ip_data)
{ {
_ASSERT_ip_config_data(ip_data); _ASSERT_dns_config_ip_data(ip_data);
NM_DNS_MANAGER_GET_PRIVATE(ip_data->data->self)->ip_config_lst_need_sort = TRUE; NM_DNS_MANAGER_GET_PRIVATE(ip_data->data->self)->ip_configs_lst_need_sort = TRUE;
} }
gboolean gboolean
@ -1818,10 +1848,10 @@ nm_dns_manager_set_ip_config(NMDnsManager * self,
NMDnsIPConfigType ip_config_type) NMDnsIPConfigType ip_config_type)
{ {
NMDnsManagerPrivate *priv; NMDnsManagerPrivate *priv;
NMDnsIPConfigData * ip_data; NMDnsConfigIPData * ip_data;
NMDnsConfigData * data; NMDnsConfigData * data;
int ifindex; int ifindex;
NMDnsIPConfigData ** p_best; NMDnsConfigIPData ** p_best;
g_return_val_if_fail(NM_IS_DNS_MANAGER(self), FALSE); g_return_val_if_fail(NM_IS_DNS_MANAGER(self), FALSE);
g_return_val_if_fail(NM_IS_IP_CONFIG(ip_config), FALSE); g_return_val_if_fail(NM_IS_IP_CONFIG(ip_config), FALSE);
@ -1831,11 +1861,11 @@ nm_dns_manager_set_ip_config(NMDnsManager * self,
priv = NM_DNS_MANAGER_GET_PRIVATE(self); priv = NM_DNS_MANAGER_GET_PRIVATE(self);
data = g_hash_table_lookup(priv->configs, &ifindex); data = g_hash_table_lookup(priv->configs_dict, &ifindex);
if (!data) if (!data)
ip_data = NULL; ip_data = NULL;
else else
ip_data = _config_data_find_ip_config(data, ip_config); ip_data = _dns_config_data_find_ip_config(data, ip_config);
if (ip_config_type == NM_DNS_IP_CONFIG_TYPE_REMOVED) { if (ip_config_type == NM_DNS_IP_CONFIG_TYPE_REMOVED) {
if (!ip_data) if (!ip_data)
@ -1845,9 +1875,9 @@ nm_dns_manager_set_ip_config(NMDnsManager * self,
if (priv->best_ip_config_6 == ip_data) if (priv->best_ip_config_6 == ip_data)
priv->best_ip_config_6 = NULL; priv->best_ip_config_6 = NULL;
/* deleting a config doesn't invalidate the configs' sort order. */ /* deleting a config doesn't invalidate the configs' sort order. */
_ip_config_data_free(ip_data); _dns_config_ip_data_free(ip_data);
if (c_list_is_empty(&data->data_lst_head)) if (c_list_is_empty(&data->data_lst_head))
g_hash_table_remove(priv->configs, &ifindex); g_hash_table_remove(priv->configs_dict, &ifindex);
goto changed; goto changed;
} }
@ -1863,16 +1893,18 @@ nm_dns_manager_set_ip_config(NMDnsManager * self,
.self = self, .self = self,
.data_lst_head = C_LIST_INIT(data->data_lst_head), .data_lst_head = C_LIST_INIT(data->data_lst_head),
}; };
_ASSERT_config_data(data); _ASSERT_dns_config_data(data);
g_hash_table_add(priv->configs, data); g_hash_table_add(priv->configs_dict, data);
c_list_link_tail(&priv->configs_lst_head, &data->configs_lst);
priv->configs_lst_need_sort = TRUE;
} }
if (!ip_data) if (!ip_data)
ip_data = _ip_config_data_new(data, ip_config, ip_config_type); ip_data = _dns_config_ip_data_new(data, ip_config, ip_config_type);
else else
ip_data->ip_config_type = ip_config_type; ip_data->ip_config_type = ip_config_type;
priv->ip_config_lst_need_sort = TRUE; priv->ip_configs_lst_need_sort = TRUE;
p_best = NM_IS_IP4_CONFIG(ip_config) ? &priv->best_ip_config_4 : &priv->best_ip_config_6; p_best = NM_IS_IP4_CONFIG(ip_config) ? &priv->best_ip_config_4 : &priv->best_ip_config_6;
@ -2392,7 +2424,7 @@ _get_config_variant(NMDnsManager *self)
NMGlobalDnsConfig * global_config; NMGlobalDnsConfig * global_config;
gs_free char * str = NULL; gs_free char * str = NULL;
GVariantBuilder builder; GVariantBuilder builder;
NMDnsIPConfigData * ip_data; NMDnsConfigIPData * ip_data;
const CList * head; const CList * head;
gs_unref_ptrarray GPtrArray *array_domains = NULL; gs_unref_ptrarray GPtrArray *array_domains = NULL;
@ -2408,7 +2440,7 @@ _get_config_variant(NMDnsManager *self)
g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}")); g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}"));
head = _ip_config_lst_head(self); head = _mgr_get_ip_configs_lst_head(self);
c_list_for_each_entry (ip_data, head, ip_config_lst) { c_list_for_each_entry (ip_data, head, ip_config_lst) {
const NMIPConfig *ip_config = ip_data->ip_config; const NMIPConfig *ip_config = ip_data->ip_config;
GVariantBuilder entry_builder; GVariantBuilder entry_builder;
@ -2513,15 +2545,16 @@ nm_dns_manager_init(NMDnsManager *self)
_LOGT("creating..."); _LOGT("creating...");
c_list_init(&priv->ip_config_lst_head); c_list_init(&priv->configs_lst_head);
c_list_init(&priv->ip_configs_lst_head);
priv->config = g_object_ref(nm_config_get()); priv->config = g_object_ref(nm_config_get());
G_STATIC_ASSERT_EXPR(G_STRUCT_OFFSET(NMDnsConfigData, ifindex) == 0); G_STATIC_ASSERT_EXPR(G_STRUCT_OFFSET(NMDnsConfigData, ifindex) == 0);
priv->configs = g_hash_table_new_full(nm_pint_hash, priv->configs_dict = g_hash_table_new_full(nm_pint_hash,
nm_pint_equals, nm_pint_equals,
(GDestroyNotify) _config_data_free, (GDestroyNotify) _dns_config_data_free,
NULL); NULL);
/* Set the initial hash */ /* Set the initial hash */
compute_hash(self, NULL, NM_DNS_MANAGER_GET_PRIVATE(self)->hash); compute_hash(self, NULL, NM_DNS_MANAGER_GET_PRIVATE(self)->hash);
@ -2538,7 +2571,7 @@ dispose(GObject *object)
{ {
NMDnsManager * self = NM_DNS_MANAGER(object); NMDnsManager * self = NM_DNS_MANAGER(object);
NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE(self); NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE(self);
NMDnsIPConfigData * ip_data, *ip_data_safe; NMDnsConfigIPData * ip_data, *ip_data_safe;
_LOGT("disposing"); _LOGT("disposing");
@ -2554,10 +2587,11 @@ dispose(GObject *object)
priv->best_ip_config_4 = NULL; priv->best_ip_config_4 = NULL;
priv->best_ip_config_6 = NULL; priv->best_ip_config_6 = NULL;
c_list_for_each_entry_safe (ip_data, ip_data_safe, &priv->ip_config_lst_head, ip_config_lst) c_list_for_each_entry_safe (ip_data, ip_data_safe, &priv->ip_configs_lst_head, ip_config_lst)
_ip_config_data_free(ip_data); _dns_config_ip_data_free(ip_data);
nm_clear_pointer(&priv->configs, g_hash_table_destroy); nm_clear_pointer(&priv->configs_dict, g_hash_table_destroy);
nm_assert(c_list_is_empty(&priv->configs_lst_head));
nm_clear_g_source(&priv->plugin_ratelimit.timer); nm_clear_g_source(&priv->plugin_ratelimit.timer);

View file

@ -25,6 +25,8 @@ enum {
NM_DNS_PRIORITY_DEFAULT_VPN = 50, NM_DNS_PRIORITY_DEFAULT_VPN = 50,
}; };
/*****************************************************************************/
struct _NMDnsConfigData; struct _NMDnsConfigData;
struct _NMDnsManager; struct _NMDnsManager;
@ -60,14 +62,17 @@ typedef struct {
* With systemd-resolved, this is the value for SetLinkDefaultRoute(). */ * With systemd-resolved, this is the value for SetLinkDefaultRoute(). */
bool has_default_route : 1; bool has_default_route : 1;
} domains; } domains;
} NMDnsIPConfigData; } NMDnsConfigIPData;
typedef struct _NMDnsConfigData { typedef struct _NMDnsConfigData {
int ifindex; int ifindex;
struct _NMDnsManager *self; struct _NMDnsManager *self;
CList data_lst_head; CList data_lst_head;
CList configs_lst;
} NMDnsConfigData; } NMDnsConfigData;
/*****************************************************************************/
#define NM_TYPE_DNS_MANAGER (nm_dns_manager_get_type()) #define NM_TYPE_DNS_MANAGER (nm_dns_manager_get_type())
#define NM_DNS_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST((o), NM_TYPE_DNS_MANAGER, NMDnsManager)) #define NM_DNS_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST((o), NM_TYPE_DNS_MANAGER, NMDnsManager))
#define NM_DNS_MANAGER_CLASS(k) \ #define NM_DNS_MANAGER_CLASS(k) \

View file

@ -26,7 +26,7 @@ typedef struct {
GObjectClass parent; GObjectClass parent;
/* Called when DNS information is changed. 'configs' is an array /* Called when DNS information is changed. 'configs' is an array
* of pointers to NMDnsIPConfigData sorted by priority. * of pointers to NMDnsConfigIPData sorted by priority.
* 'global_config' is the optional global DNS * 'global_config' is the optional global DNS
* configuration. * configuration.
*/ */

View file

@ -139,7 +139,7 @@ static gboolean
update_add_ip_config(NMDnsSystemdResolved *self, update_add_ip_config(NMDnsSystemdResolved *self,
GVariantBuilder * dns, GVariantBuilder * dns,
GVariantBuilder * domains, GVariantBuilder * domains,
NMDnsIPConfigData * data) NMDnsConfigIPData * data)
{ {
int addr_family; int addr_family;
gsize addr_size; gsize addr_size;
@ -216,7 +216,7 @@ prepare_one_interface(NMDnsSystemdResolved *self, InterfaceConfig *ic)
g_variant_builder_open(&domains, G_VARIANT_TYPE("a(sb)")); g_variant_builder_open(&domains, G_VARIANT_TYPE("a(sb)"));
c_list_for_each_entry (elem, &ic->configs_lst_head, lst) { c_list_for_each_entry (elem, &ic->configs_lst_head, lst) {
NMDnsIPConfigData *data = elem->data; NMDnsConfigIPData *data = elem->data;
NMIPConfig * ip_config = data->ip_config; NMIPConfig * ip_config = data->ip_config;
has_config |= update_add_ip_config(self, &dns, &domains, data); has_config |= update_add_ip_config(self, &dns, &domains, data);
@ -367,7 +367,7 @@ update(NMDnsPlugin * plugin,
gs_free gpointer * interfaces_keys = NULL; gs_free gpointer * interfaces_keys = NULL;
guint interfaces_len; guint interfaces_len;
int ifindex; int ifindex;
NMDnsIPConfigData *ip_data; NMDnsConfigIPData *ip_data;
GHashTableIter iter; GHashTableIter iter;
guint i; guint i;

View file

@ -4381,7 +4381,7 @@ nm_utils_dnsmasq_status_to_string(int status, char *dest, gsize size)
} }
/** /**
* nm_utils_get_reverse_dns_domains_ip4: * nm_utils_get_reverse_dns_domains_ip_4:
* @addr: IP address in network order * @addr: IP address in network order
* @plen: prefix length * @plen: prefix length
* @domains: array for results * @domains: array for results
@ -4390,7 +4390,7 @@ nm_utils_dnsmasq_status_to_string(int status, char *dest, gsize size)
* append them to @domains. * append them to @domains.
*/ */
void void
nm_utils_get_reverse_dns_domains_ip4(guint32 addr, guint8 plen, GPtrArray *domains) nm_utils_get_reverse_dns_domains_ip_4(guint32 addr, guint8 plen, GPtrArray *domains)
{ {
guint32 ip, ip2, mask; guint32 ip, ip2, mask;
guchar *p; guchar *p;
@ -4429,7 +4429,7 @@ nm_utils_get_reverse_dns_domains_ip4(guint32 addr, guint8 plen, GPtrArray *domai
} }
/** /**
* nm_utils_get_reverse_dns_domains_ip6: * nm_utils_get_reverse_dns_domains_ip_6:
* @addr: IPv6 address * @addr: IPv6 address
* @plen: prefix length * @plen: prefix length
* @domains: array for results * @domains: array for results
@ -4438,7 +4438,7 @@ nm_utils_get_reverse_dns_domains_ip4(guint32 addr, guint8 plen, GPtrArray *domai
* append them to @domains. * append them to @domains.
*/ */
void void
nm_utils_get_reverse_dns_domains_ip6(const struct in6_addr *ip, guint8 plen, GPtrArray *domains) nm_utils_get_reverse_dns_domains_ip_6(const struct in6_addr *ip, guint8 plen, GPtrArray *domains)
{ {
struct in6_addr addr; struct in6_addr addr;
guint nibbles, bits, entries; guint nibbles, bits, entries;

View file

@ -532,9 +532,21 @@ nm_utils_ip4_address_is_zeronet(in_addr_t network)
const char *nm_utils_dnsmasq_status_to_string(int status, char *dest, gsize size); const char *nm_utils_dnsmasq_status_to_string(int status, char *dest, gsize size);
void nm_utils_get_reverse_dns_domains_ip4(guint32 ip, guint8 plen, GPtrArray *domains); void nm_utils_get_reverse_dns_domains_ip_4(guint32 ip, guint8 plen, GPtrArray *domains);
void void
nm_utils_get_reverse_dns_domains_ip6(const struct in6_addr *ip, guint8 plen, GPtrArray *domains); nm_utils_get_reverse_dns_domains_ip_6(const struct in6_addr *ip, guint8 plen, GPtrArray *domains);
static inline void
nm_utils_get_reverse_dns_domains_ip(int addr_family,
gconstpointer addr,
guint8 plen,
GPtrArray * domains)
{
if (NM_IS_IPv4(addr_family))
nm_utils_get_reverse_dns_domains_ip_4(*((const in_addr_t *) addr), plen, domains);
else
nm_utils_get_reverse_dns_domains_ip_6(addr, plen, domains);
}
struct stat; struct stat;

View file

@ -319,14 +319,21 @@ NM_IS_IP_CONFIG_ADDR_FAMILY(gconstpointer config, int addr_family)
NM_CONSTCAST_FULL(NMIPConfig, (config), _configx, NMIP4Config, NMIP6Config); \ NM_CONSTCAST_FULL(NMIPConfig, (config), _configx, NMIP4Config, NMIP6Config); \
}) })
static inline gboolean
nm_ip_config_is_ipv4(const NMIPConfig *config)
{
if (NM_IP_CONFIG_GET_CLASS(config)->is_ipv4) {
nm_assert(NM_IS_IP4_CONFIG(config));
return TRUE;
}
nm_assert(NM_IS_IP6_CONFIG(config));
return FALSE;
}
static inline int static inline int
nm_ip_config_get_addr_family(const NMIPConfig *config) nm_ip_config_get_addr_family(const NMIPConfig *config)
{ {
if (NM_IS_IP4_CONFIG(config)) return nm_ip_config_is_ipv4(config) ? AF_INET : AF_INET6;
return AF_INET;
if (NM_IS_IP6_CONFIG(config))
return AF_INET6;
g_return_val_if_reached(AF_UNSPEC);
} }
#define _NM_IP_CONFIG_DISPATCH(config, v4_func, v6_func, ...) \ #define _NM_IP_CONFIG_DISPATCH(config, v4_func, v6_func, ...) \
@ -334,10 +341,9 @@ nm_ip_config_get_addr_family(const NMIPConfig *config)
{ \ { \
gconstpointer _config = (config); \ gconstpointer _config = (config); \
\ \
if (NM_IS_IP4_CONFIG(_config)) { \ if (nm_ip_config_is_ipv4(_config)) { \
return v4_func((NMIP4Config *) _config, ##__VA_ARGS__); \ return v4_func((NMIP4Config *) _config, ##__VA_ARGS__); \
} else { \ } else { \
nm_assert(NM_IS_IP6_CONFIG(_config)); \
return v6_func((NMIP6Config *) _config, ##__VA_ARGS__); \ return v6_func((NMIP6Config *) _config, ##__VA_ARGS__); \
} \ } \
} \ } \
@ -348,10 +354,9 @@ nm_ip_config_get_addr_family(const NMIPConfig *config)
{ \ { \
gconstpointer _config = (config); \ gconstpointer _config = (config); \
\ \
if (NM_IS_IP4_CONFIG(_config)) { \ if (nm_ip_config_is_ipv4(_config)) { \
v4_func((NMIP4Config *) _config, ##__VA_ARGS__); \ v4_func((NMIP4Config *) _config, ##__VA_ARGS__); \
} else { \ } else { \
nm_assert(NM_IS_IP6_CONFIG(_config)); \
v6_func((NMIP6Config *) _config, ##__VA_ARGS__); \ v6_func((NMIP6Config *) _config, ##__VA_ARGS__); \
} \ } \
} \ } \
@ -375,6 +380,32 @@ nm_ip_config_get_first_address(NMIPConfig *self)
_NM_IP_CONFIG_DISPATCH(self, nm_ip4_config_get_first_address, nm_ip6_config_get_first_address); _NM_IP_CONFIG_DISPATCH(self, nm_ip4_config_get_first_address, nm_ip6_config_get_first_address);
} }
static inline void
nm_ip_config_iter_ip_address_init(NMDedupMultiIter *iter, const NMIPConfig *self)
{
if (nm_ip_config_is_ipv4(self))
nm_ip_config_iter_ip4_address_init(iter, (const NMIP4Config *) self);
else
nm_ip_config_iter_ip6_address_init(iter, (const NMIP6Config *) self);
}
#define nm_ip_config_iter_ip_address_for_each(iter, self, address) \
for (nm_ip_config_iter_ip_address_init((iter), (self)); \
nm_platform_dedup_multi_iter_next_ip_address((iter), (address));)
static inline void
nm_ip_config_iter_ip_route_init(NMDedupMultiIter *iter, const NMIPConfig *self)
{
if (nm_ip_config_is_ipv4(self))
nm_ip_config_iter_ip4_route_init(iter, (const NMIP4Config *) self);
else
nm_ip_config_iter_ip6_route_init(iter, (const NMIP6Config *) self);
}
#define nm_ip_config_iter_ip_route_for_each(iter, self, route) \
for (nm_ip_config_iter_ip_route_init((iter), (self)); \
nm_platform_dedup_multi_iter_next_ip_route((iter), (route));)
static inline void static inline void
nm_ip_config_add_address(NMIPConfig *self, const NMPlatformIPAddress *address) nm_ip_config_add_address(NMIPConfig *self, const NMPlatformIPAddress *address)
{ {
@ -549,11 +580,9 @@ nm_ip_config_set_never_default(NMIPConfig *self, gboolean never_default)
gpointer _dst = (dst); \ gpointer _dst = (dst); \
gconstpointer _src = (src); \ gconstpointer _src = (src); \
\ \
if (NM_IS_IP4_CONFIG(_dst)) { \ if (nm_ip_config_is_ipv4(_dst)) { \
nm_assert(NM_IS_IP4_CONFIG(_src)); \
_return v4_func((NMIP4Config *) _dst, (const NMIP4Config *) _src, ##__VA_ARGS__); \ _return v4_func((NMIP4Config *) _dst, (const NMIP4Config *) _src, ##__VA_ARGS__); \
} else { \ } else { \
nm_assert(NM_IS_IP6_CONFIG(_src)); \
_return v6_func((NMIP6Config *) _dst, (const NMIP6Config *) _src, ##__VA_ARGS__); \ _return v6_func((NMIP6Config *) _dst, (const NMIP6Config *) _src, ##__VA_ARGS__); \
} \ } \
} \ } \
@ -616,7 +645,8 @@ nm_ip_config_intersect_alloc(const NMIPConfig *a,
gboolean intersect_routes, gboolean intersect_routes,
guint32 default_route_metric_penalty) guint32 default_route_metric_penalty)
{ {
if (NM_IS_IP4_CONFIG(a)) { if (nm_ip_config_is_ipv4(a)) {
nm_assert(NM_IS_IP4_CONFIG(a));
nm_assert(NM_IS_IP4_CONFIG(b)); nm_assert(NM_IS_IP4_CONFIG(b));
return (NMIPConfig *) nm_ip4_config_intersect_alloc((const NMIP4Config *) a, return (NMIPConfig *) nm_ip4_config_intersect_alloc((const NMIP4Config *) a,
(const NMIP4Config *) b, (const NMIP4Config *) b,

View file

@ -126,11 +126,13 @@ NM_AUTO_DEFINE_FCN0(NMPacrunnerConfId *, _nm_auto_unref_conf_id, conf_id_unref);
static void static void
get_ip_domains(GPtrArray *domains, NMIPConfig *ip_config) get_ip_domains(GPtrArray *domains, NMIPConfig *ip_config)
{ {
NMDedupMultiIter ipconf_iter; NMDedupMultiIter ipconf_iter;
char * cidr; char * cidr;
guint i, num; guint i, num;
char sbuf[NM_UTILS_INET_ADDRSTRLEN]; char sbuf[NM_UTILS_INET_ADDRSTRLEN];
int addr_family; int addr_family;
const NMPlatformIPAddress *address;
const NMPlatformIPRoute * routes;
if (!ip_config) if (!ip_config)
return; return;
@ -145,47 +147,20 @@ get_ip_domains(GPtrArray *domains, NMIPConfig *ip_config)
for (i = 0; i < num; i++) for (i = 0; i < num; i++)
g_ptr_array_add(domains, g_strdup(nm_ip_config_get_domain(ip_config, i))); g_ptr_array_add(domains, g_strdup(nm_ip_config_get_domain(ip_config, i)));
if (addr_family == AF_INET) { nm_ip_config_iter_ip_address_for_each (&ipconf_iter, ip_config, &address) {
const NMPlatformIP4Address *address; cidr = g_strdup_printf("%s/%u",
nm_utils_inet_ntop(addr_family, address->address_ptr, sbuf),
nm_ip_config_iter_ip4_address_for_each (&ipconf_iter, (NMIP4Config *) ip_config, &address) { address->plen);
cidr = g_strdup_printf("%s/%u", g_ptr_array_add(domains, cidr);
_nm_utils_inet4_ntop(address->address, sbuf),
address->plen);
g_ptr_array_add(domains, cidr);
}
} else {
const NMPlatformIP6Address *address;
nm_ip_config_iter_ip6_address_for_each (&ipconf_iter, (NMIP6Config *) ip_config, &address) {
cidr = g_strdup_printf("%s/%u",
_nm_utils_inet6_ntop(&address->address, sbuf),
address->plen);
g_ptr_array_add(domains, cidr);
}
} }
if (addr_family == AF_INET) { nm_ip_config_iter_ip_route_for_each (&ipconf_iter, ip_config, &routes) {
const NMPlatformIP4Route *routes; if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT(routes))
continue;
nm_ip_config_iter_ip4_route_for_each (&ipconf_iter, (NMIP4Config *) ip_config, &routes) { cidr = g_strdup_printf("%s/%u",
if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT(routes)) nm_utils_inet_ntop(addr_family, routes->network_ptr, sbuf),
continue; routes->plen);
cidr = g_ptr_array_add(domains, cidr);
g_strdup_printf("%s/%u", _nm_utils_inet4_ntop(routes->network, sbuf), routes->plen);
g_ptr_array_add(domains, cidr);
}
} else {
const NMPlatformIP6Route *routes;
nm_ip_config_iter_ip6_route_for_each (&ipconf_iter, (NMIP6Config *) ip_config, &routes) {
if (NM_PLATFORM_IP_ROUTE_IS_DEFAULT(routes))
continue;
cidr = g_strdup_printf("%s/%u",
_nm_utils_inet6_ntop(&routes->network, sbuf),
routes->plen);
g_ptr_array_add(domains, cidr);
}
} }
} }

View file

@ -1077,52 +1077,64 @@ nm_platform_dedup_multi_iter_next_obj(NMDedupMultiIter *ipconf_iter,
return has_next; return has_next;
} }
static inline gboolean #define _nm_platform_dedup_multi_iter_next(ipconf_iter, out_obj, field, ...) \
nm_platform_dedup_multi_iter_next_ip4_address(NMDedupMultiIter * ipconf_iter, ({ \
const NMPlatformIP4Address **out_address) NMDedupMultiIter *const _ipconf_iter = (ipconf_iter); \
{ const typeof(((NMPObject *) NULL)->field) **const _out_obj = (out_obj); \
gboolean has_next; gboolean _has_next; \
\
if (G_LIKELY(nm_dedup_multi_iter_next(_ipconf_iter))) { \
if (_out_obj) { \
*_out_obj = _NMP_OBJECT_CAST(_ipconf_iter->current->obj, field, __VA_ARGS__); \
} else { \
nm_assert( \
NM_IN_SET(NMP_OBJECT_GET_TYPE(_ipconf_iter->current->obj), __VA_ARGS__)); \
} \
_has_next = TRUE; \
} else { \
if (_out_obj) \
*_out_obj = NULL; \
_has_next = FALSE; \
} \
_has_next; \
})
has_next = nm_dedup_multi_iter_next(ipconf_iter); #define nm_platform_dedup_multi_iter_next_ip_address(ipconf_iter, out_obj) \
if (out_address) _nm_platform_dedup_multi_iter_next((ipconf_iter), \
*out_address = has_next ? NMP_OBJECT_CAST_IP4_ADDRESS(ipconf_iter->current->obj) : NULL; (out_obj), \
return has_next; ip_address, \
} NMP_OBJECT_TYPE_IP4_ADDRESS, \
NMP_OBJECT_TYPE_IP6_ADDRESS)
static inline gboolean #define nm_platform_dedup_multi_iter_next_ip4_address(ipconf_iter, out_obj) \
nm_platform_dedup_multi_iter_next_ip4_route(NMDedupMultiIter * ipconf_iter, _nm_platform_dedup_multi_iter_next((ipconf_iter), \
const NMPlatformIP4Route **out_route) (out_obj), \
{ ip4_address, \
gboolean has_next; NMP_OBJECT_TYPE_IP4_ADDRESS)
has_next = nm_dedup_multi_iter_next(ipconf_iter); #define nm_platform_dedup_multi_iter_next_ip6_address(ipconf_iter, out_obj) \
if (out_route) _nm_platform_dedup_multi_iter_next((ipconf_iter), \
*out_route = has_next ? NMP_OBJECT_CAST_IP4_ROUTE(ipconf_iter->current->obj) : NULL; (out_obj), \
return has_next; ip6_address, \
} NMP_OBJECT_TYPE_IP6_ADDRESS)
static inline gboolean #define nm_platform_dedup_multi_iter_next_ip_route(ipconf_iter, out_obj) \
nm_platform_dedup_multi_iter_next_ip6_address(NMDedupMultiIter * ipconf_iter, _nm_platform_dedup_multi_iter_next((ipconf_iter), \
const NMPlatformIP6Address **out_address) (out_obj), \
{ ip_route, \
gboolean has_next; NMP_OBJECT_TYPE_IP4_ROUTE, \
NMP_OBJECT_TYPE_IP6_ROUTE)
has_next = nm_dedup_multi_iter_next(ipconf_iter); #define nm_platform_dedup_multi_iter_next_ip4_route(ipconf_iter, out_obj) \
if (out_address) _nm_platform_dedup_multi_iter_next((ipconf_iter), \
*out_address = has_next ? NMP_OBJECT_CAST_IP6_ADDRESS(ipconf_iter->current->obj) : NULL; (out_obj), \
return has_next; ip4_route, \
} NMP_OBJECT_TYPE_IP4_ROUTE)
static inline gboolean #define nm_platform_dedup_multi_iter_next_ip6_route(ipconf_iter, out_obj) \
nm_platform_dedup_multi_iter_next_ip6_route(NMDedupMultiIter * ipconf_iter, _nm_platform_dedup_multi_iter_next((ipconf_iter), \
const NMPlatformIP6Route **out_route) (out_obj), \
{ ip6_route, \
gboolean has_next; NMP_OBJECT_TYPE_IP6_ROUTE)
has_next = nm_dedup_multi_iter_next(ipconf_iter);
if (out_route)
*out_route = has_next ? NMP_OBJECT_CAST_IP6_ROUTE(ipconf_iter->current->obj) : NULL;
return has_next;
}
#endif /* __NMP_OBJECT_H__ */ #endif /* __NMP_OBJECT_H__ */

View file

@ -1929,7 +1929,7 @@ test_reverse_dns_ip4(void)
GPtrArray *domains = g_ptr_array_new_full(8, g_free); GPtrArray *domains = g_ptr_array_new_full(8, g_free);
inet_pton(AF_INET, "7.2.3.0", &addr); inet_pton(AF_INET, "7.2.3.0", &addr);
nm_utils_get_reverse_dns_domains_ip4(addr, 27, domains); nm_utils_get_reverse_dns_domains_ip_4(addr, 27, domains);
g_assert_cmpuint(domains->len, ==, 32); g_assert_cmpuint(domains->len, ==, 32);
g_assert_cmpstr(domains->pdata[0], ==, "0.3.2.7.in-addr.arpa"); g_assert_cmpstr(domains->pdata[0], ==, "0.3.2.7.in-addr.arpa");
g_assert_cmpstr(domains->pdata[31], ==, "31.3.2.7.in-addr.arpa"); g_assert_cmpstr(domains->pdata[31], ==, "31.3.2.7.in-addr.arpa");
@ -1937,7 +1937,7 @@ test_reverse_dns_ip4(void)
g_ptr_array_set_size(domains, 0); g_ptr_array_set_size(domains, 0);
inet_pton(AF_INET, "10.155.16.0", &addr); inet_pton(AF_INET, "10.155.16.0", &addr);
nm_utils_get_reverse_dns_domains_ip4(addr, 22, domains); nm_utils_get_reverse_dns_domains_ip_4(addr, 22, domains);
g_assert_cmpuint(domains->len, ==, 4); g_assert_cmpuint(domains->len, ==, 4);
g_assert_cmpstr(domains->pdata[0], ==, "16.155.10.in-addr.arpa"); g_assert_cmpstr(domains->pdata[0], ==, "16.155.10.in-addr.arpa");
g_assert_cmpstr(domains->pdata[1], ==, "17.155.10.in-addr.arpa"); g_assert_cmpstr(domains->pdata[1], ==, "17.155.10.in-addr.arpa");
@ -1947,21 +1947,21 @@ test_reverse_dns_ip4(void)
g_ptr_array_set_size(domains, 0); g_ptr_array_set_size(domains, 0);
inet_pton(AF_INET, "4.5.6.7", &addr); inet_pton(AF_INET, "4.5.6.7", &addr);
nm_utils_get_reverse_dns_domains_ip4(addr, 32, domains); nm_utils_get_reverse_dns_domains_ip_4(addr, 32, domains);
g_assert_cmpuint(domains->len, ==, 1); g_assert_cmpuint(domains->len, ==, 1);
g_assert_cmpstr(domains->pdata[0], ==, "7.6.5.4.in-addr.arpa"); g_assert_cmpstr(domains->pdata[0], ==, "7.6.5.4.in-addr.arpa");
g_ptr_array_set_size(domains, 0); g_ptr_array_set_size(domains, 0);
inet_pton(AF_INET, "4.5.6.7", &addr); inet_pton(AF_INET, "4.5.6.7", &addr);
nm_utils_get_reverse_dns_domains_ip4(addr, 8, domains); nm_utils_get_reverse_dns_domains_ip_4(addr, 8, domains);
g_assert_cmpuint(domains->len, ==, 1); g_assert_cmpuint(domains->len, ==, 1);
g_assert_cmpstr(domains->pdata[0], ==, "4.in-addr.arpa"); g_assert_cmpstr(domains->pdata[0], ==, "4.in-addr.arpa");
g_ptr_array_set_size(domains, 0); g_ptr_array_set_size(domains, 0);
inet_pton(AF_INET, "4.180.6.7", &addr); inet_pton(AF_INET, "4.180.6.7", &addr);
nm_utils_get_reverse_dns_domains_ip4(addr, 9, domains); nm_utils_get_reverse_dns_domains_ip_4(addr, 9, domains);
g_assert_cmpuint(domains->len, ==, 128); g_assert_cmpuint(domains->len, ==, 128);
g_assert_cmpstr(domains->pdata[0], ==, "128.4.in-addr.arpa"); g_assert_cmpstr(domains->pdata[0], ==, "128.4.in-addr.arpa");
g_assert_cmpstr(domains->pdata[1], ==, "129.4.in-addr.arpa"); g_assert_cmpstr(domains->pdata[1], ==, "129.4.in-addr.arpa");
@ -1970,7 +1970,7 @@ test_reverse_dns_ip4(void)
g_ptr_array_set_size(domains, 0); g_ptr_array_set_size(domains, 0);
inet_pton(AF_INET, "172.16.0.0", &addr); inet_pton(AF_INET, "172.16.0.0", &addr);
nm_utils_get_reverse_dns_domains_ip4(addr, 12, domains); nm_utils_get_reverse_dns_domains_ip_4(addr, 12, domains);
g_assert_cmpuint(domains->len, ==, 16); g_assert_cmpuint(domains->len, ==, 16);
g_assert_cmpstr(domains->pdata[0], ==, "16.172.in-addr.arpa"); g_assert_cmpstr(domains->pdata[0], ==, "16.172.in-addr.arpa");
g_assert_cmpstr(domains->pdata[1], ==, "17.172.in-addr.arpa"); g_assert_cmpstr(domains->pdata[1], ==, "17.172.in-addr.arpa");
@ -1980,7 +1980,7 @@ test_reverse_dns_ip4(void)
g_ptr_array_set_size(domains, 0); g_ptr_array_set_size(domains, 0);
inet_pton(AF_INET, "1.2.3.4", &addr); inet_pton(AF_INET, "1.2.3.4", &addr);
nm_utils_get_reverse_dns_domains_ip4(addr, 0, domains); nm_utils_get_reverse_dns_domains_ip_4(addr, 0, domains);
g_assert_cmpuint(domains->len, ==, 0); g_assert_cmpuint(domains->len, ==, 0);
g_ptr_array_unref(domains); g_ptr_array_unref(domains);
@ -1993,14 +1993,14 @@ test_reverse_dns_ip6(void)
GPtrArray * domains = g_ptr_array_new_full(8, g_free); GPtrArray * domains = g_ptr_array_new_full(8, g_free);
inet_pton(AF_INET6, "1234::56", &addr); inet_pton(AF_INET6, "1234::56", &addr);
nm_utils_get_reverse_dns_domains_ip6(&addr, 16, domains); nm_utils_get_reverse_dns_domains_ip_6(&addr, 16, domains);
g_assert_cmpuint(domains->len, ==, 1); g_assert_cmpuint(domains->len, ==, 1);
g_assert_cmpstr(domains->pdata[0], ==, "4.3.2.1.ip6.arpa"); g_assert_cmpstr(domains->pdata[0], ==, "4.3.2.1.ip6.arpa");
g_ptr_array_set_size(domains, 0); g_ptr_array_set_size(domains, 0);
inet_pton(AF_INET6, "1234::56", &addr); inet_pton(AF_INET6, "1234::56", &addr);
nm_utils_get_reverse_dns_domains_ip6(&addr, 17, domains); nm_utils_get_reverse_dns_domains_ip_6(&addr, 17, domains);
g_assert_cmpuint(domains->len, ==, 8); g_assert_cmpuint(domains->len, ==, 8);
g_assert_cmpstr(domains->pdata[0], ==, "0.4.3.2.1.ip6.arpa"); g_assert_cmpstr(domains->pdata[0], ==, "0.4.3.2.1.ip6.arpa");
g_assert_cmpstr(domains->pdata[1], ==, "1.4.3.2.1.ip6.arpa"); g_assert_cmpstr(domains->pdata[1], ==, "1.4.3.2.1.ip6.arpa");
@ -2009,7 +2009,7 @@ test_reverse_dns_ip6(void)
g_ptr_array_set_size(domains, 0); g_ptr_array_set_size(domains, 0);
inet_pton(AF_INET6, "2001:db8::", &addr); inet_pton(AF_INET6, "2001:db8::", &addr);
nm_utils_get_reverse_dns_domains_ip6(&addr, 29, domains); nm_utils_get_reverse_dns_domains_ip_6(&addr, 29, domains);
g_assert_cmpuint(domains->len, ==, 8); g_assert_cmpuint(domains->len, ==, 8);
g_assert_cmpstr(domains->pdata[0], ==, "8.b.d.0.1.0.0.2.ip6.arpa"); g_assert_cmpstr(domains->pdata[0], ==, "8.b.d.0.1.0.0.2.ip6.arpa");
g_assert_cmpstr(domains->pdata[1], ==, "9.b.d.0.1.0.0.2.ip6.arpa"); g_assert_cmpstr(domains->pdata[1], ==, "9.b.d.0.1.0.0.2.ip6.arpa");
@ -2018,7 +2018,7 @@ test_reverse_dns_ip6(void)
g_ptr_array_set_size(domains, 0); g_ptr_array_set_size(domains, 0);
inet_pton(AF_INET6, "0123:4567:89ab:cdef::", &addr); inet_pton(AF_INET6, "0123:4567:89ab:cdef::", &addr);
nm_utils_get_reverse_dns_domains_ip6(&addr, 63, domains); nm_utils_get_reverse_dns_domains_ip_6(&addr, 63, domains);
g_assert_cmpuint(domains->len, ==, 2); g_assert_cmpuint(domains->len, ==, 2);
g_assert_cmpstr(domains->pdata[0], ==, "e.e.d.c.b.a.9.8.7.6.5.4.3.2.1.0.ip6.arpa"); g_assert_cmpstr(domains->pdata[0], ==, "e.e.d.c.b.a.9.8.7.6.5.4.3.2.1.0.ip6.arpa");
g_assert_cmpstr(domains->pdata[1], ==, "f.e.d.c.b.a.9.8.7.6.5.4.3.2.1.0.ip6.arpa"); g_assert_cmpstr(domains->pdata[1], ==, "f.e.d.c.b.a.9.8.7.6.5.4.3.2.1.0.ip6.arpa");
@ -2026,7 +2026,7 @@ test_reverse_dns_ip6(void)
g_ptr_array_set_size(domains, 0); g_ptr_array_set_size(domains, 0);
inet_pton(AF_INET6, "fec0:1234:5678:9ab0::", &addr); inet_pton(AF_INET6, "fec0:1234:5678:9ab0::", &addr);
nm_utils_get_reverse_dns_domains_ip6(&addr, 61, domains); nm_utils_get_reverse_dns_domains_ip_6(&addr, 61, domains);
g_assert_cmpuint(domains->len, ==, 8); g_assert_cmpuint(domains->len, ==, 8);
g_assert_cmpstr(domains->pdata[0], ==, "0.b.a.9.8.7.6.5.4.3.2.1.0.c.e.f.ip6.arpa"); g_assert_cmpstr(domains->pdata[0], ==, "0.b.a.9.8.7.6.5.4.3.2.1.0.c.e.f.ip6.arpa");
g_assert_cmpstr(domains->pdata[7], ==, "7.b.a.9.8.7.6.5.4.3.2.1.0.c.e.f.ip6.arpa"); g_assert_cmpstr(domains->pdata[7], ==, "7.b.a.9.8.7.6.5.4.3.2.1.0.c.e.f.ip6.arpa");
@ -2034,7 +2034,7 @@ test_reverse_dns_ip6(void)
g_ptr_array_set_size(domains, 0); g_ptr_array_set_size(domains, 0);
inet_pton(AF_INET6, "0123:4567:89ab:cdee::", &addr); inet_pton(AF_INET6, "0123:4567:89ab:cdee::", &addr);
nm_utils_get_reverse_dns_domains_ip6(&addr, 0, domains); nm_utils_get_reverse_dns_domains_ip_6(&addr, 0, domains);
g_assert_cmpuint(domains->len, ==, 0); g_assert_cmpuint(domains->len, ==, 0);
g_ptr_array_unref(domains); g_ptr_array_unref(domains);