1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Tom Gundersen <teg@jklm.no>
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 #include <netinet/ether.h>
29 #include "socket-util.h"
31 #include "udev-util.h"
32 #include "netlink-util.h"
33 #include "dhcp-lease-internal.h"
34 #include "network-internal.h"
36 #include "networkd-link.h"
37 #include "networkd-netdev.h"
39 bool link_dhcp6_enabled(Link
*link
) {
40 if (link
->flags
& IFF_LOOPBACK
)
46 return link
->network
->dhcp
& ADDRESS_FAMILY_IPV6
;
49 bool link_dhcp4_enabled(Link
*link
) {
50 if (link
->flags
& IFF_LOOPBACK
)
56 return link
->network
->dhcp
& ADDRESS_FAMILY_IPV4
;
59 bool link_dhcp4_server_enabled(Link
*link
) {
60 if (link
->flags
& IFF_LOOPBACK
)
66 return link
->network
->dhcp_server
;
69 bool link_ipv4ll_enabled(Link
*link
) {
70 if (link
->flags
& IFF_LOOPBACK
)
76 return link
->network
->link_local
& ADDRESS_FAMILY_IPV4
;
79 bool link_ipv6ll_enabled(Link
*link
) {
80 if (link
->flags
& IFF_LOOPBACK
)
86 return link
->network
->link_local
& ADDRESS_FAMILY_IPV6
;
89 bool link_lldp_enabled(Link
*link
) {
90 if (link
->flags
& IFF_LOOPBACK
)
96 if (link
->network
->bridge
)
99 return link
->network
->lldp
;
102 static bool link_ipv4_forward_enabled(Link
*link
) {
103 if (link
->flags
& IFF_LOOPBACK
)
109 return link
->network
->ip_forward
& ADDRESS_FAMILY_IPV4
;
112 static bool link_ipv6_forward_enabled(Link
*link
) {
113 if (link
->flags
& IFF_LOOPBACK
)
119 return link
->network
->ip_forward
& ADDRESS_FAMILY_IPV6
;
122 static IPv6PrivacyExtensions
link_ipv6_privacy_extensions(Link
*link
) {
123 if (link
->flags
& IFF_LOOPBACK
)
124 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
127 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
129 return link
->network
->ipv6_privacy_extensions
;
132 #define FLAG_STRING(string, flag, old, new) \
133 (((old ^ new) & flag) \
134 ? ((old & flag) ? (" -" string) : (" +" string)) \
137 static int link_update_flags(Link
*link
, sd_netlink_message
*m
) {
138 unsigned flags
, unknown_flags_added
, unknown_flags_removed
, unknown_flags
;
144 r
= sd_rtnl_message_link_get_flags(m
, &flags
);
146 return log_link_warning_errno(link
, r
, "Could not get link flags: %m");
148 r
= sd_netlink_message_read_u8(m
, IFLA_OPERSTATE
, &operstate
);
150 /* if we got a message without operstate, take it to mean
151 the state was unchanged */
152 operstate
= link
->kernel_operstate
;
154 if ((link
->flags
== flags
) && (link
->kernel_operstate
== operstate
))
157 if (link
->flags
!= flags
) {
158 log_link_debug(link
, "Flags change:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
159 FLAG_STRING("LOOPBACK", IFF_LOOPBACK
, link
->flags
, flags
),
160 FLAG_STRING("MASTER", IFF_MASTER
, link
->flags
, flags
),
161 FLAG_STRING("SLAVE", IFF_SLAVE
, link
->flags
, flags
),
162 FLAG_STRING("UP", IFF_UP
, link
->flags
, flags
),
163 FLAG_STRING("DORMANT", IFF_DORMANT
, link
->flags
, flags
),
164 FLAG_STRING("LOWER_UP", IFF_LOWER_UP
, link
->flags
, flags
),
165 FLAG_STRING("RUNNING", IFF_RUNNING
, link
->flags
, flags
),
166 FLAG_STRING("MULTICAST", IFF_MULTICAST
, link
->flags
, flags
),
167 FLAG_STRING("BROADCAST", IFF_BROADCAST
, link
->flags
, flags
),
168 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT
, link
->flags
, flags
),
169 FLAG_STRING("PROMISC", IFF_PROMISC
, link
->flags
, flags
),
170 FLAG_STRING("ALLMULTI", IFF_ALLMULTI
, link
->flags
, flags
),
171 FLAG_STRING("PORTSEL", IFF_PORTSEL
, link
->flags
, flags
),
172 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA
, link
->flags
, flags
),
173 FLAG_STRING("DYNAMIC", IFF_DYNAMIC
, link
->flags
, flags
),
174 FLAG_STRING("NOARP", IFF_NOARP
, link
->flags
, flags
),
175 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS
, link
->flags
, flags
),
176 FLAG_STRING("DEBUG", IFF_DEBUG
, link
->flags
, flags
),
177 FLAG_STRING("ECHO", IFF_ECHO
, link
->flags
, flags
));
179 unknown_flags
= ~(IFF_LOOPBACK
| IFF_MASTER
| IFF_SLAVE
| IFF_UP
|
180 IFF_DORMANT
| IFF_LOWER_UP
| IFF_RUNNING
|
181 IFF_MULTICAST
| IFF_BROADCAST
| IFF_POINTOPOINT
|
182 IFF_PROMISC
| IFF_ALLMULTI
| IFF_PORTSEL
|
183 IFF_AUTOMEDIA
| IFF_DYNAMIC
| IFF_NOARP
|
184 IFF_NOTRAILERS
| IFF_DEBUG
| IFF_ECHO
);
185 unknown_flags_added
= ((link
->flags
^ flags
) & flags
& unknown_flags
);
186 unknown_flags_removed
= ((link
->flags
^ flags
) & link
->flags
& unknown_flags
);
188 /* link flags are currently at most 18 bits, let's align to
190 if (unknown_flags_added
)
192 "Unknown link flags gained: %#.5x (ignoring)",
193 unknown_flags_added
);
195 if (unknown_flags_removed
)
197 "Unknown link flags lost: %#.5x (ignoring)",
198 unknown_flags_removed
);
202 link
->kernel_operstate
= operstate
;
209 static int link_new(Manager
*manager
, sd_netlink_message
*message
, Link
**ret
) {
210 _cleanup_link_unref_ Link
*link
= NULL
;
219 r
= sd_netlink_message_get_type(message
, &type
);
222 else if (type
!= RTM_NEWLINK
)
225 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
228 else if (ifindex
<= 0)
231 r
= sd_netlink_message_read_string(message
, IFLA_IFNAME
, &ifname
);
235 link
= new0(Link
, 1);
240 link
->manager
= manager
;
241 link
->state
= LINK_STATE_PENDING
;
242 link
->rtnl_extended_attrs
= true;
243 link
->ifindex
= ifindex
;
244 link
->ifname
= strdup(ifname
);
248 r
= sd_netlink_message_read_ether_addr(message
, IFLA_ADDRESS
, &link
->mac
);
250 log_link_debug(link
, "MAC address not found for new device, continuing without");
252 r
= asprintf(&link
->state_file
, "/run/systemd/netif/links/%d",
257 r
= asprintf(&link
->lease_file
, "/run/systemd/netif/leases/%d",
262 r
= asprintf(&link
->lldp_file
, "/run/systemd/netif/lldp/%d",
268 r
= hashmap_ensure_allocated(&manager
->links
, NULL
);
272 r
= hashmap_put(manager
->links
, INT_TO_PTR(link
->ifindex
), link
);
276 r
= link_update_flags(link
, message
);
286 static void link_free(Link
*link
) {
294 while ((address
= link
->addresses
)) {
295 LIST_REMOVE(addresses
, link
->addresses
, address
);
296 address_free(address
);
299 while ((address
= link
->pool_addresses
)) {
300 LIST_REMOVE(addresses
, link
->pool_addresses
, address
);
301 address_free(address
);
304 sd_dhcp_server_unref(link
->dhcp_server
);
305 sd_dhcp_client_unref(link
->dhcp_client
);
306 sd_dhcp_lease_unref(link
->dhcp_lease
);
308 free(link
->lease_file
);
310 sd_lldp_free(link
->lldp
);
312 free(link
->lldp_file
);
314 sd_ipv4ll_unref(link
->ipv4ll
);
315 sd_dhcp6_client_unref(link
->dhcp6_client
);
316 sd_icmp6_nd_unref(link
->icmp6_router_discovery
);
319 hashmap_remove(link
->manager
->links
, INT_TO_PTR(link
->ifindex
));
323 free(link
->state_file
);
325 udev_device_unref(link
->udev_device
);
327 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
)
328 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(carrier
->ifindex
));
329 hashmap_free(link
->bound_to_links
);
331 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
)
332 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(carrier
->ifindex
));
333 hashmap_free(link
->bound_by_links
);
338 Link
*link_unref(Link
*link
) {
339 if (link
&& (-- link
->n_ref
<= 0))
345 Link
*link_ref(Link
*link
) {
347 assert_se(++ link
->n_ref
>= 2);
352 int link_get(Manager
*m
, int ifindex
, Link
**ret
) {
359 link
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
368 static void link_set_state(Link
*link
, LinkState state
) {
371 if (link
->state
== state
)
376 link_send_changed(link
, "AdministrativeState", NULL
);
381 static void link_enter_unmanaged(Link
*link
) {
384 log_link_debug(link
, "Unmanaged");
386 link_set_state(link
, LINK_STATE_UNMANAGED
);
391 static int link_stop_clients(Link
*link
) {
395 assert(link
->manager
);
396 assert(link
->manager
->event
);
401 if (link
->dhcp_client
) {
402 k
= sd_dhcp_client_stop(link
->dhcp_client
);
404 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv4 client: %m");
408 k
= sd_ipv4ll_stop(link
->ipv4ll
);
410 r
= log_link_warning_errno(link
, r
, "Could not stop IPv4 link-local: %m");
413 if(link
->icmp6_router_discovery
) {
414 if (link
->dhcp6_client
) {
415 k
= sd_dhcp6_client_stop(link
->dhcp6_client
);
417 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv6 client: %m");
420 k
= sd_icmp6_nd_stop(link
->icmp6_router_discovery
);
422 r
= log_link_warning_errno(link
, r
, "Could not stop ICMPv6 router discovery: %m");
426 k
= sd_lldp_stop(link
->lldp
);
428 r
= log_link_warning_errno(link
, r
, "Could not stop LLDP: %m");
434 void link_enter_failed(Link
*link
) {
437 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
440 log_link_warning(link
, "Failed");
442 link_set_state(link
, LINK_STATE_FAILED
);
444 link_stop_clients(link
);
449 static Address
* link_find_dhcp_server_address(Link
*link
) {
453 assert(link
->network
);
455 /* The first statically configured address if there is any */
456 LIST_FOREACH(addresses
, address
, link
->network
->static_addresses
) {
458 if (address
->family
!= AF_INET
)
461 if (in_addr_is_null(address
->family
, &address
->in_addr
))
467 /* If that didn't work, find a suitable address we got from the pool */
468 LIST_FOREACH(addresses
, address
, link
->pool_addresses
) {
469 if (address
->family
!= AF_INET
)
478 static int link_enter_configured(Link
*link
) {
480 assert(link
->network
);
481 assert(link
->state
== LINK_STATE_SETTING_ROUTES
);
483 log_link_info(link
, "Configured");
485 link_set_state(link
, LINK_STATE_CONFIGURED
);
492 void link_client_handler(Link
*link
) {
494 assert(link
->network
);
496 if (!link
->static_configured
)
499 if (link_ipv4ll_enabled(link
))
500 if (!link
->ipv4ll_address
||
504 if ((link_dhcp4_enabled(link
) && !link_dhcp6_enabled(link
) &&
505 !link
->dhcp4_configured
) ||
506 (link_dhcp6_enabled(link
) && !link_dhcp4_enabled(link
) &&
507 !link
->dhcp6_configured
) ||
508 (link_dhcp4_enabled(link
) && link_dhcp6_enabled(link
) &&
509 !link
->dhcp4_configured
&& !link
->dhcp6_configured
))
512 if (link
->state
!= LINK_STATE_CONFIGURED
)
513 link_enter_configured(link
);
518 static int route_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
519 _cleanup_link_unref_ Link
*link
= userdata
;
522 assert(link
->link_messages
> 0);
523 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
524 LINK_STATE_SETTING_ROUTES
, LINK_STATE_FAILED
,
527 link
->link_messages
--;
529 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
532 r
= sd_netlink_message_get_errno(m
);
533 if (r
< 0 && r
!= -EEXIST
)
534 log_link_warning_errno(link
, r
, "%-*s: could not set route: %m", IFNAMSIZ
, link
->ifname
);
536 if (link
->link_messages
== 0) {
537 log_link_debug(link
, "Routes set");
538 link
->static_configured
= true;
539 link_client_handler(link
);
545 static int link_enter_set_routes(Link
*link
) {
550 assert(link
->network
);
551 assert(link
->state
== LINK_STATE_SETTING_ADDRESSES
);
553 link_set_state(link
, LINK_STATE_SETTING_ROUTES
);
555 LIST_FOREACH(routes
, rt
, link
->network
->static_routes
) {
556 r
= route_configure(rt
, link
, &route_handler
);
558 log_link_warning_errno(link
, r
, "Could not set routes: %m");
559 link_enter_failed(link
);
563 link
->link_messages
++;
566 if (link
->link_messages
== 0) {
567 link
->static_configured
= true;
568 link_client_handler(link
);
570 log_link_debug(link
, "Setting routes");
575 int link_route_drop_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
576 _cleanup_link_unref_ Link
*link
= userdata
;
581 assert(link
->ifname
);
583 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
586 r
= sd_netlink_message_get_errno(m
);
587 if (r
< 0 && r
!= -ESRCH
)
588 log_link_warning_errno(link
, r
, "%-*s: could not drop route: %m", IFNAMSIZ
, link
->ifname
);
593 static int address_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
594 _cleanup_link_unref_ Link
*link
= userdata
;
600 assert(link
->ifname
);
601 assert(link
->link_messages
> 0);
602 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
603 LINK_STATE_FAILED
, LINK_STATE_LINGER
));
605 link
->link_messages
--;
607 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
610 r
= sd_netlink_message_get_errno(m
);
611 if (r
< 0 && r
!= -EEXIST
)
612 log_link_warning_errno(link
, r
, "%-*s: could not set address: %m", IFNAMSIZ
, link
->ifname
);
614 link_rtnl_process_address(rtnl
, m
, link
->manager
);
616 if (link
->link_messages
== 0) {
617 log_link_debug(link
, "Addresses set");
618 link_enter_set_routes(link
);
624 static int link_push_dns_to_dhcp_server(Link
*link
, sd_dhcp_server
*s
) {
625 _cleanup_free_
struct in_addr
*addresses
= NULL
;
626 size_t n_addresses
= 0, n_allocated
= 0;
629 log_debug("Copying DNS server information from %s", link
->ifname
);
634 STRV_FOREACH(a
, link
->network
->dns
) {
637 /* Only look for IPv4 addresses */
638 if (inet_pton(AF_INET
, *a
, &ia
) <= 0)
641 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ 1))
644 addresses
[n_addresses
++] = ia
;
647 if (link
->network
->dhcp_dns
&&
649 const struct in_addr
*da
= NULL
;
652 n
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &da
);
655 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ n
))
658 memcpy(addresses
+ n_addresses
, da
, n
* sizeof(struct in_addr
));
663 if (n_addresses
<= 0)
666 return sd_dhcp_server_set_dns(s
, addresses
, n_addresses
);
669 static int link_push_ntp_to_dhcp_server(Link
*link
, sd_dhcp_server
*s
) {
670 _cleanup_free_
struct in_addr
*addresses
= NULL
;
671 size_t n_addresses
= 0, n_allocated
= 0;
677 log_debug("Copying NTP server information from %s", link
->ifname
);
679 STRV_FOREACH(a
, link
->network
->ntp
) {
682 /* Only look for IPv4 addresses */
683 if (inet_pton(AF_INET
, *a
, &ia
) <= 0)
686 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ 1))
689 addresses
[n_addresses
++] = ia
;
692 if (link
->network
->dhcp_ntp
&&
694 const struct in_addr
*da
= NULL
;
697 n
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &da
);
700 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ n
))
703 memcpy(addresses
+ n_addresses
, da
, n
* sizeof(struct in_addr
));
708 if (n_addresses
<= 0)
711 return sd_dhcp_server_set_ntp(s
, addresses
, n_addresses
);
714 static int link_enter_set_addresses(Link
*link
) {
719 assert(link
->network
);
720 assert(link
->state
!= _LINK_STATE_INVALID
);
722 link_set_state(link
, LINK_STATE_SETTING_ADDRESSES
);
724 LIST_FOREACH(addresses
, ad
, link
->network
->static_addresses
) {
725 r
= address_configure(ad
, link
, &address_handler
);
727 log_link_warning_errno(link
, r
, "Could not set addresses: %m");
728 link_enter_failed(link
);
732 link
->link_messages
++;
735 /* now that we can figure out a default address for the dhcp server,
737 if (link_dhcp4_server_enabled(link
)) {
740 bool acquired_uplink
= false;
742 address
= link_find_dhcp_server_address(link
);
744 log_link_warning(link
, "Failed to find suitable address for DHCPv4 server instance.");
745 link_enter_failed(link
);
749 /* use the server address' subnet as the pool */
750 r
= sd_dhcp_server_configure_pool(link
->dhcp_server
, &address
->in_addr
.in
, address
->prefixlen
,
751 link
->network
->dhcp_server_pool_offset
, link
->network
->dhcp_server_pool_size
);
756 r = sd_dhcp_server_set_router(link->dhcp_server,
757 &main_address->in_addr.in);
762 if (link
->network
->dhcp_server_max_lease_time_usec
> 0) {
763 r
= sd_dhcp_server_set_max_lease_time(
765 DIV_ROUND_UP(link
->network
->dhcp_server_max_lease_time_usec
, USEC_PER_SEC
));
770 if (link
->network
->dhcp_server_default_lease_time_usec
> 0) {
771 r
= sd_dhcp_server_set_default_lease_time(
773 DIV_ROUND_UP(link
->network
->dhcp_server_default_lease_time_usec
, USEC_PER_SEC
));
778 if (link
->network
->dhcp_server_emit_dns
) {
780 if (link
->network
->n_dhcp_server_dns
> 0)
781 r
= sd_dhcp_server_set_dns(link
->dhcp_server
, link
->network
->dhcp_server_dns
, link
->network
->n_dhcp_server_dns
);
783 uplink
= manager_find_uplink(link
->manager
, link
);
784 acquired_uplink
= true;
787 log_link_debug(link
, "Not emitting DNS server information on link, couldn't find suitable uplink.");
790 r
= link_push_dns_to_dhcp_server(uplink
, link
->dhcp_server
);
793 log_link_warning_errno(link
, r
, "Failed to set DNS server for DHCP server, ignoring: %m");
797 if (link
->network
->dhcp_server_emit_ntp
) {
799 if (link
->network
->n_dhcp_server_ntp
> 0)
800 r
= sd_dhcp_server_set_ntp(link
->dhcp_server
, link
->network
->dhcp_server_ntp
, link
->network
->n_dhcp_server_ntp
);
802 if (!acquired_uplink
)
803 uplink
= manager_find_uplink(link
->manager
, link
);
806 log_link_debug(link
, "Not emitting NTP server information on link, couldn't find suitable uplink.");
809 r
= link_push_ntp_to_dhcp_server(uplink
, link
->dhcp_server
);
813 log_link_warning_errno(link
, r
, "Failed to set NTP server for DHCP server, ignoring: %m");
816 if (link
->network
->dhcp_server_emit_timezone
) {
817 _cleanup_free_
char *buffer
= NULL
;
818 const char *tz
= NULL
;
820 if (link
->network
->dhcp_server_timezone
)
821 tz
= link
->network
->dhcp_server_timezone
;
823 r
= get_timezone(&buffer
);
825 log_warning_errno(r
, "Failed to determine timezone: %m");
831 r
= sd_dhcp_server_set_timezone(link
->dhcp_server
, tz
);
837 r
= sd_dhcp_server_start(link
->dhcp_server
);
839 log_link_warning_errno(link
, r
, "Could not start DHCPv4 server instance: %m");
841 link_enter_failed(link
);
846 log_link_debug(link
, "Offering DHCPv4 leases");
849 if (link
->link_messages
== 0)
850 link_enter_set_routes(link
);
852 log_link_debug(link
, "Setting addresses");
857 int link_address_drop_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
858 _cleanup_link_unref_ Link
*link
= userdata
;
863 assert(link
->ifname
);
865 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
868 r
= sd_netlink_message_get_errno(m
);
869 if (r
< 0 && r
!= -EADDRNOTAVAIL
)
870 log_link_warning_errno(link
, r
, "%-*s: could not drop address: %m", IFNAMSIZ
, link
->ifname
);
875 static int link_set_bridge_fdb(Link
*const link
) {
879 LIST_FOREACH(static_fdb_entries
, fdb_entry
, link
->network
->static_fdb_entries
) {
880 r
= fdb_entry_configure(link
, fdb_entry
);
882 log_link_error_errno(link
, r
, "Failed to add MAC entry to static MAC table: %m");
890 static int link_set_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
891 _cleanup_link_unref_ Link
*link
= userdata
;
894 log_link_debug(link
, "Set link");
896 r
= sd_netlink_message_get_errno(m
);
897 if (r
< 0 && r
!= -EEXIST
) {
898 log_link_error_errno(link
, r
, "Could not join netdev: %m");
899 link_enter_failed(link
);
906 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
907 _cleanup_link_unref_ Link
*link
= userdata
;
908 const sd_bus_error
*e
;
913 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
916 e
= sd_bus_message_get_error(m
);
918 log_link_warning_errno(link
, sd_bus_error_get_errno(e
), "Could not set hostname: %s", e
->message
);
923 int link_set_hostname(Link
*link
, const char *hostname
) {
927 assert(link
->manager
);
929 log_link_debug(link
, "Setting transient hostname: '%s'", strna(hostname
));
931 if (!link
->manager
->bus
) {
932 /* TODO: replace by assert when we can rely on kdbus */
933 log_link_info(link
, "Not connected to system bus, ignoring transient hostname.");
937 r
= sd_bus_call_method_async(
940 "org.freedesktop.hostname1",
941 "/org/freedesktop/hostname1",
942 "org.freedesktop.hostname1",
944 set_hostname_handler
,
951 return log_link_error_errno(link
, r
, "Could not set transient hostname: %m");
958 static int set_timezone_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
959 _cleanup_link_unref_ Link
*link
= userdata
;
960 const sd_bus_error
*e
;
965 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
968 e
= sd_bus_message_get_error(m
);
970 log_link_warning_errno(link
, sd_bus_error_get_errno(e
), "Could not set timezone: %s", e
->message
);
975 int link_set_timezone(Link
*link
, const char *tz
) {
979 assert(link
->manager
);
982 log_link_debug(link
, "Setting system timezone: '%s'", tz
);
984 if (!link
->manager
->bus
) {
985 log_link_info(link
, "Not connected to system bus, ignoring timezone.");
989 r
= sd_bus_call_method_async(
992 "org.freedesktop.timedate1",
993 "/org/freedesktop/timedate1",
994 "org.freedesktop.timedate1",
996 set_timezone_handler
,
1002 return log_link_error_errno(link
, r
, "Could not set timezone: %m");
1009 static int set_mtu_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1010 _cleanup_link_unref_ Link
*link
= userdata
;
1015 assert(link
->ifname
);
1017 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1020 r
= sd_netlink_message_get_errno(m
);
1022 log_link_warning_errno(link
, r
, "%-*s: could not set MTU: %m", IFNAMSIZ
, link
->ifname
);
1027 int link_set_mtu(Link
*link
, uint32_t mtu
) {
1028 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1032 assert(link
->manager
);
1033 assert(link
->manager
->rtnl
);
1035 log_link_debug(link
, "Setting MTU: %" PRIu32
, mtu
);
1037 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1039 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1041 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, mtu
);
1043 return log_link_error_errno(link
, r
, "Could not append MTU: %m");
1045 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, set_mtu_handler
, link
, 0, NULL
);
1047 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1054 static int link_set_bridge(Link
*link
) {
1055 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1059 assert(link
->network
);
1061 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1063 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1065 r
= sd_rtnl_message_link_set_family(req
, PF_BRIDGE
);
1067 return log_link_error_errno(link
, r
, "Could not set message family: %m");
1069 r
= sd_netlink_message_open_container(req
, IFLA_PROTINFO
);
1071 return log_link_error_errno(link
, r
, "Could not append IFLA_PROTINFO attribute: %m");
1073 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_GUARD
, !link
->network
->use_bpdu
);
1075 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_GUARD attribute: %m");
1077 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_MODE
, link
->network
->hairpin
);
1079 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_MODE attribute: %m");
1081 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_FAST_LEAVE
, link
->network
->fast_leave
);
1083 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_FAST_LEAVE attribute: %m");
1085 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_PROTECT
, !link
->network
->allow_port_to_be_root
);
1087 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_PROTECT attribute: %m");
1089 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_UNICAST_FLOOD
, link
->network
->unicast_flood
);
1091 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_UNICAST_FLOOD attribute: %m");
1093 if(link
->network
->cost
!= 0) {
1094 r
= sd_netlink_message_append_u32(req
, IFLA_BRPORT_COST
, link
->network
->cost
);
1096 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_COST attribute: %m");
1099 r
= sd_netlink_message_close_container(req
);
1101 return log_link_error_errno(link
, r
, "Could not append IFLA_LINKINFO attribute: %m");
1103 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_set_handler
, link
, 0, NULL
);
1105 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1112 static void lldp_handler(sd_lldp
*lldp
, int event
, void *userdata
) {
1113 Link
*link
= userdata
;
1117 assert(link
->network
);
1118 assert(link
->manager
);
1121 case SD_LLDP_EVENT_UPDATE_INFO
:
1122 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
1124 log_link_warning_errno(link
, r
, "Could not save LLDP: %m");
1132 static int link_acquire_conf(Link
*link
) {
1136 assert(link
->network
);
1137 assert(link
->manager
);
1138 assert(link
->manager
->event
);
1140 if (link_ipv4ll_enabled(link
)) {
1141 assert(link
->ipv4ll
);
1143 log_link_debug(link
, "Acquiring IPv4 link-local address");
1145 r
= sd_ipv4ll_start(link
->ipv4ll
);
1147 return log_link_warning_errno(link
, r
, "Could not acquire IPv4 link-local address: %m");
1150 if (link_dhcp4_enabled(link
)) {
1151 assert(link
->dhcp_client
);
1153 log_link_debug(link
, "Acquiring DHCPv4 lease");
1155 r
= sd_dhcp_client_start(link
->dhcp_client
);
1157 return log_link_warning_errno(link
, r
, "Could not acquire DHCPv4 lease: %m");
1160 if (link_dhcp6_enabled(link
)) {
1161 assert(link
->icmp6_router_discovery
);
1163 log_link_debug(link
, "Discovering IPv6 routers");
1165 r
= sd_icmp6_router_solicitation_start(link
->icmp6_router_discovery
);
1167 return log_link_warning_errno(link
, r
, "Could not start IPv6 router discovery: %m");
1170 if (link_lldp_enabled(link
)) {
1173 log_link_debug(link
, "Starting LLDP");
1175 r
= sd_lldp_start(link
->lldp
);
1177 return log_link_warning_errno(link
, r
, "Could not start LLDP: %m");
1183 bool link_has_carrier(Link
*link
) {
1184 /* see Documentation/networking/operstates.txt in the kernel sources */
1186 if (link
->kernel_operstate
== IF_OPER_UP
)
1189 if (link
->kernel_operstate
== IF_OPER_UNKNOWN
)
1190 /* operstate may not be implemented, so fall back to flags */
1191 if ((link
->flags
& IFF_LOWER_UP
) && !(link
->flags
& IFF_DORMANT
))
1197 static int link_up_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1198 _cleanup_link_unref_ Link
*link
= userdata
;
1203 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1206 r
= sd_netlink_message_get_errno(m
);
1208 /* we warn but don't fail the link, as it may be
1210 log_link_warning_errno(link
, r
, "%-*s: could not bring up interface: %m", IFNAMSIZ
, link
->ifname
);
1215 static int link_up(Link
*link
) {
1216 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1217 uint8_t ipv6ll_mode
;
1221 assert(link
->network
);
1222 assert(link
->manager
);
1223 assert(link
->manager
->rtnl
);
1225 log_link_debug(link
, "Bringing link up");
1227 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1229 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1231 r
= sd_rtnl_message_link_set_flags(req
, IFF_UP
, IFF_UP
);
1233 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1235 if (link
->network
->mac
) {
1236 r
= sd_netlink_message_append_ether_addr(req
, IFLA_ADDRESS
, link
->network
->mac
);
1238 return log_link_error_errno(link
, r
, "Could not set MAC address: %m");
1241 if (link
->network
->mtu
) {
1242 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, link
->network
->mtu
);
1244 return log_link_error_errno(link
, r
, "Could not set MTU: %m");
1247 r
= sd_netlink_message_open_container(req
, IFLA_AF_SPEC
);
1249 return log_link_error_errno(link
, r
, "Could not open IFLA_AF_SPEC container: %m");
1251 if (socket_ipv6_is_supported()) {
1252 /* if the kernel lacks ipv6 support setting IFF_UP fails if any ipv6 options are passed */
1253 r
= sd_netlink_message_open_container(req
, AF_INET6
);
1255 return log_link_error_errno(link
, r
, "Could not open AF_INET6 container: %m");
1257 ipv6ll_mode
= link_ipv6ll_enabled(link
) ? IN6_ADDR_GEN_MODE_EUI64
: IN6_ADDR_GEN_MODE_NONE
;
1258 r
= sd_netlink_message_append_u8(req
, IFLA_INET6_ADDR_GEN_MODE
, ipv6ll_mode
);
1260 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_ADDR_GEN_MODE: %m");
1262 if (!in_addr_is_null(AF_INET6
, &link
->network
->ipv6_token
)) {
1263 r
= sd_netlink_message_append_in6_addr(req
, IFLA_INET6_TOKEN
, &link
->network
->ipv6_token
.in6
);
1265 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_TOKEN: %m");
1268 r
= sd_netlink_message_close_container(req
);
1270 return log_link_error_errno(link
, r
, "Could not close AF_INET6 container: %m");
1273 r
= sd_netlink_message_close_container(req
);
1275 return log_link_error_errno(link
, r
, "Could not close IFLA_AF_SPEC container: %m");
1277 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_up_handler
, link
, 0, NULL
);
1279 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1286 static int link_down_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1287 _cleanup_link_unref_ Link
*link
= userdata
;
1292 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1295 r
= sd_netlink_message_get_errno(m
);
1297 log_link_warning_errno(link
, r
, "%-*s: could not bring down interface: %m", IFNAMSIZ
, link
->ifname
);
1302 static int link_down(Link
*link
) {
1303 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1307 assert(link
->manager
);
1308 assert(link
->manager
->rtnl
);
1310 log_link_debug(link
, "Bringing link down");
1312 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
,
1313 RTM_SETLINK
, link
->ifindex
);
1315 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1317 r
= sd_rtnl_message_link_set_flags(req
, 0, IFF_UP
);
1319 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1321 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_down_handler
, link
, 0, NULL
);
1323 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1330 static int link_handle_bound_to_list(Link
*link
) {
1334 bool required_up
= false;
1335 bool link_is_up
= false;
1339 if (hashmap_isempty(link
->bound_to_links
))
1342 if (link
->flags
& IFF_UP
)
1345 HASHMAP_FOREACH (l
, link
->bound_to_links
, i
)
1346 if (link_has_carrier(l
)) {
1351 if (!required_up
&& link_is_up
) {
1352 r
= link_down(link
);
1355 } else if (required_up
&& !link_is_up
) {
1364 static int link_handle_bound_by_list(Link
*link
) {
1371 if (hashmap_isempty(link
->bound_by_links
))
1374 HASHMAP_FOREACH (l
, link
->bound_by_links
, i
) {
1375 r
= link_handle_bound_to_list(l
);
1383 static int link_put_carrier(Link
*link
, Link
*carrier
, Hashmap
**h
) {
1389 if (link
== carrier
)
1392 if (hashmap_get(*h
, INT_TO_PTR(carrier
->ifindex
)))
1395 r
= hashmap_ensure_allocated(h
, NULL
);
1399 r
= hashmap_put(*h
, INT_TO_PTR(carrier
->ifindex
), carrier
);
1406 static int link_new_bound_by_list(Link
*link
) {
1411 bool list_updated
= false;
1414 assert(link
->manager
);
1418 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1419 if (!carrier
->network
)
1422 if (strv_isempty(carrier
->network
->bind_carrier
))
1425 if (strv_fnmatch(carrier
->network
->bind_carrier
, link
->ifname
, 0)) {
1426 r
= link_put_carrier(link
, carrier
, &link
->bound_by_links
);
1430 list_updated
= true;
1437 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
) {
1438 r
= link_put_carrier(carrier
, link
, &carrier
->bound_to_links
);
1448 static int link_new_bound_to_list(Link
*link
) {
1453 bool list_updated
= false;
1456 assert(link
->manager
);
1461 if (strv_isempty(link
->network
->bind_carrier
))
1466 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1467 if (strv_fnmatch(link
->network
->bind_carrier
, carrier
->ifname
, 0)) {
1468 r
= link_put_carrier(link
, carrier
, &link
->bound_to_links
);
1472 list_updated
= true;
1479 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
) {
1480 r
= link_put_carrier(carrier
, link
, &carrier
->bound_by_links
);
1490 static int link_new_carrier_maps(Link
*link
) {
1493 r
= link_new_bound_by_list(link
);
1497 r
= link_handle_bound_by_list(link
);
1501 r
= link_new_bound_to_list(link
);
1505 r
= link_handle_bound_to_list(link
);
1512 static void link_free_bound_to_list(Link
*link
) {
1516 HASHMAP_FOREACH (bound_to
, link
->bound_to_links
, i
) {
1517 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(bound_to
->ifindex
));
1519 if (hashmap_remove(bound_to
->bound_by_links
, INT_TO_PTR(link
->ifindex
)))
1520 link_save(bound_to
);
1526 static void link_free_bound_by_list(Link
*link
) {
1530 HASHMAP_FOREACH (bound_by
, link
->bound_by_links
, i
) {
1531 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(bound_by
->ifindex
));
1533 if (hashmap_remove(bound_by
->bound_to_links
, INT_TO_PTR(link
->ifindex
))) {
1534 link_save(bound_by
);
1535 link_handle_bound_to_list(bound_by
);
1542 static void link_free_carrier_maps(Link
*link
) {
1543 bool list_updated
= false;
1547 if (!hashmap_isempty(link
->bound_to_links
)) {
1548 link_free_bound_to_list(link
);
1549 list_updated
= true;
1552 if (!hashmap_isempty(link
->bound_by_links
)) {
1553 link_free_bound_by_list(link
);
1554 list_updated
= true;
1563 void link_drop(Link
*link
) {
1564 if (!link
|| link
->state
== LINK_STATE_LINGER
)
1567 link_set_state(link
, LINK_STATE_LINGER
);
1569 link_free_carrier_maps(link
);
1571 log_link_debug(link
, "Link removed");
1578 static int link_joined(Link
*link
) {
1582 assert(link
->network
);
1584 if (!hashmap_isempty(link
->bound_to_links
)) {
1585 r
= link_handle_bound_to_list(link
);
1588 } else if (!(link
->flags
& IFF_UP
)) {
1591 link_enter_failed(link
);
1596 if(link
->network
->bridge
) {
1597 r
= link_set_bridge(link
);
1599 log_link_error_errno(link
, r
, "Could not set bridge message: %m");
1602 return link_enter_set_addresses(link
);
1605 static int netdev_join_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1606 _cleanup_link_unref_ Link
*link
= userdata
;
1610 assert(link
->network
);
1614 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1617 r
= sd_netlink_message_get_errno(m
);
1618 if (r
< 0 && r
!= -EEXIST
) {
1619 log_link_error_errno(link
, r
, "%-*s: could not join netdev: %m", IFNAMSIZ
, link
->ifname
);
1620 link_enter_failed(link
);
1623 log_link_debug(link
, "Joined netdev");
1625 if (link
->enslaving
<= 0)
1631 static int link_enter_join_netdev(Link
*link
) {
1637 assert(link
->network
);
1638 assert(link
->state
== LINK_STATE_PENDING
);
1640 link_set_state(link
, LINK_STATE_ENSLAVING
);
1644 if (!link
->network
->bridge
&&
1645 !link
->network
->bond
&&
1646 hashmap_isempty(link
->network
->stacked_netdevs
))
1647 return link_joined(link
);
1649 if (link
->network
->bond
) {
1650 log_struct(LOG_DEBUG
,
1651 LOG_LINK_INTERFACE(link
),
1652 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1653 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bond
->ifname
),
1656 r
= netdev_join(link
->network
->bond
, link
, netdev_join_handler
);
1658 log_struct_errno(LOG_WARNING
, r
,
1659 LOG_LINK_INTERFACE(link
),
1660 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1661 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bond
->ifname
),
1664 link_enter_failed(link
);
1671 if (link
->network
->bridge
) {
1672 log_struct(LOG_DEBUG
,
1673 LOG_LINK_INTERFACE(link
),
1674 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1675 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bridge
->ifname
),
1678 r
= netdev_join(link
->network
->bridge
, link
, netdev_join_handler
);
1680 log_struct_errno(LOG_WARNING
, r
,
1681 LOG_LINK_INTERFACE(link
),
1682 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1683 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bridge
->ifname
),
1685 link_enter_failed(link
);
1692 HASHMAP_FOREACH(netdev
, link
->network
->stacked_netdevs
, i
) {
1694 log_struct(LOG_DEBUG
,
1695 LOG_LINK_INTERFACE(link
),
1696 LOG_NETDEV_INTERFACE(netdev
),
1697 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", netdev
->ifname
),
1700 r
= netdev_join(netdev
, link
, netdev_join_handler
);
1702 log_struct_errno(LOG_WARNING
, r
,
1703 LOG_LINK_INTERFACE(link
),
1704 LOG_NETDEV_INTERFACE(netdev
),
1705 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", netdev
->ifname
),
1707 link_enter_failed(link
);
1717 static int link_set_ipv4_forward(Link
*link
) {
1718 const char *p
= NULL
, *v
;
1721 if (link
->flags
& IFF_LOOPBACK
)
1724 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1727 p
= strjoina("/proc/sys/net/ipv4/conf/", link
->ifname
, "/forwarding");
1728 v
= one_zero(link_ipv4_forward_enabled(link
));
1730 r
= write_string_file(p
, v
, 0);
1732 /* If the right value is set anyway, don't complain */
1733 if (verify_one_line_file(p
, v
) > 0)
1736 log_link_warning_errno(link
, r
, "Cannot configure IPv4 forwarding for interface %s: %m", link
->ifname
);
1742 static int link_set_ipv6_forward(Link
*link
) {
1743 const char *p
= NULL
, *v
= NULL
;
1746 /* Make this a NOP if IPv6 is not available */
1747 if (!socket_ipv6_is_supported())
1750 if (link
->flags
& IFF_LOOPBACK
)
1753 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1756 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/forwarding");
1757 v
= one_zero(link_ipv6_forward_enabled(link
));
1759 r
= write_string_file(p
, v
, 0);
1761 /* If the right value is set anyway, don't complain */
1762 if (verify_one_line_file(p
, v
) > 0)
1765 log_link_warning_errno(link
, r
, "Cannot configure IPv6 forwarding for interface: %m");
1771 static int link_set_ipv6_privacy_extensions(Link
*link
) {
1772 char buf
[DECIMAL_STR_MAX(unsigned) + 1];
1773 IPv6PrivacyExtensions s
;
1774 const char *p
= NULL
;
1777 /* Make this a NOP if IPv6 is not available */
1778 if (!socket_ipv6_is_supported())
1781 s
= link_ipv6_privacy_extensions(link
);
1782 if (s
== _IPV6_PRIVACY_EXTENSIONS_INVALID
)
1785 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/use_tempaddr");
1786 xsprintf(buf
, "%u", link
->network
->ipv6_privacy_extensions
);
1788 r
= write_string_file(p
, buf
, 0);
1790 /* If the right value is set anyway, don't complain */
1791 if (verify_one_line_file(p
, buf
) > 0)
1794 log_link_warning_errno(link
, r
, "Cannot configure IPv6 privacy extension for interface: %m");
1800 static int link_set_ipv6_accept_ra(Link
*link
) {
1801 const char *p
= NULL
, *v
= NULL
;
1804 /* Make this a NOP if IPv6 is not available */
1805 if (!socket_ipv6_is_supported())
1808 if (link
->flags
& IFF_LOOPBACK
)
1811 /* If unset use system default (enabled if local forwarding is disabled.
1812 * disabled if local forwarding is enabled).
1813 * If set, ignore or enforce RA independent of local forwarding state.
1815 if (link
->network
->ipv6_accept_ra
< 0) {
1816 /* default to accept RA if ip_forward is disabled and ignore RA if ip_forward is enabled */
1818 } else if (link
->network
->ipv6_accept_ra
> 0) {
1819 /* "2" means accept RA even if ip_forward is enabled */
1822 /* "0" means ignore RA */
1825 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/accept_ra");
1827 r
= write_string_file(p
, v
, 0);
1829 /* If the right value is set anyway, don't complain */
1830 if (verify_one_line_file(p
, v
) > 0)
1833 log_link_warning_errno(link
, r
, "Cannot configure IPv6 accept_ra for interface: %m");
1839 static int link_configure(Link
*link
) {
1843 assert(link
->network
);
1844 assert(link
->state
== LINK_STATE_PENDING
);
1846 r
= link_set_bridge_fdb(link
);
1850 r
= link_set_ipv4_forward(link
);
1854 r
= link_set_ipv6_forward(link
);
1858 r
= link_set_ipv6_privacy_extensions(link
);
1862 r
= link_set_ipv6_accept_ra(link
);
1866 if (link_ipv4ll_enabled(link
)) {
1867 r
= ipv4ll_configure(link
);
1872 if (link_dhcp4_enabled(link
)) {
1873 r
= dhcp4_configure(link
);
1878 if (link_dhcp4_server_enabled(link
)) {
1879 r
= sd_dhcp_server_new(&link
->dhcp_server
, link
->ifindex
);
1883 r
= sd_dhcp_server_attach_event(link
->dhcp_server
, NULL
, 0);
1888 if (link_dhcp6_enabled(link
)) {
1889 r
= icmp6_configure(link
);
1894 if (link_lldp_enabled(link
)) {
1895 r
= sd_lldp_new(link
->ifindex
, link
->ifname
, &link
->mac
, &link
->lldp
);
1899 r
= sd_lldp_attach_event(link
->lldp
, NULL
, 0);
1903 r
= sd_lldp_set_callback(link
->lldp
,
1904 lldp_handler
, link
);
1909 if (link_has_carrier(link
)) {
1910 r
= link_acquire_conf(link
);
1915 return link_enter_join_netdev(link
);
1918 static int link_initialized_and_synced(sd_netlink
*rtnl
, sd_netlink_message
*m
,
1920 _cleanup_link_unref_ Link
*link
= userdata
;
1925 assert(link
->ifname
);
1926 assert(link
->manager
);
1928 if (link
->state
!= LINK_STATE_PENDING
)
1931 log_link_debug(link
, "Link state is up-to-date");
1933 r
= link_new_bound_by_list(link
);
1937 r
= link_handle_bound_by_list(link
);
1941 r
= network_get(link
->manager
, link
->udev_device
, link
->ifname
,
1942 &link
->mac
, &network
);
1944 link_enter_unmanaged(link
);
1949 if (link
->flags
& IFF_LOOPBACK
) {
1950 if (network
->link_local
!= ADDRESS_FAMILY_NO
)
1951 log_link_debug(link
, "Ignoring link-local autoconfiguration for loopback link");
1953 if (network
->dhcp
!= ADDRESS_FAMILY_NO
)
1954 log_link_debug(link
, "Ignoring DHCP clients for loopback link");
1956 if (network
->dhcp_server
)
1957 log_link_debug(link
, "Ignoring DHCP server for loopback link");
1960 r
= network_apply(link
->manager
, network
, link
);
1964 r
= link_new_bound_to_list(link
);
1968 r
= link_configure(link
);
1975 int link_initialized(Link
*link
, struct udev_device
*device
) {
1976 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1980 assert(link
->manager
);
1981 assert(link
->manager
->rtnl
);
1984 if (link
->state
!= LINK_STATE_PENDING
)
1987 if (link
->udev_device
)
1990 log_link_debug(link
, "udev initialized link");
1992 link
->udev_device
= udev_device_ref(device
);
1994 /* udev has initialized the link, but we don't know if we have yet
1995 * processed the NEWLINK messages with the latest state. Do a GETLINK,
1996 * when it returns we know that the pending NEWLINKs have already been
1997 * processed and that we are up-to-date */
1999 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_GETLINK
,
2004 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
,
2005 link_initialized_and_synced
, link
, 0, NULL
);
2014 static Address
* link_get_equal_address(Link
*link
, Address
*needle
) {
2020 LIST_FOREACH(addresses
, i
, link
->addresses
)
2021 if (address_equal(i
, needle
))
2027 int link_rtnl_process_address(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
2028 Manager
*m
= userdata
;
2031 _cleanup_address_free_ Address
*address
= NULL
;
2032 unsigned char flags
;
2034 char buf
[INET6_ADDRSTRLEN
], valid_buf
[FORMAT_TIMESPAN_MAX
];
2035 const char *valid_str
= NULL
;
2042 if (sd_netlink_message_is_error(message
)) {
2043 r
= sd_netlink_message_get_errno(message
);
2045 log_warning_errno(r
, "rtnl: failed to receive address: %m");
2050 r
= sd_netlink_message_get_type(message
, &type
);
2052 log_warning_errno(r
, "rtnl: could not get message type: %m");
2054 } else if (type
!= RTM_NEWADDR
&& type
!= RTM_DELADDR
) {
2055 log_warning("rtnl: received unexpected message type when processing address");
2059 r
= sd_rtnl_message_addr_get_ifindex(message
, &ifindex
);
2061 log_warning_errno(r
, "rtnl: could not get ifindex from address: %m");
2063 } else if (ifindex
<= 0) {
2064 log_warning("rtnl: received address message with invalid ifindex: %d", ifindex
);
2067 r
= link_get(m
, ifindex
, &link
);
2068 if (r
< 0 || !link
) {
2069 /* when enumerating we might be out of sync, but we will
2070 * get the address again, so just ignore it */
2071 if (!m
->enumerating
)
2072 log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex
);
2077 r
= address_new_dynamic(&address
);
2081 r
= sd_rtnl_message_addr_get_family(message
, &address
->family
);
2082 if (r
< 0 || !IN_SET(address
->family
, AF_INET
, AF_INET6
)) {
2083 log_link_warning(link
, "rtnl: received address with invalid family, ignoring.");
2087 r
= sd_rtnl_message_addr_get_prefixlen(message
, &address
->prefixlen
);
2089 log_link_warning_errno(link
, r
, "rtnl: received address with invalid prefixlen, ignoring: %m");
2093 r
= sd_rtnl_message_addr_get_scope(message
, &address
->scope
);
2095 log_link_warning_errno(link
, r
, "rtnl: received address with invalid scope, ignoring: %m");
2099 r
= sd_rtnl_message_addr_get_flags(message
, &flags
);
2101 log_link_warning_errno(link
, r
, "rtnl: received address with invalid flags, ignoring: %m");
2104 address
->flags
= flags
;
2106 switch (address
->family
) {
2108 r
= sd_netlink_message_read_in_addr(message
, IFA_LOCAL
, &address
->in_addr
.in
);
2110 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
2117 r
= sd_netlink_message_read_in6_addr(message
, IFA_ADDRESS
, &address
->in_addr
.in6
);
2119 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
2126 assert_not_reached("invalid address family");
2129 if (!inet_ntop(address
->family
, &address
->in_addr
, buf
, INET6_ADDRSTRLEN
)) {
2130 log_link_warning(link
, "Could not print address");
2134 r
= sd_netlink_message_read_cache_info(message
, IFA_CACHEINFO
, &address
->cinfo
);
2136 if (address
->cinfo
.ifa_valid
== CACHE_INFO_INFINITY_LIFE_TIME
)
2139 valid_str
= format_timespan(valid_buf
, FORMAT_TIMESPAN_MAX
,
2140 address
->cinfo
.ifa_valid
* USEC_PER_SEC
,
2144 existing
= link_get_equal_address(link
, address
);
2149 log_link_debug(link
, "Updating address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
2152 existing
->scope
= address
->scope
;
2153 existing
->flags
= address
->flags
;
2154 existing
->cinfo
= address
->cinfo
;
2157 log_link_debug(link
, "Adding address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
2159 LIST_PREPEND(addresses
, link
->addresses
, address
);
2160 address_establish(address
, link
);
2172 log_link_debug(link
, "Removing address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
2173 address_release(existing
, link
);
2174 LIST_REMOVE(addresses
, link
->addresses
, existing
);
2175 address_free(existing
);
2177 log_link_warning(link
, "Removing non-existent address: %s/%u (valid for %s)", buf
, address
->prefixlen
, valid_str
);
2181 assert_not_reached("Received invalid RTNL message type");
2187 int link_add(Manager
*m
, sd_netlink_message
*message
, Link
**ret
) {
2189 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
2190 char ifindex_str
[2 + DECIMAL_STR_MAX(int)];
2198 r
= link_new(m
, message
, ret
);
2204 log_link_debug(link
, "Link %d added", link
->ifindex
);
2206 if (detect_container() <= 0) {
2207 /* not in a container, udev will be around */
2208 sprintf(ifindex_str
, "n%d", link
->ifindex
);
2209 device
= udev_device_new_from_device_id(m
->udev
, ifindex_str
);
2211 return log_link_warning_errno(link
, errno
, "Could not find udev device: %m");
2213 if (udev_device_get_is_initialized(device
) <= 0) {
2215 log_link_debug(link
, "link pending udev initialization...");
2219 r
= link_initialized(link
, device
);
2223 /* we are calling a callback directly, so must take a ref */
2226 r
= link_initialized_and_synced(m
->rtnl
, NULL
, link
);
2234 static int link_carrier_gained(Link
*link
) {
2239 if (link
->network
) {
2240 r
= link_acquire_conf(link
);
2242 link_enter_failed(link
);
2247 r
= link_handle_bound_by_list(link
);
2254 static int link_carrier_lost(Link
*link
) {
2259 r
= link_stop_clients(link
);
2261 link_enter_failed(link
);
2265 r
= link_handle_bound_by_list(link
);
2272 int link_carrier_reset(Link
*link
) {
2277 if (link_has_carrier(link
)) {
2278 r
= link_carrier_lost(link
);
2282 r
= link_carrier_gained(link
);
2286 log_link_info(link
, "Reset carrier");
2293 int link_update(Link
*link
, sd_netlink_message
*m
) {
2294 struct ether_addr mac
;
2297 bool had_carrier
, carrier_gained
, carrier_lost
;
2301 assert(link
->ifname
);
2304 if (link
->state
== LINK_STATE_LINGER
) {
2306 log_link_info(link
, "Link readded");
2307 link_set_state(link
, LINK_STATE_ENSLAVING
);
2309 r
= link_new_carrier_maps(link
);
2314 r
= sd_netlink_message_read_string(m
, IFLA_IFNAME
, &ifname
);
2315 if (r
>= 0 && !streq(ifname
, link
->ifname
)) {
2316 log_link_info(link
, "Renamed to %s", ifname
);
2318 link_free_carrier_maps(link
);
2320 r
= free_and_strdup(&link
->ifname
, ifname
);
2324 r
= link_new_carrier_maps(link
);
2329 r
= sd_netlink_message_read_u32(m
, IFLA_MTU
, &mtu
);
2330 if (r
>= 0 && mtu
> 0) {
2332 if (!link
->original_mtu
) {
2333 link
->original_mtu
= mtu
;
2334 log_link_debug(link
, "Saved original MTU: %" PRIu32
, link
->original_mtu
);
2337 if (link
->dhcp_client
) {
2338 r
= sd_dhcp_client_set_mtu(link
->dhcp_client
,
2341 log_link_warning_errno(link
, r
, "Could not update MTU in DHCP client: %m");
2347 /* The kernel may broadcast NEWLINK messages without the MAC address
2348 set, simply ignore them. */
2349 r
= sd_netlink_message_read_ether_addr(m
, IFLA_ADDRESS
, &mac
);
2351 if (memcmp(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2354 memcpy(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2357 log_link_debug(link
, "MAC address: "
2358 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2359 mac
.ether_addr_octet
[0],
2360 mac
.ether_addr_octet
[1],
2361 mac
.ether_addr_octet
[2],
2362 mac
.ether_addr_octet
[3],
2363 mac
.ether_addr_octet
[4],
2364 mac
.ether_addr_octet
[5]);
2367 r
= sd_ipv4ll_set_mac(link
->ipv4ll
, &link
->mac
);
2369 return log_link_warning_errno(link
, r
, "Could not update MAC address in IPv4LL client: %m");
2372 if (link
->dhcp_client
) {
2373 r
= sd_dhcp_client_set_mac(link
->dhcp_client
,
2374 (const uint8_t *) &link
->mac
,
2378 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCP client: %m");
2381 if (link
->dhcp6_client
) {
2382 r
= sd_dhcp6_client_set_mac(link
->dhcp6_client
,
2383 (const uint8_t *) &link
->mac
,
2387 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCPv6 client: %m");
2392 had_carrier
= link_has_carrier(link
);
2394 r
= link_update_flags(link
, m
);
2398 carrier_gained
= !had_carrier
&& link_has_carrier(link
);
2399 carrier_lost
= had_carrier
&& !link_has_carrier(link
);
2401 if (carrier_gained
) {
2402 log_link_info(link
, "Gained carrier");
2404 r
= link_carrier_gained(link
);
2407 } else if (carrier_lost
) {
2408 log_link_info(link
, "Lost carrier");
2410 r
= link_carrier_lost(link
);
2419 static void link_update_operstate(Link
*link
) {
2420 LinkOperationalState operstate
;
2423 if (link
->kernel_operstate
== IF_OPER_DORMANT
)
2424 operstate
= LINK_OPERSTATE_DORMANT
;
2425 else if (link_has_carrier(link
)) {
2427 uint8_t scope
= RT_SCOPE_NOWHERE
;
2429 /* if we have carrier, check what addresses we have */
2430 LIST_FOREACH(addresses
, address
, link
->addresses
) {
2431 if (address
->flags
& (IFA_F_TENTATIVE
| IFA_F_DEPRECATED
))
2434 if (address
->scope
< scope
)
2435 scope
= address
->scope
;
2438 if (scope
< RT_SCOPE_SITE
)
2439 /* universally accessible addresses found */
2440 operstate
= LINK_OPERSTATE_ROUTABLE
;
2441 else if (scope
< RT_SCOPE_HOST
)
2442 /* only link or site local addresses found */
2443 operstate
= LINK_OPERSTATE_DEGRADED
;
2445 /* no useful addresses found */
2446 operstate
= LINK_OPERSTATE_CARRIER
;
2447 } else if (link
->flags
& IFF_UP
)
2448 operstate
= LINK_OPERSTATE_NO_CARRIER
;
2450 operstate
= LINK_OPERSTATE_OFF
;
2452 if (link
->operstate
!= operstate
) {
2453 link
->operstate
= operstate
;
2454 link_send_changed(link
, "OperationalState", NULL
);
2458 int link_save(Link
*link
) {
2459 _cleanup_free_
char *temp_path
= NULL
;
2460 _cleanup_fclose_
FILE *f
= NULL
;
2461 const char *admin_state
, *oper_state
;
2465 assert(link
->state_file
);
2466 assert(link
->lease_file
);
2467 assert(link
->manager
);
2469 link_update_operstate(link
);
2471 r
= manager_save(link
->manager
);
2475 if (link
->state
== LINK_STATE_LINGER
) {
2476 unlink(link
->state_file
);
2480 admin_state
= link_state_to_string(link
->state
);
2481 assert(admin_state
);
2483 oper_state
= link_operstate_to_string(link
->operstate
);
2486 r
= fopen_temporary(link
->state_file
, &f
, &temp_path
);
2490 fchmod(fileno(f
), 0644);
2493 "# This is private data. Do not parse.\n"
2496 admin_state
, oper_state
);
2498 if (link
->network
) {
2499 char **address
, **domain
;
2501 sd_dhcp6_lease
*dhcp6_lease
= NULL
;
2503 if (link
->dhcp6_client
) {
2504 r
= sd_dhcp6_client_get_lease(link
->dhcp6_client
,
2507 log_link_debug(link
, "No DHCPv6 lease");
2510 fprintf(f
, "NETWORK_FILE=%s\n", link
->network
->filename
);
2514 STRV_FOREACH(address
, link
->network
->dns
) {
2521 if (link
->network
->dhcp_dns
&&
2523 const struct in_addr
*addresses
;
2525 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
2529 serialize_in_addrs(f
, addresses
, r
);
2534 if (link
->network
->dhcp_dns
&& dhcp6_lease
) {
2535 struct in6_addr
*in6_addrs
;
2537 r
= sd_dhcp6_lease_get_dns(dhcp6_lease
, &in6_addrs
);
2541 serialize_in6_addrs(f
, in6_addrs
, r
);
2549 STRV_FOREACH(address
, link
->network
->ntp
) {
2556 if (link
->network
->dhcp_ntp
&&
2558 const struct in_addr
*addresses
;
2560 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
2564 serialize_in_addrs(f
, addresses
, r
);
2569 if (link
->network
->dhcp_ntp
&& dhcp6_lease
) {
2570 struct in6_addr
*in6_addrs
;
2574 r
= sd_dhcp6_lease_get_ntp_addrs(dhcp6_lease
,
2579 serialize_in6_addrs(f
, in6_addrs
, r
);
2583 r
= sd_dhcp6_lease_get_ntp_fqdn(dhcp6_lease
, &hosts
);
2585 STRV_FOREACH(hostname
, hosts
) {
2588 fputs(*hostname
, f
);
2596 fprintf(f
, "DOMAINS=");
2598 STRV_FOREACH(domain
, link
->network
->domains
) {
2605 if (link
->network
->dhcp_domains
&&
2607 const char *domainname
;
2609 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
2613 fputs(domainname
, f
);
2618 if (link
->network
->dhcp_domains
&& dhcp6_lease
) {
2621 r
= sd_dhcp6_lease_get_domains(dhcp6_lease
, &domains
);
2623 STRV_FOREACH(domain
, domains
) {
2634 fprintf(f
, "WILDCARD_DOMAIN=%s\n",
2635 yes_no(link
->network
->wildcard_domain
));
2637 fprintf(f
, "LLMNR=%s\n",
2638 resolve_support_to_string(link
->network
->llmnr
));
2641 if (!hashmap_isempty(link
->bound_to_links
)) {
2646 fputs("CARRIER_BOUND_TO=", f
);
2647 HASHMAP_FOREACH(carrier
, link
->bound_to_links
, i
) {
2650 fputs(carrier
->ifname
, f
);
2657 if (!hashmap_isempty(link
->bound_by_links
)) {
2662 fputs("CARRIER_BOUND_BY=", f
);
2663 HASHMAP_FOREACH(carrier
, link
->bound_by_links
, i
) {
2666 fputs(carrier
->ifname
, f
);
2673 if (link
->dhcp_lease
) {
2674 const char *tz
= NULL
;
2676 r
= sd_dhcp_lease_get_timezone(link
->dhcp_lease
, &tz
);
2678 fprintf(f
, "TIMEZONE=%s\n", tz
);
2681 if (link
->dhcp_lease
) {
2682 assert(link
->network
);
2684 r
= dhcp_lease_save(link
->dhcp_lease
, link
->lease_file
);
2692 unlink(link
->lease_file
);
2695 assert(link
->network
);
2697 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
2705 unlink(link
->lldp_file
);
2707 r
= fflush_and_check(f
);
2711 if (rename(temp_path
, link
->state_file
) < 0) {
2719 (void) unlink(link
->state_file
);
2721 (void) unlink(temp_path
);
2723 return log_link_error_errno(link
, r
, "Failed to save link data to %s: %m", link
->state_file
);
2726 static const char* const link_state_table
[_LINK_STATE_MAX
] = {
2727 [LINK_STATE_PENDING
] = "pending",
2728 [LINK_STATE_ENSLAVING
] = "configuring",
2729 [LINK_STATE_SETTING_ADDRESSES
] = "configuring",
2730 [LINK_STATE_SETTING_ROUTES
] = "configuring",
2731 [LINK_STATE_CONFIGURED
] = "configured",
2732 [LINK_STATE_UNMANAGED
] = "unmanaged",
2733 [LINK_STATE_FAILED
] = "failed",
2734 [LINK_STATE_LINGER
] = "linger",
2737 DEFINE_STRING_TABLE_LOOKUP(link_state
, LinkState
);
2739 static const char* const link_operstate_table
[_LINK_OPERSTATE_MAX
] = {
2740 [LINK_OPERSTATE_OFF
] = "off",
2741 [LINK_OPERSTATE_NO_CARRIER
] = "no-carrier",
2742 [LINK_OPERSTATE_DORMANT
] = "dormant",
2743 [LINK_OPERSTATE_CARRIER
] = "carrier",
2744 [LINK_OPERSTATE_DEGRADED
] = "degraded",
2745 [LINK_OPERSTATE_ROUTABLE
] = "routable",
2748 DEFINE_STRING_TABLE_LOOKUP(link_operstate
, LinkOperationalState
);