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>
27 #include "dhcp-lease-internal.h"
29 #include "netlink-util.h"
30 #include "network-internal.h"
32 #include "socket-util.h"
33 #include "udev-util.h"
37 #include "networkd-link.h"
38 #include "networkd-netdev.h"
40 bool link_dhcp6_enabled(Link
*link
) {
41 if (link
->flags
& IFF_LOOPBACK
)
47 return link
->network
->dhcp
& ADDRESS_FAMILY_IPV6
;
50 bool link_dhcp4_enabled(Link
*link
) {
51 if (link
->flags
& IFF_LOOPBACK
)
57 return link
->network
->dhcp
& ADDRESS_FAMILY_IPV4
;
60 bool link_dhcp4_server_enabled(Link
*link
) {
61 if (link
->flags
& IFF_LOOPBACK
)
67 return link
->network
->dhcp_server
;
70 bool link_ipv4ll_enabled(Link
*link
) {
71 if (link
->flags
& IFF_LOOPBACK
)
77 return link
->network
->link_local
& ADDRESS_FAMILY_IPV4
;
80 bool link_ipv6ll_enabled(Link
*link
) {
81 if (link
->flags
& IFF_LOOPBACK
)
87 return link
->network
->link_local
& ADDRESS_FAMILY_IPV6
;
90 bool link_lldp_enabled(Link
*link
) {
91 if (link
->flags
& IFF_LOOPBACK
)
97 if (link
->network
->bridge
)
100 return link
->network
->lldp
;
103 static bool link_ipv4_forward_enabled(Link
*link
) {
104 if (link
->flags
& IFF_LOOPBACK
)
110 return link
->network
->ip_forward
& ADDRESS_FAMILY_IPV4
;
113 static bool link_ipv6_forward_enabled(Link
*link
) {
114 if (link
->flags
& IFF_LOOPBACK
)
120 return link
->network
->ip_forward
& ADDRESS_FAMILY_IPV6
;
123 static IPv6PrivacyExtensions
link_ipv6_privacy_extensions(Link
*link
) {
124 if (link
->flags
& IFF_LOOPBACK
)
125 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
128 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
130 return link
->network
->ipv6_privacy_extensions
;
133 #define FLAG_STRING(string, flag, old, new) \
134 (((old ^ new) & flag) \
135 ? ((old & flag) ? (" -" string) : (" +" string)) \
138 static int link_update_flags(Link
*link
, sd_netlink_message
*m
) {
139 unsigned flags
, unknown_flags_added
, unknown_flags_removed
, unknown_flags
;
145 r
= sd_rtnl_message_link_get_flags(m
, &flags
);
147 return log_link_warning_errno(link
, r
, "Could not get link flags: %m");
149 r
= sd_netlink_message_read_u8(m
, IFLA_OPERSTATE
, &operstate
);
151 /* if we got a message without operstate, take it to mean
152 the state was unchanged */
153 operstate
= link
->kernel_operstate
;
155 if ((link
->flags
== flags
) && (link
->kernel_operstate
== operstate
))
158 if (link
->flags
!= flags
) {
159 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",
160 FLAG_STRING("LOOPBACK", IFF_LOOPBACK
, link
->flags
, flags
),
161 FLAG_STRING("MASTER", IFF_MASTER
, link
->flags
, flags
),
162 FLAG_STRING("SLAVE", IFF_SLAVE
, link
->flags
, flags
),
163 FLAG_STRING("UP", IFF_UP
, link
->flags
, flags
),
164 FLAG_STRING("DORMANT", IFF_DORMANT
, link
->flags
, flags
),
165 FLAG_STRING("LOWER_UP", IFF_LOWER_UP
, link
->flags
, flags
),
166 FLAG_STRING("RUNNING", IFF_RUNNING
, link
->flags
, flags
),
167 FLAG_STRING("MULTICAST", IFF_MULTICAST
, link
->flags
, flags
),
168 FLAG_STRING("BROADCAST", IFF_BROADCAST
, link
->flags
, flags
),
169 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT
, link
->flags
, flags
),
170 FLAG_STRING("PROMISC", IFF_PROMISC
, link
->flags
, flags
),
171 FLAG_STRING("ALLMULTI", IFF_ALLMULTI
, link
->flags
, flags
),
172 FLAG_STRING("PORTSEL", IFF_PORTSEL
, link
->flags
, flags
),
173 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA
, link
->flags
, flags
),
174 FLAG_STRING("DYNAMIC", IFF_DYNAMIC
, link
->flags
, flags
),
175 FLAG_STRING("NOARP", IFF_NOARP
, link
->flags
, flags
),
176 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS
, link
->flags
, flags
),
177 FLAG_STRING("DEBUG", IFF_DEBUG
, link
->flags
, flags
),
178 FLAG_STRING("ECHO", IFF_ECHO
, link
->flags
, flags
));
180 unknown_flags
= ~(IFF_LOOPBACK
| IFF_MASTER
| IFF_SLAVE
| IFF_UP
|
181 IFF_DORMANT
| IFF_LOWER_UP
| IFF_RUNNING
|
182 IFF_MULTICAST
| IFF_BROADCAST
| IFF_POINTOPOINT
|
183 IFF_PROMISC
| IFF_ALLMULTI
| IFF_PORTSEL
|
184 IFF_AUTOMEDIA
| IFF_DYNAMIC
| IFF_NOARP
|
185 IFF_NOTRAILERS
| IFF_DEBUG
| IFF_ECHO
);
186 unknown_flags_added
= ((link
->flags
^ flags
) & flags
& unknown_flags
);
187 unknown_flags_removed
= ((link
->flags
^ flags
) & link
->flags
& unknown_flags
);
189 /* link flags are currently at most 18 bits, let's align to
191 if (unknown_flags_added
)
193 "Unknown link flags gained: %#.5x (ignoring)",
194 unknown_flags_added
);
196 if (unknown_flags_removed
)
198 "Unknown link flags lost: %#.5x (ignoring)",
199 unknown_flags_removed
);
203 link
->kernel_operstate
= operstate
;
210 static int link_new(Manager
*manager
, sd_netlink_message
*message
, Link
**ret
) {
211 _cleanup_link_unref_ Link
*link
= NULL
;
220 r
= sd_netlink_message_get_type(message
, &type
);
223 else if (type
!= RTM_NEWLINK
)
226 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
229 else if (ifindex
<= 0)
232 r
= sd_netlink_message_read_string(message
, IFLA_IFNAME
, &ifname
);
236 link
= new0(Link
, 1);
241 link
->manager
= manager
;
242 link
->state
= LINK_STATE_PENDING
;
243 link
->rtnl_extended_attrs
= true;
244 link
->ifindex
= ifindex
;
245 link
->ifname
= strdup(ifname
);
249 r
= sd_netlink_message_read_ether_addr(message
, IFLA_ADDRESS
, &link
->mac
);
251 log_link_debug(link
, "MAC address not found for new device, continuing without");
253 r
= asprintf(&link
->state_file
, "/run/systemd/netif/links/%d",
258 r
= asprintf(&link
->lease_file
, "/run/systemd/netif/leases/%d",
263 r
= asprintf(&link
->lldp_file
, "/run/systemd/netif/lldp/%d",
269 r
= hashmap_ensure_allocated(&manager
->links
, NULL
);
273 r
= hashmap_put(manager
->links
, INT_TO_PTR(link
->ifindex
), link
);
277 r
= link_update_flags(link
, message
);
287 static void link_free(Link
*link
) {
295 while (!set_isempty(link
->addresses
))
296 address_free(set_first(link
->addresses
));
298 set_free(link
->addresses
);
300 while ((address
= link
->pool_addresses
)) {
301 LIST_REMOVE(addresses
, link
->pool_addresses
, address
);
302 address_free(address
);
305 sd_dhcp_server_unref(link
->dhcp_server
);
306 sd_dhcp_client_unref(link
->dhcp_client
);
307 sd_dhcp_lease_unref(link
->dhcp_lease
);
309 free(link
->lease_file
);
311 sd_lldp_free(link
->lldp
);
313 free(link
->lldp_file
);
315 sd_ipv4ll_unref(link
->ipv4ll
);
316 sd_dhcp6_client_unref(link
->dhcp6_client
);
317 sd_icmp6_nd_unref(link
->icmp6_router_discovery
);
320 hashmap_remove(link
->manager
->links
, INT_TO_PTR(link
->ifindex
));
324 free(link
->state_file
);
326 udev_device_unref(link
->udev_device
);
328 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
)
329 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(carrier
->ifindex
));
330 hashmap_free(link
->bound_to_links
);
332 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
)
333 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(carrier
->ifindex
));
334 hashmap_free(link
->bound_by_links
);
339 Link
*link_unref(Link
*link
) {
343 assert(link
->n_ref
> 0);
355 Link
*link_ref(Link
*link
) {
359 assert(link
->n_ref
> 0);
366 int link_get(Manager
*m
, int ifindex
, Link
**ret
) {
373 link
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
382 static void link_set_state(Link
*link
, LinkState state
) {
385 if (link
->state
== state
)
390 link_send_changed(link
, "AdministrativeState", NULL
);
395 static void link_enter_unmanaged(Link
*link
) {
398 log_link_debug(link
, "Unmanaged");
400 link_set_state(link
, LINK_STATE_UNMANAGED
);
405 static int link_stop_clients(Link
*link
) {
409 assert(link
->manager
);
410 assert(link
->manager
->event
);
415 if (link
->dhcp_client
) {
416 k
= sd_dhcp_client_stop(link
->dhcp_client
);
418 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv4 client: %m");
422 k
= sd_ipv4ll_stop(link
->ipv4ll
);
424 r
= log_link_warning_errno(link
, r
, "Could not stop IPv4 link-local: %m");
427 if(link
->icmp6_router_discovery
) {
428 if (link
->dhcp6_client
) {
429 k
= sd_dhcp6_client_stop(link
->dhcp6_client
);
431 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv6 client: %m");
434 k
= sd_icmp6_nd_stop(link
->icmp6_router_discovery
);
436 r
= log_link_warning_errno(link
, r
, "Could not stop ICMPv6 router discovery: %m");
440 k
= sd_lldp_stop(link
->lldp
);
442 r
= log_link_warning_errno(link
, r
, "Could not stop LLDP: %m");
448 void link_enter_failed(Link
*link
) {
451 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
454 log_link_warning(link
, "Failed");
456 link_set_state(link
, LINK_STATE_FAILED
);
458 link_stop_clients(link
);
463 static Address
* link_find_dhcp_server_address(Link
*link
) {
467 assert(link
->network
);
469 /* The first statically configured address if there is any */
470 LIST_FOREACH(addresses
, address
, link
->network
->static_addresses
) {
472 if (address
->family
!= AF_INET
)
475 if (in_addr_is_null(address
->family
, &address
->in_addr
))
481 /* If that didn't work, find a suitable address we got from the pool */
482 LIST_FOREACH(addresses
, address
, link
->pool_addresses
) {
483 if (address
->family
!= AF_INET
)
492 static int link_enter_configured(Link
*link
) {
494 assert(link
->network
);
495 assert(link
->state
== LINK_STATE_SETTING_ROUTES
);
497 log_link_info(link
, "Configured");
499 link_set_state(link
, LINK_STATE_CONFIGURED
);
506 void link_client_handler(Link
*link
) {
508 assert(link
->network
);
510 if (!link
->static_configured
)
513 if (link_ipv4ll_enabled(link
))
514 if (!link
->ipv4ll_address
||
518 if ((link_dhcp4_enabled(link
) && !link_dhcp6_enabled(link
) &&
519 !link
->dhcp4_configured
) ||
520 (link_dhcp6_enabled(link
) && !link_dhcp4_enabled(link
) &&
521 !link
->dhcp6_configured
) ||
522 (link_dhcp4_enabled(link
) && link_dhcp6_enabled(link
) &&
523 !link
->dhcp4_configured
&& !link
->dhcp6_configured
))
526 if (link
->state
!= LINK_STATE_CONFIGURED
)
527 link_enter_configured(link
);
532 static int route_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
533 _cleanup_link_unref_ Link
*link
= userdata
;
536 assert(link
->link_messages
> 0);
537 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
538 LINK_STATE_SETTING_ROUTES
, LINK_STATE_FAILED
,
541 link
->link_messages
--;
543 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
546 r
= sd_netlink_message_get_errno(m
);
547 if (r
< 0 && r
!= -EEXIST
)
548 log_link_warning_errno(link
, r
, "Could not set route: %m");
550 if (link
->link_messages
== 0) {
551 log_link_debug(link
, "Routes set");
552 link
->static_configured
= true;
553 link_client_handler(link
);
559 static int link_enter_set_routes(Link
*link
) {
564 assert(link
->network
);
565 assert(link
->state
== LINK_STATE_SETTING_ADDRESSES
);
567 link_set_state(link
, LINK_STATE_SETTING_ROUTES
);
569 LIST_FOREACH(routes
, rt
, link
->network
->static_routes
) {
570 r
= route_configure(rt
, link
, &route_handler
);
572 log_link_warning_errno(link
, r
, "Could not set routes: %m");
573 link_enter_failed(link
);
577 link
->link_messages
++;
580 if (link
->link_messages
== 0) {
581 link
->static_configured
= true;
582 link_client_handler(link
);
584 log_link_debug(link
, "Setting routes");
589 int link_route_remove_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
590 _cleanup_link_unref_ Link
*link
= userdata
;
595 assert(link
->ifname
);
597 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
600 r
= sd_netlink_message_get_errno(m
);
601 if (r
< 0 && r
!= -ESRCH
)
602 log_link_warning_errno(link
, r
, "Could not drop route: %m");
607 static int address_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
608 _cleanup_link_unref_ Link
*link
= userdata
;
614 assert(link
->ifname
);
615 assert(link
->link_messages
> 0);
616 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
617 LINK_STATE_FAILED
, LINK_STATE_LINGER
));
619 link
->link_messages
--;
621 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
624 r
= sd_netlink_message_get_errno(m
);
625 if (r
< 0 && r
!= -EEXIST
)
626 log_link_warning_errno(link
, r
, "could not set address: %m");
628 manager_rtnl_process_address(rtnl
, m
, link
->manager
);
630 if (link
->link_messages
== 0) {
631 log_link_debug(link
, "Addresses set");
632 link_enter_set_routes(link
);
638 static int link_push_dns_to_dhcp_server(Link
*link
, sd_dhcp_server
*s
) {
639 _cleanup_free_
struct in_addr
*addresses
= NULL
;
640 size_t n_addresses
= 0, n_allocated
= 0;
643 log_debug("Copying DNS server information from %s", link
->ifname
);
648 STRV_FOREACH(a
, link
->network
->dns
) {
651 /* Only look for IPv4 addresses */
652 if (inet_pton(AF_INET
, *a
, &ia
) <= 0)
655 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ 1))
658 addresses
[n_addresses
++] = ia
;
661 if (link
->network
->dhcp_dns
&&
663 const struct in_addr
*da
= NULL
;
666 n
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &da
);
669 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ n
))
672 memcpy(addresses
+ n_addresses
, da
, n
* sizeof(struct in_addr
));
677 if (n_addresses
<= 0)
680 return sd_dhcp_server_set_dns(s
, addresses
, n_addresses
);
683 static int link_push_ntp_to_dhcp_server(Link
*link
, sd_dhcp_server
*s
) {
684 _cleanup_free_
struct in_addr
*addresses
= NULL
;
685 size_t n_addresses
= 0, n_allocated
= 0;
691 log_debug("Copying NTP server information from %s", link
->ifname
);
693 STRV_FOREACH(a
, link
->network
->ntp
) {
696 /* Only look for IPv4 addresses */
697 if (inet_pton(AF_INET
, *a
, &ia
) <= 0)
700 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ 1))
703 addresses
[n_addresses
++] = ia
;
706 if (link
->network
->dhcp_ntp
&&
708 const struct in_addr
*da
= NULL
;
711 n
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &da
);
714 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ n
))
717 memcpy(addresses
+ n_addresses
, da
, n
* sizeof(struct in_addr
));
722 if (n_addresses
<= 0)
725 return sd_dhcp_server_set_ntp(s
, addresses
, n_addresses
);
728 static int link_enter_set_addresses(Link
*link
) {
733 assert(link
->network
);
734 assert(link
->state
!= _LINK_STATE_INVALID
);
736 link_set_state(link
, LINK_STATE_SETTING_ADDRESSES
);
738 LIST_FOREACH(addresses
, ad
, link
->network
->static_addresses
) {
739 r
= address_configure(ad
, link
, &address_handler
);
741 log_link_warning_errno(link
, r
, "Could not set addresses: %m");
742 link_enter_failed(link
);
746 link
->link_messages
++;
749 /* now that we can figure out a default address for the dhcp server,
751 if (link_dhcp4_server_enabled(link
)) {
754 bool acquired_uplink
= false;
756 address
= link_find_dhcp_server_address(link
);
758 log_link_warning(link
, "Failed to find suitable address for DHCPv4 server instance.");
759 link_enter_failed(link
);
763 /* use the server address' subnet as the pool */
764 r
= sd_dhcp_server_configure_pool(link
->dhcp_server
, &address
->in_addr
.in
, address
->prefixlen
,
765 link
->network
->dhcp_server_pool_offset
, link
->network
->dhcp_server_pool_size
);
770 r = sd_dhcp_server_set_router(link->dhcp_server,
771 &main_address->in_addr.in);
776 if (link
->network
->dhcp_server_max_lease_time_usec
> 0) {
777 r
= sd_dhcp_server_set_max_lease_time(
779 DIV_ROUND_UP(link
->network
->dhcp_server_max_lease_time_usec
, USEC_PER_SEC
));
784 if (link
->network
->dhcp_server_default_lease_time_usec
> 0) {
785 r
= sd_dhcp_server_set_default_lease_time(
787 DIV_ROUND_UP(link
->network
->dhcp_server_default_lease_time_usec
, USEC_PER_SEC
));
792 if (link
->network
->dhcp_server_emit_dns
) {
794 if (link
->network
->n_dhcp_server_dns
> 0)
795 r
= sd_dhcp_server_set_dns(link
->dhcp_server
, link
->network
->dhcp_server_dns
, link
->network
->n_dhcp_server_dns
);
797 uplink
= manager_find_uplink(link
->manager
, link
);
798 acquired_uplink
= true;
801 log_link_debug(link
, "Not emitting DNS server information on link, couldn't find suitable uplink.");
804 r
= link_push_dns_to_dhcp_server(uplink
, link
->dhcp_server
);
807 log_link_warning_errno(link
, r
, "Failed to set DNS server for DHCP server, ignoring: %m");
811 if (link
->network
->dhcp_server_emit_ntp
) {
813 if (link
->network
->n_dhcp_server_ntp
> 0)
814 r
= sd_dhcp_server_set_ntp(link
->dhcp_server
, link
->network
->dhcp_server_ntp
, link
->network
->n_dhcp_server_ntp
);
816 if (!acquired_uplink
)
817 uplink
= manager_find_uplink(link
->manager
, link
);
820 log_link_debug(link
, "Not emitting NTP server information on link, couldn't find suitable uplink.");
823 r
= link_push_ntp_to_dhcp_server(uplink
, link
->dhcp_server
);
827 log_link_warning_errno(link
, r
, "Failed to set NTP server for DHCP server, ignoring: %m");
830 if (link
->network
->dhcp_server_emit_timezone
) {
831 _cleanup_free_
char *buffer
= NULL
;
832 const char *tz
= NULL
;
834 if (link
->network
->dhcp_server_timezone
)
835 tz
= link
->network
->dhcp_server_timezone
;
837 r
= get_timezone(&buffer
);
839 log_warning_errno(r
, "Failed to determine timezone: %m");
845 r
= sd_dhcp_server_set_timezone(link
->dhcp_server
, tz
);
851 r
= sd_dhcp_server_start(link
->dhcp_server
);
853 log_link_warning_errno(link
, r
, "Could not start DHCPv4 server instance: %m");
855 link_enter_failed(link
);
860 log_link_debug(link
, "Offering DHCPv4 leases");
863 if (link
->link_messages
== 0)
864 link_enter_set_routes(link
);
866 log_link_debug(link
, "Setting addresses");
871 int link_address_remove_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
872 _cleanup_link_unref_ Link
*link
= userdata
;
877 assert(link
->ifname
);
879 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
882 r
= sd_netlink_message_get_errno(m
);
883 if (r
< 0 && r
!= -EADDRNOTAVAIL
)
884 log_link_warning_errno(link
, r
, "Could not drop address: %m");
889 static int link_set_bridge_fdb(Link
*const link
) {
893 LIST_FOREACH(static_fdb_entries
, fdb_entry
, link
->network
->static_fdb_entries
) {
894 r
= fdb_entry_configure(link
, fdb_entry
);
896 log_link_error_errno(link
, r
, "Failed to add MAC entry to static MAC table: %m");
904 static int link_set_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
905 _cleanup_link_unref_ Link
*link
= userdata
;
908 log_link_debug(link
, "Set link");
910 r
= sd_netlink_message_get_errno(m
);
911 if (r
< 0 && r
!= -EEXIST
) {
912 log_link_error_errno(link
, r
, "Could not join netdev: %m");
913 link_enter_failed(link
);
920 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
921 _cleanup_link_unref_ Link
*link
= userdata
;
922 const sd_bus_error
*e
;
927 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
930 e
= sd_bus_message_get_error(m
);
932 log_link_warning_errno(link
, sd_bus_error_get_errno(e
), "Could not set hostname: %s", e
->message
);
937 int link_set_hostname(Link
*link
, const char *hostname
) {
941 assert(link
->manager
);
943 log_link_debug(link
, "Setting transient hostname: '%s'", strna(hostname
));
945 if (!link
->manager
->bus
) {
946 /* TODO: replace by assert when we can rely on kdbus */
947 log_link_info(link
, "Not connected to system bus, ignoring transient hostname.");
951 r
= sd_bus_call_method_async(
954 "org.freedesktop.hostname1",
955 "/org/freedesktop/hostname1",
956 "org.freedesktop.hostname1",
958 set_hostname_handler
,
965 return log_link_error_errno(link
, r
, "Could not set transient hostname: %m");
972 static int set_timezone_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
973 _cleanup_link_unref_ Link
*link
= userdata
;
974 const sd_bus_error
*e
;
979 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
982 e
= sd_bus_message_get_error(m
);
984 log_link_warning_errno(link
, sd_bus_error_get_errno(e
), "Could not set timezone: %s", e
->message
);
989 int link_set_timezone(Link
*link
, const char *tz
) {
993 assert(link
->manager
);
996 log_link_debug(link
, "Setting system timezone: '%s'", tz
);
998 if (!link
->manager
->bus
) {
999 log_link_info(link
, "Not connected to system bus, ignoring timezone.");
1003 r
= sd_bus_call_method_async(
1006 "org.freedesktop.timedate1",
1007 "/org/freedesktop/timedate1",
1008 "org.freedesktop.timedate1",
1010 set_timezone_handler
,
1016 return log_link_error_errno(link
, r
, "Could not set timezone: %m");
1023 static int set_mtu_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1024 _cleanup_link_unref_ Link
*link
= userdata
;
1029 assert(link
->ifname
);
1031 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1034 r
= sd_netlink_message_get_errno(m
);
1036 log_link_warning_errno(link
, r
, "Could not set MTU: %m");
1041 int link_set_mtu(Link
*link
, uint32_t mtu
) {
1042 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1046 assert(link
->manager
);
1047 assert(link
->manager
->rtnl
);
1049 log_link_debug(link
, "Setting MTU: %" PRIu32
, mtu
);
1051 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1053 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1055 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, mtu
);
1057 return log_link_error_errno(link
, r
, "Could not append MTU: %m");
1059 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, set_mtu_handler
, link
, 0, NULL
);
1061 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1068 static int link_set_bridge(Link
*link
) {
1069 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1073 assert(link
->network
);
1075 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1077 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1079 r
= sd_rtnl_message_link_set_family(req
, PF_BRIDGE
);
1081 return log_link_error_errno(link
, r
, "Could not set message family: %m");
1083 r
= sd_netlink_message_open_container(req
, IFLA_PROTINFO
);
1085 return log_link_error_errno(link
, r
, "Could not append IFLA_PROTINFO attribute: %m");
1087 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_GUARD
, !link
->network
->use_bpdu
);
1089 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_GUARD attribute: %m");
1091 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_MODE
, link
->network
->hairpin
);
1093 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_MODE attribute: %m");
1095 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_FAST_LEAVE
, link
->network
->fast_leave
);
1097 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_FAST_LEAVE attribute: %m");
1099 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_PROTECT
, !link
->network
->allow_port_to_be_root
);
1101 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_PROTECT attribute: %m");
1103 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_UNICAST_FLOOD
, link
->network
->unicast_flood
);
1105 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_UNICAST_FLOOD attribute: %m");
1107 if(link
->network
->cost
!= 0) {
1108 r
= sd_netlink_message_append_u32(req
, IFLA_BRPORT_COST
, link
->network
->cost
);
1110 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_COST attribute: %m");
1113 r
= sd_netlink_message_close_container(req
);
1115 return log_link_error_errno(link
, r
, "Could not append IFLA_LINKINFO attribute: %m");
1117 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_set_handler
, link
, 0, NULL
);
1119 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1126 static void lldp_handler(sd_lldp
*lldp
, int event
, void *userdata
) {
1127 Link
*link
= userdata
;
1131 assert(link
->network
);
1132 assert(link
->manager
);
1135 case SD_LLDP_EVENT_UPDATE_INFO
:
1136 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
1138 log_link_warning_errno(link
, r
, "Could not save LLDP: %m");
1146 static int link_acquire_conf(Link
*link
) {
1150 assert(link
->network
);
1151 assert(link
->manager
);
1152 assert(link
->manager
->event
);
1154 if (link_ipv4ll_enabled(link
)) {
1155 assert(link
->ipv4ll
);
1157 log_link_debug(link
, "Acquiring IPv4 link-local address");
1159 r
= sd_ipv4ll_start(link
->ipv4ll
);
1161 return log_link_warning_errno(link
, r
, "Could not acquire IPv4 link-local address: %m");
1164 if (link_dhcp4_enabled(link
)) {
1165 assert(link
->dhcp_client
);
1167 log_link_debug(link
, "Acquiring DHCPv4 lease");
1169 r
= sd_dhcp_client_start(link
->dhcp_client
);
1171 return log_link_warning_errno(link
, r
, "Could not acquire DHCPv4 lease: %m");
1174 if (link_dhcp6_enabled(link
)) {
1175 assert(link
->icmp6_router_discovery
);
1177 log_link_debug(link
, "Discovering IPv6 routers");
1179 r
= sd_icmp6_router_solicitation_start(link
->icmp6_router_discovery
);
1181 return log_link_warning_errno(link
, r
, "Could not start IPv6 router discovery: %m");
1184 if (link_lldp_enabled(link
)) {
1187 log_link_debug(link
, "Starting LLDP");
1189 r
= sd_lldp_start(link
->lldp
);
1191 return log_link_warning_errno(link
, r
, "Could not start LLDP: %m");
1197 bool link_has_carrier(Link
*link
) {
1198 /* see Documentation/networking/operstates.txt in the kernel sources */
1200 if (link
->kernel_operstate
== IF_OPER_UP
)
1203 if (link
->kernel_operstate
== IF_OPER_UNKNOWN
)
1204 /* operstate may not be implemented, so fall back to flags */
1205 if ((link
->flags
& IFF_LOWER_UP
) && !(link
->flags
& IFF_DORMANT
))
1211 static int link_up_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1212 _cleanup_link_unref_ Link
*link
= userdata
;
1217 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1220 r
= sd_netlink_message_get_errno(m
);
1222 /* we warn but don't fail the link, as it may be
1224 log_link_warning_errno(link
, r
, "Could not bring up interface: %m");
1229 static int link_up(Link
*link
) {
1230 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1231 uint8_t ipv6ll_mode
;
1235 assert(link
->network
);
1236 assert(link
->manager
);
1237 assert(link
->manager
->rtnl
);
1239 log_link_debug(link
, "Bringing link up");
1241 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1243 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1245 r
= sd_rtnl_message_link_set_flags(req
, IFF_UP
, IFF_UP
);
1247 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1249 if (link
->network
->mac
) {
1250 r
= sd_netlink_message_append_ether_addr(req
, IFLA_ADDRESS
, link
->network
->mac
);
1252 return log_link_error_errno(link
, r
, "Could not set MAC address: %m");
1255 if (link
->network
->mtu
) {
1256 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, link
->network
->mtu
);
1258 return log_link_error_errno(link
, r
, "Could not set MTU: %m");
1261 r
= sd_netlink_message_open_container(req
, IFLA_AF_SPEC
);
1263 return log_link_error_errno(link
, r
, "Could not open IFLA_AF_SPEC container: %m");
1265 if (socket_ipv6_is_supported()) {
1266 /* if the kernel lacks ipv6 support setting IFF_UP fails if any ipv6 options are passed */
1267 r
= sd_netlink_message_open_container(req
, AF_INET6
);
1269 return log_link_error_errno(link
, r
, "Could not open AF_INET6 container: %m");
1271 ipv6ll_mode
= link_ipv6ll_enabled(link
) ? IN6_ADDR_GEN_MODE_EUI64
: IN6_ADDR_GEN_MODE_NONE
;
1272 r
= sd_netlink_message_append_u8(req
, IFLA_INET6_ADDR_GEN_MODE
, ipv6ll_mode
);
1274 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_ADDR_GEN_MODE: %m");
1276 if (!in_addr_is_null(AF_INET6
, &link
->network
->ipv6_token
)) {
1277 r
= sd_netlink_message_append_in6_addr(req
, IFLA_INET6_TOKEN
, &link
->network
->ipv6_token
.in6
);
1279 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_TOKEN: %m");
1282 r
= sd_netlink_message_close_container(req
);
1284 return log_link_error_errno(link
, r
, "Could not close AF_INET6 container: %m");
1287 r
= sd_netlink_message_close_container(req
);
1289 return log_link_error_errno(link
, r
, "Could not close IFLA_AF_SPEC container: %m");
1291 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_up_handler
, link
, 0, NULL
);
1293 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1300 static int link_down_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1301 _cleanup_link_unref_ Link
*link
= userdata
;
1306 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1309 r
= sd_netlink_message_get_errno(m
);
1311 log_link_warning_errno(link
, r
, "Could not bring down interface: %m");
1316 static int link_down(Link
*link
) {
1317 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1321 assert(link
->manager
);
1322 assert(link
->manager
->rtnl
);
1324 log_link_debug(link
, "Bringing link down");
1326 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
,
1327 RTM_SETLINK
, link
->ifindex
);
1329 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1331 r
= sd_rtnl_message_link_set_flags(req
, 0, IFF_UP
);
1333 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1335 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_down_handler
, link
, 0, NULL
);
1337 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1344 static int link_handle_bound_to_list(Link
*link
) {
1348 bool required_up
= false;
1349 bool link_is_up
= false;
1353 if (hashmap_isempty(link
->bound_to_links
))
1356 if (link
->flags
& IFF_UP
)
1359 HASHMAP_FOREACH (l
, link
->bound_to_links
, i
)
1360 if (link_has_carrier(l
)) {
1365 if (!required_up
&& link_is_up
) {
1366 r
= link_down(link
);
1369 } else if (required_up
&& !link_is_up
) {
1378 static int link_handle_bound_by_list(Link
*link
) {
1385 if (hashmap_isempty(link
->bound_by_links
))
1388 HASHMAP_FOREACH (l
, link
->bound_by_links
, i
) {
1389 r
= link_handle_bound_to_list(l
);
1397 static int link_put_carrier(Link
*link
, Link
*carrier
, Hashmap
**h
) {
1403 if (link
== carrier
)
1406 if (hashmap_get(*h
, INT_TO_PTR(carrier
->ifindex
)))
1409 r
= hashmap_ensure_allocated(h
, NULL
);
1413 r
= hashmap_put(*h
, INT_TO_PTR(carrier
->ifindex
), carrier
);
1420 static int link_new_bound_by_list(Link
*link
) {
1425 bool list_updated
= false;
1428 assert(link
->manager
);
1432 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1433 if (!carrier
->network
)
1436 if (strv_isempty(carrier
->network
->bind_carrier
))
1439 if (strv_fnmatch(carrier
->network
->bind_carrier
, link
->ifname
, 0)) {
1440 r
= link_put_carrier(link
, carrier
, &link
->bound_by_links
);
1444 list_updated
= true;
1451 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
) {
1452 r
= link_put_carrier(carrier
, link
, &carrier
->bound_to_links
);
1462 static int link_new_bound_to_list(Link
*link
) {
1467 bool list_updated
= false;
1470 assert(link
->manager
);
1475 if (strv_isempty(link
->network
->bind_carrier
))
1480 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1481 if (strv_fnmatch(link
->network
->bind_carrier
, carrier
->ifname
, 0)) {
1482 r
= link_put_carrier(link
, carrier
, &link
->bound_to_links
);
1486 list_updated
= true;
1493 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
) {
1494 r
= link_put_carrier(carrier
, link
, &carrier
->bound_by_links
);
1504 static int link_new_carrier_maps(Link
*link
) {
1507 r
= link_new_bound_by_list(link
);
1511 r
= link_handle_bound_by_list(link
);
1515 r
= link_new_bound_to_list(link
);
1519 r
= link_handle_bound_to_list(link
);
1526 static void link_free_bound_to_list(Link
*link
) {
1530 HASHMAP_FOREACH (bound_to
, link
->bound_to_links
, i
) {
1531 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(bound_to
->ifindex
));
1533 if (hashmap_remove(bound_to
->bound_by_links
, INT_TO_PTR(link
->ifindex
)))
1534 link_save(bound_to
);
1540 static void link_free_bound_by_list(Link
*link
) {
1544 HASHMAP_FOREACH (bound_by
, link
->bound_by_links
, i
) {
1545 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(bound_by
->ifindex
));
1547 if (hashmap_remove(bound_by
->bound_to_links
, INT_TO_PTR(link
->ifindex
))) {
1548 link_save(bound_by
);
1549 link_handle_bound_to_list(bound_by
);
1556 static void link_free_carrier_maps(Link
*link
) {
1557 bool list_updated
= false;
1561 if (!hashmap_isempty(link
->bound_to_links
)) {
1562 link_free_bound_to_list(link
);
1563 list_updated
= true;
1566 if (!hashmap_isempty(link
->bound_by_links
)) {
1567 link_free_bound_by_list(link
);
1568 list_updated
= true;
1577 void link_drop(Link
*link
) {
1578 if (!link
|| link
->state
== LINK_STATE_LINGER
)
1581 link_set_state(link
, LINK_STATE_LINGER
);
1583 link_free_carrier_maps(link
);
1585 log_link_debug(link
, "Link removed");
1592 static int link_joined(Link
*link
) {
1596 assert(link
->network
);
1598 if (!hashmap_isempty(link
->bound_to_links
)) {
1599 r
= link_handle_bound_to_list(link
);
1602 } else if (!(link
->flags
& IFF_UP
)) {
1605 link_enter_failed(link
);
1610 if(link
->network
->bridge
) {
1611 r
= link_set_bridge(link
);
1613 log_link_error_errno(link
, r
, "Could not set bridge message: %m");
1616 return link_enter_set_addresses(link
);
1619 static int netdev_join_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1620 _cleanup_link_unref_ Link
*link
= userdata
;
1624 assert(link
->network
);
1628 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1631 r
= sd_netlink_message_get_errno(m
);
1632 if (r
< 0 && r
!= -EEXIST
) {
1633 log_link_error_errno(link
, r
, "Could not join netdev: %m");
1634 link_enter_failed(link
);
1637 log_link_debug(link
, "Joined netdev");
1639 if (link
->enslaving
<= 0)
1645 static int link_enter_join_netdev(Link
*link
) {
1651 assert(link
->network
);
1652 assert(link
->state
== LINK_STATE_PENDING
);
1654 link_set_state(link
, LINK_STATE_ENSLAVING
);
1658 if (!link
->network
->bridge
&&
1659 !link
->network
->bond
&&
1660 hashmap_isempty(link
->network
->stacked_netdevs
))
1661 return link_joined(link
);
1663 if (link
->network
->bond
) {
1664 log_struct(LOG_DEBUG
,
1665 LOG_LINK_INTERFACE(link
),
1666 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1667 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bond
->ifname
),
1670 r
= netdev_join(link
->network
->bond
, link
, netdev_join_handler
);
1672 log_struct_errno(LOG_WARNING
, r
,
1673 LOG_LINK_INTERFACE(link
),
1674 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1675 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bond
->ifname
),
1678 link_enter_failed(link
);
1685 if (link
->network
->bridge
) {
1686 log_struct(LOG_DEBUG
,
1687 LOG_LINK_INTERFACE(link
),
1688 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1689 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bridge
->ifname
),
1692 r
= netdev_join(link
->network
->bridge
, link
, netdev_join_handler
);
1694 log_struct_errno(LOG_WARNING
, r
,
1695 LOG_LINK_INTERFACE(link
),
1696 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1697 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bridge
->ifname
),
1699 link_enter_failed(link
);
1706 HASHMAP_FOREACH(netdev
, link
->network
->stacked_netdevs
, i
) {
1708 log_struct(LOG_DEBUG
,
1709 LOG_LINK_INTERFACE(link
),
1710 LOG_NETDEV_INTERFACE(netdev
),
1711 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", netdev
->ifname
),
1714 r
= netdev_join(netdev
, link
, netdev_join_handler
);
1716 log_struct_errno(LOG_WARNING
, r
,
1717 LOG_LINK_INTERFACE(link
),
1718 LOG_NETDEV_INTERFACE(netdev
),
1719 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", netdev
->ifname
),
1721 link_enter_failed(link
);
1731 static int link_set_ipv4_forward(Link
*link
) {
1732 const char *p
= NULL
, *v
;
1735 if (link
->flags
& IFF_LOOPBACK
)
1738 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1741 p
= strjoina("/proc/sys/net/ipv4/conf/", link
->ifname
, "/forwarding");
1742 v
= one_zero(link_ipv4_forward_enabled(link
));
1744 r
= write_string_file(p
, v
, 0);
1746 /* If the right value is set anyway, don't complain */
1747 if (verify_one_line_file(p
, v
) > 0)
1750 log_link_warning_errno(link
, r
, "Cannot configure IPv4 forwarding for interface %s: %m", link
->ifname
);
1756 static int link_set_ipv6_forward(Link
*link
) {
1757 const char *p
= NULL
, *v
= NULL
;
1760 /* Make this a NOP if IPv6 is not available */
1761 if (!socket_ipv6_is_supported())
1764 if (link
->flags
& IFF_LOOPBACK
)
1767 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1770 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/forwarding");
1771 v
= one_zero(link_ipv6_forward_enabled(link
));
1773 r
= write_string_file(p
, v
, 0);
1775 /* If the right value is set anyway, don't complain */
1776 if (verify_one_line_file(p
, v
) > 0)
1779 log_link_warning_errno(link
, r
, "Cannot configure IPv6 forwarding for interface: %m");
1785 static int link_set_ipv6_privacy_extensions(Link
*link
) {
1786 char buf
[DECIMAL_STR_MAX(unsigned) + 1];
1787 IPv6PrivacyExtensions s
;
1788 const char *p
= NULL
;
1791 /* Make this a NOP if IPv6 is not available */
1792 if (!socket_ipv6_is_supported())
1795 s
= link_ipv6_privacy_extensions(link
);
1796 if (s
== _IPV6_PRIVACY_EXTENSIONS_INVALID
)
1799 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/use_tempaddr");
1800 xsprintf(buf
, "%u", link
->network
->ipv6_privacy_extensions
);
1802 r
= write_string_file(p
, buf
, 0);
1804 /* If the right value is set anyway, don't complain */
1805 if (verify_one_line_file(p
, buf
) > 0)
1808 log_link_warning_errno(link
, r
, "Cannot configure IPv6 privacy extension for interface: %m");
1814 static int link_set_ipv6_accept_ra(Link
*link
) {
1815 const char *p
= NULL
, *v
= NULL
;
1818 /* Make this a NOP if IPv6 is not available */
1819 if (!socket_ipv6_is_supported())
1822 if (link
->flags
& IFF_LOOPBACK
)
1825 /* If unset use system default (enabled if local forwarding is disabled.
1826 * disabled if local forwarding is enabled).
1827 * If set, ignore or enforce RA independent of local forwarding state.
1829 if (link
->network
->ipv6_accept_ra
< 0)
1830 /* default to accept RA if ip_forward is disabled and ignore RA if ip_forward is enabled */
1832 else if (link
->network
->ipv6_accept_ra
> 0)
1833 /* "2" means accept RA even if ip_forward is enabled */
1836 /* "0" means ignore RA */
1839 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/accept_ra");
1841 r
= write_string_file(p
, v
, 0);
1843 /* If the right value is set anyway, don't complain */
1844 if (verify_one_line_file(p
, v
) > 0)
1847 log_link_warning_errno(link
, r
, "Cannot configure IPv6 accept_ra for interface: %m");
1853 static int link_configure(Link
*link
) {
1857 assert(link
->network
);
1858 assert(link
->state
== LINK_STATE_PENDING
);
1860 r
= link_set_bridge_fdb(link
);
1864 r
= link_set_ipv4_forward(link
);
1868 r
= link_set_ipv6_forward(link
);
1872 r
= link_set_ipv6_privacy_extensions(link
);
1876 r
= link_set_ipv6_accept_ra(link
);
1880 if (link_ipv4ll_enabled(link
)) {
1881 r
= ipv4ll_configure(link
);
1886 if (link_dhcp4_enabled(link
)) {
1887 r
= dhcp4_configure(link
);
1892 if (link_dhcp4_server_enabled(link
)) {
1893 r
= sd_dhcp_server_new(&link
->dhcp_server
, link
->ifindex
);
1897 r
= sd_dhcp_server_attach_event(link
->dhcp_server
, NULL
, 0);
1902 if (link_dhcp6_enabled(link
)) {
1903 r
= icmp6_configure(link
);
1908 if (link_lldp_enabled(link
)) {
1909 r
= sd_lldp_new(link
->ifindex
, link
->ifname
, &link
->mac
, &link
->lldp
);
1913 r
= sd_lldp_attach_event(link
->lldp
, NULL
, 0);
1917 r
= sd_lldp_set_callback(link
->lldp
,
1918 lldp_handler
, link
);
1923 if (link_has_carrier(link
)) {
1924 r
= link_acquire_conf(link
);
1929 return link_enter_join_netdev(link
);
1932 static int link_initialized_and_synced(sd_netlink
*rtnl
, sd_netlink_message
*m
,
1934 _cleanup_link_unref_ Link
*link
= userdata
;
1939 assert(link
->ifname
);
1940 assert(link
->manager
);
1942 if (link
->state
!= LINK_STATE_PENDING
)
1945 log_link_debug(link
, "Link state is up-to-date");
1947 r
= link_new_bound_by_list(link
);
1951 r
= link_handle_bound_by_list(link
);
1955 r
= network_get(link
->manager
, link
->udev_device
, link
->ifname
,
1956 &link
->mac
, &network
);
1958 link_enter_unmanaged(link
);
1963 if (link
->flags
& IFF_LOOPBACK
) {
1964 if (network
->link_local
!= ADDRESS_FAMILY_NO
)
1965 log_link_debug(link
, "Ignoring link-local autoconfiguration for loopback link");
1967 if (network
->dhcp
!= ADDRESS_FAMILY_NO
)
1968 log_link_debug(link
, "Ignoring DHCP clients for loopback link");
1970 if (network
->dhcp_server
)
1971 log_link_debug(link
, "Ignoring DHCP server for loopback link");
1974 r
= network_apply(link
->manager
, network
, link
);
1978 r
= link_new_bound_to_list(link
);
1982 r
= link_configure(link
);
1989 int link_initialized(Link
*link
, struct udev_device
*device
) {
1990 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1994 assert(link
->manager
);
1995 assert(link
->manager
->rtnl
);
1998 if (link
->state
!= LINK_STATE_PENDING
)
2001 if (link
->udev_device
)
2004 log_link_debug(link
, "udev initialized link");
2006 link
->udev_device
= udev_device_ref(device
);
2008 /* udev has initialized the link, but we don't know if we have yet
2009 * processed the NEWLINK messages with the latest state. Do a GETLINK,
2010 * when it returns we know that the pending NEWLINKs have already been
2011 * processed and that we are up-to-date */
2013 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_GETLINK
,
2018 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
,
2019 link_initialized_and_synced
, link
, 0, NULL
);
2028 int link_add(Manager
*m
, sd_netlink_message
*message
, Link
**ret
) {
2030 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
2031 char ifindex_str
[2 + DECIMAL_STR_MAX(int)];
2039 r
= link_new(m
, message
, ret
);
2045 log_link_debug(link
, "Link %d added", link
->ifindex
);
2047 if (detect_container() <= 0) {
2048 /* not in a container, udev will be around */
2049 sprintf(ifindex_str
, "n%d", link
->ifindex
);
2050 device
= udev_device_new_from_device_id(m
->udev
, ifindex_str
);
2052 r
= log_link_warning_errno(link
, errno
, "Could not find udev device: %m");
2056 if (udev_device_get_is_initialized(device
) <= 0) {
2058 log_link_debug(link
, "link pending udev initialization...");
2062 r
= link_initialized(link
, device
);
2066 /* we are calling a callback directly, so must take a ref */
2069 r
= link_initialized_and_synced(m
->rtnl
, NULL
, link
);
2076 link_enter_failed(link
);
2080 static int link_carrier_gained(Link
*link
) {
2085 if (link
->network
) {
2086 r
= link_acquire_conf(link
);
2088 link_enter_failed(link
);
2093 r
= link_handle_bound_by_list(link
);
2100 static int link_carrier_lost(Link
*link
) {
2105 r
= link_stop_clients(link
);
2107 link_enter_failed(link
);
2111 r
= link_handle_bound_by_list(link
);
2118 int link_carrier_reset(Link
*link
) {
2123 if (link_has_carrier(link
)) {
2124 r
= link_carrier_lost(link
);
2128 r
= link_carrier_gained(link
);
2132 log_link_info(link
, "Reset carrier");
2139 int link_update(Link
*link
, sd_netlink_message
*m
) {
2140 struct ether_addr mac
;
2143 bool had_carrier
, carrier_gained
, carrier_lost
;
2147 assert(link
->ifname
);
2150 if (link
->state
== LINK_STATE_LINGER
) {
2152 log_link_info(link
, "Link readded");
2153 link_set_state(link
, LINK_STATE_ENSLAVING
);
2155 r
= link_new_carrier_maps(link
);
2160 r
= sd_netlink_message_read_string(m
, IFLA_IFNAME
, &ifname
);
2161 if (r
>= 0 && !streq(ifname
, link
->ifname
)) {
2162 log_link_info(link
, "Renamed to %s", ifname
);
2164 link_free_carrier_maps(link
);
2166 r
= free_and_strdup(&link
->ifname
, ifname
);
2170 r
= link_new_carrier_maps(link
);
2175 r
= sd_netlink_message_read_u32(m
, IFLA_MTU
, &mtu
);
2176 if (r
>= 0 && mtu
> 0) {
2178 if (!link
->original_mtu
) {
2179 link
->original_mtu
= mtu
;
2180 log_link_debug(link
, "Saved original MTU: %" PRIu32
, link
->original_mtu
);
2183 if (link
->dhcp_client
) {
2184 r
= sd_dhcp_client_set_mtu(link
->dhcp_client
,
2187 log_link_warning_errno(link
, r
, "Could not update MTU in DHCP client: %m");
2193 /* The kernel may broadcast NEWLINK messages without the MAC address
2194 set, simply ignore them. */
2195 r
= sd_netlink_message_read_ether_addr(m
, IFLA_ADDRESS
, &mac
);
2197 if (memcmp(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2200 memcpy(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2203 log_link_debug(link
, "MAC address: "
2204 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2205 mac
.ether_addr_octet
[0],
2206 mac
.ether_addr_octet
[1],
2207 mac
.ether_addr_octet
[2],
2208 mac
.ether_addr_octet
[3],
2209 mac
.ether_addr_octet
[4],
2210 mac
.ether_addr_octet
[5]);
2213 r
= sd_ipv4ll_set_mac(link
->ipv4ll
, &link
->mac
);
2215 return log_link_warning_errno(link
, r
, "Could not update MAC address in IPv4LL client: %m");
2218 if (link
->dhcp_client
) {
2219 r
= sd_dhcp_client_set_mac(link
->dhcp_client
,
2220 (const uint8_t *) &link
->mac
,
2224 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCP client: %m");
2227 if (link
->dhcp6_client
) {
2228 r
= sd_dhcp6_client_set_mac(link
->dhcp6_client
,
2229 (const uint8_t *) &link
->mac
,
2233 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCPv6 client: %m");
2238 had_carrier
= link_has_carrier(link
);
2240 r
= link_update_flags(link
, m
);
2244 carrier_gained
= !had_carrier
&& link_has_carrier(link
);
2245 carrier_lost
= had_carrier
&& !link_has_carrier(link
);
2247 if (carrier_gained
) {
2248 log_link_info(link
, "Gained carrier");
2250 r
= link_carrier_gained(link
);
2253 } else if (carrier_lost
) {
2254 log_link_info(link
, "Lost carrier");
2256 r
= link_carrier_lost(link
);
2265 static void link_update_operstate(Link
*link
) {
2266 LinkOperationalState operstate
;
2269 if (link
->kernel_operstate
== IF_OPER_DORMANT
)
2270 operstate
= LINK_OPERSTATE_DORMANT
;
2271 else if (link_has_carrier(link
)) {
2273 uint8_t scope
= RT_SCOPE_NOWHERE
;
2276 /* if we have carrier, check what addresses we have */
2277 SET_FOREACH(address
, link
->addresses
, i
) {
2278 if (!address_is_ready(address
))
2281 if (address
->scope
< scope
)
2282 scope
= address
->scope
;
2285 if (scope
< RT_SCOPE_SITE
)
2286 /* universally accessible addresses found */
2287 operstate
= LINK_OPERSTATE_ROUTABLE
;
2288 else if (scope
< RT_SCOPE_HOST
)
2289 /* only link or site local addresses found */
2290 operstate
= LINK_OPERSTATE_DEGRADED
;
2292 /* no useful addresses found */
2293 operstate
= LINK_OPERSTATE_CARRIER
;
2294 } else if (link
->flags
& IFF_UP
)
2295 operstate
= LINK_OPERSTATE_NO_CARRIER
;
2297 operstate
= LINK_OPERSTATE_OFF
;
2299 if (link
->operstate
!= operstate
) {
2300 link
->operstate
= operstate
;
2301 link_send_changed(link
, "OperationalState", NULL
);
2305 int link_save(Link
*link
) {
2306 _cleanup_free_
char *temp_path
= NULL
;
2307 _cleanup_fclose_
FILE *f
= NULL
;
2308 const char *admin_state
, *oper_state
;
2312 assert(link
->state_file
);
2313 assert(link
->lease_file
);
2314 assert(link
->manager
);
2316 link_update_operstate(link
);
2318 r
= manager_save(link
->manager
);
2322 if (link
->state
== LINK_STATE_LINGER
) {
2323 unlink(link
->state_file
);
2327 admin_state
= link_state_to_string(link
->state
);
2328 assert(admin_state
);
2330 oper_state
= link_operstate_to_string(link
->operstate
);
2333 r
= fopen_temporary(link
->state_file
, &f
, &temp_path
);
2337 fchmod(fileno(f
), 0644);
2340 "# This is private data. Do not parse.\n"
2343 admin_state
, oper_state
);
2345 if (link
->network
) {
2346 char **address
, **domain
;
2348 sd_dhcp6_lease
*dhcp6_lease
= NULL
;
2350 if (link
->dhcp6_client
) {
2351 r
= sd_dhcp6_client_get_lease(link
->dhcp6_client
,
2354 log_link_debug(link
, "No DHCPv6 lease");
2357 fprintf(f
, "NETWORK_FILE=%s\n", link
->network
->filename
);
2361 STRV_FOREACH(address
, link
->network
->dns
) {
2368 if (link
->network
->dhcp_dns
&&
2370 const struct in_addr
*addresses
;
2372 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
2376 serialize_in_addrs(f
, addresses
, r
);
2381 if (link
->network
->dhcp_dns
&& dhcp6_lease
) {
2382 struct in6_addr
*in6_addrs
;
2384 r
= sd_dhcp6_lease_get_dns(dhcp6_lease
, &in6_addrs
);
2388 serialize_in6_addrs(f
, in6_addrs
, r
);
2396 STRV_FOREACH(address
, link
->network
->ntp
) {
2403 if (link
->network
->dhcp_ntp
&&
2405 const struct in_addr
*addresses
;
2407 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
2411 serialize_in_addrs(f
, addresses
, r
);
2416 if (link
->network
->dhcp_ntp
&& dhcp6_lease
) {
2417 struct in6_addr
*in6_addrs
;
2421 r
= sd_dhcp6_lease_get_ntp_addrs(dhcp6_lease
,
2426 serialize_in6_addrs(f
, in6_addrs
, r
);
2430 r
= sd_dhcp6_lease_get_ntp_fqdn(dhcp6_lease
, &hosts
);
2432 STRV_FOREACH(hostname
, hosts
) {
2435 fputs(*hostname
, f
);
2443 fprintf(f
, "DOMAINS=");
2445 STRV_FOREACH(domain
, link
->network
->domains
) {
2452 if (link
->network
->dhcp_domains
&&
2454 const char *domainname
;
2456 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
2460 fputs(domainname
, f
);
2465 if (link
->network
->dhcp_domains
&& dhcp6_lease
) {
2468 r
= sd_dhcp6_lease_get_domains(dhcp6_lease
, &domains
);
2470 STRV_FOREACH(domain
, domains
) {
2481 fprintf(f
, "WILDCARD_DOMAIN=%s\n",
2482 yes_no(link
->network
->wildcard_domain
));
2484 fprintf(f
, "LLMNR=%s\n",
2485 resolve_support_to_string(link
->network
->llmnr
));
2488 if (!hashmap_isempty(link
->bound_to_links
)) {
2493 fputs("CARRIER_BOUND_TO=", f
);
2494 HASHMAP_FOREACH(carrier
, link
->bound_to_links
, i
) {
2497 fputs(carrier
->ifname
, f
);
2504 if (!hashmap_isempty(link
->bound_by_links
)) {
2509 fputs("CARRIER_BOUND_BY=", f
);
2510 HASHMAP_FOREACH(carrier
, link
->bound_by_links
, i
) {
2513 fputs(carrier
->ifname
, f
);
2520 if (link
->dhcp_lease
) {
2521 const char *tz
= NULL
;
2523 r
= sd_dhcp_lease_get_timezone(link
->dhcp_lease
, &tz
);
2525 fprintf(f
, "TIMEZONE=%s\n", tz
);
2528 if (link
->dhcp_lease
) {
2529 assert(link
->network
);
2531 r
= dhcp_lease_save(link
->dhcp_lease
, link
->lease_file
);
2539 unlink(link
->lease_file
);
2542 assert(link
->network
);
2544 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
2552 unlink(link
->lldp_file
);
2554 r
= fflush_and_check(f
);
2558 if (rename(temp_path
, link
->state_file
) < 0) {
2566 (void) unlink(link
->state_file
);
2568 (void) unlink(temp_path
);
2570 return log_link_error_errno(link
, r
, "Failed to save link data to %s: %m", link
->state_file
);
2573 static const char* const link_state_table
[_LINK_STATE_MAX
] = {
2574 [LINK_STATE_PENDING
] = "pending",
2575 [LINK_STATE_ENSLAVING
] = "configuring",
2576 [LINK_STATE_SETTING_ADDRESSES
] = "configuring",
2577 [LINK_STATE_SETTING_ROUTES
] = "configuring",
2578 [LINK_STATE_CONFIGURED
] = "configured",
2579 [LINK_STATE_UNMANAGED
] = "unmanaged",
2580 [LINK_STATE_FAILED
] = "failed",
2581 [LINK_STATE_LINGER
] = "linger",
2584 DEFINE_STRING_TABLE_LOOKUP(link_state
, LinkState
);
2586 static const char* const link_operstate_table
[_LINK_OPERSTATE_MAX
] = {
2587 [LINK_OPERSTATE_OFF
] = "off",
2588 [LINK_OPERSTATE_NO_CARRIER
] = "no-carrier",
2589 [LINK_OPERSTATE_DORMANT
] = "dormant",
2590 [LINK_OPERSTATE_CARRIER
] = "carrier",
2591 [LINK_OPERSTATE_DEGRADED
] = "degraded",
2592 [LINK_OPERSTATE_ROUTABLE
] = "routable",
2595 DEFINE_STRING_TABLE_LOOKUP(link_operstate
, LinkOperationalState
);