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 "dhcp-lease-internal.h"
33 #include "network-internal.h"
34 #include "networkd-link.h"
35 #include "networkd-netdev.h"
37 bool link_dhcp6_enabled(Link
*link
) {
38 if (link
->flags
& IFF_LOOPBACK
)
44 return link
->network
->dhcp
& ADDRESS_FAMILY_IPV6
;
47 bool link_dhcp4_enabled(Link
*link
) {
48 if (link
->flags
& IFF_LOOPBACK
)
54 return link
->network
->dhcp
& ADDRESS_FAMILY_IPV4
;
57 bool link_dhcp4_server_enabled(Link
*link
) {
58 if (link
->flags
& IFF_LOOPBACK
)
64 return link
->network
->dhcp_server
;
67 bool link_ipv4ll_enabled(Link
*link
) {
68 if (link
->flags
& IFF_LOOPBACK
)
74 return link
->network
->link_local
& ADDRESS_FAMILY_IPV4
;
77 bool link_ipv6ll_enabled(Link
*link
) {
78 if (link
->flags
& IFF_LOOPBACK
)
84 return link
->network
->link_local
& ADDRESS_FAMILY_IPV6
;
87 bool link_lldp_enabled(Link
*link
) {
88 if (link
->flags
& IFF_LOOPBACK
)
94 if (link
->network
->bridge
)
97 return link
->network
->lldp
;
100 static bool link_ipv4_forward_enabled(Link
*link
) {
101 if (link
->flags
& IFF_LOOPBACK
)
107 return link
->network
->ip_forward
& ADDRESS_FAMILY_IPV4
;
110 static bool link_ipv6_forward_enabled(Link
*link
) {
111 if (link
->flags
& IFF_LOOPBACK
)
117 return link
->network
->ip_forward
& ADDRESS_FAMILY_IPV6
;
120 static IPv6PrivacyExtensions
link_ipv6_privacy_extensions(Link
*link
) {
121 if (link
->flags
& IFF_LOOPBACK
)
122 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
125 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
127 return link
->network
->ipv6_privacy_extensions
;
130 #define FLAG_STRING(string, flag, old, new) \
131 (((old ^ new) & flag) \
132 ? ((old & flag) ? (" -" string) : (" +" string)) \
135 static int link_update_flags(Link
*link
, sd_netlink_message
*m
) {
136 unsigned flags
, unknown_flags_added
, unknown_flags_removed
, unknown_flags
;
142 r
= sd_rtnl_message_link_get_flags(m
, &flags
);
144 return log_link_warning_errno(link
, r
, "Could not get link flags: %m");
146 r
= sd_netlink_message_read_u8(m
, IFLA_OPERSTATE
, &operstate
);
148 /* if we got a message without operstate, take it to mean
149 the state was unchanged */
150 operstate
= link
->kernel_operstate
;
152 if ((link
->flags
== flags
) && (link
->kernel_operstate
== operstate
))
155 if (link
->flags
!= flags
) {
156 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",
157 FLAG_STRING("LOOPBACK", IFF_LOOPBACK
, link
->flags
, flags
),
158 FLAG_STRING("MASTER", IFF_MASTER
, link
->flags
, flags
),
159 FLAG_STRING("SLAVE", IFF_SLAVE
, link
->flags
, flags
),
160 FLAG_STRING("UP", IFF_UP
, link
->flags
, flags
),
161 FLAG_STRING("DORMANT", IFF_DORMANT
, link
->flags
, flags
),
162 FLAG_STRING("LOWER_UP", IFF_LOWER_UP
, link
->flags
, flags
),
163 FLAG_STRING("RUNNING", IFF_RUNNING
, link
->flags
, flags
),
164 FLAG_STRING("MULTICAST", IFF_MULTICAST
, link
->flags
, flags
),
165 FLAG_STRING("BROADCAST", IFF_BROADCAST
, link
->flags
, flags
),
166 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT
, link
->flags
, flags
),
167 FLAG_STRING("PROMISC", IFF_PROMISC
, link
->flags
, flags
),
168 FLAG_STRING("ALLMULTI", IFF_ALLMULTI
, link
->flags
, flags
),
169 FLAG_STRING("PORTSEL", IFF_PORTSEL
, link
->flags
, flags
),
170 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA
, link
->flags
, flags
),
171 FLAG_STRING("DYNAMIC", IFF_DYNAMIC
, link
->flags
, flags
),
172 FLAG_STRING("NOARP", IFF_NOARP
, link
->flags
, flags
),
173 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS
, link
->flags
, flags
),
174 FLAG_STRING("DEBUG", IFF_DEBUG
, link
->flags
, flags
),
175 FLAG_STRING("ECHO", IFF_ECHO
, link
->flags
, flags
));
177 unknown_flags
= ~(IFF_LOOPBACK
| IFF_MASTER
| IFF_SLAVE
| IFF_UP
|
178 IFF_DORMANT
| IFF_LOWER_UP
| IFF_RUNNING
|
179 IFF_MULTICAST
| IFF_BROADCAST
| IFF_POINTOPOINT
|
180 IFF_PROMISC
| IFF_ALLMULTI
| IFF_PORTSEL
|
181 IFF_AUTOMEDIA
| IFF_DYNAMIC
| IFF_NOARP
|
182 IFF_NOTRAILERS
| IFF_DEBUG
| IFF_ECHO
);
183 unknown_flags_added
= ((link
->flags
^ flags
) & flags
& unknown_flags
);
184 unknown_flags_removed
= ((link
->flags
^ flags
) & link
->flags
& unknown_flags
);
186 /* link flags are currently at most 18 bits, let's align to
188 if (unknown_flags_added
)
190 "Unknown link flags gained: %#.5x (ignoring)",
191 unknown_flags_added
);
193 if (unknown_flags_removed
)
195 "Unknown link flags lost: %#.5x (ignoring)",
196 unknown_flags_removed
);
200 link
->kernel_operstate
= operstate
;
207 static int link_new(Manager
*manager
, sd_netlink_message
*message
, Link
**ret
) {
208 _cleanup_link_unref_ Link
*link
= NULL
;
217 r
= sd_netlink_message_get_type(message
, &type
);
220 else if (type
!= RTM_NEWLINK
)
223 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
226 else if (ifindex
<= 0)
229 r
= sd_netlink_message_read_string(message
, IFLA_IFNAME
, &ifname
);
233 link
= new0(Link
, 1);
238 link
->manager
= manager
;
239 link
->state
= LINK_STATE_PENDING
;
240 link
->rtnl_extended_attrs
= true;
241 link
->ifindex
= ifindex
;
242 link
->ifname
= strdup(ifname
);
246 r
= sd_netlink_message_read_ether_addr(message
, IFLA_ADDRESS
, &link
->mac
);
248 log_link_debug(link
, "MAC address not found for new device, continuing without");
250 r
= asprintf(&link
->state_file
, "/run/systemd/netif/links/%d",
255 r
= asprintf(&link
->lease_file
, "/run/systemd/netif/leases/%d",
260 r
= asprintf(&link
->lldp_file
, "/run/systemd/netif/lldp/%d",
266 r
= hashmap_ensure_allocated(&manager
->links
, NULL
);
270 r
= hashmap_put(manager
->links
, INT_TO_PTR(link
->ifindex
), link
);
274 r
= link_update_flags(link
, message
);
284 static void link_free(Link
*link
) {
292 while ((address
= link
->addresses
)) {
293 LIST_REMOVE(addresses
, link
->addresses
, address
);
294 address_free(address
);
297 while ((address
= link
->pool_addresses
)) {
298 LIST_REMOVE(addresses
, link
->pool_addresses
, address
);
299 address_free(address
);
302 sd_dhcp_server_unref(link
->dhcp_server
);
303 sd_dhcp_client_unref(link
->dhcp_client
);
304 sd_dhcp_lease_unref(link
->dhcp_lease
);
306 free(link
->lease_file
);
308 sd_lldp_free(link
->lldp
);
310 free(link
->lldp_file
);
312 sd_ipv4ll_unref(link
->ipv4ll
);
313 sd_dhcp6_client_unref(link
->dhcp6_client
);
314 sd_icmp6_nd_unref(link
->icmp6_router_discovery
);
317 hashmap_remove(link
->manager
->links
, INT_TO_PTR(link
->ifindex
));
321 free(link
->state_file
);
323 udev_device_unref(link
->udev_device
);
325 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
)
326 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(carrier
->ifindex
));
327 hashmap_free(link
->bound_to_links
);
329 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
)
330 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(carrier
->ifindex
));
331 hashmap_free(link
->bound_by_links
);
336 Link
*link_unref(Link
*link
) {
337 if (link
&& (-- link
->n_ref
<= 0))
343 Link
*link_ref(Link
*link
) {
345 assert_se(++ link
->n_ref
>= 2);
350 int link_get(Manager
*m
, int ifindex
, Link
**ret
) {
357 link
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
366 static void link_set_state(Link
*link
, LinkState state
) {
369 if (link
->state
== state
)
374 link_send_changed(link
, "AdministrativeState", NULL
);
379 static void link_enter_unmanaged(Link
*link
) {
382 log_link_debug(link
, "Unmanaged");
384 link_set_state(link
, LINK_STATE_UNMANAGED
);
389 static int link_stop_clients(Link
*link
) {
393 assert(link
->manager
);
394 assert(link
->manager
->event
);
399 if (link
->dhcp_client
) {
400 k
= sd_dhcp_client_stop(link
->dhcp_client
);
402 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv4 client: %m");
406 k
= sd_ipv4ll_stop(link
->ipv4ll
);
408 r
= log_link_warning_errno(link
, r
, "Could not stop IPv4 link-local: %m");
411 if(link
->icmp6_router_discovery
) {
412 if (link
->dhcp6_client
) {
413 k
= sd_dhcp6_client_stop(link
->dhcp6_client
);
415 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv6 client: %m");
418 k
= sd_icmp6_nd_stop(link
->icmp6_router_discovery
);
420 r
= log_link_warning_errno(link
, r
, "Could not stop ICMPv6 router discovery: %m");
424 k
= sd_lldp_stop(link
->lldp
);
426 r
= log_link_warning_errno(link
, r
, "Could not stop LLDP: %m");
432 void link_enter_failed(Link
*link
) {
435 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
438 log_link_warning(link
, "Failed");
440 link_set_state(link
, LINK_STATE_FAILED
);
442 link_stop_clients(link
);
447 static Address
* link_find_dhcp_server_address(Link
*link
) {
451 assert(link
->network
);
453 /* The first statically configured address if there is any */
454 LIST_FOREACH(addresses
, address
, link
->network
->static_addresses
) {
456 if (address
->family
!= AF_INET
)
459 if (in_addr_is_null(address
->family
, &address
->in_addr
))
465 /* If that didn't work, find a suitable address we got from the pool */
466 LIST_FOREACH(addresses
, address
, link
->pool_addresses
) {
467 if (address
->family
!= AF_INET
)
476 static int link_enter_configured(Link
*link
) {
478 assert(link
->network
);
479 assert(link
->state
== LINK_STATE_SETTING_ROUTES
);
481 log_link_info(link
, "Configured");
483 link_set_state(link
, LINK_STATE_CONFIGURED
);
490 void link_client_handler(Link
*link
) {
492 assert(link
->network
);
494 if (!link
->static_configured
)
497 if (link_ipv4ll_enabled(link
))
498 if (!link
->ipv4ll_address
||
502 if (link_dhcp4_enabled(link
) && !link
->dhcp4_configured
)
505 if (link
->state
!= LINK_STATE_CONFIGURED
)
506 link_enter_configured(link
);
511 static int route_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
512 _cleanup_link_unref_ Link
*link
= userdata
;
515 assert(link
->link_messages
> 0);
516 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
517 LINK_STATE_SETTING_ROUTES
, LINK_STATE_FAILED
,
520 link
->link_messages
--;
522 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
525 r
= sd_netlink_message_get_errno(m
);
526 if (r
< 0 && r
!= -EEXIST
)
527 log_link_warning_errno(link
, r
, "%-*s: could not set route: %m", IFNAMSIZ
, link
->ifname
);
529 if (link
->link_messages
== 0) {
530 log_link_debug(link
, "Routes set");
531 link
->static_configured
= true;
532 link_client_handler(link
);
538 static int link_enter_set_routes(Link
*link
) {
543 assert(link
->network
);
544 assert(link
->state
== LINK_STATE_SETTING_ADDRESSES
);
546 link_set_state(link
, LINK_STATE_SETTING_ROUTES
);
548 LIST_FOREACH(routes
, rt
, link
->network
->static_routes
) {
549 r
= route_configure(rt
, link
, &route_handler
);
551 log_link_warning_errno(link
, r
, "Could not set routes: %m");
552 link_enter_failed(link
);
556 link
->link_messages
++;
559 if (link
->link_messages
== 0) {
560 link
->static_configured
= true;
561 link_client_handler(link
);
563 log_link_debug(link
, "Setting routes");
568 int link_route_drop_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
569 _cleanup_link_unref_ Link
*link
= userdata
;
574 assert(link
->ifname
);
576 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
579 r
= sd_netlink_message_get_errno(m
);
580 if (r
< 0 && r
!= -ESRCH
)
581 log_link_warning_errno(link
, r
, "%-*s: could not drop route: %m", IFNAMSIZ
, link
->ifname
);
586 static int address_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
587 _cleanup_link_unref_ Link
*link
= userdata
;
593 assert(link
->ifname
);
594 assert(link
->link_messages
> 0);
595 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
596 LINK_STATE_FAILED
, LINK_STATE_LINGER
));
598 link
->link_messages
--;
600 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
603 r
= sd_netlink_message_get_errno(m
);
604 if (r
< 0 && r
!= -EEXIST
)
605 log_link_warning_errno(link
, r
, "%-*s: could not set address: %m", IFNAMSIZ
, link
->ifname
);
607 link_rtnl_process_address(rtnl
, m
, link
->manager
);
609 if (link
->link_messages
== 0) {
610 log_link_debug(link
, "Addresses set");
611 link_enter_set_routes(link
);
617 static int link_enter_set_addresses(Link
*link
) {
622 assert(link
->network
);
623 assert(link
->state
!= _LINK_STATE_INVALID
);
625 link_set_state(link
, LINK_STATE_SETTING_ADDRESSES
);
627 LIST_FOREACH(addresses
, ad
, link
->network
->static_addresses
) {
628 r
= address_configure(ad
, link
, &address_handler
);
630 log_link_warning_errno(link
, r
, "Could not set addresses: %m");
631 link_enter_failed(link
);
635 link
->link_messages
++;
638 /* now that we can figure out a default address for the dhcp server,
640 if (link_dhcp4_server_enabled(link
)) {
641 struct in_addr pool_start
;
644 address
= link_find_dhcp_server_address(link
);
646 log_link_warning(link
, "Failed to find suitable address for DHCPv4 server instance.");
647 link_enter_failed(link
);
651 r
= sd_dhcp_server_set_address(link
->dhcp_server
,
652 &address
->in_addr
.in
,
657 /* offer 32 addresses starting from the address following the server address */
658 pool_start
.s_addr
= htobe32(be32toh(address
->in_addr
.in
.s_addr
) + 1);
659 r
= sd_dhcp_server_set_lease_pool(link
->dhcp_server
,
665 r = sd_dhcp_server_set_router(link->dhcp_server,
666 &main_address->in_addr.in);
670 r = sd_dhcp_server_set_prefixlen(link->dhcp_server,
671 main_address->prefixlen);
676 if (link
->network
->dhcp_server_max_lease_time_usec
> 0) {
677 r
= sd_dhcp_server_set_max_lease_time(
679 DIV_ROUND_UP(link
->network
->dhcp_server_max_lease_time_usec
, USEC_PER_SEC
));
684 if (link
->network
->dhcp_server_default_lease_time_usec
> 0) {
685 r
= sd_dhcp_server_set_default_lease_time(
687 DIV_ROUND_UP(link
->network
->dhcp_server_default_lease_time_usec
, USEC_PER_SEC
));
692 if (link
->network
->dhcp_server_emit_timezone
) {
693 _cleanup_free_
char *buffer
= NULL
;
696 if (link
->network
->dhcp_server_timezone
)
697 tz
= link
->network
->dhcp_server_timezone
;
699 r
= get_timezone(&buffer
);
701 log_warning_errno(r
, "Failed to determine timezone: %m");
707 r
= sd_dhcp_server_set_timezone(link
->dhcp_server
, tz
);
713 r
= sd_dhcp_server_start(link
->dhcp_server
);
715 log_link_warning_errno(link
, r
, "Could not start DHCPv4 server instance: %m");
717 link_enter_failed(link
);
722 log_link_debug(link
, "Offering DHCPv4 leases");
725 if (link
->link_messages
== 0)
726 link_enter_set_routes(link
);
728 log_link_debug(link
, "Setting addresses");
733 int link_address_drop_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
734 _cleanup_link_unref_ Link
*link
= userdata
;
739 assert(link
->ifname
);
741 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
744 r
= sd_netlink_message_get_errno(m
);
745 if (r
< 0 && r
!= -EADDRNOTAVAIL
)
746 log_link_warning_errno(link
, r
, "%-*s: could not drop address: %m", IFNAMSIZ
, link
->ifname
);
751 static int link_set_bridge_fdb(Link
*const link
) {
755 LIST_FOREACH(static_fdb_entries
, fdb_entry
, link
->network
->static_fdb_entries
) {
756 r
= fdb_entry_configure(link
, fdb_entry
);
758 log_link_error_errno(link
, r
, "Failed to add MAC entry to static MAC table: %m");
766 static int link_set_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
767 _cleanup_link_unref_ Link
*link
= userdata
;
770 log_link_debug(link
, "Set link");
772 r
= sd_netlink_message_get_errno(m
);
773 if (r
< 0 && r
!= -EEXIST
) {
774 log_link_error_errno(link
, r
, "Could not join netdev: %m");
775 link_enter_failed(link
);
782 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
783 _cleanup_link_unref_ Link
*link
= userdata
;
789 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
792 r
= sd_bus_message_get_errno(m
);
794 log_link_warning_errno(link
, r
, "Could not set hostname: %m");
799 int link_set_hostname(Link
*link
, const char *hostname
) {
803 assert(link
->manager
);
806 log_link_debug(link
, "Setting transient hostname: '%s'", hostname
);
808 if (!link
->manager
->bus
) {
809 /* TODO: replace by assert when we can rely on kdbus */
810 log_link_info(link
, "Not connected to system bus, ignoring transient hostname.");
814 r
= sd_bus_call_method_async(
817 "org.freedesktop.hostname1",
818 "/org/freedesktop/hostname1",
819 "org.freedesktop.hostname1",
821 set_hostname_handler
,
828 return log_link_error_errno(link
, r
, "Could not set transient hostname: %m");
835 static int set_mtu_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
836 _cleanup_link_unref_ Link
*link
= userdata
;
841 assert(link
->ifname
);
843 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
846 r
= sd_netlink_message_get_errno(m
);
848 log_link_warning_errno(link
, r
, "%-*s: could not set MTU: %m", IFNAMSIZ
, link
->ifname
);
853 int link_set_mtu(Link
*link
, uint32_t mtu
) {
854 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
858 assert(link
->manager
);
859 assert(link
->manager
->rtnl
);
861 log_link_debug(link
, "Setting MTU: %" PRIu32
, mtu
);
863 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
865 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
867 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, mtu
);
869 return log_link_error_errno(link
, r
, "Could not append MTU: %m");
871 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, set_mtu_handler
, link
, 0, NULL
);
873 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
880 static int link_set_bridge(Link
*link
) {
881 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
885 assert(link
->network
);
887 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
889 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
891 r
= sd_rtnl_message_link_set_family(req
, PF_BRIDGE
);
893 return log_link_error_errno(link
, r
, "Could not set message family: %m");
895 r
= sd_netlink_message_open_container(req
, IFLA_PROTINFO
);
897 return log_link_error_errno(link
, r
, "Could not append IFLA_PROTINFO attribute: %m");
899 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_GUARD
, !link
->network
->use_bpdu
);
901 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_GUARD attribute: %m");
903 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_MODE
, link
->network
->hairpin
);
905 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_MODE attribute: %m");
907 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_FAST_LEAVE
, link
->network
->fast_leave
);
909 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_FAST_LEAVE attribute: %m");
911 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_PROTECT
, !link
->network
->allow_port_to_be_root
);
913 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_PROTECT attribute: %m");
915 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_UNICAST_FLOOD
, link
->network
->unicast_flood
);
917 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_UNICAST_FLOOD attribute: %m");
919 if(link
->network
->cost
!= 0) {
920 r
= sd_netlink_message_append_u32(req
, IFLA_BRPORT_COST
, link
->network
->cost
);
922 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_COST attribute: %m");
925 r
= sd_netlink_message_close_container(req
);
927 return log_link_error_errno(link
, r
, "Could not append IFLA_LINKINFO attribute: %m");
929 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_set_handler
, link
, 0, NULL
);
931 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
938 static void lldp_handler(sd_lldp
*lldp
, int event
, void *userdata
) {
939 Link
*link
= userdata
;
943 assert(link
->network
);
944 assert(link
->manager
);
946 if (event
!= UPDATE_INFO
)
949 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
951 log_link_warning_errno(link
, r
, "Could not save LLDP: %m");
955 static int link_acquire_conf(Link
*link
) {
959 assert(link
->network
);
960 assert(link
->manager
);
961 assert(link
->manager
->event
);
963 if (link_ipv4ll_enabled(link
)) {
964 assert(link
->ipv4ll
);
966 log_link_debug(link
, "Acquiring IPv4 link-local address");
968 r
= sd_ipv4ll_start(link
->ipv4ll
);
970 return log_link_warning_errno(link
, r
, "Could not acquire IPv4 link-local address: %m");
973 if (link_dhcp4_enabled(link
)) {
974 assert(link
->dhcp_client
);
976 log_link_debug(link
, "Acquiring DHCPv4 lease");
978 r
= sd_dhcp_client_start(link
->dhcp_client
);
980 return log_link_warning_errno(link
, r
, "Could not acquire DHCPv4 lease: %m");
983 if (link_dhcp6_enabled(link
)) {
984 assert(link
->icmp6_router_discovery
);
986 log_link_debug(link
, "Discovering IPv6 routers");
988 r
= sd_icmp6_router_solicitation_start(link
->icmp6_router_discovery
);
990 return log_link_warning_errno(link
, r
, "Could not start IPv6 router discovery: %m");
993 if (link_lldp_enabled(link
)) {
996 log_link_debug(link
, "Starting LLDP");
998 r
= sd_lldp_start(link
->lldp
);
1000 return log_link_warning_errno(link
, r
, "Could not start LLDP: %m");
1006 bool link_has_carrier(Link
*link
) {
1007 /* see Documentation/networking/operstates.txt in the kernel sources */
1009 if (link
->kernel_operstate
== IF_OPER_UP
)
1012 if (link
->kernel_operstate
== IF_OPER_UNKNOWN
)
1013 /* operstate may not be implemented, so fall back to flags */
1014 if ((link
->flags
& IFF_LOWER_UP
) && !(link
->flags
& IFF_DORMANT
))
1020 static int link_up_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1021 _cleanup_link_unref_ Link
*link
= userdata
;
1026 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1029 r
= sd_netlink_message_get_errno(m
);
1031 /* we warn but don't fail the link, as it may be
1033 log_link_warning_errno(link
, r
, "%-*s: could not bring up interface: %m", IFNAMSIZ
, link
->ifname
);
1038 static int link_up(Link
*link
) {
1039 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1040 uint8_t ipv6ll_mode
;
1044 assert(link
->network
);
1045 assert(link
->manager
);
1046 assert(link
->manager
->rtnl
);
1048 log_link_debug(link
, "Bringing link up");
1050 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1052 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1054 r
= sd_rtnl_message_link_set_flags(req
, IFF_UP
, IFF_UP
);
1056 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1058 if (link
->network
->mac
) {
1059 r
= sd_netlink_message_append_ether_addr(req
, IFLA_ADDRESS
, link
->network
->mac
);
1061 return log_link_error_errno(link
, r
, "Could not set MAC address: %m");
1064 if (link
->network
->mtu
) {
1065 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, link
->network
->mtu
);
1067 return log_link_error_errno(link
, r
, "Could not set MTU: %m");
1070 r
= sd_netlink_message_open_container(req
, IFLA_AF_SPEC
);
1072 return log_link_error_errno(link
, r
, "Could not open IFLA_AF_SPEC container: %m");
1074 if (socket_ipv6_is_supported()) {
1075 /* if the kernel lacks ipv6 support setting IFF_UP fails if any ipv6 options are passed */
1076 r
= sd_netlink_message_open_container(req
, AF_INET6
);
1078 return log_link_error_errno(link
, r
, "Could not open AF_INET6 container: %m");
1080 ipv6ll_mode
= link_ipv6ll_enabled(link
) ? IN6_ADDR_GEN_MODE_EUI64
: IN6_ADDR_GEN_MODE_NONE
;
1081 r
= sd_netlink_message_append_u8(req
, IFLA_INET6_ADDR_GEN_MODE
, ipv6ll_mode
);
1083 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_ADDR_GEN_MODE: %m");
1085 if (!in_addr_is_null(AF_INET6
, &link
->network
->ipv6_token
)) {
1086 r
= sd_netlink_message_append_in6_addr(req
, IFLA_INET6_TOKEN
, &link
->network
->ipv6_token
.in6
);
1088 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_TOKEN: %m");
1091 r
= sd_netlink_message_close_container(req
);
1093 return log_link_error_errno(link
, r
, "Could not close AF_INET6 container: %m");
1096 r
= sd_netlink_message_close_container(req
);
1098 return log_link_error_errno(link
, r
, "Could not close IFLA_AF_SPEC container: %m");
1100 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_up_handler
, link
, 0, NULL
);
1102 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1109 static int link_down_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1110 _cleanup_link_unref_ Link
*link
= userdata
;
1115 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1118 r
= sd_netlink_message_get_errno(m
);
1120 log_link_warning_errno(link
, r
, "%-*s: could not bring down interface: %m", IFNAMSIZ
, link
->ifname
);
1125 static int link_down(Link
*link
) {
1126 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1130 assert(link
->manager
);
1131 assert(link
->manager
->rtnl
);
1133 log_link_debug(link
, "Bringing link down");
1135 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
,
1136 RTM_SETLINK
, link
->ifindex
);
1138 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1140 r
= sd_rtnl_message_link_set_flags(req
, 0, IFF_UP
);
1142 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1144 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_down_handler
, link
, 0, NULL
);
1146 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1153 static int link_handle_bound_to_list(Link
*link
) {
1157 bool required_up
= false;
1158 bool link_is_up
= false;
1162 if (hashmap_isempty(link
->bound_to_links
))
1165 if (link
->flags
& IFF_UP
)
1168 HASHMAP_FOREACH (l
, link
->bound_to_links
, i
)
1169 if (link_has_carrier(l
)) {
1174 if (!required_up
&& link_is_up
) {
1175 r
= link_down(link
);
1178 } else if (required_up
&& !link_is_up
) {
1187 static int link_handle_bound_by_list(Link
*link
) {
1194 if (hashmap_isempty(link
->bound_by_links
))
1197 HASHMAP_FOREACH (l
, link
->bound_by_links
, i
) {
1198 r
= link_handle_bound_to_list(l
);
1206 static int link_put_carrier(Link
*link
, Link
*carrier
, Hashmap
**h
) {
1212 if (link
== carrier
)
1215 if (hashmap_get(*h
, INT_TO_PTR(carrier
->ifindex
)))
1218 r
= hashmap_ensure_allocated(h
, NULL
);
1222 r
= hashmap_put(*h
, INT_TO_PTR(carrier
->ifindex
), carrier
);
1229 static int link_new_bound_by_list(Link
*link
) {
1234 bool list_updated
= false;
1237 assert(link
->manager
);
1241 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1242 if (!carrier
->network
)
1245 if (strv_isempty(carrier
->network
->bind_carrier
))
1248 if (strv_fnmatch(carrier
->network
->bind_carrier
, link
->ifname
, 0)) {
1249 r
= link_put_carrier(link
, carrier
, &link
->bound_by_links
);
1253 list_updated
= true;
1260 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
) {
1261 r
= link_put_carrier(carrier
, link
, &carrier
->bound_to_links
);
1271 static int link_new_bound_to_list(Link
*link
) {
1276 bool list_updated
= false;
1279 assert(link
->manager
);
1284 if (strv_isempty(link
->network
->bind_carrier
))
1289 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1290 if (strv_fnmatch(link
->network
->bind_carrier
, carrier
->ifname
, 0)) {
1291 r
= link_put_carrier(link
, carrier
, &link
->bound_to_links
);
1295 list_updated
= true;
1302 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
) {
1303 r
= link_put_carrier(carrier
, link
, &carrier
->bound_by_links
);
1313 static int link_new_carrier_maps(Link
*link
) {
1316 r
= link_new_bound_by_list(link
);
1320 r
= link_handle_bound_by_list(link
);
1324 r
= link_new_bound_to_list(link
);
1328 r
= link_handle_bound_to_list(link
);
1335 static void link_free_bound_to_list(Link
*link
) {
1339 HASHMAP_FOREACH (bound_to
, link
->bound_to_links
, i
) {
1340 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(bound_to
->ifindex
));
1342 if (hashmap_remove(bound_to
->bound_by_links
, INT_TO_PTR(link
->ifindex
)))
1343 link_save(bound_to
);
1349 static void link_free_bound_by_list(Link
*link
) {
1353 HASHMAP_FOREACH (bound_by
, link
->bound_by_links
, i
) {
1354 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(bound_by
->ifindex
));
1356 if (hashmap_remove(bound_by
->bound_to_links
, INT_TO_PTR(link
->ifindex
))) {
1357 link_save(bound_by
);
1358 link_handle_bound_to_list(bound_by
);
1365 static void link_free_carrier_maps(Link
*link
) {
1366 bool list_updated
= false;
1370 if (!hashmap_isempty(link
->bound_to_links
)) {
1371 link_free_bound_to_list(link
);
1372 list_updated
= true;
1375 if (!hashmap_isempty(link
->bound_by_links
)) {
1376 link_free_bound_by_list(link
);
1377 list_updated
= true;
1386 void link_drop(Link
*link
) {
1387 if (!link
|| link
->state
== LINK_STATE_LINGER
)
1390 link_set_state(link
, LINK_STATE_LINGER
);
1392 link_free_carrier_maps(link
);
1394 log_link_debug(link
, "Link removed");
1401 static int link_joined(Link
*link
) {
1405 assert(link
->network
);
1407 if (!hashmap_isempty(link
->bound_to_links
)) {
1408 r
= link_handle_bound_to_list(link
);
1411 } else if (!(link
->flags
& IFF_UP
)) {
1414 link_enter_failed(link
);
1419 if(link
->network
->bridge
) {
1420 r
= link_set_bridge(link
);
1422 log_link_error_errno(link
, r
, "Could not set bridge message: %m");
1425 return link_enter_set_addresses(link
);
1428 static int netdev_join_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1429 _cleanup_link_unref_ Link
*link
= userdata
;
1433 assert(link
->network
);
1437 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1440 r
= sd_netlink_message_get_errno(m
);
1441 if (r
< 0 && r
!= -EEXIST
) {
1442 log_link_error_errno(link
, r
, "%-*s: could not join netdev: %m", IFNAMSIZ
, link
->ifname
);
1443 link_enter_failed(link
);
1446 log_link_debug(link
, "Joined netdev");
1448 if (link
->enslaving
<= 0)
1454 static int link_enter_join_netdev(Link
*link
) {
1460 assert(link
->network
);
1461 assert(link
->state
== LINK_STATE_PENDING
);
1463 link_set_state(link
, LINK_STATE_ENSLAVING
);
1467 if (!link
->network
->bridge
&&
1468 !link
->network
->bond
&&
1469 hashmap_isempty(link
->network
->stacked_netdevs
))
1470 return link_joined(link
);
1472 if (link
->network
->bond
) {
1473 log_struct(LOG_DEBUG
,
1474 LOG_LINK_INTERFACE(link
),
1475 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1476 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bond
->ifname
),
1479 r
= netdev_join(link
->network
->bond
, link
, netdev_join_handler
);
1481 log_struct_errno(LOG_WARNING
, r
,
1482 LOG_LINK_INTERFACE(link
),
1483 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1484 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bond
->ifname
),
1487 link_enter_failed(link
);
1494 if (link
->network
->bridge
) {
1495 log_struct(LOG_DEBUG
,
1496 LOG_LINK_INTERFACE(link
),
1497 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1498 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bridge
->ifname
),
1501 r
= netdev_join(link
->network
->bridge
, link
, netdev_join_handler
);
1503 log_struct_errno(LOG_WARNING
, r
,
1504 LOG_LINK_INTERFACE(link
),
1505 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1506 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bridge
->ifname
),
1508 link_enter_failed(link
);
1515 HASHMAP_FOREACH(netdev
, link
->network
->stacked_netdevs
, i
) {
1517 log_struct(LOG_DEBUG
,
1518 LOG_LINK_INTERFACE(link
),
1519 LOG_NETDEV_INTERFACE(netdev
),
1520 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", netdev
->ifname
),
1523 r
= netdev_join(netdev
, link
, netdev_join_handler
);
1525 log_struct_errno(LOG_WARNING
, r
,
1526 LOG_LINK_INTERFACE(link
),
1527 LOG_NETDEV_INTERFACE(netdev
),
1528 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", netdev
->ifname
),
1530 link_enter_failed(link
);
1540 static int link_set_ipv4_forward(Link
*link
) {
1541 const char *p
= NULL
, *v
;
1544 if (link
->flags
& IFF_LOOPBACK
)
1547 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1550 p
= strjoina("/proc/sys/net/ipv4/conf/", link
->ifname
, "/forwarding");
1551 v
= one_zero(link_ipv4_forward_enabled(link
));
1553 r
= write_string_file(p
, v
, 0);
1555 /* If the right value is set anyway, don't complain */
1556 if (verify_one_line_file(p
, v
) > 0)
1559 log_link_warning_errno(link
, r
, "Cannot configure IPv4 forwarding for interface %s: %m", link
->ifname
);
1565 static int link_set_ipv6_forward(Link
*link
) {
1566 const char *p
= NULL
, *v
= NULL
;
1569 /* Make this a NOP if IPv6 is not available */
1570 if (!socket_ipv6_is_supported())
1573 if (link
->flags
& IFF_LOOPBACK
)
1576 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1579 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/forwarding");
1580 v
= one_zero(link_ipv6_forward_enabled(link
));
1582 r
= write_string_file(p
, v
, 0);
1584 /* If the right value is set anyway, don't complain */
1585 if (verify_one_line_file(p
, v
) > 0)
1588 log_link_warning_errno(link
, r
, "Cannot configure IPv6 forwarding for interface: %m");
1594 static int link_set_ipv6_privacy_extensions(Link
*link
) {
1595 char buf
[DECIMAL_STR_MAX(unsigned) + 1];
1596 IPv6PrivacyExtensions s
;
1597 const char *p
= NULL
;
1600 /* Make this a NOP if IPv6 is not available */
1601 if (!socket_ipv6_is_supported())
1604 s
= link_ipv6_privacy_extensions(link
);
1605 if (s
== _IPV6_PRIVACY_EXTENSIONS_INVALID
)
1608 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/use_tempaddr");
1609 xsprintf(buf
, "%u", link
->network
->ipv6_privacy_extensions
);
1611 r
= write_string_file(p
, buf
, 0);
1613 /* If the right value is set anyway, don't complain */
1614 if (verify_one_line_file(p
, buf
) > 0)
1617 log_link_warning_errno(link
, r
, "Cannot configure IPv6 privacy extension for interface: %m");
1623 static int link_configure(Link
*link
) {
1627 assert(link
->network
);
1628 assert(link
->state
== LINK_STATE_PENDING
);
1630 r
= link_set_bridge_fdb(link
);
1634 r
= link_set_ipv4_forward(link
);
1638 r
= link_set_ipv6_forward(link
);
1642 r
= link_set_ipv6_privacy_extensions(link
);
1646 if (link_ipv4ll_enabled(link
)) {
1647 r
= ipv4ll_configure(link
);
1652 if (link_dhcp4_enabled(link
)) {
1653 r
= dhcp4_configure(link
);
1658 if (link_dhcp4_server_enabled(link
)) {
1659 r
= sd_dhcp_server_new(&link
->dhcp_server
, link
->ifindex
);
1663 r
= sd_dhcp_server_attach_event(link
->dhcp_server
, NULL
, 0);
1668 if (link_dhcp6_enabled(link
)) {
1669 r
= icmp6_configure(link
);
1674 if (link_lldp_enabled(link
)) {
1675 r
= sd_lldp_new(link
->ifindex
, link
->ifname
, &link
->mac
, &link
->lldp
);
1679 r
= sd_lldp_attach_event(link
->lldp
, NULL
, 0);
1683 r
= sd_lldp_set_callback(link
->lldp
,
1684 lldp_handler
, link
);
1689 if (link_has_carrier(link
)) {
1690 r
= link_acquire_conf(link
);
1695 return link_enter_join_netdev(link
);
1698 static int link_initialized_and_synced(sd_netlink
*rtnl
, sd_netlink_message
*m
,
1700 _cleanup_link_unref_ Link
*link
= userdata
;
1705 assert(link
->ifname
);
1706 assert(link
->manager
);
1708 if (link
->state
!= LINK_STATE_PENDING
)
1711 log_link_debug(link
, "Link state is up-to-date");
1713 r
= link_new_bound_by_list(link
);
1717 r
= link_handle_bound_by_list(link
);
1721 r
= network_get(link
->manager
, link
->udev_device
, link
->ifname
,
1722 &link
->mac
, &network
);
1724 link_enter_unmanaged(link
);
1729 if (link
->flags
& IFF_LOOPBACK
) {
1730 if (network
->link_local
!= ADDRESS_FAMILY_NO
)
1731 log_link_debug(link
, "Ignoring link-local autoconfiguration for loopback link");
1733 if (network
->dhcp
!= ADDRESS_FAMILY_NO
)
1734 log_link_debug(link
, "Ignoring DHCP clients for loopback link");
1736 if (network
->dhcp_server
)
1737 log_link_debug(link
, "Ignoring DHCP server for loopback link");
1740 r
= network_apply(link
->manager
, network
, link
);
1744 r
= link_new_bound_to_list(link
);
1748 r
= link_configure(link
);
1755 int link_initialized(Link
*link
, struct udev_device
*device
) {
1756 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1760 assert(link
->manager
);
1761 assert(link
->manager
->rtnl
);
1764 if (link
->state
!= LINK_STATE_PENDING
)
1767 if (link
->udev_device
)
1770 log_link_debug(link
, "udev initialized link");
1772 link
->udev_device
= udev_device_ref(device
);
1774 /* udev has initialized the link, but we don't know if we have yet
1775 * processed the NEWLINK messages with the latest state. Do a GETLINK,
1776 * when it returns we know that the pending NEWLINKs have already been
1777 * processed and that we are up-to-date */
1779 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_GETLINK
,
1784 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
,
1785 link_initialized_and_synced
, link
, 0, NULL
);
1794 static Address
* link_get_equal_address(Link
*link
, Address
*needle
) {
1800 LIST_FOREACH(addresses
, i
, link
->addresses
)
1801 if (address_equal(i
, needle
))
1807 int link_rtnl_process_address(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
1808 Manager
*m
= userdata
;
1811 _cleanup_address_free_ Address
*address
= NULL
;
1812 unsigned char flags
;
1814 char buf
[INET6_ADDRSTRLEN
], valid_buf
[FORMAT_TIMESPAN_MAX
];
1815 const char *valid_str
= NULL
;
1822 if (sd_netlink_message_is_error(message
)) {
1823 r
= sd_netlink_message_get_errno(message
);
1825 log_warning_errno(r
, "rtnl: failed to receive address: %m");
1830 r
= sd_netlink_message_get_type(message
, &type
);
1832 log_warning_errno(r
, "rtnl: could not get message type: %m");
1834 } else if (type
!= RTM_NEWADDR
&& type
!= RTM_DELADDR
) {
1835 log_warning("rtnl: received unexpected message type when processing address");
1839 r
= sd_rtnl_message_addr_get_ifindex(message
, &ifindex
);
1841 log_warning_errno(r
, "rtnl: could not get ifindex from address: %m");
1843 } else if (ifindex
<= 0) {
1844 log_warning("rtnl: received address message with invalid ifindex: %d", ifindex
);
1847 r
= link_get(m
, ifindex
, &link
);
1848 if (r
< 0 || !link
) {
1849 /* when enumerating we might be out of sync, but we will
1850 * get the address again, so just ignore it */
1851 if (!m
->enumerating
)
1852 log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex
);
1857 r
= address_new_dynamic(&address
);
1861 r
= sd_rtnl_message_addr_get_family(message
, &address
->family
);
1862 if (r
< 0 || !IN_SET(address
->family
, AF_INET
, AF_INET6
)) {
1863 log_link_warning(link
, "rtnl: received address with invalid family, ignoring.");
1867 r
= sd_rtnl_message_addr_get_prefixlen(message
, &address
->prefixlen
);
1869 log_link_warning_errno(link
, r
, "rtnl: received address with invalid prefixlen, ignoring: %m");
1873 r
= sd_rtnl_message_addr_get_scope(message
, &address
->scope
);
1875 log_link_warning_errno(link
, r
, "rtnl: received address with invalid scope, ignoring: %m");
1879 r
= sd_rtnl_message_addr_get_flags(message
, &flags
);
1881 log_link_warning_errno(link
, r
, "rtnl: received address with invalid flags, ignoring: %m");
1884 address
->flags
= flags
;
1886 switch (address
->family
) {
1888 r
= sd_netlink_message_read_in_addr(message
, IFA_LOCAL
, &address
->in_addr
.in
);
1890 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
1897 r
= sd_netlink_message_read_in6_addr(message
, IFA_ADDRESS
, &address
->in_addr
.in6
);
1899 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
1906 assert_not_reached("invalid address family");
1909 if (!inet_ntop(address
->family
, &address
->in_addr
, buf
, INET6_ADDRSTRLEN
)) {
1910 log_link_warning(link
, "Could not print address");
1914 r
= sd_netlink_message_read_cache_info(message
, IFA_CACHEINFO
, &address
->cinfo
);
1916 if (address
->cinfo
.ifa_valid
== CACHE_INFO_INFINITY_LIFE_TIME
)
1919 valid_str
= format_timespan(valid_buf
, FORMAT_TIMESPAN_MAX
,
1920 address
->cinfo
.ifa_valid
* USEC_PER_SEC
,
1924 existing
= link_get_equal_address(link
, address
);
1929 log_link_debug(link
, "Updating address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
1932 existing
->scope
= address
->scope
;
1933 existing
->flags
= address
->flags
;
1934 existing
->cinfo
= address
->cinfo
;
1937 log_link_debug(link
, "Adding address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
1939 LIST_PREPEND(addresses
, link
->addresses
, address
);
1940 address_establish(address
, link
);
1952 log_link_debug(link
, "Removing address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
1953 address_release(existing
, link
);
1954 LIST_REMOVE(addresses
, link
->addresses
, existing
);
1955 address_free(existing
);
1957 log_link_warning(link
, "Removing non-existent address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
1961 assert_not_reached("Received invalid RTNL message type");
1967 int link_add(Manager
*m
, sd_netlink_message
*message
, Link
**ret
) {
1969 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
1970 char ifindex_str
[2 + DECIMAL_STR_MAX(int)];
1978 r
= link_new(m
, message
, ret
);
1984 log_link_debug(link
, "Link %d added", link
->ifindex
);
1986 if (detect_container(NULL
) <= 0) {
1987 /* not in a container, udev will be around */
1988 sprintf(ifindex_str
, "n%d", link
->ifindex
);
1989 device
= udev_device_new_from_device_id(m
->udev
, ifindex_str
);
1991 return log_link_warning_errno(link
, errno
, "Could not find udev device: %m");
1993 if (udev_device_get_is_initialized(device
) <= 0) {
1995 log_link_debug(link
, "link pending udev initialization...");
1999 r
= link_initialized(link
, device
);
2003 /* we are calling a callback directly, so must take a ref */
2006 r
= link_initialized_and_synced(m
->rtnl
, NULL
, link
);
2014 static int link_carrier_gained(Link
*link
) {
2019 if (link
->network
) {
2020 r
= link_acquire_conf(link
);
2022 link_enter_failed(link
);
2027 r
= link_handle_bound_by_list(link
);
2034 static int link_carrier_lost(Link
*link
) {
2039 r
= link_stop_clients(link
);
2041 link_enter_failed(link
);
2045 r
= link_handle_bound_by_list(link
);
2052 int link_carrier_reset(Link
*link
) {
2057 if (link_has_carrier(link
)) {
2058 r
= link_carrier_lost(link
);
2062 r
= link_carrier_gained(link
);
2066 log_link_info(link
, "Reset carrier");
2073 int link_update(Link
*link
, sd_netlink_message
*m
) {
2074 struct ether_addr mac
;
2077 bool had_carrier
, carrier_gained
, carrier_lost
;
2081 assert(link
->ifname
);
2084 if (link
->state
== LINK_STATE_LINGER
) {
2086 log_link_info(link
, "Link readded");
2087 link_set_state(link
, LINK_STATE_ENSLAVING
);
2089 r
= link_new_carrier_maps(link
);
2094 r
= sd_netlink_message_read_string(m
, IFLA_IFNAME
, &ifname
);
2095 if (r
>= 0 && !streq(ifname
, link
->ifname
)) {
2096 log_link_info(link
, "Renamed to %s", ifname
);
2098 link_free_carrier_maps(link
);
2100 r
= free_and_strdup(&link
->ifname
, ifname
);
2104 r
= link_new_carrier_maps(link
);
2109 r
= sd_netlink_message_read_u32(m
, IFLA_MTU
, &mtu
);
2110 if (r
>= 0 && mtu
> 0) {
2112 if (!link
->original_mtu
) {
2113 link
->original_mtu
= mtu
;
2114 log_link_debug(link
, "Saved original MTU: %" PRIu32
, link
->original_mtu
);
2117 if (link
->dhcp_client
) {
2118 r
= sd_dhcp_client_set_mtu(link
->dhcp_client
,
2121 log_link_warning_errno(link
, r
, "Could not update MTU in DHCP client: %m");
2127 /* The kernel may broadcast NEWLINK messages without the MAC address
2128 set, simply ignore them. */
2129 r
= sd_netlink_message_read_ether_addr(m
, IFLA_ADDRESS
, &mac
);
2131 if (memcmp(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2134 memcpy(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2137 log_link_debug(link
, "MAC address: "
2138 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2139 mac
.ether_addr_octet
[0],
2140 mac
.ether_addr_octet
[1],
2141 mac
.ether_addr_octet
[2],
2142 mac
.ether_addr_octet
[3],
2143 mac
.ether_addr_octet
[4],
2144 mac
.ether_addr_octet
[5]);
2147 r
= sd_ipv4ll_set_mac(link
->ipv4ll
, &link
->mac
);
2149 return log_link_warning_errno(link
, r
, "Could not update MAC address in IPv4LL client: %m");
2152 if (link
->dhcp_client
) {
2153 r
= sd_dhcp_client_set_mac(link
->dhcp_client
,
2154 (const uint8_t *) &link
->mac
,
2158 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCP client: %m");
2161 if (link
->dhcp6_client
) {
2162 r
= sd_dhcp6_client_set_mac(link
->dhcp6_client
,
2163 (const uint8_t *) &link
->mac
,
2167 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCPv6 client: %m");
2172 had_carrier
= link_has_carrier(link
);
2174 r
= link_update_flags(link
, m
);
2178 carrier_gained
= !had_carrier
&& link_has_carrier(link
);
2179 carrier_lost
= had_carrier
&& !link_has_carrier(link
);
2181 if (carrier_gained
) {
2182 log_link_info(link
, "Gained carrier");
2184 r
= link_carrier_gained(link
);
2187 } else if (carrier_lost
) {
2188 log_link_info(link
, "Lost carrier");
2190 r
= link_carrier_lost(link
);
2199 static void link_update_operstate(Link
*link
) {
2200 LinkOperationalState operstate
;
2203 if (link
->kernel_operstate
== IF_OPER_DORMANT
)
2204 operstate
= LINK_OPERSTATE_DORMANT
;
2205 else if (link_has_carrier(link
)) {
2207 uint8_t scope
= RT_SCOPE_NOWHERE
;
2209 /* if we have carrier, check what addresses we have */
2210 LIST_FOREACH(addresses
, address
, link
->addresses
) {
2211 if (address
->flags
& (IFA_F_TENTATIVE
| IFA_F_DEPRECATED
))
2214 if (address
->scope
< scope
)
2215 scope
= address
->scope
;
2218 if (scope
< RT_SCOPE_SITE
)
2219 /* universally accessible addresses found */
2220 operstate
= LINK_OPERSTATE_ROUTABLE
;
2221 else if (scope
< RT_SCOPE_HOST
)
2222 /* only link or site local addresses found */
2223 operstate
= LINK_OPERSTATE_DEGRADED
;
2225 /* no useful addresses found */
2226 operstate
= LINK_OPERSTATE_CARRIER
;
2227 } else if (link
->flags
& IFF_UP
)
2228 operstate
= LINK_OPERSTATE_NO_CARRIER
;
2230 operstate
= LINK_OPERSTATE_OFF
;
2232 if (link
->operstate
!= operstate
) {
2233 link
->operstate
= operstate
;
2234 link_send_changed(link
, "OperationalState", NULL
);
2238 int link_save(Link
*link
) {
2239 _cleanup_free_
char *temp_path
= NULL
;
2240 _cleanup_fclose_
FILE *f
= NULL
;
2241 const char *admin_state
, *oper_state
;
2245 assert(link
->state_file
);
2246 assert(link
->lease_file
);
2247 assert(link
->manager
);
2249 link_update_operstate(link
);
2251 r
= manager_save(link
->manager
);
2255 if (link
->state
== LINK_STATE_LINGER
) {
2256 unlink(link
->state_file
);
2260 admin_state
= link_state_to_string(link
->state
);
2261 assert(admin_state
);
2263 oper_state
= link_operstate_to_string(link
->operstate
);
2266 r
= fopen_temporary(link
->state_file
, &f
, &temp_path
);
2270 fchmod(fileno(f
), 0644);
2273 "# This is private data. Do not parse.\n"
2276 admin_state
, oper_state
);
2278 if (link
->network
) {
2279 char **address
, **domain
;
2281 sd_dhcp6_lease
*dhcp6_lease
= NULL
;
2283 if (link
->dhcp6_client
) {
2284 r
= sd_dhcp6_client_get_lease(link
->dhcp6_client
,
2287 log_link_debug(link
, "No DHCPv6 lease");
2290 fprintf(f
, "NETWORK_FILE=%s\n", link
->network
->filename
);
2294 STRV_FOREACH(address
, link
->network
->dns
) {
2301 if (link
->network
->dhcp_dns
&&
2303 const struct in_addr
*addresses
;
2305 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
2309 serialize_in_addrs(f
, addresses
, r
);
2314 if (link
->network
->dhcp_dns
&& dhcp6_lease
) {
2315 struct in6_addr
*in6_addrs
;
2317 r
= sd_dhcp6_lease_get_dns(dhcp6_lease
, &in6_addrs
);
2321 serialize_in6_addrs(f
, in6_addrs
, r
);
2330 STRV_FOREACH(address
, link
->network
->ntp
) {
2337 if (link
->network
->dhcp_ntp
&&
2339 const struct in_addr
*addresses
;
2341 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
2345 serialize_in_addrs(f
, addresses
, r
);
2350 if (link
->network
->dhcp_ntp
&& dhcp6_lease
) {
2351 struct in6_addr
*in6_addrs
;
2355 r
= sd_dhcp6_lease_get_ntp_addrs(dhcp6_lease
,
2360 serialize_in6_addrs(f
, in6_addrs
, r
);
2364 r
= sd_dhcp6_lease_get_ntp_fqdn(dhcp6_lease
, &hosts
);
2366 STRV_FOREACH(hostname
, hosts
) {
2369 fputs(*hostname
, f
);
2377 fprintf(f
, "DOMAINS=");
2379 STRV_FOREACH(domain
, link
->network
->domains
) {
2386 if (link
->network
->dhcp_domains
&&
2388 const char *domainname
;
2390 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
2394 fputs(domainname
, f
);
2399 if (link
->network
->dhcp_domains
&& dhcp6_lease
) {
2402 r
= sd_dhcp6_lease_get_domains(dhcp6_lease
, &domains
);
2404 STRV_FOREACH(domain
, domains
) {
2415 fprintf(f
, "WILDCARD_DOMAIN=%s\n",
2416 yes_no(link
->network
->wildcard_domain
));
2418 fprintf(f
, "LLMNR=%s\n",
2419 resolve_support_to_string(link
->network
->llmnr
));
2422 if (!hashmap_isempty(link
->bound_to_links
)) {
2427 fputs("CARRIER_BOUND_TO=", f
);
2428 HASHMAP_FOREACH(carrier
, link
->bound_to_links
, i
) {
2431 fputs(carrier
->ifname
, f
);
2438 if (!hashmap_isempty(link
->bound_by_links
)) {
2443 fputs("CARRIER_BOUND_BY=", f
);
2444 HASHMAP_FOREACH(carrier
, link
->bound_by_links
, i
) {
2447 fputs(carrier
->ifname
, f
);
2454 if (link
->dhcp_lease
) {
2455 const char *tz
= NULL
;
2457 r
= sd_dhcp_lease_get_timezone(link
->dhcp_lease
, &tz
);
2459 fprintf(f
, "TIMEZONE=%s\n", tz
);
2462 if (link
->dhcp_lease
) {
2463 assert(link
->network
);
2465 r
= dhcp_lease_save(link
->dhcp_lease
, link
->lease_file
);
2473 unlink(link
->lease_file
);
2476 assert(link
->network
);
2478 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
2486 unlink(link
->lldp_file
);
2488 r
= fflush_and_check(f
);
2492 if (rename(temp_path
, link
->state_file
) < 0) {
2500 (void) unlink(link
->state_file
);
2502 (void) unlink(temp_path
);
2504 return log_link_error_errno(link
, r
, "Failed to save link data to %s: %m", link
->state_file
);
2507 static const char* const link_state_table
[_LINK_STATE_MAX
] = {
2508 [LINK_STATE_PENDING
] = "pending",
2509 [LINK_STATE_ENSLAVING
] = "configuring",
2510 [LINK_STATE_SETTING_ADDRESSES
] = "configuring",
2511 [LINK_STATE_SETTING_ROUTES
] = "configuring",
2512 [LINK_STATE_CONFIGURED
] = "configured",
2513 [LINK_STATE_UNMANAGED
] = "unmanaged",
2514 [LINK_STATE_FAILED
] = "failed",
2515 [LINK_STATE_LINGER
] = "linger",
2518 DEFINE_STRING_TABLE_LOOKUP(link_state
, LinkState
);
2520 static const char* const link_operstate_table
[_LINK_OPERSTATE_MAX
] = {
2521 [LINK_OPERSTATE_OFF
] = "off",
2522 [LINK_OPERSTATE_NO_CARRIER
] = "no-carrier",
2523 [LINK_OPERSTATE_DORMANT
] = "dormant",
2524 [LINK_OPERSTATE_CARRIER
] = "carrier",
2525 [LINK_OPERSTATE_DEGRADED
] = "degraded",
2526 [LINK_OPERSTATE_ROUTABLE
] = "routable",
2529 DEFINE_STRING_TABLE_LOOKUP(link_operstate
, LinkOperationalState
);