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 "netlink-util.h"
33 #include "dhcp-lease-internal.h"
34 #include "network-internal.h"
36 #include "networkd-link.h"
37 #include "networkd-netdev.h"
39 bool link_dhcp6_enabled(Link
*link
) {
40 if (link
->flags
& IFF_LOOPBACK
)
46 return link
->network
->dhcp
& ADDRESS_FAMILY_IPV6
;
49 bool link_dhcp4_enabled(Link
*link
) {
50 if (link
->flags
& IFF_LOOPBACK
)
56 return link
->network
->dhcp
& ADDRESS_FAMILY_IPV4
;
59 bool link_dhcp4_server_enabled(Link
*link
) {
60 if (link
->flags
& IFF_LOOPBACK
)
66 return link
->network
->dhcp_server
;
69 bool link_ipv4ll_enabled(Link
*link
) {
70 if (link
->flags
& IFF_LOOPBACK
)
76 return link
->network
->link_local
& ADDRESS_FAMILY_IPV4
;
79 bool link_ipv6ll_enabled(Link
*link
) {
80 if (link
->flags
& IFF_LOOPBACK
)
86 return link
->network
->link_local
& ADDRESS_FAMILY_IPV6
;
89 bool link_lldp_enabled(Link
*link
) {
90 if (link
->flags
& IFF_LOOPBACK
)
96 if (link
->network
->bridge
)
99 return link
->network
->lldp
;
102 static bool link_ipv4_forward_enabled(Link
*link
) {
103 if (link
->flags
& IFF_LOOPBACK
)
109 return link
->network
->ip_forward
& ADDRESS_FAMILY_IPV4
;
112 static bool link_ipv6_forward_enabled(Link
*link
) {
113 if (link
->flags
& IFF_LOOPBACK
)
119 return link
->network
->ip_forward
& ADDRESS_FAMILY_IPV6
;
122 static IPv6PrivacyExtensions
link_ipv6_privacy_extensions(Link
*link
) {
123 if (link
->flags
& IFF_LOOPBACK
)
124 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
127 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
129 return link
->network
->ipv6_privacy_extensions
;
132 #define FLAG_STRING(string, flag, old, new) \
133 (((old ^ new) & flag) \
134 ? ((old & flag) ? (" -" string) : (" +" string)) \
137 static int link_update_flags(Link
*link
, sd_netlink_message
*m
) {
138 unsigned flags
, unknown_flags_added
, unknown_flags_removed
, unknown_flags
;
144 r
= sd_rtnl_message_link_get_flags(m
, &flags
);
146 return log_link_warning_errno(link
, r
, "Could not get link flags: %m");
148 r
= sd_netlink_message_read_u8(m
, IFLA_OPERSTATE
, &operstate
);
150 /* if we got a message without operstate, take it to mean
151 the state was unchanged */
152 operstate
= link
->kernel_operstate
;
154 if ((link
->flags
== flags
) && (link
->kernel_operstate
== operstate
))
157 if (link
->flags
!= flags
) {
158 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",
159 FLAG_STRING("LOOPBACK", IFF_LOOPBACK
, link
->flags
, flags
),
160 FLAG_STRING("MASTER", IFF_MASTER
, link
->flags
, flags
),
161 FLAG_STRING("SLAVE", IFF_SLAVE
, link
->flags
, flags
),
162 FLAG_STRING("UP", IFF_UP
, link
->flags
, flags
),
163 FLAG_STRING("DORMANT", IFF_DORMANT
, link
->flags
, flags
),
164 FLAG_STRING("LOWER_UP", IFF_LOWER_UP
, link
->flags
, flags
),
165 FLAG_STRING("RUNNING", IFF_RUNNING
, link
->flags
, flags
),
166 FLAG_STRING("MULTICAST", IFF_MULTICAST
, link
->flags
, flags
),
167 FLAG_STRING("BROADCAST", IFF_BROADCAST
, link
->flags
, flags
),
168 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT
, link
->flags
, flags
),
169 FLAG_STRING("PROMISC", IFF_PROMISC
, link
->flags
, flags
),
170 FLAG_STRING("ALLMULTI", IFF_ALLMULTI
, link
->flags
, flags
),
171 FLAG_STRING("PORTSEL", IFF_PORTSEL
, link
->flags
, flags
),
172 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA
, link
->flags
, flags
),
173 FLAG_STRING("DYNAMIC", IFF_DYNAMIC
, link
->flags
, flags
),
174 FLAG_STRING("NOARP", IFF_NOARP
, link
->flags
, flags
),
175 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS
, link
->flags
, flags
),
176 FLAG_STRING("DEBUG", IFF_DEBUG
, link
->flags
, flags
),
177 FLAG_STRING("ECHO", IFF_ECHO
, link
->flags
, flags
));
179 unknown_flags
= ~(IFF_LOOPBACK
| IFF_MASTER
| IFF_SLAVE
| IFF_UP
|
180 IFF_DORMANT
| IFF_LOWER_UP
| IFF_RUNNING
|
181 IFF_MULTICAST
| IFF_BROADCAST
| IFF_POINTOPOINT
|
182 IFF_PROMISC
| IFF_ALLMULTI
| IFF_PORTSEL
|
183 IFF_AUTOMEDIA
| IFF_DYNAMIC
| IFF_NOARP
|
184 IFF_NOTRAILERS
| IFF_DEBUG
| IFF_ECHO
);
185 unknown_flags_added
= ((link
->flags
^ flags
) & flags
& unknown_flags
);
186 unknown_flags_removed
= ((link
->flags
^ flags
) & link
->flags
& unknown_flags
);
188 /* link flags are currently at most 18 bits, let's align to
190 if (unknown_flags_added
)
192 "Unknown link flags gained: %#.5x (ignoring)",
193 unknown_flags_added
);
195 if (unknown_flags_removed
)
197 "Unknown link flags lost: %#.5x (ignoring)",
198 unknown_flags_removed
);
202 link
->kernel_operstate
= operstate
;
209 static int link_new(Manager
*manager
, sd_netlink_message
*message
, Link
**ret
) {
210 _cleanup_link_unref_ Link
*link
= NULL
;
219 r
= sd_netlink_message_get_type(message
, &type
);
222 else if (type
!= RTM_NEWLINK
)
225 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
228 else if (ifindex
<= 0)
231 r
= sd_netlink_message_read_string(message
, IFLA_IFNAME
, &ifname
);
235 link
= new0(Link
, 1);
240 link
->manager
= manager
;
241 link
->state
= LINK_STATE_PENDING
;
242 link
->rtnl_extended_attrs
= true;
243 link
->ifindex
= ifindex
;
244 link
->ifname
= strdup(ifname
);
248 r
= sd_netlink_message_read_ether_addr(message
, IFLA_ADDRESS
, &link
->mac
);
250 log_link_debug(link
, "MAC address not found for new device, continuing without");
252 r
= asprintf(&link
->state_file
, "/run/systemd/netif/links/%d",
257 r
= asprintf(&link
->lease_file
, "/run/systemd/netif/leases/%d",
262 r
= asprintf(&link
->lldp_file
, "/run/systemd/netif/lldp/%d",
268 r
= hashmap_ensure_allocated(&manager
->links
, NULL
);
272 r
= hashmap_put(manager
->links
, INT_TO_PTR(link
->ifindex
), link
);
276 r
= link_update_flags(link
, message
);
286 static void link_free(Link
*link
) {
294 while ((address
= link
->addresses
)) {
295 LIST_REMOVE(addresses
, link
->addresses
, address
);
296 address_free(address
);
299 while ((address
= link
->pool_addresses
)) {
300 LIST_REMOVE(addresses
, link
->pool_addresses
, address
);
301 address_free(address
);
304 sd_dhcp_server_unref(link
->dhcp_server
);
305 sd_dhcp_client_unref(link
->dhcp_client
);
306 sd_dhcp_lease_unref(link
->dhcp_lease
);
308 free(link
->lease_file
);
310 sd_lldp_free(link
->lldp
);
312 free(link
->lldp_file
);
314 sd_ipv4ll_unref(link
->ipv4ll
);
315 sd_dhcp6_client_unref(link
->dhcp6_client
);
316 sd_icmp6_nd_unref(link
->icmp6_router_discovery
);
319 hashmap_remove(link
->manager
->links
, INT_TO_PTR(link
->ifindex
));
323 free(link
->state_file
);
325 udev_device_unref(link
->udev_device
);
327 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
)
328 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(carrier
->ifindex
));
329 hashmap_free(link
->bound_to_links
);
331 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
)
332 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(carrier
->ifindex
));
333 hashmap_free(link
->bound_by_links
);
338 Link
*link_unref(Link
*link
) {
339 if (link
&& (-- link
->n_ref
<= 0))
345 Link
*link_ref(Link
*link
) {
347 assert_se(++ link
->n_ref
>= 2);
352 int link_get(Manager
*m
, int ifindex
, Link
**ret
) {
359 link
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
368 static void link_set_state(Link
*link
, LinkState state
) {
371 if (link
->state
== state
)
376 link_send_changed(link
, "AdministrativeState", NULL
);
381 static void link_enter_unmanaged(Link
*link
) {
384 log_link_debug(link
, "Unmanaged");
386 link_set_state(link
, LINK_STATE_UNMANAGED
);
391 static int link_stop_clients(Link
*link
) {
395 assert(link
->manager
);
396 assert(link
->manager
->event
);
401 if (link
->dhcp_client
) {
402 k
= sd_dhcp_client_stop(link
->dhcp_client
);
404 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv4 client: %m");
408 k
= sd_ipv4ll_stop(link
->ipv4ll
);
410 r
= log_link_warning_errno(link
, r
, "Could not stop IPv4 link-local: %m");
413 if(link
->icmp6_router_discovery
) {
414 if (link
->dhcp6_client
) {
415 k
= sd_dhcp6_client_stop(link
->dhcp6_client
);
417 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv6 client: %m");
420 k
= sd_icmp6_nd_stop(link
->icmp6_router_discovery
);
422 r
= log_link_warning_errno(link
, r
, "Could not stop ICMPv6 router discovery: %m");
426 k
= sd_lldp_stop(link
->lldp
);
428 r
= log_link_warning_errno(link
, r
, "Could not stop LLDP: %m");
434 void link_enter_failed(Link
*link
) {
437 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
440 log_link_warning(link
, "Failed");
442 link_set_state(link
, LINK_STATE_FAILED
);
444 link_stop_clients(link
);
449 static Address
* link_find_dhcp_server_address(Link
*link
) {
453 assert(link
->network
);
455 /* The first statically configured address if there is any */
456 LIST_FOREACH(addresses
, address
, link
->network
->static_addresses
) {
458 if (address
->family
!= AF_INET
)
461 if (in_addr_is_null(address
->family
, &address
->in_addr
))
467 /* If that didn't work, find a suitable address we got from the pool */
468 LIST_FOREACH(addresses
, address
, link
->pool_addresses
) {
469 if (address
->family
!= AF_INET
)
478 static int link_enter_configured(Link
*link
) {
480 assert(link
->network
);
481 assert(link
->state
== LINK_STATE_SETTING_ROUTES
);
483 log_link_info(link
, "Configured");
485 link_set_state(link
, LINK_STATE_CONFIGURED
);
492 void link_client_handler(Link
*link
) {
494 assert(link
->network
);
496 if (!link
->static_configured
)
499 if (link_ipv4ll_enabled(link
))
500 if (!link
->ipv4ll_address
||
504 if (link_dhcp4_enabled(link
) && !link
->dhcp4_configured
)
507 if (link
->state
!= LINK_STATE_CONFIGURED
)
508 link_enter_configured(link
);
513 static int route_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
514 _cleanup_link_unref_ Link
*link
= userdata
;
517 assert(link
->link_messages
> 0);
518 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
519 LINK_STATE_SETTING_ROUTES
, LINK_STATE_FAILED
,
522 link
->link_messages
--;
524 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
527 r
= sd_netlink_message_get_errno(m
);
528 if (r
< 0 && r
!= -EEXIST
)
529 log_link_warning_errno(link
, r
, "%-*s: could not set route: %m", IFNAMSIZ
, link
->ifname
);
531 if (link
->link_messages
== 0) {
532 log_link_debug(link
, "Routes set");
533 link
->static_configured
= true;
534 link_client_handler(link
);
540 static int link_enter_set_routes(Link
*link
) {
545 assert(link
->network
);
546 assert(link
->state
== LINK_STATE_SETTING_ADDRESSES
);
548 link_set_state(link
, LINK_STATE_SETTING_ROUTES
);
550 LIST_FOREACH(routes
, rt
, link
->network
->static_routes
) {
551 r
= route_configure(rt
, link
, &route_handler
);
553 log_link_warning_errno(link
, r
, "Could not set routes: %m");
554 link_enter_failed(link
);
558 link
->link_messages
++;
561 if (link
->link_messages
== 0) {
562 link
->static_configured
= true;
563 link_client_handler(link
);
565 log_link_debug(link
, "Setting routes");
570 int link_route_drop_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
571 _cleanup_link_unref_ Link
*link
= userdata
;
576 assert(link
->ifname
);
578 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
581 r
= sd_netlink_message_get_errno(m
);
582 if (r
< 0 && r
!= -ESRCH
)
583 log_link_warning_errno(link
, r
, "%-*s: could not drop route: %m", IFNAMSIZ
, link
->ifname
);
588 static int address_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
589 _cleanup_link_unref_ Link
*link
= userdata
;
595 assert(link
->ifname
);
596 assert(link
->link_messages
> 0);
597 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
598 LINK_STATE_FAILED
, LINK_STATE_LINGER
));
600 link
->link_messages
--;
602 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
605 r
= sd_netlink_message_get_errno(m
);
606 if (r
< 0 && r
!= -EEXIST
)
607 log_link_warning_errno(link
, r
, "%-*s: could not set address: %m", IFNAMSIZ
, link
->ifname
);
609 link_rtnl_process_address(rtnl
, m
, link
->manager
);
611 if (link
->link_messages
== 0) {
612 log_link_debug(link
, "Addresses set");
613 link_enter_set_routes(link
);
619 static int link_push_dns_to_dhcp_server(Link
*link
, sd_dhcp_server
*s
) {
620 _cleanup_free_
struct in_addr
*addresses
= NULL
;
621 size_t n_addresses
= 0, n_allocated
= 0;
624 log_debug("Copying DNS server information from %s", link
->ifname
);
629 STRV_FOREACH(a
, link
->network
->dns
) {
632 /* Only look for IPv4 addresses */
633 if (inet_pton(AF_INET
, *a
, &ia
) <= 0)
636 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ 1))
639 addresses
[n_addresses
++] = ia
;
642 if (link
->network
->dhcp_dns
&&
644 const struct in_addr
*da
= NULL
;
647 n
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &da
);
650 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ n
))
653 memcpy(addresses
+ n_addresses
, da
, n
* sizeof(struct in_addr
));
658 if (n_addresses
<= 0)
661 return sd_dhcp_server_set_dns(s
, addresses
, n_addresses
);
664 static int link_push_ntp_to_dhcp_server(Link
*link
, sd_dhcp_server
*s
) {
665 _cleanup_free_
struct in_addr
*addresses
= NULL
;
666 size_t n_addresses
= 0, n_allocated
= 0;
672 log_debug("Copying NTP server information from %s", link
->ifname
);
674 STRV_FOREACH(a
, link
->network
->ntp
) {
677 /* Only look for IPv4 addresses */
678 if (inet_pton(AF_INET
, *a
, &ia
) <= 0)
681 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ 1))
684 addresses
[n_addresses
++] = ia
;
687 if (link
->network
->dhcp_ntp
&&
689 const struct in_addr
*da
= NULL
;
692 n
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &da
);
695 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ n
))
698 memcpy(addresses
+ n_addresses
, da
, n
* sizeof(struct in_addr
));
703 if (n_addresses
<= 0)
706 return sd_dhcp_server_set_ntp(s
, addresses
, n_addresses
);
709 static int link_enter_set_addresses(Link
*link
) {
714 assert(link
->network
);
715 assert(link
->state
!= _LINK_STATE_INVALID
);
717 link_set_state(link
, LINK_STATE_SETTING_ADDRESSES
);
719 LIST_FOREACH(addresses
, ad
, link
->network
->static_addresses
) {
720 r
= address_configure(ad
, link
, &address_handler
);
722 log_link_warning_errno(link
, r
, "Could not set addresses: %m");
723 link_enter_failed(link
);
727 link
->link_messages
++;
730 /* now that we can figure out a default address for the dhcp server,
732 if (link_dhcp4_server_enabled(link
)) {
735 bool acquired_uplink
= false;
737 address
= link_find_dhcp_server_address(link
);
739 log_link_warning(link
, "Failed to find suitable address for DHCPv4 server instance.");
740 link_enter_failed(link
);
744 /* use the server address' subnet as the pool */
745 r
= sd_dhcp_server_configure_pool(link
->dhcp_server
, &address
->in_addr
.in
, address
->prefixlen
,
746 link
->network
->dhcp_server_pool_offset
, link
->network
->dhcp_server_pool_size
);
751 r = sd_dhcp_server_set_router(link->dhcp_server,
752 &main_address->in_addr.in);
757 if (link
->network
->dhcp_server_max_lease_time_usec
> 0) {
758 r
= sd_dhcp_server_set_max_lease_time(
760 DIV_ROUND_UP(link
->network
->dhcp_server_max_lease_time_usec
, USEC_PER_SEC
));
765 if (link
->network
->dhcp_server_default_lease_time_usec
> 0) {
766 r
= sd_dhcp_server_set_default_lease_time(
768 DIV_ROUND_UP(link
->network
->dhcp_server_default_lease_time_usec
, USEC_PER_SEC
));
773 if (link
->network
->dhcp_server_emit_dns
) {
775 if (link
->network
->n_dhcp_server_dns
> 0)
776 r
= sd_dhcp_server_set_dns(link
->dhcp_server
, link
->network
->dhcp_server_dns
, link
->network
->n_dhcp_server_dns
);
778 uplink
= manager_find_uplink(link
->manager
, link
);
779 acquired_uplink
= true;
782 log_link_debug(link
, "Not emitting DNS server information on link, couldn't find suitable uplink.");
785 r
= link_push_dns_to_dhcp_server(uplink
, link
->dhcp_server
);
788 log_link_warning_errno(link
, r
, "Failed to set DNS server for DHCP server, ignoring: %m");
792 if (link
->network
->dhcp_server_emit_ntp
) {
794 if (link
->network
->n_dhcp_server_ntp
> 0)
795 r
= sd_dhcp_server_set_ntp(link
->dhcp_server
, link
->network
->dhcp_server_ntp
, link
->network
->n_dhcp_server_ntp
);
797 if (!acquired_uplink
)
798 uplink
= manager_find_uplink(link
->manager
, link
);
801 log_link_debug(link
, "Not emitting NTP server information on link, couldn't find suitable uplink.");
804 r
= link_push_ntp_to_dhcp_server(uplink
, link
->dhcp_server
);
808 log_link_warning_errno(link
, r
, "Failed to set NTP server for DHCP server, ignoring: %m");
811 if (link
->network
->dhcp_server_emit_timezone
) {
812 _cleanup_free_
char *buffer
= NULL
;
813 const char *tz
= NULL
;
815 if (link
->network
->dhcp_server_timezone
)
816 tz
= link
->network
->dhcp_server_timezone
;
818 r
= get_timezone(&buffer
);
820 log_warning_errno(r
, "Failed to determine timezone: %m");
826 r
= sd_dhcp_server_set_timezone(link
->dhcp_server
, tz
);
832 r
= sd_dhcp_server_start(link
->dhcp_server
);
834 log_link_warning_errno(link
, r
, "Could not start DHCPv4 server instance: %m");
836 link_enter_failed(link
);
841 log_link_debug(link
, "Offering DHCPv4 leases");
844 if (link
->link_messages
== 0)
845 link_enter_set_routes(link
);
847 log_link_debug(link
, "Setting addresses");
852 int link_address_drop_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
853 _cleanup_link_unref_ Link
*link
= userdata
;
858 assert(link
->ifname
);
860 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
863 r
= sd_netlink_message_get_errno(m
);
864 if (r
< 0 && r
!= -EADDRNOTAVAIL
)
865 log_link_warning_errno(link
, r
, "%-*s: could not drop address: %m", IFNAMSIZ
, link
->ifname
);
870 static int link_set_bridge_fdb(Link
*const link
) {
874 LIST_FOREACH(static_fdb_entries
, fdb_entry
, link
->network
->static_fdb_entries
) {
875 r
= fdb_entry_configure(link
, fdb_entry
);
877 log_link_error_errno(link
, r
, "Failed to add MAC entry to static MAC table: %m");
885 static int link_set_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
886 _cleanup_link_unref_ Link
*link
= userdata
;
889 log_link_debug(link
, "Set link");
891 r
= sd_netlink_message_get_errno(m
);
892 if (r
< 0 && r
!= -EEXIST
) {
893 log_link_error_errno(link
, r
, "Could not join netdev: %m");
894 link_enter_failed(link
);
901 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
902 _cleanup_link_unref_ Link
*link
= userdata
;
903 const sd_bus_error
*e
;
908 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
911 e
= sd_bus_message_get_error(m
);
913 log_link_warning_errno(link
, sd_bus_error_get_errno(e
), "Could not set hostname: %s", e
->message
);
918 int link_set_hostname(Link
*link
, const char *hostname
) {
922 assert(link
->manager
);
924 log_link_debug(link
, "Setting transient hostname: '%s'", strna(hostname
));
926 if (!link
->manager
->bus
) {
927 /* TODO: replace by assert when we can rely on kdbus */
928 log_link_info(link
, "Not connected to system bus, ignoring transient hostname.");
932 r
= sd_bus_call_method_async(
935 "org.freedesktop.hostname1",
936 "/org/freedesktop/hostname1",
937 "org.freedesktop.hostname1",
939 set_hostname_handler
,
946 return log_link_error_errno(link
, r
, "Could not set transient hostname: %m");
953 static int set_timezone_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
954 _cleanup_link_unref_ Link
*link
= userdata
;
955 const sd_bus_error
*e
;
960 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
963 e
= sd_bus_message_get_error(m
);
965 log_link_warning_errno(link
, sd_bus_error_get_errno(e
), "Could not set timezone: %s", e
->message
);
970 int link_set_timezone(Link
*link
, const char *tz
) {
974 assert(link
->manager
);
977 log_link_debug(link
, "Setting system timezone: '%s'", tz
);
979 if (!link
->manager
->bus
) {
980 log_link_info(link
, "Not connected to system bus, ignoring timezone.");
984 r
= sd_bus_call_method_async(
987 "org.freedesktop.timedate1",
988 "/org/freedesktop/timedate1",
989 "org.freedesktop.timedate1",
991 set_timezone_handler
,
997 return log_link_error_errno(link
, r
, "Could not set timezone: %m");
1004 static int set_mtu_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1005 _cleanup_link_unref_ Link
*link
= userdata
;
1010 assert(link
->ifname
);
1012 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1015 r
= sd_netlink_message_get_errno(m
);
1017 log_link_warning_errno(link
, r
, "%-*s: could not set MTU: %m", IFNAMSIZ
, link
->ifname
);
1022 int link_set_mtu(Link
*link
, uint32_t mtu
) {
1023 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1027 assert(link
->manager
);
1028 assert(link
->manager
->rtnl
);
1030 log_link_debug(link
, "Setting MTU: %" PRIu32
, mtu
);
1032 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1034 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1036 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, mtu
);
1038 return log_link_error_errno(link
, r
, "Could not append MTU: %m");
1040 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, set_mtu_handler
, link
, 0, NULL
);
1042 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1049 static int link_set_bridge(Link
*link
) {
1050 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1054 assert(link
->network
);
1056 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1058 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1060 r
= sd_rtnl_message_link_set_family(req
, PF_BRIDGE
);
1062 return log_link_error_errno(link
, r
, "Could not set message family: %m");
1064 r
= sd_netlink_message_open_container(req
, IFLA_PROTINFO
);
1066 return log_link_error_errno(link
, r
, "Could not append IFLA_PROTINFO attribute: %m");
1068 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_GUARD
, !link
->network
->use_bpdu
);
1070 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_GUARD attribute: %m");
1072 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_MODE
, link
->network
->hairpin
);
1074 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_MODE attribute: %m");
1076 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_FAST_LEAVE
, link
->network
->fast_leave
);
1078 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_FAST_LEAVE attribute: %m");
1080 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_PROTECT
, !link
->network
->allow_port_to_be_root
);
1082 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_PROTECT attribute: %m");
1084 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_UNICAST_FLOOD
, link
->network
->unicast_flood
);
1086 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_UNICAST_FLOOD attribute: %m");
1088 if(link
->network
->cost
!= 0) {
1089 r
= sd_netlink_message_append_u32(req
, IFLA_BRPORT_COST
, link
->network
->cost
);
1091 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_COST attribute: %m");
1094 r
= sd_netlink_message_close_container(req
);
1096 return log_link_error_errno(link
, r
, "Could not append IFLA_LINKINFO attribute: %m");
1098 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_set_handler
, link
, 0, NULL
);
1100 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1107 static void lldp_handler(sd_lldp
*lldp
, int event
, void *userdata
) {
1108 Link
*link
= userdata
;
1112 assert(link
->network
);
1113 assert(link
->manager
);
1116 case SD_LLDP_EVENT_UPDATE_INFO
:
1117 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
1119 log_link_warning_errno(link
, r
, "Could not save LLDP: %m");
1127 static int link_acquire_conf(Link
*link
) {
1131 assert(link
->network
);
1132 assert(link
->manager
);
1133 assert(link
->manager
->event
);
1135 if (link_ipv4ll_enabled(link
)) {
1136 assert(link
->ipv4ll
);
1138 log_link_debug(link
, "Acquiring IPv4 link-local address");
1140 r
= sd_ipv4ll_start(link
->ipv4ll
);
1142 return log_link_warning_errno(link
, r
, "Could not acquire IPv4 link-local address: %m");
1145 if (link_dhcp4_enabled(link
)) {
1146 assert(link
->dhcp_client
);
1148 log_link_debug(link
, "Acquiring DHCPv4 lease");
1150 r
= sd_dhcp_client_start(link
->dhcp_client
);
1152 return log_link_warning_errno(link
, r
, "Could not acquire DHCPv4 lease: %m");
1155 if (link_dhcp6_enabled(link
)) {
1156 assert(link
->icmp6_router_discovery
);
1158 log_link_debug(link
, "Discovering IPv6 routers");
1160 r
= sd_icmp6_router_solicitation_start(link
->icmp6_router_discovery
);
1162 return log_link_warning_errno(link
, r
, "Could not start IPv6 router discovery: %m");
1165 if (link_lldp_enabled(link
)) {
1168 log_link_debug(link
, "Starting LLDP");
1170 r
= sd_lldp_start(link
->lldp
);
1172 return log_link_warning_errno(link
, r
, "Could not start LLDP: %m");
1178 bool link_has_carrier(Link
*link
) {
1179 /* see Documentation/networking/operstates.txt in the kernel sources */
1181 if (link
->kernel_operstate
== IF_OPER_UP
)
1184 if (link
->kernel_operstate
== IF_OPER_UNKNOWN
)
1185 /* operstate may not be implemented, so fall back to flags */
1186 if ((link
->flags
& IFF_LOWER_UP
) && !(link
->flags
& IFF_DORMANT
))
1192 static int link_up_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1193 _cleanup_link_unref_ Link
*link
= userdata
;
1198 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1201 r
= sd_netlink_message_get_errno(m
);
1203 /* we warn but don't fail the link, as it may be
1205 log_link_warning_errno(link
, r
, "%-*s: could not bring up interface: %m", IFNAMSIZ
, link
->ifname
);
1210 static int link_up(Link
*link
) {
1211 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1212 uint8_t ipv6ll_mode
;
1216 assert(link
->network
);
1217 assert(link
->manager
);
1218 assert(link
->manager
->rtnl
);
1220 log_link_debug(link
, "Bringing link up");
1222 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1224 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1226 r
= sd_rtnl_message_link_set_flags(req
, IFF_UP
, IFF_UP
);
1228 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1230 if (link
->network
->mac
) {
1231 r
= sd_netlink_message_append_ether_addr(req
, IFLA_ADDRESS
, link
->network
->mac
);
1233 return log_link_error_errno(link
, r
, "Could not set MAC address: %m");
1236 if (link
->network
->mtu
) {
1237 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, link
->network
->mtu
);
1239 return log_link_error_errno(link
, r
, "Could not set MTU: %m");
1242 r
= sd_netlink_message_open_container(req
, IFLA_AF_SPEC
);
1244 return log_link_error_errno(link
, r
, "Could not open IFLA_AF_SPEC container: %m");
1246 if (socket_ipv6_is_supported()) {
1247 /* if the kernel lacks ipv6 support setting IFF_UP fails if any ipv6 options are passed */
1248 r
= sd_netlink_message_open_container(req
, AF_INET6
);
1250 return log_link_error_errno(link
, r
, "Could not open AF_INET6 container: %m");
1252 ipv6ll_mode
= link_ipv6ll_enabled(link
) ? IN6_ADDR_GEN_MODE_EUI64
: IN6_ADDR_GEN_MODE_NONE
;
1253 r
= sd_netlink_message_append_u8(req
, IFLA_INET6_ADDR_GEN_MODE
, ipv6ll_mode
);
1255 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_ADDR_GEN_MODE: %m");
1257 if (!in_addr_is_null(AF_INET6
, &link
->network
->ipv6_token
)) {
1258 r
= sd_netlink_message_append_in6_addr(req
, IFLA_INET6_TOKEN
, &link
->network
->ipv6_token
.in6
);
1260 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_TOKEN: %m");
1263 r
= sd_netlink_message_close_container(req
);
1265 return log_link_error_errno(link
, r
, "Could not close AF_INET6 container: %m");
1268 r
= sd_netlink_message_close_container(req
);
1270 return log_link_error_errno(link
, r
, "Could not close IFLA_AF_SPEC container: %m");
1272 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_up_handler
, link
, 0, NULL
);
1274 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1281 static int link_down_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1282 _cleanup_link_unref_ Link
*link
= userdata
;
1287 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1290 r
= sd_netlink_message_get_errno(m
);
1292 log_link_warning_errno(link
, r
, "%-*s: could not bring down interface: %m", IFNAMSIZ
, link
->ifname
);
1297 static int link_down(Link
*link
) {
1298 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1302 assert(link
->manager
);
1303 assert(link
->manager
->rtnl
);
1305 log_link_debug(link
, "Bringing link down");
1307 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
,
1308 RTM_SETLINK
, link
->ifindex
);
1310 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1312 r
= sd_rtnl_message_link_set_flags(req
, 0, IFF_UP
);
1314 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1316 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_down_handler
, link
, 0, NULL
);
1318 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1325 static int link_handle_bound_to_list(Link
*link
) {
1329 bool required_up
= false;
1330 bool link_is_up
= false;
1334 if (hashmap_isempty(link
->bound_to_links
))
1337 if (link
->flags
& IFF_UP
)
1340 HASHMAP_FOREACH (l
, link
->bound_to_links
, i
)
1341 if (link_has_carrier(l
)) {
1346 if (!required_up
&& link_is_up
) {
1347 r
= link_down(link
);
1350 } else if (required_up
&& !link_is_up
) {
1359 static int link_handle_bound_by_list(Link
*link
) {
1366 if (hashmap_isempty(link
->bound_by_links
))
1369 HASHMAP_FOREACH (l
, link
->bound_by_links
, i
) {
1370 r
= link_handle_bound_to_list(l
);
1378 static int link_put_carrier(Link
*link
, Link
*carrier
, Hashmap
**h
) {
1384 if (link
== carrier
)
1387 if (hashmap_get(*h
, INT_TO_PTR(carrier
->ifindex
)))
1390 r
= hashmap_ensure_allocated(h
, NULL
);
1394 r
= hashmap_put(*h
, INT_TO_PTR(carrier
->ifindex
), carrier
);
1401 static int link_new_bound_by_list(Link
*link
) {
1406 bool list_updated
= false;
1409 assert(link
->manager
);
1413 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1414 if (!carrier
->network
)
1417 if (strv_isempty(carrier
->network
->bind_carrier
))
1420 if (strv_fnmatch(carrier
->network
->bind_carrier
, link
->ifname
, 0)) {
1421 r
= link_put_carrier(link
, carrier
, &link
->bound_by_links
);
1425 list_updated
= true;
1432 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
) {
1433 r
= link_put_carrier(carrier
, link
, &carrier
->bound_to_links
);
1443 static int link_new_bound_to_list(Link
*link
) {
1448 bool list_updated
= false;
1451 assert(link
->manager
);
1456 if (strv_isempty(link
->network
->bind_carrier
))
1461 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1462 if (strv_fnmatch(link
->network
->bind_carrier
, carrier
->ifname
, 0)) {
1463 r
= link_put_carrier(link
, carrier
, &link
->bound_to_links
);
1467 list_updated
= true;
1474 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
) {
1475 r
= link_put_carrier(carrier
, link
, &carrier
->bound_by_links
);
1485 static int link_new_carrier_maps(Link
*link
) {
1488 r
= link_new_bound_by_list(link
);
1492 r
= link_handle_bound_by_list(link
);
1496 r
= link_new_bound_to_list(link
);
1500 r
= link_handle_bound_to_list(link
);
1507 static void link_free_bound_to_list(Link
*link
) {
1511 HASHMAP_FOREACH (bound_to
, link
->bound_to_links
, i
) {
1512 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(bound_to
->ifindex
));
1514 if (hashmap_remove(bound_to
->bound_by_links
, INT_TO_PTR(link
->ifindex
)))
1515 link_save(bound_to
);
1521 static void link_free_bound_by_list(Link
*link
) {
1525 HASHMAP_FOREACH (bound_by
, link
->bound_by_links
, i
) {
1526 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(bound_by
->ifindex
));
1528 if (hashmap_remove(bound_by
->bound_to_links
, INT_TO_PTR(link
->ifindex
))) {
1529 link_save(bound_by
);
1530 link_handle_bound_to_list(bound_by
);
1537 static void link_free_carrier_maps(Link
*link
) {
1538 bool list_updated
= false;
1542 if (!hashmap_isempty(link
->bound_to_links
)) {
1543 link_free_bound_to_list(link
);
1544 list_updated
= true;
1547 if (!hashmap_isempty(link
->bound_by_links
)) {
1548 link_free_bound_by_list(link
);
1549 list_updated
= true;
1558 void link_drop(Link
*link
) {
1559 if (!link
|| link
->state
== LINK_STATE_LINGER
)
1562 link_set_state(link
, LINK_STATE_LINGER
);
1564 link_free_carrier_maps(link
);
1566 log_link_debug(link
, "Link removed");
1573 static int link_joined(Link
*link
) {
1577 assert(link
->network
);
1579 if (!hashmap_isempty(link
->bound_to_links
)) {
1580 r
= link_handle_bound_to_list(link
);
1583 } else if (!(link
->flags
& IFF_UP
)) {
1586 link_enter_failed(link
);
1591 if(link
->network
->bridge
) {
1592 r
= link_set_bridge(link
);
1594 log_link_error_errno(link
, r
, "Could not set bridge message: %m");
1597 return link_enter_set_addresses(link
);
1600 static int netdev_join_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1601 _cleanup_link_unref_ Link
*link
= userdata
;
1605 assert(link
->network
);
1609 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1612 r
= sd_netlink_message_get_errno(m
);
1613 if (r
< 0 && r
!= -EEXIST
) {
1614 log_link_error_errno(link
, r
, "%-*s: could not join netdev: %m", IFNAMSIZ
, link
->ifname
);
1615 link_enter_failed(link
);
1618 log_link_debug(link
, "Joined netdev");
1620 if (link
->enslaving
<= 0)
1626 static int link_enter_join_netdev(Link
*link
) {
1632 assert(link
->network
);
1633 assert(link
->state
== LINK_STATE_PENDING
);
1635 link_set_state(link
, LINK_STATE_ENSLAVING
);
1639 if (!link
->network
->bridge
&&
1640 !link
->network
->bond
&&
1641 hashmap_isempty(link
->network
->stacked_netdevs
))
1642 return link_joined(link
);
1644 if (link
->network
->bond
) {
1645 log_struct(LOG_DEBUG
,
1646 LOG_LINK_INTERFACE(link
),
1647 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1648 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bond
->ifname
),
1651 r
= netdev_join(link
->network
->bond
, link
, netdev_join_handler
);
1653 log_struct_errno(LOG_WARNING
, r
,
1654 LOG_LINK_INTERFACE(link
),
1655 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1656 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bond
->ifname
),
1659 link_enter_failed(link
);
1666 if (link
->network
->bridge
) {
1667 log_struct(LOG_DEBUG
,
1668 LOG_LINK_INTERFACE(link
),
1669 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1670 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bridge
->ifname
),
1673 r
= netdev_join(link
->network
->bridge
, link
, netdev_join_handler
);
1675 log_struct_errno(LOG_WARNING
, r
,
1676 LOG_LINK_INTERFACE(link
),
1677 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1678 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bridge
->ifname
),
1680 link_enter_failed(link
);
1687 HASHMAP_FOREACH(netdev
, link
->network
->stacked_netdevs
, i
) {
1689 log_struct(LOG_DEBUG
,
1690 LOG_LINK_INTERFACE(link
),
1691 LOG_NETDEV_INTERFACE(netdev
),
1692 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", netdev
->ifname
),
1695 r
= netdev_join(netdev
, link
, netdev_join_handler
);
1697 log_struct_errno(LOG_WARNING
, r
,
1698 LOG_LINK_INTERFACE(link
),
1699 LOG_NETDEV_INTERFACE(netdev
),
1700 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", netdev
->ifname
),
1702 link_enter_failed(link
);
1712 static int link_set_ipv4_forward(Link
*link
) {
1713 const char *p
= NULL
, *v
;
1716 if (link
->flags
& IFF_LOOPBACK
)
1719 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1722 p
= strjoina("/proc/sys/net/ipv4/conf/", link
->ifname
, "/forwarding");
1723 v
= one_zero(link_ipv4_forward_enabled(link
));
1725 r
= write_string_file(p
, v
, 0);
1727 /* If the right value is set anyway, don't complain */
1728 if (verify_one_line_file(p
, v
) > 0)
1731 log_link_warning_errno(link
, r
, "Cannot configure IPv4 forwarding for interface %s: %m", link
->ifname
);
1737 static int link_set_ipv6_forward(Link
*link
) {
1738 const char *p
= NULL
, *v
= NULL
;
1741 /* Make this a NOP if IPv6 is not available */
1742 if (!socket_ipv6_is_supported())
1745 if (link
->flags
& IFF_LOOPBACK
)
1748 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1751 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/forwarding");
1752 v
= one_zero(link_ipv6_forward_enabled(link
));
1754 r
= write_string_file(p
, v
, 0);
1756 /* If the right value is set anyway, don't complain */
1757 if (verify_one_line_file(p
, v
) > 0)
1760 log_link_warning_errno(link
, r
, "Cannot configure IPv6 forwarding for interface: %m");
1766 static int link_set_ipv6_privacy_extensions(Link
*link
) {
1767 char buf
[DECIMAL_STR_MAX(unsigned) + 1];
1768 IPv6PrivacyExtensions s
;
1769 const char *p
= NULL
;
1772 /* Make this a NOP if IPv6 is not available */
1773 if (!socket_ipv6_is_supported())
1776 s
= link_ipv6_privacy_extensions(link
);
1777 if (s
== _IPV6_PRIVACY_EXTENSIONS_INVALID
)
1780 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/use_tempaddr");
1781 xsprintf(buf
, "%u", link
->network
->ipv6_privacy_extensions
);
1783 r
= write_string_file(p
, buf
, 0);
1785 /* If the right value is set anyway, don't complain */
1786 if (verify_one_line_file(p
, buf
) > 0)
1789 log_link_warning_errno(link
, r
, "Cannot configure IPv6 privacy extension for interface: %m");
1795 static int link_set_ipv6_accept_ra(Link
*link
) {
1796 const char *p
= NULL
, *v
= NULL
;
1800 /* Make this a NOP if IPv6 is not available */
1801 if (!socket_ipv6_is_supported())
1804 if (link
->flags
& IFF_LOOPBACK
)
1807 /* if unset check the ip forwarding setting maintained for the interface
1808 * and then set it to depending on that. enabled if local forwarding
1809 * is disabled. disabled if local forwarding is enabled.
1811 if (link
->network
->ipv6_accept_ra
< 0) {
1812 if (IN_SET(link
->network
->ip_forward
, ADDRESS_FAMILY_YES
, ADDRESS_FAMILY_IPV6
))
1817 b
= link
->network
->ipv6_accept_ra
;
1819 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/accept_ra");
1822 r
= write_string_file(p
, v
, 0);
1824 /* If the right value is set anyway, don't complain */
1825 if (verify_one_line_file(p
, v
) > 0)
1828 log_link_warning_errno(link
, r
, "Cannot configure IPv6 accept_ra for interface: %m");
1834 static int link_configure(Link
*link
) {
1838 assert(link
->network
);
1839 assert(link
->state
== LINK_STATE_PENDING
);
1841 r
= link_set_bridge_fdb(link
);
1845 r
= link_set_ipv4_forward(link
);
1849 r
= link_set_ipv6_forward(link
);
1853 r
= link_set_ipv6_privacy_extensions(link
);
1857 r
= link_set_ipv6_accept_ra(link
);
1861 if (link_ipv4ll_enabled(link
)) {
1862 r
= ipv4ll_configure(link
);
1867 if (link_dhcp4_enabled(link
)) {
1868 r
= dhcp4_configure(link
);
1873 if (link_dhcp4_server_enabled(link
)) {
1874 r
= sd_dhcp_server_new(&link
->dhcp_server
, link
->ifindex
);
1878 r
= sd_dhcp_server_attach_event(link
->dhcp_server
, NULL
, 0);
1883 if (link_dhcp6_enabled(link
)) {
1884 r
= icmp6_configure(link
);
1889 if (link_lldp_enabled(link
)) {
1890 r
= sd_lldp_new(link
->ifindex
, link
->ifname
, &link
->mac
, &link
->lldp
);
1894 r
= sd_lldp_attach_event(link
->lldp
, NULL
, 0);
1898 r
= sd_lldp_set_callback(link
->lldp
,
1899 lldp_handler
, link
);
1904 if (link_has_carrier(link
)) {
1905 r
= link_acquire_conf(link
);
1910 return link_enter_join_netdev(link
);
1913 static int link_initialized_and_synced(sd_netlink
*rtnl
, sd_netlink_message
*m
,
1915 _cleanup_link_unref_ Link
*link
= userdata
;
1920 assert(link
->ifname
);
1921 assert(link
->manager
);
1923 if (link
->state
!= LINK_STATE_PENDING
)
1926 log_link_debug(link
, "Link state is up-to-date");
1928 r
= link_new_bound_by_list(link
);
1932 r
= link_handle_bound_by_list(link
);
1936 r
= network_get(link
->manager
, link
->udev_device
, link
->ifname
,
1937 &link
->mac
, &network
);
1939 link_enter_unmanaged(link
);
1944 if (link
->flags
& IFF_LOOPBACK
) {
1945 if (network
->link_local
!= ADDRESS_FAMILY_NO
)
1946 log_link_debug(link
, "Ignoring link-local autoconfiguration for loopback link");
1948 if (network
->dhcp
!= ADDRESS_FAMILY_NO
)
1949 log_link_debug(link
, "Ignoring DHCP clients for loopback link");
1951 if (network
->dhcp_server
)
1952 log_link_debug(link
, "Ignoring DHCP server for loopback link");
1955 r
= network_apply(link
->manager
, network
, link
);
1959 r
= link_new_bound_to_list(link
);
1963 r
= link_configure(link
);
1970 int link_initialized(Link
*link
, struct udev_device
*device
) {
1971 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1975 assert(link
->manager
);
1976 assert(link
->manager
->rtnl
);
1979 if (link
->state
!= LINK_STATE_PENDING
)
1982 if (link
->udev_device
)
1985 log_link_debug(link
, "udev initialized link");
1987 link
->udev_device
= udev_device_ref(device
);
1989 /* udev has initialized the link, but we don't know if we have yet
1990 * processed the NEWLINK messages with the latest state. Do a GETLINK,
1991 * when it returns we know that the pending NEWLINKs have already been
1992 * processed and that we are up-to-date */
1994 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_GETLINK
,
1999 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
,
2000 link_initialized_and_synced
, link
, 0, NULL
);
2009 static Address
* link_get_equal_address(Link
*link
, Address
*needle
) {
2015 LIST_FOREACH(addresses
, i
, link
->addresses
)
2016 if (address_equal(i
, needle
))
2022 int link_rtnl_process_address(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
2023 Manager
*m
= userdata
;
2026 _cleanup_address_free_ Address
*address
= NULL
;
2027 unsigned char flags
;
2029 char buf
[INET6_ADDRSTRLEN
], valid_buf
[FORMAT_TIMESPAN_MAX
];
2030 const char *valid_str
= NULL
;
2037 if (sd_netlink_message_is_error(message
)) {
2038 r
= sd_netlink_message_get_errno(message
);
2040 log_warning_errno(r
, "rtnl: failed to receive address: %m");
2045 r
= sd_netlink_message_get_type(message
, &type
);
2047 log_warning_errno(r
, "rtnl: could not get message type: %m");
2049 } else if (type
!= RTM_NEWADDR
&& type
!= RTM_DELADDR
) {
2050 log_warning("rtnl: received unexpected message type when processing address");
2054 r
= sd_rtnl_message_addr_get_ifindex(message
, &ifindex
);
2056 log_warning_errno(r
, "rtnl: could not get ifindex from address: %m");
2058 } else if (ifindex
<= 0) {
2059 log_warning("rtnl: received address message with invalid ifindex: %d", ifindex
);
2062 r
= link_get(m
, ifindex
, &link
);
2063 if (r
< 0 || !link
) {
2064 /* when enumerating we might be out of sync, but we will
2065 * get the address again, so just ignore it */
2066 if (!m
->enumerating
)
2067 log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex
);
2072 r
= address_new_dynamic(&address
);
2076 r
= sd_rtnl_message_addr_get_family(message
, &address
->family
);
2077 if (r
< 0 || !IN_SET(address
->family
, AF_INET
, AF_INET6
)) {
2078 log_link_warning(link
, "rtnl: received address with invalid family, ignoring.");
2082 r
= sd_rtnl_message_addr_get_prefixlen(message
, &address
->prefixlen
);
2084 log_link_warning_errno(link
, r
, "rtnl: received address with invalid prefixlen, ignoring: %m");
2088 r
= sd_rtnl_message_addr_get_scope(message
, &address
->scope
);
2090 log_link_warning_errno(link
, r
, "rtnl: received address with invalid scope, ignoring: %m");
2094 r
= sd_rtnl_message_addr_get_flags(message
, &flags
);
2096 log_link_warning_errno(link
, r
, "rtnl: received address with invalid flags, ignoring: %m");
2099 address
->flags
= flags
;
2101 switch (address
->family
) {
2103 r
= sd_netlink_message_read_in_addr(message
, IFA_LOCAL
, &address
->in_addr
.in
);
2105 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
2112 r
= sd_netlink_message_read_in6_addr(message
, IFA_ADDRESS
, &address
->in_addr
.in6
);
2114 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
2121 assert_not_reached("invalid address family");
2124 if (!inet_ntop(address
->family
, &address
->in_addr
, buf
, INET6_ADDRSTRLEN
)) {
2125 log_link_warning(link
, "Could not print address");
2129 r
= sd_netlink_message_read_cache_info(message
, IFA_CACHEINFO
, &address
->cinfo
);
2131 if (address
->cinfo
.ifa_valid
== CACHE_INFO_INFINITY_LIFE_TIME
)
2134 valid_str
= format_timespan(valid_buf
, FORMAT_TIMESPAN_MAX
,
2135 address
->cinfo
.ifa_valid
* USEC_PER_SEC
,
2139 existing
= link_get_equal_address(link
, address
);
2144 log_link_debug(link
, "Updating address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
2147 existing
->scope
= address
->scope
;
2148 existing
->flags
= address
->flags
;
2149 existing
->cinfo
= address
->cinfo
;
2152 log_link_debug(link
, "Adding address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
2154 LIST_PREPEND(addresses
, link
->addresses
, address
);
2155 address_establish(address
, link
);
2167 log_link_debug(link
, "Removing address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
2168 address_release(existing
, link
);
2169 LIST_REMOVE(addresses
, link
->addresses
, existing
);
2170 address_free(existing
);
2172 log_link_warning(link
, "Removing non-existent address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
2176 assert_not_reached("Received invalid RTNL message type");
2182 int link_add(Manager
*m
, sd_netlink_message
*message
, Link
**ret
) {
2184 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
2185 char ifindex_str
[2 + DECIMAL_STR_MAX(int)];
2193 r
= link_new(m
, message
, ret
);
2199 log_link_debug(link
, "Link %d added", link
->ifindex
);
2201 if (detect_container() <= 0) {
2202 /* not in a container, udev will be around */
2203 sprintf(ifindex_str
, "n%d", link
->ifindex
);
2204 device
= udev_device_new_from_device_id(m
->udev
, ifindex_str
);
2206 return log_link_warning_errno(link
, errno
, "Could not find udev device: %m");
2208 if (udev_device_get_is_initialized(device
) <= 0) {
2210 log_link_debug(link
, "link pending udev initialization...");
2214 r
= link_initialized(link
, device
);
2218 /* we are calling a callback directly, so must take a ref */
2221 r
= link_initialized_and_synced(m
->rtnl
, NULL
, link
);
2229 static int link_carrier_gained(Link
*link
) {
2234 if (link
->network
) {
2235 r
= link_acquire_conf(link
);
2237 link_enter_failed(link
);
2242 r
= link_handle_bound_by_list(link
);
2249 static int link_carrier_lost(Link
*link
) {
2254 r
= link_stop_clients(link
);
2256 link_enter_failed(link
);
2260 r
= link_handle_bound_by_list(link
);
2267 int link_carrier_reset(Link
*link
) {
2272 if (link_has_carrier(link
)) {
2273 r
= link_carrier_lost(link
);
2277 r
= link_carrier_gained(link
);
2281 log_link_info(link
, "Reset carrier");
2288 int link_update(Link
*link
, sd_netlink_message
*m
) {
2289 struct ether_addr mac
;
2292 bool had_carrier
, carrier_gained
, carrier_lost
;
2296 assert(link
->ifname
);
2299 if (link
->state
== LINK_STATE_LINGER
) {
2301 log_link_info(link
, "Link readded");
2302 link_set_state(link
, LINK_STATE_ENSLAVING
);
2304 r
= link_new_carrier_maps(link
);
2309 r
= sd_netlink_message_read_string(m
, IFLA_IFNAME
, &ifname
);
2310 if (r
>= 0 && !streq(ifname
, link
->ifname
)) {
2311 log_link_info(link
, "Renamed to %s", ifname
);
2313 link_free_carrier_maps(link
);
2315 r
= free_and_strdup(&link
->ifname
, ifname
);
2319 r
= link_new_carrier_maps(link
);
2324 r
= sd_netlink_message_read_u32(m
, IFLA_MTU
, &mtu
);
2325 if (r
>= 0 && mtu
> 0) {
2327 if (!link
->original_mtu
) {
2328 link
->original_mtu
= mtu
;
2329 log_link_debug(link
, "Saved original MTU: %" PRIu32
, link
->original_mtu
);
2332 if (link
->dhcp_client
) {
2333 r
= sd_dhcp_client_set_mtu(link
->dhcp_client
,
2336 log_link_warning_errno(link
, r
, "Could not update MTU in DHCP client: %m");
2342 /* The kernel may broadcast NEWLINK messages without the MAC address
2343 set, simply ignore them. */
2344 r
= sd_netlink_message_read_ether_addr(m
, IFLA_ADDRESS
, &mac
);
2346 if (memcmp(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2349 memcpy(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2352 log_link_debug(link
, "MAC address: "
2353 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2354 mac
.ether_addr_octet
[0],
2355 mac
.ether_addr_octet
[1],
2356 mac
.ether_addr_octet
[2],
2357 mac
.ether_addr_octet
[3],
2358 mac
.ether_addr_octet
[4],
2359 mac
.ether_addr_octet
[5]);
2362 r
= sd_ipv4ll_set_mac(link
->ipv4ll
, &link
->mac
);
2364 return log_link_warning_errno(link
, r
, "Could not update MAC address in IPv4LL client: %m");
2367 if (link
->dhcp_client
) {
2368 r
= sd_dhcp_client_set_mac(link
->dhcp_client
,
2369 (const uint8_t *) &link
->mac
,
2373 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCP client: %m");
2376 if (link
->dhcp6_client
) {
2377 r
= sd_dhcp6_client_set_mac(link
->dhcp6_client
,
2378 (const uint8_t *) &link
->mac
,
2382 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCPv6 client: %m");
2387 had_carrier
= link_has_carrier(link
);
2389 r
= link_update_flags(link
, m
);
2393 carrier_gained
= !had_carrier
&& link_has_carrier(link
);
2394 carrier_lost
= had_carrier
&& !link_has_carrier(link
);
2396 if (carrier_gained
) {
2397 log_link_info(link
, "Gained carrier");
2399 r
= link_carrier_gained(link
);
2402 } else if (carrier_lost
) {
2403 log_link_info(link
, "Lost carrier");
2405 r
= link_carrier_lost(link
);
2414 static void link_update_operstate(Link
*link
) {
2415 LinkOperationalState operstate
;
2418 if (link
->kernel_operstate
== IF_OPER_DORMANT
)
2419 operstate
= LINK_OPERSTATE_DORMANT
;
2420 else if (link_has_carrier(link
)) {
2422 uint8_t scope
= RT_SCOPE_NOWHERE
;
2424 /* if we have carrier, check what addresses we have */
2425 LIST_FOREACH(addresses
, address
, link
->addresses
) {
2426 if (address
->flags
& (IFA_F_TENTATIVE
| IFA_F_DEPRECATED
))
2429 if (address
->scope
< scope
)
2430 scope
= address
->scope
;
2433 if (scope
< RT_SCOPE_SITE
)
2434 /* universally accessible addresses found */
2435 operstate
= LINK_OPERSTATE_ROUTABLE
;
2436 else if (scope
< RT_SCOPE_HOST
)
2437 /* only link or site local addresses found */
2438 operstate
= LINK_OPERSTATE_DEGRADED
;
2440 /* no useful addresses found */
2441 operstate
= LINK_OPERSTATE_CARRIER
;
2442 } else if (link
->flags
& IFF_UP
)
2443 operstate
= LINK_OPERSTATE_NO_CARRIER
;
2445 operstate
= LINK_OPERSTATE_OFF
;
2447 if (link
->operstate
!= operstate
) {
2448 link
->operstate
= operstate
;
2449 link_send_changed(link
, "OperationalState", NULL
);
2453 int link_save(Link
*link
) {
2454 _cleanup_free_
char *temp_path
= NULL
;
2455 _cleanup_fclose_
FILE *f
= NULL
;
2456 const char *admin_state
, *oper_state
;
2460 assert(link
->state_file
);
2461 assert(link
->lease_file
);
2462 assert(link
->manager
);
2464 link_update_operstate(link
);
2466 r
= manager_save(link
->manager
);
2470 if (link
->state
== LINK_STATE_LINGER
) {
2471 unlink(link
->state_file
);
2475 admin_state
= link_state_to_string(link
->state
);
2476 assert(admin_state
);
2478 oper_state
= link_operstate_to_string(link
->operstate
);
2481 r
= fopen_temporary(link
->state_file
, &f
, &temp_path
);
2485 fchmod(fileno(f
), 0644);
2488 "# This is private data. Do not parse.\n"
2491 admin_state
, oper_state
);
2493 if (link
->network
) {
2494 char **address
, **domain
;
2496 sd_dhcp6_lease
*dhcp6_lease
= NULL
;
2498 if (link
->dhcp6_client
) {
2499 r
= sd_dhcp6_client_get_lease(link
->dhcp6_client
,
2502 log_link_debug(link
, "No DHCPv6 lease");
2505 fprintf(f
, "NETWORK_FILE=%s\n", link
->network
->filename
);
2509 STRV_FOREACH(address
, link
->network
->dns
) {
2516 if (link
->network
->dhcp_dns
&&
2518 const struct in_addr
*addresses
;
2520 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
2524 serialize_in_addrs(f
, addresses
, r
);
2529 if (link
->network
->dhcp_dns
&& dhcp6_lease
) {
2530 struct in6_addr
*in6_addrs
;
2532 r
= sd_dhcp6_lease_get_dns(dhcp6_lease
, &in6_addrs
);
2536 serialize_in6_addrs(f
, in6_addrs
, r
);
2545 STRV_FOREACH(address
, link
->network
->ntp
) {
2552 if (link
->network
->dhcp_ntp
&&
2554 const struct in_addr
*addresses
;
2556 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
2560 serialize_in_addrs(f
, addresses
, r
);
2565 if (link
->network
->dhcp_ntp
&& dhcp6_lease
) {
2566 struct in6_addr
*in6_addrs
;
2570 r
= sd_dhcp6_lease_get_ntp_addrs(dhcp6_lease
,
2575 serialize_in6_addrs(f
, in6_addrs
, r
);
2579 r
= sd_dhcp6_lease_get_ntp_fqdn(dhcp6_lease
, &hosts
);
2581 STRV_FOREACH(hostname
, hosts
) {
2584 fputs(*hostname
, f
);
2592 fprintf(f
, "DOMAINS=");
2594 STRV_FOREACH(domain
, link
->network
->domains
) {
2601 if (link
->network
->dhcp_domains
&&
2603 const char *domainname
;
2605 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
2609 fputs(domainname
, f
);
2614 if (link
->network
->dhcp_domains
&& dhcp6_lease
) {
2617 r
= sd_dhcp6_lease_get_domains(dhcp6_lease
, &domains
);
2619 STRV_FOREACH(domain
, domains
) {
2630 fprintf(f
, "WILDCARD_DOMAIN=%s\n",
2631 yes_no(link
->network
->wildcard_domain
));
2633 fprintf(f
, "LLMNR=%s\n",
2634 resolve_support_to_string(link
->network
->llmnr
));
2637 if (!hashmap_isempty(link
->bound_to_links
)) {
2642 fputs("CARRIER_BOUND_TO=", f
);
2643 HASHMAP_FOREACH(carrier
, link
->bound_to_links
, i
) {
2646 fputs(carrier
->ifname
, f
);
2653 if (!hashmap_isempty(link
->bound_by_links
)) {
2658 fputs("CARRIER_BOUND_BY=", f
);
2659 HASHMAP_FOREACH(carrier
, link
->bound_by_links
, i
) {
2662 fputs(carrier
->ifname
, f
);
2669 if (link
->dhcp_lease
) {
2670 const char *tz
= NULL
;
2672 r
= sd_dhcp_lease_get_timezone(link
->dhcp_lease
, &tz
);
2674 fprintf(f
, "TIMEZONE=%s\n", tz
);
2677 if (link
->dhcp_lease
) {
2678 assert(link
->network
);
2680 r
= dhcp_lease_save(link
->dhcp_lease
, link
->lease_file
);
2688 unlink(link
->lease_file
);
2691 assert(link
->network
);
2693 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
2701 unlink(link
->lldp_file
);
2703 r
= fflush_and_check(f
);
2707 if (rename(temp_path
, link
->state_file
) < 0) {
2715 (void) unlink(link
->state_file
);
2717 (void) unlink(temp_path
);
2719 return log_link_error_errno(link
, r
, "Failed to save link data to %s: %m", link
->state_file
);
2722 static const char* const link_state_table
[_LINK_STATE_MAX
] = {
2723 [LINK_STATE_PENDING
] = "pending",
2724 [LINK_STATE_ENSLAVING
] = "configuring",
2725 [LINK_STATE_SETTING_ADDRESSES
] = "configuring",
2726 [LINK_STATE_SETTING_ROUTES
] = "configuring",
2727 [LINK_STATE_CONFIGURED
] = "configured",
2728 [LINK_STATE_UNMANAGED
] = "unmanaged",
2729 [LINK_STATE_FAILED
] = "failed",
2730 [LINK_STATE_LINGER
] = "linger",
2733 DEFINE_STRING_TABLE_LOOKUP(link_state
, LinkState
);
2735 static const char* const link_operstate_table
[_LINK_OPERSTATE_MAX
] = {
2736 [LINK_OPERSTATE_OFF
] = "off",
2737 [LINK_OPERSTATE_NO_CARRIER
] = "no-carrier",
2738 [LINK_OPERSTATE_DORMANT
] = "dormant",
2739 [LINK_OPERSTATE_CARRIER
] = "carrier",
2740 [LINK_OPERSTATE_DEGRADED
] = "degraded",
2741 [LINK_OPERSTATE_ROUTABLE
] = "routable",
2744 DEFINE_STRING_TABLE_LOOKUP(link_operstate
, LinkOperationalState
);