diff options
author | Thomas Haller <thaller@redhat.com> | 2017-11-09 10:06:05 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-11-09 10:06:05 +0100 |
commit | a5b4850682d6eb34be65583d86ebb989f65a89cc (patch) | |
tree | f2d0b899a04fcdded5476ae1d6e62d4896dcc6eb | |
parent | b227198e92689310e9c72cf4ab58dbcca2b4c0ae (diff) | |
parent | 54bcbb85d3d5ce97c13a8a83c8918b49f23e44ac (diff) | |
download | NetworkManager-a5b4850682d6eb34be65583d86ebb989f65a89cc.tar.gz |
core: merge branch 'th/dns-ip-config-unify'
-rw-r--r-- | libnm-core/nm-core-internal.h | 2 | ||||
-rw-r--r-- | libnm-core/nm-utils.c | 16 | ||||
-rw-r--r-- | src/devices/nm-device.c | 10 | ||||
-rw-r--r-- | src/dns/nm-dns-manager.c | 293 | ||||
-rw-r--r-- | src/nm-ip4-config.c | 8 | ||||
-rw-r--r-- | src/nm-ip4-config.h | 84 |
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__ */ |