From 8113069062e5eb9e255725d6833981552e699584 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Thu, 6 Aug 2020 14:20:48 +0200 Subject: [PATCH 1/3] shared: add nm_is_ascii() glib's is{alnum,alpha,ascii,...}() functions perform the check based on the current locale. Probably using isascii() would be fine anyway, but add a NM version that just checks that the upper bit is zero. --- shared/nm-glib-aux/nm-shared-utils.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/shared/nm-glib-aux/nm-shared-utils.h b/shared/nm-glib-aux/nm-shared-utils.h index 7efb8aed52..a097a690c8 100644 --- a/shared/nm-glib-aux/nm-shared-utils.h +++ b/shared/nm-glib-aux/nm-shared-utils.h @@ -8,6 +8,12 @@ #include +static inline gboolean +nm_is_ascii (char ch) +{ + return ((uint8_t) ch) < 128; +} + /*****************************************************************************/ pid_t nm_utils_gettid (void); From 5fbc967fb8c00dedb7d70d0b4c0b5d582e7577e3 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 28 Jul 2020 17:04:13 +0200 Subject: [PATCH 2/3] dhcp: nettools: use generic function to parse address lists --- src/dhcp/nm-dhcp-nettools.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/dhcp/nm-dhcp-nettools.c b/src/dhcp/nm-dhcp-nettools.c index 8d7d021710..7906759f30 100644 --- a/src/dhcp/nm-dhcp-nettools.c +++ b/src/dhcp/nm-dhcp-nettools.c @@ -468,9 +468,10 @@ lease_parse_address (NDhcp4ClientLease *lease, } static void -lease_parse_domain_name_servers (NDhcp4ClientLease *lease, - NMIP4Config *ip4_config, - GHashTable *options) +lease_parse_address_list (NDhcp4ClientLease *lease, + NMIP4Config *ip4_config, + NMDhcpOptionDhcp4Options option, + GHashTable *options) { nm_auto_free_gstring GString *str = NULL; char addr_str[NM_UTILS_INET_ADDRSTRLEN]; @@ -479,7 +480,7 @@ lease_parse_domain_name_servers (NDhcp4ClientLease *lease, size_t n_data; int r; - r = n_dhcp4_client_lease_query (lease, NM_DHCP_OPTION_DHCP4_DOMAIN_NAME_SERVER, &data, &n_data); + r = n_dhcp4_client_lease_query (lease, option, &data, &n_data); if (r) return; @@ -490,18 +491,24 @@ lease_parse_domain_name_servers (NDhcp4ClientLease *lease, _nm_utils_inet4_ntop (addr.s_addr, addr_str); g_string_append (nm_gstring_add_space_delimiter (str), addr_str); - if ( addr.s_addr == 0 - || nm_ip4_addr_is_localhost (addr.s_addr)) { - /* Skip localhost addresses, like also networkd does. - * See https://github.com/systemd/systemd/issues/4524. */ - continue; + switch (option) { + case NM_DHCP_OPTION_DHCP4_DOMAIN_NAME_SERVER: + if ( addr.s_addr == 0 + || nm_ip4_addr_is_localhost (addr.s_addr)) { + /* Skip localhost addresses, like also networkd does. + * See https://github.com/systemd/systemd/issues/4524. */ + continue; + } + nm_ip4_config_add_nameserver (ip4_config, addr.s_addr); + break; + default: + nm_assert_not_reached (); } - nm_ip4_config_add_nameserver (ip4_config, addr.s_addr); } nm_dhcp_option_add_option (options, _nm_dhcp_option_dhcp4_options, - NM_DHCP_OPTION_DHCP4_DOMAIN_NAME_SERVER, + option, str->str); } @@ -942,7 +949,7 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx, return NULL; lease_parse_routes (lease, ip4_config, options, route_table, route_metric); - lease_parse_domain_name_servers (lease, ip4_config, options); + lease_parse_address_list (lease, ip4_config, NM_DHCP_OPTION_DHCP4_DOMAIN_NAME_SERVER, options); lease_parse_domainname (lease, ip4_config, options); lease_parse_search_domains (lease, ip4_config, options); lease_parse_mtu (lease, ip4_config, options); From 01a1eaf02f66b6de74f531b55433500ec8b0f4b8 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 28 Jul 2020 17:30:45 +0200 Subject: [PATCH 3/3] dhcp: nettools: parse some missing option Add support for the following options to the nettool client: - Network Information Service Domain (40) - Network Information Servers (41) - NetBIOS over TCP/IP Name Server (44) https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/592 --- src/dhcp/nm-dhcp-nettools.c | 38 +++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/dhcp/nm-dhcp-nettools.c b/src/dhcp/nm-dhcp-nettools.c index 7906759f30..2ceed09537 100644 --- a/src/dhcp/nm-dhcp-nettools.c +++ b/src/dhcp/nm-dhcp-nettools.c @@ -501,6 +501,12 @@ lease_parse_address_list (NDhcp4ClientLease *lease, } nm_ip4_config_add_nameserver (ip4_config, addr.s_addr); break; + case NM_DHCP_OPTION_DHCP4_NIS_SERVERS: + nm_ip4_config_add_nis_server (ip4_config, addr.s_addr); + break; + case NM_DHCP_OPTION_DHCP4_NETBIOS_NAMESERVER: + nm_ip4_config_add_wins (ip4_config, addr.s_addr); + break; default: nm_assert_not_reached (); } @@ -897,6 +903,35 @@ lease_parse_wpad (NDhcp4ClientLease *lease, wpad); } +static void +lease_parse_nis_domain (NDhcp4ClientLease *lease, + NMIP4Config *ip4_config, + GHashTable *options) +{ + gs_free char *str_free = NULL; + const char *str; + uint8_t *data; + size_t n_data; + guint i; + int r; + + r = n_dhcp4_client_lease_query (lease, NM_DHCP_OPTION_DHCP4_NIS_DOMAIN, &data, &n_data); + if (r) + return; + + for (i = 0; i < n_data; i++) { + if (!nm_is_ascii ((char) data[i])) + return; + } + + str = nm_strndup_a (300, (const char *) data, n_data, &str_free); + nm_dhcp_option_add_option (options, + _nm_dhcp_option_dhcp4_options, + NM_DHCP_OPTION_DHCP4_NIS_DOMAIN, + str); + nm_ip4_config_set_nis_domain (ip4_config, str); +} + static void lease_parse_private_options (NDhcp4ClientLease *lease, GHashTable *options) @@ -959,6 +994,9 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx, lease_parse_ntps (lease, options); lease_parse_root_path (lease, options); lease_parse_wpad (lease, options); + lease_parse_nis_domain (lease, ip4_config, options); + lease_parse_address_list (lease, ip4_config, NM_DHCP_OPTION_DHCP4_NIS_SERVERS, options); + lease_parse_address_list (lease, ip4_config, NM_DHCP_OPTION_DHCP4_NETBIOS_NAMESERVER, options); lease_parse_private_options (lease, options); NM_SET_OUT (out_options, g_steal_pointer (&options));