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>
30 #include "udev-util.h"
31 #include "network-internal.h"
32 #include "networkd-link.h"
33 #include "networkd-netdev.h"
35 bool link_dhcp6_enabled(Link
*link
) {
36 if (link
->flags
& IFF_LOOPBACK
)
42 return IN_SET(link
->network
->dhcp
, ADDRESS_FAMILY_IPV6
, ADDRESS_FAMILY_YES
);
45 bool link_dhcp4_enabled(Link
*link
) {
46 if (link
->flags
& IFF_LOOPBACK
)
52 return IN_SET(link
->network
->dhcp
, ADDRESS_FAMILY_IPV4
, ADDRESS_FAMILY_YES
);
55 bool link_dhcp4_server_enabled(Link
*link
) {
56 if (link
->flags
& IFF_LOOPBACK
)
62 return link
->network
->dhcp_server
;
65 bool link_ipv4ll_enabled(Link
*link
) {
66 if (link
->flags
& IFF_LOOPBACK
)
72 return IN_SET(link
->network
->link_local
, ADDRESS_FAMILY_IPV4
, ADDRESS_FAMILY_YES
);
75 bool link_ipv6ll_enabled(Link
*link
) {
76 if (link
->flags
& IFF_LOOPBACK
)
82 return IN_SET(link
->network
->link_local
, ADDRESS_FAMILY_IPV6
, ADDRESS_FAMILY_YES
);
85 bool link_lldp_enabled(Link
*link
) {
86 if (link
->flags
& IFF_LOOPBACK
)
92 if (link
->network
->bridge
)
95 return link
->network
->lldp
;
98 static bool link_ipv4_forward_enabled(Link
*link
) {
99 if (link
->flags
& IFF_LOOPBACK
)
105 return IN_SET(link
->network
->ip_forward
, ADDRESS_FAMILY_IPV4
, ADDRESS_FAMILY_YES
);
108 static bool link_ipv6_forward_enabled(Link
*link
) {
109 if (link
->flags
& IFF_LOOPBACK
)
115 return IN_SET(link
->network
->ip_forward
, ADDRESS_FAMILY_IPV6
, ADDRESS_FAMILY_YES
);
118 #define FLAG_STRING(string, flag, old, new) \
119 (((old ^ new) & flag) \
120 ? ((old & flag) ? (" -" string) : (" +" string)) \
123 static int link_update_flags(Link
*link
, sd_rtnl_message
*m
) {
124 unsigned flags
, unknown_flags_added
, unknown_flags_removed
, unknown_flags
;
130 r
= sd_rtnl_message_link_get_flags(m
, &flags
);
132 return log_link_warning_errno(link
, r
, "Could not get link flags: %m");
134 r
= sd_rtnl_message_read_u8(m
, IFLA_OPERSTATE
, &operstate
);
136 /* if we got a message without operstate, take it to mean
137 the state was unchanged */
138 operstate
= link
->kernel_operstate
;
140 if ((link
->flags
== flags
) && (link
->kernel_operstate
== operstate
))
143 if (link
->flags
!= flags
) {
144 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",
145 FLAG_STRING("LOOPBACK", IFF_LOOPBACK
, link
->flags
, flags
),
146 FLAG_STRING("MASTER", IFF_MASTER
, link
->flags
, flags
),
147 FLAG_STRING("SLAVE", IFF_SLAVE
, link
->flags
, flags
),
148 FLAG_STRING("UP", IFF_UP
, link
->flags
, flags
),
149 FLAG_STRING("DORMANT", IFF_DORMANT
, link
->flags
, flags
),
150 FLAG_STRING("LOWER_UP", IFF_LOWER_UP
, link
->flags
, flags
),
151 FLAG_STRING("RUNNING", IFF_RUNNING
, link
->flags
, flags
),
152 FLAG_STRING("MULTICAST", IFF_MULTICAST
, link
->flags
, flags
),
153 FLAG_STRING("BROADCAST", IFF_BROADCAST
, link
->flags
, flags
),
154 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT
, link
->flags
, flags
),
155 FLAG_STRING("PROMISC", IFF_PROMISC
, link
->flags
, flags
),
156 FLAG_STRING("ALLMULTI", IFF_ALLMULTI
, link
->flags
, flags
),
157 FLAG_STRING("PORTSEL", IFF_PORTSEL
, link
->flags
, flags
),
158 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA
, link
->flags
, flags
),
159 FLAG_STRING("DYNAMIC", IFF_DYNAMIC
, link
->flags
, flags
),
160 FLAG_STRING("NOARP", IFF_NOARP
, link
->flags
, flags
),
161 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS
, link
->flags
, flags
),
162 FLAG_STRING("DEBUG", IFF_DEBUG
, link
->flags
, flags
),
163 FLAG_STRING("ECHO", IFF_ECHO
, link
->flags
, flags
));
165 unknown_flags
= ~(IFF_LOOPBACK
| IFF_MASTER
| IFF_SLAVE
| IFF_UP
|
166 IFF_DORMANT
| IFF_LOWER_UP
| IFF_RUNNING
|
167 IFF_MULTICAST
| IFF_BROADCAST
| IFF_POINTOPOINT
|
168 IFF_PROMISC
| IFF_ALLMULTI
| IFF_PORTSEL
|
169 IFF_AUTOMEDIA
| IFF_DYNAMIC
| IFF_NOARP
|
170 IFF_NOTRAILERS
| IFF_DEBUG
| IFF_ECHO
);
171 unknown_flags_added
= ((link
->flags
^ flags
) & flags
& unknown_flags
);
172 unknown_flags_removed
= ((link
->flags
^ flags
) & link
->flags
& unknown_flags
);
174 /* link flags are currently at most 18 bits, let's align to
176 if (unknown_flags_added
)
178 "Unknown link flags gained: %#.5x (ignoring)",
179 unknown_flags_added
);
181 if (unknown_flags_removed
)
183 "Unknown link flags lost: %#.5x (ignoring)",
184 unknown_flags_removed
);
188 link
->kernel_operstate
= operstate
;
195 static int link_new(Manager
*manager
, sd_rtnl_message
*message
, Link
**ret
) {
196 _cleanup_link_unref_ Link
*link
= NULL
;
205 r
= sd_rtnl_message_get_type(message
, &type
);
208 else if (type
!= RTM_NEWLINK
)
211 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
214 else if (ifindex
<= 0)
217 r
= sd_rtnl_message_read_string(message
, IFLA_IFNAME
, &ifname
);
221 link
= new0(Link
, 1);
226 link
->manager
= manager
;
227 link
->state
= LINK_STATE_PENDING
;
228 link
->ifindex
= ifindex
;
229 link
->ifname
= strdup(ifname
);
233 r
= sd_rtnl_message_read_ether_addr(message
, IFLA_ADDRESS
, &link
->mac
);
235 log_link_debug(link
, "MAC address not found for new device, continuing without");
237 r
= asprintf(&link
->state_file
, "/run/systemd/netif/links/%d",
242 r
= asprintf(&link
->lease_file
, "/run/systemd/netif/leases/%d",
247 r
= asprintf(&link
->lldp_file
, "/run/systemd/netif/lldp/%d",
253 r
= hashmap_ensure_allocated(&manager
->links
, NULL
);
257 r
= hashmap_put(manager
->links
, INT_TO_PTR(link
->ifindex
), link
);
261 r
= link_update_flags(link
, message
);
271 static void link_free(Link
*link
) {
279 while ((address
= link
->addresses
)) {
280 LIST_REMOVE(addresses
, link
->addresses
, address
);
281 address_free(address
);
284 while ((address
= link
->pool_addresses
)) {
285 LIST_REMOVE(addresses
, link
->pool_addresses
, address
);
286 address_free(address
);
289 sd_dhcp_server_unref(link
->dhcp_server
);
290 sd_dhcp_client_unref(link
->dhcp_client
);
291 sd_dhcp_lease_unref(link
->dhcp_lease
);
293 free(link
->lease_file
);
295 sd_lldp_free(link
->lldp
);
297 free(link
->lldp_file
);
299 sd_ipv4ll_unref(link
->ipv4ll
);
300 sd_dhcp6_client_unref(link
->dhcp6_client
);
301 sd_icmp6_nd_unref(link
->icmp6_router_discovery
);
304 hashmap_remove(link
->manager
->links
, INT_TO_PTR(link
->ifindex
));
308 free(link
->state_file
);
310 udev_device_unref(link
->udev_device
);
312 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
)
313 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(carrier
->ifindex
));
314 hashmap_free(link
->bound_to_links
);
316 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
)
317 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(carrier
->ifindex
));
318 hashmap_free(link
->bound_by_links
);
323 Link
*link_unref(Link
*link
) {
324 if (link
&& (-- link
->n_ref
<= 0))
330 Link
*link_ref(Link
*link
) {
332 assert_se(++ link
->n_ref
>= 2);
337 int link_get(Manager
*m
, int ifindex
, Link
**ret
) {
344 link
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
353 static void link_set_state(Link
*link
, LinkState state
) {
356 if (link
->state
== state
)
361 link_send_changed(link
, "AdministrativeState", NULL
);
366 static void link_enter_unmanaged(Link
*link
) {
369 log_link_debug(link
, "Unmanaged");
371 link_set_state(link
, LINK_STATE_UNMANAGED
);
376 static int link_stop_clients(Link
*link
) {
380 assert(link
->manager
);
381 assert(link
->manager
->event
);
386 if (link
->dhcp_client
) {
387 k
= sd_dhcp_client_stop(link
->dhcp_client
);
389 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv4 client: %m");
393 k
= sd_ipv4ll_stop(link
->ipv4ll
);
395 r
= log_link_warning_errno(link
, r
, "Could not stop IPv4 link-local: %m");
398 if(link
->icmp6_router_discovery
) {
399 if (link
->dhcp6_client
) {
400 k
= sd_dhcp6_client_stop(link
->dhcp6_client
);
402 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv6 client: %m");
405 k
= sd_icmp6_nd_stop(link
->icmp6_router_discovery
);
407 r
= log_link_warning_errno(link
, r
, "Could not stop ICMPv6 router discovery: %m");
411 k
= sd_lldp_stop(link
->lldp
);
413 r
= log_link_warning_errno(link
, r
, "Could not stop LLDP: %m");
419 void link_enter_failed(Link
*link
) {
422 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
425 log_link_warning(link
, "Failed");
427 link_set_state(link
, LINK_STATE_FAILED
);
429 link_stop_clients(link
);
434 static Address
* link_find_dhcp_server_address(Link
*link
) {
438 assert(link
->network
);
440 /* The first statically configured address if there is any */
441 LIST_FOREACH(addresses
, address
, link
->network
->static_addresses
) {
443 if (address
->family
!= AF_INET
)
446 if (in_addr_is_null(address
->family
, &address
->in_addr
))
452 /* If that didn't work, find a suitable address we got from the pool */
453 LIST_FOREACH(addresses
, address
, link
->pool_addresses
) {
454 if (address
->family
!= AF_INET
)
463 static int link_enter_configured(Link
*link
) {
465 assert(link
->network
);
466 assert(link
->state
== LINK_STATE_SETTING_ROUTES
);
468 log_link_info(link
, "Configured");
470 link_set_state(link
, LINK_STATE_CONFIGURED
);
477 void link_client_handler(Link
*link
) {
479 assert(link
->network
);
481 if (!link
->static_configured
)
484 if (link_ipv4ll_enabled(link
))
485 if (!link
->ipv4ll_address
||
489 if (link_dhcp4_enabled(link
) && !link
->dhcp4_configured
)
492 if (link
->state
!= LINK_STATE_CONFIGURED
)
493 link_enter_configured(link
);
498 static int route_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
499 _cleanup_link_unref_ Link
*link
= userdata
;
502 assert(link
->link_messages
> 0);
503 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
504 LINK_STATE_SETTING_ROUTES
, LINK_STATE_FAILED
,
507 link
->link_messages
--;
509 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
512 r
= sd_rtnl_message_get_errno(m
);
513 if (r
< 0 && r
!= -EEXIST
)
514 log_link_warning_errno(link
, r
, "%-*s: could not set route: %m", IFNAMSIZ
, link
->ifname
);
516 if (link
->link_messages
== 0) {
517 log_link_debug(link
, "Routes set");
518 link
->static_configured
= true;
519 link_client_handler(link
);
525 static int link_enter_set_routes(Link
*link
) {
530 assert(link
->network
);
531 assert(link
->state
== LINK_STATE_SETTING_ADDRESSES
);
533 link_set_state(link
, LINK_STATE_SETTING_ROUTES
);
535 LIST_FOREACH(routes
, rt
, link
->network
->static_routes
) {
536 r
= route_configure(rt
, link
, &route_handler
);
538 log_link_warning_errno(link
, r
, "Could not set routes: %m");
539 link_enter_failed(link
);
543 link
->link_messages
++;
546 if (link
->link_messages
== 0) {
547 link
->static_configured
= true;
548 link_client_handler(link
);
550 log_link_debug(link
, "Setting routes");
555 int link_route_drop_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
556 _cleanup_link_unref_ Link
*link
= userdata
;
561 assert(link
->ifname
);
563 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
566 r
= sd_rtnl_message_get_errno(m
);
567 if (r
< 0 && r
!= -ESRCH
)
568 log_link_warning_errno(link
, r
, "%-*s: could not drop route: %m", IFNAMSIZ
, link
->ifname
);
573 static int address_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
574 _cleanup_link_unref_ Link
*link
= userdata
;
580 assert(link
->ifname
);
581 assert(link
->link_messages
> 0);
582 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
583 LINK_STATE_FAILED
, LINK_STATE_LINGER
));
585 link
->link_messages
--;
587 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
590 r
= sd_rtnl_message_get_errno(m
);
591 if (r
< 0 && r
!= -EEXIST
)
592 log_link_warning_errno(link
, r
, "%-*s: could not set address: %m", IFNAMSIZ
, link
->ifname
);
594 link_rtnl_process_address(rtnl
, m
, link
->manager
);
596 if (link
->link_messages
== 0) {
597 log_link_debug(link
, "Addresses set");
598 link_enter_set_routes(link
);
604 static int link_enter_set_addresses(Link
*link
) {
609 assert(link
->network
);
610 assert(link
->state
!= _LINK_STATE_INVALID
);
612 link_set_state(link
, LINK_STATE_SETTING_ADDRESSES
);
614 LIST_FOREACH(addresses
, ad
, link
->network
->static_addresses
) {
615 r
= address_configure(ad
, link
, &address_handler
);
617 log_link_warning_errno(link
, r
, "Could not set addresses: %m");
618 link_enter_failed(link
);
622 link
->link_messages
++;
625 /* now that we can figure out a default address for the dhcp server,
627 if (link_dhcp4_server_enabled(link
)) {
628 struct in_addr pool_start
;
631 address
= link_find_dhcp_server_address(link
);
633 log_link_warning(link
, "Failed to find suitable address for DHCPv4 server instance.");
634 link_enter_failed(link
);
638 r
= sd_dhcp_server_set_address(link
->dhcp_server
,
639 &address
->in_addr
.in
,
644 /* offer 32 addresses starting from the address following the server address */
645 pool_start
.s_addr
= htobe32(be32toh(address
->in_addr
.in
.s_addr
) + 1);
646 r
= sd_dhcp_server_set_lease_pool(link
->dhcp_server
,
652 r = sd_dhcp_server_set_router(link->dhcp_server,
653 &main_address->in_addr.in);
657 r = sd_dhcp_server_set_prefixlen(link->dhcp_server,
658 main_address->prefixlen);
663 r
= sd_dhcp_server_start(link
->dhcp_server
);
665 log_link_warning_errno(link
, r
, "Could not start DHCPv4 server instance: %m");
667 link_enter_failed(link
);
672 log_link_debug(link
, "Offering DHCPv4 leases");
675 if (link
->link_messages
== 0)
676 link_enter_set_routes(link
);
678 log_link_debug(link
, "Setting addresses");
683 int link_address_drop_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
684 _cleanup_link_unref_ Link
*link
= userdata
;
689 assert(link
->ifname
);
691 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
694 r
= sd_rtnl_message_get_errno(m
);
695 if (r
< 0 && r
!= -EADDRNOTAVAIL
)
696 log_link_warning_errno(link
, r
, "%-*s: could not drop address: %m", IFNAMSIZ
, link
->ifname
);
701 static int link_set_bridge_fdb(Link
*const link
) {
705 LIST_FOREACH(static_fdb_entries
, fdb_entry
, link
->network
->static_fdb_entries
) {
706 r
= fdb_entry_configure(link
, fdb_entry
);
708 log_link_error_errno(link
, r
, "Failed to add MAC entry to static MAC table: %m");
716 static int link_set_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
717 _cleanup_link_unref_ Link
*link
= userdata
;
720 log_link_debug(link
, "Set link");
722 r
= sd_rtnl_message_get_errno(m
);
723 if (r
< 0 && r
!= -EEXIST
) {
724 log_link_struct(link
, LOG_ERR
,
725 "MESSAGE=%-*s: could not join netdev: %s",
726 IFNAMSIZ
, link
->ifname
,
730 link_enter_failed(link
);
737 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
738 _cleanup_link_unref_ Link
*link
= userdata
;
744 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
747 r
= sd_bus_message_get_errno(m
);
749 log_link_warning_errno(link
, r
, "Could not set hostname: %m");
754 int link_set_hostname(Link
*link
, const char *hostname
) {
755 _cleanup_bus_message_unref_ sd_bus_message
*m
= NULL
;
759 assert(link
->manager
);
762 log_link_debug(link
, "Setting transient hostname: '%s'", hostname
);
764 if (!link
->manager
->bus
) {
765 /* TODO: replace by assert when we can rely on kdbus */
766 log_link_info(link
, "Not connected to system bus, ignoring transient hostname.");
770 r
= sd_bus_message_new_method_call(
773 "org.freedesktop.hostname1",
774 "/org/freedesktop/hostname1",
775 "org.freedesktop.hostname1",
780 r
= sd_bus_message_append(m
, "sb", hostname
, false);
784 r
= sd_bus_call_async(link
->manager
->bus
, NULL
, m
, set_hostname_handler
,
787 return log_link_error_errno(link
, r
, "Could not set transient hostname: %m");
794 static int set_mtu_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
795 _cleanup_link_unref_ Link
*link
= userdata
;
800 assert(link
->ifname
);
802 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
805 r
= sd_rtnl_message_get_errno(m
);
807 log_link_warning_errno(link
, r
, "%-*s: could not set MTU: %m", IFNAMSIZ
, link
->ifname
);
812 int link_set_mtu(Link
*link
, uint32_t mtu
) {
813 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
;
817 assert(link
->manager
);
818 assert(link
->manager
->rtnl
);
820 log_link_debug(link
, "Setting MTU: %" PRIu32
, mtu
);
822 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
824 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
826 r
= sd_rtnl_message_append_u32(req
, IFLA_MTU
, mtu
);
828 return log_link_error_errno(link
, r
, "Could not append MTU: %m");
830 r
= sd_rtnl_call_async(link
->manager
->rtnl
, req
, set_mtu_handler
, link
, 0, NULL
);
832 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
839 static int link_set_bridge(Link
*link
) {
840 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
;
844 assert(link
->network
);
846 if(link
->network
->cost
== 0)
849 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
851 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
853 r
= sd_rtnl_message_link_set_family(req
, PF_BRIDGE
);
855 return log_link_error_errno(link
, r
, "Could not set message family: %m");
857 r
= sd_rtnl_message_open_container(req
, IFLA_PROTINFO
);
859 return log_link_error_errno(link
, r
, "Could not append IFLA_PROTINFO attribute: %m");
861 if(link
->network
->cost
!= 0) {
862 r
= sd_rtnl_message_append_u32(req
, IFLA_BRPORT_COST
, link
->network
->cost
);
864 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_COST attribute: %m");
867 r
= sd_rtnl_message_close_container(req
);
869 return log_link_error_errno(link
, r
, "Could not append IFLA_LINKINFO attribute: %m");
871 r
= sd_rtnl_call_async(link
->manager
->rtnl
, req
, link_set_handler
, link
, 0, NULL
);
873 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
880 static void lldp_handler(sd_lldp
*lldp
, int event
, void *userdata
) {
881 Link
*link
= userdata
;
885 assert(link
->network
);
886 assert(link
->manager
);
888 if (event
!= UPDATE_INFO
)
891 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
893 log_link_warning_errno(link
, r
, "Could not save LLDP: %m");
897 static int link_acquire_conf(Link
*link
) {
901 assert(link
->network
);
902 assert(link
->manager
);
903 assert(link
->manager
->event
);
905 if (link_ipv4ll_enabled(link
)) {
906 assert(link
->ipv4ll
);
908 log_link_debug(link
, "Acquiring IPv4 link-local address");
910 r
= sd_ipv4ll_start(link
->ipv4ll
);
912 return log_link_warning_errno(link
, r
, "Could not acquire IPv4 link-local address: %m");
915 if (link_dhcp4_enabled(link
)) {
916 assert(link
->dhcp_client
);
918 log_link_debug(link
, "Acquiring DHCPv4 lease");
920 r
= sd_dhcp_client_start(link
->dhcp_client
);
922 return log_link_warning_errno(link
, r
, "Could not acquire DHCPv4 lease: %m");
925 if (link_dhcp6_enabled(link
)) {
926 assert(link
->icmp6_router_discovery
);
928 log_link_debug(link
, "Discovering IPv6 routers");
930 r
= sd_icmp6_router_solicitation_start(link
->icmp6_router_discovery
);
932 return log_link_warning_errno(link
, r
, "Could not start IPv6 router discovery: %m");
935 if (link_lldp_enabled(link
)) {
938 log_link_debug(link
, "Starting LLDP");
940 r
= sd_lldp_start(link
->lldp
);
942 return log_link_warning_errno(link
, r
, "Could not start LLDP: %m");
948 bool link_has_carrier(Link
*link
) {
949 /* see Documentation/networking/operstates.txt in the kernel sources */
951 if (link
->kernel_operstate
== IF_OPER_UP
)
954 if (link
->kernel_operstate
== IF_OPER_UNKNOWN
)
955 /* operstate may not be implemented, so fall back to flags */
956 if ((link
->flags
& IFF_LOWER_UP
) && !(link
->flags
& IFF_DORMANT
))
962 static int link_up_handler(sd_rtnl
*rtnl
, sd_rtnl_message
*m
, void *userdata
) {
963 _cleanup_link_unref_ Link
*link
= userdata
;
968 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
971 r
= sd_rtnl_message_get_errno(m
);
973 /* we warn but don't fail the link, as it may be
975 log_link_warning_errno(link
, r
, "%-*s: could not bring up interface: %m", IFNAMSIZ
, link
->ifname
);
980 static int link_up(Link
*link
) {
981 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
;
986 assert(link
->network
);
987 assert(link
->manager
);
988 assert(link
->manager
->rtnl
);
990 log_link_debug(link
, "Bringing link up");
992 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
994 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
996 r
= sd_rtnl_message_link_set_flags(req
, IFF_UP
, IFF_UP
);
998 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1000 if (link
->network
->mac
) {
1001 r
= sd_rtnl_message_append_ether_addr(req
, IFLA_ADDRESS
, link
->network
->mac
);
1003 return log_link_error_errno(link
, r
, "Could not set MAC address: %m");
1006 if (link
->network
->mtu
) {
1007 r
= sd_rtnl_message_append_u32(req
, IFLA_MTU
, link
->network
->mtu
);
1009 return log_link_error_errno(link
, r
, "Could not set MTU: %m");
1012 r
= sd_rtnl_message_open_container(req
, IFLA_AF_SPEC
);
1014 return log_link_error_errno(link
, r
, "Could not open IFLA_AF_SPEC container: %m");
1016 r
= sd_rtnl_message_open_container(req
, AF_INET6
);
1018 return log_link_error_errno(link
, r
, "Could not open AF_INET6 container: %m");
1020 ipv6ll_mode
= link_ipv6ll_enabled(link
) ? IN6_ADDR_GEN_MODE_EUI64
: IN6_ADDR_GEN_MODE_NONE
;
1021 r
= sd_rtnl_message_append_u8(req
, IFLA_INET6_ADDR_GEN_MODE
, ipv6ll_mode
);
1023 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_ADDR_GEN_MODE: %m");
1025 if (!in_addr_is_null(AF_INET6
, &link
->network
->ipv6_token
)) {
1026 r
= sd_rtnl_message_append_in6_addr(req
, IFLA_INET6_TOKEN
, &link
->network
->ipv6_token
.in6
);
1028 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_TOKEN: %m");
1031 r
= sd_rtnl_message_close_container(req
);
1033 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_link_struct(link
, LOG_DEBUG
,
1414 "MESSAGE=%-*s: enslaving by '%s'",
1415 IFNAMSIZ
, link
->ifname
,
1416 link
->network
->bond
->ifname
,
1417 NETDEVIF(link
->network
->bond
),
1420 r
= netdev_join(link
->network
->bond
, link
, &netdev_join_handler
);
1422 log_link_struct(link
, LOG_WARNING
,
1423 "MESSAGE=%-*s: could not join netdev '%s': %s",
1424 IFNAMSIZ
, link
->ifname
,
1425 link
->network
->bond
->ifname
,
1427 NETDEVIF(link
->network
->bond
),
1429 link_enter_failed(link
);
1436 if (link
->network
->bridge
) {
1437 log_link_struct(link
, LOG_DEBUG
,
1438 "MESSAGE=%-*s: enslaving by '%s'",
1439 IFNAMSIZ
, link
->ifname
,
1440 link
->network
->bridge
->ifname
,
1441 NETDEVIF(link
->network
->bridge
),
1444 r
= netdev_join(link
->network
->bridge
, link
,
1445 &netdev_join_handler
);
1447 log_link_struct(link
, LOG_WARNING
,
1448 "MESSAGE=%-*s: could not join netdev '%s': %s",
1449 IFNAMSIZ
, link
->ifname
,
1450 link
->network
->bridge
->ifname
,
1452 NETDEVIF(link
->network
->bridge
),
1454 link_enter_failed(link
);
1461 HASHMAP_FOREACH(netdev
, link
->network
->stacked_netdevs
, i
) {
1462 log_link_struct(link
, LOG_DEBUG
,
1463 "MESSAGE=%-*s: enslaving by '%s'",
1464 IFNAMSIZ
, link
->ifname
,
1465 netdev
->ifname
, NETDEVIF(netdev
),
1468 r
= netdev_join(netdev
, link
, &netdev_join_handler
);
1470 log_link_struct(link
, LOG_WARNING
,
1471 "MESSAGE=%-*s: could not join netdev '%s': %s",
1472 IFNAMSIZ
, link
->ifname
,
1475 NETDEVIF(netdev
), NULL
);
1476 link_enter_failed(link
);
1486 static int link_set_ipv4_forward(Link
*link
) {
1487 const char *p
= NULL
;
1491 b
= link_ipv4_forward_enabled(link
);
1493 p
= strjoina("/proc/sys/net/ipv4/conf/", link
->ifname
, "/forwarding");
1494 r
= write_string_file_no_create(p
, one_zero(b
));
1496 log_link_warning_errno(link
, r
, "Cannot configure IPv4 forwarding for interface %s: %m", link
->ifname
);
1499 _cleanup_free_
char *buf
= NULL
;
1501 /* If IP forwarding is turned on for this interface,
1502 * then propagate this to the global setting. Given
1503 * that turning this on has side-effects on other
1504 * fields, we'll try to avoid doing this unless
1505 * necessary, hence check the previous value
1506 * first. Note that we never turn this option off
1507 * again, since all interfaces we manage do not do
1508 * forwarding anyway by default, and ownership rules
1509 * of this control are so unclear. */
1511 r
= read_one_line_file("/proc/sys/net/ipv4/ip_forward", &buf
);
1513 log_link_warning_errno(link
, r
, "Cannot read /proc/sys/net/ipv4/ip_forward: %m");
1514 else if (!streq(buf
, "1")) {
1515 r
= write_string_file_no_create("/proc/sys/net/ipv4/ip_forward", "1");
1517 log_link_warning_errno(link
, r
, "Cannot write /proc/sys/net/ipv4/ip_forward: %m");
1524 static int link_set_ipv6_forward(Link
*link
) {
1525 const char *p
= NULL
;
1528 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/forwarding");
1529 r
= write_string_file_no_create(p
, one_zero(link_ipv6_forward_enabled(link
)));
1531 log_link_warning_errno(link
, r
, "Cannot configure IPv6 forwarding for interface: %m");
1536 static int link_configure(Link
*link
) {
1540 assert(link
->network
);
1541 assert(link
->state
== LINK_STATE_PENDING
);
1543 r
= link_set_bridge_fdb(link
);
1547 r
= link_set_ipv4_forward(link
);
1551 r
= link_set_ipv6_forward(link
);
1555 if (link_ipv4ll_enabled(link
)) {
1556 r
= ipv4ll_configure(link
);
1561 if (link_dhcp4_enabled(link
)) {
1562 r
= dhcp4_configure(link
);
1567 if (link_dhcp4_server_enabled(link
)) {
1568 r
= sd_dhcp_server_new(&link
->dhcp_server
, link
->ifindex
);
1572 r
= sd_dhcp_server_attach_event(link
->dhcp_server
, NULL
, 0);
1577 if (link_dhcp6_enabled(link
)) {
1578 r
= icmp6_configure(link
);
1583 if (link_lldp_enabled(link
)) {
1584 r
= sd_lldp_new(link
->ifindex
, link
->ifname
, &link
->mac
, &link
->lldp
);
1588 r
= sd_lldp_attach_event(link
->lldp
, NULL
, 0);
1592 r
= sd_lldp_set_callback(link
->lldp
,
1593 lldp_handler
, link
);
1598 if (link_has_carrier(link
)) {
1599 r
= link_acquire_conf(link
);
1604 return link_enter_join_netdev(link
);
1607 static int link_initialized_and_synced(sd_rtnl
*rtnl
, sd_rtnl_message
*m
,
1609 _cleanup_link_unref_ Link
*link
= userdata
;
1614 assert(link
->ifname
);
1615 assert(link
->manager
);
1617 if (link
->state
!= LINK_STATE_PENDING
)
1620 log_link_debug(link
, "Link state is up-to-date");
1622 r
= link_new_bound_by_list(link
);
1626 r
= link_handle_bound_by_list(link
);
1630 r
= network_get(link
->manager
, link
->udev_device
, link
->ifname
,
1631 &link
->mac
, &network
);
1633 link_enter_unmanaged(link
);
1638 if (link
->flags
& IFF_LOOPBACK
) {
1639 if (network
->link_local
!= ADDRESS_FAMILY_NO
)
1640 log_link_debug(link
, "Ignoring link-local autoconfiguration for loopback link");
1642 if (network
->dhcp
!= ADDRESS_FAMILY_NO
)
1643 log_link_debug(link
, "Ignoring DHCP clients for loopback link");
1645 if (network
->dhcp_server
)
1646 log_link_debug(link
, "Ignoring DHCP server for loopback link");
1649 r
= network_apply(link
->manager
, network
, link
);
1653 r
= link_new_bound_to_list(link
);
1657 r
= link_configure(link
);
1664 int link_initialized(Link
*link
, struct udev_device
*device
) {
1665 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
;
1669 assert(link
->manager
);
1670 assert(link
->manager
->rtnl
);
1673 if (link
->state
!= LINK_STATE_PENDING
)
1676 if (link
->udev_device
)
1679 log_link_debug(link
, "udev initialized link");
1681 link
->udev_device
= udev_device_ref(device
);
1683 /* udev has initialized the link, but we don't know if we have yet
1684 * processed the NEWLINK messages with the latest state. Do a GETLINK,
1685 * when it returns we know that the pending NEWLINKs have already been
1686 * processed and that we are up-to-date */
1688 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_GETLINK
,
1693 r
= sd_rtnl_call_async(link
->manager
->rtnl
, req
,
1694 link_initialized_and_synced
, link
, 0, NULL
);
1703 static Address
* link_get_equal_address(Link
*link
, Address
*needle
) {
1709 LIST_FOREACH(addresses
, i
, link
->addresses
)
1710 if (address_equal(i
, needle
))
1716 int link_rtnl_process_address(sd_rtnl
*rtnl
, sd_rtnl_message
*message
, void *userdata
) {
1717 Manager
*m
= userdata
;
1720 _cleanup_address_free_ Address
*address
= NULL
;
1721 unsigned char flags
;
1723 char buf
[INET6_ADDRSTRLEN
], valid_buf
[FORMAT_TIMESPAN_MAX
];
1724 const char *valid_str
= NULL
;
1731 if (sd_rtnl_message_is_error(message
)) {
1732 r
= sd_rtnl_message_get_errno(message
);
1734 log_warning_errno(r
, "rtnl: failed to receive address: %m");
1739 r
= sd_rtnl_message_get_type(message
, &type
);
1741 log_warning_errno(r
, "rtnl: could not get message type: %m");
1743 } else if (type
!= RTM_NEWADDR
&& type
!= RTM_DELADDR
) {
1744 log_warning("rtnl: received unexpected message type when processing address");
1748 r
= sd_rtnl_message_addr_get_ifindex(message
, &ifindex
);
1750 log_warning_errno(r
, "rtnl: could not get ifindex from address: %m");
1752 } else if (ifindex
<= 0) {
1753 log_warning("rtnl: received address message with invalid ifindex: %d", ifindex
);
1756 r
= link_get(m
, ifindex
, &link
);
1757 if (r
< 0 || !link
) {
1758 /* when enumerating we might be out of sync, but we will
1759 * get the address again, so just ignore it */
1760 if (!m
->enumerating
)
1761 log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex
);
1766 r
= address_new_dynamic(&address
);
1770 r
= sd_rtnl_message_addr_get_family(message
, &address
->family
);
1771 if (r
< 0 || !IN_SET(address
->family
, AF_INET
, AF_INET6
)) {
1772 log_link_warning(link
, "rtnl: received address with invalid family, ignoring.");
1776 r
= sd_rtnl_message_addr_get_prefixlen(message
, &address
->prefixlen
);
1778 log_link_warning_errno(link
, r
, "rtnl: received address with invalid prefixlen, ignoring: %m");
1782 r
= sd_rtnl_message_addr_get_scope(message
, &address
->scope
);
1784 log_link_warning_errno(link
, r
, "rtnl: received address with invalid scope, ignoring: %m");
1788 r
= sd_rtnl_message_addr_get_flags(message
, &flags
);
1790 log_link_warning_errno(link
, r
, "rtnl: received address with invalid flags, ignoring: %m");
1793 address
->flags
= flags
;
1795 switch (address
->family
) {
1797 r
= sd_rtnl_message_read_in_addr(message
, IFA_LOCAL
, &address
->in_addr
.in
);
1799 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
1806 r
= sd_rtnl_message_read_in6_addr(message
, IFA_ADDRESS
, &address
->in_addr
.in6
);
1808 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
1815 assert_not_reached("invalid address family");
1818 if (!inet_ntop(address
->family
, &address
->in_addr
, buf
, INET6_ADDRSTRLEN
)) {
1819 log_link_warning(link
, "Could not print address");
1823 r
= sd_rtnl_message_read_cache_info(message
, IFA_CACHEINFO
, &address
->cinfo
);
1825 if (address
->cinfo
.ifa_valid
== CACHE_INFO_INFINITY_LIFE_TIME
)
1828 valid_str
= format_timespan(valid_buf
, FORMAT_TIMESPAN_MAX
,
1829 address
->cinfo
.ifa_valid
* USEC_PER_SEC
,
1833 existing
= link_get_equal_address(link
, address
);
1838 log_link_debug(link
, "Updating address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
1841 existing
->scope
= address
->scope
;
1842 existing
->flags
= address
->flags
;
1843 existing
->cinfo
= address
->cinfo
;
1846 log_link_debug(link
, "Adding address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
1848 LIST_PREPEND(addresses
, link
->addresses
, address
);
1849 address_establish(address
, link
);
1861 log_link_debug(link
, "Removing address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
1862 address_release(existing
, link
);
1863 LIST_REMOVE(addresses
, link
->addresses
, existing
);
1864 address_free(existing
);
1866 log_link_warning(link
, "Removing non-existent address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
1870 assert_not_reached("Received invalid RTNL message type");
1876 int link_add(Manager
*m
, sd_rtnl_message
*message
, Link
**ret
) {
1878 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
1879 char ifindex_str
[2 + DECIMAL_STR_MAX(int)];
1887 r
= link_new(m
, message
, ret
);
1893 log_link_debug(link
, "Link %d added", link
->ifindex
);
1895 if (detect_container(NULL
) <= 0) {
1896 /* not in a container, udev will be around */
1897 sprintf(ifindex_str
, "n%d", link
->ifindex
);
1898 device
= udev_device_new_from_device_id(m
->udev
, ifindex_str
);
1900 return log_link_warning_errno(link
, errno
, "Could not find udev device: %m");
1902 if (udev_device_get_is_initialized(device
) <= 0) {
1904 log_link_debug(link
, "link pending udev initialization...");
1908 r
= link_initialized(link
, device
);
1912 /* we are calling a callback directly, so must take a ref */
1915 r
= link_initialized_and_synced(m
->rtnl
, NULL
, link
);
1923 static int link_carrier_gained(Link
*link
) {
1928 if (link
->network
) {
1929 r
= link_acquire_conf(link
);
1931 link_enter_failed(link
);
1936 r
= link_handle_bound_by_list(link
);
1943 static int link_carrier_lost(Link
*link
) {
1948 r
= link_stop_clients(link
);
1950 link_enter_failed(link
);
1954 r
= link_handle_bound_by_list(link
);
1961 int link_carrier_reset(Link
*link
) {
1966 if (link_has_carrier(link
)) {
1967 r
= link_carrier_lost(link
);
1971 r
= link_carrier_gained(link
);
1975 log_link_info(link
, "Reset carrier");
1982 int link_update(Link
*link
, sd_rtnl_message
*m
) {
1983 struct ether_addr mac
;
1986 bool had_carrier
, carrier_gained
, carrier_lost
;
1990 assert(link
->ifname
);
1993 if (link
->state
== LINK_STATE_LINGER
) {
1995 log_link_info(link
, "Link readded");
1996 link_set_state(link
, LINK_STATE_ENSLAVING
);
1998 r
= link_new_carrier_maps(link
);
2003 r
= sd_rtnl_message_read_string(m
, IFLA_IFNAME
, &ifname
);
2004 if (r
>= 0 && !streq(ifname
, link
->ifname
)) {
2005 log_link_info(link
, "Renamed to %s", ifname
);
2007 link_free_carrier_maps(link
);
2010 link
->ifname
= strdup(ifname
);
2014 r
= link_new_carrier_maps(link
);
2019 r
= sd_rtnl_message_read_u32(m
, IFLA_MTU
, &mtu
);
2020 if (r
>= 0 && mtu
> 0) {
2022 if (!link
->original_mtu
) {
2023 link
->original_mtu
= mtu
;
2024 log_link_debug(link
, "Saved original MTU: %" PRIu32
, link
->original_mtu
);
2027 if (link
->dhcp_client
) {
2028 r
= sd_dhcp_client_set_mtu(link
->dhcp_client
,
2031 log_link_warning_errno(link
, r
, "Could not update MTU in DHCP client: %m");
2037 /* The kernel may broadcast NEWLINK messages without the MAC address
2038 set, simply ignore them. */
2039 r
= sd_rtnl_message_read_ether_addr(m
, IFLA_ADDRESS
, &mac
);
2041 if (memcmp(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2044 memcpy(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2047 log_link_debug(link
, "MAC address: "
2048 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2049 mac
.ether_addr_octet
[0],
2050 mac
.ether_addr_octet
[1],
2051 mac
.ether_addr_octet
[2],
2052 mac
.ether_addr_octet
[3],
2053 mac
.ether_addr_octet
[4],
2054 mac
.ether_addr_octet
[5]);
2057 r
= sd_ipv4ll_set_mac(link
->ipv4ll
, &link
->mac
);
2059 return log_link_warning_errno(link
, r
, "Could not update MAC address in IPv4LL client: %m");
2062 if (link
->dhcp_client
) {
2063 r
= sd_dhcp_client_set_mac(link
->dhcp_client
,
2064 (const uint8_t *) &link
->mac
,
2068 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCP client: %m");
2071 if (link
->dhcp6_client
) {
2072 r
= sd_dhcp6_client_set_mac(link
->dhcp6_client
,
2073 (const uint8_t *) &link
->mac
,
2077 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCPv6 client: %m");
2082 had_carrier
= link_has_carrier(link
);
2084 r
= link_update_flags(link
, m
);
2088 carrier_gained
= !had_carrier
&& link_has_carrier(link
);
2089 carrier_lost
= had_carrier
&& !link_has_carrier(link
);
2091 if (carrier_gained
) {
2092 log_link_info(link
, "Gained carrier");
2094 r
= link_carrier_gained(link
);
2097 } else if (carrier_lost
) {
2098 log_link_info(link
, "Lost carrier");
2100 r
= link_carrier_lost(link
);
2109 static void link_update_operstate(Link
*link
) {
2110 LinkOperationalState operstate
;
2113 if (link
->kernel_operstate
== IF_OPER_DORMANT
)
2114 operstate
= LINK_OPERSTATE_DORMANT
;
2115 else if (link_has_carrier(link
)) {
2117 uint8_t scope
= RT_SCOPE_NOWHERE
;
2119 /* if we have carrier, check what addresses we have */
2120 LIST_FOREACH(addresses
, address
, link
->addresses
) {
2121 if (address
->flags
& (IFA_F_TENTATIVE
| IFA_F_DEPRECATED
))
2124 if (address
->scope
< scope
)
2125 scope
= address
->scope
;
2128 if (scope
< RT_SCOPE_SITE
)
2129 /* universally accessible addresses found */
2130 operstate
= LINK_OPERSTATE_ROUTABLE
;
2131 else if (scope
< RT_SCOPE_HOST
)
2132 /* only link or site local addresses found */
2133 operstate
= LINK_OPERSTATE_DEGRADED
;
2135 /* no useful addresses found */
2136 operstate
= LINK_OPERSTATE_CARRIER
;
2137 } else if (link
->flags
& IFF_UP
)
2138 operstate
= LINK_OPERSTATE_NO_CARRIER
;
2140 operstate
= LINK_OPERSTATE_OFF
;
2142 if (link
->operstate
!= operstate
) {
2143 link
->operstate
= operstate
;
2144 link_send_changed(link
, "OperationalState", NULL
);
2148 int link_save(Link
*link
) {
2149 _cleanup_free_
char *temp_path
= NULL
;
2150 _cleanup_fclose_
FILE *f
= NULL
;
2151 const char *admin_state
, *oper_state
;
2155 assert(link
->state_file
);
2156 assert(link
->lease_file
);
2157 assert(link
->manager
);
2159 link_update_operstate(link
);
2161 r
= manager_save(link
->manager
);
2165 if (link
->state
== LINK_STATE_LINGER
) {
2166 unlink(link
->state_file
);
2170 admin_state
= link_state_to_string(link
->state
);
2171 assert(admin_state
);
2173 oper_state
= link_operstate_to_string(link
->operstate
);
2176 r
= fopen_temporary(link
->state_file
, &f
, &temp_path
);
2180 fchmod(fileno(f
), 0644);
2183 "# This is private data. Do not parse.\n"
2186 admin_state
, oper_state
);
2188 if (link
->network
) {
2189 char **address
, **domain
;
2192 fprintf(f
, "NETWORK_FILE=%s\n", link
->network
->filename
);
2196 STRV_FOREACH(address
, link
->network
->dns
) {
2203 if (link
->network
->dhcp_dns
&&
2205 const struct in_addr
*addresses
;
2207 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
2211 serialize_in_addrs(f
, addresses
, r
);
2219 STRV_FOREACH(address
, link
->network
->ntp
) {
2226 if (link
->network
->dhcp_ntp
&&
2228 const struct in_addr
*addresses
;
2230 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
2234 serialize_in_addrs(f
, addresses
, r
);
2240 fprintf(f
, "DOMAINS=");
2242 STRV_FOREACH(domain
, link
->network
->domains
) {
2249 if (link
->network
->dhcp_domains
&&
2251 const char *domainname
;
2253 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
2257 fputs(domainname
, f
);
2263 fprintf(f
, "WILDCARD_DOMAIN=%s\n",
2264 yes_no(link
->network
->wildcard_domain
));
2266 fprintf(f
, "LLMNR=%s\n",
2267 llmnr_support_to_string(link
->network
->llmnr
));
2270 if (!hashmap_isempty(link
->bound_to_links
)) {
2275 fputs("CARRIER_BOUND_TO=", f
);
2276 HASHMAP_FOREACH(carrier
, link
->bound_to_links
, i
) {
2279 fputs(carrier
->ifname
, f
);
2286 if (!hashmap_isempty(link
->bound_by_links
)) {
2291 fputs("CARRIER_BOUND_BY=", f
);
2292 HASHMAP_FOREACH(carrier
, link
->bound_by_links
, i
) {
2295 fputs(carrier
->ifname
, f
);
2302 if (link
->dhcp_lease
) {
2303 assert(link
->network
);
2305 r
= sd_dhcp_lease_save(link
->dhcp_lease
, link
->lease_file
);
2313 unlink(link
->lease_file
);
2316 assert(link
->network
);
2318 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
2326 unlink(link
->lldp_file
);
2328 r
= fflush_and_check(f
);
2332 if (rename(temp_path
, link
->state_file
) < 0) {
2339 log_link_error_errno(link
, r
, "Failed to save link data to %s: %m", link
->state_file
);
2340 (void) unlink(link
->state_file
);
2343 (void) unlink(temp_path
);
2348 static const char* const link_state_table
[_LINK_STATE_MAX
] = {
2349 [LINK_STATE_PENDING
] = "pending",
2350 [LINK_STATE_ENSLAVING
] = "configuring",
2351 [LINK_STATE_SETTING_ADDRESSES
] = "configuring",
2352 [LINK_STATE_SETTING_ROUTES
] = "configuring",
2353 [LINK_STATE_CONFIGURED
] = "configured",
2354 [LINK_STATE_UNMANAGED
] = "unmanaged",
2355 [LINK_STATE_FAILED
] = "failed",
2356 [LINK_STATE_LINGER
] = "linger",
2359 DEFINE_STRING_TABLE_LOOKUP(link_state
, LinkState
);
2361 static const char* const link_operstate_table
[_LINK_OPERSTATE_MAX
] = {
2362 [LINK_OPERSTATE_OFF
] = "off",
2363 [LINK_OPERSTATE_NO_CARRIER
] = "no-carrier",
2364 [LINK_OPERSTATE_DORMANT
] = "dormant",
2365 [LINK_OPERSTATE_CARRIER
] = "carrier",
2366 [LINK_OPERSTATE_DEGRADED
] = "degraded",
2367 [LINK_OPERSTATE_ROUTABLE
] = "routable",
2370 DEFINE_STRING_TABLE_LOOKUP(link_operstate
, LinkOperationalState
);