summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-11-09 10:06:05 +0100
committerThomas Haller <thaller@redhat.com>2017-11-09 10:06:05 +0100
commita5b4850682d6eb34be65583d86ebb989f65a89cc (patch)
treef2d0b899a04fcdded5476ae1d6e62d4896dcc6eb
parentb227198e92689310e9c72cf4ab58dbcca2b4c0ae (diff)
parent54bcbb85d3d5ce97c13a8a83c8918b49f23e44ac (diff)
downloadNetworkManager-a5b4850682d6eb34be65583d86ebb989f65a89cc.tar.gz
core: merge branch 'th/dns-ip-config-unify'
-rw-r--r--libnm-core/nm-core-internal.h2
-rw-r--r--libnm-core/nm-utils.c16
-rw-r--r--src/devices/nm-device.c10
-rw-r--r--src/dns/nm-dns-manager.c293
-rw-r--r--src/nm-ip4-config.c8
-rw-r--r--src/nm-ip4-config.h84
6 files changed, 199 insertions, 214 deletions
diff --git a/libnm-core/nm-core-internal.h b/libnm-core/nm-core-internal.h
index 59ebfcb132..60963c9cd9 100644
--- a/libnm-core/nm-core-internal.h
+++ b/libnm-core/nm-core-internal.h
@@ -429,6 +429,8 @@ NMSettingBluetooth *_nm_connection_get_setting_bluetooth_for_nap (NMConnection *
/*****************************************************************************/
+const char *nm_utils_inet_ntop (int addr_family, gconstpointer addr, char *dst);
+
gboolean _nm_utils_inet6_is_token (const struct in6_addr *in6addr);
/*****************************************************************************/
diff --git a/libnm-core/nm-utils.c b/libnm-core/nm-utils.c
index bc9558347c..fadbcf342d 100644
--- a/libnm-core/nm-utils.c
+++ b/libnm-core/nm-utils.c
@@ -3762,6 +3762,22 @@ nm_utils_is_uuid (const char *str)
static char _nm_utils_inet_ntop_buffer[NM_UTILS_INET_ADDRSTRLEN];
+const char *
+nm_utils_inet_ntop (int addr_family, gconstpointer addr, char *dst)
+{
+ const char *s;
+
+ nm_assert_addr_family (addr_family);
+ nm_assert (addr);
+
+ s = inet_ntop (addr_family,
+ addr,
+ dst ? dst : _nm_utils_inet_ntop_buffer,
+ addr_family == AF_INET6 ? INET6_ADDRSTRLEN : INET_ADDRSTRLEN);
+ nm_assert (s);
+ return s;
+}
+
/**
* nm_utils_inet4_ntop: (skip)
* @inaddr: the address that should be converted to string.
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index e587567504..8cf1efab53 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -7001,7 +7001,7 @@ nm_device_copy_ip6_dns_config (NMDevice *self, NMDevice *from_device)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
NMIP6Config *from_config = NULL;
- int i;
+ guint i, len;
if (priv->ac_ip6_config) {
nm_ip6_config_reset_nameservers (priv->ac_ip6_config);
@@ -7014,14 +7014,16 @@ nm_device_copy_ip6_dns_config (NMDevice *self, NMDevice *from_device)
if (!from_config)
return;
- for (i = 0; i < nm_ip6_config_get_num_nameservers (from_config); i++) {
+ len = nm_ip6_config_get_num_nameservers (from_config);
+ for (i = 0; i < len; i++) {
nm_ip6_config_add_nameserver (priv->ac_ip6_config,
nm_ip6_config_get_nameserver (from_config, i));
}
- for (i = 0; i < nm_ip6_config_get_num_searches (from_config); i++) {
+ len = nm_ip6_config_get_num_searches (from_config);
+ for (i = 0; i < len; i++) {
nm_ip6_config_add_search (priv->ac_ip6_config,
- nm_ip6_config_get_search (from_config, i));
+ nm_ip6_config_get_search (from_config, i));
}
if (!ip6_config_merge_and_apply (self, TRUE))
diff --git a/src/dns/nm-dns-manager.c b/src/dns/nm-dns-manager.c
index e120e06ae1..5aa61e40b6 100644
--- a/src/dns/nm-dns-manager.c
+++ b/src/dns/nm-dns-manager.c
@@ -275,135 +275,83 @@ add_string_item (GPtrArray *array, const char *str)
}
static void
-add_dns_option_item (GPtrArray *array, const char *str, gboolean ipv6)
+add_dns_option_item (GPtrArray *array, const char *str)
{
if (_nm_utils_dns_option_find_idx (array, str) < 0)
g_ptr_array_add (array, g_strdup (str));
}
static void
-merge_one_ip4_config (NMResolvConfData *rc, NMIP4Config *src)
+merge_one_ip_config (NMResolvConfData *rc,
+ const NMIPConfig *config,
+ const char *iface)
{
- guint32 num, num_domains, num_searches, i;
+ int addr_family;
+ guint num, num_domains, num_searches, i;
+ char buf[NM_UTILS_INET_ADDRSTRLEN + 50];
+ const char *str;
- num = nm_ip4_config_get_num_nameservers (src);
- for (i = 0; i < num; i++) {
- add_string_item (rc->nameservers,
- nm_utils_inet4_ntop (nm_ip4_config_get_nameserver (src, i), NULL));
- }
-
- num_domains = nm_ip4_config_get_num_domains (src);
- num_searches = nm_ip4_config_get_num_searches (src);
-
- for (i = 0; i < num_searches; i++) {
- const char *search;
-
- search = nm_ip4_config_get_search (src, i);
- if (!domain_is_valid (search, FALSE))
- continue;
- add_string_item (rc->searches, search);
- }
-
- if (num_domains > 1 || !num_searches) {
- for (i = 0; i < num_domains; i++) {
- const char *domain;
-
- domain = nm_ip4_config_get_domain (src, i);
- if (!domain_is_valid (domain, FALSE))
- continue;
- add_string_item (rc->searches, domain);
- }
- }
-
- num = nm_ip4_config_get_num_dns_options (src);
- for (i = 0; i < num; i++) {
- const char *option;
-
- option = nm_ip4_config_get_dns_option (src, i);
- add_dns_option_item (rc->options, option, FALSE);
- }
-
- /* NIS stuff */
- num = nm_ip4_config_get_num_nis_servers (src);
- for (i = 0; i < num; i++) {
- add_string_item (rc->nis_servers,
- nm_utils_inet4_ntop (nm_ip4_config_get_nis_server (src, i), NULL));
- }
+ addr_family = nm_ip_config_get_addr_family (config);
- if (nm_ip4_config_get_nis_domain (src)) {
- /* FIXME: handle multiple domains */
- if (!rc->nis_domain)
- rc->nis_domain = nm_ip4_config_get_nis_domain (src);
- }
-}
-
-static void
-merge_one_ip6_config (NMResolvConfData *rc, NMIP6Config *src, const char *iface)
-{
- guint32 num, num_domains, num_searches, i;
+ nm_assert_addr_family (addr_family);
- num = nm_ip6_config_get_num_nameservers (src);
+ num = nm_ip_config_get_num_nameservers (config);
for (i = 0; i < num; i++) {
- const struct in6_addr *addr;
- char buf[NM_UTILS_INET_ADDRSTRLEN + 50];
-
- addr = nm_ip6_config_get_nameserver (src, i);
+ const NMIPAddr *addr;
- /* inet_ntop is probably supposed to do this for us, but it doesn't */
- if (IN6_IS_ADDR_V4MAPPED (addr))
- nm_utils_inet4_ntop (addr->s6_addr32[3], buf);
+ addr = nm_ip_config_get_nameserver (config, i);
+ if (addr_family == AF_INET)
+ nm_utils_inet_ntop (addr_family, addr, buf);
+ else if (IN6_IS_ADDR_V4MAPPED (addr))
+ nm_utils_inet4_ntop (addr->addr6.s6_addr32[3], buf);
else {
- nm_utils_inet6_ntop (addr, buf);
+ nm_utils_inet6_ntop (&addr->addr6, buf);
if (IN6_IS_ADDR_LINKLOCAL (addr)) {
g_strlcat (buf, "%", sizeof (buf));
g_strlcat (buf, iface, sizeof (buf));
}
}
+
add_string_item (rc->nameservers, buf);
}
- num_domains = nm_ip6_config_get_num_domains (src);
- num_searches = nm_ip6_config_get_num_searches (src);
-
+ num_domains = nm_ip_config_get_num_domains (config);
+ num_searches = nm_ip_config_get_num_searches (config);
for (i = 0; i < num_searches; i++) {
- const char *search;
-
- search = nm_ip6_config_get_search (src, i);
- if (!domain_is_valid (search, FALSE))
- continue;
- add_string_item (rc->searches, search);
+ str = nm_ip_config_get_search (config, i);
+ if (domain_is_valid (str, FALSE))
+ add_string_item (rc->searches, str);
}
-
if (num_domains > 1 || !num_searches) {
for (i = 0; i < num_domains; i++) {
- const char *domain;
-
- domain = nm_ip6_config_get_domain (src, i);
- if (!domain_is_valid (domain, FALSE))
- continue;
- add_string_item (rc->searches, domain);
+ str = nm_ip_config_get_domain (config, i);
+ if (domain_is_valid (str, FALSE))
+ add_string_item (rc->searches, str);
}
}
- num = nm_ip6_config_get_num_dns_options (src);
+ num = nm_ip_config_get_num_dns_options (config);
for (i = 0; i < num; i++) {
- const char *option;
-
- option = nm_ip6_config_get_dns_option (src, i);
- add_dns_option_item (rc->options, option, TRUE);
+ add_dns_option_item (rc->options,
+ nm_ip_config_get_dns_option (config, i));
}
-}
-static void
-merge_one_ip_config_data (NMResolvConfData *rc,
- NMDnsIPConfigData *data)
-{
- if (NM_IS_IP4_CONFIG (data->config))
- merge_one_ip4_config (rc, (NMIP4Config *) data->config);
- else if (NM_IS_IP6_CONFIG (data->config))
- merge_one_ip6_config (rc, (NMIP6Config *) data->config, data->iface);
- else
- g_return_if_reached ();
+ if (addr_family == AF_INET) {
+ const NMIP4Config *config4 = (const NMIP4Config *) config;
+
+ /* NIS stuff */
+ num = nm_ip4_config_get_num_nis_servers (config4);
+ for (i = 0; i < num; i++) {
+ add_string_item (rc->nis_servers,
+ nm_utils_inet4_ntop (nm_ip4_config_get_nis_server (config4, i), buf));
+ }
+
+ if (nm_ip4_config_get_nis_domain (config4)) {
+ /* FIXME: handle multiple domains */
+ if (!rc->nis_domain)
+ rc->nis_domain = nm_ip4_config_get_nis_domain (config4);
+ }
+ }
}
static GPid
@@ -927,39 +875,27 @@ merge_global_dns_config (NMResolvConfData *rc, NMGlobalDnsConfig *global_conf)
}
static const char *
-get_nameserver_list (void *config, GString **str)
+get_nameserver_list (const NMIPConfig *config, GString **str)
{
- NMIP4Config *ip4;
- NMIP6Config *ip6;
guint num, i;
-
- nm_assert (str);
+ char buf[NM_UTILS_INET_ADDRSTRLEN];
+ int addr_family;
if (*str)
g_string_truncate (*str, 0);
else
*str = g_string_sized_new (64);
- if (NM_IS_IP4_CONFIG (config)) {
- ip4 = (NMIP4Config *) config;
- num = nm_ip4_config_get_num_nameservers (ip4);
- for (i = 0; i < num; i++) {
- g_string_append (*str,
- nm_utils_inet4_ntop (nm_ip4_config_get_nameserver (ip4, i),
- NULL));
- g_string_append_c (*str, ' ');
- }
- } else if (NM_IS_IP6_CONFIG (config)) {
- ip6 = (NMIP6Config *) config;
- num = nm_ip6_config_get_num_nameservers (ip6);
- for (i = 0; i < num; i++) {
- g_string_append (*str,
- nm_utils_inet6_ntop (nm_ip6_config_get_nameserver (ip6, i),
- NULL));
+ addr_family = nm_ip_config_get_addr_family (config);
+ num = nm_ip_config_get_num_nameservers (config);
+ for (i = 0; i < num; i++) {
+ nm_utils_inet_ntop (addr_family,
+ nm_ip_config_get_nameserver (config, i),
+ buf);
+ if (i > 0)
g_string_append_c (*str, ' ');
- }
- } else
- g_return_val_if_reached (NULL);
+ g_string_append (*str, buf);
+ }
return (*str)->str;
}
@@ -998,34 +934,31 @@ _collect_resolv_conf_data (NMDnsManager *self, /* only for logging context, no o
nm_auto_free_gstring GString *tmp_gstring = NULL;
int prio, first_prio = 0;
NMDnsIPConfigData *current;
- gboolean v4;
for (i = 0, j = 0; i < configs->len; i++) {
gboolean skip = FALSE;
current = configs->pdata[i];
- prio = nm_ip_config_get_dns_priority (NM_IP_CONFIG_CAST (current->config));
+ prio = nm_ip_config_get_dns_priority (current->config);
if (i == 0)
first_prio = prio;
else if (first_prio < 0 && first_prio != prio)
skip = TRUE;
- v4 = NM_IS_IP4_CONFIG (current->config);
- if ( ( v4 && nm_ip4_config_get_num_nameservers ((NMIP4Config *) current->config))
- || (!v4 && nm_ip6_config_get_num_nameservers ((NMIP6Config *) current->config))) {
+ if (nm_ip_config_get_num_nameservers (current->config)) {
_LOGT ("config: %8d %-7s v%c %-16s %s: %s",
prio,
_config_type_to_string (current->type),
- v4 ? '4' : '6',
+ nm_utils_addr_family_to_char (nm_ip_config_get_addr_family (current->config)),
current->iface,
skip ? "<SKIP>" : "",
get_nameserver_list (current->config, &tmp_gstring));
}
if (!skip)
- merge_one_ip_config_data (&rc, current);
+ merge_one_ip_config (&rc, current->config, current->iface);
}
}
@@ -1307,7 +1240,7 @@ nm_dns_manager_add_ip_config (NMDnsManager *self,
g_return_val_if_fail (NM_IS_DNS_MANAGER (self), FALSE);
g_return_val_if_fail (config, FALSE);
g_return_val_if_fail (iface && iface[0], FALSE);
- nm_assert (NM_IP4_CONFIG (config) || NM_IS_IP6_CONFIG (config));
+ nm_assert (NM_IS_IP_CONFIG (config));
priv = NM_DNS_MANAGER_GET_PRIVATE (self);
@@ -1365,7 +1298,7 @@ nm_dns_manager_remove_ip_config (NMDnsManager *self, gpointer config)
g_return_val_if_fail (NM_IS_DNS_MANAGER (self), FALSE);
g_return_val_if_fail (config, FALSE);
- nm_assert (NM_IP4_CONFIG (config) || NM_IS_IP6_CONFIG (config));
+ nm_assert (NM_IS_IP_CONFIG (config));
priv = NM_DNS_MANAGER_GET_PRIVATE (self);
@@ -1885,92 +1818,46 @@ _get_config_variant (NMDnsManager *self)
for (i = 0; i < priv->configs->len; i++) {
NMDnsIPConfigData *current = priv->configs->pdata[i];
+ const NMIPConfig *config = current->config;
GVariantBuilder entry_builder;
GVariantBuilder strv_builder;
- gboolean v4 = NM_IS_IP4_CONFIG (current->config);
- gint priority;
-
- if (v4) {
- NMIP4Config *config = NM_IP4_CONFIG (current->config);
- guint num = nm_ip4_config_get_num_nameservers (config);
- guint32 ns;
+ guint num;
+ const int addr_family = nm_ip_config_get_addr_family (config);
+ char buf[NM_UTILS_INET_ADDRSTRLEN];
+ const NMIPAddr *addr;
- if (!num)
- continue;
-
- g_variant_builder_init (&entry_builder, G_VARIANT_TYPE ("a{sv}"));
-
- /* Add nameservers */
- g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as"));
- for (j = 0; j < num; j++) {
- ns = nm_ip4_config_get_nameserver (config, j);
- g_variant_builder_add (&strv_builder,
- "s",
- nm_utils_inet4_ntop (ns, NULL));
- }
- g_variant_builder_add (&entry_builder,
- "{sv}",
- "nameservers",
- g_variant_builder_end (&strv_builder));
-
- /* Add domains */
- num = nm_ip4_config_get_num_domains (config);
- if (num > 0) {
- g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as"));
- for (j = 0; j < num; j++) {
- g_variant_builder_add (&strv_builder,
- "s",
- nm_ip4_config_get_domain (config, j));
- }
- g_variant_builder_add (&entry_builder,
- "{sv}",
- "domains",
- g_variant_builder_end (&strv_builder));
- }
-
- priority = nm_ip4_config_get_dns_priority (config);
- } else {
- NMIP6Config *config = NM_IP6_CONFIG (current->config);
- guint num = nm_ip6_config_get_num_nameservers (config);
- const struct in6_addr *ns;
+ num = nm_ip_config_get_num_nameservers (config);
+ if (!num)
+ continue;
- if (!num)
- continue;
+ g_variant_builder_init (&entry_builder, G_VARIANT_TYPE ("a{sv}"));
- g_variant_builder_init (&entry_builder, G_VARIANT_TYPE ("a{sv}"));
+ g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as"));
+ for (j = 0; j < num; j++) {
+ addr = nm_ip_config_get_nameserver (config, j);
+ g_variant_builder_add (&strv_builder,
+ "s",
+ nm_utils_inet_ntop (addr_family, addr, buf));
+ }
+ g_variant_builder_add (&entry_builder,
+ "{sv}",
+ "nameservers",
+ g_variant_builder_end (&strv_builder));
- /* Add nameservers */
+ num = nm_ip_config_get_num_domains (config);
+ if (num > 0) {
g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as"));
for (j = 0; j < num; j++) {
- ns = nm_ip6_config_get_nameserver (config, j);
g_variant_builder_add (&strv_builder,
"s",
- nm_utils_inet6_ntop (ns, NULL));
+ nm_ip_config_get_domain (config, j));
}
g_variant_builder_add (&entry_builder,
"{sv}",
- "nameservers",
+ "domains",
g_variant_builder_end (&strv_builder));
-
- /* Add domains */
- num = nm_ip6_config_get_num_domains (config);
- if (num > 0) {
- g_variant_builder_init (&strv_builder, G_VARIANT_TYPE ("as"));
- for (j = 0; j < num; j++) {
- g_variant_builder_add (&strv_builder,
- "s",
- nm_ip6_config_get_domain (config, j));
- }
- g_variant_builder_add (&entry_builder,
- "{sv}",
- "domains",
- g_variant_builder_end (&strv_builder));
- }
-
- priority = nm_ip6_config_get_dns_priority (config);
}
- /* Add device */
if (current->iface) {
g_variant_builder_add (&entry_builder,
"{sv}",
@@ -1978,13 +1865,11 @@ _get_config_variant (NMDnsManager *self)
g_variant_new_string (current->iface));
}
- /* Add priority */
g_variant_builder_add (&entry_builder,
"{sv}",
"priority",
- g_variant_new_int32 (priority));
+ g_variant_new_int32 (nm_ip_config_get_dns_priority (config)));
- /* Add VPN */
g_variant_builder_add (&entry_builder,
"{sv}",
"vpn",
diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c
index e2f99e24d0..06137764f5 100644
--- a/src/nm-ip4-config.c
+++ b/src/nm-ip4-config.c
@@ -2216,6 +2216,14 @@ nm_ip4_config_get_nameserver (const NMIP4Config *self, guint i)
return g_array_index (priv->nameservers, guint32, i);
}
+const in_addr_t *
+_nm_ip4_config_get_nameserver (const NMIP4Config *self, guint i)
+{
+ const NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
+
+ return &g_array_index (priv->nameservers, guint32, i);
+}
+
/*****************************************************************************/
void
diff --git a/src/nm-ip4-config.h b/src/nm-ip4-config.h
index b559352dc4..e7fb2703eb 100644
--- a/src/nm-ip4-config.h
+++ b/src/nm-ip4-config.h
@@ -216,6 +216,7 @@ void nm_ip4_config_add_nameserver (NMIP4Config *self, guint32 nameserver);
void nm_ip4_config_del_nameserver (NMIP4Config *self, guint i);
guint nm_ip4_config_get_num_nameservers (const NMIP4Config *self);
guint32 nm_ip4_config_get_nameserver (const NMIP4Config *self, guint i);
+const in_addr_t *_nm_ip4_config_get_nameserver (const NMIP4Config *self, guint i);
void nm_ip4_config_reset_domains (NMIP4Config *self);
void nm_ip4_config_add_domain (NMIP4Config *self, const char *domain);
@@ -300,15 +301,86 @@ gboolean nm_ip4_config_equal (const NMIP4Config *a, const NMIP4Config *b);
#define NM_IP_CONFIG_CAST(config) ((NMIPConfig *) (config))
#endif
+static inline gboolean
+NM_IS_IP_CONFIG (gconstpointer config)
+{
+ return NM_IS_IP4_CONFIG (config) || NM_IS_IP6_CONFIG (config);
+}
+
static inline int
-nm_ip_config_get_dns_priority (const NMIPConfig *config)
+nm_ip_config_get_addr_family (const NMIPConfig *config)
{
if (NM_IS_IP4_CONFIG (config))
- return nm_ip4_config_get_dns_priority ((const NMIP4Config *) config);
- else if (NM_IS_IP6_CONFIG (config))
- return nm_ip6_config_get_dns_priority ((const NMIP6Config *) config);
- else
- g_return_val_if_reached (0);
+ 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, dflt, ...) \
+ G_STMT_START { \
+ gconstpointer _config = (config); \
+ \
+ if (NM_IS_IP4_CONFIG (_config)) { \
+ return v4_func ((NMIP4Config *) _config, ##__VA_ARGS__); \
+ } else { \
+ nm_assert (NM_IS_IP6_CONFIG (_config)); \
+ return v6_func ((NMIP6Config *) _config, ##__VA_ARGS__); \
+ } \
+ } G_STMT_END
+
+static inline int
+nm_ip_config_get_dns_priority (const NMIPConfig *self)
+{
+ _NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_dns_priority, nm_ip6_config_get_dns_priority, 0);
+}
+
+static inline guint
+nm_ip_config_get_num_nameservers (const NMIPConfig *self)
+{
+ _NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_num_nameservers, nm_ip6_config_get_num_nameservers, 0);
+}
+
+static inline gconstpointer
+nm_ip_config_get_nameserver (const NMIPConfig *self, guint i)
+{
+ _NM_IP_CONFIG_DISPATCH (self, _nm_ip4_config_get_nameserver, nm_ip6_config_get_nameserver, 0, i);
+}
+
+static inline guint
+nm_ip_config_get_num_domains (const NMIPConfig *self)
+{
+ _NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_num_domains, nm_ip6_config_get_num_domains, 0);
+}
+
+static inline const char *
+nm_ip_config_get_domain (const NMIPConfig *self, guint i)
+{
+ _NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_domain, nm_ip6_config_get_domain, NULL, i);
+}
+
+static inline guint
+nm_ip_config_get_num_searches (const NMIPConfig *self)
+{
+ _NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_num_searches, nm_ip6_config_get_num_searches, 0);
+}
+
+static inline const char *
+nm_ip_config_get_search (const NMIPConfig *self, guint i)
+{
+ _NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_search, nm_ip6_config_get_search, NULL, i);
+}
+
+static inline guint
+nm_ip_config_get_num_dns_options (const NMIPConfig *self)
+{
+ _NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_num_dns_options, nm_ip6_config_get_num_dns_options, 0);
+}
+
+static inline const char *
+nm_ip_config_get_dns_option (const NMIPConfig *self, guint i)
+{
+ _NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_dns_option, nm_ip6_config_get_dns_option, NULL, i);
}
#endif /* __NETWORKMANAGER_IP4_CONFIG_H__ */