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>
26 #include "alloc-util.h"
28 #include "dhcp-lease-internal.h"
31 #include "netlink-util.h"
32 #include "network-internal.h"
33 #include "networkd-link.h"
34 #include "networkd-netdev.h"
36 #include "socket-util.h"
37 #include "stdio-util.h"
38 #include "string-table.h"
39 #include "udev-util.h"
43 bool link_dhcp6_enabled(Link
*link
) {
44 if (link
->flags
& IFF_LOOPBACK
)
50 return link
->network
->dhcp
& ADDRESS_FAMILY_IPV6
;
53 bool link_dhcp4_enabled(Link
*link
) {
54 if (link
->flags
& IFF_LOOPBACK
)
60 return link
->network
->dhcp
& ADDRESS_FAMILY_IPV4
;
63 bool link_dhcp4_server_enabled(Link
*link
) {
64 if (link
->flags
& IFF_LOOPBACK
)
70 return link
->network
->dhcp_server
;
73 bool link_ipv4ll_enabled(Link
*link
) {
74 if (link
->flags
& IFF_LOOPBACK
)
80 return link
->network
->link_local
& ADDRESS_FAMILY_IPV4
;
83 bool link_ipv6ll_enabled(Link
*link
) {
84 if (link
->flags
& IFF_LOOPBACK
)
90 return link
->network
->link_local
& ADDRESS_FAMILY_IPV6
;
93 bool link_lldp_enabled(Link
*link
) {
94 if (link
->flags
& IFF_LOOPBACK
)
100 if (link
->network
->bridge
)
103 return link
->network
->lldp
;
106 static bool link_ipv4_forward_enabled(Link
*link
) {
107 if (link
->flags
& IFF_LOOPBACK
)
113 return link
->network
->ip_forward
& ADDRESS_FAMILY_IPV4
;
116 static bool link_ipv6_forward_enabled(Link
*link
) {
117 if (link
->flags
& IFF_LOOPBACK
)
123 return link
->network
->ip_forward
& ADDRESS_FAMILY_IPV6
;
126 static IPv6PrivacyExtensions
link_ipv6_privacy_extensions(Link
*link
) {
127 if (link
->flags
& IFF_LOOPBACK
)
128 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
131 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
133 return link
->network
->ipv6_privacy_extensions
;
136 void link_update_operstate(Link
*link
) {
137 LinkOperationalState operstate
;
140 if (link
->kernel_operstate
== IF_OPER_DORMANT
)
141 operstate
= LINK_OPERSTATE_DORMANT
;
142 else if (link_has_carrier(link
)) {
144 uint8_t scope
= RT_SCOPE_NOWHERE
;
147 /* if we have carrier, check what addresses we have */
148 SET_FOREACH(address
, link
->addresses
, i
) {
149 if (!address_is_ready(address
))
152 if (address
->scope
< scope
)
153 scope
= address
->scope
;
156 /* for operstate we also take foreign addresses into account */
157 SET_FOREACH(address
, link
->addresses_foreign
, i
) {
158 if (!address_is_ready(address
))
161 if (address
->scope
< scope
)
162 scope
= address
->scope
;
165 if (scope
< RT_SCOPE_SITE
)
166 /* universally accessible addresses found */
167 operstate
= LINK_OPERSTATE_ROUTABLE
;
168 else if (scope
< RT_SCOPE_HOST
)
169 /* only link or site local addresses found */
170 operstate
= LINK_OPERSTATE_DEGRADED
;
172 /* no useful addresses found */
173 operstate
= LINK_OPERSTATE_CARRIER
;
174 } else if (link
->flags
& IFF_UP
)
175 operstate
= LINK_OPERSTATE_NO_CARRIER
;
177 operstate
= LINK_OPERSTATE_OFF
;
179 if (link
->operstate
!= operstate
) {
180 link
->operstate
= operstate
;
181 link_send_changed(link
, "OperationalState", NULL
);
183 manager_dirty(link
->manager
);
187 #define FLAG_STRING(string, flag, old, new) \
188 (((old ^ new) & flag) \
189 ? ((old & flag) ? (" -" string) : (" +" string)) \
192 static int link_update_flags(Link
*link
, sd_netlink_message
*m
) {
193 unsigned flags
, unknown_flags_added
, unknown_flags_removed
, unknown_flags
;
199 r
= sd_rtnl_message_link_get_flags(m
, &flags
);
201 return log_link_warning_errno(link
, r
, "Could not get link flags: %m");
203 r
= sd_netlink_message_read_u8(m
, IFLA_OPERSTATE
, &operstate
);
205 /* if we got a message without operstate, take it to mean
206 the state was unchanged */
207 operstate
= link
->kernel_operstate
;
209 if ((link
->flags
== flags
) && (link
->kernel_operstate
== operstate
))
212 if (link
->flags
!= flags
) {
213 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",
214 FLAG_STRING("LOOPBACK", IFF_LOOPBACK
, link
->flags
, flags
),
215 FLAG_STRING("MASTER", IFF_MASTER
, link
->flags
, flags
),
216 FLAG_STRING("SLAVE", IFF_SLAVE
, link
->flags
, flags
),
217 FLAG_STRING("UP", IFF_UP
, link
->flags
, flags
),
218 FLAG_STRING("DORMANT", IFF_DORMANT
, link
->flags
, flags
),
219 FLAG_STRING("LOWER_UP", IFF_LOWER_UP
, link
->flags
, flags
),
220 FLAG_STRING("RUNNING", IFF_RUNNING
, link
->flags
, flags
),
221 FLAG_STRING("MULTICAST", IFF_MULTICAST
, link
->flags
, flags
),
222 FLAG_STRING("BROADCAST", IFF_BROADCAST
, link
->flags
, flags
),
223 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT
, link
->flags
, flags
),
224 FLAG_STRING("PROMISC", IFF_PROMISC
, link
->flags
, flags
),
225 FLAG_STRING("ALLMULTI", IFF_ALLMULTI
, link
->flags
, flags
),
226 FLAG_STRING("PORTSEL", IFF_PORTSEL
, link
->flags
, flags
),
227 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA
, link
->flags
, flags
),
228 FLAG_STRING("DYNAMIC", IFF_DYNAMIC
, link
->flags
, flags
),
229 FLAG_STRING("NOARP", IFF_NOARP
, link
->flags
, flags
),
230 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS
, link
->flags
, flags
),
231 FLAG_STRING("DEBUG", IFF_DEBUG
, link
->flags
, flags
),
232 FLAG_STRING("ECHO", IFF_ECHO
, link
->flags
, flags
));
234 unknown_flags
= ~(IFF_LOOPBACK
| IFF_MASTER
| IFF_SLAVE
| IFF_UP
|
235 IFF_DORMANT
| IFF_LOWER_UP
| IFF_RUNNING
|
236 IFF_MULTICAST
| IFF_BROADCAST
| IFF_POINTOPOINT
|
237 IFF_PROMISC
| IFF_ALLMULTI
| IFF_PORTSEL
|
238 IFF_AUTOMEDIA
| IFF_DYNAMIC
| IFF_NOARP
|
239 IFF_NOTRAILERS
| IFF_DEBUG
| IFF_ECHO
);
240 unknown_flags_added
= ((link
->flags
^ flags
) & flags
& unknown_flags
);
241 unknown_flags_removed
= ((link
->flags
^ flags
) & link
->flags
& unknown_flags
);
243 /* link flags are currently at most 18 bits, let's align to
245 if (unknown_flags_added
)
247 "Unknown link flags gained: %#.5x (ignoring)",
248 unknown_flags_added
);
250 if (unknown_flags_removed
)
252 "Unknown link flags lost: %#.5x (ignoring)",
253 unknown_flags_removed
);
257 link
->kernel_operstate
= operstate
;
259 link_update_operstate(link
);
264 static int link_new(Manager
*manager
, sd_netlink_message
*message
, Link
**ret
) {
265 _cleanup_link_unref_ Link
*link
= NULL
;
274 r
= sd_netlink_message_get_type(message
, &type
);
277 else if (type
!= RTM_NEWLINK
)
280 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
283 else if (ifindex
<= 0)
286 r
= sd_netlink_message_read_string(message
, IFLA_IFNAME
, &ifname
);
290 link
= new0(Link
, 1);
295 link
->manager
= manager
;
296 link
->state
= LINK_STATE_PENDING
;
297 link
->rtnl_extended_attrs
= true;
298 link
->ifindex
= ifindex
;
299 link
->ifname
= strdup(ifname
);
303 r
= sd_netlink_message_read_ether_addr(message
, IFLA_ADDRESS
, &link
->mac
);
305 log_link_debug(link
, "MAC address not found for new device, continuing without");
307 r
= asprintf(&link
->state_file
, "/run/systemd/netif/links/%d",
312 r
= asprintf(&link
->lease_file
, "/run/systemd/netif/leases/%d",
317 r
= asprintf(&link
->lldp_file
, "/run/systemd/netif/lldp/%d",
323 r
= hashmap_ensure_allocated(&manager
->links
, NULL
);
327 r
= hashmap_put(manager
->links
, INT_TO_PTR(link
->ifindex
), link
);
331 r
= link_update_flags(link
, message
);
341 static void link_free(Link
*link
) {
349 while (!set_isempty(link
->addresses
))
350 address_free(set_first(link
->addresses
));
352 while (!set_isempty(link
->addresses_foreign
))
353 address_free(set_first(link
->addresses_foreign
));
355 link
->addresses
= set_free(link
->addresses
);
357 link
->addresses_foreign
= set_free(link
->addresses_foreign
);
359 while ((address
= link
->pool_addresses
)) {
360 LIST_REMOVE(addresses
, link
->pool_addresses
, address
);
361 address_free(address
);
364 sd_dhcp_server_unref(link
->dhcp_server
);
365 sd_dhcp_client_unref(link
->dhcp_client
);
366 sd_dhcp_lease_unref(link
->dhcp_lease
);
368 free(link
->lease_file
);
370 sd_lldp_free(link
->lldp
);
372 free(link
->lldp_file
);
374 sd_ipv4ll_unref(link
->ipv4ll
);
375 sd_dhcp6_client_unref(link
->dhcp6_client
);
376 sd_ndisc_unref(link
->ndisc_router_discovery
);
379 hashmap_remove(link
->manager
->links
, INT_TO_PTR(link
->ifindex
));
383 (void)unlink(link
->state_file
);
384 free(link
->state_file
);
386 udev_device_unref(link
->udev_device
);
388 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
)
389 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(carrier
->ifindex
));
390 hashmap_free(link
->bound_to_links
);
392 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
)
393 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(carrier
->ifindex
));
394 hashmap_free(link
->bound_by_links
);
399 Link
*link_unref(Link
*link
) {
403 assert(link
->n_ref
> 0);
415 Link
*link_ref(Link
*link
) {
419 assert(link
->n_ref
> 0);
426 int link_get(Manager
*m
, int ifindex
, Link
**ret
) {
433 link
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
442 static void link_set_state(Link
*link
, LinkState state
) {
445 if (link
->state
== state
)
450 link_send_changed(link
, "AdministrativeState", NULL
);
455 static void link_enter_unmanaged(Link
*link
) {
458 log_link_debug(link
, "Unmanaged");
460 link_set_state(link
, LINK_STATE_UNMANAGED
);
465 static int link_stop_clients(Link
*link
) {
469 assert(link
->manager
);
470 assert(link
->manager
->event
);
475 if (link
->dhcp_client
) {
476 k
= sd_dhcp_client_stop(link
->dhcp_client
);
478 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv4 client: %m");
482 k
= sd_ipv4ll_stop(link
->ipv4ll
);
484 r
= log_link_warning_errno(link
, r
, "Could not stop IPv4 link-local: %m");
487 if(link
->ndisc_router_discovery
) {
488 if (link
->dhcp6_client
) {
489 k
= sd_dhcp6_client_stop(link
->dhcp6_client
);
491 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv6 client: %m");
494 k
= sd_ndisc_stop(link
->ndisc_router_discovery
);
496 r
= log_link_warning_errno(link
, r
, "Could not stop IPv6 Router Discovery: %m");
500 k
= sd_lldp_stop(link
->lldp
);
502 r
= log_link_warning_errno(link
, r
, "Could not stop LLDP: %m");
508 void link_enter_failed(Link
*link
) {
511 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
514 log_link_warning(link
, "Failed");
516 link_set_state(link
, LINK_STATE_FAILED
);
518 link_stop_clients(link
);
523 static Address
* link_find_dhcp_server_address(Link
*link
) {
527 assert(link
->network
);
529 /* The first statically configured address if there is any */
530 LIST_FOREACH(addresses
, address
, link
->network
->static_addresses
) {
532 if (address
->family
!= AF_INET
)
535 if (in_addr_is_null(address
->family
, &address
->in_addr
))
541 /* If that didn't work, find a suitable address we got from the pool */
542 LIST_FOREACH(addresses
, address
, link
->pool_addresses
) {
543 if (address
->family
!= AF_INET
)
552 static int link_enter_configured(Link
*link
) {
554 assert(link
->network
);
555 assert(link
->state
== LINK_STATE_SETTING_ROUTES
);
557 log_link_info(link
, "Configured");
559 link_set_state(link
, LINK_STATE_CONFIGURED
);
566 void link_check_ready(Link
*link
) {
575 if (!link
->static_configured
)
578 if (link_ipv4ll_enabled(link
))
579 if (!link
->ipv4ll_address
||
583 if ((link_dhcp4_enabled(link
) && !link_dhcp6_enabled(link
) &&
584 !link
->dhcp4_configured
) ||
585 (link_dhcp6_enabled(link
) && !link_dhcp4_enabled(link
) &&
586 !link
->dhcp6_configured
) ||
587 (link_dhcp4_enabled(link
) && link_dhcp6_enabled(link
) &&
588 !link
->dhcp4_configured
&& !link
->dhcp6_configured
))
591 SET_FOREACH(a
, link
->addresses
, i
)
592 if (!address_is_ready(a
))
595 if (link
->state
!= LINK_STATE_CONFIGURED
)
596 link_enter_configured(link
);
601 static int route_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
602 _cleanup_link_unref_ Link
*link
= userdata
;
605 assert(link
->link_messages
> 0);
606 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
607 LINK_STATE_SETTING_ROUTES
, LINK_STATE_FAILED
,
610 link
->link_messages
--;
612 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
615 r
= sd_netlink_message_get_errno(m
);
616 if (r
< 0 && r
!= -EEXIST
)
617 log_link_warning_errno(link
, r
, "Could not set route: %m");
619 if (link
->link_messages
== 0) {
620 log_link_debug(link
, "Routes set");
621 link
->static_configured
= true;
622 link_check_ready(link
);
628 static int link_enter_set_routes(Link
*link
) {
633 assert(link
->network
);
634 assert(link
->state
== LINK_STATE_SETTING_ADDRESSES
);
636 link_set_state(link
, LINK_STATE_SETTING_ROUTES
);
638 LIST_FOREACH(routes
, rt
, link
->network
->static_routes
) {
639 r
= route_configure(rt
, link
, &route_handler
);
641 log_link_warning_errno(link
, r
, "Could not set routes: %m");
642 link_enter_failed(link
);
646 link
->link_messages
++;
649 if (link
->link_messages
== 0) {
650 link
->static_configured
= true;
651 link_check_ready(link
);
653 log_link_debug(link
, "Setting routes");
658 int link_route_remove_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
659 _cleanup_link_unref_ Link
*link
= userdata
;
664 assert(link
->ifname
);
666 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
669 r
= sd_netlink_message_get_errno(m
);
670 if (r
< 0 && r
!= -ESRCH
)
671 log_link_warning_errno(link
, r
, "Could not drop route: %m");
676 static int address_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
677 _cleanup_link_unref_ Link
*link
= userdata
;
683 assert(link
->ifname
);
684 assert(link
->link_messages
> 0);
685 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
686 LINK_STATE_FAILED
, LINK_STATE_LINGER
));
688 link
->link_messages
--;
690 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
693 r
= sd_netlink_message_get_errno(m
);
694 if (r
< 0 && r
!= -EEXIST
)
695 log_link_warning_errno(link
, r
, "could not set address: %m");
697 manager_rtnl_process_address(rtnl
, m
, link
->manager
);
699 if (link
->link_messages
== 0) {
700 log_link_debug(link
, "Addresses set");
701 link_enter_set_routes(link
);
707 static int link_push_dns_to_dhcp_server(Link
*link
, sd_dhcp_server
*s
) {
708 _cleanup_free_
struct in_addr
*addresses
= NULL
;
709 size_t n_addresses
= 0, n_allocated
= 0;
712 log_debug("Copying DNS server information from %s", link
->ifname
);
717 STRV_FOREACH(a
, link
->network
->dns
) {
720 /* Only look for IPv4 addresses */
721 if (inet_pton(AF_INET
, *a
, &ia
) <= 0)
724 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ 1))
727 addresses
[n_addresses
++] = ia
;
730 if (link
->network
->dhcp_dns
&&
732 const struct in_addr
*da
= NULL
;
735 n
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &da
);
738 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ n
))
741 memcpy(addresses
+ n_addresses
, da
, n
* sizeof(struct in_addr
));
746 if (n_addresses
<= 0)
749 return sd_dhcp_server_set_dns(s
, addresses
, n_addresses
);
752 static int link_push_ntp_to_dhcp_server(Link
*link
, sd_dhcp_server
*s
) {
753 _cleanup_free_
struct in_addr
*addresses
= NULL
;
754 size_t n_addresses
= 0, n_allocated
= 0;
760 log_debug("Copying NTP server information from %s", link
->ifname
);
762 STRV_FOREACH(a
, link
->network
->ntp
) {
765 /* Only look for IPv4 addresses */
766 if (inet_pton(AF_INET
, *a
, &ia
) <= 0)
769 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ 1))
772 addresses
[n_addresses
++] = ia
;
775 if (link
->network
->dhcp_ntp
&&
777 const struct in_addr
*da
= NULL
;
780 n
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &da
);
783 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ n
))
786 memcpy(addresses
+ n_addresses
, da
, n
* sizeof(struct in_addr
));
791 if (n_addresses
<= 0)
794 return sd_dhcp_server_set_ntp(s
, addresses
, n_addresses
);
797 static int link_enter_set_addresses(Link
*link
) {
802 assert(link
->network
);
803 assert(link
->state
!= _LINK_STATE_INVALID
);
805 link_set_state(link
, LINK_STATE_SETTING_ADDRESSES
);
807 LIST_FOREACH(addresses
, ad
, link
->network
->static_addresses
) {
808 r
= address_configure(ad
, link
, &address_handler
, false);
810 log_link_warning_errno(link
, r
, "Could not set addresses: %m");
811 link_enter_failed(link
);
815 link
->link_messages
++;
818 /* now that we can figure out a default address for the dhcp server,
820 if (link_dhcp4_server_enabled(link
)) {
823 bool acquired_uplink
= false;
825 address
= link_find_dhcp_server_address(link
);
827 log_link_warning(link
, "Failed to find suitable address for DHCPv4 server instance.");
828 link_enter_failed(link
);
832 /* use the server address' subnet as the pool */
833 r
= sd_dhcp_server_configure_pool(link
->dhcp_server
, &address
->in_addr
.in
, address
->prefixlen
,
834 link
->network
->dhcp_server_pool_offset
, link
->network
->dhcp_server_pool_size
);
839 r = sd_dhcp_server_set_router(link->dhcp_server,
840 &main_address->in_addr.in);
845 if (link
->network
->dhcp_server_max_lease_time_usec
> 0) {
846 r
= sd_dhcp_server_set_max_lease_time(
848 DIV_ROUND_UP(link
->network
->dhcp_server_max_lease_time_usec
, USEC_PER_SEC
));
853 if (link
->network
->dhcp_server_default_lease_time_usec
> 0) {
854 r
= sd_dhcp_server_set_default_lease_time(
856 DIV_ROUND_UP(link
->network
->dhcp_server_default_lease_time_usec
, USEC_PER_SEC
));
861 if (link
->network
->dhcp_server_emit_dns
) {
863 if (link
->network
->n_dhcp_server_dns
> 0)
864 r
= sd_dhcp_server_set_dns(link
->dhcp_server
, link
->network
->dhcp_server_dns
, link
->network
->n_dhcp_server_dns
);
866 uplink
= manager_find_uplink(link
->manager
, link
);
867 acquired_uplink
= true;
870 log_link_debug(link
, "Not emitting DNS server information on link, couldn't find suitable uplink.");
873 r
= link_push_dns_to_dhcp_server(uplink
, link
->dhcp_server
);
876 log_link_warning_errno(link
, r
, "Failed to set DNS server for DHCP server, ignoring: %m");
880 if (link
->network
->dhcp_server_emit_ntp
) {
882 if (link
->network
->n_dhcp_server_ntp
> 0)
883 r
= sd_dhcp_server_set_ntp(link
->dhcp_server
, link
->network
->dhcp_server_ntp
, link
->network
->n_dhcp_server_ntp
);
885 if (!acquired_uplink
)
886 uplink
= manager_find_uplink(link
->manager
, link
);
889 log_link_debug(link
, "Not emitting NTP server information on link, couldn't find suitable uplink.");
892 r
= link_push_ntp_to_dhcp_server(uplink
, link
->dhcp_server
);
896 log_link_warning_errno(link
, r
, "Failed to set NTP server for DHCP server, ignoring: %m");
899 if (link
->network
->dhcp_server_emit_timezone
) {
900 _cleanup_free_
char *buffer
= NULL
;
901 const char *tz
= NULL
;
903 if (link
->network
->dhcp_server_timezone
)
904 tz
= link
->network
->dhcp_server_timezone
;
906 r
= get_timezone(&buffer
);
908 log_warning_errno(r
, "Failed to determine timezone: %m");
914 r
= sd_dhcp_server_set_timezone(link
->dhcp_server
, tz
);
920 r
= sd_dhcp_server_start(link
->dhcp_server
);
922 log_link_warning_errno(link
, r
, "Could not start DHCPv4 server instance: %m");
924 link_enter_failed(link
);
929 log_link_debug(link
, "Offering DHCPv4 leases");
932 if (link
->link_messages
== 0)
933 link_enter_set_routes(link
);
935 log_link_debug(link
, "Setting addresses");
940 int link_address_remove_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
941 _cleanup_link_unref_ Link
*link
= userdata
;
946 assert(link
->ifname
);
948 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
951 r
= sd_netlink_message_get_errno(m
);
952 if (r
< 0 && r
!= -EADDRNOTAVAIL
)
953 log_link_warning_errno(link
, r
, "Could not drop address: %m");
958 static int link_set_bridge_fdb(Link
*const link
) {
962 LIST_FOREACH(static_fdb_entries
, fdb_entry
, link
->network
->static_fdb_entries
) {
963 r
= fdb_entry_configure(link
, fdb_entry
);
965 log_link_error_errno(link
, r
, "Failed to add MAC entry to static MAC table: %m");
973 static int link_set_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
974 _cleanup_link_unref_ Link
*link
= userdata
;
977 log_link_debug(link
, "Set link");
979 r
= sd_netlink_message_get_errno(m
);
980 if (r
< 0 && r
!= -EEXIST
) {
981 log_link_error_errno(link
, r
, "Could not join netdev: %m");
982 link_enter_failed(link
);
989 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
990 _cleanup_link_unref_ Link
*link
= userdata
;
991 const sd_bus_error
*e
;
996 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
999 e
= sd_bus_message_get_error(m
);
1001 log_link_warning_errno(link
, sd_bus_error_get_errno(e
), "Could not set hostname: %s", e
->message
);
1006 int link_set_hostname(Link
*link
, const char *hostname
) {
1010 assert(link
->manager
);
1012 log_link_debug(link
, "Setting transient hostname: '%s'", strna(hostname
));
1014 if (!link
->manager
->bus
) {
1015 /* TODO: replace by assert when we can rely on kdbus */
1016 log_link_info(link
, "Not connected to system bus, ignoring transient hostname.");
1020 r
= sd_bus_call_method_async(
1023 "org.freedesktop.hostname1",
1024 "/org/freedesktop/hostname1",
1025 "org.freedesktop.hostname1",
1027 set_hostname_handler
,
1034 return log_link_error_errno(link
, r
, "Could not set transient hostname: %m");
1041 static int set_timezone_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1042 _cleanup_link_unref_ Link
*link
= userdata
;
1043 const sd_bus_error
*e
;
1048 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1051 e
= sd_bus_message_get_error(m
);
1053 log_link_warning_errno(link
, sd_bus_error_get_errno(e
), "Could not set timezone: %s", e
->message
);
1058 int link_set_timezone(Link
*link
, const char *tz
) {
1062 assert(link
->manager
);
1065 log_link_debug(link
, "Setting system timezone: '%s'", tz
);
1067 if (!link
->manager
->bus
) {
1068 log_link_info(link
, "Not connected to system bus, ignoring timezone.");
1072 r
= sd_bus_call_method_async(
1075 "org.freedesktop.timedate1",
1076 "/org/freedesktop/timedate1",
1077 "org.freedesktop.timedate1",
1079 set_timezone_handler
,
1085 return log_link_error_errno(link
, r
, "Could not set timezone: %m");
1092 static int set_mtu_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1093 _cleanup_link_unref_ Link
*link
= userdata
;
1098 assert(link
->ifname
);
1100 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1103 r
= sd_netlink_message_get_errno(m
);
1105 log_link_warning_errno(link
, r
, "Could not set MTU: %m");
1110 int link_set_mtu(Link
*link
, uint32_t mtu
) {
1111 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1115 assert(link
->manager
);
1116 assert(link
->manager
->rtnl
);
1118 log_link_debug(link
, "Setting MTU: %" PRIu32
, mtu
);
1120 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1122 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1124 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, mtu
);
1126 return log_link_error_errno(link
, r
, "Could not append MTU: %m");
1128 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, set_mtu_handler
, link
, 0, NULL
);
1130 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1137 static int link_set_bridge(Link
*link
) {
1138 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1142 assert(link
->network
);
1144 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1146 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1148 r
= sd_rtnl_message_link_set_family(req
, PF_BRIDGE
);
1150 return log_link_error_errno(link
, r
, "Could not set message family: %m");
1152 r
= sd_netlink_message_open_container(req
, IFLA_PROTINFO
);
1154 return log_link_error_errno(link
, r
, "Could not append IFLA_PROTINFO attribute: %m");
1156 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_GUARD
, !link
->network
->use_bpdu
);
1158 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_GUARD attribute: %m");
1160 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_MODE
, link
->network
->hairpin
);
1162 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_MODE attribute: %m");
1164 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_FAST_LEAVE
, link
->network
->fast_leave
);
1166 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_FAST_LEAVE attribute: %m");
1168 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_PROTECT
, !link
->network
->allow_port_to_be_root
);
1170 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_PROTECT attribute: %m");
1172 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_UNICAST_FLOOD
, link
->network
->unicast_flood
);
1174 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_UNICAST_FLOOD attribute: %m");
1176 if(link
->network
->cost
!= 0) {
1177 r
= sd_netlink_message_append_u32(req
, IFLA_BRPORT_COST
, link
->network
->cost
);
1179 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_COST attribute: %m");
1182 r
= sd_netlink_message_close_container(req
);
1184 return log_link_error_errno(link
, r
, "Could not append IFLA_LINKINFO attribute: %m");
1186 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_set_handler
, link
, 0, NULL
);
1188 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1195 static void lldp_handler(sd_lldp
*lldp
, int event
, void *userdata
) {
1196 Link
*link
= userdata
;
1200 assert(link
->network
);
1201 assert(link
->manager
);
1204 case SD_LLDP_EVENT_UPDATE_INFO
:
1205 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
1207 log_link_warning_errno(link
, r
, "Could not save LLDP: %m");
1215 static int link_acquire_conf(Link
*link
) {
1219 assert(link
->network
);
1220 assert(link
->manager
);
1221 assert(link
->manager
->event
);
1223 if (link_ipv4ll_enabled(link
)) {
1224 assert(link
->ipv4ll
);
1226 log_link_debug(link
, "Acquiring IPv4 link-local address");
1228 r
= sd_ipv4ll_start(link
->ipv4ll
);
1230 return log_link_warning_errno(link
, r
, "Could not acquire IPv4 link-local address: %m");
1233 if (link_dhcp4_enabled(link
)) {
1234 assert(link
->dhcp_client
);
1236 log_link_debug(link
, "Acquiring DHCPv4 lease");
1238 r
= sd_dhcp_client_start(link
->dhcp_client
);
1240 return log_link_warning_errno(link
, r
, "Could not acquire DHCPv4 lease: %m");
1243 if (link_dhcp6_enabled(link
)) {
1244 assert(link
->ndisc_router_discovery
);
1246 log_link_debug(link
, "Discovering IPv6 routers");
1248 r
= sd_ndisc_router_discovery_start(link
->ndisc_router_discovery
);
1250 return log_link_warning_errno(link
, r
, "Could not start IPv6 Router Discovery: %m");
1253 if (link_lldp_enabled(link
)) {
1256 log_link_debug(link
, "Starting LLDP");
1258 r
= sd_lldp_start(link
->lldp
);
1260 return log_link_warning_errno(link
, r
, "Could not start LLDP: %m");
1266 bool link_has_carrier(Link
*link
) {
1267 /* see Documentation/networking/operstates.txt in the kernel sources */
1269 if (link
->kernel_operstate
== IF_OPER_UP
)
1272 if (link
->kernel_operstate
== IF_OPER_UNKNOWN
)
1273 /* operstate may not be implemented, so fall back to flags */
1274 if ((link
->flags
& IFF_LOWER_UP
) && !(link
->flags
& IFF_DORMANT
))
1280 static int link_up_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1281 _cleanup_link_unref_ Link
*link
= userdata
;
1286 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1289 r
= sd_netlink_message_get_errno(m
);
1291 /* we warn but don't fail the link, as it may be
1293 log_link_warning_errno(link
, r
, "Could not bring up interface: %m");
1298 static int link_up(Link
*link
) {
1299 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1300 uint8_t ipv6ll_mode
;
1304 assert(link
->network
);
1305 assert(link
->manager
);
1306 assert(link
->manager
->rtnl
);
1308 log_link_debug(link
, "Bringing link up");
1310 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1312 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1314 r
= sd_rtnl_message_link_set_flags(req
, IFF_UP
, IFF_UP
);
1316 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1318 if (link
->network
->mac
) {
1319 r
= sd_netlink_message_append_ether_addr(req
, IFLA_ADDRESS
, link
->network
->mac
);
1321 return log_link_error_errno(link
, r
, "Could not set MAC address: %m");
1324 if (link
->network
->mtu
) {
1325 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, link
->network
->mtu
);
1327 return log_link_error_errno(link
, r
, "Could not set MTU: %m");
1330 r
= sd_netlink_message_open_container(req
, IFLA_AF_SPEC
);
1332 return log_link_error_errno(link
, r
, "Could not open IFLA_AF_SPEC container: %m");
1334 if (socket_ipv6_is_supported()) {
1335 /* if the kernel lacks ipv6 support setting IFF_UP fails if any ipv6 options are passed */
1336 r
= sd_netlink_message_open_container(req
, AF_INET6
);
1338 return log_link_error_errno(link
, r
, "Could not open AF_INET6 container: %m");
1340 ipv6ll_mode
= link_ipv6ll_enabled(link
) ? IN6_ADDR_GEN_MODE_EUI64
: IN6_ADDR_GEN_MODE_NONE
;
1341 r
= sd_netlink_message_append_u8(req
, IFLA_INET6_ADDR_GEN_MODE
, ipv6ll_mode
);
1343 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_ADDR_GEN_MODE: %m");
1345 if (!in_addr_is_null(AF_INET6
, &link
->network
->ipv6_token
)) {
1346 r
= sd_netlink_message_append_in6_addr(req
, IFLA_INET6_TOKEN
, &link
->network
->ipv6_token
.in6
);
1348 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_TOKEN: %m");
1351 r
= sd_netlink_message_close_container(req
);
1353 return log_link_error_errno(link
, r
, "Could not close AF_INET6 container: %m");
1356 r
= sd_netlink_message_close_container(req
);
1358 return log_link_error_errno(link
, r
, "Could not close IFLA_AF_SPEC container: %m");
1360 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_up_handler
, link
, 0, NULL
);
1362 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1369 static int link_down_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1370 _cleanup_link_unref_ Link
*link
= userdata
;
1375 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1378 r
= sd_netlink_message_get_errno(m
);
1380 log_link_warning_errno(link
, r
, "Could not bring down interface: %m");
1385 static int link_down(Link
*link
) {
1386 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1390 assert(link
->manager
);
1391 assert(link
->manager
->rtnl
);
1393 log_link_debug(link
, "Bringing link down");
1395 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
,
1396 RTM_SETLINK
, link
->ifindex
);
1398 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1400 r
= sd_rtnl_message_link_set_flags(req
, 0, IFF_UP
);
1402 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1404 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_down_handler
, link
, 0, NULL
);
1406 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1413 static int link_handle_bound_to_list(Link
*link
) {
1417 bool required_up
= false;
1418 bool link_is_up
= false;
1422 if (hashmap_isempty(link
->bound_to_links
))
1425 if (link
->flags
& IFF_UP
)
1428 HASHMAP_FOREACH (l
, link
->bound_to_links
, i
)
1429 if (link_has_carrier(l
)) {
1434 if (!required_up
&& link_is_up
) {
1435 r
= link_down(link
);
1438 } else if (required_up
&& !link_is_up
) {
1447 static int link_handle_bound_by_list(Link
*link
) {
1454 if (hashmap_isempty(link
->bound_by_links
))
1457 HASHMAP_FOREACH (l
, link
->bound_by_links
, i
) {
1458 r
= link_handle_bound_to_list(l
);
1466 static int link_put_carrier(Link
*link
, Link
*carrier
, Hashmap
**h
) {
1472 if (link
== carrier
)
1475 if (hashmap_get(*h
, INT_TO_PTR(carrier
->ifindex
)))
1478 r
= hashmap_ensure_allocated(h
, NULL
);
1482 r
= hashmap_put(*h
, INT_TO_PTR(carrier
->ifindex
), carrier
);
1489 static int link_new_bound_by_list(Link
*link
) {
1494 bool list_updated
= false;
1497 assert(link
->manager
);
1501 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1502 if (!carrier
->network
)
1505 if (strv_isempty(carrier
->network
->bind_carrier
))
1508 if (strv_fnmatch(carrier
->network
->bind_carrier
, link
->ifname
, 0)) {
1509 r
= link_put_carrier(link
, carrier
, &link
->bound_by_links
);
1513 list_updated
= true;
1520 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
) {
1521 r
= link_put_carrier(carrier
, link
, &carrier
->bound_to_links
);
1525 link_dirty(carrier
);
1531 static int link_new_bound_to_list(Link
*link
) {
1536 bool list_updated
= false;
1539 assert(link
->manager
);
1544 if (strv_isempty(link
->network
->bind_carrier
))
1549 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1550 if (strv_fnmatch(link
->network
->bind_carrier
, carrier
->ifname
, 0)) {
1551 r
= link_put_carrier(link
, carrier
, &link
->bound_to_links
);
1555 list_updated
= true;
1562 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
) {
1563 r
= link_put_carrier(carrier
, link
, &carrier
->bound_by_links
);
1567 link_dirty(carrier
);
1573 static int link_new_carrier_maps(Link
*link
) {
1576 r
= link_new_bound_by_list(link
);
1580 r
= link_handle_bound_by_list(link
);
1584 r
= link_new_bound_to_list(link
);
1588 r
= link_handle_bound_to_list(link
);
1595 static void link_free_bound_to_list(Link
*link
) {
1599 HASHMAP_FOREACH (bound_to
, link
->bound_to_links
, i
) {
1600 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(bound_to
->ifindex
));
1602 if (hashmap_remove(bound_to
->bound_by_links
, INT_TO_PTR(link
->ifindex
)))
1603 link_dirty(bound_to
);
1609 static void link_free_bound_by_list(Link
*link
) {
1613 HASHMAP_FOREACH (bound_by
, link
->bound_by_links
, i
) {
1614 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(bound_by
->ifindex
));
1616 if (hashmap_remove(bound_by
->bound_to_links
, INT_TO_PTR(link
->ifindex
))) {
1617 link_dirty(bound_by
);
1618 link_handle_bound_to_list(bound_by
);
1625 static void link_free_carrier_maps(Link
*link
) {
1626 bool list_updated
= false;
1630 if (!hashmap_isempty(link
->bound_to_links
)) {
1631 link_free_bound_to_list(link
);
1632 list_updated
= true;
1635 if (!hashmap_isempty(link
->bound_by_links
)) {
1636 link_free_bound_by_list(link
);
1637 list_updated
= true;
1646 void link_drop(Link
*link
) {
1647 if (!link
|| link
->state
== LINK_STATE_LINGER
)
1650 link_set_state(link
, LINK_STATE_LINGER
);
1652 link_free_carrier_maps(link
);
1654 log_link_debug(link
, "Link removed");
1656 (void)unlink(link
->state_file
);
1662 static int link_joined(Link
*link
) {
1666 assert(link
->network
);
1668 if (!hashmap_isempty(link
->bound_to_links
)) {
1669 r
= link_handle_bound_to_list(link
);
1672 } else if (!(link
->flags
& IFF_UP
)) {
1675 link_enter_failed(link
);
1680 if(link
->network
->bridge
) {
1681 r
= link_set_bridge(link
);
1683 log_link_error_errno(link
, r
, "Could not set bridge message: %m");
1686 return link_enter_set_addresses(link
);
1689 static int netdev_join_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1690 _cleanup_link_unref_ Link
*link
= userdata
;
1694 assert(link
->network
);
1698 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1701 r
= sd_netlink_message_get_errno(m
);
1702 if (r
< 0 && r
!= -EEXIST
) {
1703 log_link_error_errno(link
, r
, "Could not join netdev: %m");
1704 link_enter_failed(link
);
1707 log_link_debug(link
, "Joined netdev");
1709 if (link
->enslaving
<= 0)
1715 static int link_enter_join_netdev(Link
*link
) {
1721 assert(link
->network
);
1722 assert(link
->state
== LINK_STATE_PENDING
);
1724 link_set_state(link
, LINK_STATE_ENSLAVING
);
1728 if (!link
->network
->bridge
&&
1729 !link
->network
->bond
&&
1730 hashmap_isempty(link
->network
->stacked_netdevs
))
1731 return link_joined(link
);
1733 if (link
->network
->bond
) {
1734 log_struct(LOG_DEBUG
,
1735 LOG_LINK_INTERFACE(link
),
1736 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1737 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bond
->ifname
),
1740 r
= netdev_join(link
->network
->bond
, link
, netdev_join_handler
);
1742 log_struct_errno(LOG_WARNING
, r
,
1743 LOG_LINK_INTERFACE(link
),
1744 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1745 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bond
->ifname
),
1748 link_enter_failed(link
);
1755 if (link
->network
->bridge
) {
1756 log_struct(LOG_DEBUG
,
1757 LOG_LINK_INTERFACE(link
),
1758 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1759 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bridge
->ifname
),
1762 r
= netdev_join(link
->network
->bridge
, link
, netdev_join_handler
);
1764 log_struct_errno(LOG_WARNING
, r
,
1765 LOG_LINK_INTERFACE(link
),
1766 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1767 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bridge
->ifname
),
1769 link_enter_failed(link
);
1776 HASHMAP_FOREACH(netdev
, link
->network
->stacked_netdevs
, i
) {
1778 log_struct(LOG_DEBUG
,
1779 LOG_LINK_INTERFACE(link
),
1780 LOG_NETDEV_INTERFACE(netdev
),
1781 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", netdev
->ifname
),
1784 r
= netdev_join(netdev
, link
, netdev_join_handler
);
1786 log_struct_errno(LOG_WARNING
, r
,
1787 LOG_LINK_INTERFACE(link
),
1788 LOG_NETDEV_INTERFACE(netdev
),
1789 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", netdev
->ifname
),
1791 link_enter_failed(link
);
1801 static int link_set_ipv4_forward(Link
*link
) {
1802 const char *p
= NULL
, *v
;
1805 if (link
->flags
& IFF_LOOPBACK
)
1808 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1811 p
= strjoina("/proc/sys/net/ipv4/conf/", link
->ifname
, "/forwarding");
1812 v
= one_zero(link_ipv4_forward_enabled(link
));
1814 r
= write_string_file(p
, v
, 0);
1816 /* If the right value is set anyway, don't complain */
1817 if (verify_one_line_file(p
, v
) > 0)
1820 log_link_warning_errno(link
, r
, "Cannot configure IPv4 forwarding for interface %s: %m", link
->ifname
);
1826 static int link_set_ipv6_forward(Link
*link
) {
1827 const char *p
= NULL
, *v
= NULL
;
1830 /* Make this a NOP if IPv6 is not available */
1831 if (!socket_ipv6_is_supported())
1834 if (link
->flags
& IFF_LOOPBACK
)
1837 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1840 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/forwarding");
1841 v
= one_zero(link_ipv6_forward_enabled(link
));
1843 r
= write_string_file(p
, v
, 0);
1845 /* If the right value is set anyway, don't complain */
1846 if (verify_one_line_file(p
, v
) > 0)
1849 log_link_warning_errno(link
, r
, "Cannot configure IPv6 forwarding for interface: %m");
1855 static int link_set_ipv6_privacy_extensions(Link
*link
) {
1856 char buf
[DECIMAL_STR_MAX(unsigned) + 1];
1857 IPv6PrivacyExtensions s
;
1858 const char *p
= NULL
;
1861 /* Make this a NOP if IPv6 is not available */
1862 if (!socket_ipv6_is_supported())
1865 s
= link_ipv6_privacy_extensions(link
);
1866 if (s
== _IPV6_PRIVACY_EXTENSIONS_INVALID
)
1869 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/use_tempaddr");
1870 xsprintf(buf
, "%u", link
->network
->ipv6_privacy_extensions
);
1872 r
= write_string_file(p
, buf
, 0);
1874 /* If the right value is set anyway, don't complain */
1875 if (verify_one_line_file(p
, buf
) > 0)
1878 log_link_warning_errno(link
, r
, "Cannot configure IPv6 privacy extension for interface: %m");
1884 static int link_set_ipv6_accept_ra(Link
*link
) {
1885 const char *p
= NULL
, *v
= NULL
;
1888 /* Make this a NOP if IPv6 is not available */
1889 if (!socket_ipv6_is_supported())
1892 if (link
->flags
& IFF_LOOPBACK
)
1895 /* If unset use system default (enabled if local forwarding is disabled.
1896 * disabled if local forwarding is enabled).
1897 * If set, ignore or enforce RA independent of local forwarding state.
1899 if (link
->network
->ipv6_accept_ra
< 0)
1900 /* default to accept RA if ip_forward is disabled and ignore RA if ip_forward is enabled */
1902 else if (link
->network
->ipv6_accept_ra
> 0)
1903 /* "2" means accept RA even if ip_forward is enabled */
1906 /* "0" means ignore RA */
1909 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/accept_ra");
1911 r
= write_string_file(p
, v
, 0);
1913 /* If the right value is set anyway, don't complain */
1914 if (verify_one_line_file(p
, v
) > 0)
1917 log_link_warning_errno(link
, r
, "Cannot configure IPv6 accept_ra for interface: %m");
1923 static int link_set_ipv6_dad_transmits(Link
*link
) {
1924 char buf
[DECIMAL_STR_MAX(unsigned) + 1];
1925 const char *p
= NULL
;
1928 /* Make this a NOP if IPv6 is not available */
1929 if (!socket_ipv6_is_supported())
1932 if (link
->flags
& IFF_LOOPBACK
)
1935 if (link
->network
->ipv6_dad_transmits
< 0)
1938 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/dad_transmits");
1940 xsprintf(buf
, "%u", link
->network
->ipv6_dad_transmits
);
1942 r
= write_string_file(p
, buf
, 0);
1944 /* If the right value is set anyway, don't complain */
1945 if (verify_one_line_file(p
, buf
) > 0)
1948 log_link_warning_errno(link
, r
, "Cannot set IPv6 dad transmits for interface: %m");
1954 static int link_configure(Link
*link
) {
1958 assert(link
->network
);
1959 assert(link
->state
== LINK_STATE_PENDING
);
1961 r
= link_set_bridge_fdb(link
);
1965 r
= link_set_ipv4_forward(link
);
1969 r
= link_set_ipv6_forward(link
);
1973 r
= link_set_ipv6_privacy_extensions(link
);
1977 r
= link_set_ipv6_accept_ra(link
);
1981 r
= link_set_ipv6_dad_transmits(link
);
1985 if (link_ipv4ll_enabled(link
)) {
1986 r
= ipv4ll_configure(link
);
1991 if (link_dhcp4_enabled(link
)) {
1992 r
= dhcp4_configure(link
);
1997 if (link_dhcp4_server_enabled(link
)) {
1998 r
= sd_dhcp_server_new(&link
->dhcp_server
, link
->ifindex
);
2002 r
= sd_dhcp_server_attach_event(link
->dhcp_server
, NULL
, 0);
2007 if (link_dhcp6_enabled(link
)) {
2008 r
= ndisc_configure(link
);
2013 if (link_lldp_enabled(link
)) {
2014 r
= sd_lldp_new(link
->ifindex
, link
->ifname
, &link
->mac
, &link
->lldp
);
2018 r
= sd_lldp_attach_event(link
->lldp
, NULL
, 0);
2022 r
= sd_lldp_set_callback(link
->lldp
,
2023 lldp_handler
, link
);
2028 if (link_has_carrier(link
)) {
2029 r
= link_acquire_conf(link
);
2034 return link_enter_join_netdev(link
);
2037 static int link_initialized_and_synced(sd_netlink
*rtnl
, sd_netlink_message
*m
,
2039 _cleanup_link_unref_ Link
*link
= userdata
;
2044 assert(link
->ifname
);
2045 assert(link
->manager
);
2047 if (link
->state
!= LINK_STATE_PENDING
)
2050 log_link_debug(link
, "Link state is up-to-date");
2052 r
= link_new_bound_by_list(link
);
2056 r
= link_handle_bound_by_list(link
);
2060 r
= network_get(link
->manager
, link
->udev_device
, link
->ifname
,
2061 &link
->mac
, &network
);
2063 link_enter_unmanaged(link
);
2068 if (link
->flags
& IFF_LOOPBACK
) {
2069 if (network
->link_local
!= ADDRESS_FAMILY_NO
)
2070 log_link_debug(link
, "Ignoring link-local autoconfiguration for loopback link");
2072 if (network
->dhcp
!= ADDRESS_FAMILY_NO
)
2073 log_link_debug(link
, "Ignoring DHCP clients for loopback link");
2075 if (network
->dhcp_server
)
2076 log_link_debug(link
, "Ignoring DHCP server for loopback link");
2079 r
= network_apply(link
->manager
, network
, link
);
2083 r
= link_new_bound_to_list(link
);
2087 r
= link_configure(link
);
2094 int link_initialized(Link
*link
, struct udev_device
*device
) {
2095 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
2099 assert(link
->manager
);
2100 assert(link
->manager
->rtnl
);
2103 if (link
->state
!= LINK_STATE_PENDING
)
2106 if (link
->udev_device
)
2109 log_link_debug(link
, "udev initialized link");
2111 link
->udev_device
= udev_device_ref(device
);
2113 /* udev has initialized the link, but we don't know if we have yet
2114 * processed the NEWLINK messages with the latest state. Do a GETLINK,
2115 * when it returns we know that the pending NEWLINKs have already been
2116 * processed and that we are up-to-date */
2118 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_GETLINK
,
2123 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
,
2124 link_initialized_and_synced
, link
, 0, NULL
);
2133 int link_add(Manager
*m
, sd_netlink_message
*message
, Link
**ret
) {
2135 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
2136 char ifindex_str
[2 + DECIMAL_STR_MAX(int)];
2144 r
= link_new(m
, message
, ret
);
2150 log_link_debug(link
, "Link %d added", link
->ifindex
);
2152 if (detect_container() <= 0) {
2153 /* not in a container, udev will be around */
2154 sprintf(ifindex_str
, "n%d", link
->ifindex
);
2155 device
= udev_device_new_from_device_id(m
->udev
, ifindex_str
);
2157 r
= log_link_warning_errno(link
, errno
, "Could not find udev device: %m");
2161 if (udev_device_get_is_initialized(device
) <= 0) {
2163 log_link_debug(link
, "link pending udev initialization...");
2167 r
= link_initialized(link
, device
);
2171 /* we are calling a callback directly, so must take a ref */
2174 r
= link_initialized_and_synced(m
->rtnl
, NULL
, link
);
2181 link_enter_failed(link
);
2185 static int link_carrier_gained(Link
*link
) {
2190 if (link
->network
) {
2191 r
= link_acquire_conf(link
);
2193 link_enter_failed(link
);
2198 r
= link_handle_bound_by_list(link
);
2205 static int link_carrier_lost(Link
*link
) {
2210 r
= link_stop_clients(link
);
2212 link_enter_failed(link
);
2216 r
= link_handle_bound_by_list(link
);
2223 int link_carrier_reset(Link
*link
) {
2228 if (link_has_carrier(link
)) {
2229 r
= link_carrier_lost(link
);
2233 r
= link_carrier_gained(link
);
2237 log_link_info(link
, "Reset carrier");
2244 int link_update(Link
*link
, sd_netlink_message
*m
) {
2245 struct ether_addr mac
;
2248 bool had_carrier
, carrier_gained
, carrier_lost
;
2252 assert(link
->ifname
);
2255 if (link
->state
== LINK_STATE_LINGER
) {
2257 log_link_info(link
, "Link readded");
2258 link_set_state(link
, LINK_STATE_ENSLAVING
);
2260 r
= link_new_carrier_maps(link
);
2265 r
= sd_netlink_message_read_string(m
, IFLA_IFNAME
, &ifname
);
2266 if (r
>= 0 && !streq(ifname
, link
->ifname
)) {
2267 log_link_info(link
, "Renamed to %s", ifname
);
2269 link_free_carrier_maps(link
);
2271 r
= free_and_strdup(&link
->ifname
, ifname
);
2275 r
= link_new_carrier_maps(link
);
2280 r
= sd_netlink_message_read_u32(m
, IFLA_MTU
, &mtu
);
2281 if (r
>= 0 && mtu
> 0) {
2283 if (!link
->original_mtu
) {
2284 link
->original_mtu
= mtu
;
2285 log_link_debug(link
, "Saved original MTU: %" PRIu32
, link
->original_mtu
);
2288 if (link
->dhcp_client
) {
2289 r
= sd_dhcp_client_set_mtu(link
->dhcp_client
,
2292 log_link_warning_errno(link
, r
, "Could not update MTU in DHCP client: %m");
2298 /* The kernel may broadcast NEWLINK messages without the MAC address
2299 set, simply ignore them. */
2300 r
= sd_netlink_message_read_ether_addr(m
, IFLA_ADDRESS
, &mac
);
2302 if (memcmp(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2305 memcpy(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2308 log_link_debug(link
, "MAC address: "
2309 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2310 mac
.ether_addr_octet
[0],
2311 mac
.ether_addr_octet
[1],
2312 mac
.ether_addr_octet
[2],
2313 mac
.ether_addr_octet
[3],
2314 mac
.ether_addr_octet
[4],
2315 mac
.ether_addr_octet
[5]);
2318 r
= sd_ipv4ll_set_mac(link
->ipv4ll
, &link
->mac
);
2320 return log_link_warning_errno(link
, r
, "Could not update MAC address in IPv4LL client: %m");
2323 if (link
->dhcp_client
) {
2324 r
= sd_dhcp_client_set_mac(link
->dhcp_client
,
2325 (const uint8_t *) &link
->mac
,
2329 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCP client: %m");
2332 if (link
->dhcp6_client
) {
2333 r
= sd_dhcp6_client_set_mac(link
->dhcp6_client
,
2334 (const uint8_t *) &link
->mac
,
2338 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCPv6 client: %m");
2343 had_carrier
= link_has_carrier(link
);
2345 r
= link_update_flags(link
, m
);
2349 carrier_gained
= !had_carrier
&& link_has_carrier(link
);
2350 carrier_lost
= had_carrier
&& !link_has_carrier(link
);
2352 if (carrier_gained
) {
2353 log_link_info(link
, "Gained carrier");
2355 r
= link_carrier_gained(link
);
2358 } else if (carrier_lost
) {
2359 log_link_info(link
, "Lost carrier");
2361 r
= link_carrier_lost(link
);
2370 int link_save(Link
*link
) {
2371 _cleanup_free_
char *temp_path
= NULL
;
2372 _cleanup_fclose_
FILE *f
= NULL
;
2373 const char *admin_state
, *oper_state
;
2379 assert(link
->state_file
);
2380 assert(link
->lease_file
);
2381 assert(link
->manager
);
2383 if (link
->state
== LINK_STATE_LINGER
) {
2384 unlink(link
->state_file
);
2388 admin_state
= link_state_to_string(link
->state
);
2389 assert(admin_state
);
2391 oper_state
= link_operstate_to_string(link
->operstate
);
2394 r
= fopen_temporary(link
->state_file
, &f
, &temp_path
);
2398 fchmod(fileno(f
), 0644);
2401 "# This is private data. Do not parse.\n"
2404 admin_state
, oper_state
);
2406 if (link
->network
) {
2407 char **address
, **domain
;
2409 sd_dhcp6_lease
*dhcp6_lease
= NULL
;
2411 if (link
->dhcp6_client
) {
2412 r
= sd_dhcp6_client_get_lease(link
->dhcp6_client
,
2415 log_link_debug(link
, "No DHCPv6 lease");
2418 fprintf(f
, "NETWORK_FILE=%s\n", link
->network
->filename
);
2422 STRV_FOREACH(address
, link
->network
->dns
) {
2429 if (link
->network
->dhcp_dns
&&
2431 const struct in_addr
*addresses
;
2433 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
2437 serialize_in_addrs(f
, addresses
, r
);
2442 if (link
->network
->dhcp_dns
&& dhcp6_lease
) {
2443 struct in6_addr
*in6_addrs
;
2445 r
= sd_dhcp6_lease_get_dns(dhcp6_lease
, &in6_addrs
);
2449 serialize_in6_addrs(f
, in6_addrs
, r
);
2457 STRV_FOREACH(address
, link
->network
->ntp
) {
2464 if (link
->network
->dhcp_ntp
&&
2466 const struct in_addr
*addresses
;
2468 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
2472 serialize_in_addrs(f
, addresses
, r
);
2477 if (link
->network
->dhcp_ntp
&& dhcp6_lease
) {
2478 struct in6_addr
*in6_addrs
;
2482 r
= sd_dhcp6_lease_get_ntp_addrs(dhcp6_lease
,
2487 serialize_in6_addrs(f
, in6_addrs
, r
);
2491 r
= sd_dhcp6_lease_get_ntp_fqdn(dhcp6_lease
, &hosts
);
2493 STRV_FOREACH(hostname
, hosts
) {
2496 fputs(*hostname
, f
);
2504 fprintf(f
, "DOMAINS=");
2506 STRV_FOREACH(domain
, link
->network
->domains
) {
2513 if (link
->network
->dhcp_domains
&&
2515 const char *domainname
;
2517 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
2521 fputs(domainname
, f
);
2526 if (link
->network
->dhcp_domains
&& dhcp6_lease
) {
2529 r
= sd_dhcp6_lease_get_domains(dhcp6_lease
, &domains
);
2531 STRV_FOREACH(domain
, domains
) {
2542 fprintf(f
, "WILDCARD_DOMAIN=%s\n",
2543 yes_no(link
->network
->wildcard_domain
));
2545 fprintf(f
, "LLMNR=%s\n",
2546 resolve_support_to_string(link
->network
->llmnr
));
2548 fprintf(f
, "ADDRESSES=");
2550 SET_FOREACH(a
, link
->addresses
, i
) {
2551 _cleanup_free_
char *address_str
= NULL
;
2553 r
= in_addr_to_string(a
->family
, &a
->in_addr
, &address_str
);
2557 fprintf(f
, "%s%s/%u", space
? " " : "", address_str
, a
->prefixlen
);
2564 if (!hashmap_isempty(link
->bound_to_links
)) {
2568 fputs("CARRIER_BOUND_TO=", f
);
2569 HASHMAP_FOREACH(carrier
, link
->bound_to_links
, i
) {
2572 fputs(carrier
->ifname
, f
);
2579 if (!hashmap_isempty(link
->bound_by_links
)) {
2583 fputs("CARRIER_BOUND_BY=", f
);
2584 HASHMAP_FOREACH(carrier
, link
->bound_by_links
, i
) {
2587 fputs(carrier
->ifname
, f
);
2594 if (link
->dhcp_lease
) {
2595 const char *tz
= NULL
;
2597 r
= sd_dhcp_lease_get_timezone(link
->dhcp_lease
, &tz
);
2599 fprintf(f
, "TIMEZONE=%s\n", tz
);
2602 if (link
->dhcp_lease
) {
2603 assert(link
->network
);
2605 r
= dhcp_lease_save(link
->dhcp_lease
, link
->lease_file
);
2613 unlink(link
->lease_file
);
2616 assert(link
->network
);
2618 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
2626 unlink(link
->lldp_file
);
2628 r
= fflush_and_check(f
);
2632 if (rename(temp_path
, link
->state_file
) < 0) {
2640 (void) unlink(link
->state_file
);
2642 (void) unlink(temp_path
);
2644 return log_link_error_errno(link
, r
, "Failed to save link data to %s: %m", link
->state_file
);
2647 /* The serialized state in /run is no longer up-to-date. */
2648 void link_dirty(Link
*link
) {
2653 r
= set_ensure_allocated(&link
->manager
->dirty_links
, NULL
);
2655 /* allocation errors are ignored */
2658 r
= set_put(link
->manager
->dirty_links
, link
);
2660 /* allocation errors are ignored */
2666 /* The serialized state in /run is up-to-date */
2667 void link_clean(Link
*link
) {
2669 assert(link
->manager
);
2671 set_remove(link
->manager
->dirty_links
, link
);
2675 static const char* const link_state_table
[_LINK_STATE_MAX
] = {
2676 [LINK_STATE_PENDING
] = "pending",
2677 [LINK_STATE_ENSLAVING
] = "configuring",
2678 [LINK_STATE_SETTING_ADDRESSES
] = "configuring",
2679 [LINK_STATE_SETTING_ROUTES
] = "configuring",
2680 [LINK_STATE_CONFIGURED
] = "configured",
2681 [LINK_STATE_UNMANAGED
] = "unmanaged",
2682 [LINK_STATE_FAILED
] = "failed",
2683 [LINK_STATE_LINGER
] = "linger",
2686 DEFINE_STRING_TABLE_LOOKUP(link_state
, LinkState
);
2688 static const char* const link_operstate_table
[_LINK_OPERSTATE_MAX
] = {
2689 [LINK_OPERSTATE_OFF
] = "off",
2690 [LINK_OPERSTATE_NO_CARRIER
] = "no-carrier",
2691 [LINK_OPERSTATE_DORMANT
] = "dormant",
2692 [LINK_OPERSTATE_CARRIER
] = "carrier",
2693 [LINK_OPERSTATE_DEGRADED
] = "degraded",
2694 [LINK_OPERSTATE_ROUTABLE
] = "routable",
2697 DEFINE_STRING_TABLE_LOOKUP(link_operstate
, LinkOperationalState
);