1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Tom Gundersen <teg@jklm.no>
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 #include <netinet/ether.h>
26 #include "networkd-link.h"
27 #include "networkd-netdev.h"
28 #include "libudev-private.h"
29 #include "udev-util.h"
33 #include "network-internal.h"
34 #include "conf-parser.h"
36 #include "dhcp-lease-internal.h"
38 static int link_new(Manager
*manager
, sd_rtnl_message
*message
, Link
**ret
) {
39 _cleanup_link_unref_ Link
*link
= NULL
;
48 r
= sd_rtnl_message_get_type(message
, &type
);
51 else if (type
!= RTM_NEWLINK
)
54 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
57 else if (ifindex
<= 0)
60 r
= sd_rtnl_message_read_string(message
, IFLA_IFNAME
, &ifname
);
69 link
->manager
= manager
;
70 link
->state
= LINK_STATE_INITIALIZING
;
71 link
->ifindex
= ifindex
;
72 link
->ifname
= strdup(ifname
);
76 r
= sd_rtnl_message_read_ether_addr(message
, IFLA_ADDRESS
, &link
->mac
);
78 log_debug_link(link
, "MAC address not found for new device, continuing without");
80 r
= asprintf(&link
->state_file
, "/run/systemd/netif/links/%d", link
->ifindex
);
84 r
= asprintf(&link
->lease_file
, "/run/systemd/netif/leases/%d", link
->ifindex
);
88 r
= hashmap_ensure_allocated(&manager
->links
, NULL
, NULL
);
92 r
= hashmap_put(manager
->links
, INT_TO_PTR(link
->ifindex
), link
);
102 static void link_free(Link
*link
) {
108 while ((address
= link
->addresses
)) {
109 LIST_REMOVE(addresses
, link
->addresses
, address
);
110 address_free(address
);
113 while ((address
= link
->pool_addresses
)) {
114 LIST_REMOVE(addresses
, link
->pool_addresses
, address
);
115 address_free(address
);
118 sd_dhcp_client_unref(link
->dhcp_client
);
119 sd_dhcp_lease_unref(link
->dhcp_lease
);
121 unlink(link
->lease_file
);
122 free(link
->lease_file
);
124 sd_ipv4ll_unref(link
->ipv4ll
);
125 sd_dhcp6_client_unref(link
->dhcp6_client
);
126 sd_icmp6_nd_unref(link
->icmp6_router_discovery
);
129 hashmap_remove(link
->manager
->links
, INT_TO_PTR(link
->ifindex
));
133 unlink(link
->state_file
);
134 free(link
->state_file
);
136 udev_device_unref(link
->udev_device
);
141 Link
*link_unref(Link
*link
) {
142 if (link
&& (-- link
->n_ref
<= 0))
148 Link
*link_ref(Link
*link
) {
150 assert_se(++ link
->n_ref
>= 2);
155 int link_get(Manager
*m
, int ifindex
, Link
**ret
) {
162 link
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
171 void link_drop(Link
*link
) {
172 if (!link
|| link
->state
== LINK_STATE_LINGER
)
175 link
->state
= LINK_STATE_LINGER
;
177 log_debug_link(link
, "link removed");
184 static void link_enter_unmanaged(Link
*link
) {
187 log_debug_link(link
, "unmanaged");
189 link
->state
= LINK_STATE_UNMANAGED
;
194 static int link_stop_clients(Link
*link
) {
198 assert(link
->manager
);
199 assert(link
->manager
->event
);
204 if (link
->dhcp_client
) {
205 k
= sd_dhcp_client_stop(link
->dhcp_client
);
207 log_warning_link(link
, "Could not stop DHCPv4 client: %s", strerror(-r
));
213 k
= sd_ipv4ll_stop(link
->ipv4ll
);
215 log_warning_link(link
, "Could not stop IPv4 link-local: %s", strerror(-r
));
220 if (link
->dhcp_server
) {
221 k
= sd_dhcp_server_stop(link
->dhcp_server
);
223 log_warning_link(link
, "Could not stop DHCPv4 server: %s", strerror(-r
));
228 if(link
->icmp6_router_discovery
) {
230 if (link
->dhcp6_client
) {
231 k
= sd_dhcp6_client_stop(link
->dhcp6_client
);
233 log_warning_link(link
, "Could not stop DHCPv6 client: %s", strerror(-r
));
238 k
= sd_icmp6_nd_stop(link
->icmp6_router_discovery
);
240 log_warning_link(link
, "Could not stop ICMPv6 router discovery: %s", strerror(-r
));
248 void link_enter_failed(Link
*link
) {
251 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
254 log_warning_link(link
, "failed");
256 link
->state
= LINK_STATE_FAILED
;
258 link_stop_clients(link
);
263 void link_client_handler(Link
*link
) {
266 if (link
->ipv4ll_address
&& link
->ipv4ll_route
)
267 log_debug_link(link
, "IPv4LL configured");
269 log_debug_link(link
, "IPv4LL not configured");
274 static Address
* link_find_dhcp_server_address(Link
*link
) {
278 assert(link
->network
);
280 /* The the first statically configured address if there is any */
281 LIST_FOREACH(addresses
, address
, link
->network
->static_addresses
) {
283 if (address
->family
!= AF_INET
)
286 if (in_addr_is_null(address
->family
, &address
->in_addr
))
292 /* If that didn't work, find a suitable address we got from the pool */
293 LIST_FOREACH(addresses
, address
, link
->pool_addresses
) {
294 if (address
->family
!= AF_INET
)
303 static int link_enter_configured(Link
*link
) {
307 assert(link
->network
);
308 assert(link
->state
== LINK_STATE_SETTING_ROUTES
);
310 if (link
->network
->dhcp_server
&&
311 !sd_dhcp_server_is_running(link
->dhcp_server
)) {
312 struct in_addr pool_start
;
315 address
= link_find_dhcp_server_address(link
);
317 log_warning_link(link
, "Failed to find suitable address for DHCPv4 server instance.");
318 link_enter_failed(link
);
322 log_debug_link(link
, "offering DHCPv4 leases");
324 r
= sd_dhcp_server_set_address(link
->dhcp_server
, &address
->in_addr
.in
, address
->prefixlen
);
328 /* offer 32 addresses starting from the address following the server address */
329 pool_start
.s_addr
= htobe32(be32toh(address
->in_addr
.in
.s_addr
) + 1);
330 r
= sd_dhcp_server_set_lease_pool(link
->dhcp_server
,
336 r = sd_dhcp_server_set_router(link->dhcp_server,
337 &main_address->in_addr.in);
341 r = sd_dhcp_server_set_prefixlen(link->dhcp_server,
342 main_address->prefixlen);
347 r
= sd_dhcp_server_start(link
->dhcp_server
);
349 log_warning_link(link
, "could not start DHCPv4 server "
350 "instance: %s", strerror(-r
));
352 link_enter_failed(link
);
358 log_info_link(link
, "link configured");
360 link
->state
= LINK_STATE_CONFIGURED
;
367 static int route_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
368 _cleanup_link_unref_ Link
*link
= userdata
;
371 assert(link
->route_messages
> 0);
372 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
373 LINK_STATE_SETTING_ROUTES
, LINK_STATE_FAILED
,
376 link
->route_messages
--;
378 if (IN_SET(LINK_STATE_FAILED
, LINK_STATE_LINGER
))
381 r
= sd_rtnl_message_get_errno(m
);
382 if (r
< 0 && r
!= -EEXIST
)
383 log_struct_link(LOG_WARNING
, link
,
384 "MESSAGE=%-*s: could not set route: %s",
386 link
->ifname
, strerror(-r
),
390 /* we might have received an old reply after moving back to SETTING_ADDRESSES,
392 if (link
->route_messages
== 0 && link
->state
== LINK_STATE_SETTING_ROUTES
) {
393 log_debug_link(link
, "routes set");
394 link_enter_configured(link
);
400 static int link_set_dhcp_routes(Link
*link
) {
401 struct sd_dhcp_route
*static_routes
;
406 n
= sd_dhcp_lease_get_routes(link
->dhcp_lease
, &static_routes
);
409 log_warning_link(link
, "DHCP error: could not get routes: %s", strerror(-n
));
413 for (i
= 0; i
< n
; i
++) {
414 _cleanup_route_free_ Route
*route
= NULL
;
416 r
= route_new_dynamic(&route
, RTPROT_DHCP
);
418 log_error_link(link
, "Could not allocate route: %s",
423 route
->family
= AF_INET
;
424 route
->in_addr
.in
= static_routes
[i
].gw_addr
;
425 route
->dst_addr
.in
= static_routes
[i
].dst_addr
;
426 route
->dst_prefixlen
= static_routes
[i
].dst_prefixlen
;
427 route
->metrics
= DHCP_ROUTE_METRIC
;
429 r
= route_configure(route
, link
, &route_handler
);
431 log_warning_link(link
,
432 "could not set host route: %s", strerror(-r
));
436 link
->route_messages
++;
442 static int link_enter_set_routes(Link
*link
) {
447 assert(link
->network
);
448 assert(link
->state
== LINK_STATE_SETTING_ADDRESSES
);
450 link
->state
= LINK_STATE_SETTING_ROUTES
;
452 LIST_FOREACH(routes
, rt
, link
->network
->static_routes
) {
453 r
= route_configure(rt
, link
, &route_handler
);
455 log_warning_link(link
,
456 "could not set routes: %s", strerror(-r
));
457 link_enter_failed(link
);
461 link
->route_messages
++;
464 if (link
->dhcp_lease
) {
465 _cleanup_route_free_ Route
*route
= NULL
;
466 _cleanup_route_free_ Route
*route_gw
= NULL
;
467 struct in_addr gateway
;
469 r
= sd_dhcp_lease_get_router(link
->dhcp_lease
, &gateway
);
470 if (r
< 0 && r
!= -ENOENT
) {
471 log_warning_link(link
, "DHCP error: could not get gateway: %s",
477 r
= route_new_dynamic(&route
, RTPROT_DHCP
);
479 log_error_link(link
, "Could not allocate route: %s",
484 r
= route_new_dynamic(&route_gw
, RTPROT_DHCP
);
486 log_error_link(link
, "Could not allocate route: %s",
491 /* The dhcp netmask may mask out the gateway. Add an explicit
492 * route for the gw host so that we can route no matter the
493 * netmask or existing kernel route tables. */
494 route_gw
->family
= AF_INET
;
495 route_gw
->dst_addr
.in
= gateway
;
496 route_gw
->dst_prefixlen
= 32;
497 route_gw
->scope
= RT_SCOPE_LINK
;
498 route_gw
->metrics
= DHCP_ROUTE_METRIC
;
500 r
= route_configure(route_gw
, link
, &route_handler
);
502 log_warning_link(link
,
503 "could not set host route: %s", strerror(-r
));
507 link
->route_messages
++;
509 route
->family
= AF_INET
;
510 route
->in_addr
.in
= gateway
;
511 route
->metrics
= DHCP_ROUTE_METRIC
;
513 r
= route_configure(route
, link
, &route_handler
);
515 log_warning_link(link
,
516 "could not set routes: %s", strerror(-r
));
517 link_enter_failed(link
);
521 link
->route_messages
++;
524 if (link
->network
->dhcp_routes
)
525 link_set_dhcp_routes(link
);
528 if (link
->route_messages
== 0) {
529 link_enter_configured(link
);
531 log_debug_link(link
, "setting routes");
536 int link_route_drop_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
537 _cleanup_link_unref_ Link
*link
= userdata
;
542 assert(link
->ifname
);
544 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
547 r
= sd_rtnl_message_get_errno(m
);
548 if (r
< 0 && r
!= -ESRCH
)
549 log_struct_link(LOG_WARNING
, link
,
550 "MESSAGE=%-*s: could not drop route: %s",
552 link
->ifname
, strerror(-r
),
559 int link_get_address_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
560 _cleanup_link_unref_ Link
*link
= userdata
;
566 assert(link
->manager
);
568 for (; m
; m
= sd_rtnl_message_next(m
)) {
569 r
= sd_rtnl_message_get_errno(m
);
571 log_debug_link(link
, "getting address failed: %s", strerror(-r
));
575 r
= link_rtnl_process_address(rtnl
, m
, link
->manager
);
577 log_warning_link(link
, "could not process address: %s", strerror(-r
));
583 static int address_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
584 _cleanup_link_unref_ Link
*link
= userdata
;
590 assert(link
->ifname
);
591 assert(link
->addr_messages
> 0);
592 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
593 LINK_STATE_FAILED
, LINK_STATE_LINGER
));
595 link
->addr_messages
--;
597 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
600 r
= sd_rtnl_message_get_errno(m
);
601 if (r
< 0 && r
!= -EEXIST
)
602 log_struct_link(LOG_WARNING
, link
,
603 "MESSAGE=%-*s: could not set address: %s",
605 link
->ifname
, strerror(-r
),
609 /* calling handler directly so take a ref */
611 link_get_address_handler(rtnl
, m
, link
);
614 if (link
->addr_messages
== 0) {
615 log_debug_link(link
, "addresses set");
616 link_enter_set_routes(link
);
622 static int link_enter_set_addresses(Link
*link
) {
625 uint32_t lifetime
= CACHE_INFO_INFINITY_LIFE_TIME
;
628 assert(link
->network
);
629 assert(link
->state
!= _LINK_STATE_INVALID
);
631 link
->state
= LINK_STATE_SETTING_ADDRESSES
;
633 LIST_FOREACH(addresses
, ad
, link
->network
->static_addresses
) {
634 r
= address_configure(ad
, link
, &address_handler
);
636 log_warning_link(link
,
637 "could not set addresses: %s", strerror(-r
));
638 link_enter_failed(link
);
642 link
->addr_messages
++;
645 if (link
->dhcp_lease
) {
646 _cleanup_address_free_ Address
*address
= NULL
;
648 struct in_addr netmask
;
651 r
= sd_dhcp_lease_get_address(link
->dhcp_lease
, &addr
);
653 log_warning_link(link
, "DHCP error: no address: %s",
658 if (!link
->network
->dhcp_critical
) {
659 r
= sd_dhcp_lease_get_lifetime(link
->dhcp_lease
,
662 log_warning_link(link
, "DHCP error: no lifetime: %s",
668 r
= sd_dhcp_lease_get_netmask(link
->dhcp_lease
, &netmask
);
670 log_warning_link(link
, "DHCP error: no netmask: %s",
675 prefixlen
= in_addr_netmask_to_prefixlen(&netmask
);
677 r
= address_new_dynamic(&address
);
679 log_error_link(link
, "Could not allocate address: %s",
684 address
->family
= AF_INET
;
685 address
->in_addr
.in
= addr
;
686 address
->cinfo
.ifa_prefered
= lifetime
;
687 address
->cinfo
.ifa_valid
= lifetime
;
688 address
->prefixlen
= prefixlen
;
689 address
->broadcast
.s_addr
= addr
.s_addr
| ~netmask
.s_addr
;
691 /* use update rather than configure so that we will update the lifetime
692 of an existing address if it has already been configured */
693 r
= address_update(address
, link
, &address_handler
);
695 log_warning_link(link
,
696 "could not set addresses: %s", strerror(-r
));
697 link_enter_failed(link
);
701 link
->addr_messages
++;
704 if (link
->addr_messages
== 0) {
705 link_enter_set_routes(link
);
707 log_debug_link(link
, "setting addresses");
712 int link_address_drop_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
713 _cleanup_link_unref_ Link
*link
= userdata
;
718 assert(link
->ifname
);
720 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
723 r
= sd_rtnl_message_get_errno(m
);
724 if (r
< 0 && r
!= -EADDRNOTAVAIL
)
725 log_struct_link(LOG_WARNING
, link
,
726 "MESSAGE=%-*s: could not drop address: %s",
728 link
->ifname
, strerror(-r
),
735 static int set_hostname_handler(sd_bus
*bus
, sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
736 _cleanup_link_unref_ Link
*link
= userdata
;
741 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
744 r
= sd_bus_message_get_errno(m
);
748 log_warning_link(link
, "Could not set hostname: %s", strerror(r
));
753 static int link_set_hostname(Link
*link
, const char *hostname
) {
754 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
758 assert(link
->manager
);
761 log_debug_link(link
, "Setting transient hostname: '%s'", hostname
);
763 if (!link
->manager
->bus
) { /* TODO: replace by assert when we can rely on kdbus */
764 log_info_link(link
, "Not connected to system bus, ignoring transient hostname.");
768 r
= sd_bus_message_new_method_call(
771 "org.freedesktop.hostname1",
772 "/org/freedesktop/hostname1",
773 "org.freedesktop.hostname1",
778 r
= sd_bus_message_append(m
, "sb", hostname
, false);
782 r
= sd_bus_call_async(link
->manager
->bus
, NULL
, m
, set_hostname_handler
, link
, 0);
784 log_error_link(link
, "Could not set transient hostname: %s", strerror(-r
));
793 static int set_mtu_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
794 _cleanup_link_unref_ Link
*link
= userdata
;
799 assert(link
->ifname
);
801 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
804 r
= sd_rtnl_message_get_errno(m
);
806 log_struct_link(LOG_WARNING
, link
,
807 "MESSAGE=%-*s: could not set MTU: %s",
808 IFNAMSIZ
, link
->ifname
, strerror(-r
),
815 static int link_set_mtu(Link
*link
, uint32_t mtu
) {
816 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
;
820 assert(link
->manager
);
821 assert(link
->manager
->rtnl
);
823 log_debug_link(link
, "setting MTU: %" PRIu32
, mtu
);
825 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
,
826 RTM_SETLINK
, link
->ifindex
);
828 log_error_link(link
, "Could not allocate RTM_SETLINK message");
832 r
= sd_rtnl_message_append_u32(req
, IFLA_MTU
, mtu
);
834 log_error_link(link
, "Could not append MTU: %s", strerror(-r
));
838 r
= sd_rtnl_call_async(link
->manager
->rtnl
, req
, set_mtu_handler
, link
, 0, NULL
);
841 "Could not send rtnetlink message: %s", strerror(-r
));
850 static int dhcp_lease_lost(Link
*link
) {
851 _cleanup_address_free_ Address
*address
= NULL
;
853 struct in_addr netmask
;
854 struct in_addr gateway
;
859 assert(link
->dhcp_lease
);
861 log_warning_link(link
, "DHCP lease lost");
863 if (link
->network
->dhcp_routes
) {
864 struct sd_dhcp_route
*routes
;
867 n
= sd_dhcp_lease_get_routes(link
->dhcp_lease
, &routes
);
869 for (i
= 0; i
< n
; i
++) {
870 _cleanup_route_free_ Route
*route
= NULL
;
872 r
= route_new_dynamic(&route
, RTPROT_UNSPEC
);
874 route
->family
= AF_INET
;
875 route
->in_addr
.in
= routes
[i
].gw_addr
;
876 route
->dst_addr
.in
= routes
[i
].dst_addr
;
877 route
->dst_prefixlen
= routes
[i
].dst_prefixlen
;
879 route_drop(route
, link
, &link_route_drop_handler
);
885 r
= address_new_dynamic(&address
);
887 r
= sd_dhcp_lease_get_router(link
->dhcp_lease
, &gateway
);
889 _cleanup_route_free_ Route
*route_gw
= NULL
;
890 _cleanup_route_free_ Route
*route
= NULL
;
892 r
= route_new_dynamic(&route_gw
, RTPROT_UNSPEC
);
894 route_gw
->family
= AF_INET
;
895 route_gw
->dst_addr
.in
= gateway
;
896 route_gw
->dst_prefixlen
= 32;
897 route_gw
->scope
= RT_SCOPE_LINK
;
899 route_drop(route_gw
, link
, &link_route_drop_handler
);
902 r
= route_new_dynamic(&route
, RTPROT_UNSPEC
);
904 route
->family
= AF_INET
;
905 route
->in_addr
.in
= gateway
;
907 route_drop(route
, link
, &link_route_drop_handler
);
911 sd_dhcp_lease_get_address(link
->dhcp_lease
, &addr
);
912 sd_dhcp_lease_get_netmask(link
->dhcp_lease
, &netmask
);
913 prefixlen
= in_addr_netmask_to_prefixlen(&netmask
);
915 address
->family
= AF_INET
;
916 address
->in_addr
.in
= addr
;
917 address
->prefixlen
= prefixlen
;
919 address_drop(address
, link
, &link_address_drop_handler
);
922 if (link
->network
->dhcp_mtu
) {
925 r
= sd_dhcp_lease_get_mtu(link
->dhcp_lease
, &mtu
);
926 if (r
>= 0 && link
->original_mtu
!= mtu
) {
927 r
= link_set_mtu(link
, link
->original_mtu
);
929 log_warning_link(link
, "DHCP error: could not reset MTU");
930 link_enter_failed(link
);
936 if (link
->network
->dhcp_hostname
) {
937 const char *hostname
= NULL
;
939 r
= sd_dhcp_lease_get_hostname(link
->dhcp_lease
, &hostname
);
940 if (r
>= 0 && hostname
) {
941 r
= link_set_hostname(link
, "");
943 log_error_link(link
, "Failed to reset transient hostname");
947 link
->dhcp_lease
= sd_dhcp_lease_unref(link
->dhcp_lease
);
952 static int dhcp_lease_renew(sd_dhcp_client
*client
, Link
*link
) {
953 sd_dhcp_lease
*lease
;
956 r
= sd_dhcp_client_get_lease(client
, &lease
);
958 log_warning_link(link
, "DHCP error: no lease %s",
963 sd_dhcp_lease_unref(link
->dhcp_lease
);
964 link
->dhcp_lease
= lease
;
966 link_enter_set_addresses(link
);
971 static int dhcp_lease_acquired(sd_dhcp_client
*client
, Link
*link
) {
972 sd_dhcp_lease
*lease
;
973 struct in_addr address
;
974 struct in_addr netmask
;
975 struct in_addr gateway
;
982 r
= sd_dhcp_client_get_lease(client
, &lease
);
984 log_warning_link(link
, "DHCP error: no lease: %s",
989 r
= sd_dhcp_lease_get_address(lease
, &address
);
991 log_warning_link(link
, "DHCP error: no address: %s",
996 r
= sd_dhcp_lease_get_netmask(lease
, &netmask
);
998 log_warning_link(link
, "DHCP error: no netmask: %s",
1003 prefixlen
= in_addr_netmask_to_prefixlen(&netmask
);
1005 r
= sd_dhcp_lease_get_router(lease
, &gateway
);
1006 if (r
< 0 && r
!= -ENOENT
) {
1007 log_warning_link(link
, "DHCP error: could not get gateway: %s",
1013 log_struct_link(LOG_INFO
, link
,
1014 "MESSAGE=%-*s: DHCPv4 address %u.%u.%u.%u/%u via %u.%u.%u.%u",
1017 ADDRESS_FMT_VAL(address
),
1019 ADDRESS_FMT_VAL(gateway
),
1020 "ADDRESS=%u.%u.%u.%u",
1021 ADDRESS_FMT_VAL(address
),
1024 "GATEWAY=%u.%u.%u.%u",
1025 ADDRESS_FMT_VAL(gateway
),
1028 log_struct_link(LOG_INFO
, link
,
1029 "MESSAGE=%-*s: DHCPv4 address %u.%u.%u.%u/%u",
1032 ADDRESS_FMT_VAL(address
),
1034 "ADDRESS=%u.%u.%u.%u",
1035 ADDRESS_FMT_VAL(address
),
1040 link
->dhcp_lease
= lease
;
1042 if (link
->network
->dhcp_mtu
) {
1045 r
= sd_dhcp_lease_get_mtu(lease
, &mtu
);
1047 r
= link_set_mtu(link
, mtu
);
1049 log_error_link(link
, "Failed to set MTU "
1050 "to %" PRIu16
, mtu
);
1054 if (link
->network
->dhcp_hostname
) {
1055 const char *hostname
;
1057 r
= sd_dhcp_lease_get_hostname(lease
, &hostname
);
1059 r
= link_set_hostname(link
, hostname
);
1061 log_error_link(link
, "Failed to set transient hostname "
1062 "to '%s'", hostname
);
1066 link_enter_set_addresses(link
);
1071 static void dhcp_handler(sd_dhcp_client
*client
, int event
, void *userdata
) {
1072 Link
*link
= userdata
;
1076 assert(link
->network
);
1077 assert(link
->manager
);
1079 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1083 case DHCP_EVENT_EXPIRED
:
1084 case DHCP_EVENT_STOP
:
1085 case DHCP_EVENT_IP_CHANGE
:
1086 if (link
->network
->dhcp_critical
) {
1087 log_error_link(link
, "DHCPv4 connection considered system critical, "
1088 "ignoring request to reconfigure it.");
1092 if (link
->dhcp_lease
) {
1093 r
= dhcp_lease_lost(link
);
1095 link_enter_failed(link
);
1100 if (event
== DHCP_EVENT_IP_CHANGE
) {
1101 r
= dhcp_lease_acquired(client
, link
);
1103 link_enter_failed(link
);
1109 case DHCP_EVENT_RENEW
:
1110 r
= dhcp_lease_renew(client
, link
);
1112 link_enter_failed(link
);
1116 case DHCP_EVENT_IP_ACQUIRE
:
1117 r
= dhcp_lease_acquired(client
, link
);
1119 link_enter_failed(link
);
1125 log_warning_link(link
, "DHCP error: client failed: %s", strerror(-event
));
1127 log_warning_link(link
, "DHCP unknown event: %d", event
);
1134 static void dhcp6_handler(sd_dhcp6_client
*client
, int event
, void *userdata
) {
1135 Link
*link
= userdata
;
1138 assert(link
->network
);
1139 assert(link
->manager
);
1141 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1145 case DHCP6_EVENT_STOP
:
1146 case DHCP6_EVENT_RESEND_EXPIRE
:
1147 case DHCP6_EVENT_RETRANS_MAX
:
1148 case DHCP6_EVENT_IP_ACQUIRE
:
1149 log_debug_link(link
, "DHCPv6 event %d", event
);
1155 log_warning_link(link
, "DHCPv6 error: %s",
1158 log_warning_link(link
, "DHCPv6 unknown event: %d",
1164 static void icmp6_router_handler(sd_icmp6_nd
*nd
, int event
, void *userdata
) {
1165 Link
*link
= userdata
;
1169 assert(link
->network
);
1170 assert(link
->manager
);
1172 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1176 case ICMP6_EVENT_ROUTER_ADVERTISMENT_NONE
:
1177 case ICMP6_EVENT_ROUTER_ADVERTISMENT_OTHER
:
1180 case ICMP6_EVENT_ROUTER_ADVERTISMENT_TIMEOUT
:
1181 case ICMP6_EVENT_ROUTER_ADVERTISMENT_MANAGED
:
1186 log_warning_link(link
, "ICMPv6 error: %s",
1189 log_warning_link(link
, "ICMPv6 unknown event: %d",
1195 if (link
->dhcp6_client
)
1198 r
= sd_dhcp6_client_new(&link
->dhcp6_client
);
1202 r
= sd_dhcp6_client_attach_event(link
->dhcp6_client
, NULL
, 0);
1204 link
->dhcp6_client
= sd_dhcp6_client_unref(link
->dhcp6_client
);
1208 r
= sd_dhcp6_client_set_mac(link
->dhcp6_client
, &link
->mac
);
1210 link
->dhcp6_client
= sd_dhcp6_client_unref(link
->dhcp6_client
);
1214 r
= sd_dhcp6_client_set_index(link
->dhcp6_client
, link
->ifindex
);
1216 link
->dhcp6_client
= sd_dhcp6_client_unref(link
->dhcp6_client
);
1220 r
= sd_dhcp6_client_set_callback(link
->dhcp6_client
, dhcp6_handler
,
1223 link
->dhcp6_client
= sd_dhcp6_client_unref(link
->dhcp6_client
);
1227 r
= sd_dhcp6_client_start(link
->dhcp6_client
);
1229 link
->dhcp6_client
= sd_dhcp6_client_unref(link
->dhcp6_client
);
1232 static int link_acquire_conf(Link
*link
) {
1236 assert(link
->network
);
1237 assert(link
->manager
);
1238 assert(link
->manager
->event
);
1240 if (link
->network
->ipv4ll
) {
1241 assert(link
->ipv4ll
);
1243 log_debug_link(link
, "acquiring IPv4 link-local address");
1245 r
= sd_ipv4ll_start(link
->ipv4ll
);
1247 log_warning_link(link
, "could not acquire IPv4 "
1248 "link-local address");
1253 if (IN_SET(link
->network
->dhcp
, DHCP_SUPPORT_BOTH
, DHCP_SUPPORT_V4
)) {
1254 assert(link
->dhcp_client
);
1256 log_debug_link(link
, "acquiring DHCPv4 lease");
1258 r
= sd_dhcp_client_start(link
->dhcp_client
);
1260 log_warning_link(link
, "could not acquire DHCPv4 "
1266 if (IN_SET(link
->network
->dhcp
, DHCP_SUPPORT_BOTH
, DHCP_SUPPORT_V6
)) {
1267 assert(link
->icmp6_router_discovery
);
1269 log_debug_link(link
, "discovering IPv6 routers");
1271 r
= sd_icmp6_router_solicitation_start(link
->icmp6_router_discovery
);
1273 log_warning_link(link
, "could not start IPv6 router discovery");
1281 bool link_has_carrier(unsigned flags
, uint8_t operstate
) {
1282 /* see Documentation/networking/operstates.txt in the kernel sources */
1284 if (operstate
== IF_OPER_UP
)
1287 if (operstate
== IF_OPER_UNKNOWN
)
1288 /* operstate may not be implemented, so fall back to flags */
1289 if ((flags
& IFF_LOWER_UP
) && !(flags
& IFF_DORMANT
))
1295 #define FLAG_STRING(string, flag, old, new) \
1296 (((old ^ new) & flag) \
1297 ? ((old & flag) ? (" -" string) : (" +" string)) \
1300 static int link_update_flags(Link
*link
, sd_rtnl_message
*m
) {
1301 unsigned flags
, unknown_flags_added
, unknown_flags_removed
, unknown_flags
;
1303 bool carrier_gained
= false, carrier_lost
= false;
1308 r
= sd_rtnl_message_link_get_flags(m
, &flags
);
1310 log_warning_link(link
, "Could not get link flags");
1314 r
= sd_rtnl_message_read_u8(m
, IFLA_OPERSTATE
, &operstate
);
1316 /* if we got a message without operstate, take it to mean
1317 the state was unchanged */
1318 operstate
= link
->kernel_operstate
;
1320 if ((link
->flags
== flags
) && (link
->kernel_operstate
== operstate
))
1323 if (link
->flags
!= flags
) {
1324 log_debug_link(link
, "flags change:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
1325 FLAG_STRING("LOOPBACK", IFF_LOOPBACK
, link
->flags
, flags
),
1326 FLAG_STRING("MASTER", IFF_MASTER
, link
->flags
, flags
),
1327 FLAG_STRING("SLAVE", IFF_SLAVE
, link
->flags
, flags
),
1328 FLAG_STRING("UP", IFF_UP
, link
->flags
, flags
),
1329 FLAG_STRING("DORMANT", IFF_DORMANT
, link
->flags
, flags
),
1330 FLAG_STRING("LOWER_UP", IFF_LOWER_UP
, link
->flags
, flags
),
1331 FLAG_STRING("RUNNING", IFF_RUNNING
, link
->flags
, flags
),
1332 FLAG_STRING("MULTICAST", IFF_MULTICAST
, link
->flags
, flags
),
1333 FLAG_STRING("BROADCAST", IFF_BROADCAST
, link
->flags
, flags
),
1334 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT
, link
->flags
, flags
),
1335 FLAG_STRING("PROMISC", IFF_PROMISC
, link
->flags
, flags
),
1336 FLAG_STRING("ALLMULTI", IFF_ALLMULTI
, link
->flags
, flags
),
1337 FLAG_STRING("PORTSEL", IFF_PORTSEL
, link
->flags
, flags
),
1338 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA
, link
->flags
, flags
),
1339 FLAG_STRING("DYNAMIC", IFF_DYNAMIC
, link
->flags
, flags
),
1340 FLAG_STRING("NOARP", IFF_NOARP
, link
->flags
, flags
),
1341 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS
, link
->flags
, flags
),
1342 FLAG_STRING("DEBUG", IFF_DEBUG
, link
->flags
, flags
),
1343 FLAG_STRING("ECHO", IFF_ECHO
, link
->flags
, flags
));
1345 unknown_flags
= ~(IFF_LOOPBACK
| IFF_MASTER
| IFF_SLAVE
| IFF_UP
|
1346 IFF_DORMANT
| IFF_LOWER_UP
| IFF_RUNNING
|
1347 IFF_MULTICAST
| IFF_BROADCAST
| IFF_POINTOPOINT
|
1348 IFF_PROMISC
| IFF_ALLMULTI
| IFF_PORTSEL
|
1349 IFF_AUTOMEDIA
| IFF_DYNAMIC
| IFF_NOARP
|
1350 IFF_NOTRAILERS
| IFF_DEBUG
| IFF_ECHO
);
1351 unknown_flags_added
= ((link
->flags
^ flags
) & flags
& unknown_flags
);
1352 unknown_flags_removed
= ((link
->flags
^ flags
) & link
->flags
& unknown_flags
);
1354 /* link flags are currently at most 18 bits, let's align to printing 20 */
1355 if (unknown_flags_added
)
1356 log_debug_link(link
, "unknown link flags gained: %#.5x (ignoring)",
1357 unknown_flags_added
);
1359 if (unknown_flags_removed
)
1360 log_debug_link(link
, "unknown link flags lost: %#.5x (ignoring)",
1361 unknown_flags_removed
);
1364 carrier_gained
= !link_has_carrier(link
->flags
, link
->kernel_operstate
) &&
1365 link_has_carrier(flags
, operstate
);
1366 carrier_lost
= link_has_carrier(link
->flags
, link
->kernel_operstate
) &&
1367 !link_has_carrier(flags
, operstate
);
1369 link
->flags
= flags
;
1370 link
->kernel_operstate
= operstate
;
1374 if (link
->state
== LINK_STATE_FAILED
||
1375 link
->state
== LINK_STATE_UNMANAGED
)
1378 if (carrier_gained
) {
1379 log_info_link(link
, "gained carrier");
1381 if (link
->network
) {
1382 r
= link_acquire_conf(link
);
1384 link_enter_failed(link
);
1388 } else if (carrier_lost
) {
1389 log_info_link(link
, "lost carrier");
1391 r
= link_stop_clients(link
);
1393 link_enter_failed(link
);
1401 static int link_up_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
1402 _cleanup_link_unref_ Link
*link
= userdata
;
1407 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1410 r
= sd_rtnl_message_get_errno(m
);
1412 /* we warn but don't fail the link, as it may
1413 be brought up later */
1414 log_struct_link(LOG_WARNING
, link
,
1415 "MESSAGE=%-*s: could not bring up interface: %s",
1417 link
->ifname
, strerror(-r
),
1425 static int link_up(Link
*link
) {
1426 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
;
1430 assert(link
->manager
);
1431 assert(link
->manager
->rtnl
);
1433 log_debug_link(link
, "bringing link up");
1435 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
,
1436 RTM_SETLINK
, link
->ifindex
);
1438 log_error_link(link
, "Could not allocate RTM_SETLINK message");
1442 r
= sd_rtnl_message_link_set_flags(req
, IFF_UP
, IFF_UP
);
1444 log_error_link(link
, "Could not set link flags: %s", strerror(-r
));
1448 r
= sd_rtnl_call_async(link
->manager
->rtnl
, req
, link_up_handler
, link
, 0, NULL
);
1450 log_error_link(link
,
1451 "Could not send rtnetlink message: %s", strerror(-r
));
1460 static int link_joined(Link
*link
) {
1464 assert(link
->state
== LINK_STATE_ENSLAVING
);
1465 assert(link
->network
);
1467 if (!(link
->flags
& IFF_UP
)) {
1470 link_enter_failed(link
);
1475 return link_enter_set_addresses(link
);
1478 static int netdev_join_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
1479 _cleanup_link_unref_ Link
*link
= userdata
;
1483 assert(IN_SET(link
->state
, LINK_STATE_ENSLAVING
, LINK_STATE_FAILED
,
1484 LINK_STATE_LINGER
));
1485 assert(link
->network
);
1489 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1492 r
= sd_rtnl_message_get_errno(m
);
1493 if (r
< 0 && r
!= -EEXIST
) {
1494 log_struct_link(LOG_ERR
, link
,
1495 "MESSAGE=%-*s: could not join netdev: %s",
1497 link
->ifname
, strerror(-r
),
1500 link_enter_failed(link
);
1503 log_debug_link(link
, "joined netdev");
1505 if (link
->enslaving
<= 0)
1511 static int link_enter_join_netdev(Link
*link
) {
1517 assert(link
->network
);
1518 assert(link
->state
== LINK_STATE_INITIALIZING
);
1520 link
->state
= LINK_STATE_ENSLAVING
;
1524 if (!link
->network
->bridge
&&
1525 !link
->network
->bond
&&
1526 hashmap_isempty(link
->network
->stacked_netdevs
))
1527 return link_joined(link
);
1529 if (link
->network
->bond
) {
1530 log_struct_link(LOG_DEBUG
, link
,
1531 "MESSAGE=%-*s: enslaving by '%s'",
1533 link
->ifname
, link
->network
->bond
->ifname
,
1534 NETDEVIF(link
->network
->bond
),
1537 r
= netdev_join(link
->network
->bond
, link
, &netdev_join_handler
);
1539 log_struct_link(LOG_WARNING
, link
,
1540 "MESSAGE=%-*s: could not join netdev '%s': %s",
1542 link
->ifname
, link
->network
->bond
->ifname
, strerror(-r
),
1543 NETDEVIF(link
->network
->bond
),
1545 link_enter_failed(link
);
1552 if (link
->network
->bridge
) {
1553 log_struct_link(LOG_DEBUG
, link
,
1554 "MESSAGE=%-*s: enslaving by '%s'",
1556 link
->ifname
, link
->network
->bridge
->ifname
,
1557 NETDEVIF(link
->network
->bridge
),
1560 r
= netdev_join(link
->network
->bridge
, link
, &netdev_join_handler
);
1562 log_struct_link(LOG_WARNING
, link
,
1563 "MESSAGE=%-*s: could not join netdev '%s': %s",
1565 link
->ifname
, link
->network
->bridge
->ifname
, strerror(-r
),
1566 NETDEVIF(link
->network
->bridge
),
1568 link_enter_failed(link
);
1575 HASHMAP_FOREACH(netdev
, link
->network
->stacked_netdevs
, i
) {
1576 log_struct_link(LOG_DEBUG
, link
,
1577 "MESSAGE=%-*s: enslaving by '%s'",
1579 link
->ifname
, netdev
->ifname
, NETDEVIF(netdev
), NULL
);
1581 r
= netdev_join(netdev
, link
, &netdev_join_handler
);
1583 log_struct_link(LOG_WARNING
, link
,
1584 "MESSAGE=%-*s: could not join netdev '%s': %s",
1586 link
->ifname
, netdev
->ifname
, strerror(-r
),
1587 NETDEVIF(netdev
), NULL
);
1588 link_enter_failed(link
);
1598 static int link_configure(Link
*link
) {
1602 assert(link
->network
);
1603 assert(link
->state
== LINK_STATE_INITIALIZING
);
1605 if (link
->network
->ipv4ll
) {
1606 r
= ipv4ll_configure(link
);
1611 if (IN_SET(link
->network
->dhcp
, DHCP_SUPPORT_BOTH
, DHCP_SUPPORT_V4
)) {
1612 r
= sd_dhcp_client_new(&link
->dhcp_client
);
1616 r
= sd_dhcp_client_attach_event(link
->dhcp_client
, NULL
, 0);
1620 r
= sd_dhcp_client_set_mac(link
->dhcp_client
, &link
->mac
);
1624 r
= sd_dhcp_client_set_index(link
->dhcp_client
, link
->ifindex
);
1628 r
= sd_dhcp_client_set_callback(link
->dhcp_client
, dhcp_handler
, link
);
1632 r
= sd_dhcp_client_set_request_broadcast(link
->dhcp_client
, link
->network
->dhcp_broadcast
);
1637 r
= sd_dhcp_client_set_mtu(link
->dhcp_client
, link
->mtu
);
1642 if (link
->network
->dhcp_mtu
) {
1643 r
= sd_dhcp_client_set_request_option(link
->dhcp_client
, DHCP_OPTION_INTERFACE_MTU
);
1648 if (link
->network
->dhcp_routes
) {
1649 r
= sd_dhcp_client_set_request_option(link
->dhcp_client
, DHCP_OPTION_STATIC_ROUTE
);
1652 r
= sd_dhcp_client_set_request_option(link
->dhcp_client
, DHCP_OPTION_CLASSLESS_STATIC_ROUTE
);
1657 if (link
->network
->dhcp_sendhost
) {
1658 _cleanup_free_
char *hostname
= gethostname_malloc();
1662 if (!is_localhost(hostname
)) {
1663 r
= sd_dhcp_client_set_hostname(link
->dhcp_client
, hostname
);
1669 if (link
->network
->dhcp_vendor_class_identifier
) {
1670 r
= sd_dhcp_client_set_vendor_class_identifier(link
->dhcp_client
,
1671 link
->network
->dhcp_vendor_class_identifier
);
1677 if (link
->network
->dhcp_server
) {
1678 r
= sd_dhcp_server_new(&link
->dhcp_server
, link
->ifindex
);
1682 r
= sd_dhcp_server_attach_event(link
->dhcp_server
, NULL
, 0);
1687 if (IN_SET(link
->network
->dhcp
, DHCP_SUPPORT_BOTH
, DHCP_SUPPORT_V6
)) {
1688 r
= sd_icmp6_nd_new(&link
->icmp6_router_discovery
);
1692 r
= sd_icmp6_nd_attach_event(link
->icmp6_router_discovery
,
1697 r
= sd_icmp6_nd_set_mac(link
->icmp6_router_discovery
,
1702 r
= sd_icmp6_nd_set_index(link
->icmp6_router_discovery
,
1707 r
= sd_icmp6_nd_set_callback(link
->icmp6_router_discovery
,
1708 icmp6_router_handler
, link
);
1713 if (link_has_carrier(link
->flags
, link
->kernel_operstate
)) {
1714 r
= link_acquire_conf(link
);
1719 return link_enter_join_netdev(link
);
1722 static int link_initialized_and_synced(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
1723 _cleanup_link_unref_ Link
*link
= userdata
;
1728 assert(link
->ifname
);
1729 assert(link
->manager
);
1731 if (link
->state
!= LINK_STATE_INITIALIZING
)
1734 log_debug_link(link
, "link state is up-to-date");
1736 r
= network_get(link
->manager
, link
->udev_device
, link
->ifname
, &link
->mac
, &network
);
1738 link_enter_unmanaged(link
);
1743 r
= network_apply(link
->manager
, network
, link
);
1747 r
= link_configure(link
);
1754 int link_initialized(Link
*link
, struct udev_device
*device
) {
1755 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
;
1759 assert(link
->manager
);
1760 assert(link
->manager
->rtnl
);
1763 if (link
->state
!= LINK_STATE_INITIALIZING
)
1766 if (link
->udev_device
)
1769 log_debug_link(link
, "udev initialized link");
1771 link
->udev_device
= udev_device_ref(device
);
1773 /* udev has initialized the link, but we don't know if we have yet processed
1774 the NEWLINK messages with the latest state. Do a GETLINK, when it returns
1775 we know that the pending NEWLINKs have already been processed and that we
1778 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_GETLINK
, link
->ifindex
);
1782 r
= sd_rtnl_call_async(link
->manager
->rtnl
, req
, link_initialized_and_synced
, link
, 0, NULL
);
1791 int link_rtnl_process_address(sd_rtnl
*rtnl
, sd_rtnl_message
*message
, void *userdata
) {
1792 Manager
*m
= userdata
;
1795 _cleanup_address_free_ Address
*address
= NULL
;
1797 char buf
[INET6_ADDRSTRLEN
];
1798 bool address_dropped
= false;
1805 r
= sd_rtnl_message_get_type(message
, &type
);
1807 log_warning("rtnl: could not get message type");
1811 r
= sd_rtnl_message_addr_get_ifindex(message
, &ifindex
);
1812 if (r
< 0 || ifindex
<= 0) {
1813 log_warning("rtnl: received address message without valid ifindex, ignoring");
1816 r
= link_get(m
, ifindex
, &link
);
1817 if (r
< 0 || !link
) {
1818 log_warning("rtnl: received address for a nonexistent link, ignoring");
1823 r
= address_new_dynamic(&address
);
1827 r
= sd_rtnl_message_addr_get_family(message
, &address
->family
);
1828 if (r
< 0 || !IN_SET(address
->family
, AF_INET
, AF_INET6
)) {
1829 log_warning_link(link
, "rtnl: received address with invalid family, ignoring");
1833 r
= sd_rtnl_message_addr_get_prefixlen(message
, &address
->prefixlen
);
1835 log_warning_link(link
, "rtnl: received address with invalid prefixlen, ignoring");
1839 r
= sd_rtnl_message_addr_get_scope(message
, &address
->scope
);
1841 log_warning_link(link
, "rtnl: received address with invalid scope, ignoring");
1845 switch (address
->family
) {
1847 r
= sd_rtnl_message_read_in_addr(message
, IFA_LOCAL
, &address
->in_addr
.in
);
1849 log_warning_link(link
, "rtnl: received address without valid address, ignoring");
1856 r
= sd_rtnl_message_read_in6_addr(message
, IFA_ADDRESS
, &address
->in_addr
.in6
);
1858 log_warning_link(link
, "rtnl: received address without valid address, ignoring");
1865 assert_not_reached("invalid address family");
1868 if (!inet_ntop(address
->family
, &address
->in_addr
, buf
, INET6_ADDRSTRLEN
)) {
1869 log_warning_link(link
, "could not print address");
1873 LIST_FOREACH(addresses
, ad
, link
->addresses
) {
1874 if (address_equal(ad
, address
)) {
1875 LIST_REMOVE(addresses
, link
->addresses
, ad
);
1879 address_dropped
= true;
1887 if (!address_dropped
)
1888 log_debug_link(link
, "added address: %s/%u", buf
,
1889 address
->prefixlen
);
1891 log_debug_link(link
, "updated address: %s/%u", buf
,
1892 address
->prefixlen
);
1894 LIST_PREPEND(addresses
, link
->addresses
, address
);
1901 if (address_dropped
) {
1902 log_debug_link(link
, "removed address: %s/%u", buf
,
1903 address
->prefixlen
);
1907 log_warning_link(link
, "removing non-existent address: %s/%u",
1908 buf
, address
->prefixlen
);
1912 assert_not_reached("Received invalid RTNL message type");
1918 int link_add(Manager
*m
, sd_rtnl_message
*message
, Link
**ret
) {
1920 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
;
1921 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
1922 char ifindex_str
[2 + DECIMAL_STR_MAX(int)];
1930 r
= link_new(m
, message
, ret
);
1936 log_debug_link(link
, "link %d added", link
->ifindex
);
1938 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, link
->ifindex
, 0);
1942 r
= sd_rtnl_call_async(m
->rtnl
, req
, link_get_address_handler
, link
, 0, NULL
);
1948 if (detect_container(NULL
) <= 0) {
1949 /* not in a container, udev will be around */
1950 sprintf(ifindex_str
, "n%d", link
->ifindex
);
1951 device
= udev_device_new_from_device_id(m
->udev
, ifindex_str
);
1953 log_warning_link(link
, "could not find udev device: %m");
1957 if (udev_device_get_is_initialized(device
) <= 0) {
1959 log_debug_link(link
, "udev initializing link...");
1963 r
= link_initialized(link
, device
);
1967 /* we are calling a callback directly, so must take a ref */
1970 r
= link_initialized_and_synced(m
->rtnl
, NULL
, link
);
1978 int link_update(Link
*link
, sd_rtnl_message
*m
) {
1979 struct ether_addr mac
;
1985 assert(link
->ifname
);
1988 if (link
->state
== LINK_STATE_LINGER
) {
1990 log_info_link(link
, "link readded");
1991 link
->state
= LINK_STATE_ENSLAVING
;
1994 r
= sd_rtnl_message_read_string(m
, IFLA_IFNAME
, &ifname
);
1995 if (r
>= 0 && !streq(ifname
, link
->ifname
)) {
1996 log_info_link(link
, "renamed to %s", ifname
);
1999 link
->ifname
= strdup(ifname
);
2004 r
= sd_rtnl_message_read_u32(m
, IFLA_MTU
, &mtu
);
2005 if (r
>= 0 && mtu
> 0) {
2007 if (!link
->original_mtu
) {
2008 link
->original_mtu
= mtu
;
2009 log_debug_link(link
, "saved original MTU: %"
2010 PRIu32
, link
->original_mtu
);
2013 if (link
->dhcp_client
) {
2014 r
= sd_dhcp_client_set_mtu(link
->dhcp_client
, link
->mtu
);
2016 log_warning_link(link
, "Could not update MTU in DHCP client: %s",
2023 /* The kernel may broadcast NEWLINK messages without the MAC address
2024 set, simply ignore them. */
2025 r
= sd_rtnl_message_read_ether_addr(m
, IFLA_ADDRESS
, &mac
);
2027 if (memcmp(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
, ETH_ALEN
)) {
2029 memcpy(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
, ETH_ALEN
);
2031 log_debug_link(link
, "MAC address: "
2032 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2033 mac
.ether_addr_octet
[0],
2034 mac
.ether_addr_octet
[1],
2035 mac
.ether_addr_octet
[2],
2036 mac
.ether_addr_octet
[3],
2037 mac
.ether_addr_octet
[4],
2038 mac
.ether_addr_octet
[5]);
2041 r
= sd_ipv4ll_set_mac(link
->ipv4ll
, &link
->mac
);
2043 log_warning_link(link
, "Could not update MAC "
2044 "address in IPv4LL client: %s",
2050 if (link
->dhcp_client
) {
2051 r
= sd_dhcp_client_set_mac(link
->dhcp_client
, &link
->mac
);
2053 log_warning_link(link
, "Could not update MAC "
2054 "address in DHCP client: %s",
2060 if (link
->dhcp6_client
) {
2061 r
= sd_dhcp6_client_set_mac(link
->dhcp6_client
,
2064 log_warning_link(link
, "Could not update MAC address in DHCPv6 client: %s",
2072 return link_update_flags(link
, m
);
2075 static void link_update_operstate(Link
*link
) {
2079 if (link
->kernel_operstate
== IF_OPER_DORMANT
)
2080 link
->operstate
= LINK_OPERSTATE_DORMANT
;
2081 else if (link_has_carrier(link
->flags
, link
->kernel_operstate
)) {
2083 uint8_t scope
= RT_SCOPE_NOWHERE
;
2085 /* if we have carrier, check what addresses we have */
2086 LIST_FOREACH(addresses
, address
, link
->addresses
) {
2087 if (address
->scope
< scope
)
2088 scope
= address
->scope
;
2091 if (scope
< RT_SCOPE_SITE
)
2092 /* universally accessible addresses found */
2093 link
->operstate
= LINK_OPERSTATE_ROUTABLE
;
2094 else if (scope
< RT_SCOPE_HOST
)
2095 /* only link or site local addresses found */
2096 link
->operstate
= LINK_OPERSTATE_DEGRADED
;
2098 /* no useful addresses found */
2099 link
->operstate
= LINK_OPERSTATE_CARRIER
;
2101 link
->operstate
= LINK_OPERSTATE_UNKNOWN
;
2104 int link_save(Link
*link
) {
2105 _cleanup_free_
char *temp_path
= NULL
;
2106 _cleanup_fclose_
FILE *f
= NULL
;
2107 const char *admin_state
, *oper_state
;
2111 assert(link
->state_file
);
2112 assert(link
->lease_file
);
2113 assert(link
->manager
);
2115 link_update_operstate(link
);
2117 r
= manager_save(link
->manager
);
2121 if (link
->state
== LINK_STATE_LINGER
) {
2122 unlink(link
->state_file
);
2126 admin_state
= link_state_to_string(link
->state
);
2127 assert(admin_state
);
2129 oper_state
= link_operstate_to_string(link
->operstate
);
2132 r
= fopen_temporary(link
->state_file
, &f
, &temp_path
);
2136 fchmod(fileno(f
), 0644);
2139 "# This is private data. Do not parse.\n"
2142 admin_state
, oper_state
);
2144 if (link
->network
) {
2149 if (link
->network
->dhcp_dns
&&
2151 const struct in_addr
*addresses
;
2153 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
2155 serialize_in_addrs(f
, addresses
, r
);
2156 if (link
->network
->dns
)
2161 STRV_FOREACH(address
, link
->network
->dns
)
2162 fprintf(f
, "%s%s", *address
,
2163 (address
+ 1 ? " " : ""));
2169 if (link
->network
->dhcp_ntp
&&
2171 const struct in_addr
*addresses
;
2173 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
2175 serialize_in_addrs(f
, addresses
, r
);
2176 if (link
->network
->ntp
)
2181 STRV_FOREACH(address
, link
->network
->ntp
)
2182 fprintf(f
, "%s%s", *address
,
2183 (address
+ 1 ? " " : ""));
2187 fprintf(f
, "LLMNR=%s\n", llmnr_support_to_string(link
->network
->llmnr
));
2190 if (link
->dhcp_lease
) {
2191 assert(link
->network
);
2193 r
= dhcp_lease_save(link
->dhcp_lease
, link
->lease_file
);
2201 unlink(link
->lease_file
);
2203 r
= fflush_and_check(f
);
2207 if (rename(temp_path
, link
->state_file
) < 0) {
2215 log_error_link(link
, "Failed to save link data to %s: %s", link
->state_file
, strerror(-r
));
2216 unlink(link
->state_file
);
2221 static const char* const link_state_table
[_LINK_STATE_MAX
] = {
2222 [LINK_STATE_INITIALIZING
] = "initializing",
2223 [LINK_STATE_ENSLAVING
] = "configuring",
2224 [LINK_STATE_SETTING_ADDRESSES
] = "configuring",
2225 [LINK_STATE_SETTING_ROUTES
] = "configuring",
2226 [LINK_STATE_CONFIGURED
] = "configured",
2227 [LINK_STATE_UNMANAGED
] = "unmanaged",
2228 [LINK_STATE_FAILED
] = "failed",
2229 [LINK_STATE_LINGER
] = "linger",
2232 DEFINE_STRING_TABLE_LOOKUP(link_state
, LinkState
);
2234 static const char* const link_operstate_table
[_LINK_OPERSTATE_MAX
] = {
2235 [LINK_OPERSTATE_UNKNOWN
] = "unknown",
2236 [LINK_OPERSTATE_DORMANT
] = "dormant",
2237 [LINK_OPERSTATE_CARRIER
] = "carrier",
2238 [LINK_OPERSTATE_DEGRADED
] = "degraded",
2239 [LINK_OPERSTATE_ROUTABLE
] = "routable",
2242 DEFINE_STRING_TABLE_LOOKUP(link_operstate
, LinkOperationalState
);