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>
29 #include "socket-util.h"
31 #include "udev-util.h"
32 #include "network-internal.h"
33 #include "networkd-link.h"
34 #include "networkd-netdev.h"
36 bool link_dhcp6_enabled(Link
*link
) {
37 if (link
->flags
& IFF_LOOPBACK
)
43 return IN_SET(link
->network
->dhcp
, ADDRESS_FAMILY_IPV6
, ADDRESS_FAMILY_YES
);
46 bool link_dhcp4_enabled(Link
*link
) {
47 if (link
->flags
& IFF_LOOPBACK
)
53 return IN_SET(link
->network
->dhcp
, ADDRESS_FAMILY_IPV4
, ADDRESS_FAMILY_YES
);
56 bool link_dhcp4_server_enabled(Link
*link
) {
57 if (link
->flags
& IFF_LOOPBACK
)
63 return link
->network
->dhcp_server
;
66 bool link_ipv4ll_enabled(Link
*link
) {
67 if (link
->flags
& IFF_LOOPBACK
)
73 return IN_SET(link
->network
->link_local
, ADDRESS_FAMILY_IPV4
, ADDRESS_FAMILY_YES
);
76 bool link_ipv6ll_enabled(Link
*link
) {
77 if (link
->flags
& IFF_LOOPBACK
)
83 return IN_SET(link
->network
->link_local
, ADDRESS_FAMILY_IPV6
, ADDRESS_FAMILY_YES
);
86 bool link_lldp_enabled(Link
*link
) {
87 if (link
->flags
& IFF_LOOPBACK
)
93 if (link
->network
->bridge
)
96 return link
->network
->lldp
;
99 static bool link_ipv4_forward_enabled(Link
*link
) {
100 if (link
->flags
& IFF_LOOPBACK
)
106 return IN_SET(link
->network
->ip_forward
, ADDRESS_FAMILY_IPV4
, ADDRESS_FAMILY_YES
);
109 static bool link_ipv6_forward_enabled(Link
*link
) {
110 if (link
->flags
& IFF_LOOPBACK
)
116 return IN_SET(link
->network
->ip_forward
, ADDRESS_FAMILY_IPV6
, ADDRESS_FAMILY_YES
);
119 #define FLAG_STRING(string, flag, old, new) \
120 (((old ^ new) & flag) \
121 ? ((old & flag) ? (" -" string) : (" +" string)) \
124 static int link_update_flags(Link
*link
, sd_rtnl_message
*m
) {
125 unsigned flags
, unknown_flags_added
, unknown_flags_removed
, unknown_flags
;
131 r
= sd_rtnl_message_link_get_flags(m
, &flags
);
133 return log_link_warning_errno(link
, r
, "Could not get link flags: %m");
135 r
= sd_rtnl_message_read_u8(m
, IFLA_OPERSTATE
, &operstate
);
137 /* if we got a message without operstate, take it to mean
138 the state was unchanged */
139 operstate
= link
->kernel_operstate
;
141 if ((link
->flags
== flags
) && (link
->kernel_operstate
== operstate
))
144 if (link
->flags
!= flags
) {
145 log_link_debug(link
, "Flags change:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
146 FLAG_STRING("LOOPBACK", IFF_LOOPBACK
, link
->flags
, flags
),
147 FLAG_STRING("MASTER", IFF_MASTER
, link
->flags
, flags
),
148 FLAG_STRING("SLAVE", IFF_SLAVE
, link
->flags
, flags
),
149 FLAG_STRING("UP", IFF_UP
, link
->flags
, flags
),
150 FLAG_STRING("DORMANT", IFF_DORMANT
, link
->flags
, flags
),
151 FLAG_STRING("LOWER_UP", IFF_LOWER_UP
, link
->flags
, flags
),
152 FLAG_STRING("RUNNING", IFF_RUNNING
, link
->flags
, flags
),
153 FLAG_STRING("MULTICAST", IFF_MULTICAST
, link
->flags
, flags
),
154 FLAG_STRING("BROADCAST", IFF_BROADCAST
, link
->flags
, flags
),
155 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT
, link
->flags
, flags
),
156 FLAG_STRING("PROMISC", IFF_PROMISC
, link
->flags
, flags
),
157 FLAG_STRING("ALLMULTI", IFF_ALLMULTI
, link
->flags
, flags
),
158 FLAG_STRING("PORTSEL", IFF_PORTSEL
, link
->flags
, flags
),
159 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA
, link
->flags
, flags
),
160 FLAG_STRING("DYNAMIC", IFF_DYNAMIC
, link
->flags
, flags
),
161 FLAG_STRING("NOARP", IFF_NOARP
, link
->flags
, flags
),
162 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS
, link
->flags
, flags
),
163 FLAG_STRING("DEBUG", IFF_DEBUG
, link
->flags
, flags
),
164 FLAG_STRING("ECHO", IFF_ECHO
, link
->flags
, flags
));
166 unknown_flags
= ~(IFF_LOOPBACK
| IFF_MASTER
| IFF_SLAVE
| IFF_UP
|
167 IFF_DORMANT
| IFF_LOWER_UP
| IFF_RUNNING
|
168 IFF_MULTICAST
| IFF_BROADCAST
| IFF_POINTOPOINT
|
169 IFF_PROMISC
| IFF_ALLMULTI
| IFF_PORTSEL
|
170 IFF_AUTOMEDIA
| IFF_DYNAMIC
| IFF_NOARP
|
171 IFF_NOTRAILERS
| IFF_DEBUG
| IFF_ECHO
);
172 unknown_flags_added
= ((link
->flags
^ flags
) & flags
& unknown_flags
);
173 unknown_flags_removed
= ((link
->flags
^ flags
) & link
->flags
& unknown_flags
);
175 /* link flags are currently at most 18 bits, let's align to
177 if (unknown_flags_added
)
179 "Unknown link flags gained: %#.5x (ignoring)",
180 unknown_flags_added
);
182 if (unknown_flags_removed
)
184 "Unknown link flags lost: %#.5x (ignoring)",
185 unknown_flags_removed
);
189 link
->kernel_operstate
= operstate
;
196 static int link_new(Manager
*manager
, sd_rtnl_message
*message
, Link
**ret
) {
197 _cleanup_link_unref_ Link
*link
= NULL
;
206 r
= sd_rtnl_message_get_type(message
, &type
);
209 else if (type
!= RTM_NEWLINK
)
212 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
215 else if (ifindex
<= 0)
218 r
= sd_rtnl_message_read_string(message
, IFLA_IFNAME
, &ifname
);
222 link
= new0(Link
, 1);
227 link
->manager
= manager
;
228 link
->state
= LINK_STATE_PENDING
;
229 link
->rtnl_extended_attrs
= true;
230 link
->ifindex
= ifindex
;
231 link
->ifname
= strdup(ifname
);
235 r
= sd_rtnl_message_read_ether_addr(message
, IFLA_ADDRESS
, &link
->mac
);
237 log_link_debug(link
, "MAC address not found for new device, continuing without");
239 r
= asprintf(&link
->state_file
, "/run/systemd/netif/links/%d",
244 r
= asprintf(&link
->lease_file
, "/run/systemd/netif/leases/%d",
249 r
= asprintf(&link
->lldp_file
, "/run/systemd/netif/lldp/%d",
255 r
= hashmap_ensure_allocated(&manager
->links
, NULL
);
259 r
= hashmap_put(manager
->links
, INT_TO_PTR(link
->ifindex
), link
);
263 r
= link_update_flags(link
, message
);
273 static void link_free(Link
*link
) {
281 while ((address
= link
->addresses
)) {
282 LIST_REMOVE(addresses
, link
->addresses
, address
);
283 address_free(address
);
286 while ((address
= link
->pool_addresses
)) {
287 LIST_REMOVE(addresses
, link
->pool_addresses
, address
);
288 address_free(address
);
291 sd_dhcp_server_unref(link
->dhcp_server
);
292 sd_dhcp_client_unref(link
->dhcp_client
);
293 sd_dhcp_lease_unref(link
->dhcp_lease
);
295 free(link
->lease_file
);
297 sd_lldp_free(link
->lldp
);
299 free(link
->lldp_file
);
301 sd_ipv4ll_unref(link
->ipv4ll
);
302 sd_dhcp6_client_unref(link
->dhcp6_client
);
303 sd_icmp6_nd_unref(link
->icmp6_router_discovery
);
306 hashmap_remove(link
->manager
->links
, INT_TO_PTR(link
->ifindex
));
310 free(link
->state_file
);
312 udev_device_unref(link
->udev_device
);
314 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
)
315 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(carrier
->ifindex
));
316 hashmap_free(link
->bound_to_links
);
318 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
)
319 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(carrier
->ifindex
));
320 hashmap_free(link
->bound_by_links
);
325 Link
*link_unref(Link
*link
) {
326 if (link
&& (-- link
->n_ref
<= 0))
332 Link
*link_ref(Link
*link
) {
334 assert_se(++ link
->n_ref
>= 2);
339 int link_get(Manager
*m
, int ifindex
, Link
**ret
) {
346 link
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
355 static void link_set_state(Link
*link
, LinkState state
) {
358 if (link
->state
== state
)
363 link_send_changed(link
, "AdministrativeState", NULL
);
368 static void link_enter_unmanaged(Link
*link
) {
371 log_link_debug(link
, "Unmanaged");
373 link_set_state(link
, LINK_STATE_UNMANAGED
);
378 static int link_stop_clients(Link
*link
) {
382 assert(link
->manager
);
383 assert(link
->manager
->event
);
388 if (link
->dhcp_client
) {
389 k
= sd_dhcp_client_stop(link
->dhcp_client
);
391 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv4 client: %m");
395 k
= sd_ipv4ll_stop(link
->ipv4ll
);
397 r
= log_link_warning_errno(link
, r
, "Could not stop IPv4 link-local: %m");
400 if(link
->icmp6_router_discovery
) {
401 if (link
->dhcp6_client
) {
402 k
= sd_dhcp6_client_stop(link
->dhcp6_client
);
404 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv6 client: %m");
407 k
= sd_icmp6_nd_stop(link
->icmp6_router_discovery
);
409 r
= log_link_warning_errno(link
, r
, "Could not stop ICMPv6 router discovery: %m");
413 k
= sd_lldp_stop(link
->lldp
);
415 r
= log_link_warning_errno(link
, r
, "Could not stop LLDP: %m");
421 void link_enter_failed(Link
*link
) {
424 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
427 log_link_warning(link
, "Failed");
429 link_set_state(link
, LINK_STATE_FAILED
);
431 link_stop_clients(link
);
436 static Address
* link_find_dhcp_server_address(Link
*link
) {
440 assert(link
->network
);
442 /* The first statically configured address if there is any */
443 LIST_FOREACH(addresses
, address
, link
->network
->static_addresses
) {
445 if (address
->family
!= AF_INET
)
448 if (in_addr_is_null(address
->family
, &address
->in_addr
))
454 /* If that didn't work, find a suitable address we got from the pool */
455 LIST_FOREACH(addresses
, address
, link
->pool_addresses
) {
456 if (address
->family
!= AF_INET
)
465 static int link_enter_configured(Link
*link
) {
467 assert(link
->network
);
468 assert(link
->state
== LINK_STATE_SETTING_ROUTES
);
470 log_link_info(link
, "Configured");
472 link_set_state(link
, LINK_STATE_CONFIGURED
);
479 void link_client_handler(Link
*link
) {
481 assert(link
->network
);
483 if (!link
->static_configured
)
486 if (link_ipv4ll_enabled(link
))
487 if (!link
->ipv4ll_address
||
491 if (link_dhcp4_enabled(link
) && !link
->dhcp4_configured
)
494 if (link
->state
!= LINK_STATE_CONFIGURED
)
495 link_enter_configured(link
);
500 static int route_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
501 _cleanup_link_unref_ Link
*link
= userdata
;
504 assert(link
->link_messages
> 0);
505 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
506 LINK_STATE_SETTING_ROUTES
, LINK_STATE_FAILED
,
509 link
->link_messages
--;
511 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
514 r
= sd_rtnl_message_get_errno(m
);
515 if (r
< 0 && r
!= -EEXIST
)
516 log_link_warning_errno(link
, r
, "%-*s: could not set route: %m", IFNAMSIZ
, link
->ifname
);
518 if (link
->link_messages
== 0) {
519 log_link_debug(link
, "Routes set");
520 link
->static_configured
= true;
521 link_client_handler(link
);
527 static int link_enter_set_routes(Link
*link
) {
532 assert(link
->network
);
533 assert(link
->state
== LINK_STATE_SETTING_ADDRESSES
);
535 link_set_state(link
, LINK_STATE_SETTING_ROUTES
);
537 LIST_FOREACH(routes
, rt
, link
->network
->static_routes
) {
538 r
= route_configure(rt
, link
, &route_handler
);
540 log_link_warning_errno(link
, r
, "Could not set routes: %m");
541 link_enter_failed(link
);
545 link
->link_messages
++;
548 if (link
->link_messages
== 0) {
549 link
->static_configured
= true;
550 link_client_handler(link
);
552 log_link_debug(link
, "Setting routes");
557 int link_route_drop_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
558 _cleanup_link_unref_ Link
*link
= userdata
;
563 assert(link
->ifname
);
565 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
568 r
= sd_rtnl_message_get_errno(m
);
569 if (r
< 0 && r
!= -ESRCH
)
570 log_link_warning_errno(link
, r
, "%-*s: could not drop route: %m", IFNAMSIZ
, link
->ifname
);
575 static int address_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
576 _cleanup_link_unref_ Link
*link
= userdata
;
582 assert(link
->ifname
);
583 assert(link
->link_messages
> 0);
584 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
585 LINK_STATE_FAILED
, LINK_STATE_LINGER
));
587 link
->link_messages
--;
589 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
592 r
= sd_rtnl_message_get_errno(m
);
593 if (r
< 0 && r
!= -EEXIST
)
594 log_link_warning_errno(link
, r
, "%-*s: could not set address: %m", IFNAMSIZ
, link
->ifname
);
596 link_rtnl_process_address(rtnl
, m
, link
->manager
);
598 if (link
->link_messages
== 0) {
599 log_link_debug(link
, "Addresses set");
600 link_enter_set_routes(link
);
606 static int link_enter_set_addresses(Link
*link
) {
611 assert(link
->network
);
612 assert(link
->state
!= _LINK_STATE_INVALID
);
614 link_set_state(link
, LINK_STATE_SETTING_ADDRESSES
);
616 LIST_FOREACH(addresses
, ad
, link
->network
->static_addresses
) {
617 r
= address_configure(ad
, link
, &address_handler
);
619 log_link_warning_errno(link
, r
, "Could not set addresses: %m");
620 link_enter_failed(link
);
624 link
->link_messages
++;
627 /* now that we can figure out a default address for the dhcp server,
629 if (link_dhcp4_server_enabled(link
)) {
630 struct in_addr pool_start
;
633 address
= link_find_dhcp_server_address(link
);
635 log_link_warning(link
, "Failed to find suitable address for DHCPv4 server instance.");
636 link_enter_failed(link
);
640 r
= sd_dhcp_server_set_address(link
->dhcp_server
,
641 &address
->in_addr
.in
,
646 /* offer 32 addresses starting from the address following the server address */
647 pool_start
.s_addr
= htobe32(be32toh(address
->in_addr
.in
.s_addr
) + 1);
648 r
= sd_dhcp_server_set_lease_pool(link
->dhcp_server
,
654 r = sd_dhcp_server_set_router(link->dhcp_server,
655 &main_address->in_addr.in);
659 r = sd_dhcp_server_set_prefixlen(link->dhcp_server,
660 main_address->prefixlen);
665 r
= sd_dhcp_server_start(link
->dhcp_server
);
667 log_link_warning_errno(link
, r
, "Could not start DHCPv4 server instance: %m");
669 link_enter_failed(link
);
674 log_link_debug(link
, "Offering DHCPv4 leases");
677 if (link
->link_messages
== 0)
678 link_enter_set_routes(link
);
680 log_link_debug(link
, "Setting addresses");
685 int link_address_drop_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
686 _cleanup_link_unref_ Link
*link
= userdata
;
691 assert(link
->ifname
);
693 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
696 r
= sd_rtnl_message_get_errno(m
);
697 if (r
< 0 && r
!= -EADDRNOTAVAIL
)
698 log_link_warning_errno(link
, r
, "%-*s: could not drop address: %m", IFNAMSIZ
, link
->ifname
);
703 static int link_set_bridge_fdb(Link
*const link
) {
707 LIST_FOREACH(static_fdb_entries
, fdb_entry
, link
->network
->static_fdb_entries
) {
708 r
= fdb_entry_configure(link
, fdb_entry
);
710 log_link_error_errno(link
, r
, "Failed to add MAC entry to static MAC table: %m");
718 static int link_set_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
719 _cleanup_link_unref_ Link
*link
= userdata
;
722 log_link_debug(link
, "Set link");
724 r
= sd_rtnl_message_get_errno(m
);
725 if (r
< 0 && r
!= -EEXIST
) {
726 log_link_error_errno(link
, r
, "Could not join netdev: %m");
727 link_enter_failed(link
);
734 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
735 _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
);
746 log_link_warning_errno(link
, r
, "Could not set hostname: %m");
751 int link_set_hostname(Link
*link
, const char *hostname
) {
752 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
756 assert(link
->manager
);
759 log_link_debug(link
, "Setting transient hostname: '%s'", hostname
);
761 if (!link
->manager
->bus
) {
762 /* TODO: replace by assert when we can rely on kdbus */
763 log_link_info(link
, "Not connected to system bus, ignoring transient hostname.");
767 r
= sd_bus_message_new_method_call(
770 "org.freedesktop.hostname1",
771 "/org/freedesktop/hostname1",
772 "org.freedesktop.hostname1",
777 r
= sd_bus_message_append(m
, "sb", hostname
, false);
781 r
= sd_bus_call_async(link
->manager
->bus
, NULL
, m
, set_hostname_handler
,
784 return log_link_error_errno(link
, r
, "Could not set transient hostname: %m");
791 static int set_mtu_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
792 _cleanup_link_unref_ Link
*link
= userdata
;
797 assert(link
->ifname
);
799 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
802 r
= sd_rtnl_message_get_errno(m
);
804 log_link_warning_errno(link
, r
, "%-*s: could not set MTU: %m", IFNAMSIZ
, link
->ifname
);
809 int link_set_mtu(Link
*link
, uint32_t mtu
) {
810 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
;
814 assert(link
->manager
);
815 assert(link
->manager
->rtnl
);
817 log_link_debug(link
, "Setting MTU: %" PRIu32
, mtu
);
819 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
821 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
823 r
= sd_rtnl_message_append_u32(req
, IFLA_MTU
, mtu
);
825 return log_link_error_errno(link
, r
, "Could not append MTU: %m");
827 r
= sd_rtnl_call_async(link
->manager
->rtnl
, req
, set_mtu_handler
, link
, 0, NULL
);
829 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
836 static int link_set_bridge(Link
*link
) {
837 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
;
841 assert(link
->network
);
843 if(link
->network
->cost
== 0)
846 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
848 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
850 r
= sd_rtnl_message_link_set_family(req
, PF_BRIDGE
);
852 return log_link_error_errno(link
, r
, "Could not set message family: %m");
854 r
= sd_rtnl_message_open_container(req
, IFLA_PROTINFO
);
856 return log_link_error_errno(link
, r
, "Could not append IFLA_PROTINFO attribute: %m");
858 if(link
->network
->cost
!= 0) {
859 r
= sd_rtnl_message_append_u32(req
, IFLA_BRPORT_COST
, link
->network
->cost
);
861 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_COST attribute: %m");
864 r
= sd_rtnl_message_close_container(req
);
866 return log_link_error_errno(link
, r
, "Could not append IFLA_LINKINFO attribute: %m");
868 r
= sd_rtnl_call_async(link
->manager
->rtnl
, req
, link_set_handler
, link
, 0, NULL
);
870 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
877 static void lldp_handler(sd_lldp
*lldp
, int event
, void *userdata
) {
878 Link
*link
= userdata
;
882 assert(link
->network
);
883 assert(link
->manager
);
885 if (event
!= UPDATE_INFO
)
888 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
890 log_link_warning_errno(link
, r
, "Could not save LLDP: %m");
894 static int link_acquire_conf(Link
*link
) {
898 assert(link
->network
);
899 assert(link
->manager
);
900 assert(link
->manager
->event
);
902 if (link_ipv4ll_enabled(link
)) {
903 assert(link
->ipv4ll
);
905 log_link_debug(link
, "Acquiring IPv4 link-local address");
907 r
= sd_ipv4ll_start(link
->ipv4ll
);
909 return log_link_warning_errno(link
, r
, "Could not acquire IPv4 link-local address: %m");
912 if (link_dhcp4_enabled(link
)) {
913 assert(link
->dhcp_client
);
915 log_link_debug(link
, "Acquiring DHCPv4 lease");
917 r
= sd_dhcp_client_start(link
->dhcp_client
);
919 return log_link_warning_errno(link
, r
, "Could not acquire DHCPv4 lease: %m");
922 if (link_dhcp6_enabled(link
)) {
923 assert(link
->icmp6_router_discovery
);
925 log_link_debug(link
, "Discovering IPv6 routers");
927 r
= sd_icmp6_router_solicitation_start(link
->icmp6_router_discovery
);
929 return log_link_warning_errno(link
, r
, "Could not start IPv6 router discovery: %m");
932 if (link_lldp_enabled(link
)) {
935 log_link_debug(link
, "Starting LLDP");
937 r
= sd_lldp_start(link
->lldp
);
939 return log_link_warning_errno(link
, r
, "Could not start LLDP: %m");
945 bool link_has_carrier(Link
*link
) {
946 /* see Documentation/networking/operstates.txt in the kernel sources */
948 if (link
->kernel_operstate
== IF_OPER_UP
)
951 if (link
->kernel_operstate
== IF_OPER_UNKNOWN
)
952 /* operstate may not be implemented, so fall back to flags */
953 if ((link
->flags
& IFF_LOWER_UP
) && !(link
->flags
& IFF_DORMANT
))
959 static int link_up_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
960 _cleanup_link_unref_ Link
*link
= userdata
;
965 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
968 r
= sd_rtnl_message_get_errno(m
);
970 /* we warn but don't fail the link, as it may be
972 log_link_warning_errno(link
, r
, "%-*s: could not bring up interface: %m", IFNAMSIZ
, link
->ifname
);
977 static int link_up(Link
*link
) {
978 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
;
983 assert(link
->network
);
984 assert(link
->manager
);
985 assert(link
->manager
->rtnl
);
987 log_link_debug(link
, "Bringing link up");
989 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
991 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
993 r
= sd_rtnl_message_link_set_flags(req
, IFF_UP
, IFF_UP
);
995 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
997 if (link
->network
->mac
) {
998 r
= sd_rtnl_message_append_ether_addr(req
, IFLA_ADDRESS
, link
->network
->mac
);
1000 return log_link_error_errno(link
, r
, "Could not set MAC address: %m");
1003 if (link
->network
->mtu
) {
1004 r
= sd_rtnl_message_append_u32(req
, IFLA_MTU
, link
->network
->mtu
);
1006 return log_link_error_errno(link
, r
, "Could not set MTU: %m");
1009 r
= sd_rtnl_message_open_container(req
, IFLA_AF_SPEC
);
1011 return log_link_error_errno(link
, r
, "Could not open IFLA_AF_SPEC container: %m");
1013 if (socket_ipv6_is_supported()) {
1014 /* if the kernel lacks ipv6 support setting IFF_UP fails if any ipv6 options are passed */
1015 r
= sd_rtnl_message_open_container(req
, AF_INET6
);
1017 return log_link_error_errno(link
, r
, "Could not open AF_INET6 container: %m");
1019 ipv6ll_mode
= link_ipv6ll_enabled(link
) ? IN6_ADDR_GEN_MODE_EUI64
: IN6_ADDR_GEN_MODE_NONE
;
1020 r
= sd_rtnl_message_append_u8(req
, IFLA_INET6_ADDR_GEN_MODE
, ipv6ll_mode
);
1022 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_ADDR_GEN_MODE: %m");
1024 if (!in_addr_is_null(AF_INET6
, &link
->network
->ipv6_token
)) {
1025 r
= sd_rtnl_message_append_in6_addr(req
, IFLA_INET6_TOKEN
, &link
->network
->ipv6_token
.in6
);
1027 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_TOKEN: %m");
1030 r
= sd_rtnl_message_close_container(req
);
1032 return log_link_error_errno(link
, r
, "Could not close AF_INET6 container: %m");
1035 r
= sd_rtnl_message_close_container(req
);
1037 return log_link_error_errno(link
, r
, "Could not close IFLA_AF_SPEC container: %m");
1039 r
= sd_rtnl_call_async(link
->manager
->rtnl
, req
, link_up_handler
, link
, 0, NULL
);
1041 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1048 static int link_down_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
1049 _cleanup_link_unref_ Link
*link
= userdata
;
1054 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1057 r
= sd_rtnl_message_get_errno(m
);
1059 log_link_warning_errno(link
, r
, "%-*s: could not bring down interface: %m", IFNAMSIZ
, link
->ifname
);
1064 static int link_down(Link
*link
) {
1065 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
;
1069 assert(link
->manager
);
1070 assert(link
->manager
->rtnl
);
1072 log_link_debug(link
, "Bringing link down");
1074 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
,
1075 RTM_SETLINK
, link
->ifindex
);
1077 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1079 r
= sd_rtnl_message_link_set_flags(req
, 0, IFF_UP
);
1081 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1083 r
= sd_rtnl_call_async(link
->manager
->rtnl
, req
, link_down_handler
, link
, 0, NULL
);
1085 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1092 static int link_handle_bound_to_list(Link
*link
) {
1096 bool required_up
= false;
1097 bool link_is_up
= false;
1101 if (hashmap_isempty(link
->bound_to_links
))
1104 if (link
->flags
& IFF_UP
)
1107 HASHMAP_FOREACH (l
, link
->bound_to_links
, i
)
1108 if (link_has_carrier(l
)) {
1113 if (!required_up
&& link_is_up
) {
1114 r
= link_down(link
);
1117 } else if (required_up
&& !link_is_up
) {
1126 static int link_handle_bound_by_list(Link
*link
) {
1133 if (hashmap_isempty(link
->bound_by_links
))
1136 HASHMAP_FOREACH (l
, link
->bound_by_links
, i
) {
1137 r
= link_handle_bound_to_list(l
);
1145 static int link_put_carrier(Link
*link
, Link
*carrier
, Hashmap
**h
) {
1151 if (link
== carrier
)
1154 if (hashmap_get(*h
, INT_TO_PTR(carrier
->ifindex
)))
1157 r
= hashmap_ensure_allocated(h
, NULL
);
1161 r
= hashmap_put(*h
, INT_TO_PTR(carrier
->ifindex
), carrier
);
1168 static int link_new_bound_by_list(Link
*link
) {
1173 bool list_updated
= false;
1176 assert(link
->manager
);
1180 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1181 if (!carrier
->network
)
1184 if (strv_isempty(carrier
->network
->bind_carrier
))
1187 if (strv_fnmatch(carrier
->network
->bind_carrier
, link
->ifname
, 0)) {
1188 r
= link_put_carrier(link
, carrier
, &link
->bound_by_links
);
1192 list_updated
= true;
1199 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
) {
1200 r
= link_put_carrier(carrier
, link
, &carrier
->bound_to_links
);
1210 static int link_new_bound_to_list(Link
*link
) {
1215 bool list_updated
= false;
1218 assert(link
->manager
);
1223 if (strv_isempty(link
->network
->bind_carrier
))
1228 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1229 if (strv_fnmatch(link
->network
->bind_carrier
, carrier
->ifname
, 0)) {
1230 r
= link_put_carrier(link
, carrier
, &link
->bound_to_links
);
1234 list_updated
= true;
1241 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
) {
1242 r
= link_put_carrier(carrier
, link
, &carrier
->bound_by_links
);
1252 static int link_new_carrier_maps(Link
*link
) {
1255 r
= link_new_bound_by_list(link
);
1259 r
= link_handle_bound_by_list(link
);
1263 r
= link_new_bound_to_list(link
);
1267 r
= link_handle_bound_to_list(link
);
1274 static void link_free_bound_to_list(Link
*link
) {
1278 HASHMAP_FOREACH (bound_to
, link
->bound_to_links
, i
) {
1279 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(bound_to
->ifindex
));
1281 if (hashmap_remove(bound_to
->bound_by_links
, INT_TO_PTR(link
->ifindex
)))
1282 link_save(bound_to
);
1288 static void link_free_bound_by_list(Link
*link
) {
1292 HASHMAP_FOREACH (bound_by
, link
->bound_by_links
, i
) {
1293 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(bound_by
->ifindex
));
1295 if (hashmap_remove(bound_by
->bound_to_links
, INT_TO_PTR(link
->ifindex
))) {
1296 link_save(bound_by
);
1297 link_handle_bound_to_list(bound_by
);
1304 static void link_free_carrier_maps(Link
*link
) {
1305 bool list_updated
= false;
1309 if (!hashmap_isempty(link
->bound_to_links
)) {
1310 link_free_bound_to_list(link
);
1311 list_updated
= true;
1314 if (!hashmap_isempty(link
->bound_by_links
)) {
1315 link_free_bound_by_list(link
);
1316 list_updated
= true;
1325 void link_drop(Link
*link
) {
1326 if (!link
|| link
->state
== LINK_STATE_LINGER
)
1329 link_set_state(link
, LINK_STATE_LINGER
);
1331 link_free_carrier_maps(link
);
1333 log_link_debug(link
, "Link removed");
1340 static int link_joined(Link
*link
) {
1344 assert(link
->network
);
1346 if (!hashmap_isempty(link
->bound_to_links
)) {
1347 r
= link_handle_bound_to_list(link
);
1350 } else if (!(link
->flags
& IFF_UP
)) {
1353 link_enter_failed(link
);
1358 if(link
->network
->bridge
) {
1359 r
= link_set_bridge(link
);
1361 log_link_error_errno(link
, r
, "Could not set bridge message: %m");
1364 return link_enter_set_addresses(link
);
1367 static int netdev_join_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
,
1369 _cleanup_link_unref_ Link
*link
= userdata
;
1373 assert(link
->network
);
1377 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1380 r
= sd_rtnl_message_get_errno(m
);
1381 if (r
< 0 && r
!= -EEXIST
) {
1382 log_link_error_errno(link
, r
, "%-*s: could not join netdev: %m", IFNAMSIZ
, link
->ifname
);
1383 link_enter_failed(link
);
1386 log_link_debug(link
, "Joined netdev");
1388 if (link
->enslaving
<= 0)
1394 static int link_enter_join_netdev(Link
*link
) {
1400 assert(link
->network
);
1401 assert(link
->state
== LINK_STATE_PENDING
);
1403 link_set_state(link
, LINK_STATE_ENSLAVING
);
1407 if (!link
->network
->bridge
&&
1408 !link
->network
->bond
&&
1409 hashmap_isempty(link
->network
->stacked_netdevs
))
1410 return link_joined(link
);
1412 if (link
->network
->bond
) {
1413 log_struct(LOG_DEBUG
,
1414 LOG_LINK_INTERFACE(link
),
1415 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1416 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bond
->ifname
),
1419 r
= netdev_join(link
->network
->bond
, link
, netdev_join_handler
);
1421 log_struct_errno(LOG_WARNING
, r
,
1422 LOG_LINK_INTERFACE(link
),
1423 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1424 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bond
->ifname
),
1427 link_enter_failed(link
);
1434 if (link
->network
->bridge
) {
1435 log_struct(LOG_DEBUG
,
1436 LOG_LINK_INTERFACE(link
),
1437 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1438 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bridge
->ifname
),
1441 r
= netdev_join(link
->network
->bridge
, link
, netdev_join_handler
);
1443 log_struct_errno(LOG_WARNING
, r
,
1444 LOG_LINK_INTERFACE(link
),
1445 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1446 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bridge
->ifname
),
1448 link_enter_failed(link
);
1455 HASHMAP_FOREACH(netdev
, link
->network
->stacked_netdevs
, i
) {
1457 log_struct(LOG_DEBUG
,
1458 LOG_LINK_INTERFACE(link
),
1459 LOG_NETDEV_INTERFACE(netdev
),
1460 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", netdev
->ifname
),
1463 r
= netdev_join(netdev
, link
, netdev_join_handler
);
1465 log_struct_errno(LOG_WARNING
, r
,
1466 LOG_LINK_INTERFACE(link
),
1467 LOG_NETDEV_INTERFACE(netdev
),
1468 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", netdev
->ifname
),
1470 link_enter_failed(link
);
1480 static int link_set_ipv4_forward(Link
*link
) {
1481 const char *p
= NULL
;
1484 if (link
->network
->ip_forward
== ADDRESS_FAMILY_KERNEL
)
1487 p
= strjoina("/proc/sys/net/ipv4/conf/", link
->ifname
, "/forwarding");
1488 r
= write_string_file_no_create(p
, one_zero(link_ipv4_forward_enabled(link
)));
1490 log_link_warning_errno(link
, r
, "Cannot configure IPv4 forwarding for interface %s: %m", link
->ifname
);
1495 static int link_set_ipv6_forward(Link
*link
) {
1496 const char *p
= NULL
;
1499 /* Make this a NOP if IPv6 is not available */
1500 if (!socket_ipv6_is_supported())
1503 if (link
->network
->ip_forward
== ADDRESS_FAMILY_KERNEL
)
1506 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/forwarding");
1507 r
= write_string_file_no_create(p
, one_zero(link_ipv6_forward_enabled(link
)));
1509 log_link_warning_errno(link
, r
, "Cannot configure IPv6 forwarding for interface: %m");
1514 static int link_configure(Link
*link
) {
1518 assert(link
->network
);
1519 assert(link
->state
== LINK_STATE_PENDING
);
1521 r
= link_set_bridge_fdb(link
);
1525 r
= link_set_ipv4_forward(link
);
1529 r
= link_set_ipv6_forward(link
);
1533 if (link_ipv4ll_enabled(link
)) {
1534 r
= ipv4ll_configure(link
);
1539 if (link_dhcp4_enabled(link
)) {
1540 r
= dhcp4_configure(link
);
1545 if (link_dhcp4_server_enabled(link
)) {
1546 r
= sd_dhcp_server_new(&link
->dhcp_server
, link
->ifindex
);
1550 r
= sd_dhcp_server_attach_event(link
->dhcp_server
, NULL
, 0);
1555 if (link_dhcp6_enabled(link
)) {
1556 r
= icmp6_configure(link
);
1561 if (link_lldp_enabled(link
)) {
1562 r
= sd_lldp_new(link
->ifindex
, link
->ifname
, &link
->mac
, &link
->lldp
);
1566 r
= sd_lldp_attach_event(link
->lldp
, NULL
, 0);
1570 r
= sd_lldp_set_callback(link
->lldp
,
1571 lldp_handler
, link
);
1576 if (link_has_carrier(link
)) {
1577 r
= link_acquire_conf(link
);
1582 return link_enter_join_netdev(link
);
1585 static int link_initialized_and_synced(sd_rtnl
*rtnl
, sd_rtnl_message
*m
,
1587 _cleanup_link_unref_ Link
*link
= userdata
;
1592 assert(link
->ifname
);
1593 assert(link
->manager
);
1595 if (link
->state
!= LINK_STATE_PENDING
)
1598 log_link_debug(link
, "Link state is up-to-date");
1600 r
= link_new_bound_by_list(link
);
1604 r
= link_handle_bound_by_list(link
);
1608 r
= network_get(link
->manager
, link
->udev_device
, link
->ifname
,
1609 &link
->mac
, &network
);
1611 link_enter_unmanaged(link
);
1616 if (link
->flags
& IFF_LOOPBACK
) {
1617 if (network
->link_local
!= ADDRESS_FAMILY_NO
)
1618 log_link_debug(link
, "Ignoring link-local autoconfiguration for loopback link");
1620 if (network
->dhcp
!= ADDRESS_FAMILY_NO
)
1621 log_link_debug(link
, "Ignoring DHCP clients for loopback link");
1623 if (network
->dhcp_server
)
1624 log_link_debug(link
, "Ignoring DHCP server for loopback link");
1627 r
= network_apply(link
->manager
, network
, link
);
1631 r
= link_new_bound_to_list(link
);
1635 r
= link_configure(link
);
1642 int link_initialized(Link
*link
, struct udev_device
*device
) {
1643 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
;
1647 assert(link
->manager
);
1648 assert(link
->manager
->rtnl
);
1651 if (link
->state
!= LINK_STATE_PENDING
)
1654 if (link
->udev_device
)
1657 log_link_debug(link
, "udev initialized link");
1659 link
->udev_device
= udev_device_ref(device
);
1661 /* udev has initialized the link, but we don't know if we have yet
1662 * processed the NEWLINK messages with the latest state. Do a GETLINK,
1663 * when it returns we know that the pending NEWLINKs have already been
1664 * processed and that we are up-to-date */
1666 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_GETLINK
,
1671 r
= sd_rtnl_call_async(link
->manager
->rtnl
, req
,
1672 link_initialized_and_synced
, link
, 0, NULL
);
1681 static Address
* link_get_equal_address(Link
*link
, Address
*needle
) {
1687 LIST_FOREACH(addresses
, i
, link
->addresses
)
1688 if (address_equal(i
, needle
))
1694 int link_rtnl_process_address(sd_rtnl
*rtnl
, sd_rtnl_message
*message
, void *userdata
) {
1695 Manager
*m
= userdata
;
1698 _cleanup_address_free_ Address
*address
= NULL
;
1699 unsigned char flags
;
1701 char buf
[INET6_ADDRSTRLEN
], valid_buf
[FORMAT_TIMESPAN_MAX
];
1702 const char *valid_str
= NULL
;
1709 if (sd_rtnl_message_is_error(message
)) {
1710 r
= sd_rtnl_message_get_errno(message
);
1712 log_warning_errno(r
, "rtnl: failed to receive address: %m");
1717 r
= sd_rtnl_message_get_type(message
, &type
);
1719 log_warning_errno(r
, "rtnl: could not get message type: %m");
1721 } else if (type
!= RTM_NEWADDR
&& type
!= RTM_DELADDR
) {
1722 log_warning("rtnl: received unexpected message type when processing address");
1726 r
= sd_rtnl_message_addr_get_ifindex(message
, &ifindex
);
1728 log_warning_errno(r
, "rtnl: could not get ifindex from address: %m");
1730 } else if (ifindex
<= 0) {
1731 log_warning("rtnl: received address message with invalid ifindex: %d", ifindex
);
1734 r
= link_get(m
, ifindex
, &link
);
1735 if (r
< 0 || !link
) {
1736 /* when enumerating we might be out of sync, but we will
1737 * get the address again, so just ignore it */
1738 if (!m
->enumerating
)
1739 log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex
);
1744 r
= address_new_dynamic(&address
);
1748 r
= sd_rtnl_message_addr_get_family(message
, &address
->family
);
1749 if (r
< 0 || !IN_SET(address
->family
, AF_INET
, AF_INET6
)) {
1750 log_link_warning(link
, "rtnl: received address with invalid family, ignoring.");
1754 r
= sd_rtnl_message_addr_get_prefixlen(message
, &address
->prefixlen
);
1756 log_link_warning_errno(link
, r
, "rtnl: received address with invalid prefixlen, ignoring: %m");
1760 r
= sd_rtnl_message_addr_get_scope(message
, &address
->scope
);
1762 log_link_warning_errno(link
, r
, "rtnl: received address with invalid scope, ignoring: %m");
1766 r
= sd_rtnl_message_addr_get_flags(message
, &flags
);
1768 log_link_warning_errno(link
, r
, "rtnl: received address with invalid flags, ignoring: %m");
1771 address
->flags
= flags
;
1773 switch (address
->family
) {
1775 r
= sd_rtnl_message_read_in_addr(message
, IFA_LOCAL
, &address
->in_addr
.in
);
1777 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
1784 r
= sd_rtnl_message_read_in6_addr(message
, IFA_ADDRESS
, &address
->in_addr
.in6
);
1786 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
1793 assert_not_reached("invalid address family");
1796 if (!inet_ntop(address
->family
, &address
->in_addr
, buf
, INET6_ADDRSTRLEN
)) {
1797 log_link_warning(link
, "Could not print address");
1801 r
= sd_rtnl_message_read_cache_info(message
, IFA_CACHEINFO
, &address
->cinfo
);
1803 if (address
->cinfo
.ifa_valid
== CACHE_INFO_INFINITY_LIFE_TIME
)
1806 valid_str
= format_timespan(valid_buf
, FORMAT_TIMESPAN_MAX
,
1807 address
->cinfo
.ifa_valid
* USEC_PER_SEC
,
1811 existing
= link_get_equal_address(link
, address
);
1816 log_link_debug(link
, "Updating address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
1819 existing
->scope
= address
->scope
;
1820 existing
->flags
= address
->flags
;
1821 existing
->cinfo
= address
->cinfo
;
1824 log_link_debug(link
, "Adding address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
1826 LIST_PREPEND(addresses
, link
->addresses
, address
);
1827 address_establish(address
, link
);
1839 log_link_debug(link
, "Removing address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
1840 address_release(existing
, link
);
1841 LIST_REMOVE(addresses
, link
->addresses
, existing
);
1842 address_free(existing
);
1844 log_link_warning(link
, "Removing non-existent address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
1848 assert_not_reached("Received invalid RTNL message type");
1854 int link_add(Manager
*m
, sd_rtnl_message
*message
, Link
**ret
) {
1856 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
1857 char ifindex_str
[2 + DECIMAL_STR_MAX(int)];
1865 r
= link_new(m
, message
, ret
);
1871 log_link_debug(link
, "Link %d added", link
->ifindex
);
1873 if (detect_container(NULL
) <= 0) {
1874 /* not in a container, udev will be around */
1875 sprintf(ifindex_str
, "n%d", link
->ifindex
);
1876 device
= udev_device_new_from_device_id(m
->udev
, ifindex_str
);
1878 return log_link_warning_errno(link
, errno
, "Could not find udev device: %m");
1880 if (udev_device_get_is_initialized(device
) <= 0) {
1882 log_link_debug(link
, "link pending udev initialization...");
1886 r
= link_initialized(link
, device
);
1890 /* we are calling a callback directly, so must take a ref */
1893 r
= link_initialized_and_synced(m
->rtnl
, NULL
, link
);
1901 static int link_carrier_gained(Link
*link
) {
1906 if (link
->network
) {
1907 r
= link_acquire_conf(link
);
1909 link_enter_failed(link
);
1914 r
= link_handle_bound_by_list(link
);
1921 static int link_carrier_lost(Link
*link
) {
1926 r
= link_stop_clients(link
);
1928 link_enter_failed(link
);
1932 r
= link_handle_bound_by_list(link
);
1939 int link_carrier_reset(Link
*link
) {
1944 if (link_has_carrier(link
)) {
1945 r
= link_carrier_lost(link
);
1949 r
= link_carrier_gained(link
);
1953 log_link_info(link
, "Reset carrier");
1960 int link_update(Link
*link
, sd_rtnl_message
*m
) {
1961 struct ether_addr mac
;
1964 bool had_carrier
, carrier_gained
, carrier_lost
;
1968 assert(link
->ifname
);
1971 if (link
->state
== LINK_STATE_LINGER
) {
1973 log_link_info(link
, "Link readded");
1974 link_set_state(link
, LINK_STATE_ENSLAVING
);
1976 r
= link_new_carrier_maps(link
);
1981 r
= sd_rtnl_message_read_string(m
, IFLA_IFNAME
, &ifname
);
1982 if (r
>= 0 && !streq(ifname
, link
->ifname
)) {
1983 log_link_info(link
, "Renamed to %s", ifname
);
1985 link_free_carrier_maps(link
);
1988 link
->ifname
= strdup(ifname
);
1992 r
= link_new_carrier_maps(link
);
1997 r
= sd_rtnl_message_read_u32(m
, IFLA_MTU
, &mtu
);
1998 if (r
>= 0 && mtu
> 0) {
2000 if (!link
->original_mtu
) {
2001 link
->original_mtu
= mtu
;
2002 log_link_debug(link
, "Saved original MTU: %" PRIu32
, link
->original_mtu
);
2005 if (link
->dhcp_client
) {
2006 r
= sd_dhcp_client_set_mtu(link
->dhcp_client
,
2009 log_link_warning_errno(link
, r
, "Could not update MTU in DHCP client: %m");
2015 /* The kernel may broadcast NEWLINK messages without the MAC address
2016 set, simply ignore them. */
2017 r
= sd_rtnl_message_read_ether_addr(m
, IFLA_ADDRESS
, &mac
);
2019 if (memcmp(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2022 memcpy(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2025 log_link_debug(link
, "MAC address: "
2026 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2027 mac
.ether_addr_octet
[0],
2028 mac
.ether_addr_octet
[1],
2029 mac
.ether_addr_octet
[2],
2030 mac
.ether_addr_octet
[3],
2031 mac
.ether_addr_octet
[4],
2032 mac
.ether_addr_octet
[5]);
2035 r
= sd_ipv4ll_set_mac(link
->ipv4ll
, &link
->mac
);
2037 return log_link_warning_errno(link
, r
, "Could not update MAC address in IPv4LL client: %m");
2040 if (link
->dhcp_client
) {
2041 r
= sd_dhcp_client_set_mac(link
->dhcp_client
,
2042 (const uint8_t *) &link
->mac
,
2046 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCP client: %m");
2049 if (link
->dhcp6_client
) {
2050 r
= sd_dhcp6_client_set_mac(link
->dhcp6_client
,
2051 (const uint8_t *) &link
->mac
,
2055 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCPv6 client: %m");
2060 had_carrier
= link_has_carrier(link
);
2062 r
= link_update_flags(link
, m
);
2066 carrier_gained
= !had_carrier
&& link_has_carrier(link
);
2067 carrier_lost
= had_carrier
&& !link_has_carrier(link
);
2069 if (carrier_gained
) {
2070 log_link_info(link
, "Gained carrier");
2072 r
= link_carrier_gained(link
);
2075 } else if (carrier_lost
) {
2076 log_link_info(link
, "Lost carrier");
2078 r
= link_carrier_lost(link
);
2087 static void link_update_operstate(Link
*link
) {
2088 LinkOperationalState operstate
;
2091 if (link
->kernel_operstate
== IF_OPER_DORMANT
)
2092 operstate
= LINK_OPERSTATE_DORMANT
;
2093 else if (link_has_carrier(link
)) {
2095 uint8_t scope
= RT_SCOPE_NOWHERE
;
2097 /* if we have carrier, check what addresses we have */
2098 LIST_FOREACH(addresses
, address
, link
->addresses
) {
2099 if (address
->flags
& (IFA_F_TENTATIVE
| IFA_F_DEPRECATED
))
2102 if (address
->scope
< scope
)
2103 scope
= address
->scope
;
2106 if (scope
< RT_SCOPE_SITE
)
2107 /* universally accessible addresses found */
2108 operstate
= LINK_OPERSTATE_ROUTABLE
;
2109 else if (scope
< RT_SCOPE_HOST
)
2110 /* only link or site local addresses found */
2111 operstate
= LINK_OPERSTATE_DEGRADED
;
2113 /* no useful addresses found */
2114 operstate
= LINK_OPERSTATE_CARRIER
;
2115 } else if (link
->flags
& IFF_UP
)
2116 operstate
= LINK_OPERSTATE_NO_CARRIER
;
2118 operstate
= LINK_OPERSTATE_OFF
;
2120 if (link
->operstate
!= operstate
) {
2121 link
->operstate
= operstate
;
2122 link_send_changed(link
, "OperationalState", NULL
);
2126 int link_save(Link
*link
) {
2127 _cleanup_free_
char *temp_path
= NULL
;
2128 _cleanup_fclose_
FILE *f
= NULL
;
2129 const char *admin_state
, *oper_state
;
2133 assert(link
->state_file
);
2134 assert(link
->lease_file
);
2135 assert(link
->manager
);
2137 link_update_operstate(link
);
2139 r
= manager_save(link
->manager
);
2143 if (link
->state
== LINK_STATE_LINGER
) {
2144 unlink(link
->state_file
);
2148 admin_state
= link_state_to_string(link
->state
);
2149 assert(admin_state
);
2151 oper_state
= link_operstate_to_string(link
->operstate
);
2154 r
= fopen_temporary(link
->state_file
, &f
, &temp_path
);
2158 fchmod(fileno(f
), 0644);
2161 "# This is private data. Do not parse.\n"
2164 admin_state
, oper_state
);
2166 if (link
->network
) {
2167 char **address
, **domain
;
2170 fprintf(f
, "NETWORK_FILE=%s\n", link
->network
->filename
);
2174 STRV_FOREACH(address
, link
->network
->dns
) {
2181 if (link
->network
->dhcp_dns
&&
2183 const struct in_addr
*addresses
;
2185 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
2189 serialize_in_addrs(f
, addresses
, r
);
2197 STRV_FOREACH(address
, link
->network
->ntp
) {
2204 if (link
->network
->dhcp_ntp
&&
2206 const struct in_addr
*addresses
;
2208 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
2212 serialize_in_addrs(f
, addresses
, r
);
2218 fprintf(f
, "DOMAINS=");
2220 STRV_FOREACH(domain
, link
->network
->domains
) {
2227 if (link
->network
->dhcp_domains
&&
2229 const char *domainname
;
2231 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
2235 fputs(domainname
, f
);
2241 fprintf(f
, "WILDCARD_DOMAIN=%s\n",
2242 yes_no(link
->network
->wildcard_domain
));
2244 fprintf(f
, "LLMNR=%s\n",
2245 llmnr_support_to_string(link
->network
->llmnr
));
2248 if (!hashmap_isempty(link
->bound_to_links
)) {
2253 fputs("CARRIER_BOUND_TO=", f
);
2254 HASHMAP_FOREACH(carrier
, link
->bound_to_links
, i
) {
2257 fputs(carrier
->ifname
, f
);
2264 if (!hashmap_isempty(link
->bound_by_links
)) {
2269 fputs("CARRIER_BOUND_BY=", f
);
2270 HASHMAP_FOREACH(carrier
, link
->bound_by_links
, i
) {
2273 fputs(carrier
->ifname
, f
);
2280 if (link
->dhcp_lease
) {
2281 assert(link
->network
);
2283 r
= sd_dhcp_lease_save(link
->dhcp_lease
, link
->lease_file
);
2291 unlink(link
->lease_file
);
2294 assert(link
->network
);
2296 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
2304 unlink(link
->lldp_file
);
2306 r
= fflush_and_check(f
);
2310 if (rename(temp_path
, link
->state_file
) < 0) {
2317 log_link_error_errno(link
, r
, "Failed to save link data to %s: %m", link
->state_file
);
2318 (void) unlink(link
->state_file
);
2321 (void) unlink(temp_path
);
2326 static const char* const link_state_table
[_LINK_STATE_MAX
] = {
2327 [LINK_STATE_PENDING
] = "pending",
2328 [LINK_STATE_ENSLAVING
] = "configuring",
2329 [LINK_STATE_SETTING_ADDRESSES
] = "configuring",
2330 [LINK_STATE_SETTING_ROUTES
] = "configuring",
2331 [LINK_STATE_CONFIGURED
] = "configured",
2332 [LINK_STATE_UNMANAGED
] = "unmanaged",
2333 [LINK_STATE_FAILED
] = "failed",
2334 [LINK_STATE_LINGER
] = "linger",
2337 DEFINE_STRING_TABLE_LOOKUP(link_state
, LinkState
);
2339 static const char* const link_operstate_table
[_LINK_OPERSTATE_MAX
] = {
2340 [LINK_OPERSTATE_OFF
] = "off",
2341 [LINK_OPERSTATE_NO_CARRIER
] = "no-carrier",
2342 [LINK_OPERSTATE_DORMANT
] = "dormant",
2343 [LINK_OPERSTATE_CARRIER
] = "carrier",
2344 [LINK_OPERSTATE_DEGRADED
] = "degraded",
2345 [LINK_OPERSTATE_ROUTABLE
] = "routable",
2348 DEFINE_STRING_TABLE_LOOKUP(link_operstate
, LinkOperationalState
);