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 link
->network
->dhcp
& ADDRESS_FAMILY_IPV6
;
46 bool link_dhcp4_enabled(Link
*link
) {
47 if (link
->flags
& IFF_LOOPBACK
)
53 return link
->network
->dhcp
& ADDRESS_FAMILY_IPV4
;
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 link
->network
->link_local
& ADDRESS_FAMILY_IPV4
;
76 bool link_ipv6ll_enabled(Link
*link
) {
77 if (link
->flags
& IFF_LOOPBACK
)
83 return link
->network
->link_local
& ADDRESS_FAMILY_IPV6
;
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 link
->network
->ip_forward
& ADDRESS_FAMILY_IPV4
;
109 static bool link_ipv6_forward_enabled(Link
*link
) {
110 if (link
->flags
& IFF_LOOPBACK
)
116 return link
->network
->ip_forward
& ADDRESS_FAMILY_IPV6
;
119 static IPv6PrivacyExtensions
link_ipv6_privacy_extensions(Link
*link
) {
120 if (link
->flags
& IFF_LOOPBACK
)
121 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
124 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
126 return link
->network
->ipv6_privacy_extensions
;
129 #define FLAG_STRING(string, flag, old, new) \
130 (((old ^ new) & flag) \
131 ? ((old & flag) ? (" -" string) : (" +" string)) \
134 static int link_update_flags(Link
*link
, sd_netlink_message
*m
) {
135 unsigned flags
, unknown_flags_added
, unknown_flags_removed
, unknown_flags
;
141 r
= sd_rtnl_message_link_get_flags(m
, &flags
);
143 return log_link_warning_errno(link
, r
, "Could not get link flags: %m");
145 r
= sd_netlink_message_read_u8(m
, IFLA_OPERSTATE
, &operstate
);
147 /* if we got a message without operstate, take it to mean
148 the state was unchanged */
149 operstate
= link
->kernel_operstate
;
151 if ((link
->flags
== flags
) && (link
->kernel_operstate
== operstate
))
154 if (link
->flags
!= flags
) {
155 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",
156 FLAG_STRING("LOOPBACK", IFF_LOOPBACK
, link
->flags
, flags
),
157 FLAG_STRING("MASTER", IFF_MASTER
, link
->flags
, flags
),
158 FLAG_STRING("SLAVE", IFF_SLAVE
, link
->flags
, flags
),
159 FLAG_STRING("UP", IFF_UP
, link
->flags
, flags
),
160 FLAG_STRING("DORMANT", IFF_DORMANT
, link
->flags
, flags
),
161 FLAG_STRING("LOWER_UP", IFF_LOWER_UP
, link
->flags
, flags
),
162 FLAG_STRING("RUNNING", IFF_RUNNING
, link
->flags
, flags
),
163 FLAG_STRING("MULTICAST", IFF_MULTICAST
, link
->flags
, flags
),
164 FLAG_STRING("BROADCAST", IFF_BROADCAST
, link
->flags
, flags
),
165 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT
, link
->flags
, flags
),
166 FLAG_STRING("PROMISC", IFF_PROMISC
, link
->flags
, flags
),
167 FLAG_STRING("ALLMULTI", IFF_ALLMULTI
, link
->flags
, flags
),
168 FLAG_STRING("PORTSEL", IFF_PORTSEL
, link
->flags
, flags
),
169 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA
, link
->flags
, flags
),
170 FLAG_STRING("DYNAMIC", IFF_DYNAMIC
, link
->flags
, flags
),
171 FLAG_STRING("NOARP", IFF_NOARP
, link
->flags
, flags
),
172 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS
, link
->flags
, flags
),
173 FLAG_STRING("DEBUG", IFF_DEBUG
, link
->flags
, flags
),
174 FLAG_STRING("ECHO", IFF_ECHO
, link
->flags
, flags
));
176 unknown_flags
= ~(IFF_LOOPBACK
| IFF_MASTER
| IFF_SLAVE
| IFF_UP
|
177 IFF_DORMANT
| IFF_LOWER_UP
| IFF_RUNNING
|
178 IFF_MULTICAST
| IFF_BROADCAST
| IFF_POINTOPOINT
|
179 IFF_PROMISC
| IFF_ALLMULTI
| IFF_PORTSEL
|
180 IFF_AUTOMEDIA
| IFF_DYNAMIC
| IFF_NOARP
|
181 IFF_NOTRAILERS
| IFF_DEBUG
| IFF_ECHO
);
182 unknown_flags_added
= ((link
->flags
^ flags
) & flags
& unknown_flags
);
183 unknown_flags_removed
= ((link
->flags
^ flags
) & link
->flags
& unknown_flags
);
185 /* link flags are currently at most 18 bits, let's align to
187 if (unknown_flags_added
)
189 "Unknown link flags gained: %#.5x (ignoring)",
190 unknown_flags_added
);
192 if (unknown_flags_removed
)
194 "Unknown link flags lost: %#.5x (ignoring)",
195 unknown_flags_removed
);
199 link
->kernel_operstate
= operstate
;
206 static int link_new(Manager
*manager
, sd_netlink_message
*message
, Link
**ret
) {
207 _cleanup_link_unref_ Link
*link
= NULL
;
216 r
= sd_netlink_message_get_type(message
, &type
);
219 else if (type
!= RTM_NEWLINK
)
222 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
225 else if (ifindex
<= 0)
228 r
= sd_netlink_message_read_string(message
, IFLA_IFNAME
, &ifname
);
232 link
= new0(Link
, 1);
237 link
->manager
= manager
;
238 link
->state
= LINK_STATE_PENDING
;
239 link
->rtnl_extended_attrs
= true;
240 link
->ifindex
= ifindex
;
241 link
->ifname
= strdup(ifname
);
245 r
= sd_netlink_message_read_ether_addr(message
, IFLA_ADDRESS
, &link
->mac
);
247 log_link_debug(link
, "MAC address not found for new device, continuing without");
249 r
= asprintf(&link
->state_file
, "/run/systemd/netif/links/%d",
254 r
= asprintf(&link
->lease_file
, "/run/systemd/netif/leases/%d",
259 r
= asprintf(&link
->lldp_file
, "/run/systemd/netif/lldp/%d",
265 r
= hashmap_ensure_allocated(&manager
->links
, NULL
);
269 r
= hashmap_put(manager
->links
, INT_TO_PTR(link
->ifindex
), link
);
273 r
= link_update_flags(link
, message
);
283 static void link_free(Link
*link
) {
291 while ((address
= link
->addresses
)) {
292 LIST_REMOVE(addresses
, link
->addresses
, address
);
293 address_free(address
);
296 while ((address
= link
->pool_addresses
)) {
297 LIST_REMOVE(addresses
, link
->pool_addresses
, address
);
298 address_free(address
);
301 sd_dhcp_server_unref(link
->dhcp_server
);
302 sd_dhcp_client_unref(link
->dhcp_client
);
303 sd_dhcp_lease_unref(link
->dhcp_lease
);
305 free(link
->lease_file
);
307 sd_lldp_free(link
->lldp
);
309 free(link
->lldp_file
);
311 sd_ipv4ll_unref(link
->ipv4ll
);
312 sd_dhcp6_client_unref(link
->dhcp6_client
);
313 sd_icmp6_nd_unref(link
->icmp6_router_discovery
);
316 hashmap_remove(link
->manager
->links
, INT_TO_PTR(link
->ifindex
));
320 free(link
->state_file
);
322 udev_device_unref(link
->udev_device
);
324 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
)
325 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(carrier
->ifindex
));
326 hashmap_free(link
->bound_to_links
);
328 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
)
329 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(carrier
->ifindex
));
330 hashmap_free(link
->bound_by_links
);
335 Link
*link_unref(Link
*link
) {
336 if (link
&& (-- link
->n_ref
<= 0))
342 Link
*link_ref(Link
*link
) {
344 assert_se(++ link
->n_ref
>= 2);
349 int link_get(Manager
*m
, int ifindex
, Link
**ret
) {
356 link
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
365 static void link_set_state(Link
*link
, LinkState state
) {
368 if (link
->state
== state
)
373 link_send_changed(link
, "AdministrativeState", NULL
);
378 static void link_enter_unmanaged(Link
*link
) {
381 log_link_debug(link
, "Unmanaged");
383 link_set_state(link
, LINK_STATE_UNMANAGED
);
388 static int link_stop_clients(Link
*link
) {
392 assert(link
->manager
);
393 assert(link
->manager
->event
);
398 if (link
->dhcp_client
) {
399 k
= sd_dhcp_client_stop(link
->dhcp_client
);
401 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv4 client: %m");
405 k
= sd_ipv4ll_stop(link
->ipv4ll
);
407 r
= log_link_warning_errno(link
, r
, "Could not stop IPv4 link-local: %m");
410 if(link
->icmp6_router_discovery
) {
411 if (link
->dhcp6_client
) {
412 k
= sd_dhcp6_client_stop(link
->dhcp6_client
);
414 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv6 client: %m");
417 k
= sd_icmp6_nd_stop(link
->icmp6_router_discovery
);
419 r
= log_link_warning_errno(link
, r
, "Could not stop ICMPv6 router discovery: %m");
423 k
= sd_lldp_stop(link
->lldp
);
425 r
= log_link_warning_errno(link
, r
, "Could not stop LLDP: %m");
431 void link_enter_failed(Link
*link
) {
434 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
437 log_link_warning(link
, "Failed");
439 link_set_state(link
, LINK_STATE_FAILED
);
441 link_stop_clients(link
);
446 static Address
* link_find_dhcp_server_address(Link
*link
) {
450 assert(link
->network
);
452 /* The first statically configured address if there is any */
453 LIST_FOREACH(addresses
, address
, link
->network
->static_addresses
) {
455 if (address
->family
!= AF_INET
)
458 if (in_addr_is_null(address
->family
, &address
->in_addr
))
464 /* If that didn't work, find a suitable address we got from the pool */
465 LIST_FOREACH(addresses
, address
, link
->pool_addresses
) {
466 if (address
->family
!= AF_INET
)
475 static int link_enter_configured(Link
*link
) {
477 assert(link
->network
);
478 assert(link
->state
== LINK_STATE_SETTING_ROUTES
);
480 log_link_info(link
, "Configured");
482 link_set_state(link
, LINK_STATE_CONFIGURED
);
489 void link_client_handler(Link
*link
) {
491 assert(link
->network
);
493 if (!link
->static_configured
)
496 if (link_ipv4ll_enabled(link
))
497 if (!link
->ipv4ll_address
||
501 if (link_dhcp4_enabled(link
) && !link
->dhcp4_configured
)
504 if (link
->state
!= LINK_STATE_CONFIGURED
)
505 link_enter_configured(link
);
510 static int route_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
511 _cleanup_link_unref_ Link
*link
= userdata
;
514 assert(link
->link_messages
> 0);
515 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
516 LINK_STATE_SETTING_ROUTES
, LINK_STATE_FAILED
,
519 link
->link_messages
--;
521 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
524 r
= sd_netlink_message_get_errno(m
);
525 if (r
< 0 && r
!= -EEXIST
)
526 log_link_warning_errno(link
, r
, "%-*s: could not set route: %m", IFNAMSIZ
, link
->ifname
);
528 if (link
->link_messages
== 0) {
529 log_link_debug(link
, "Routes set");
530 link
->static_configured
= true;
531 link_client_handler(link
);
537 static int link_enter_set_routes(Link
*link
) {
542 assert(link
->network
);
543 assert(link
->state
== LINK_STATE_SETTING_ADDRESSES
);
545 link_set_state(link
, LINK_STATE_SETTING_ROUTES
);
547 LIST_FOREACH(routes
, rt
, link
->network
->static_routes
) {
548 r
= route_configure(rt
, link
, &route_handler
);
550 log_link_warning_errno(link
, r
, "Could not set routes: %m");
551 link_enter_failed(link
);
555 link
->link_messages
++;
558 if (link
->link_messages
== 0) {
559 link
->static_configured
= true;
560 link_client_handler(link
);
562 log_link_debug(link
, "Setting routes");
567 int link_route_drop_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
568 _cleanup_link_unref_ Link
*link
= userdata
;
573 assert(link
->ifname
);
575 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
578 r
= sd_netlink_message_get_errno(m
);
579 if (r
< 0 && r
!= -ESRCH
)
580 log_link_warning_errno(link
, r
, "%-*s: could not drop route: %m", IFNAMSIZ
, link
->ifname
);
585 static int address_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
586 _cleanup_link_unref_ Link
*link
= userdata
;
592 assert(link
->ifname
);
593 assert(link
->link_messages
> 0);
594 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
595 LINK_STATE_FAILED
, LINK_STATE_LINGER
));
597 link
->link_messages
--;
599 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
602 r
= sd_netlink_message_get_errno(m
);
603 if (r
< 0 && r
!= -EEXIST
)
604 log_link_warning_errno(link
, r
, "%-*s: could not set address: %m", IFNAMSIZ
, link
->ifname
);
606 link_rtnl_process_address(rtnl
, m
, link
->manager
);
608 if (link
->link_messages
== 0) {
609 log_link_debug(link
, "Addresses set");
610 link_enter_set_routes(link
);
616 static int link_enter_set_addresses(Link
*link
) {
621 assert(link
->network
);
622 assert(link
->state
!= _LINK_STATE_INVALID
);
624 link_set_state(link
, LINK_STATE_SETTING_ADDRESSES
);
626 LIST_FOREACH(addresses
, ad
, link
->network
->static_addresses
) {
627 r
= address_configure(ad
, link
, &address_handler
);
629 log_link_warning_errno(link
, r
, "Could not set addresses: %m");
630 link_enter_failed(link
);
634 link
->link_messages
++;
637 /* now that we can figure out a default address for the dhcp server,
639 if (link_dhcp4_server_enabled(link
)) {
640 struct in_addr pool_start
;
643 address
= link_find_dhcp_server_address(link
);
645 log_link_warning(link
, "Failed to find suitable address for DHCPv4 server instance.");
646 link_enter_failed(link
);
650 r
= sd_dhcp_server_set_address(link
->dhcp_server
,
651 &address
->in_addr
.in
,
656 /* offer 32 addresses starting from the address following the server address */
657 pool_start
.s_addr
= htobe32(be32toh(address
->in_addr
.in
.s_addr
) + 1);
658 r
= sd_dhcp_server_set_lease_pool(link
->dhcp_server
,
664 r = sd_dhcp_server_set_router(link->dhcp_server,
665 &main_address->in_addr.in);
669 r = sd_dhcp_server_set_prefixlen(link->dhcp_server,
670 main_address->prefixlen);
675 r
= sd_dhcp_server_start(link
->dhcp_server
);
677 log_link_warning_errno(link
, r
, "Could not start DHCPv4 server instance: %m");
679 link_enter_failed(link
);
684 log_link_debug(link
, "Offering DHCPv4 leases");
687 if (link
->link_messages
== 0)
688 link_enter_set_routes(link
);
690 log_link_debug(link
, "Setting addresses");
695 int link_address_drop_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
696 _cleanup_link_unref_ Link
*link
= userdata
;
701 assert(link
->ifname
);
703 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
706 r
= sd_netlink_message_get_errno(m
);
707 if (r
< 0 && r
!= -EADDRNOTAVAIL
)
708 log_link_warning_errno(link
, r
, "%-*s: could not drop address: %m", IFNAMSIZ
, link
->ifname
);
713 static int link_set_bridge_fdb(Link
*const link
) {
717 LIST_FOREACH(static_fdb_entries
, fdb_entry
, link
->network
->static_fdb_entries
) {
718 r
= fdb_entry_configure(link
, fdb_entry
);
720 log_link_error_errno(link
, r
, "Failed to add MAC entry to static MAC table: %m");
728 static int link_set_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
729 _cleanup_link_unref_ Link
*link
= userdata
;
732 log_link_debug(link
, "Set link");
734 r
= sd_netlink_message_get_errno(m
);
735 if (r
< 0 && r
!= -EEXIST
) {
736 log_link_error_errno(link
, r
, "Could not join netdev: %m");
737 link_enter_failed(link
);
744 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
745 _cleanup_link_unref_ Link
*link
= userdata
;
751 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
754 r
= sd_bus_message_get_errno(m
);
756 log_link_warning_errno(link
, r
, "Could not set hostname: %m");
761 int link_set_hostname(Link
*link
, const char *hostname
) {
765 assert(link
->manager
);
768 log_link_debug(link
, "Setting transient hostname: '%s'", hostname
);
770 if (!link
->manager
->bus
) {
771 /* TODO: replace by assert when we can rely on kdbus */
772 log_link_info(link
, "Not connected to system bus, ignoring transient hostname.");
776 r
= sd_bus_call_method_async(
779 "org.freedesktop.hostname1",
780 "/org/freedesktop/hostname1",
781 "org.freedesktop.hostname1",
783 set_hostname_handler
,
790 return log_link_error_errno(link
, r
, "Could not set transient hostname: %m");
797 static int set_mtu_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
798 _cleanup_link_unref_ Link
*link
= userdata
;
803 assert(link
->ifname
);
805 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
808 r
= sd_netlink_message_get_errno(m
);
810 log_link_warning_errno(link
, r
, "%-*s: could not set MTU: %m", IFNAMSIZ
, link
->ifname
);
815 int link_set_mtu(Link
*link
, uint32_t mtu
) {
816 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
820 assert(link
->manager
);
821 assert(link
->manager
->rtnl
);
823 log_link_debug(link
, "Setting MTU: %" PRIu32
, mtu
);
825 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
827 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
829 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, mtu
);
831 return log_link_error_errno(link
, r
, "Could not append MTU: %m");
833 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, set_mtu_handler
, link
, 0, NULL
);
835 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
842 static int link_set_bridge(Link
*link
) {
843 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
847 assert(link
->network
);
849 if(link
->network
->cost
== 0)
852 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
854 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
856 r
= sd_rtnl_message_link_set_family(req
, PF_BRIDGE
);
858 return log_link_error_errno(link
, r
, "Could not set message family: %m");
860 r
= sd_netlink_message_open_container(req
, IFLA_PROTINFO
);
862 return log_link_error_errno(link
, r
, "Could not append IFLA_PROTINFO attribute: %m");
864 if(link
->network
->cost
!= 0) {
865 r
= sd_netlink_message_append_u32(req
, IFLA_BRPORT_COST
, link
->network
->cost
);
867 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_COST attribute: %m");
870 r
= sd_netlink_message_close_container(req
);
872 return log_link_error_errno(link
, r
, "Could not append IFLA_LINKINFO attribute: %m");
874 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_set_handler
, link
, 0, NULL
);
876 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
883 static void lldp_handler(sd_lldp
*lldp
, int event
, void *userdata
) {
884 Link
*link
= userdata
;
888 assert(link
->network
);
889 assert(link
->manager
);
891 if (event
!= UPDATE_INFO
)
894 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
896 log_link_warning_errno(link
, r
, "Could not save LLDP: %m");
900 static int link_acquire_conf(Link
*link
) {
904 assert(link
->network
);
905 assert(link
->manager
);
906 assert(link
->manager
->event
);
908 if (link_ipv4ll_enabled(link
)) {
909 assert(link
->ipv4ll
);
911 log_link_debug(link
, "Acquiring IPv4 link-local address");
913 r
= sd_ipv4ll_start(link
->ipv4ll
);
915 return log_link_warning_errno(link
, r
, "Could not acquire IPv4 link-local address: %m");
918 if (link_dhcp4_enabled(link
)) {
919 assert(link
->dhcp_client
);
921 log_link_debug(link
, "Acquiring DHCPv4 lease");
923 r
= sd_dhcp_client_start(link
->dhcp_client
);
925 return log_link_warning_errno(link
, r
, "Could not acquire DHCPv4 lease: %m");
928 if (link_dhcp6_enabled(link
)) {
929 assert(link
->icmp6_router_discovery
);
931 log_link_debug(link
, "Discovering IPv6 routers");
933 r
= sd_icmp6_router_solicitation_start(link
->icmp6_router_discovery
);
935 return log_link_warning_errno(link
, r
, "Could not start IPv6 router discovery: %m");
938 if (link_lldp_enabled(link
)) {
941 log_link_debug(link
, "Starting LLDP");
943 r
= sd_lldp_start(link
->lldp
);
945 return log_link_warning_errno(link
, r
, "Could not start LLDP: %m");
951 bool link_has_carrier(Link
*link
) {
952 /* see Documentation/networking/operstates.txt in the kernel sources */
954 if (link
->kernel_operstate
== IF_OPER_UP
)
957 if (link
->kernel_operstate
== IF_OPER_UNKNOWN
)
958 /* operstate may not be implemented, so fall back to flags */
959 if ((link
->flags
& IFF_LOWER_UP
) && !(link
->flags
& IFF_DORMANT
))
965 static int link_up_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
966 _cleanup_link_unref_ Link
*link
= userdata
;
971 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
974 r
= sd_netlink_message_get_errno(m
);
976 /* we warn but don't fail the link, as it may be
978 log_link_warning_errno(link
, r
, "%-*s: could not bring up interface: %m", IFNAMSIZ
, link
->ifname
);
983 static int link_up(Link
*link
) {
984 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
989 assert(link
->network
);
990 assert(link
->manager
);
991 assert(link
->manager
->rtnl
);
993 log_link_debug(link
, "Bringing link up");
995 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
997 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
999 r
= sd_rtnl_message_link_set_flags(req
, IFF_UP
, IFF_UP
);
1001 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1003 if (link
->network
->mac
) {
1004 r
= sd_netlink_message_append_ether_addr(req
, IFLA_ADDRESS
, link
->network
->mac
);
1006 return log_link_error_errno(link
, r
, "Could not set MAC address: %m");
1009 if (link
->network
->mtu
) {
1010 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, link
->network
->mtu
);
1012 return log_link_error_errno(link
, r
, "Could not set MTU: %m");
1015 r
= sd_netlink_message_open_container(req
, IFLA_AF_SPEC
);
1017 return log_link_error_errno(link
, r
, "Could not open IFLA_AF_SPEC container: %m");
1019 if (socket_ipv6_is_supported()) {
1020 /* if the kernel lacks ipv6 support setting IFF_UP fails if any ipv6 options are passed */
1021 r
= sd_netlink_message_open_container(req
, AF_INET6
);
1023 return log_link_error_errno(link
, r
, "Could not open AF_INET6 container: %m");
1025 ipv6ll_mode
= link_ipv6ll_enabled(link
) ? IN6_ADDR_GEN_MODE_EUI64
: IN6_ADDR_GEN_MODE_NONE
;
1026 r
= sd_netlink_message_append_u8(req
, IFLA_INET6_ADDR_GEN_MODE
, ipv6ll_mode
);
1028 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_ADDR_GEN_MODE: %m");
1030 if (!in_addr_is_null(AF_INET6
, &link
->network
->ipv6_token
)) {
1031 r
= sd_netlink_message_append_in6_addr(req
, IFLA_INET6_TOKEN
, &link
->network
->ipv6_token
.in6
);
1033 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_TOKEN: %m");
1036 r
= sd_netlink_message_close_container(req
);
1038 return log_link_error_errno(link
, r
, "Could not close AF_INET6 container: %m");
1041 r
= sd_netlink_message_close_container(req
);
1043 return log_link_error_errno(link
, r
, "Could not close IFLA_AF_SPEC container: %m");
1045 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_up_handler
, link
, 0, NULL
);
1047 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1054 static int link_down_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1055 _cleanup_link_unref_ Link
*link
= userdata
;
1060 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1063 r
= sd_netlink_message_get_errno(m
);
1065 log_link_warning_errno(link
, r
, "%-*s: could not bring down interface: %m", IFNAMSIZ
, link
->ifname
);
1070 static int link_down(Link
*link
) {
1071 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1075 assert(link
->manager
);
1076 assert(link
->manager
->rtnl
);
1078 log_link_debug(link
, "Bringing link down");
1080 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
,
1081 RTM_SETLINK
, link
->ifindex
);
1083 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1085 r
= sd_rtnl_message_link_set_flags(req
, 0, IFF_UP
);
1087 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1089 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_down_handler
, link
, 0, NULL
);
1091 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1098 static int link_handle_bound_to_list(Link
*link
) {
1102 bool required_up
= false;
1103 bool link_is_up
= false;
1107 if (hashmap_isempty(link
->bound_to_links
))
1110 if (link
->flags
& IFF_UP
)
1113 HASHMAP_FOREACH (l
, link
->bound_to_links
, i
)
1114 if (link_has_carrier(l
)) {
1119 if (!required_up
&& link_is_up
) {
1120 r
= link_down(link
);
1123 } else if (required_up
&& !link_is_up
) {
1132 static int link_handle_bound_by_list(Link
*link
) {
1139 if (hashmap_isempty(link
->bound_by_links
))
1142 HASHMAP_FOREACH (l
, link
->bound_by_links
, i
) {
1143 r
= link_handle_bound_to_list(l
);
1151 static int link_put_carrier(Link
*link
, Link
*carrier
, Hashmap
**h
) {
1157 if (link
== carrier
)
1160 if (hashmap_get(*h
, INT_TO_PTR(carrier
->ifindex
)))
1163 r
= hashmap_ensure_allocated(h
, NULL
);
1167 r
= hashmap_put(*h
, INT_TO_PTR(carrier
->ifindex
), carrier
);
1174 static int link_new_bound_by_list(Link
*link
) {
1179 bool list_updated
= false;
1182 assert(link
->manager
);
1186 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1187 if (!carrier
->network
)
1190 if (strv_isempty(carrier
->network
->bind_carrier
))
1193 if (strv_fnmatch(carrier
->network
->bind_carrier
, link
->ifname
, 0)) {
1194 r
= link_put_carrier(link
, carrier
, &link
->bound_by_links
);
1198 list_updated
= true;
1205 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
) {
1206 r
= link_put_carrier(carrier
, link
, &carrier
->bound_to_links
);
1216 static int link_new_bound_to_list(Link
*link
) {
1221 bool list_updated
= false;
1224 assert(link
->manager
);
1229 if (strv_isempty(link
->network
->bind_carrier
))
1234 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1235 if (strv_fnmatch(link
->network
->bind_carrier
, carrier
->ifname
, 0)) {
1236 r
= link_put_carrier(link
, carrier
, &link
->bound_to_links
);
1240 list_updated
= true;
1247 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
) {
1248 r
= link_put_carrier(carrier
, link
, &carrier
->bound_by_links
);
1258 static int link_new_carrier_maps(Link
*link
) {
1261 r
= link_new_bound_by_list(link
);
1265 r
= link_handle_bound_by_list(link
);
1269 r
= link_new_bound_to_list(link
);
1273 r
= link_handle_bound_to_list(link
);
1280 static void link_free_bound_to_list(Link
*link
) {
1284 HASHMAP_FOREACH (bound_to
, link
->bound_to_links
, i
) {
1285 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(bound_to
->ifindex
));
1287 if (hashmap_remove(bound_to
->bound_by_links
, INT_TO_PTR(link
->ifindex
)))
1288 link_save(bound_to
);
1294 static void link_free_bound_by_list(Link
*link
) {
1298 HASHMAP_FOREACH (bound_by
, link
->bound_by_links
, i
) {
1299 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(bound_by
->ifindex
));
1301 if (hashmap_remove(bound_by
->bound_to_links
, INT_TO_PTR(link
->ifindex
))) {
1302 link_save(bound_by
);
1303 link_handle_bound_to_list(bound_by
);
1310 static void link_free_carrier_maps(Link
*link
) {
1311 bool list_updated
= false;
1315 if (!hashmap_isempty(link
->bound_to_links
)) {
1316 link_free_bound_to_list(link
);
1317 list_updated
= true;
1320 if (!hashmap_isempty(link
->bound_by_links
)) {
1321 link_free_bound_by_list(link
);
1322 list_updated
= true;
1331 void link_drop(Link
*link
) {
1332 if (!link
|| link
->state
== LINK_STATE_LINGER
)
1335 link_set_state(link
, LINK_STATE_LINGER
);
1337 link_free_carrier_maps(link
);
1339 log_link_debug(link
, "Link removed");
1346 static int link_joined(Link
*link
) {
1350 assert(link
->network
);
1352 if (!hashmap_isempty(link
->bound_to_links
)) {
1353 r
= link_handle_bound_to_list(link
);
1356 } else if (!(link
->flags
& IFF_UP
)) {
1359 link_enter_failed(link
);
1364 if(link
->network
->bridge
) {
1365 r
= link_set_bridge(link
);
1367 log_link_error_errno(link
, r
, "Could not set bridge message: %m");
1370 return link_enter_set_addresses(link
);
1373 static int netdev_join_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1374 _cleanup_link_unref_ Link
*link
= userdata
;
1378 assert(link
->network
);
1382 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1385 r
= sd_netlink_message_get_errno(m
);
1386 if (r
< 0 && r
!= -EEXIST
) {
1387 log_link_error_errno(link
, r
, "%-*s: could not join netdev: %m", IFNAMSIZ
, link
->ifname
);
1388 link_enter_failed(link
);
1391 log_link_debug(link
, "Joined netdev");
1393 if (link
->enslaving
<= 0)
1399 static int link_enter_join_netdev(Link
*link
) {
1405 assert(link
->network
);
1406 assert(link
->state
== LINK_STATE_PENDING
);
1408 link_set_state(link
, LINK_STATE_ENSLAVING
);
1412 if (!link
->network
->bridge
&&
1413 !link
->network
->bond
&&
1414 hashmap_isempty(link
->network
->stacked_netdevs
))
1415 return link_joined(link
);
1417 if (link
->network
->bond
) {
1418 log_struct(LOG_DEBUG
,
1419 LOG_LINK_INTERFACE(link
),
1420 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1421 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bond
->ifname
),
1424 r
= netdev_join(link
->network
->bond
, link
, netdev_join_handler
);
1426 log_struct_errno(LOG_WARNING
, r
,
1427 LOG_LINK_INTERFACE(link
),
1428 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1429 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bond
->ifname
),
1432 link_enter_failed(link
);
1439 if (link
->network
->bridge
) {
1440 log_struct(LOG_DEBUG
,
1441 LOG_LINK_INTERFACE(link
),
1442 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1443 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bridge
->ifname
),
1446 r
= netdev_join(link
->network
->bridge
, link
, netdev_join_handler
);
1448 log_struct_errno(LOG_WARNING
, r
,
1449 LOG_LINK_INTERFACE(link
),
1450 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1451 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bridge
->ifname
),
1453 link_enter_failed(link
);
1460 HASHMAP_FOREACH(netdev
, link
->network
->stacked_netdevs
, i
) {
1462 log_struct(LOG_DEBUG
,
1463 LOG_LINK_INTERFACE(link
),
1464 LOG_NETDEV_INTERFACE(netdev
),
1465 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", netdev
->ifname
),
1468 r
= netdev_join(netdev
, link
, netdev_join_handler
);
1470 log_struct_errno(LOG_WARNING
, r
,
1471 LOG_LINK_INTERFACE(link
),
1472 LOG_NETDEV_INTERFACE(netdev
),
1473 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", netdev
->ifname
),
1475 link_enter_failed(link
);
1485 static int link_set_ipv4_forward(Link
*link
) {
1486 const char *p
= NULL
, *v
;
1489 if (link
->flags
& IFF_LOOPBACK
)
1492 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1495 p
= strjoina("/proc/sys/net/ipv4/conf/", link
->ifname
, "/forwarding");
1496 v
= one_zero(link_ipv4_forward_enabled(link
));
1498 r
= write_string_file_no_create(p
, v
);
1500 /* If the right value is set anyway, don't complain */
1501 if (verify_one_line_file(p
, v
) > 0)
1504 log_link_warning_errno(link
, r
, "Cannot configure IPv4 forwarding for interface %s: %m", link
->ifname
);
1510 static int link_set_ipv6_forward(Link
*link
) {
1511 const char *p
= NULL
, *v
= NULL
;
1514 /* Make this a NOP if IPv6 is not available */
1515 if (!socket_ipv6_is_supported())
1518 if (link
->flags
& IFF_LOOPBACK
)
1521 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1524 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/forwarding");
1525 v
= one_zero(link_ipv6_forward_enabled(link
));
1527 r
= write_string_file_no_create(p
, v
);
1529 /* If the right value is set anyway, don't complain */
1530 if (verify_one_line_file(p
, v
) > 0)
1533 log_link_warning_errno(link
, r
, "Cannot configure IPv6 forwarding for interface: %m");
1539 static int link_set_ipv6_privacy_extensions(Link
*link
) {
1540 char buf
[DECIMAL_STR_MAX(unsigned) + 1];
1541 IPv6PrivacyExtensions s
;
1542 const char *p
= NULL
;
1545 /* Make this a NOP if IPv6 is not available */
1546 if (!socket_ipv6_is_supported())
1549 s
= link_ipv6_privacy_extensions(link
);
1550 if (s
== _IPV6_PRIVACY_EXTENSIONS_INVALID
)
1553 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/use_tempaddr");
1554 xsprintf(buf
, "%u", link
->network
->ipv6_privacy_extensions
);
1556 r
= write_string_file_no_create(p
, buf
);
1558 /* If the right value is set anyway, don't complain */
1559 if (verify_one_line_file(p
, buf
) > 0)
1562 log_link_warning_errno(link
, r
, "Cannot configure IPv6 privacy extension for interface: %m");
1568 static int link_configure(Link
*link
) {
1572 assert(link
->network
);
1573 assert(link
->state
== LINK_STATE_PENDING
);
1575 r
= link_set_bridge_fdb(link
);
1579 r
= link_set_ipv4_forward(link
);
1583 r
= link_set_ipv6_forward(link
);
1587 r
= link_set_ipv6_privacy_extensions(link
);
1591 if (link_ipv4ll_enabled(link
)) {
1592 r
= ipv4ll_configure(link
);
1597 if (link_dhcp4_enabled(link
)) {
1598 r
= dhcp4_configure(link
);
1603 if (link_dhcp4_server_enabled(link
)) {
1604 r
= sd_dhcp_server_new(&link
->dhcp_server
, link
->ifindex
);
1608 r
= sd_dhcp_server_attach_event(link
->dhcp_server
, NULL
, 0);
1613 if (link_dhcp6_enabled(link
)) {
1614 r
= icmp6_configure(link
);
1619 if (link_lldp_enabled(link
)) {
1620 r
= sd_lldp_new(link
->ifindex
, link
->ifname
, &link
->mac
, &link
->lldp
);
1624 r
= sd_lldp_attach_event(link
->lldp
, NULL
, 0);
1628 r
= sd_lldp_set_callback(link
->lldp
,
1629 lldp_handler
, link
);
1634 if (link_has_carrier(link
)) {
1635 r
= link_acquire_conf(link
);
1640 return link_enter_join_netdev(link
);
1643 static int link_initialized_and_synced(sd_netlink
*rtnl
, sd_netlink_message
*m
,
1645 _cleanup_link_unref_ Link
*link
= userdata
;
1650 assert(link
->ifname
);
1651 assert(link
->manager
);
1653 if (link
->state
!= LINK_STATE_PENDING
)
1656 log_link_debug(link
, "Link state is up-to-date");
1658 r
= link_new_bound_by_list(link
);
1662 r
= link_handle_bound_by_list(link
);
1666 r
= network_get(link
->manager
, link
->udev_device
, link
->ifname
,
1667 &link
->mac
, &network
);
1669 link_enter_unmanaged(link
);
1674 if (link
->flags
& IFF_LOOPBACK
) {
1675 if (network
->link_local
!= ADDRESS_FAMILY_NO
)
1676 log_link_debug(link
, "Ignoring link-local autoconfiguration for loopback link");
1678 if (network
->dhcp
!= ADDRESS_FAMILY_NO
)
1679 log_link_debug(link
, "Ignoring DHCP clients for loopback link");
1681 if (network
->dhcp_server
)
1682 log_link_debug(link
, "Ignoring DHCP server for loopback link");
1685 r
= network_apply(link
->manager
, network
, link
);
1689 r
= link_new_bound_to_list(link
);
1693 r
= link_configure(link
);
1700 int link_initialized(Link
*link
, struct udev_device
*device
) {
1701 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1705 assert(link
->manager
);
1706 assert(link
->manager
->rtnl
);
1709 if (link
->state
!= LINK_STATE_PENDING
)
1712 if (link
->udev_device
)
1715 log_link_debug(link
, "udev initialized link");
1717 link
->udev_device
= udev_device_ref(device
);
1719 /* udev has initialized the link, but we don't know if we have yet
1720 * processed the NEWLINK messages with the latest state. Do a GETLINK,
1721 * when it returns we know that the pending NEWLINKs have already been
1722 * processed and that we are up-to-date */
1724 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_GETLINK
,
1729 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
,
1730 link_initialized_and_synced
, link
, 0, NULL
);
1739 static Address
* link_get_equal_address(Link
*link
, Address
*needle
) {
1745 LIST_FOREACH(addresses
, i
, link
->addresses
)
1746 if (address_equal(i
, needle
))
1752 int link_rtnl_process_address(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
1753 Manager
*m
= userdata
;
1756 _cleanup_address_free_ Address
*address
= NULL
;
1757 unsigned char flags
;
1759 char buf
[INET6_ADDRSTRLEN
], valid_buf
[FORMAT_TIMESPAN_MAX
];
1760 const char *valid_str
= NULL
;
1767 if (sd_netlink_message_is_error(message
)) {
1768 r
= sd_netlink_message_get_errno(message
);
1770 log_warning_errno(r
, "rtnl: failed to receive address: %m");
1775 r
= sd_netlink_message_get_type(message
, &type
);
1777 log_warning_errno(r
, "rtnl: could not get message type: %m");
1779 } else if (type
!= RTM_NEWADDR
&& type
!= RTM_DELADDR
) {
1780 log_warning("rtnl: received unexpected message type when processing address");
1784 r
= sd_rtnl_message_addr_get_ifindex(message
, &ifindex
);
1786 log_warning_errno(r
, "rtnl: could not get ifindex from address: %m");
1788 } else if (ifindex
<= 0) {
1789 log_warning("rtnl: received address message with invalid ifindex: %d", ifindex
);
1792 r
= link_get(m
, ifindex
, &link
);
1793 if (r
< 0 || !link
) {
1794 /* when enumerating we might be out of sync, but we will
1795 * get the address again, so just ignore it */
1796 if (!m
->enumerating
)
1797 log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex
);
1802 r
= address_new_dynamic(&address
);
1806 r
= sd_rtnl_message_addr_get_family(message
, &address
->family
);
1807 if (r
< 0 || !IN_SET(address
->family
, AF_INET
, AF_INET6
)) {
1808 log_link_warning(link
, "rtnl: received address with invalid family, ignoring.");
1812 r
= sd_rtnl_message_addr_get_prefixlen(message
, &address
->prefixlen
);
1814 log_link_warning_errno(link
, r
, "rtnl: received address with invalid prefixlen, ignoring: %m");
1818 r
= sd_rtnl_message_addr_get_scope(message
, &address
->scope
);
1820 log_link_warning_errno(link
, r
, "rtnl: received address with invalid scope, ignoring: %m");
1824 r
= sd_rtnl_message_addr_get_flags(message
, &flags
);
1826 log_link_warning_errno(link
, r
, "rtnl: received address with invalid flags, ignoring: %m");
1829 address
->flags
= flags
;
1831 switch (address
->family
) {
1833 r
= sd_netlink_message_read_in_addr(message
, IFA_LOCAL
, &address
->in_addr
.in
);
1835 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
1842 r
= sd_netlink_message_read_in6_addr(message
, IFA_ADDRESS
, &address
->in_addr
.in6
);
1844 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
1851 assert_not_reached("invalid address family");
1854 if (!inet_ntop(address
->family
, &address
->in_addr
, buf
, INET6_ADDRSTRLEN
)) {
1855 log_link_warning(link
, "Could not print address");
1859 r
= sd_netlink_message_read_cache_info(message
, IFA_CACHEINFO
, &address
->cinfo
);
1861 if (address
->cinfo
.ifa_valid
== CACHE_INFO_INFINITY_LIFE_TIME
)
1864 valid_str
= format_timespan(valid_buf
, FORMAT_TIMESPAN_MAX
,
1865 address
->cinfo
.ifa_valid
* USEC_PER_SEC
,
1869 existing
= link_get_equal_address(link
, address
);
1874 log_link_debug(link
, "Updating address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
1877 existing
->scope
= address
->scope
;
1878 existing
->flags
= address
->flags
;
1879 existing
->cinfo
= address
->cinfo
;
1882 log_link_debug(link
, "Adding address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
1884 LIST_PREPEND(addresses
, link
->addresses
, address
);
1885 address_establish(address
, link
);
1897 log_link_debug(link
, "Removing address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
1898 address_release(existing
, link
);
1899 LIST_REMOVE(addresses
, link
->addresses
, existing
);
1900 address_free(existing
);
1902 log_link_warning(link
, "Removing non-existent address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
1906 assert_not_reached("Received invalid RTNL message type");
1912 int link_add(Manager
*m
, sd_netlink_message
*message
, Link
**ret
) {
1914 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
1915 char ifindex_str
[2 + DECIMAL_STR_MAX(int)];
1923 r
= link_new(m
, message
, ret
);
1929 log_link_debug(link
, "Link %d added", link
->ifindex
);
1931 if (detect_container(NULL
) <= 0) {
1932 /* not in a container, udev will be around */
1933 sprintf(ifindex_str
, "n%d", link
->ifindex
);
1934 device
= udev_device_new_from_device_id(m
->udev
, ifindex_str
);
1936 return log_link_warning_errno(link
, errno
, "Could not find udev device: %m");
1938 if (udev_device_get_is_initialized(device
) <= 0) {
1940 log_link_debug(link
, "link pending udev initialization...");
1944 r
= link_initialized(link
, device
);
1948 /* we are calling a callback directly, so must take a ref */
1951 r
= link_initialized_and_synced(m
->rtnl
, NULL
, link
);
1959 static int link_carrier_gained(Link
*link
) {
1964 if (link
->network
) {
1965 r
= link_acquire_conf(link
);
1967 link_enter_failed(link
);
1972 r
= link_handle_bound_by_list(link
);
1979 static int link_carrier_lost(Link
*link
) {
1984 r
= link_stop_clients(link
);
1986 link_enter_failed(link
);
1990 r
= link_handle_bound_by_list(link
);
1997 int link_carrier_reset(Link
*link
) {
2002 if (link_has_carrier(link
)) {
2003 r
= link_carrier_lost(link
);
2007 r
= link_carrier_gained(link
);
2011 log_link_info(link
, "Reset carrier");
2018 int link_update(Link
*link
, sd_netlink_message
*m
) {
2019 struct ether_addr mac
;
2022 bool had_carrier
, carrier_gained
, carrier_lost
;
2026 assert(link
->ifname
);
2029 if (link
->state
== LINK_STATE_LINGER
) {
2031 log_link_info(link
, "Link readded");
2032 link_set_state(link
, LINK_STATE_ENSLAVING
);
2034 r
= link_new_carrier_maps(link
);
2039 r
= sd_netlink_message_read_string(m
, IFLA_IFNAME
, &ifname
);
2040 if (r
>= 0 && !streq(ifname
, link
->ifname
)) {
2041 log_link_info(link
, "Renamed to %s", ifname
);
2043 link_free_carrier_maps(link
);
2046 link
->ifname
= strdup(ifname
);
2050 r
= link_new_carrier_maps(link
);
2055 r
= sd_netlink_message_read_u32(m
, IFLA_MTU
, &mtu
);
2056 if (r
>= 0 && mtu
> 0) {
2058 if (!link
->original_mtu
) {
2059 link
->original_mtu
= mtu
;
2060 log_link_debug(link
, "Saved original MTU: %" PRIu32
, link
->original_mtu
);
2063 if (link
->dhcp_client
) {
2064 r
= sd_dhcp_client_set_mtu(link
->dhcp_client
,
2067 log_link_warning_errno(link
, r
, "Could not update MTU in DHCP client: %m");
2073 /* The kernel may broadcast NEWLINK messages without the MAC address
2074 set, simply ignore them. */
2075 r
= sd_netlink_message_read_ether_addr(m
, IFLA_ADDRESS
, &mac
);
2077 if (memcmp(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2080 memcpy(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2083 log_link_debug(link
, "MAC address: "
2084 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2085 mac
.ether_addr_octet
[0],
2086 mac
.ether_addr_octet
[1],
2087 mac
.ether_addr_octet
[2],
2088 mac
.ether_addr_octet
[3],
2089 mac
.ether_addr_octet
[4],
2090 mac
.ether_addr_octet
[5]);
2093 r
= sd_ipv4ll_set_mac(link
->ipv4ll
, &link
->mac
);
2095 return log_link_warning_errno(link
, r
, "Could not update MAC address in IPv4LL client: %m");
2098 if (link
->dhcp_client
) {
2099 r
= sd_dhcp_client_set_mac(link
->dhcp_client
,
2100 (const uint8_t *) &link
->mac
,
2104 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCP client: %m");
2107 if (link
->dhcp6_client
) {
2108 r
= sd_dhcp6_client_set_mac(link
->dhcp6_client
,
2109 (const uint8_t *) &link
->mac
,
2113 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCPv6 client: %m");
2118 had_carrier
= link_has_carrier(link
);
2120 r
= link_update_flags(link
, m
);
2124 carrier_gained
= !had_carrier
&& link_has_carrier(link
);
2125 carrier_lost
= had_carrier
&& !link_has_carrier(link
);
2127 if (carrier_gained
) {
2128 log_link_info(link
, "Gained carrier");
2130 r
= link_carrier_gained(link
);
2133 } else if (carrier_lost
) {
2134 log_link_info(link
, "Lost carrier");
2136 r
= link_carrier_lost(link
);
2145 static void link_update_operstate(Link
*link
) {
2146 LinkOperationalState operstate
;
2149 if (link
->kernel_operstate
== IF_OPER_DORMANT
)
2150 operstate
= LINK_OPERSTATE_DORMANT
;
2151 else if (link_has_carrier(link
)) {
2153 uint8_t scope
= RT_SCOPE_NOWHERE
;
2155 /* if we have carrier, check what addresses we have */
2156 LIST_FOREACH(addresses
, address
, link
->addresses
) {
2157 if (address
->flags
& (IFA_F_TENTATIVE
| IFA_F_DEPRECATED
))
2160 if (address
->scope
< scope
)
2161 scope
= address
->scope
;
2164 if (scope
< RT_SCOPE_SITE
)
2165 /* universally accessible addresses found */
2166 operstate
= LINK_OPERSTATE_ROUTABLE
;
2167 else if (scope
< RT_SCOPE_HOST
)
2168 /* only link or site local addresses found */
2169 operstate
= LINK_OPERSTATE_DEGRADED
;
2171 /* no useful addresses found */
2172 operstate
= LINK_OPERSTATE_CARRIER
;
2173 } else if (link
->flags
& IFF_UP
)
2174 operstate
= LINK_OPERSTATE_NO_CARRIER
;
2176 operstate
= LINK_OPERSTATE_OFF
;
2178 if (link
->operstate
!= operstate
) {
2179 link
->operstate
= operstate
;
2180 link_send_changed(link
, "OperationalState", NULL
);
2184 int link_save(Link
*link
) {
2185 _cleanup_free_
char *temp_path
= NULL
;
2186 _cleanup_fclose_
FILE *f
= NULL
;
2187 const char *admin_state
, *oper_state
;
2191 assert(link
->state_file
);
2192 assert(link
->lease_file
);
2193 assert(link
->manager
);
2195 link_update_operstate(link
);
2197 r
= manager_save(link
->manager
);
2201 if (link
->state
== LINK_STATE_LINGER
) {
2202 unlink(link
->state_file
);
2206 admin_state
= link_state_to_string(link
->state
);
2207 assert(admin_state
);
2209 oper_state
= link_operstate_to_string(link
->operstate
);
2212 r
= fopen_temporary(link
->state_file
, &f
, &temp_path
);
2216 fchmod(fileno(f
), 0644);
2219 "# This is private data. Do not parse.\n"
2222 admin_state
, oper_state
);
2224 if (link
->network
) {
2225 char **address
, **domain
;
2228 fprintf(f
, "NETWORK_FILE=%s\n", link
->network
->filename
);
2232 STRV_FOREACH(address
, link
->network
->dns
) {
2239 if (link
->network
->dhcp_dns
&&
2241 const struct in_addr
*addresses
;
2243 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
2247 serialize_in_addrs(f
, addresses
, r
);
2255 STRV_FOREACH(address
, link
->network
->ntp
) {
2262 if (link
->network
->dhcp_ntp
&&
2264 const struct in_addr
*addresses
;
2266 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
2270 serialize_in_addrs(f
, addresses
, r
);
2276 fprintf(f
, "DOMAINS=");
2278 STRV_FOREACH(domain
, link
->network
->domains
) {
2285 if (link
->network
->dhcp_domains
&&
2287 const char *domainname
;
2289 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
2293 fputs(domainname
, f
);
2299 fprintf(f
, "WILDCARD_DOMAIN=%s\n",
2300 yes_no(link
->network
->wildcard_domain
));
2302 fprintf(f
, "LLMNR=%s\n",
2303 llmnr_support_to_string(link
->network
->llmnr
));
2306 if (!hashmap_isempty(link
->bound_to_links
)) {
2311 fputs("CARRIER_BOUND_TO=", f
);
2312 HASHMAP_FOREACH(carrier
, link
->bound_to_links
, i
) {
2315 fputs(carrier
->ifname
, f
);
2322 if (!hashmap_isempty(link
->bound_by_links
)) {
2327 fputs("CARRIER_BOUND_BY=", f
);
2328 HASHMAP_FOREACH(carrier
, link
->bound_by_links
, i
) {
2331 fputs(carrier
->ifname
, f
);
2338 if (link
->dhcp_lease
) {
2339 assert(link
->network
);
2341 r
= sd_dhcp_lease_save(link
->dhcp_lease
, link
->lease_file
);
2349 unlink(link
->lease_file
);
2352 assert(link
->network
);
2354 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
2362 unlink(link
->lldp_file
);
2364 r
= fflush_and_check(f
);
2368 if (rename(temp_path
, link
->state_file
) < 0) {
2375 log_link_error_errno(link
, r
, "Failed to save link data to %s: %m", link
->state_file
);
2376 (void) unlink(link
->state_file
);
2379 (void) unlink(temp_path
);
2384 static const char* const link_state_table
[_LINK_STATE_MAX
] = {
2385 [LINK_STATE_PENDING
] = "pending",
2386 [LINK_STATE_ENSLAVING
] = "configuring",
2387 [LINK_STATE_SETTING_ADDRESSES
] = "configuring",
2388 [LINK_STATE_SETTING_ROUTES
] = "configuring",
2389 [LINK_STATE_CONFIGURED
] = "configured",
2390 [LINK_STATE_UNMANAGED
] = "unmanaged",
2391 [LINK_STATE_FAILED
] = "failed",
2392 [LINK_STATE_LINGER
] = "linger",
2395 DEFINE_STRING_TABLE_LOOKUP(link_state
, LinkState
);
2397 static const char* const link_operstate_table
[_LINK_OPERSTATE_MAX
] = {
2398 [LINK_OPERSTATE_OFF
] = "off",
2399 [LINK_OPERSTATE_NO_CARRIER
] = "no-carrier",
2400 [LINK_OPERSTATE_DORMANT
] = "dormant",
2401 [LINK_OPERSTATE_CARRIER
] = "carrier",
2402 [LINK_OPERSTATE_DEGRADED
] = "degraded",
2403 [LINK_OPERSTATE_ROUTABLE
] = "routable",
2406 DEFINE_STRING_TABLE_LOOKUP(link_operstate
, LinkOperationalState
);