1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 #include "in-addr-util.h"
4 #include "networkd-dhcp-common.h"
5 #include "networkd-network.h"
6 #include "parse-util.h"
7 #include "string-table.h"
10 int config_parse_dhcp(
15 unsigned section_line
,
22 AddressFamily
*dhcp
= data
, s
;
29 /* Note that this is mostly like
30 * config_parse_address_family(), except that it
31 * understands some old names for the enum values */
33 s
= address_family_from_string(rvalue
);
36 /* Previously, we had a slightly different enum here,
37 * support its values for compatibility. */
39 if (streq(rvalue
, "none"))
40 s
= ADDRESS_FAMILY_NO
;
41 else if (streq(rvalue
, "v4"))
42 s
= ADDRESS_FAMILY_IPV4
;
43 else if (streq(rvalue
, "v6"))
44 s
= ADDRESS_FAMILY_IPV6
;
45 else if (streq(rvalue
, "both"))
46 s
= ADDRESS_FAMILY_YES
;
48 log_syntax(unit
, LOG_ERR
, filename
, line
, 0,
49 "Failed to parse DHCP option, ignoring: %s", rvalue
);
53 log_syntax(unit
, LOG_WARNING
, filename
, line
, 0,
54 "DHCP=%s is deprecated, please use DHCP=%s instead.",
55 rvalue
, address_family_to_string(s
));
62 int config_parse_dhcp_use_dns(
67 unsigned section_line
,
74 Network
*network
= data
;
82 r
= parse_boolean(rvalue
);
84 log_syntax(unit
, LOG_ERR
, filename
, line
, r
,
85 "Failed to parse UseDNS=%s, ignoring assignment: %m", rvalue
);
89 network
->dhcp_use_dns
= r
;
90 network
->dhcp6_use_dns
= r
;
95 int config_parse_dhcp_use_sip(
100 unsigned section_line
,
107 Network
*network
= data
;
115 r
= parse_boolean(rvalue
);
117 log_syntax(unit
, LOG_ERR
, filename
, line
, r
,
118 "Failed to parse UseSIP=%s, ignoring assignment: %m", rvalue
);
122 network
->dhcp_use_sip
= r
;
127 int config_parse_dhcp_use_ntp(
129 const char *filename
,
132 unsigned section_line
,
139 Network
*network
= data
;
147 r
= parse_boolean(rvalue
);
149 log_syntax(unit
, LOG_ERR
, filename
, line
, r
,
150 "Failed to parse UseNTP=%s, ignoring assignment: %m", rvalue
);
154 network
->dhcp_use_ntp
= r
;
155 network
->dhcp6_use_ntp
= r
;
160 int config_parse_section_route_table(
162 const char *filename
,
165 unsigned section_line
,
172 Network
*network
= data
;
181 r
= safe_atou32(rvalue
, &rt
);
183 log_syntax(unit
, LOG_ERR
, filename
, line
, r
,
184 "Failed to parse RouteTable=%s, ignoring assignment: %m", rvalue
);
188 if (STRPTR_IN_SET(section
, "DHCP", "DHCPv4")) {
189 network
->dhcp_route_table
= rt
;
190 network
->dhcp_route_table_set
= true;
191 } else { /* section is IPv6AcceptRA */
192 network
->ipv6_accept_ra_route_table
= rt
;
193 network
->ipv6_accept_ra_route_table_set
= true;
199 int config_parse_iaid(const char *unit
,
200 const char *filename
,
203 unsigned section_line
,
209 Network
*network
= data
;
218 r
= safe_atou32(rvalue
, &iaid
);
220 log_syntax(unit
, LOG_ERR
, filename
, line
, r
,
221 "Unable to read IAID, ignoring assignment: %s", rvalue
);
225 network
->iaid
= iaid
;
226 network
->iaid_set
= true;
231 int config_parse_dhcp6_pd_hint(
233 const char *filename
,
236 unsigned section_line
,
243 Network
*network
= data
;
251 r
= in_addr_prefix_from_string(rvalue
, AF_INET6
, (union in_addr_union
*) &network
->dhcp6_pd_address
, &network
->dhcp6_pd_length
);
253 log_syntax(unit
, LOG_ERR
, filename
, line
, r
, "Failed to parse PrefixDelegationHint=%s, ignoring assignment", rvalue
);
257 if (network
->dhcp6_pd_length
< 1 || network
->dhcp6_pd_length
> 128) {
258 log_syntax(unit
, LOG_ERR
, filename
, line
, 0, "Invalid prefix length='%d', ignoring assignment", network
->dhcp6_pd_length
);
259 network
->dhcp6_pd_length
= 0;
266 DEFINE_CONFIG_PARSE_ENUM(config_parse_dhcp_use_domains
, dhcp_use_domains
, DHCPUseDomains
,
267 "Failed to parse DHCP use domains setting");
269 static const char* const dhcp_use_domains_table
[_DHCP_USE_DOMAINS_MAX
] = {
270 [DHCP_USE_DOMAINS_NO
] = "no",
271 [DHCP_USE_DOMAINS_ROUTE
] = "route",
272 [DHCP_USE_DOMAINS_YES
] = "yes",
275 DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(dhcp_use_domains
, DHCPUseDomains
, DHCP_USE_DOMAINS_YES
);
277 static const char * const dhcp_option_data_type_table
[_DHCP_OPTION_DATA_MAX
] = {
278 [DHCP_OPTION_DATA_UINT8
] = "uint8",
279 [DHCP_OPTION_DATA_UINT16
] = "uint16",
280 [DHCP_OPTION_DATA_UINT32
] = "uint32",
281 [DHCP_OPTION_DATA_STRING
] = "string",
282 [DHCP_OPTION_DATA_IPV4ADDRESS
] = "ipv4address",
285 DEFINE_STRING_TABLE_LOOKUP(dhcp_option_data_type
, DHCPOptionDataType
);