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 (!set_isempty(link
->addresses_foreign
))
301 address_free(set_first(link
->addresses_foreign
));
303 set_free(link
->addresses_foreign
);
305 while ((address
= link
->pool_addresses
)) {
306 LIST_REMOVE(addresses
, link
->pool_addresses
, address
);
307 address_free(address
);
310 sd_dhcp_server_unref(link
->dhcp_server
);
311 sd_dhcp_client_unref(link
->dhcp_client
);
312 sd_dhcp_lease_unref(link
->dhcp_lease
);
314 free(link
->lease_file
);
316 sd_lldp_free(link
->lldp
);
318 free(link
->lldp_file
);
320 sd_ipv4ll_unref(link
->ipv4ll
);
321 sd_dhcp6_client_unref(link
->dhcp6_client
);
322 sd_icmp6_nd_unref(link
->icmp6_router_discovery
);
325 hashmap_remove(link
->manager
->links
, INT_TO_PTR(link
->ifindex
));
329 free(link
->state_file
);
331 udev_device_unref(link
->udev_device
);
333 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
)
334 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(carrier
->ifindex
));
335 hashmap_free(link
->bound_to_links
);
337 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
)
338 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(carrier
->ifindex
));
339 hashmap_free(link
->bound_by_links
);
344 Link
*link_unref(Link
*link
) {
348 assert(link
->n_ref
> 0);
360 Link
*link_ref(Link
*link
) {
364 assert(link
->n_ref
> 0);
371 int link_get(Manager
*m
, int ifindex
, Link
**ret
) {
378 link
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
387 static void link_set_state(Link
*link
, LinkState state
) {
390 if (link
->state
== state
)
395 link_send_changed(link
, "AdministrativeState", NULL
);
400 static void link_enter_unmanaged(Link
*link
) {
403 log_link_debug(link
, "Unmanaged");
405 link_set_state(link
, LINK_STATE_UNMANAGED
);
410 static int link_stop_clients(Link
*link
) {
414 assert(link
->manager
);
415 assert(link
->manager
->event
);
420 if (link
->dhcp_client
) {
421 k
= sd_dhcp_client_stop(link
->dhcp_client
);
423 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv4 client: %m");
427 k
= sd_ipv4ll_stop(link
->ipv4ll
);
429 r
= log_link_warning_errno(link
, r
, "Could not stop IPv4 link-local: %m");
432 if(link
->icmp6_router_discovery
) {
433 if (link
->dhcp6_client
) {
434 k
= sd_dhcp6_client_stop(link
->dhcp6_client
);
436 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv6 client: %m");
439 k
= sd_icmp6_nd_stop(link
->icmp6_router_discovery
);
441 r
= log_link_warning_errno(link
, r
, "Could not stop ICMPv6 router discovery: %m");
445 k
= sd_lldp_stop(link
->lldp
);
447 r
= log_link_warning_errno(link
, r
, "Could not stop LLDP: %m");
453 void link_enter_failed(Link
*link
) {
456 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
459 log_link_warning(link
, "Failed");
461 link_set_state(link
, LINK_STATE_FAILED
);
463 link_stop_clients(link
);
468 static Address
* link_find_dhcp_server_address(Link
*link
) {
472 assert(link
->network
);
474 /* The first statically configured address if there is any */
475 LIST_FOREACH(addresses
, address
, link
->network
->static_addresses
) {
477 if (address
->family
!= AF_INET
)
480 if (in_addr_is_null(address
->family
, &address
->in_addr
))
486 /* If that didn't work, find a suitable address we got from the pool */
487 LIST_FOREACH(addresses
, address
, link
->pool_addresses
) {
488 if (address
->family
!= AF_INET
)
497 static int link_enter_configured(Link
*link
) {
499 assert(link
->network
);
500 assert(link
->state
== LINK_STATE_SETTING_ROUTES
);
502 log_link_info(link
, "Configured");
504 link_set_state(link
, LINK_STATE_CONFIGURED
);
511 void link_check_ready(Link
*link
) {
520 if (!link
->static_configured
)
523 if (link_ipv4ll_enabled(link
))
524 if (!link
->ipv4ll_address
||
528 if ((link_dhcp4_enabled(link
) && !link_dhcp6_enabled(link
) &&
529 !link
->dhcp4_configured
) ||
530 (link_dhcp6_enabled(link
) && !link_dhcp4_enabled(link
) &&
531 !link
->dhcp6_configured
) ||
532 (link_dhcp4_enabled(link
) && link_dhcp6_enabled(link
) &&
533 !link
->dhcp4_configured
&& !link
->dhcp6_configured
))
536 SET_FOREACH(a
, link
->addresses
, i
)
537 if (!address_is_ready(a
))
540 if (link
->state
!= LINK_STATE_CONFIGURED
)
541 link_enter_configured(link
);
546 static int route_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
547 _cleanup_link_unref_ Link
*link
= userdata
;
550 assert(link
->link_messages
> 0);
551 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
552 LINK_STATE_SETTING_ROUTES
, LINK_STATE_FAILED
,
555 link
->link_messages
--;
557 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
560 r
= sd_netlink_message_get_errno(m
);
561 if (r
< 0 && r
!= -EEXIST
)
562 log_link_warning_errno(link
, r
, "Could not set route: %m");
564 if (link
->link_messages
== 0) {
565 log_link_debug(link
, "Routes set");
566 link
->static_configured
= true;
567 link_check_ready(link
);
573 static int link_enter_set_routes(Link
*link
) {
578 assert(link
->network
);
579 assert(link
->state
== LINK_STATE_SETTING_ADDRESSES
);
581 link_set_state(link
, LINK_STATE_SETTING_ROUTES
);
583 LIST_FOREACH(routes
, rt
, link
->network
->static_routes
) {
584 r
= route_configure(rt
, link
, &route_handler
);
586 log_link_warning_errno(link
, r
, "Could not set routes: %m");
587 link_enter_failed(link
);
591 link
->link_messages
++;
594 if (link
->link_messages
== 0) {
595 link
->static_configured
= true;
596 link_check_ready(link
);
598 log_link_debug(link
, "Setting routes");
603 int link_route_remove_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
604 _cleanup_link_unref_ Link
*link
= userdata
;
609 assert(link
->ifname
);
611 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
614 r
= sd_netlink_message_get_errno(m
);
615 if (r
< 0 && r
!= -ESRCH
)
616 log_link_warning_errno(link
, r
, "Could not drop route: %m");
621 static int address_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
622 _cleanup_link_unref_ Link
*link
= userdata
;
628 assert(link
->ifname
);
629 assert(link
->link_messages
> 0);
630 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
631 LINK_STATE_FAILED
, LINK_STATE_LINGER
));
633 link
->link_messages
--;
635 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
638 r
= sd_netlink_message_get_errno(m
);
639 if (r
< 0 && r
!= -EEXIST
)
640 log_link_warning_errno(link
, r
, "could not set address: %m");
642 manager_rtnl_process_address(rtnl
, m
, link
->manager
);
644 if (link
->link_messages
== 0) {
645 log_link_debug(link
, "Addresses set");
646 link_enter_set_routes(link
);
652 static int link_push_dns_to_dhcp_server(Link
*link
, sd_dhcp_server
*s
) {
653 _cleanup_free_
struct in_addr
*addresses
= NULL
;
654 size_t n_addresses
= 0, n_allocated
= 0;
657 log_debug("Copying DNS server information from %s", link
->ifname
);
662 STRV_FOREACH(a
, link
->network
->dns
) {
665 /* Only look for IPv4 addresses */
666 if (inet_pton(AF_INET
, *a
, &ia
) <= 0)
669 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ 1))
672 addresses
[n_addresses
++] = ia
;
675 if (link
->network
->dhcp_dns
&&
677 const struct in_addr
*da
= NULL
;
680 n
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &da
);
683 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ n
))
686 memcpy(addresses
+ n_addresses
, da
, n
* sizeof(struct in_addr
));
691 if (n_addresses
<= 0)
694 return sd_dhcp_server_set_dns(s
, addresses
, n_addresses
);
697 static int link_push_ntp_to_dhcp_server(Link
*link
, sd_dhcp_server
*s
) {
698 _cleanup_free_
struct in_addr
*addresses
= NULL
;
699 size_t n_addresses
= 0, n_allocated
= 0;
705 log_debug("Copying NTP server information from %s", link
->ifname
);
707 STRV_FOREACH(a
, link
->network
->ntp
) {
710 /* Only look for IPv4 addresses */
711 if (inet_pton(AF_INET
, *a
, &ia
) <= 0)
714 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ 1))
717 addresses
[n_addresses
++] = ia
;
720 if (link
->network
->dhcp_ntp
&&
722 const struct in_addr
*da
= NULL
;
725 n
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &da
);
728 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ n
))
731 memcpy(addresses
+ n_addresses
, da
, n
* sizeof(struct in_addr
));
736 if (n_addresses
<= 0)
739 return sd_dhcp_server_set_ntp(s
, addresses
, n_addresses
);
742 static int link_enter_set_addresses(Link
*link
) {
747 assert(link
->network
);
748 assert(link
->state
!= _LINK_STATE_INVALID
);
750 link_set_state(link
, LINK_STATE_SETTING_ADDRESSES
);
752 LIST_FOREACH(addresses
, ad
, link
->network
->static_addresses
) {
753 r
= address_configure(ad
, link
, &address_handler
, false);
755 log_link_warning_errno(link
, r
, "Could not set addresses: %m");
756 link_enter_failed(link
);
760 link
->link_messages
++;
763 /* now that we can figure out a default address for the dhcp server,
765 if (link_dhcp4_server_enabled(link
)) {
768 bool acquired_uplink
= false;
770 address
= link_find_dhcp_server_address(link
);
772 log_link_warning(link
, "Failed to find suitable address for DHCPv4 server instance.");
773 link_enter_failed(link
);
777 /* use the server address' subnet as the pool */
778 r
= sd_dhcp_server_configure_pool(link
->dhcp_server
, &address
->in_addr
.in
, address
->prefixlen
,
779 link
->network
->dhcp_server_pool_offset
, link
->network
->dhcp_server_pool_size
);
784 r = sd_dhcp_server_set_router(link->dhcp_server,
785 &main_address->in_addr.in);
790 if (link
->network
->dhcp_server_max_lease_time_usec
> 0) {
791 r
= sd_dhcp_server_set_max_lease_time(
793 DIV_ROUND_UP(link
->network
->dhcp_server_max_lease_time_usec
, USEC_PER_SEC
));
798 if (link
->network
->dhcp_server_default_lease_time_usec
> 0) {
799 r
= sd_dhcp_server_set_default_lease_time(
801 DIV_ROUND_UP(link
->network
->dhcp_server_default_lease_time_usec
, USEC_PER_SEC
));
806 if (link
->network
->dhcp_server_emit_dns
) {
808 if (link
->network
->n_dhcp_server_dns
> 0)
809 r
= sd_dhcp_server_set_dns(link
->dhcp_server
, link
->network
->dhcp_server_dns
, link
->network
->n_dhcp_server_dns
);
811 uplink
= manager_find_uplink(link
->manager
, link
);
812 acquired_uplink
= true;
815 log_link_debug(link
, "Not emitting DNS server information on link, couldn't find suitable uplink.");
818 r
= link_push_dns_to_dhcp_server(uplink
, link
->dhcp_server
);
821 log_link_warning_errno(link
, r
, "Failed to set DNS server for DHCP server, ignoring: %m");
825 if (link
->network
->dhcp_server_emit_ntp
) {
827 if (link
->network
->n_dhcp_server_ntp
> 0)
828 r
= sd_dhcp_server_set_ntp(link
->dhcp_server
, link
->network
->dhcp_server_ntp
, link
->network
->n_dhcp_server_ntp
);
830 if (!acquired_uplink
)
831 uplink
= manager_find_uplink(link
->manager
, link
);
834 log_link_debug(link
, "Not emitting NTP server information on link, couldn't find suitable uplink.");
837 r
= link_push_ntp_to_dhcp_server(uplink
, link
->dhcp_server
);
841 log_link_warning_errno(link
, r
, "Failed to set NTP server for DHCP server, ignoring: %m");
844 if (link
->network
->dhcp_server_emit_timezone
) {
845 _cleanup_free_
char *buffer
= NULL
;
846 const char *tz
= NULL
;
848 if (link
->network
->dhcp_server_timezone
)
849 tz
= link
->network
->dhcp_server_timezone
;
851 r
= get_timezone(&buffer
);
853 log_warning_errno(r
, "Failed to determine timezone: %m");
859 r
= sd_dhcp_server_set_timezone(link
->dhcp_server
, tz
);
865 r
= sd_dhcp_server_start(link
->dhcp_server
);
867 log_link_warning_errno(link
, r
, "Could not start DHCPv4 server instance: %m");
869 link_enter_failed(link
);
874 log_link_debug(link
, "Offering DHCPv4 leases");
877 if (link
->link_messages
== 0)
878 link_enter_set_routes(link
);
880 log_link_debug(link
, "Setting addresses");
885 int link_address_remove_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
886 _cleanup_link_unref_ Link
*link
= userdata
;
891 assert(link
->ifname
);
893 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
896 r
= sd_netlink_message_get_errno(m
);
897 if (r
< 0 && r
!= -EADDRNOTAVAIL
)
898 log_link_warning_errno(link
, r
, "Could not drop address: %m");
903 static int link_set_bridge_fdb(Link
*const link
) {
907 LIST_FOREACH(static_fdb_entries
, fdb_entry
, link
->network
->static_fdb_entries
) {
908 r
= fdb_entry_configure(link
, fdb_entry
);
910 log_link_error_errno(link
, r
, "Failed to add MAC entry to static MAC table: %m");
918 static int link_set_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
919 _cleanup_link_unref_ Link
*link
= userdata
;
922 log_link_debug(link
, "Set link");
924 r
= sd_netlink_message_get_errno(m
);
925 if (r
< 0 && r
!= -EEXIST
) {
926 log_link_error_errno(link
, r
, "Could not join netdev: %m");
927 link_enter_failed(link
);
934 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
935 _cleanup_link_unref_ Link
*link
= userdata
;
936 const sd_bus_error
*e
;
941 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
944 e
= sd_bus_message_get_error(m
);
946 log_link_warning_errno(link
, sd_bus_error_get_errno(e
), "Could not set hostname: %s", e
->message
);
951 int link_set_hostname(Link
*link
, const char *hostname
) {
955 assert(link
->manager
);
957 log_link_debug(link
, "Setting transient hostname: '%s'", strna(hostname
));
959 if (!link
->manager
->bus
) {
960 /* TODO: replace by assert when we can rely on kdbus */
961 log_link_info(link
, "Not connected to system bus, ignoring transient hostname.");
965 r
= sd_bus_call_method_async(
968 "org.freedesktop.hostname1",
969 "/org/freedesktop/hostname1",
970 "org.freedesktop.hostname1",
972 set_hostname_handler
,
979 return log_link_error_errno(link
, r
, "Could not set transient hostname: %m");
986 static int set_timezone_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
987 _cleanup_link_unref_ Link
*link
= userdata
;
988 const sd_bus_error
*e
;
993 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
996 e
= sd_bus_message_get_error(m
);
998 log_link_warning_errno(link
, sd_bus_error_get_errno(e
), "Could not set timezone: %s", e
->message
);
1003 int link_set_timezone(Link
*link
, const char *tz
) {
1007 assert(link
->manager
);
1010 log_link_debug(link
, "Setting system timezone: '%s'", tz
);
1012 if (!link
->manager
->bus
) {
1013 log_link_info(link
, "Not connected to system bus, ignoring timezone.");
1017 r
= sd_bus_call_method_async(
1020 "org.freedesktop.timedate1",
1021 "/org/freedesktop/timedate1",
1022 "org.freedesktop.timedate1",
1024 set_timezone_handler
,
1030 return log_link_error_errno(link
, r
, "Could not set timezone: %m");
1037 static int set_mtu_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1038 _cleanup_link_unref_ Link
*link
= userdata
;
1043 assert(link
->ifname
);
1045 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1048 r
= sd_netlink_message_get_errno(m
);
1050 log_link_warning_errno(link
, r
, "Could not set MTU: %m");
1055 int link_set_mtu(Link
*link
, uint32_t mtu
) {
1056 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1060 assert(link
->manager
);
1061 assert(link
->manager
->rtnl
);
1063 log_link_debug(link
, "Setting MTU: %" PRIu32
, mtu
);
1065 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1067 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1069 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, mtu
);
1071 return log_link_error_errno(link
, r
, "Could not append MTU: %m");
1073 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, set_mtu_handler
, link
, 0, NULL
);
1075 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1082 static int link_set_bridge(Link
*link
) {
1083 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1087 assert(link
->network
);
1089 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1091 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1093 r
= sd_rtnl_message_link_set_family(req
, PF_BRIDGE
);
1095 return log_link_error_errno(link
, r
, "Could not set message family: %m");
1097 r
= sd_netlink_message_open_container(req
, IFLA_PROTINFO
);
1099 return log_link_error_errno(link
, r
, "Could not append IFLA_PROTINFO attribute: %m");
1101 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_GUARD
, !link
->network
->use_bpdu
);
1103 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_GUARD attribute: %m");
1105 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_MODE
, link
->network
->hairpin
);
1107 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_MODE attribute: %m");
1109 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_FAST_LEAVE
, link
->network
->fast_leave
);
1111 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_FAST_LEAVE attribute: %m");
1113 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_PROTECT
, !link
->network
->allow_port_to_be_root
);
1115 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_PROTECT attribute: %m");
1117 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_UNICAST_FLOOD
, link
->network
->unicast_flood
);
1119 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_UNICAST_FLOOD attribute: %m");
1121 if(link
->network
->cost
!= 0) {
1122 r
= sd_netlink_message_append_u32(req
, IFLA_BRPORT_COST
, link
->network
->cost
);
1124 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_COST attribute: %m");
1127 r
= sd_netlink_message_close_container(req
);
1129 return log_link_error_errno(link
, r
, "Could not append IFLA_LINKINFO attribute: %m");
1131 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_set_handler
, link
, 0, NULL
);
1133 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1140 static void lldp_handler(sd_lldp
*lldp
, int event
, void *userdata
) {
1141 Link
*link
= userdata
;
1145 assert(link
->network
);
1146 assert(link
->manager
);
1149 case SD_LLDP_EVENT_UPDATE_INFO
:
1150 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
1152 log_link_warning_errno(link
, r
, "Could not save LLDP: %m");
1160 static int link_acquire_conf(Link
*link
) {
1164 assert(link
->network
);
1165 assert(link
->manager
);
1166 assert(link
->manager
->event
);
1168 if (link_ipv4ll_enabled(link
)) {
1169 assert(link
->ipv4ll
);
1171 log_link_debug(link
, "Acquiring IPv4 link-local address");
1173 r
= sd_ipv4ll_start(link
->ipv4ll
);
1175 return log_link_warning_errno(link
, r
, "Could not acquire IPv4 link-local address: %m");
1178 if (link_dhcp4_enabled(link
)) {
1179 assert(link
->dhcp_client
);
1181 log_link_debug(link
, "Acquiring DHCPv4 lease");
1183 r
= sd_dhcp_client_start(link
->dhcp_client
);
1185 return log_link_warning_errno(link
, r
, "Could not acquire DHCPv4 lease: %m");
1188 if (link_dhcp6_enabled(link
)) {
1189 assert(link
->icmp6_router_discovery
);
1191 log_link_debug(link
, "Discovering IPv6 routers");
1193 r
= sd_icmp6_router_solicitation_start(link
->icmp6_router_discovery
);
1195 return log_link_warning_errno(link
, r
, "Could not start IPv6 router discovery: %m");
1198 if (link_lldp_enabled(link
)) {
1201 log_link_debug(link
, "Starting LLDP");
1203 r
= sd_lldp_start(link
->lldp
);
1205 return log_link_warning_errno(link
, r
, "Could not start LLDP: %m");
1211 bool link_has_carrier(Link
*link
) {
1212 /* see Documentation/networking/operstates.txt in the kernel sources */
1214 if (link
->kernel_operstate
== IF_OPER_UP
)
1217 if (link
->kernel_operstate
== IF_OPER_UNKNOWN
)
1218 /* operstate may not be implemented, so fall back to flags */
1219 if ((link
->flags
& IFF_LOWER_UP
) && !(link
->flags
& IFF_DORMANT
))
1225 static int link_up_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1226 _cleanup_link_unref_ Link
*link
= userdata
;
1231 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1234 r
= sd_netlink_message_get_errno(m
);
1236 /* we warn but don't fail the link, as it may be
1238 log_link_warning_errno(link
, r
, "Could not bring up interface: %m");
1243 static int link_up(Link
*link
) {
1244 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1245 uint8_t ipv6ll_mode
;
1249 assert(link
->network
);
1250 assert(link
->manager
);
1251 assert(link
->manager
->rtnl
);
1253 log_link_debug(link
, "Bringing link up");
1255 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1257 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1259 r
= sd_rtnl_message_link_set_flags(req
, IFF_UP
, IFF_UP
);
1261 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1263 if (link
->network
->mac
) {
1264 r
= sd_netlink_message_append_ether_addr(req
, IFLA_ADDRESS
, link
->network
->mac
);
1266 return log_link_error_errno(link
, r
, "Could not set MAC address: %m");
1269 if (link
->network
->mtu
) {
1270 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, link
->network
->mtu
);
1272 return log_link_error_errno(link
, r
, "Could not set MTU: %m");
1275 r
= sd_netlink_message_open_container(req
, IFLA_AF_SPEC
);
1277 return log_link_error_errno(link
, r
, "Could not open IFLA_AF_SPEC container: %m");
1279 if (socket_ipv6_is_supported()) {
1280 /* if the kernel lacks ipv6 support setting IFF_UP fails if any ipv6 options are passed */
1281 r
= sd_netlink_message_open_container(req
, AF_INET6
);
1283 return log_link_error_errno(link
, r
, "Could not open AF_INET6 container: %m");
1285 ipv6ll_mode
= link_ipv6ll_enabled(link
) ? IN6_ADDR_GEN_MODE_EUI64
: IN6_ADDR_GEN_MODE_NONE
;
1286 r
= sd_netlink_message_append_u8(req
, IFLA_INET6_ADDR_GEN_MODE
, ipv6ll_mode
);
1288 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_ADDR_GEN_MODE: %m");
1290 if (!in_addr_is_null(AF_INET6
, &link
->network
->ipv6_token
)) {
1291 r
= sd_netlink_message_append_in6_addr(req
, IFLA_INET6_TOKEN
, &link
->network
->ipv6_token
.in6
);
1293 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_TOKEN: %m");
1296 r
= sd_netlink_message_close_container(req
);
1298 return log_link_error_errno(link
, r
, "Could not close AF_INET6 container: %m");
1301 r
= sd_netlink_message_close_container(req
);
1303 return log_link_error_errno(link
, r
, "Could not close IFLA_AF_SPEC container: %m");
1305 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_up_handler
, link
, 0, NULL
);
1307 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1314 static int link_down_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1315 _cleanup_link_unref_ Link
*link
= userdata
;
1320 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1323 r
= sd_netlink_message_get_errno(m
);
1325 log_link_warning_errno(link
, r
, "Could not bring down interface: %m");
1330 static int link_down(Link
*link
) {
1331 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1335 assert(link
->manager
);
1336 assert(link
->manager
->rtnl
);
1338 log_link_debug(link
, "Bringing link down");
1340 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
,
1341 RTM_SETLINK
, link
->ifindex
);
1343 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1345 r
= sd_rtnl_message_link_set_flags(req
, 0, IFF_UP
);
1347 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1349 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_down_handler
, link
, 0, NULL
);
1351 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1358 static int link_handle_bound_to_list(Link
*link
) {
1362 bool required_up
= false;
1363 bool link_is_up
= false;
1367 if (hashmap_isempty(link
->bound_to_links
))
1370 if (link
->flags
& IFF_UP
)
1373 HASHMAP_FOREACH (l
, link
->bound_to_links
, i
)
1374 if (link_has_carrier(l
)) {
1379 if (!required_up
&& link_is_up
) {
1380 r
= link_down(link
);
1383 } else if (required_up
&& !link_is_up
) {
1392 static int link_handle_bound_by_list(Link
*link
) {
1399 if (hashmap_isempty(link
->bound_by_links
))
1402 HASHMAP_FOREACH (l
, link
->bound_by_links
, i
) {
1403 r
= link_handle_bound_to_list(l
);
1411 static int link_put_carrier(Link
*link
, Link
*carrier
, Hashmap
**h
) {
1417 if (link
== carrier
)
1420 if (hashmap_get(*h
, INT_TO_PTR(carrier
->ifindex
)))
1423 r
= hashmap_ensure_allocated(h
, NULL
);
1427 r
= hashmap_put(*h
, INT_TO_PTR(carrier
->ifindex
), carrier
);
1434 static int link_new_bound_by_list(Link
*link
) {
1439 bool list_updated
= false;
1442 assert(link
->manager
);
1446 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1447 if (!carrier
->network
)
1450 if (strv_isempty(carrier
->network
->bind_carrier
))
1453 if (strv_fnmatch(carrier
->network
->bind_carrier
, link
->ifname
, 0)) {
1454 r
= link_put_carrier(link
, carrier
, &link
->bound_by_links
);
1458 list_updated
= true;
1465 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
) {
1466 r
= link_put_carrier(carrier
, link
, &carrier
->bound_to_links
);
1476 static int link_new_bound_to_list(Link
*link
) {
1481 bool list_updated
= false;
1484 assert(link
->manager
);
1489 if (strv_isempty(link
->network
->bind_carrier
))
1494 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1495 if (strv_fnmatch(link
->network
->bind_carrier
, carrier
->ifname
, 0)) {
1496 r
= link_put_carrier(link
, carrier
, &link
->bound_to_links
);
1500 list_updated
= true;
1507 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
) {
1508 r
= link_put_carrier(carrier
, link
, &carrier
->bound_by_links
);
1518 static int link_new_carrier_maps(Link
*link
) {
1521 r
= link_new_bound_by_list(link
);
1525 r
= link_handle_bound_by_list(link
);
1529 r
= link_new_bound_to_list(link
);
1533 r
= link_handle_bound_to_list(link
);
1540 static void link_free_bound_to_list(Link
*link
) {
1544 HASHMAP_FOREACH (bound_to
, link
->bound_to_links
, i
) {
1545 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(bound_to
->ifindex
));
1547 if (hashmap_remove(bound_to
->bound_by_links
, INT_TO_PTR(link
->ifindex
)))
1548 link_save(bound_to
);
1554 static void link_free_bound_by_list(Link
*link
) {
1558 HASHMAP_FOREACH (bound_by
, link
->bound_by_links
, i
) {
1559 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(bound_by
->ifindex
));
1561 if (hashmap_remove(bound_by
->bound_to_links
, INT_TO_PTR(link
->ifindex
))) {
1562 link_save(bound_by
);
1563 link_handle_bound_to_list(bound_by
);
1570 static void link_free_carrier_maps(Link
*link
) {
1571 bool list_updated
= false;
1575 if (!hashmap_isempty(link
->bound_to_links
)) {
1576 link_free_bound_to_list(link
);
1577 list_updated
= true;
1580 if (!hashmap_isempty(link
->bound_by_links
)) {
1581 link_free_bound_by_list(link
);
1582 list_updated
= true;
1591 void link_drop(Link
*link
) {
1592 if (!link
|| link
->state
== LINK_STATE_LINGER
)
1595 link_set_state(link
, LINK_STATE_LINGER
);
1597 link_free_carrier_maps(link
);
1599 log_link_debug(link
, "Link removed");
1606 static int link_joined(Link
*link
) {
1610 assert(link
->network
);
1612 if (!hashmap_isempty(link
->bound_to_links
)) {
1613 r
= link_handle_bound_to_list(link
);
1616 } else if (!(link
->flags
& IFF_UP
)) {
1619 link_enter_failed(link
);
1624 if(link
->network
->bridge
) {
1625 r
= link_set_bridge(link
);
1627 log_link_error_errno(link
, r
, "Could not set bridge message: %m");
1630 return link_enter_set_addresses(link
);
1633 static int netdev_join_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1634 _cleanup_link_unref_ Link
*link
= userdata
;
1638 assert(link
->network
);
1642 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1645 r
= sd_netlink_message_get_errno(m
);
1646 if (r
< 0 && r
!= -EEXIST
) {
1647 log_link_error_errno(link
, r
, "Could not join netdev: %m");
1648 link_enter_failed(link
);
1651 log_link_debug(link
, "Joined netdev");
1653 if (link
->enslaving
<= 0)
1659 static int link_enter_join_netdev(Link
*link
) {
1665 assert(link
->network
);
1666 assert(link
->state
== LINK_STATE_PENDING
);
1668 link_set_state(link
, LINK_STATE_ENSLAVING
);
1672 if (!link
->network
->bridge
&&
1673 !link
->network
->bond
&&
1674 hashmap_isempty(link
->network
->stacked_netdevs
))
1675 return link_joined(link
);
1677 if (link
->network
->bond
) {
1678 log_struct(LOG_DEBUG
,
1679 LOG_LINK_INTERFACE(link
),
1680 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1681 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bond
->ifname
),
1684 r
= netdev_join(link
->network
->bond
, link
, netdev_join_handler
);
1686 log_struct_errno(LOG_WARNING
, r
,
1687 LOG_LINK_INTERFACE(link
),
1688 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1689 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bond
->ifname
),
1692 link_enter_failed(link
);
1699 if (link
->network
->bridge
) {
1700 log_struct(LOG_DEBUG
,
1701 LOG_LINK_INTERFACE(link
),
1702 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1703 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bridge
->ifname
),
1706 r
= netdev_join(link
->network
->bridge
, link
, netdev_join_handler
);
1708 log_struct_errno(LOG_WARNING
, r
,
1709 LOG_LINK_INTERFACE(link
),
1710 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1711 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bridge
->ifname
),
1713 link_enter_failed(link
);
1720 HASHMAP_FOREACH(netdev
, link
->network
->stacked_netdevs
, i
) {
1722 log_struct(LOG_DEBUG
,
1723 LOG_LINK_INTERFACE(link
),
1724 LOG_NETDEV_INTERFACE(netdev
),
1725 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", netdev
->ifname
),
1728 r
= netdev_join(netdev
, link
, netdev_join_handler
);
1730 log_struct_errno(LOG_WARNING
, r
,
1731 LOG_LINK_INTERFACE(link
),
1732 LOG_NETDEV_INTERFACE(netdev
),
1733 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", netdev
->ifname
),
1735 link_enter_failed(link
);
1745 static int link_set_ipv4_forward(Link
*link
) {
1746 const char *p
= NULL
, *v
;
1749 if (link
->flags
& IFF_LOOPBACK
)
1752 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1755 p
= strjoina("/proc/sys/net/ipv4/conf/", link
->ifname
, "/forwarding");
1756 v
= one_zero(link_ipv4_forward_enabled(link
));
1758 r
= write_string_file(p
, v
, 0);
1760 /* If the right value is set anyway, don't complain */
1761 if (verify_one_line_file(p
, v
) > 0)
1764 log_link_warning_errno(link
, r
, "Cannot configure IPv4 forwarding for interface %s: %m", link
->ifname
);
1770 static int link_set_ipv6_forward(Link
*link
) {
1771 const char *p
= NULL
, *v
= NULL
;
1774 /* Make this a NOP if IPv6 is not available */
1775 if (!socket_ipv6_is_supported())
1778 if (link
->flags
& IFF_LOOPBACK
)
1781 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1784 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/forwarding");
1785 v
= one_zero(link_ipv6_forward_enabled(link
));
1787 r
= write_string_file(p
, v
, 0);
1789 /* If the right value is set anyway, don't complain */
1790 if (verify_one_line_file(p
, v
) > 0)
1793 log_link_warning_errno(link
, r
, "Cannot configure IPv6 forwarding for interface: %m");
1799 static int link_set_ipv6_privacy_extensions(Link
*link
) {
1800 char buf
[DECIMAL_STR_MAX(unsigned) + 1];
1801 IPv6PrivacyExtensions s
;
1802 const char *p
= NULL
;
1805 /* Make this a NOP if IPv6 is not available */
1806 if (!socket_ipv6_is_supported())
1809 s
= link_ipv6_privacy_extensions(link
);
1810 if (s
== _IPV6_PRIVACY_EXTENSIONS_INVALID
)
1813 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/use_tempaddr");
1814 xsprintf(buf
, "%u", link
->network
->ipv6_privacy_extensions
);
1816 r
= write_string_file(p
, buf
, 0);
1818 /* If the right value is set anyway, don't complain */
1819 if (verify_one_line_file(p
, buf
) > 0)
1822 log_link_warning_errno(link
, r
, "Cannot configure IPv6 privacy extension for interface: %m");
1828 static int link_set_ipv6_accept_ra(Link
*link
) {
1829 const char *p
= NULL
, *v
= NULL
;
1832 /* Make this a NOP if IPv6 is not available */
1833 if (!socket_ipv6_is_supported())
1836 if (link
->flags
& IFF_LOOPBACK
)
1839 /* If unset use system default (enabled if local forwarding is disabled.
1840 * disabled if local forwarding is enabled).
1841 * If set, ignore or enforce RA independent of local forwarding state.
1843 if (link
->network
->ipv6_accept_ra
< 0)
1844 /* default to accept RA if ip_forward is disabled and ignore RA if ip_forward is enabled */
1846 else if (link
->network
->ipv6_accept_ra
> 0)
1847 /* "2" means accept RA even if ip_forward is enabled */
1850 /* "0" means ignore RA */
1853 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/accept_ra");
1855 r
= write_string_file(p
, v
, 0);
1857 /* If the right value is set anyway, don't complain */
1858 if (verify_one_line_file(p
, v
) > 0)
1861 log_link_warning_errno(link
, r
, "Cannot configure IPv6 accept_ra for interface: %m");
1867 static int link_set_ipv6_dad_transmits(Link
*link
) {
1868 char buf
[DECIMAL_STR_MAX(unsigned) + 1];
1869 const char *p
= NULL
;
1872 /* Make this a NOP if IPv6 is not available */
1873 if (!socket_ipv6_is_supported())
1876 if (link
->flags
& IFF_LOOPBACK
)
1879 if (link
->network
->ipv6_dad_transmits
< 0)
1882 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/dad_transmits");
1884 xsprintf(buf
, "%u", link
->network
->ipv6_dad_transmits
);
1886 r
= write_string_file(p
, buf
, 0);
1888 /* If the right value is set anyway, don't complain */
1889 if (verify_one_line_file(p
, buf
) > 0)
1892 log_link_warning_errno(link
, r
, "Cannot set IPv6 dad transmits for interface: %m");
1898 static int link_configure(Link
*link
) {
1902 assert(link
->network
);
1903 assert(link
->state
== LINK_STATE_PENDING
);
1905 r
= link_set_bridge_fdb(link
);
1909 r
= link_set_ipv4_forward(link
);
1913 r
= link_set_ipv6_forward(link
);
1917 r
= link_set_ipv6_privacy_extensions(link
);
1921 r
= link_set_ipv6_accept_ra(link
);
1925 r
= link_set_ipv6_dad_transmits(link
);
1929 if (link_ipv4ll_enabled(link
)) {
1930 r
= ipv4ll_configure(link
);
1935 if (link_dhcp4_enabled(link
)) {
1936 r
= dhcp4_configure(link
);
1941 if (link_dhcp4_server_enabled(link
)) {
1942 r
= sd_dhcp_server_new(&link
->dhcp_server
, link
->ifindex
);
1946 r
= sd_dhcp_server_attach_event(link
->dhcp_server
, NULL
, 0);
1951 if (link_dhcp6_enabled(link
)) {
1952 r
= icmp6_configure(link
);
1957 if (link_lldp_enabled(link
)) {
1958 r
= sd_lldp_new(link
->ifindex
, link
->ifname
, &link
->mac
, &link
->lldp
);
1962 r
= sd_lldp_attach_event(link
->lldp
, NULL
, 0);
1966 r
= sd_lldp_set_callback(link
->lldp
,
1967 lldp_handler
, link
);
1972 if (link_has_carrier(link
)) {
1973 r
= link_acquire_conf(link
);
1978 return link_enter_join_netdev(link
);
1981 static int link_initialized_and_synced(sd_netlink
*rtnl
, sd_netlink_message
*m
,
1983 _cleanup_link_unref_ Link
*link
= userdata
;
1988 assert(link
->ifname
);
1989 assert(link
->manager
);
1991 if (link
->state
!= LINK_STATE_PENDING
)
1994 log_link_debug(link
, "Link state is up-to-date");
1996 r
= link_new_bound_by_list(link
);
2000 r
= link_handle_bound_by_list(link
);
2004 r
= network_get(link
->manager
, link
->udev_device
, link
->ifname
,
2005 &link
->mac
, &network
);
2007 link_enter_unmanaged(link
);
2012 if (link
->flags
& IFF_LOOPBACK
) {
2013 if (network
->link_local
!= ADDRESS_FAMILY_NO
)
2014 log_link_debug(link
, "Ignoring link-local autoconfiguration for loopback link");
2016 if (network
->dhcp
!= ADDRESS_FAMILY_NO
)
2017 log_link_debug(link
, "Ignoring DHCP clients for loopback link");
2019 if (network
->dhcp_server
)
2020 log_link_debug(link
, "Ignoring DHCP server for loopback link");
2023 r
= network_apply(link
->manager
, network
, link
);
2027 r
= link_new_bound_to_list(link
);
2031 r
= link_configure(link
);
2038 int link_initialized(Link
*link
, struct udev_device
*device
) {
2039 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
2043 assert(link
->manager
);
2044 assert(link
->manager
->rtnl
);
2047 if (link
->state
!= LINK_STATE_PENDING
)
2050 if (link
->udev_device
)
2053 log_link_debug(link
, "udev initialized link");
2055 link
->udev_device
= udev_device_ref(device
);
2057 /* udev has initialized the link, but we don't know if we have yet
2058 * processed the NEWLINK messages with the latest state. Do a GETLINK,
2059 * when it returns we know that the pending NEWLINKs have already been
2060 * processed and that we are up-to-date */
2062 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_GETLINK
,
2067 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
,
2068 link_initialized_and_synced
, link
, 0, NULL
);
2077 int link_add(Manager
*m
, sd_netlink_message
*message
, Link
**ret
) {
2079 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
2080 char ifindex_str
[2 + DECIMAL_STR_MAX(int)];
2088 r
= link_new(m
, message
, ret
);
2094 log_link_debug(link
, "Link %d added", link
->ifindex
);
2096 if (detect_container() <= 0) {
2097 /* not in a container, udev will be around */
2098 sprintf(ifindex_str
, "n%d", link
->ifindex
);
2099 device
= udev_device_new_from_device_id(m
->udev
, ifindex_str
);
2101 r
= log_link_warning_errno(link
, errno
, "Could not find udev device: %m");
2105 if (udev_device_get_is_initialized(device
) <= 0) {
2107 log_link_debug(link
, "link pending udev initialization...");
2111 r
= link_initialized(link
, device
);
2115 /* we are calling a callback directly, so must take a ref */
2118 r
= link_initialized_and_synced(m
->rtnl
, NULL
, link
);
2125 link_enter_failed(link
);
2129 static int link_carrier_gained(Link
*link
) {
2134 if (link
->network
) {
2135 r
= link_acquire_conf(link
);
2137 link_enter_failed(link
);
2142 r
= link_handle_bound_by_list(link
);
2149 static int link_carrier_lost(Link
*link
) {
2154 r
= link_stop_clients(link
);
2156 link_enter_failed(link
);
2160 r
= link_handle_bound_by_list(link
);
2167 int link_carrier_reset(Link
*link
) {
2172 if (link_has_carrier(link
)) {
2173 r
= link_carrier_lost(link
);
2177 r
= link_carrier_gained(link
);
2181 log_link_info(link
, "Reset carrier");
2188 int link_update(Link
*link
, sd_netlink_message
*m
) {
2189 struct ether_addr mac
;
2192 bool had_carrier
, carrier_gained
, carrier_lost
;
2196 assert(link
->ifname
);
2199 if (link
->state
== LINK_STATE_LINGER
) {
2201 log_link_info(link
, "Link readded");
2202 link_set_state(link
, LINK_STATE_ENSLAVING
);
2204 r
= link_new_carrier_maps(link
);
2209 r
= sd_netlink_message_read_string(m
, IFLA_IFNAME
, &ifname
);
2210 if (r
>= 0 && !streq(ifname
, link
->ifname
)) {
2211 log_link_info(link
, "Renamed to %s", ifname
);
2213 link_free_carrier_maps(link
);
2215 r
= free_and_strdup(&link
->ifname
, ifname
);
2219 r
= link_new_carrier_maps(link
);
2224 r
= sd_netlink_message_read_u32(m
, IFLA_MTU
, &mtu
);
2225 if (r
>= 0 && mtu
> 0) {
2227 if (!link
->original_mtu
) {
2228 link
->original_mtu
= mtu
;
2229 log_link_debug(link
, "Saved original MTU: %" PRIu32
, link
->original_mtu
);
2232 if (link
->dhcp_client
) {
2233 r
= sd_dhcp_client_set_mtu(link
->dhcp_client
,
2236 log_link_warning_errno(link
, r
, "Could not update MTU in DHCP client: %m");
2242 /* The kernel may broadcast NEWLINK messages without the MAC address
2243 set, simply ignore them. */
2244 r
= sd_netlink_message_read_ether_addr(m
, IFLA_ADDRESS
, &mac
);
2246 if (memcmp(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2249 memcpy(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2252 log_link_debug(link
, "MAC address: "
2253 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2254 mac
.ether_addr_octet
[0],
2255 mac
.ether_addr_octet
[1],
2256 mac
.ether_addr_octet
[2],
2257 mac
.ether_addr_octet
[3],
2258 mac
.ether_addr_octet
[4],
2259 mac
.ether_addr_octet
[5]);
2262 r
= sd_ipv4ll_set_mac(link
->ipv4ll
, &link
->mac
);
2264 return log_link_warning_errno(link
, r
, "Could not update MAC address in IPv4LL client: %m");
2267 if (link
->dhcp_client
) {
2268 r
= sd_dhcp_client_set_mac(link
->dhcp_client
,
2269 (const uint8_t *) &link
->mac
,
2273 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCP client: %m");
2276 if (link
->dhcp6_client
) {
2277 r
= sd_dhcp6_client_set_mac(link
->dhcp6_client
,
2278 (const uint8_t *) &link
->mac
,
2282 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCPv6 client: %m");
2287 had_carrier
= link_has_carrier(link
);
2289 r
= link_update_flags(link
, m
);
2293 carrier_gained
= !had_carrier
&& link_has_carrier(link
);
2294 carrier_lost
= had_carrier
&& !link_has_carrier(link
);
2296 if (carrier_gained
) {
2297 log_link_info(link
, "Gained carrier");
2299 r
= link_carrier_gained(link
);
2302 } else if (carrier_lost
) {
2303 log_link_info(link
, "Lost carrier");
2305 r
= link_carrier_lost(link
);
2314 static void link_update_operstate(Link
*link
) {
2315 LinkOperationalState operstate
;
2318 if (link
->kernel_operstate
== IF_OPER_DORMANT
)
2319 operstate
= LINK_OPERSTATE_DORMANT
;
2320 else if (link_has_carrier(link
)) {
2322 uint8_t scope
= RT_SCOPE_NOWHERE
;
2325 /* if we have carrier, check what addresses we have */
2326 SET_FOREACH(address
, link
->addresses
, i
) {
2327 if (!address_is_ready(address
))
2330 if (address
->scope
< scope
)
2331 scope
= address
->scope
;
2334 /* for operstate we also take foreign addresses into account */
2335 SET_FOREACH(address
, link
->addresses_foreign
, i
) {
2336 if (!address_is_ready(address
))
2339 if (address
->scope
< scope
)
2340 scope
= address
->scope
;
2343 if (scope
< RT_SCOPE_SITE
)
2344 /* universally accessible addresses found */
2345 operstate
= LINK_OPERSTATE_ROUTABLE
;
2346 else if (scope
< RT_SCOPE_HOST
)
2347 /* only link or site local addresses found */
2348 operstate
= LINK_OPERSTATE_DEGRADED
;
2350 /* no useful addresses found */
2351 operstate
= LINK_OPERSTATE_CARRIER
;
2352 } else if (link
->flags
& IFF_UP
)
2353 operstate
= LINK_OPERSTATE_NO_CARRIER
;
2355 operstate
= LINK_OPERSTATE_OFF
;
2357 if (link
->operstate
!= operstate
) {
2358 link
->operstate
= operstate
;
2359 link_send_changed(link
, "OperationalState", NULL
);
2363 int link_save(Link
*link
) {
2364 _cleanup_free_
char *temp_path
= NULL
;
2365 _cleanup_fclose_
FILE *f
= NULL
;
2366 const char *admin_state
, *oper_state
;
2372 assert(link
->state_file
);
2373 assert(link
->lease_file
);
2374 assert(link
->manager
);
2376 link_update_operstate(link
);
2378 r
= manager_save(link
->manager
);
2382 if (link
->state
== LINK_STATE_LINGER
) {
2383 unlink(link
->state_file
);
2387 admin_state
= link_state_to_string(link
->state
);
2388 assert(admin_state
);
2390 oper_state
= link_operstate_to_string(link
->operstate
);
2393 r
= fopen_temporary(link
->state_file
, &f
, &temp_path
);
2397 fchmod(fileno(f
), 0644);
2400 "# This is private data. Do not parse.\n"
2403 admin_state
, oper_state
);
2405 if (link
->network
) {
2406 char **address
, **domain
;
2408 sd_dhcp6_lease
*dhcp6_lease
= NULL
;
2410 if (link
->dhcp6_client
) {
2411 r
= sd_dhcp6_client_get_lease(link
->dhcp6_client
,
2414 log_link_debug(link
, "No DHCPv6 lease");
2417 fprintf(f
, "NETWORK_FILE=%s\n", link
->network
->filename
);
2421 STRV_FOREACH(address
, link
->network
->dns
) {
2428 if (link
->network
->dhcp_dns
&&
2430 const struct in_addr
*addresses
;
2432 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
2436 serialize_in_addrs(f
, addresses
, r
);
2441 if (link
->network
->dhcp_dns
&& dhcp6_lease
) {
2442 struct in6_addr
*in6_addrs
;
2444 r
= sd_dhcp6_lease_get_dns(dhcp6_lease
, &in6_addrs
);
2448 serialize_in6_addrs(f
, in6_addrs
, r
);
2456 STRV_FOREACH(address
, link
->network
->ntp
) {
2463 if (link
->network
->dhcp_ntp
&&
2465 const struct in_addr
*addresses
;
2467 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
2471 serialize_in_addrs(f
, addresses
, r
);
2476 if (link
->network
->dhcp_ntp
&& dhcp6_lease
) {
2477 struct in6_addr
*in6_addrs
;
2481 r
= sd_dhcp6_lease_get_ntp_addrs(dhcp6_lease
,
2486 serialize_in6_addrs(f
, in6_addrs
, r
);
2490 r
= sd_dhcp6_lease_get_ntp_fqdn(dhcp6_lease
, &hosts
);
2492 STRV_FOREACH(hostname
, hosts
) {
2495 fputs(*hostname
, f
);
2503 fprintf(f
, "DOMAINS=");
2505 STRV_FOREACH(domain
, link
->network
->domains
) {
2512 if (link
->network
->dhcp_domains
&&
2514 const char *domainname
;
2516 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
2520 fputs(domainname
, f
);
2525 if (link
->network
->dhcp_domains
&& dhcp6_lease
) {
2528 r
= sd_dhcp6_lease_get_domains(dhcp6_lease
, &domains
);
2530 STRV_FOREACH(domain
, domains
) {
2541 fprintf(f
, "WILDCARD_DOMAIN=%s\n",
2542 yes_no(link
->network
->wildcard_domain
));
2544 fprintf(f
, "LLMNR=%s\n",
2545 resolve_support_to_string(link
->network
->llmnr
));
2547 fprintf(f
, "ADDRESSES=");
2549 SET_FOREACH(a
, link
->addresses
, i
) {
2550 _cleanup_free_
char *address_str
= NULL
;
2552 r
= in_addr_to_string(a
->family
, &a
->in_addr
, &address_str
);
2558 fprintf(f
, "%s%s/%u", space
? " " : "", address_str
, a
->prefixlen
);
2565 if (!hashmap_isempty(link
->bound_to_links
)) {
2569 fputs("CARRIER_BOUND_TO=", f
);
2570 HASHMAP_FOREACH(carrier
, link
->bound_to_links
, i
) {
2573 fputs(carrier
->ifname
, f
);
2580 if (!hashmap_isempty(link
->bound_by_links
)) {
2584 fputs("CARRIER_BOUND_BY=", f
);
2585 HASHMAP_FOREACH(carrier
, link
->bound_by_links
, i
) {
2588 fputs(carrier
->ifname
, f
);
2595 if (link
->dhcp_lease
) {
2596 const char *tz
= NULL
;
2598 r
= sd_dhcp_lease_get_timezone(link
->dhcp_lease
, &tz
);
2600 fprintf(f
, "TIMEZONE=%s\n", tz
);
2603 if (link
->dhcp_lease
) {
2604 assert(link
->network
);
2606 r
= dhcp_lease_save(link
->dhcp_lease
, link
->lease_file
);
2614 unlink(link
->lease_file
);
2617 assert(link
->network
);
2619 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
2627 unlink(link
->lldp_file
);
2629 r
= fflush_and_check(f
);
2633 if (rename(temp_path
, link
->state_file
) < 0) {
2641 (void) unlink(link
->state_file
);
2643 (void) unlink(temp_path
);
2645 return log_link_error_errno(link
, r
, "Failed to save link data to %s: %m", link
->state_file
);
2648 static const char* const link_state_table
[_LINK_STATE_MAX
] = {
2649 [LINK_STATE_PENDING
] = "pending",
2650 [LINK_STATE_ENSLAVING
] = "configuring",
2651 [LINK_STATE_SETTING_ADDRESSES
] = "configuring",
2652 [LINK_STATE_SETTING_ROUTES
] = "configuring",
2653 [LINK_STATE_CONFIGURED
] = "configured",
2654 [LINK_STATE_UNMANAGED
] = "unmanaged",
2655 [LINK_STATE_FAILED
] = "failed",
2656 [LINK_STATE_LINGER
] = "linger",
2659 DEFINE_STRING_TABLE_LOOKUP(link_state
, LinkState
);
2661 static const char* const link_operstate_table
[_LINK_OPERSTATE_MAX
] = {
2662 [LINK_OPERSTATE_OFF
] = "off",
2663 [LINK_OPERSTATE_NO_CARRIER
] = "no-carrier",
2664 [LINK_OPERSTATE_DORMANT
] = "dormant",
2665 [LINK_OPERSTATE_CARRIER
] = "carrier",
2666 [LINK_OPERSTATE_DEGRADED
] = "degraded",
2667 [LINK_OPERSTATE_ROUTABLE
] = "routable",
2670 DEFINE_STRING_TABLE_LOOKUP(link_operstate
, LinkOperationalState
);