1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 #include <netinet/in.h>
4 #include <netinet/ip.h>
6 #include <linux/if_arp.h>
8 #include "alloc-util.h"
9 #include "dhcp-client-internal.h"
10 #include "hostname-setup.h"
11 #include "hostname-util.h"
12 #include "parse-util.h"
13 #include "network-internal.h"
14 #include "networkd-address.h"
15 #include "networkd-dhcp-prefix-delegation.h"
16 #include "networkd-dhcp4.h"
17 #include "networkd-ipv4acd.h"
18 #include "networkd-link.h"
19 #include "networkd-manager.h"
20 #include "networkd-network.h"
21 #include "networkd-nexthop.h"
22 #include "networkd-queue.h"
23 #include "networkd-route.h"
24 #include "networkd-setlink.h"
25 #include "networkd-state-file.h"
26 #include "string-table.h"
28 #include "sysctl-util.h"
30 void network_adjust_dhcp4(Network
*network
) {
33 if (!FLAGS_SET(network
->dhcp
, ADDRESS_FAMILY_IPV4
))
36 if (network
->dhcp_use_gateway
< 0)
37 network
->dhcp_use_gateway
= network
->dhcp_use_routes
;
39 /* RFC7844 section 3.: MAY contain the Client Identifier option
40 * Section 3.5: clients MUST use client identifiers based solely on the link-layer address
41 * NOTE: Using MAC, as it does not reveal extra information, and some servers might not answer
42 * if this option is not sent */
43 if (network
->dhcp_anonymize
&&
44 network
->dhcp_client_identifier
>= 0 &&
45 network
->dhcp_client_identifier
!= DHCP_CLIENT_ID_MAC
) {
46 log_warning("%s: ClientIdentifier= is set, although Anonymize=yes. Using ClientIdentifier=mac.",
48 network
->dhcp_client_identifier
= DHCP_CLIENT_ID_MAC
;
51 if (network
->dhcp_client_identifier
< 0)
52 network
->dhcp_client_identifier
= network
->dhcp_anonymize
? DHCP_CLIENT_ID_MAC
: DHCP_CLIENT_ID_DUID
;
55 static int dhcp4_remove_address_and_routes(Link
*link
, bool only_marked
) {
62 SET_FOREACH(route
, link
->routes
) {
63 if (route
->source
!= NETWORK_CONFIG_SOURCE_DHCP4
)
65 if (only_marked
&& !route_is_marked(route
))
68 k
= route_remove(route
);
72 route_cancel_request(route
, link
);
75 SET_FOREACH(address
, link
->addresses
) {
76 if (address
->source
!= NETWORK_CONFIG_SOURCE_DHCP4
)
78 if (only_marked
&& !address_is_marked(address
))
81 k
= address_remove(address
);
85 address_cancel_request(address
);
91 static int dhcp4_address_get(Link
*link
, Address
**ret
) {
96 SET_FOREACH(address
, link
->addresses
) {
97 if (address
->source
!= NETWORK_CONFIG_SOURCE_DHCP4
)
99 if (address_is_marked(address
))
110 static int dhcp4_address_ready_callback(Address
*address
) {
112 assert(address
->link
);
114 /* Do not call this again. */
115 address
->callback
= NULL
;
117 return dhcp4_check_ready(address
->link
);
120 int dhcp4_check_ready(Link
*link
) {
126 if (link
->dhcp4_messages
> 0) {
127 log_link_debug(link
, "%s(): DHCPv4 address and routes are not set.", __func__
);
131 if (dhcp4_address_get(link
, &address
) < 0) {
132 log_link_debug(link
, "%s(): DHCPv4 address is not set.", __func__
);
136 if (!address_is_ready(address
)) {
137 log_link_debug(link
, "%s(): DHCPv4 address is not ready.", __func__
);
138 address
->callback
= dhcp4_address_ready_callback
;
142 link
->dhcp4_configured
= true;
143 log_link_debug(link
, "DHCPv4 address and routes set.");
145 /* New address and routes are configured now. Let's release old lease. */
146 r
= dhcp4_remove_address_and_routes(link
, /* only_marked = */ true);
150 r
= sd_ipv4ll_stop(link
->ipv4ll
);
152 return log_link_warning_errno(link
, r
, "Failed to drop IPv4 link-local address: %m");
154 link_check_ready(link
);
158 static int dhcp4_route_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, Request
*req
, Link
*link
, Route
*route
) {
164 r
= sd_netlink_message_get_errno(m
);
165 if (r
< 0 && r
!= -EEXIST
) {
166 log_link_message_warning_errno(link
, m
, r
, "Could not set DHCPv4 route");
167 link_enter_failed(link
);
171 r
= dhcp4_check_ready(link
);
173 link_enter_failed(link
);
178 static int dhcp4_request_route(Route
*in
, Link
*link
) {
179 _cleanup_(route_freep
) Route
*route
= in
;
180 struct in_addr server
;
186 assert(link
->dhcp_lease
);
188 r
= sd_dhcp_lease_get_server_identifier(link
->dhcp_lease
, &server
);
190 return log_link_debug_errno(link
, r
, "Failed to get DHCP server IP address: %m");
192 route
->source
= NETWORK_CONFIG_SOURCE_DHCP4
;
193 route
->provider
.in
= server
;
194 route
->family
= AF_INET
;
195 if (!route
->protocol_set
)
196 route
->protocol
= RTPROT_DHCP
;
197 if (!route
->priority_set
)
198 route
->priority
= link
->network
->dhcp_route_metric
;
199 if (!route
->table_set
)
200 route
->table
= link_get_dhcp4_route_table(link
);
202 route
->mtu
= link
->network
->dhcp_route_mtu
;
204 if (route_get(NULL
, link
, route
, &existing
) < 0) /* This is a new route. */
205 link
->dhcp4_configured
= false;
207 route_unmark(existing
);
209 return link_request_route(link
, TAKE_PTR(route
), true, &link
->dhcp4_messages
,
210 dhcp4_route_handler
, NULL
);
213 static bool link_prefixroute(Link
*link
) {
214 return !link
->network
->dhcp_route_table_set
||
215 link
->network
->dhcp_route_table
== RT_TABLE_MAIN
;
218 static int dhcp4_request_prefix_route(Link
*link
) {
219 _cleanup_(route_freep
) Route
*route
= NULL
;
220 struct in_addr address
, netmask
;
224 assert(link
->dhcp_lease
);
226 if (link_prefixroute(link
))
227 /* When true, the route will be created by kernel. See dhcp4_update_address(). */
230 r
= sd_dhcp_lease_get_address(link
->dhcp_lease
, &address
);
234 r
= sd_dhcp_lease_get_netmask(link
->dhcp_lease
, &netmask
);
238 r
= route_new(&route
);
242 route
->dst
.in
.s_addr
= address
.s_addr
& netmask
.s_addr
;
243 route
->dst_prefixlen
= in4_addr_netmask_to_prefixlen(&netmask
);
244 route
->prefsrc
.in
= address
;
245 route
->scope
= RT_SCOPE_LINK
;
247 return dhcp4_request_route(TAKE_PTR(route
), link
);
250 static int dhcp4_request_route_to_gateway(Link
*link
, const struct in_addr
*gw
) {
251 _cleanup_(route_freep
) Route
*route
= NULL
;
252 struct in_addr address
;
256 assert(link
->dhcp_lease
);
259 r
= sd_dhcp_lease_get_address(link
->dhcp_lease
, &address
);
263 r
= route_new(&route
);
268 route
->dst_prefixlen
= 32;
269 route
->prefsrc
.in
= address
;
270 route
->scope
= RT_SCOPE_LINK
;
272 return dhcp4_request_route(TAKE_PTR(route
), link
);
275 static int dhcp4_request_route_auto(
278 const struct in_addr
*gw
) {
280 _cleanup_(route_freep
) Route
*route
= in
;
281 struct in_addr address
, netmask
, prefix
;
287 assert(link
->dhcp_lease
);
290 r
= sd_dhcp_lease_get_address(link
->dhcp_lease
, &address
);
294 r
= sd_dhcp_lease_get_netmask(link
->dhcp_lease
, &netmask
);
298 prefix
.s_addr
= address
.s_addr
& netmask
.s_addr
;
299 prefixlen
= in4_addr_netmask_to_prefixlen(&netmask
);
301 if (in4_addr_is_localhost(&route
->dst
.in
)) {
302 if (in4_addr_is_set(gw
))
303 log_link_debug(link
, "DHCP: requested route destination "IPV4_ADDRESS_FMT_STR
"/%u is localhost, "
304 "ignoring gateway address "IPV4_ADDRESS_FMT_STR
,
305 IPV4_ADDRESS_FMT_VAL(route
->dst
.in
), route
->dst_prefixlen
, IPV4_ADDRESS_FMT_VAL(*gw
));
307 route
->scope
= RT_SCOPE_HOST
;
308 route
->gw_family
= AF_UNSPEC
;
309 route
->gw
= IN_ADDR_NULL
;
310 route
->prefsrc
= IN_ADDR_NULL
;
312 } else if (in4_addr_equal(&route
->dst
.in
, &address
)) {
313 if (in4_addr_is_set(gw
))
314 log_link_debug(link
, "DHCP: requested route destination "IPV4_ADDRESS_FMT_STR
"/%u is equivalent to the acquired address, "
315 "ignoring gateway address "IPV4_ADDRESS_FMT_STR
,
316 IPV4_ADDRESS_FMT_VAL(route
->dst
.in
), route
->dst_prefixlen
, IPV4_ADDRESS_FMT_VAL(*gw
));
318 route
->scope
= RT_SCOPE_HOST
;
319 route
->gw_family
= AF_UNSPEC
;
320 route
->gw
= IN_ADDR_NULL
;
321 route
->prefsrc
.in
= address
;
323 } else if (route
->dst_prefixlen
>= prefixlen
&&
324 (route
->dst
.in
.s_addr
& netmask
.s_addr
) == prefix
.s_addr
) {
325 if (in4_addr_is_set(gw
))
326 log_link_debug(link
, "DHCP: requested route destination "IPV4_ADDRESS_FMT_STR
"/%u is in the assigned network "
327 IPV4_ADDRESS_FMT_STR
"/%u, ignoring gateway address "IPV4_ADDRESS_FMT_STR
,
328 IPV4_ADDRESS_FMT_VAL(route
->dst
.in
), route
->dst_prefixlen
,
329 IPV4_ADDRESS_FMT_VAL(prefix
), prefixlen
,
330 IPV4_ADDRESS_FMT_VAL(*gw
));
332 route
->scope
= RT_SCOPE_LINK
;
333 route
->gw_family
= AF_UNSPEC
;
334 route
->gw
= IN_ADDR_NULL
;
335 route
->prefsrc
.in
= address
;
338 if (in4_addr_is_null(gw
)) {
339 log_link_debug(link
, "DHCP: requested route destination "IPV4_ADDRESS_FMT_STR
"/%u is not in the assigned network "
340 IPV4_ADDRESS_FMT_STR
"/%u, but no gateway is specified, ignoring.",
341 IPV4_ADDRESS_FMT_VAL(route
->dst
.in
), route
->dst_prefixlen
,
342 IPV4_ADDRESS_FMT_VAL(prefix
), prefixlen
);
346 r
= dhcp4_request_route_to_gateway(link
, gw
);
350 route
->scope
= RT_SCOPE_UNIVERSE
;
351 route
->gw_family
= AF_INET
;
353 route
->prefsrc
.in
= address
;
356 return dhcp4_request_route(TAKE_PTR(route
), link
);
359 static int dhcp4_request_static_routes(Link
*link
, struct in_addr
*ret_default_gw
) {
360 _cleanup_free_ sd_dhcp_route
**static_routes
= NULL
, **classless_routes
= NULL
;
361 size_t n_static_routes
, n_classless_routes
, n
;
362 struct in_addr default_gw
= {};
363 sd_dhcp_route
**routes
;
367 assert(link
->dhcp_lease
);
368 assert(ret_default_gw
);
370 r
= sd_dhcp_lease_get_static_routes(link
->dhcp_lease
, &static_routes
);
378 r
= sd_dhcp_lease_get_classless_routes(link
->dhcp_lease
, &classless_routes
);
380 n_classless_routes
= 0;
384 n_classless_routes
= r
;
386 if (n_classless_routes
== 0 && n_static_routes
== 0) {
387 log_link_debug(link
, "DHCP: No static routes received from DHCP server.");
391 /* if the DHCP server returns both a Classless Static Routes option and a Static Routes option,
392 * the DHCP client MUST ignore the Static Routes option. */
393 if (n_classless_routes
> 0 && n_static_routes
> 0)
394 log_link_debug(link
, "Classless static routes received from DHCP server: ignoring static-route option");
396 if (!link
->network
->dhcp_use_routes
) {
398 /* Even if UseRoutes=no, try to find default gateway to make semi-static routes and
399 * routes to DNS or NTP servers can be configured in later steps. */
401 for (size_t i
= 0; i
< n_classless_routes
; i
++) {
405 r
= sd_dhcp_route_get_destination(classless_routes
[i
], &dst
);
409 if (in4_addr_is_set(&dst
))
412 r
= sd_dhcp_route_get_destination_prefix_length(classless_routes
[i
], &prefixlen
);
419 r
= sd_dhcp_route_get_gateway(classless_routes
[i
], ret_default_gw
);
426 /* Do not return 1 here, to ensure the router option can override the default gateway
431 if (n_classless_routes
> 0) {
432 n
= n_classless_routes
;
433 routes
= classless_routes
;
434 } else if (n_static_routes
> 0){
436 routes
= static_routes
;
438 assert_not_reached();
440 for (size_t i
= 0; i
< n
; i
++) {
441 _cleanup_(route_freep
) Route
*route
= NULL
;
444 r
= route_new(&route
);
448 route
->gw_family
= AF_INET
;
450 r
= sd_dhcp_route_get_gateway(routes
[i
], &gw
);
454 r
= sd_dhcp_route_get_destination(routes
[i
], &route
->dst
.in
);
458 r
= sd_dhcp_route_get_destination_prefix_length(routes
[i
], &route
->dst_prefixlen
);
462 /* When classless static routes are provided, then router option will be ignored. To
463 * use the default gateway later in other routes, e.g., routes to dns servers, here we
464 * need to find the default gateway in the classless static routes. */
465 if (n_classless_routes
> 0 &&
466 in4_addr_is_null(&route
->dst
.in
) && route
->dst_prefixlen
== 0 &&
467 in4_addr_is_null(&default_gw
))
470 r
= dhcp4_request_route_auto(TAKE_PTR(route
), link
, &gw
);
475 *ret_default_gw
= default_gw
;
476 return n_classless_routes
> 0;
479 static int dhcp4_request_gateway(Link
*link
, struct in_addr
*gw
) {
480 _cleanup_(route_freep
) Route
*route
= NULL
;
481 const struct in_addr
*router
;
482 struct in_addr address
;
486 assert(link
->dhcp_lease
);
489 r
= sd_dhcp_lease_get_address(link
->dhcp_lease
, &address
);
493 r
= sd_dhcp_lease_get_router(link
->dhcp_lease
, &router
);
494 if (IN_SET(r
, 0, -ENODATA
)) {
495 log_link_debug(link
, "DHCP: No gateway received from DHCP server.");
500 if (in4_addr_is_null(&router
[0])) {
501 log_link_debug(link
, "DHCP: Received gateway address is null.");
505 if (!link
->network
->dhcp_use_gateway
) {
506 /* When no classless static route is provided, even if UseGateway=no, use the gateway
507 * address to configure semi-static routes or routes to DNS or NTP servers. Note, if
508 * neither UseRoutes= nor UseGateway= is disabled, use the default gateway in classless
509 * static routes if provided (in that case, in4_addr_is_null(gw) below is true). */
510 if (in4_addr_is_null(gw
))
515 /* The dhcp netmask may mask out the gateway. First, add an explicit route for the gateway host
516 * so that we can route no matter the netmask or existing kernel route tables. */
517 r
= dhcp4_request_route_to_gateway(link
, &router
[0]);
521 r
= route_new(&route
);
525 /* Next, add a default gateway. */
526 route
->gw_family
= AF_INET
;
527 route
->gw
.in
= router
[0];
528 route
->prefsrc
.in
= address
;
530 r
= dhcp4_request_route(TAKE_PTR(route
), link
);
534 /* When no classless static route is provided, or UseRoutes=no, then use the router address to
535 * configure semi-static routes and routes to DNS or NTP servers in later steps. */
540 static int dhcp4_request_semi_static_routes(Link
*link
, const struct in_addr
*gw
) {
545 assert(link
->dhcp_lease
);
546 assert(link
->network
);
549 if (in4_addr_is_null(gw
))
552 HASHMAP_FOREACH(rt
, link
->network
->routes_by_section
) {
553 _cleanup_(route_freep
) Route
*route
= NULL
;
555 if (!rt
->gateway_from_dhcp_or_ra
)
558 if (rt
->gw_family
!= AF_INET
)
561 r
= dhcp4_request_route_to_gateway(link
, gw
);
565 r
= route_dup(rt
, &route
);
571 r
= dhcp4_request_route(TAKE_PTR(route
), link
);
579 static int dhcp4_request_routes_to_servers(
581 const struct in_addr
*servers
,
583 const struct in_addr
*gw
) {
588 assert(link
->dhcp_lease
);
589 assert(link
->network
);
590 assert(servers
|| n_servers
== 0);
593 for (size_t i
= 0; i
< n_servers
; i
++) {
594 _cleanup_(route_freep
) Route
*route
= NULL
;
596 if (in4_addr_is_null(&servers
[i
]))
599 r
= route_new(&route
);
603 route
->dst
.in
= servers
[i
];
604 route
->dst_prefixlen
= 32;
606 r
= dhcp4_request_route_auto(TAKE_PTR(route
), link
, gw
);
614 static int dhcp4_request_routes_to_dns(Link
*link
, const struct in_addr
*gw
) {
615 const struct in_addr
*dns
;
619 assert(link
->dhcp_lease
);
620 assert(link
->network
);
623 if (!link
->network
->dhcp_use_dns
||
624 !link
->network
->dhcp_routes_to_dns
)
627 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &dns
);
628 if (IN_SET(r
, 0, -ENODATA
))
633 return dhcp4_request_routes_to_servers(link
, dns
, r
, gw
);
636 static int dhcp4_request_routes_to_ntp(Link
*link
, const struct in_addr
*gw
) {
637 const struct in_addr
*ntp
;
641 assert(link
->dhcp_lease
);
642 assert(link
->network
);
645 if (!link
->network
->dhcp_use_ntp
||
646 !link
->network
->dhcp_routes_to_ntp
)
649 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &ntp
);
650 if (IN_SET(r
, 0, -ENODATA
))
655 return dhcp4_request_routes_to_servers(link
, ntp
, r
, gw
);
658 static int dhcp4_request_routes(Link
*link
) {
659 struct in_addr gw
= {};
663 assert(link
->dhcp_lease
);
665 r
= dhcp4_request_prefix_route(link
);
667 return log_link_error_errno(link
, r
, "DHCP error: Could not request prefix route: %m");
669 r
= dhcp4_request_static_routes(link
, &gw
);
671 return log_link_error_errno(link
, r
, "DHCP error: Could not request static routes: %m");
673 /* According to RFC 3442: If the DHCP server returns both a Classless Static Routes option and
674 * a Router option, the DHCP client MUST ignore the Router option. */
675 r
= dhcp4_request_gateway(link
, &gw
);
677 return log_link_error_errno(link
, r
, "DHCP error: Could not request gateway: %m");
680 r
= dhcp4_request_semi_static_routes(link
, &gw
);
682 return log_link_error_errno(link
, r
, "DHCP error: Could not request routes with Gateway=_dhcp4 setting: %m");
684 r
= dhcp4_request_routes_to_dns(link
, &gw
);
686 return log_link_error_errno(link
, r
, "DHCP error: Could not request routes to DNS servers: %m");
688 r
= dhcp4_request_routes_to_ntp(link
, &gw
);
690 return log_link_error_errno(link
, r
, "DHCP error: Could not request routes to NTP servers: %m");
695 static int dhcp_reset_mtu(Link
*link
) {
700 if (!link
->network
->dhcp_use_mtu
)
703 r
= link_request_to_set_mtu(link
, link
->original_mtu
);
705 return log_link_error_errno(link
, r
, "DHCP error: Could not queue request to reset MTU: %m");
710 static int dhcp_reset_hostname(Link
*link
) {
711 const char *hostname
;
716 if (!link
->network
->dhcp_use_hostname
)
719 hostname
= link
->network
->dhcp_hostname
;
721 (void) sd_dhcp_lease_get_hostname(link
->dhcp_lease
, &hostname
);
726 /* If a hostname was set due to the lease, then unset it now. */
727 r
= manager_set_hostname(link
->manager
, NULL
);
729 return log_link_error_errno(link
, r
, "DHCP error: Failed to reset transient hostname: %m");
734 int dhcp4_lease_lost(Link
*link
) {
738 assert(link
->dhcp_lease
);
739 assert(link
->network
);
741 log_link_info(link
, "DHCP lease lost");
743 link
->dhcp4_configured
= false;
745 if (link
->network
->dhcp_use_6rd
&&
746 dhcp4_lease_has_pd_prefix(link
->dhcp_lease
))
747 dhcp4_pd_prefix_lost(link
);
749 k
= dhcp4_remove_address_and_routes(link
, /* only_marked = */ false);
753 k
= dhcp_reset_mtu(link
);
757 k
= dhcp_reset_hostname(link
);
761 link
->dhcp_lease
= sd_dhcp_lease_unref(link
->dhcp_lease
);
764 /* If one of the above failed. Do not request nexthops and routes. */
768 r
= link_request_static_nexthops(link
, true);
772 return link_request_static_routes(link
, true);
775 static int dhcp4_address_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, Request
*req
, Link
*link
, Address
*address
) {
780 r
= address_configure_handler_internal(rtnl
, m
, link
, "Could not set DHCPv4 address");
784 r
= dhcp4_check_ready(link
);
786 link_enter_failed(link
);
791 static int dhcp4_request_address(Link
*link
, bool announce
) {
792 _cleanup_(address_freep
) Address
*addr
= NULL
;
793 struct in_addr address
, netmask
, server
;
796 usec_t lifetime_usec
;
800 assert(link
->manager
);
801 assert(link
->network
);
802 assert(link
->dhcp_lease
);
804 r
= sd_dhcp_lease_get_address(link
->dhcp_lease
, &address
);
806 return log_link_warning_errno(link
, r
, "DHCP error: no address: %m");
808 r
= sd_dhcp_lease_get_netmask(link
->dhcp_lease
, &netmask
);
810 return log_link_warning_errno(link
, r
, "DHCP error: no netmask: %m");
812 r
= sd_dhcp_lease_get_server_identifier(link
->dhcp_lease
, &server
);
814 return log_link_debug_errno(link
, r
, "DHCP error: failed to get DHCP server IP address: %m");
816 if (!FLAGS_SET(link
->network
->keep_configuration
, KEEP_CONFIGURATION_DHCP
)) {
817 uint32_t lifetime_sec
;
820 r
= sd_dhcp_lease_get_lifetime(link
->dhcp_lease
, &lifetime_sec
);
822 return log_link_warning_errno(link
, r
, "DHCP error: no lifetime: %m");
824 assert_se(sd_event_now(link
->manager
->event
, CLOCK_BOOTTIME
, &now_usec
) >= 0);
825 lifetime_usec
= sec_to_usec(lifetime_sec
, now_usec
);
827 lifetime_usec
= USEC_INFINITY
;
829 prefixlen
= in4_addr_netmask_to_prefixlen(&netmask
);
832 const struct in_addr
*router
;
834 r
= sd_dhcp_lease_get_router(link
->dhcp_lease
, &router
);
835 if (r
< 0 && r
!= -ENODATA
)
836 return log_link_error_errno(link
, r
, "DHCP error: Could not get gateway: %m");
838 if (r
> 0 && in4_addr_is_set(&router
[0]))
840 LOG_LINK_INTERFACE(link
),
841 LOG_LINK_MESSAGE(link
, "DHCPv4 address "IPV4_ADDRESS_FMT_STR
"/%u, gateway "IPV4_ADDRESS_FMT_STR
" acquired from "IPV4_ADDRESS_FMT_STR
,
842 IPV4_ADDRESS_FMT_VAL(address
),
844 IPV4_ADDRESS_FMT_VAL(router
[0]),
845 IPV4_ADDRESS_FMT_VAL(server
)),
846 "ADDRESS="IPV4_ADDRESS_FMT_STR
, IPV4_ADDRESS_FMT_VAL(address
),
847 "PREFIXLEN=%u", prefixlen
,
848 "GATEWAY="IPV4_ADDRESS_FMT_STR
, IPV4_ADDRESS_FMT_VAL(router
[0]));
851 LOG_LINK_INTERFACE(link
),
852 LOG_LINK_MESSAGE(link
, "DHCPv4 address "IPV4_ADDRESS_FMT_STR
"/%u acquired from "IPV4_ADDRESS_FMT_STR
,
853 IPV4_ADDRESS_FMT_VAL(address
),
855 IPV4_ADDRESS_FMT_VAL(server
)),
856 "ADDRESS="IPV4_ADDRESS_FMT_STR
, IPV4_ADDRESS_FMT_VAL(address
),
857 "PREFIXLEN=%u", prefixlen
);
860 r
= address_new(&addr
);
864 addr
->source
= NETWORK_CONFIG_SOURCE_DHCP4
;
865 addr
->provider
.in
= server
;
866 addr
->family
= AF_INET
;
867 addr
->in_addr
.in
.s_addr
= address
.s_addr
;
868 addr
->lifetime_preferred_usec
= lifetime_usec
;
869 addr
->lifetime_valid_usec
= lifetime_usec
;
870 addr
->prefixlen
= prefixlen
;
871 address_set_broadcast(addr
, link
);
872 SET_FLAG(addr
->flags
, IFA_F_NOPREFIXROUTE
, !link_prefixroute(link
));
873 addr
->route_metric
= link
->network
->dhcp_route_metric
;
874 addr
->duplicate_address_detection
= link
->network
->dhcp_send_decline
? ADDRESS_FAMILY_IPV4
: ADDRESS_FAMILY_NO
;
876 r
= free_and_strdup_warn(&addr
->label
, link
->network
->dhcp_label
);
880 r
= free_and_strdup_warn(&addr
->netlabel
, link
->network
->dhcp_netlabel
);
884 if (address_get(link
, addr
, &existing
) < 0) /* The address is new. */
885 link
->dhcp4_configured
= false;
887 address_unmark(existing
);
889 r
= link_request_address(link
, TAKE_PTR(addr
), true, &link
->dhcp4_messages
,
890 dhcp4_address_handler
, NULL
);
892 return log_link_error_errno(link
, r
, "Failed to request DHCPv4 address: %m");
897 static int dhcp4_request_address_and_routes(Link
*link
, bool announce
) {
902 link_mark_addresses(link
, NETWORK_CONFIG_SOURCE_DHCP4
, NULL
);
903 link_mark_routes(link
, NETWORK_CONFIG_SOURCE_DHCP4
, NULL
);
905 r
= dhcp4_request_address(link
, announce
);
909 r
= dhcp4_request_routes(link
);
913 if (!link
->dhcp4_configured
) {
914 link_set_state(link
, LINK_STATE_CONFIGURING
);
915 link_check_ready(link
);
921 static int dhcp_lease_renew(sd_dhcp_client
*client
, Link
*link
) {
922 _cleanup_(sd_dhcp_lease_unrefp
) sd_dhcp_lease
*old_lease
= NULL
;
923 sd_dhcp_lease
*lease
;
927 assert(link
->network
);
930 r
= sd_dhcp_client_get_lease(client
, &lease
);
932 return log_link_warning_errno(link
, r
, "DHCP error: no lease: %m");
934 old_lease
= TAKE_PTR(link
->dhcp_lease
);
935 link
->dhcp_lease
= sd_dhcp_lease_ref(lease
);
938 if (link
->network
->dhcp_use_6rd
) {
939 if (dhcp4_lease_has_pd_prefix(link
->dhcp_lease
)) {
940 r
= dhcp4_pd_prefix_acquired(link
);
942 return log_link_warning_errno(link
, r
, "Failed to process 6rd option: %m");
943 } else if (dhcp4_lease_has_pd_prefix(old_lease
))
944 dhcp4_pd_prefix_lost(link
);
947 return dhcp4_request_address_and_routes(link
, false);
950 static int dhcp_lease_acquired(sd_dhcp_client
*client
, Link
*link
) {
951 sd_dhcp_lease
*lease
;
957 r
= sd_dhcp_client_get_lease(client
, &lease
);
959 return log_link_error_errno(link
, r
, "DHCP error: No lease: %m");
961 sd_dhcp_lease_unref(link
->dhcp_lease
);
962 link
->dhcp_lease
= sd_dhcp_lease_ref(lease
);
965 if (link
->network
->dhcp_use_mtu
) {
968 r
= sd_dhcp_lease_get_mtu(lease
, &mtu
);
970 r
= link_request_to_set_mtu(link
, mtu
);
972 log_link_error_errno(link
, r
, "Failed to set MTU to %" PRIu16
": %m", mtu
);
976 if (link
->network
->dhcp_use_hostname
) {
977 const char *dhcpname
= NULL
;
978 _cleanup_free_
char *hostname
= NULL
;
980 if (link
->network
->dhcp_hostname
)
981 dhcpname
= link
->network
->dhcp_hostname
;
983 (void) sd_dhcp_lease_get_hostname(lease
, &dhcpname
);
986 r
= shorten_overlong(dhcpname
, &hostname
);
988 log_link_warning_errno(link
, r
, "Unable to shorten overlong DHCP hostname '%s', ignoring: %m", dhcpname
);
990 log_link_notice(link
, "Overlong DHCP hostname received, shortened from '%s' to '%s'", dhcpname
, hostname
);
994 r
= manager_set_hostname(link
->manager
, hostname
);
996 log_link_error_errno(link
, r
, "Failed to set transient hostname to '%s': %m", hostname
);
1000 if (link
->network
->dhcp_use_timezone
) {
1001 const char *tz
= NULL
;
1003 (void) sd_dhcp_lease_get_timezone(link
->dhcp_lease
, &tz
);
1006 r
= manager_set_timezone(link
->manager
, tz
);
1008 log_link_error_errno(link
, r
, "Failed to set timezone to '%s': %m", tz
);
1012 if (link
->network
->dhcp_use_6rd
&&
1013 dhcp4_lease_has_pd_prefix(link
->dhcp_lease
)) {
1014 r
= dhcp4_pd_prefix_acquired(link
);
1016 return log_link_warning_errno(link
, r
, "Failed to process 6rd option: %m");
1019 return dhcp4_request_address_and_routes(link
, true);
1022 static int dhcp_lease_ip_change(sd_dhcp_client
*client
, Link
*link
) {
1025 r
= dhcp_lease_acquired(client
, link
);
1027 (void) dhcp4_lease_lost(link
);
1032 static int dhcp_server_is_filtered(Link
*link
, sd_dhcp_client
*client
) {
1033 sd_dhcp_lease
*lease
;
1034 struct in_addr addr
;
1038 assert(link
->network
);
1041 r
= sd_dhcp_client_get_lease(client
, &lease
);
1043 return log_link_error_errno(link
, r
, "Failed to get DHCP lease: %m");
1045 r
= sd_dhcp_lease_get_server_identifier(lease
, &addr
);
1047 return log_link_debug_errno(link
, r
, "Failed to get DHCP server IP address: %m");
1049 if (in4_address_is_filtered(&addr
, link
->network
->dhcp_allow_listed_ip
, link
->network
->dhcp_deny_listed_ip
)) {
1050 if (DEBUG_LOGGING
) {
1051 if (link
->network
->dhcp_allow_listed_ip
)
1052 log_link_debug(link
, "DHCPv4 server IP address "IPV4_ADDRESS_FMT_STR
" not found in allow-list, ignoring offer.",
1053 IPV4_ADDRESS_FMT_VAL(addr
));
1055 log_link_debug(link
, "DHCPv4 server IP address "IPV4_ADDRESS_FMT_STR
" found in deny-list, ignoring offer.",
1056 IPV4_ADDRESS_FMT_VAL(addr
));
1065 static int dhcp4_handler(sd_dhcp_client
*client
, int event
, void *userdata
) {
1066 Link
*link
= ASSERT_PTR(userdata
);
1069 assert(link
->network
);
1070 assert(link
->manager
);
1072 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1076 case SD_DHCP_CLIENT_EVENT_STOP
:
1078 log_link_debug(link
, "DHCP client is stopped. Acquiring IPv4 link-local address");
1080 if (in4_addr_is_set(&link
->network
->ipv4ll_start_address
)) {
1081 r
= sd_ipv4ll_set_address(link
->ipv4ll
, &link
->network
->ipv4ll_start_address
);
1083 return log_link_warning_errno(link
, r
, "Could not set IPv4 link-local start address: %m");
1086 r
= sd_ipv4ll_start(link
->ipv4ll
);
1088 return log_link_warning_errno(link
, r
, "Could not acquire IPv4 link-local address: %m");
1091 if (FLAGS_SET(link
->network
->keep_configuration
, KEEP_CONFIGURATION_DHCP
)) {
1092 log_link_notice(link
, "DHCPv4 connection considered critical, ignoring request to reconfigure it.");
1096 if (link
->dhcp_lease
) {
1097 if (link
->network
->dhcp_send_release
) {
1098 r
= sd_dhcp_client_send_release(client
);
1100 log_link_full_errno(link
,
1101 ERRNO_IS_DISCONNECT(r
) ? LOG_DEBUG
: LOG_WARNING
,
1102 r
, "Failed to send DHCP RELEASE, ignoring: %m");
1105 r
= dhcp4_lease_lost(link
);
1107 link_enter_failed(link
);
1113 case SD_DHCP_CLIENT_EVENT_EXPIRED
:
1114 if (FLAGS_SET(link
->network
->keep_configuration
, KEEP_CONFIGURATION_DHCP
)) {
1115 log_link_notice(link
, "DHCPv4 connection considered critical, ignoring request to reconfigure it.");
1119 if (link
->dhcp_lease
) {
1120 r
= dhcp4_lease_lost(link
);
1122 link_enter_failed(link
);
1128 case SD_DHCP_CLIENT_EVENT_IP_CHANGE
:
1129 if (FLAGS_SET(link
->network
->keep_configuration
, KEEP_CONFIGURATION_DHCP
)) {
1130 log_link_notice(link
, "DHCPv4 connection considered critical, ignoring request to reconfigure it.");
1134 r
= dhcp_lease_ip_change(client
, link
);
1136 link_enter_failed(link
);
1141 case SD_DHCP_CLIENT_EVENT_RENEW
:
1142 r
= dhcp_lease_renew(client
, link
);
1144 link_enter_failed(link
);
1148 case SD_DHCP_CLIENT_EVENT_IP_ACQUIRE
:
1149 r
= dhcp_lease_acquired(client
, link
);
1151 link_enter_failed(link
);
1155 case SD_DHCP_CLIENT_EVENT_SELECTING
:
1156 r
= dhcp_server_is_filtered(link
, client
);
1158 link_enter_failed(link
);
1165 case SD_DHCP_CLIENT_EVENT_TRANSIENT_FAILURE
:
1166 if (link
->ipv4ll
&& !sd_ipv4ll_is_running(link
->ipv4ll
)) {
1167 log_link_debug(link
, "Problems acquiring DHCP lease, acquiring IPv4 link-local address");
1169 if (in4_addr_is_set(&link
->network
->ipv4ll_start_address
)) {
1170 r
= sd_ipv4ll_set_address(link
->ipv4ll
, &link
->network
->ipv4ll_start_address
);
1172 return log_link_warning_errno(link
, r
, "Could not set IPv4 link-local start address: %m");
1175 r
= sd_ipv4ll_start(link
->ipv4ll
);
1177 return log_link_warning_errno(link
, r
, "Could not acquire IPv4 link-local address: %m");
1183 log_link_warning_errno(link
, event
, "DHCP error: Client failed: %m");
1185 log_link_warning(link
, "DHCP unknown event: %i", event
);
1192 static int dhcp4_set_hostname(Link
*link
) {
1193 _cleanup_free_
char *hostname
= NULL
;
1199 if (!link
->network
->dhcp_send_hostname
)
1201 else if (link
->network
->dhcp_hostname
)
1202 hn
= link
->network
->dhcp_hostname
;
1204 r
= gethostname_strict(&hostname
);
1205 if (r
< 0 && r
!= -ENXIO
) /* ENXIO: no hostname set or hostname is "localhost" */
1206 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to get hostname: %m");
1211 r
= sd_dhcp_client_set_hostname(link
->dhcp_client
, hn
);
1212 if (r
== -EINVAL
&& hostname
)
1213 /* Ignore error when the machine's hostname is not suitable to send in DHCP packet. */
1214 log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set hostname from kernel hostname, ignoring: %m");
1216 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set hostname: %m");
1221 static int dhcp4_set_client_identifier(Link
*link
) {
1225 assert(link
->network
);
1226 assert(link
->dhcp_client
);
1228 switch (link
->network
->dhcp_client_identifier
) {
1229 case DHCP_CLIENT_ID_DUID
: {
1230 /* If configured, apply user specified DUID and IAID */
1231 const DUID
*duid
= link_get_dhcp4_duid(link
);
1233 if (duid
->type
== DUID_TYPE_LLT
&& duid
->raw_data_len
== 0)
1234 r
= sd_dhcp_client_set_iaid_duid_llt(link
->dhcp_client
,
1235 link
->network
->dhcp_iaid_set
,
1236 link
->network
->dhcp_iaid
,
1239 r
= sd_dhcp_client_set_iaid_duid(link
->dhcp_client
,
1240 link
->network
->dhcp_iaid_set
,
1241 link
->network
->dhcp_iaid
,
1243 duid
->raw_data_len
> 0 ? duid
->raw_data
: NULL
,
1244 duid
->raw_data_len
);
1246 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set IAID+DUID: %m");
1249 case DHCP_CLIENT_ID_DUID_ONLY
: {
1250 /* If configured, apply user specified DUID */
1251 const DUID
*duid
= link_get_dhcp4_duid(link
);
1253 if (duid
->type
== DUID_TYPE_LLT
&& duid
->raw_data_len
== 0)
1254 r
= sd_dhcp_client_set_duid_llt(link
->dhcp_client
,
1257 r
= sd_dhcp_client_set_duid(link
->dhcp_client
,
1259 duid
->raw_data_len
> 0 ? duid
->raw_data
: NULL
,
1260 duid
->raw_data_len
);
1262 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set DUID: %m");
1265 case DHCP_CLIENT_ID_MAC
: {
1266 const uint8_t *hw_addr
= link
->hw_addr
.bytes
;
1267 size_t hw_addr_len
= link
->hw_addr
.length
;
1269 if (link
->iftype
== ARPHRD_INFINIBAND
&& hw_addr_len
== INFINIBAND_ALEN
) {
1270 /* set_client_id expects only last 8 bytes of an IB address */
1271 hw_addr
+= INFINIBAND_ALEN
- 8;
1272 hw_addr_len
-= INFINIBAND_ALEN
- 8;
1275 r
= sd_dhcp_client_set_client_id(link
->dhcp_client
,
1280 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set client ID: %m");
1284 assert_not_reached();
1290 static int dhcp4_set_request_address(Link
*link
) {
1294 assert(link
->network
);
1295 assert(link
->dhcp_client
);
1297 if (!FLAGS_SET(link
->network
->keep_configuration
, KEEP_CONFIGURATION_DHCP
))
1300 SET_FOREACH(a
, link
->addresses
) {
1301 if (a
->source
!= NETWORK_CONFIG_SOURCE_FOREIGN
)
1303 if (a
->family
!= AF_INET
)
1305 if (link_address_is_dynamic(link
, a
))
1312 log_link_debug(link
, "DHCPv4 CLIENT: requesting " IPV4_ADDRESS_FMT_STR
, IPV4_ADDRESS_FMT_VAL(a
->in_addr
.in
));
1314 return sd_dhcp_client_set_request_address(link
->dhcp_client
, &a
->in_addr
.in
);
1317 static bool link_needs_dhcp_broadcast(Link
*link
) {
1322 assert(link
->network
);
1324 /* Return the setting in DHCP[4].RequestBroadcast if specified. Otherwise return the device property
1325 * ID_NET_DHCP_BROADCAST setting, which may be set for interfaces requiring that the DHCPOFFER message
1326 * is being broadcast because they can't handle unicast messages while not fully configured.
1327 * If neither is set or a failure occurs, return false, which is the default for this flag.
1329 r
= link
->network
->dhcp_broadcast
;
1330 if (r
< 0 && link
->dev
&& sd_device_get_property_value(link
->dev
, "ID_NET_DHCP_BROADCAST", &val
) >= 0) {
1331 r
= parse_boolean(val
);
1333 log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to parse ID_NET_DHCP_BROADCAST, ignoring: %m");
1335 log_link_debug(link
, "DHCPv4 CLIENT: Detected ID_NET_DHCP_BROADCAST='%d'.", r
);
1341 static int dhcp4_configure(Link
*link
) {
1342 sd_dhcp_option
*send_option
;
1343 void *request_options
;
1347 assert(link
->network
);
1349 if (link
->dhcp_client
)
1350 return log_link_debug_errno(link
, SYNTHETIC_ERRNO(EBUSY
), "DHCPv4 client is already configured.");
1352 r
= sd_dhcp_client_new(&link
->dhcp_client
, link
->network
->dhcp_anonymize
);
1354 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to allocate DHCPv4 client: %m");
1356 r
= sd_dhcp_client_attach_event(link
->dhcp_client
, link
->manager
->event
, 0);
1358 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to attach event to DHCPv4 client: %m");
1360 r
= sd_dhcp_client_set_mac(link
->dhcp_client
,
1361 link
->hw_addr
.bytes
,
1362 link
->bcast_addr
.length
> 0 ? link
->bcast_addr
.bytes
: NULL
,
1363 link
->hw_addr
.length
, link
->iftype
);
1365 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set MAC address: %m");
1367 r
= sd_dhcp_client_set_ifindex(link
->dhcp_client
, link
->ifindex
);
1369 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set ifindex: %m");
1371 r
= sd_dhcp_client_set_callback(link
->dhcp_client
, dhcp4_handler
, link
);
1373 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set callback: %m");
1375 r
= sd_dhcp_client_set_request_broadcast(link
->dhcp_client
, link_needs_dhcp_broadcast(link
));
1377 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set request flag for broadcast: %m");
1379 if (link
->mtu
> 0) {
1380 r
= sd_dhcp_client_set_mtu(link
->dhcp_client
, link
->mtu
);
1382 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set MTU: %m");
1385 if (!link
->network
->dhcp_anonymize
) {
1386 if (link
->network
->dhcp_use_mtu
) {
1387 r
= sd_dhcp_client_set_request_option(link
->dhcp_client
, SD_DHCP_OPTION_MTU_INTERFACE
);
1389 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set request flag for MTU: %m");
1392 if (link
->network
->dhcp_use_routes
) {
1393 r
= sd_dhcp_client_set_request_option(link
->dhcp_client
, SD_DHCP_OPTION_STATIC_ROUTE
);
1395 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set request flag for static route: %m");
1397 r
= sd_dhcp_client_set_request_option(link
->dhcp_client
, SD_DHCP_OPTION_CLASSLESS_STATIC_ROUTE
);
1399 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set request flag for classless static route: %m");
1402 if (link
->network
->dhcp_use_domains
!= DHCP_USE_DOMAINS_NO
) {
1403 r
= sd_dhcp_client_set_request_option(link
->dhcp_client
, SD_DHCP_OPTION_DOMAIN_SEARCH
);
1405 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set request flag for domain search list: %m");
1408 if (link
->network
->dhcp_use_ntp
) {
1409 r
= sd_dhcp_client_set_request_option(link
->dhcp_client
, SD_DHCP_OPTION_NTP_SERVER
);
1411 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set request flag for NTP server: %m");
1414 if (link
->network
->dhcp_use_sip
) {
1415 r
= sd_dhcp_client_set_request_option(link
->dhcp_client
, SD_DHCP_OPTION_SIP_SERVER
);
1417 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set request flag for SIP server: %m");
1420 if (link
->network
->dhcp_use_timezone
) {
1421 r
= sd_dhcp_client_set_request_option(link
->dhcp_client
, SD_DHCP_OPTION_TZDB_TIMEZONE
);
1423 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set request flag for timezone: %m");
1426 if (link
->network
->dhcp_use_6rd
) {
1427 r
= sd_dhcp_client_set_request_option(link
->dhcp_client
, SD_DHCP_OPTION_6RD
);
1429 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set request flag for 6rd: %m");
1432 SET_FOREACH(request_options
, link
->network
->dhcp_request_options
) {
1433 uint32_t option
= PTR_TO_UINT32(request_options
);
1435 r
= sd_dhcp_client_set_request_option(link
->dhcp_client
, option
);
1437 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set request flag for '%u': %m", option
);
1440 ORDERED_HASHMAP_FOREACH(send_option
, link
->network
->dhcp_client_send_options
) {
1441 r
= sd_dhcp_client_add_option(link
->dhcp_client
, send_option
);
1445 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set send option: %m");
1448 ORDERED_HASHMAP_FOREACH(send_option
, link
->network
->dhcp_client_send_vendor_options
) {
1449 r
= sd_dhcp_client_add_vendor_option(link
->dhcp_client
, send_option
);
1453 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set send option: %m");
1456 r
= dhcp4_set_hostname(link
);
1460 if (link
->network
->dhcp_vendor_class_identifier
) {
1461 r
= sd_dhcp_client_set_vendor_class_identifier(link
->dhcp_client
,
1462 link
->network
->dhcp_vendor_class_identifier
);
1464 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set vendor class identifier: %m");
1467 if (link
->network
->dhcp_mudurl
) {
1468 r
= sd_dhcp_client_set_mud_url(link
->dhcp_client
, link
->network
->dhcp_mudurl
);
1470 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set MUD URL: %m");
1473 if (link
->network
->dhcp_user_class
) {
1474 r
= sd_dhcp_client_set_user_class(link
->dhcp_client
, link
->network
->dhcp_user_class
);
1476 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set user class: %m");
1480 if (link
->network
->dhcp_client_port
> 0) {
1481 r
= sd_dhcp_client_set_client_port(link
->dhcp_client
, link
->network
->dhcp_client_port
);
1483 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set listen port: %m");
1486 if (link
->network
->dhcp_max_attempts
> 0) {
1487 r
= sd_dhcp_client_set_max_attempts(link
->dhcp_client
, link
->network
->dhcp_max_attempts
);
1489 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set max attempts: %m");
1492 if (link
->network
->dhcp_ip_service_type
>= 0) {
1493 r
= sd_dhcp_client_set_service_type(link
->dhcp_client
, link
->network
->dhcp_ip_service_type
);
1495 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set IP service type: %m");
1498 if (link
->network
->dhcp_fallback_lease_lifetime
> 0) {
1499 r
= sd_dhcp_client_set_fallback_lease_lifetime(link
->dhcp_client
, link
->network
->dhcp_fallback_lease_lifetime
);
1501 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed set to lease lifetime: %m");
1504 r
= dhcp4_set_request_address(link
);
1506 return log_link_debug_errno(link
, r
, "DHCPv4 CLIENT: Failed to set initial DHCPv4 address: %m");
1508 return dhcp4_set_client_identifier(link
);
1511 int dhcp4_update_mac(Link
*link
) {
1517 if (!link
->dhcp_client
)
1520 restart
= sd_dhcp_client_is_running(link
->dhcp_client
);
1522 r
= sd_dhcp_client_stop(link
->dhcp_client
);
1526 r
= sd_dhcp_client_set_mac(link
->dhcp_client
,
1527 link
->hw_addr
.bytes
,
1528 link
->bcast_addr
.length
> 0 ? link
->bcast_addr
.bytes
: NULL
,
1529 link
->hw_addr
.length
, link
->iftype
);
1533 r
= dhcp4_set_client_identifier(link
);
1538 r
= sd_dhcp_client_start(link
->dhcp_client
);
1546 int dhcp4_start(Link
*link
) {
1551 if (!link
->dhcp_client
)
1554 if (!link_has_carrier(link
))
1557 if (sd_dhcp_client_is_running(link
->dhcp_client
) > 0)
1560 r
= sd_dhcp_client_start(link
->dhcp_client
);
1567 static int dhcp4_configure_duid(Link
*link
) {
1570 if (!IN_SET(link
->network
->dhcp_client_identifier
, DHCP_CLIENT_ID_DUID
, DHCP_CLIENT_ID_DUID_ONLY
))
1573 return dhcp_configure_duid(link
, link_get_dhcp4_duid(link
));
1576 static int dhcp4_process_request(Request
*req
, Link
*link
, void *userdata
) {
1581 if (!link_is_ready_to_configure(link
, /* allow_unmanaged = */ false))
1584 r
= dhcp4_configure_duid(link
);
1588 r
= dhcp4_configure(link
);
1590 return log_link_warning_errno(link
, r
, "Failed to configure DHCPv4 client: %m");
1592 r
= dhcp4_start(link
);
1594 return log_link_warning_errno(link
, r
, "Failed to start DHCPv4 client: %m");
1596 log_link_debug(link
, "DHCPv4 client is configured%s.",
1597 r
> 0 ? ", acquiring DHCPv4 lease" : "");
1601 int link_request_dhcp4_client(Link
*link
) {
1606 if (!link_dhcp4_enabled(link
))
1609 if (link
->dhcp_client
)
1612 r
= link_queue_request(link
, REQUEST_TYPE_DHCP4_CLIENT
, dhcp4_process_request
, NULL
);
1614 return log_link_warning_errno(link
, r
, "Failed to request configuring of the DHCPv4 client: %m");
1616 log_link_debug(link
, "Requested configuring of the DHCPv4 client.");
1620 int config_parse_dhcp_max_attempts(
1622 const char *filename
,
1624 const char *section
,
1625 unsigned section_line
,
1632 Network
*network
= ASSERT_PTR(data
);
1639 if (isempty(rvalue
)) {
1640 network
->dhcp_max_attempts
= 0;
1644 if (streq(rvalue
, "infinity")) {
1645 network
->dhcp_max_attempts
= UINT64_MAX
;
1649 r
= safe_atou64(rvalue
, &a
);
1651 log_syntax(unit
, LOG_WARNING
, filename
, line
, r
,
1652 "Failed to parse DHCP maximum attempts, ignoring: %s", rvalue
);
1657 log_syntax(unit
, LOG_WARNING
, filename
, line
, 0,
1658 "%s= must be positive integer or 'infinity', ignoring: %s", lvalue
, rvalue
);
1662 network
->dhcp_max_attempts
= a
;
1667 int config_parse_dhcp_ip_service_type(
1669 const char *filename
,
1671 const char *section
,
1672 unsigned section_line
,
1679 int *tos
= ASSERT_PTR(data
);
1685 if (isempty(rvalue
))
1686 *tos
= -1; /* use sd_dhcp_client's default (currently, CS6). */
1687 else if (streq(rvalue
, "none"))
1689 else if (streq(rvalue
, "CS4"))
1690 *tos
= IPTOS_CLASS_CS4
;
1691 else if (streq(rvalue
, "CS6"))
1692 *tos
= IPTOS_CLASS_CS6
;
1694 log_syntax(unit
, LOG_WARNING
, filename
, line
, 0,
1695 "Failed to parse %s=, ignoring assignment: %s", lvalue
, rvalue
);
1700 int config_parse_dhcp_fallback_lease_lifetime(
1702 const char *filename
,
1704 const char *section
,
1705 unsigned section_line
,
1712 Network
*network
= userdata
;
1720 if (isempty(rvalue
)) {
1721 network
->dhcp_fallback_lease_lifetime
= 0;
1725 /* We accept only "forever" or "infinity". */
1726 if (!STR_IN_SET(rvalue
, "forever", "infinity")) {
1727 log_syntax(unit
, LOG_WARNING
, filename
, line
, 0,
1728 "Invalid LeaseLifetime= value, ignoring: %s", rvalue
);
1732 network
->dhcp_fallback_lease_lifetime
= UINT32_MAX
;
1737 int config_parse_dhcp_label(
1739 const char *filename
,
1741 const char *section
,
1742 unsigned section_line
,
1749 char **label
= ASSERT_PTR(data
);
1755 if (isempty(rvalue
)) {
1756 *label
= mfree(*label
);
1760 if (!address_label_valid(rvalue
)) {
1761 log_syntax(unit
, LOG_WARNING
, filename
, line
, 0,
1762 "Address label is too long or invalid, ignoring assignment: %s", rvalue
);
1766 return free_and_strdup_warn(label
, rvalue
);
1769 static const char* const dhcp_client_identifier_table
[_DHCP_CLIENT_ID_MAX
] = {
1770 [DHCP_CLIENT_ID_MAC
] = "mac",
1771 [DHCP_CLIENT_ID_DUID
] = "duid",
1772 [DHCP_CLIENT_ID_DUID_ONLY
] = "duid-only",
1775 DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(dhcp_client_identifier
, DHCPClientIdentifier
);
1776 DEFINE_CONFIG_PARSE_ENUM(config_parse_dhcp_client_identifier
, dhcp_client_identifier
, DHCPClientIdentifier
,
1777 "Failed to parse client identifier type");