diff options
author | Francesco Giudici <fgiudici@redhat.com> | 2019-06-06 12:27:06 +0200 |
---|---|---|
committer | Francesco Giudici <fgiudici@redhat.com> | 2019-07-05 15:13:09 +0200 |
commit | eed205bff317469df846d6d5c3f9714f40ccd244 (patch) | |
tree | 33dd68a7c195eacb5059f2e3f09a6727188d290f | |
parent | f42754c8d7e1fb62a268edc412da835e754e30c3 (diff) | |
download | NetworkManager-eed205bff317469df846d6d5c3f9714f40ccd244.tar.gz |
dhcp/internal: move dhcp options management to shared dhcp codebase
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | src/dhcp/nm-dhcp-options.c | 276 | ||||
-rw-r--r-- | src/dhcp/nm-dhcp-options.h | 202 | ||||
-rw-r--r-- | src/dhcp/nm-dhcp-systemd.c | 406 | ||||
-rw-r--r-- | src/meson.build | 1 |
5 files changed, 597 insertions, 290 deletions
diff --git a/Makefile.am b/Makefile.am index 4c6b22546e..85bdaefa27 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1966,6 +1966,8 @@ src_libNetworkManagerBase_la_SOURCES = \ src/dhcp/nm-dhcp-nettools.c \ src/dhcp/nm-dhcp-utils.c \ src/dhcp/nm-dhcp-utils.h \ + src/dhcp/nm-dhcp-options.c \ + src/dhcp/nm-dhcp-options.h \ src/dhcp/nm-dhcp-systemd.c \ src/dhcp/nm-dhcp-manager.c \ src/dhcp/nm-dhcp-manager.h \ diff --git a/src/dhcp/nm-dhcp-options.c b/src/dhcp/nm-dhcp-options.c new file mode 100644 index 0000000000..503f6711d8 --- /dev/null +++ b/src/dhcp/nm-dhcp-options.c @@ -0,0 +1,276 @@ +/* + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + * (C) Copyright 2019 Red Hat, Inc. + */ + +#include "nm-default.h" + +#include "nm-dhcp-options.h" + + +#define REQPREFIX "requested_" + +#define REQ(_num, _name, _include) \ + { \ + .name = REQPREFIX""_name, \ + .option_num = _num, \ + .include = _include, \ + } + +const NMDhcpOption _nm_dhcp_option_dhcp4_options[] = { + REQ (NM_DHCP_OPTION_DHCP4_SUBNET_MASK, "subnet_mask", TRUE ), + REQ (NM_DHCP_OPTION_DHCP4_TIME_OFFSET, "time_offset", TRUE ), + REQ (NM_DHCP_OPTION_DHCP4_DOMAIN_NAME_SERVER, "domain_name_servers", TRUE ), + REQ (NM_DHCP_OPTION_DHCP4_HOST_NAME, "host_name", TRUE ), + REQ (NM_DHCP_OPTION_DHCP4_DOMAIN_NAME, "domain_name", TRUE ), + REQ (NM_DHCP_OPTION_DHCP4_INTERFACE_MTU, "interface_mtu", TRUE ), + REQ (NM_DHCP_OPTION_DHCP4_BROADCAST, "broadcast_address", TRUE ), + /* RFC 3442: The Classless Static Routes option code MUST appear in the parameter + * request list prior to both the Router option code and the Static + * Routes option code, if present. */ + REQ (NM_DHCP_OPTION_DHCP4_CLASSLESS_STATIC_ROUTE, "rfc3442_classless_static_routes", TRUE ), + REQ (NM_DHCP_OPTION_DHCP4_ROUTER, "routers", TRUE ), + REQ (NM_DHCP_OPTION_DHCP4_STATIC_ROUTE, "static_routes", TRUE ), + REQ (NM_DHCP_OPTION_DHCP4_NIS_DOMAIN, "nis_domain", TRUE ), + REQ (NM_DHCP_OPTION_DHCP4_NIS_SERVERS, "nis_servers", TRUE ), + REQ (NM_DHCP_OPTION_DHCP4_NTP_SERVER, "ntp_servers", TRUE ), + REQ (NM_DHCP_OPTION_DHCP4_SERVER_ID, "dhcp_server_identifier", TRUE ), + REQ (NM_DHCP_OPTION_DHCP4_DOMAIN_SEARCH_LIST, "domain_search", TRUE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_CLASSLESS_STATIC_ROUTE, "ms_classless_static_routes", TRUE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_PROXY_AUTODISCOVERY, "wpad", TRUE ), + REQ (NM_DHCP_OPTION_DHCP4_ROOT_PATH, "root_path", TRUE ), + + REQ (NM_DHCP_OPTION_DHCP4_TIME_SERVERS, "time_servers", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_IEN116_NAME_SERVERS, "ien116_name_servers", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_LOG_SERVERS, "log_servers", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_COOKIE_SERVERS, "cookie_servers", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_LPR_SERVERS, "lpr_servers", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_IMPRESS_SERVERS, "impress_servers", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_RESOURCE_LOCATION_SERVERS, "resource_location_servers", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_BOOT_FILE_SIZE, "boot_size", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_MERIT_DUMP, "merit_dump", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_SWAP_SERVER, "swap_server", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_EXTENSIONS_PATH, "extensions_path", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_ENABLE_IP_FORWARDING, "ip_forwarding", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_ENABLE_SRC_ROUTING, "non_local_source_routing", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_POLICY_FILTER, "policy_filter", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_INTERFACE_MDR, "max_dgram_reassembly", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_INTERFACE_TTL, "default_ip_ttl", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_INTERFACE_MTU_AGING_TIMEOUT, "path_mtu_aging_timeout", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PATH_MTU_PLATEAU_TABLE, "path_mtu_plateau_table", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_ALL_SUBNETS_LOCAL, "all_subnets_local", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PERFORM_MASK_DISCOVERY, "perform_mask_discovery", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_MASK_SUPPLIER, "mask_supplier", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_ROUTER_DISCOVERY, "router_discovery", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_ROUTER_SOLICITATION_ADDR, "router_solicitation_address", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_TRAILER_ENCAPSULATION, "trailer_encapsulation", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_ARP_CACHE_TIMEOUT, "arp_cache_timeout", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_IEEE802_3_ENCAPSULATION, "ieee802_3_encapsulation", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_DEFAULT_TCP_TTL, "default_tcp_ttl", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_TCP_KEEPALIVE_INTERVAL, "tcp_keepalive_internal", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_TCP_KEEPALIVE_GARBAGE, "tcp_keepalive_garbage", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_VENDOR_SPECIFIC, "vendor_encapsulated_options", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_NETBIOS_NAMESERVER, "netbios_name_servers", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_NETBIOS_DD_SERVER, "netbios_dd_server", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_FONT_SERVERS, "font_servers", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_X_DISPLAY_MANAGER, "x_display_manager", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_IP_ADDRESS_LEASE_TIME, "dhcp_lease_time", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_RENEWAL_T1_TIME, "dhcp_renewal_time", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_REBINDING_T2_TIME, "dhcp_rebinding_time", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_NEW_TZDB_TIMEZONE, "tcode", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_NWIP_DOMAIN, "nwip_domain", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_NWIP_SUBOPTIONS, "nwip_suboptions", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_NISPLUS_DOMAIN, "nisplus_domain", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_NISPLUS_SERVERS, "nisplus_servers", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_TFTP_SERVER_NAME, "tftp_server_name", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_BOOTFILE_NAME, "bootfile_name", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_MOBILE_IP_HOME_AGENT, "mobile_ip_home_agent", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_SMTP_SERVER, "smtp_server", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_POP_SERVER, "pop_server", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_NNTP_SERVER, "nntp_server", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_WWW_SERVER, "www_server", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_FINGER_SERVER, "finger_server", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_IRC_SERVER, "irc_server", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_STREETTALK_SERVER, "streettalk_server", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_STREETTALK_DIR_ASSIST_SERVER, "streettalk_directory_assistance_server", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_SLP_DIRECTORY_AGENT, "slp_directory_agent", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_SLP_SERVICE_SCOPE, "slp_service_scope", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_RELAY_AGENT_INFORMATION, "relay_agent_information", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_NDS_SERVERS, "nds_servers", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_NDS_TREE_NAME, "nds_tree_name", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_NDS_CONTEXT, "nds_context", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_BCMS_CONTROLLER_NAMES, "bcms_controller_names", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_BCMS_CONTROLLER_ADDRESS, "bcms_controller_address", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_CLIENT_LAST_TRANSACTION, "client_last_transaction_time", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_ASSOCIATED_IP, "associated_ip", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PXE_SYSTEM_TYPE, "pxe_system_type", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PXE_INTERFACE_ID, "pxe_interface_id", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PXE_CLIENT_ID, "pxe_client_id", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_UAP_SERVERS, "uap_servers", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_GEOCONF_CIVIC, "geoconf_civic", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_NETINFO_SERVER_ADDRESS, "netinfo_server_address", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_NETINFO_SERVER_TAG, "netinfo_server_tag", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_DEFAULT_URL, "default_url", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_AUTO_CONFIG, "auto_config", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_NAME_SERVICE_SEARCH, "name_service_search", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_SUBNET_SELECTION, "subnet_selection", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_VIVCO, "vivco", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_VIVSO, "vivso", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PANA_AGENT, "pana_agent", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_V4_LOST, "v4_lost", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_SIP_UA_CS_DOMAINS, "sip_ua_cs_domains", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_IPV4_ADDRESS_ANDSF, "ipv4_address_andsf", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_RDNSS_SELECTION, "rndss_selection", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_TFTP_SERVER_ADDRESS, "tftp_server_address", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_V4_PORTPARAMS, "v4_portparams", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_V4_CAPTIVE_PORTAL, "v4_captive_portal", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_LOADER_CONFIGFILE, "loader_configfile", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_LOADER_PATHPREFIX, "loader_pathprefix", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_LOADER_REBOOTTIME, "loader_reboottime", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_OPTION_6RD, "option_6rd", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_V4_ACCESS_DOMAIN, "v4_access_domain", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_224, "private_224", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_225, "private_225", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_226, "private_226", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_227, "private_227", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_228, "private_228", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_229, "private_229", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_230, "private_230", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_231, "private_231", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_232, "private_232", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_233, "private_233", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_234, "private_234", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_235, "private_235", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_236, "private_236", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_237, "private_237", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_238, "private_238", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_239, "private_239", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_240, "private_240", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_241, "private_241", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_242, "private_242", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_243, "private_243", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_244, "private_244", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_245, "private_245", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_246, "private_246", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_247, "private_247", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_248, "private_248", FALSE ), + /* DHCP_OPTION_PRIVATE_CLASSLESS_STATIC_ROUTE */ + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_250, "private_250", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_251, "private_251", FALSE ), + /* DHCP_OPTION_PRIVATE_PROXY_AUTODISCOVERY */ + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_253, "private_253", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_PRIVATE_254, "private_254", FALSE ), + + /* Internal values */ + REQ (NM_DHCP_OPTION_DHCP4_NM_IP_ADDRESS, "ip_address", FALSE ), + REQ (NM_DHCP_OPTION_DHCP4_NM_EXPIRY, "expiry", FALSE ), + + { 0 } +}; + +const NMDhcpOption _nm_dhcp_option_dhcp6_options[] = { + REQ (NM_DHCP_OPTION_DHCP6_CLIENTID, "dhcp6_client_id", FALSE ), + + /* Don't request server ID by default; some servers don't reply to + * Information Requests that request the Server ID. + */ + REQ (NM_DHCP_OPTION_DHCP6_SERVERID, "dhcp6_server_id", FALSE ), + + REQ (NM_DHCP_OPTION_DHCP6_DNS_SERVERS, "dhcp6_name_servers", TRUE ), + REQ (NM_DHCP_OPTION_DHCP6_DOMAIN_LIST, "dhcp6_domain_search", TRUE ), + REQ (NM_DHCP_OPTION_DHCP6_SNTP_SERVERS, "dhcp6_sntp_servers", TRUE ), + + /* Internal values */ + REQ (NM_DHCP_OPTION_DHCP6_NM_IP_ADDRESS, "ip6_address", FALSE ), + REQ (NM_DHCP_OPTION_DHCP6_NM_PREFIXLEN, "ip6_prefixlen", FALSE ), + REQ (NM_DHCP_OPTION_DHCP6_NM_PREFERRED_LIFE, "preferred_life", FALSE ), + REQ (NM_DHCP_OPTION_DHCP6_NM_MAX_LIFE, "max_life", FALSE ), + REQ (NM_DHCP_OPTION_DHCP6_NM_STARTS, "starts", FALSE ), + REQ (NM_DHCP_OPTION_DHCP6_NM_LIFE_STARTS, "life_starts", FALSE ), + REQ (NM_DHCP_OPTION_DHCP6_NM_RENEW, "renew", FALSE ), + REQ (NM_DHCP_OPTION_DHCP6_NM_REBIND, "rebind", FALSE ), + REQ (NM_DHCP_OPTION_DHCP6_NM_IAID, "iaid", FALSE ), + + { 0 } +}; + + +const char * +nm_dhcp_option_request_string (const NMDhcpOption *requests, guint option) +{ + guint i = 0; + + while (requests[i].name) { + if (requests[i].option_num == option) + return requests[i].name + NM_STRLEN (REQPREFIX); + i++; + } + + /* Option should always be found */ + nm_assert_not_reached (); + return NULL; +} + +void +nm_dhcp_option_take_option (GHashTable *options, + const NMDhcpOption *requests, + guint option, + char *value) +{ + nm_assert (options); + nm_assert (requests); + nm_assert (value); + + g_hash_table_insert (options, + (gpointer) nm_dhcp_option_request_string (requests, option), + value); +} + +void +nm_dhcp_option_add_option (GHashTable *options, const NMDhcpOption *requests, guint option, const char *value) +{ + if (options) + nm_dhcp_option_take_option (options, requests, option, g_strdup (value)); +} + +void +nm_dhcp_option_add_option_u64 (GHashTable *options, const NMDhcpOption *requests, guint option, guint64 value) +{ + if (options) + nm_dhcp_option_take_option (options, requests, option, g_strdup_printf ("%" G_GUINT64_FORMAT, value)); +} + +void +nm_dhcp_option_add_requests_to_options (GHashTable *options, const NMDhcpOption *requests) +{ + guint i; + + if (!options) + return; + + for (i = 0; requests[i].name; i++) { + if (requests[i].include) + g_hash_table_insert (options, (gpointer) requests[i].name, g_strdup ("1")); + } +} + +GHashTable * +nm_dhcp_option_create_options_dict (void) +{ + return g_hash_table_new_full (nm_str_hash, g_str_equal, NULL, g_free); +} + diff --git a/src/dhcp/nm-dhcp-options.h b/src/dhcp/nm-dhcp-options.h new file mode 100644 index 0000000000..4e6c431abf --- /dev/null +++ b/src/dhcp/nm-dhcp-options.h @@ -0,0 +1,202 @@ +/* + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + * (C) Copyright 2019 Red Hat, Inc. + */ + +#ifndef __NM_DHCP_OPTIONS_H__ +#define __NM_DHCP_OPTIONS_H__ + +typedef enum { + NM_DHCP_OPTION_DHCP4_PAD = 0, + NM_DHCP_OPTION_DHCP4_SUBNET_MASK = 1, + NM_DHCP_OPTION_DHCP4_TIME_OFFSET = 2, + NM_DHCP_OPTION_DHCP4_ROUTER = 3, + NM_DHCP_OPTION_DHCP4_TIME_SERVERS = 4, + NM_DHCP_OPTION_DHCP4_IEN116_NAME_SERVERS = 5, + NM_DHCP_OPTION_DHCP4_DOMAIN_NAME_SERVER = 6, + NM_DHCP_OPTION_DHCP4_LOG_SERVERS = 7, + NM_DHCP_OPTION_DHCP4_COOKIE_SERVERS = 8, + NM_DHCP_OPTION_DHCP4_LPR_SERVERS = 9, + NM_DHCP_OPTION_DHCP4_IMPRESS_SERVERS = 10, + NM_DHCP_OPTION_DHCP4_RESOURCE_LOCATION_SERVERS = 11, + NM_DHCP_OPTION_DHCP4_HOST_NAME = 12, + NM_DHCP_OPTION_DHCP4_BOOT_FILE_SIZE = 13, + NM_DHCP_OPTION_DHCP4_MERIT_DUMP = 14, + NM_DHCP_OPTION_DHCP4_DOMAIN_NAME = 15, + NM_DHCP_OPTION_DHCP4_SWAP_SERVER = 16, + NM_DHCP_OPTION_DHCP4_ROOT_PATH = 17, + NM_DHCP_OPTION_DHCP4_EXTENSIONS_PATH = 18, + NM_DHCP_OPTION_DHCP4_ENABLE_IP_FORWARDING = 19, + NM_DHCP_OPTION_DHCP4_ENABLE_SRC_ROUTING = 20, + NM_DHCP_OPTION_DHCP4_POLICY_FILTER = 21, + NM_DHCP_OPTION_DHCP4_INTERFACE_MDR = 22, + NM_DHCP_OPTION_DHCP4_INTERFACE_TTL = 23, + NM_DHCP_OPTION_DHCP4_INTERFACE_MTU_AGING_TIMEOUT = 24, + NM_DHCP_OPTION_DHCP4_PATH_MTU_PLATEAU_TABLE = 25, + NM_DHCP_OPTION_DHCP4_INTERFACE_MTU = 26, + NM_DHCP_OPTION_DHCP4_ALL_SUBNETS_LOCAL = 27, + NM_DHCP_OPTION_DHCP4_BROADCAST = 28, + NM_DHCP_OPTION_DHCP4_PERFORM_MASK_DISCOVERY = 29, + NM_DHCP_OPTION_DHCP4_MASK_SUPPLIER = 30, + NM_DHCP_OPTION_DHCP4_ROUTER_DISCOVERY = 31, + NM_DHCP_OPTION_DHCP4_ROUTER_SOLICITATION_ADDR = 32, + NM_DHCP_OPTION_DHCP4_STATIC_ROUTE = 33, + NM_DHCP_OPTION_DHCP4_TRAILER_ENCAPSULATION = 34, + NM_DHCP_OPTION_DHCP4_ARP_CACHE_TIMEOUT = 35, + NM_DHCP_OPTION_DHCP4_IEEE802_3_ENCAPSULATION = 36, + NM_DHCP_OPTION_DHCP4_DEFAULT_TCP_TTL = 37, + NM_DHCP_OPTION_DHCP4_TCP_KEEPALIVE_INTERVAL = 38, + NM_DHCP_OPTION_DHCP4_TCP_KEEPALIVE_GARBAGE = 39, + NM_DHCP_OPTION_DHCP4_NIS_DOMAIN = 40, + NM_DHCP_OPTION_DHCP4_NIS_SERVERS = 41, + NM_DHCP_OPTION_DHCP4_NTP_SERVER = 42, + NM_DHCP_OPTION_DHCP4_VENDOR_SPECIFIC = 43, + NM_DHCP_OPTION_DHCP4_NETBIOS_NAMESERVER = 44, + NM_DHCP_OPTION_DHCP4_NETBIOS_DD_SERVER = 45, + NM_DHCP_OPTION_DHCP4_FONT_SERVERS = 48, + NM_DHCP_OPTION_DHCP4_X_DISPLAY_MANAGER = 49, + NM_DHCP_OPTION_DHCP4_IP_ADDRESS_LEASE_TIME = 51, + NM_DHCP_OPTION_DHCP4_SERVER_ID = 54, + NM_DHCP_OPTION_DHCP4_RENEWAL_T1_TIME = 58, + NM_DHCP_OPTION_DHCP4_REBINDING_T2_TIME = 59, + NM_DHCP_OPTION_DHCP4_NWIP_DOMAIN = 62, + NM_DHCP_OPTION_DHCP4_NWIP_SUBOPTIONS = 63, + NM_DHCP_OPTION_DHCP4_NISPLUS_DOMAIN = 64, + NM_DHCP_OPTION_DHCP4_NISPLUS_SERVERS = 65, + NM_DHCP_OPTION_DHCP4_TFTP_SERVER_NAME = 66, + NM_DHCP_OPTION_DHCP4_BOOTFILE_NAME = 67, + NM_DHCP_OPTION_DHCP4_MOBILE_IP_HOME_AGENT = 68, + NM_DHCP_OPTION_DHCP4_SMTP_SERVER = 69, + NM_DHCP_OPTION_DHCP4_POP_SERVER = 70, + NM_DHCP_OPTION_DHCP4_NNTP_SERVER = 71, + NM_DHCP_OPTION_DHCP4_WWW_SERVER = 72, + NM_DHCP_OPTION_DHCP4_FINGER_SERVER = 73, + NM_DHCP_OPTION_DHCP4_IRC_SERVER = 74, + NM_DHCP_OPTION_DHCP4_STREETTALK_SERVER = 75, + NM_DHCP_OPTION_DHCP4_STREETTALK_DIR_ASSIST_SERVER = 76, + NM_DHCP_OPTION_DHCP4_SLP_DIRECTORY_AGENT = 78, + NM_DHCP_OPTION_DHCP4_SLP_SERVICE_SCOPE = 79, + NM_DHCP_OPTION_DHCP4_RELAY_AGENT_INFORMATION = 82, + NM_DHCP_OPTION_DHCP4_NDS_SERVERS = 85, + NM_DHCP_OPTION_DHCP4_NDS_TREE_NAME = 86, + NM_DHCP_OPTION_DHCP4_NDS_CONTEXT = 87, + NM_DHCP_OPTION_DHCP4_BCMS_CONTROLLER_NAMES = 88, + NM_DHCP_OPTION_DHCP4_BCMS_CONTROLLER_ADDRESS = 89, + NM_DHCP_OPTION_DHCP4_CLIENT_LAST_TRANSACTION = 91, + NM_DHCP_OPTION_DHCP4_ASSOCIATED_IP = 92, + NM_DHCP_OPTION_DHCP4_PXE_SYSTEM_TYPE = 93, + NM_DHCP_OPTION_DHCP4_PXE_INTERFACE_ID = 94, + NM_DHCP_OPTION_DHCP4_PXE_CLIENT_ID = 97, + NM_DHCP_OPTION_DHCP4_UAP_SERVERS = 98, + NM_DHCP_OPTION_DHCP4_GEOCONF_CIVIC = 99, + NM_DHCP_OPTION_DHCP4_NEW_TZDB_TIMEZONE = 101, + NM_DHCP_OPTION_DHCP4_NETINFO_SERVER_ADDRESS = 112, + NM_DHCP_OPTION_DHCP4_NETINFO_SERVER_TAG = 113, + NM_DHCP_OPTION_DHCP4_DEFAULT_URL = 114, + NM_DHCP_OPTION_DHCP4_AUTO_CONFIG = 116, + NM_DHCP_OPTION_DHCP4_NAME_SERVICE_SEARCH = 117, + NM_DHCP_OPTION_DHCP4_SUBNET_SELECTION = 118, + NM_DHCP_OPTION_DHCP4_DOMAIN_SEARCH_LIST = 119, + NM_DHCP_OPTION_DHCP4_CLASSLESS_STATIC_ROUTE = 121, + NM_DHCP_OPTION_DHCP4_VIVCO = 124, + NM_DHCP_OPTION_DHCP4_VIVSO = 125, + NM_DHCP_OPTION_DHCP4_PANA_AGENT = 136, + NM_DHCP_OPTION_DHCP4_V4_LOST = 137, + NM_DHCP_OPTION_DHCP4_SIP_UA_CS_DOMAINS = 141, + NM_DHCP_OPTION_DHCP4_IPV4_ADDRESS_ANDSF = 142, + NM_DHCP_OPTION_DHCP4_RDNSS_SELECTION = 146, + NM_DHCP_OPTION_DHCP4_TFTP_SERVER_ADDRESS = 150, + NM_DHCP_OPTION_DHCP4_V4_PORTPARAMS = 159, + NM_DHCP_OPTION_DHCP4_V4_CAPTIVE_PORTAL = 160, + NM_DHCP_OPTION_DHCP4_LOADER_CONFIGFILE = 209, + NM_DHCP_OPTION_DHCP4_LOADER_PATHPREFIX = 210, + NM_DHCP_OPTION_DHCP4_LOADER_REBOOTTIME = 211, + NM_DHCP_OPTION_DHCP4_OPTION_6RD = 212, + NM_DHCP_OPTION_DHCP4_V4_ACCESS_DOMAIN = 213, + NM_DHCP_OPTION_DHCP4_PRIVATE_224 = 224, + NM_DHCP_OPTION_DHCP4_PRIVATE_225 = 225, + NM_DHCP_OPTION_DHCP4_PRIVATE_226 = 226, + NM_DHCP_OPTION_DHCP4_PRIVATE_227 = 227, + NM_DHCP_OPTION_DHCP4_PRIVATE_228 = 228, + NM_DHCP_OPTION_DHCP4_PRIVATE_229 = 229, + NM_DHCP_OPTION_DHCP4_PRIVATE_230 = 230, + NM_DHCP_OPTION_DHCP4_PRIVATE_231 = 231, + NM_DHCP_OPTION_DHCP4_PRIVATE_232 = 232, + NM_DHCP_OPTION_DHCP4_PRIVATE_233 = 233, + NM_DHCP_OPTION_DHCP4_PRIVATE_234 = 234, + NM_DHCP_OPTION_DHCP4_PRIVATE_235 = 235, + NM_DHCP_OPTION_DHCP4_PRIVATE_236 = 236, + NM_DHCP_OPTION_DHCP4_PRIVATE_237 = 237, + NM_DHCP_OPTION_DHCP4_PRIVATE_238 = 238, + NM_DHCP_OPTION_DHCP4_PRIVATE_239 = 239, + NM_DHCP_OPTION_DHCP4_PRIVATE_240 = 240, + NM_DHCP_OPTION_DHCP4_PRIVATE_241 = 241, + NM_DHCP_OPTION_DHCP4_PRIVATE_242 = 242, + NM_DHCP_OPTION_DHCP4_PRIVATE_243 = 243, + NM_DHCP_OPTION_DHCP4_PRIVATE_244 = 244, + NM_DHCP_OPTION_DHCP4_PRIVATE_245 = 245, + NM_DHCP_OPTION_DHCP4_PRIVATE_246 = 246, + NM_DHCP_OPTION_DHCP4_PRIVATE_247 = 247, + NM_DHCP_OPTION_DHCP4_PRIVATE_248 = 248, + NM_DHCP_OPTION_DHCP4_PRIVATE_CLASSLESS_STATIC_ROUTE = 249, + NM_DHCP_OPTION_DHCP4_PRIVATE_250 = 250, + NM_DHCP_OPTION_DHCP4_PRIVATE_251 = 251, + NM_DHCP_OPTION_DHCP4_PRIVATE_PROXY_AUTODISCOVERY = 252, + NM_DHCP_OPTION_DHCP4_PRIVATE_253 = 253, + NM_DHCP_OPTION_DHCP4_PRIVATE_254 = 254, + NM_DHCP_OPTION_DHCP4_END = 255, + /* Internal values */ + NM_DHCP_OPTION_DHCP4_NM_IP_ADDRESS = 1024, + NM_DHCP_OPTION_DHCP4_NM_EXPIRY = 1025, +} NMDhcpOptionDhcp4Options; + +typedef enum { + NM_DHCP_OPTION_DHCP6_CLIENTID = 1, + NM_DHCP_OPTION_DHCP6_SERVERID = 2, + NM_DHCP_OPTION_DHCP6_DNS_SERVERS = 23, + NM_DHCP_OPTION_DHCP6_DOMAIN_LIST = 24, + NM_DHCP_OPTION_DHCP6_SNTP_SERVERS = 31, + /* Internal values */ + NM_DHCP_OPTION_DHCP6_NM_IP_ADDRESS = 1026, + NM_DHCP_OPTION_DHCP6_NM_PREFIXLEN = 1027, + NM_DHCP_OPTION_DHCP6_NM_PREFERRED_LIFE = 1028, + NM_DHCP_OPTION_DHCP6_NM_MAX_LIFE = 1029, + NM_DHCP_OPTION_DHCP6_NM_STARTS = 1030, + NM_DHCP_OPTION_DHCP6_NM_LIFE_STARTS = 1031, + NM_DHCP_OPTION_DHCP6_NM_RENEW = 1032, + NM_DHCP_OPTION_DHCP6_NM_REBIND = 1033, + NM_DHCP_OPTION_DHCP6_NM_IAID = 1034, + +} NMDhcpOptionDhcp6Options; + +typedef struct { + const char *name; + uint16_t option_num; + bool include; +} NMDhcpOption; + +extern const NMDhcpOption _nm_dhcp_option_dhcp4_options[]; +extern const NMDhcpOption _nm_dhcp_option_dhcp6_options[]; + +const char *nm_dhcp_option_request_string (const NMDhcpOption *requests, guint option); +void nm_dhcp_option_take_option (GHashTable *options, const NMDhcpOption *requests, guint option, char *value); +void nm_dhcp_option_add_option (GHashTable *options, const NMDhcpOption *requests, guint option, const char *value); +void nm_dhcp_option_add_option_u64 (GHashTable *options, const NMDhcpOption *requests, guint option, guint64 value); +void nm_dhcp_option_add_requests_to_options (GHashTable *options, const NMDhcpOption *requests); +GHashTable *nm_dhcp_option_create_options_dict (void); + +#endif /* __NM_DHCP_OPTIONS_H__ */ diff --git a/src/dhcp/nm-dhcp-systemd.c b/src/dhcp/nm-dhcp-systemd.c index 336b47aa97..0e2b310373 100644 --- a/src/dhcp/nm-dhcp-systemd.c +++ b/src/dhcp/nm-dhcp-systemd.c @@ -32,6 +32,7 @@ #include "nm-utils.h" #include "nm-config.h" #include "nm-dhcp-utils.h" +#include "nm-dhcp-options.h" #include "nm-core-utils.h" #include "NetworkManagerUtils.h" #include "platform/nm-platform.h" @@ -80,226 +81,6 @@ G_DEFINE_TYPE (NMDhcpSystemd, nm_dhcp_systemd, NM_TYPE_DHCP_CLIENT) /*****************************************************************************/ -#define DHCP_OPTION_NIS_DOMAIN 40 -#define DHCP_OPTION_NIS_SERVERS 41 -#define DHCP_OPTION_PRIVATE_224 SD_DHCP_OPTION_PRIVATE_BASE -#define DHCP_OPTION_PRIVATE_225 225 -#define DHCP_OPTION_PRIVATE_226 226 -#define DHCP_OPTION_PRIVATE_227 227 -#define DHCP_OPTION_PRIVATE_228 228 -#define DHCP_OPTION_PRIVATE_229 229 -#define DHCP_OPTION_PRIVATE_230 230 -#define DHCP_OPTION_PRIVATE_231 231 -#define DHCP_OPTION_PRIVATE_232 232 -#define DHCP_OPTION_PRIVATE_233 233 -#define DHCP_OPTION_PRIVATE_234 234 -#define DHCP_OPTION_PRIVATE_235 235 -#define DHCP_OPTION_PRIVATE_236 236 -#define DHCP_OPTION_PRIVATE_237 237 -#define DHCP_OPTION_PRIVATE_238 238 -#define DHCP_OPTION_PRIVATE_239 239 -#define DHCP_OPTION_PRIVATE_240 240 -#define DHCP_OPTION_PRIVATE_241 241 -#define DHCP_OPTION_PRIVATE_242 242 -#define DHCP_OPTION_PRIVATE_243 243 -#define DHCP_OPTION_PRIVATE_244 244 -#define DHCP_OPTION_PRIVATE_245 245 -#define DHCP_OPTION_PRIVATE_246 246 -#define DHCP_OPTION_PRIVATE_247 247 -#define DHCP_OPTION_PRIVATE_248 248 -#define DHCP_OPTION_PRIVATE_249 SD_DHCP_OPTION_PRIVATE_CLASSLESS_STATIC_ROUTE -#define DHCP_OPTION_PRIVATE_250 250 -#define DHCP_OPTION_PRIVATE_251 251 -#define DHCP_OPTION_PRIVATE_252 SD_DHCP_OPTION_PRIVATE_PROXY_AUTODISCOVERY -#define DHCP_OPTION_PRIVATE_253 253 -#define DHCP_OPTION_PRIVATE_254 SD_DHCP_OPTION_PRIVATE_LAST - -/* Internal values */ -#define DHCP_OPTION_IP_ADDRESS 1024 -#define DHCP_OPTION_EXPIRY 1025 -#define DHCP6_OPTION_IP_ADDRESS 1026 -#define DHCP6_OPTION_PREFIXLEN 1027 -#define DHCP6_OPTION_PREFERRED_LIFE 1028 -#define DHCP6_OPTION_MAX_LIFE 1029 -#define DHCP6_OPTION_STARTS 1030 -#define DHCP6_OPTION_LIFE_STARTS 1031 -#define DHCP6_OPTION_RENEW 1032 -#define DHCP6_OPTION_REBIND 1033 -#define DHCP6_OPTION_IAID 1034 - -typedef struct { - const char *name; - uint16_t option_num; - bool include; -} ReqOption; - -#define REQPREFIX "requested_" - -#define REQ(_num, _name, _include) \ - { \ - .name = REQPREFIX""_name, \ - .option_num = _num, \ - .include = _include, \ - } - -static const ReqOption dhcp4_requests[] = { - REQ (SD_DHCP_OPTION_SUBNET_MASK, "subnet_mask", TRUE ), - REQ (SD_DHCP_OPTION_TIME_OFFSET, "time_offset", TRUE ), - REQ (SD_DHCP_OPTION_DOMAIN_NAME_SERVER, "domain_name_servers", TRUE ), - REQ (SD_DHCP_OPTION_HOST_NAME, "host_name", TRUE ), - REQ (SD_DHCP_OPTION_DOMAIN_NAME, "domain_name", TRUE ), - REQ (SD_DHCP_OPTION_INTERFACE_MTU, "interface_mtu", TRUE ), - REQ (SD_DHCP_OPTION_BROADCAST, "broadcast_address", TRUE ), - - /* RFC 3442: The Classless Static Routes option code MUST appear in the parameter - * request list prior to both the Router option code and the Static - * Routes option code, if present. */ - REQ (SD_DHCP_OPTION_CLASSLESS_STATIC_ROUTE, "rfc3442_classless_static_routes", TRUE ), - REQ (SD_DHCP_OPTION_ROUTER, "routers", TRUE ), - REQ (SD_DHCP_OPTION_STATIC_ROUTE, "static_routes", TRUE ), - - REQ (DHCP_OPTION_NIS_DOMAIN, "nis_domain", TRUE ), - REQ (DHCP_OPTION_NIS_SERVERS, "nis_servers", TRUE ), - REQ (SD_DHCP_OPTION_NTP_SERVER, "ntp_servers", TRUE ), - REQ (SD_DHCP_OPTION_SERVER_IDENTIFIER, "dhcp_server_identifier", TRUE ), - REQ (SD_DHCP_OPTION_DOMAIN_SEARCH_LIST, "domain_search", TRUE ), - REQ (SD_DHCP_OPTION_PRIVATE_CLASSLESS_STATIC_ROUTE, "ms_classless_static_routes", TRUE ), - REQ (SD_DHCP_OPTION_PRIVATE_PROXY_AUTODISCOVERY, "wpad", TRUE ), - REQ (SD_DHCP_OPTION_ROOT_PATH, "root_path", TRUE ), - REQ (SD_DHCP_OPTION_IP_ADDRESS_LEASE_TIME, "dhcp_lease_time", FALSE ), - REQ (SD_DHCP_OPTION_RENEWAL_T1_TIME, "dhcp_renewal_time", FALSE ), - REQ (SD_DHCP_OPTION_REBINDING_T2_TIME, "dhcp_rebinding_time", FALSE ), - REQ (SD_DHCP_OPTION_NEW_TZDB_TIMEZONE, "tcode", FALSE ), - REQ (DHCP_OPTION_PRIVATE_224, "private_224", FALSE ), - REQ (DHCP_OPTION_PRIVATE_225, "private_225", FALSE ), - REQ (DHCP_OPTION_PRIVATE_226, "private_226", FALSE ), - REQ (DHCP_OPTION_PRIVATE_227, "private_227", FALSE ), - REQ (DHCP_OPTION_PRIVATE_228, "private_228", FALSE ), - REQ (DHCP_OPTION_PRIVATE_229, "private_229", FALSE ), - REQ (DHCP_OPTION_PRIVATE_230, "private_230", FALSE ), - REQ (DHCP_OPTION_PRIVATE_231, "private_231", FALSE ), - REQ (DHCP_OPTION_PRIVATE_232, "private_232", FALSE ), - REQ (DHCP_OPTION_PRIVATE_233, "private_233", FALSE ), - REQ (DHCP_OPTION_PRIVATE_234, "private_234", FALSE ), - REQ (DHCP_OPTION_PRIVATE_235, "private_235", FALSE ), - REQ (DHCP_OPTION_PRIVATE_236, "private_236", FALSE ), - REQ (DHCP_OPTION_PRIVATE_237, "private_237", FALSE ), - REQ (DHCP_OPTION_PRIVATE_238, "private_238", FALSE ), - REQ (DHCP_OPTION_PRIVATE_239, "private_239", FALSE ), - REQ (DHCP_OPTION_PRIVATE_240, "private_240", FALSE ), - REQ (DHCP_OPTION_PRIVATE_241, "private_241", FALSE ), - REQ (DHCP_OPTION_PRIVATE_242, "private_242", FALSE ), - REQ (DHCP_OPTION_PRIVATE_243, "private_243", FALSE ), - REQ (DHCP_OPTION_PRIVATE_244, "private_244", FALSE ), - REQ (DHCP_OPTION_PRIVATE_245, "private_245", FALSE ), - REQ (DHCP_OPTION_PRIVATE_246, "private_246", FALSE ), - REQ (DHCP_OPTION_PRIVATE_247, "private_247", FALSE ), - REQ (DHCP_OPTION_PRIVATE_248, "private_248", FALSE ), - /* DHCP_OPTION_PRIVATE_249 = SD_DHCP_OPTION_PRIVATE_CLASSLESS_STATIC_ROUTE */ - REQ (DHCP_OPTION_PRIVATE_250, "private_250", FALSE ), - REQ (DHCP_OPTION_PRIVATE_251, "private_251", FALSE ), - /* DHCP_OPTION_PRIVATE_252 = SD_DHCP_OPTION_PRIVATE_PROXY_AUTODISCOVERY */ - REQ (DHCP_OPTION_PRIVATE_253, "private_253", FALSE ), - REQ (DHCP_OPTION_PRIVATE_254, "private_254", FALSE ), - - /* Internal values */ - REQ (DHCP_OPTION_IP_ADDRESS, "ip_address", FALSE ), - REQ (DHCP_OPTION_EXPIRY, "expiry", FALSE ), - - { 0 } -}; - -static const ReqOption dhcp6_requests[] = { - REQ (SD_DHCP6_OPTION_CLIENTID, "dhcp6_client_id", FALSE ), - - /* Don't request server ID by default; some servers don't reply to - * Information Requests that request the Server ID. - */ - REQ (SD_DHCP6_OPTION_SERVERID, "dhcp6_server_id", FALSE ), - - REQ (SD_DHCP6_OPTION_DNS_SERVERS, "dhcp6_name_servers", TRUE ), - REQ (SD_DHCP6_OPTION_DOMAIN_LIST, "dhcp6_domain_search", TRUE ), - REQ (SD_DHCP6_OPTION_SNTP_SERVERS, "dhcp6_sntp_servers", TRUE ), - - /* Internal values */ - REQ (DHCP6_OPTION_IP_ADDRESS, "ip6_address", FALSE ), - REQ (DHCP6_OPTION_PREFIXLEN, "ip6_prefixlen", FALSE ), - REQ (DHCP6_OPTION_PREFERRED_LIFE, "preferred_life", FALSE ), - REQ (DHCP6_OPTION_MAX_LIFE, "max_life", FALSE ), - REQ (DHCP6_OPTION_STARTS, "starts", FALSE ), - REQ (DHCP6_OPTION_LIFE_STARTS, "life_starts", FALSE ), - REQ (DHCP6_OPTION_RENEW, "renew", FALSE ), - REQ (DHCP6_OPTION_REBIND, "rebind", FALSE ), - REQ (DHCP6_OPTION_IAID, "iaid", FALSE ), - - { 0 } -}; - -static const char * -request_string (const ReqOption *requests, guint option) -{ - guint i = 0; - - while (requests[i].name) { - if (requests[i].option_num == option) - return requests[i].name + NM_STRLEN (REQPREFIX); - i++; - } - - /* Option should always be found */ - nm_assert_not_reached (); - return NULL; -} - -static void -take_option (GHashTable *options, - const ReqOption *requests, - guint option, - char *value) -{ - nm_assert (options); - nm_assert (requests); - nm_assert (value); - - g_hash_table_insert (options, - (gpointer) request_string (requests, option), - value); -} - -static void -add_option (GHashTable *options, const ReqOption *requests, guint option, const char *value) -{ - if (options) - take_option (options, requests, option, g_strdup (value)); -} - -static void -add_option_u64 (GHashTable *options, const ReqOption *requests, guint option, guint64 value) -{ - if (options) - take_option (options, requests, option, g_strdup_printf ("%" G_GUINT64_FORMAT, value)); -} - -static void -add_requests_to_options (GHashTable *options, const ReqOption *requests) -{ - guint i; - - if (!options) - return; - - for (i = 0; requests[i].name; i++) { - if (requests[i].include) - g_hash_table_insert (options, (gpointer) requests[i].name, g_strdup ("1")); - } -} - -static GHashTable * -create_options_dict (void) -{ - return g_hash_table_new_full (nm_str_hash, g_str_equal, NULL, g_free); -} - #define LOG_LEASE(domain, ...) \ G_STMT_START { \ if (log_lease) { \ @@ -366,32 +147,35 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx, ip4_config = nm_ip4_config_new (multi_idx, ifindex); - options = out_options ? create_options_dict () : NULL; + options = out_options ? nm_dhcp_option_create_options_dict () : NULL; nm_utils_inet4_ntop (a_address.s_addr, addr_str); LOG_LEASE (LOGD_DHCP4, "%s '%s'", - request_string (dhcp4_requests, DHCP_OPTION_IP_ADDRESS), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_NM_IP_ADDRESS), addr_str); - add_option (options, dhcp4_requests, DHCP_OPTION_IP_ADDRESS, addr_str); + nm_dhcp_option_add_option (options, _nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_NM_IP_ADDRESS, addr_str); a_plen = nm_utils_ip4_netmask_to_prefix (a_netmask.s_addr); LOG_LEASE (LOGD_DHCP4, "%s '%u'", - request_string (dhcp4_requests, SD_DHCP_OPTION_SUBNET_MASK), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_SUBNET_MASK), (guint) a_plen); - add_option (options, - dhcp4_requests, - SD_DHCP_OPTION_SUBNET_MASK, - nm_utils_inet4_ntop (a_netmask.s_addr, addr_str)); + nm_dhcp_option_add_option (options, + _nm_dhcp_option_dhcp4_options, + NM_DHCP_OPTION_DHCP4_SUBNET_MASK, + nm_utils_inet4_ntop (a_netmask.s_addr, addr_str)); LOG_LEASE (LOGD_DHCP4, "%s '%u' seconds (at %lld)", - request_string (dhcp4_requests, DHCP_OPTION_EXPIRY), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_NM_EXPIRY), (guint) a_lifetime, (long long) (ts_time + a_lifetime)); - add_option_u64 (options, - dhcp4_requests, - DHCP_OPTION_EXPIRY, - (guint64) (ts_time + a_lifetime)); - add_option_u64 (options, dhcp4_requests, SD_DHCP_OPTION_IP_ADDRESS_LEASE_TIME, a_lifetime); + nm_dhcp_option_add_option_u64 (options, + _nm_dhcp_option_dhcp4_options, + NM_DHCP_OPTION_DHCP4_NM_EXPIRY, + (guint64) (ts_time + a_lifetime)); + nm_dhcp_option_add_option_u64 (options, + _nm_dhcp_option_dhcp4_options, + NM_DHCP_OPTION_DHCP4_IP_ADDRESS_LEASE_TIME, + a_lifetime); nm_ip4_config_add_address (ip4_config, &((const NMPlatformIP4Address) { @@ -407,17 +191,23 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx, if (sd_dhcp_lease_get_server_identifier (lease, &server_id) >= 0) { nm_utils_inet4_ntop (server_id.s_addr, addr_str); LOG_LEASE (LOGD_DHCP4, "%s '%s'", - request_string (dhcp4_requests, SD_DHCP_OPTION_SERVER_IDENTIFIER), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_SERVER_ID), addr_str); - add_option (options, dhcp4_requests, SD_DHCP_OPTION_SERVER_IDENTIFIER, addr_str); + nm_dhcp_option_add_option (options, + _nm_dhcp_option_dhcp4_options, + NM_DHCP_OPTION_DHCP4_SERVER_ID, + addr_str); } if (sd_dhcp_lease_get_broadcast (lease, &broadcast) >= 0) { nm_utils_inet4_ntop (broadcast.s_addr, addr_str); LOG_LEASE (LOGD_DHCP4, "%s '%s'", - request_string (dhcp4_requests, SD_DHCP_OPTION_BROADCAST), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_BROADCAST), addr_str); - add_option (options, dhcp4_requests, SD_DHCP_OPTION_BROADCAST, addr_str); + nm_dhcp_option_add_option (options, + _nm_dhcp_option_dhcp4_options, + NM_DHCP_OPTION_DHCP4_BROADCAST, + addr_str); } num = sd_dhcp_lease_get_dns (lease, &addr_list); @@ -436,9 +226,12 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx, nm_ip4_config_add_nameserver (ip4_config, addr_list[i].s_addr); } LOG_LEASE (LOGD_DHCP4, "%s '%s'", - request_string (dhcp4_requests, SD_DHCP_OPTION_DOMAIN_NAME_SERVER), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_DOMAIN_NAME_SERVER), str->str); - add_option (options, dhcp4_requests, SD_DHCP_OPTION_DOMAIN_NAME_SERVER, str->str); + nm_dhcp_option_add_option (options, + _nm_dhcp_option_dhcp4_options, + NM_DHCP_OPTION_DHCP4_DOMAIN_NAME_SERVER, + str->str); } num = sd_dhcp_lease_get_search_domains (lease, (char ***) &search_domains); @@ -449,9 +242,12 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx, nm_ip4_config_add_search (ip4_config, search_domains[i]); } LOG_LEASE (LOGD_DHCP4, "%s '%s'", - request_string (dhcp4_requests, SD_DHCP_OPTION_DOMAIN_SEARCH_LIST), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_DOMAIN_SEARCH_LIST), str->str); - add_option (options, dhcp4_requests, SD_DHCP_OPTION_DOMAIN_SEARCH_LIST, str->str); + nm_dhcp_option_add_option (options, + _nm_dhcp_option_dhcp4_options, + NM_DHCP_OPTION_DHCP4_DOMAIN_SEARCH_LIST, + str->str); } if (sd_dhcp_lease_get_domainname (lease, &s) >= 0) { @@ -459,9 +255,9 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx, char **d; LOG_LEASE (LOGD_DHCP4, "%s '%s'", - request_string (dhcp4_requests, SD_DHCP_OPTION_DOMAIN_NAME), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_DOMAIN_NAME), s); - add_option (options, dhcp4_requests, SD_DHCP_OPTION_DOMAIN_NAME, s); + nm_dhcp_option_add_option (options, _nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_DOMAIN_NAME, s); /* Multiple domains sometimes stuffed into option 15 "Domain Name". * As systemd escapes such characters, split them at \\032. */ @@ -472,9 +268,9 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx, if (sd_dhcp_lease_get_hostname (lease, &s) >= 0) { LOG_LEASE (LOGD_DHCP4, "%s '%s'", - request_string (dhcp4_requests, SD_DHCP_OPTION_HOST_NAME), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_HOST_NAME), s); - add_option (options, dhcp4_requests, SD_DHCP_OPTION_HOST_NAME, s); + nm_dhcp_option_add_option (options, _nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_HOST_NAME, s); } num = sd_dhcp_lease_get_routes (lease, &routes); @@ -485,10 +281,10 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx, for (i = 0; i < num; i++) { switch (sd_dhcp_route_get_option (routes[i])) { - case SD_DHCP_OPTION_CLASSLESS_STATIC_ROUTE: + case NM_DHCP_OPTION_DHCP4_CLASSLESS_STATIC_ROUTE: has_classless_route = TRUE; break; - case SD_DHCP_OPTION_STATIC_ROUTE: + case NM_DHCP_OPTION_DHCP4_STATIC_ROUTE: has_static_route = TRUE; break; } @@ -510,8 +306,8 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx, guint32 m; option = sd_dhcp_route_get_option (routes[i]); - if (!NM_IN_SET (option, SD_DHCP_OPTION_CLASSLESS_STATIC_ROUTE, - SD_DHCP_OPTION_STATIC_ROUTE)) + if (!NM_IN_SET (option, NM_DHCP_OPTION_DHCP4_CLASSLESS_STATIC_ROUTE, + NM_DHCP_OPTION_DHCP4_STATIC_ROUTE)) continue; if (sd_dhcp_route_get_destination (routes[i], &r_network) < 0) @@ -529,13 +325,13 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx, LOG_LEASE (LOGD_DHCP4, "%sstatic_route %s/%d gw %s", - option == SD_DHCP_OPTION_CLASSLESS_STATIC_ROUTE + option == NM_DHCP_OPTION_DHCP4_CLASSLESS_STATIC_ROUTE ? "rfc3442_classless_" : "", network_net_str, (int) r_plen, gateway_str); - g_string_append_printf (nm_gstring_add_space_delimiter ( option == SD_DHCP_OPTION_CLASSLESS_STATIC_ROUTE + g_string_append_printf (nm_gstring_add_space_delimiter ( option == NM_DHCP_OPTION_DHCP4_CLASSLESS_STATIC_ROUTE ? str_classless : str_static), "%s/%d %s", @@ -543,7 +339,7 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx, (int) r_plen, gateway_str); - if ( option == SD_DHCP_OPTION_STATIC_ROUTE + if ( option == NM_DHCP_OPTION_DHCP4_STATIC_ROUTE && has_classless_route) { /* RFC 3443: if the DHCP server returns both a Classless Static Routes * option and a Static Routes option, the DHCP client MUST ignore the @@ -552,7 +348,7 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx, } if ( r_plen == 0 - && option == SD_DHCP_OPTION_STATIC_ROUTE) { + && option == NM_DHCP_OPTION_DHCP4_STATIC_ROUTE) { /* for option 33 (static route), RFC 2132 says: * * The default route (0.0.0.0) is an illegal destination for a static @@ -584,9 +380,15 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx, } if (str_classless && str_classless->len > 0) - add_option (options, dhcp4_requests, SD_DHCP_OPTION_CLASSLESS_STATIC_ROUTE, str_classless->str); + nm_dhcp_option_add_option (options, + _nm_dhcp_option_dhcp4_options, + NM_DHCP_OPTION_DHCP4_CLASSLESS_STATIC_ROUTE, + str_classless->str); if (str_static && str_static->len > 0) - add_option (options, dhcp4_requests, SD_DHCP_OPTION_STATIC_ROUTE, str_static->str); + nm_dhcp_option_add_option (options, + _nm_dhcp_option_dhcp4_options, + NM_DHCP_OPTION_DHCP4_STATIC_ROUTE, + str_static->str); } num = sd_dhcp_lease_get_router (lease, &a_router); @@ -631,17 +433,20 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx, NULL); } LOG_LEASE (LOGD_DHCP4, "%s '%s'", - request_string (dhcp4_requests, SD_DHCP_OPTION_ROUTER), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_ROUTER), str->str); - add_option (options, dhcp4_requests, SD_DHCP_OPTION_ROUTER, str->str); + nm_dhcp_option_add_option (options, _nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_ROUTER, str->str); } if ( sd_dhcp_lease_get_mtu (lease, &mtu) >= 0 && mtu) { LOG_LEASE (LOGD_DHCP4, "%s '%u'", - request_string (dhcp4_requests, SD_DHCP_OPTION_INTERFACE_MTU), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_INTERFACE_MTU), mtu); - add_option_u64 (options, dhcp4_requests, SD_DHCP_OPTION_INTERFACE_MTU, mtu); + nm_dhcp_option_add_option_u64 (options, + _nm_dhcp_option_dhcp4_options, + NM_DHCP_OPTION_DHCP4_INTERFACE_MTU, + mtu); nm_ip4_config_set_mtu (ip4_config, mtu, NM_IP_CONFIG_SOURCE_DHCP); } @@ -653,37 +458,49 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx, g_string_append (nm_gstring_add_space_delimiter (str), addr_str); } LOG_LEASE (LOGD_DHCP4, "%s '%s'", - request_string (dhcp4_requests, SD_DHCP_OPTION_NTP_SERVER), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_NTP_SERVER), str->str); - add_option (options, dhcp4_requests, SD_DHCP_OPTION_NTP_SERVER, str->str); + nm_dhcp_option_add_option (options, + _nm_dhcp_option_dhcp4_options, + NM_DHCP_OPTION_DHCP4_NTP_SERVER, + str->str); } if (sd_dhcp_lease_get_root_path (lease, &s) >= 0) { LOG_LEASE (LOGD_DHCP4, "%s '%s'", - request_string (dhcp4_requests, SD_DHCP_OPTION_ROOT_PATH), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_ROOT_PATH), s); - add_option (options, dhcp4_requests, SD_DHCP_OPTION_ROOT_PATH, s); + nm_dhcp_option_add_option (options, _nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_ROOT_PATH, s); } if (sd_dhcp_lease_get_t1 (lease, &renewal) >= 0) { LOG_LEASE (LOGD_DHCP4, "%s '%u'", - request_string (dhcp4_requests, SD_DHCP_OPTION_RENEWAL_T1_TIME), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_RENEWAL_T1_TIME), renewal); - add_option_u64 (options, dhcp4_requests, SD_DHCP_OPTION_RENEWAL_T1_TIME, renewal); + nm_dhcp_option_add_option_u64 (options, + _nm_dhcp_option_dhcp4_options, + NM_DHCP_OPTION_DHCP4_RENEWAL_T1_TIME, + renewal); } if (sd_dhcp_lease_get_t2 (lease, &rebinding) >= 0) { LOG_LEASE (LOGD_DHCP4, "%s '%u'", - request_string (dhcp4_requests, SD_DHCP_OPTION_REBINDING_T2_TIME), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_REBINDING_T2_TIME), rebinding); - add_option_u64 (options, dhcp4_requests, SD_DHCP_OPTION_REBINDING_T2_TIME, rebinding); + nm_dhcp_option_add_option_u64 (options, + _nm_dhcp_option_dhcp4_options, + NM_DHCP_OPTION_DHCP4_REBINDING_T2_TIME, + rebinding); } if (sd_dhcp_lease_get_timezone (lease, &s) >= 0) { LOG_LEASE (LOGD_DHCP4, "%s '%s'", - request_string (dhcp4_requests, SD_DHCP_OPTION_NEW_TZDB_TIMEZONE), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp4_options, NM_DHCP_OPTION_DHCP4_NEW_TZDB_TIMEZONE), s); - add_option (options, dhcp4_requests, SD_DHCP_OPTION_NEW_TZDB_TIMEZONE, s); + nm_dhcp_option_add_option (options, + _nm_dhcp_option_dhcp4_options, + NM_DHCP_OPTION_DHCP4_NEW_TZDB_TIMEZONE, + s); } if (sd_dhcp_lease_get_vendor_specific (lease, &data, &data_len) >= 0) @@ -699,16 +516,16 @@ lease_to_ip4_config (NMDedupMultiIndex *multi_idx, private_options[i].data_len, ':', FALSE, NULL); LOG_LEASE (LOGD_DHCP4, "%s '%s'", - request_string (dhcp4_requests, private_options[i].code), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp4_options, private_options[i].code), option_string); if (!options) { g_free (option_string); continue; } - take_option (options, - dhcp4_requests, - private_options[i].code, - option_string); + nm_dhcp_option_take_option (options, + _nm_dhcp_option_dhcp4_options, + private_options[i].code, + option_string); } } NM_SET_OUT (out_options, g_steal_pointer (&options)); @@ -783,7 +600,7 @@ bound4_handle (NMDhcpSystemd *self) return; } - add_requests_to_options (options, dhcp4_requests); + nm_dhcp_option_add_requests_to_options (options, _nm_dhcp_option_dhcp4_options); dhcp_lease_save (lease, priv->lease_file); nm_dhcp_client_set_state (NM_DHCP_CLIENT (self), @@ -936,10 +753,10 @@ ip4_start (NMDhcpClient *client, } /* Add requested options */ - for (i = 0; dhcp4_requests[i].name; i++) { - if (dhcp4_requests[i].include) { - nm_assert (dhcp4_requests[i].option_num <= 255); - r = sd_dhcp_client_set_request_option (sd_client, dhcp4_requests[i].option_num); + for (i = 0; _nm_dhcp_option_dhcp4_options[i].name; i++) { + if (_nm_dhcp_option_dhcp4_options[i].include) { + nm_assert (_nm_dhcp_option_dhcp4_options[i].option_num <= 255); + r = sd_dhcp_client_set_request_option (sd_client, _nm_dhcp_option_dhcp4_options[i].option_num); nm_assert (r >= 0 || r == -EEXIST); } } @@ -1006,7 +823,7 @@ lease_to_ip6_config (NMDedupMultiIndex *multi_idx, ip6_config = nm_ip6_config_new (multi_idx, ifindex); - options = out_options ? create_options_dict () : NULL; + options = out_options ? nm_dhcp_option_create_options_dict () : NULL; sd_dhcp6_lease_reset_address_iter (lease); nm_gstring_prepare (&str); @@ -1027,11 +844,14 @@ lease_to_ip6_config (NMDedupMultiIndex *multi_idx, g_string_append (nm_gstring_add_space_delimiter (str), addr_str); LOG_LEASE (LOGD_DHCP6, "%s '%s'", - request_string (dhcp6_requests, DHCP6_OPTION_IP_ADDRESS), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp6_options, NM_DHCP_OPTION_DHCP6_NM_IP_ADDRESS), nm_platform_ip6_address_to_string (&address, sbuf, sizeof (sbuf))); }; if (str->len) - add_option (options, dhcp6_requests, DHCP6_OPTION_IP_ADDRESS, str->str); + nm_dhcp_option_add_option (options, + _nm_dhcp_option_dhcp6_options, + NM_DHCP_OPTION_DHCP6_NM_IP_ADDRESS, + str->str); if ( !info_only && nm_ip6_config_get_num_addresses (ip6_config) == 0) { @@ -1051,9 +871,12 @@ lease_to_ip6_config (NMDedupMultiIndex *multi_idx, nm_ip6_config_add_nameserver (ip6_config, &dns[i]); } LOG_LEASE (LOGD_DHCP6, "%s '%s'", - request_string (dhcp6_requests, SD_DHCP6_OPTION_DNS_SERVERS), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp6_options, NM_DHCP_OPTION_DHCP6_DNS_SERVERS), str->str); - add_option (options, dhcp6_requests, SD_DHCP6_OPTION_DNS_SERVERS, str->str); + nm_dhcp_option_add_option (options, + _nm_dhcp_option_dhcp6_options, + NM_DHCP_OPTION_DHCP6_DNS_SERVERS, + str->str); } num = sd_dhcp6_lease_get_domains (lease, &domains); @@ -1064,9 +887,12 @@ lease_to_ip6_config (NMDedupMultiIndex *multi_idx, nm_ip6_config_add_search (ip6_config, domains[i]); } LOG_LEASE (LOGD_DHCP6, "%s '%s'", - request_string (dhcp6_requests, SD_DHCP6_OPTION_DOMAIN_LIST), + nm_dhcp_option_request_string (_nm_dhcp_option_dhcp6_options, NM_DHCP_OPTION_DHCP6_DOMAIN_LIST), str->str); - add_option (options, dhcp6_requests, SD_DHCP6_OPTION_DOMAIN_LIST, str->str); + nm_dhcp_option_add_option (options, + _nm_dhcp_option_dhcp6_options, + NM_DHCP_OPTION_DHCP6_DOMAIN_LIST, + str->str); } NM_SET_OUT (out_options, g_steal_pointer (&options)); @@ -1239,9 +1065,9 @@ ip6_start (NMDhcpClient *client, } /* Add requested options */ - for (i = 0; dhcp6_requests[i].name; i++) { - if (dhcp6_requests[i].include) { - r = sd_dhcp6_client_set_request_option (sd_client, dhcp6_requests[i].option_num); + for (i = 0; _nm_dhcp_option_dhcp6_options[i].name; i++) { + if (_nm_dhcp_option_dhcp6_options[i].include) { + r = sd_dhcp6_client_set_request_option (sd_client, _nm_dhcp_option_dhcp6_options[i].option_num); nm_assert (r >= 0 || r == -EEXIST); } } diff --git a/src/meson.build b/src/meson.build index af0bcec99c..aec6eceb44 100644 --- a/src/meson.build +++ b/src/meson.build @@ -25,6 +25,7 @@ sources = files( 'dhcp/nm-dhcp-nettools.c', 'dhcp/nm-dhcp-systemd.c', 'dhcp/nm-dhcp-utils.c', + 'dhcp/nm-dhcp-options.c', 'ndisc/nm-lndp-ndisc.c', 'ndisc/nm-ndisc.c', 'platform/nm-netlink.c', |