dhcp/internal: move dhcp options management to shared dhcp codebase

This commit is contained in:
Francesco Giudici 2019-06-06 12:27:06 +02:00
parent f42754c8d7
commit eed205bff3
5 changed files with 597 additions and 290 deletions

View file

@ -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 \

276
src/dhcp/nm-dhcp-options.c Normal file
View file

@ -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);
}

202
src/dhcp/nm-dhcp-options.h Normal file
View file

@ -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__ */

View file

@ -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);
}
}

View file

@ -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',