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"
29 #include "event-util.h"
32 #include "netlink-util.h"
33 #include "network-internal.h"
34 #include "networkd-link.h"
35 #include "networkd-netdev.h"
37 #include "socket-util.h"
38 #include "stdio-util.h"
39 #include "string-table.h"
40 #include "udev-util.h"
44 bool link_dhcp6_enabled(Link
*link
) {
45 if (link
->flags
& IFF_LOOPBACK
)
51 return link
->network
->dhcp
& ADDRESS_FAMILY_IPV6
;
54 bool link_dhcp4_enabled(Link
*link
) {
55 if (link
->flags
& IFF_LOOPBACK
)
61 return link
->network
->dhcp
& ADDRESS_FAMILY_IPV4
;
64 bool link_dhcp4_server_enabled(Link
*link
) {
65 if (link
->flags
& IFF_LOOPBACK
)
71 return link
->network
->dhcp_server
;
74 bool link_ipv4ll_enabled(Link
*link
) {
75 if (link
->flags
& IFF_LOOPBACK
)
81 return link
->network
->link_local
& ADDRESS_FAMILY_IPV4
;
84 bool link_ipv6ll_enabled(Link
*link
) {
85 if (link
->flags
& IFF_LOOPBACK
)
91 return link
->network
->link_local
& ADDRESS_FAMILY_IPV6
;
94 bool link_lldp_enabled(Link
*link
) {
95 if (link
->flags
& IFF_LOOPBACK
)
101 if (link
->network
->bridge
)
104 return link
->network
->lldp
;
107 static bool link_ipv4_forward_enabled(Link
*link
) {
108 if (link
->flags
& IFF_LOOPBACK
)
114 return link
->network
->ip_forward
& ADDRESS_FAMILY_IPV4
;
117 static bool link_ipv6_forward_enabled(Link
*link
) {
118 if (link
->flags
& IFF_LOOPBACK
)
124 return link
->network
->ip_forward
& ADDRESS_FAMILY_IPV6
;
127 bool link_ipv6_accept_ra_enabled(Link
*link
) {
128 if (link
->flags
& IFF_LOOPBACK
)
134 /* If unset use system default (enabled if local forwarding is disabled.
135 * disabled if local forwarding is enabled).
136 * If set, ignore or enforce RA independent of local forwarding state.
138 if (link
->network
->ipv6_accept_ra
< 0)
139 /* default to accept RA if ip_forward is disabled and ignore RA if ip_forward is enabled */
140 return !link_ipv6_forward_enabled(link
);
141 else if (link
->network
->ipv6_accept_ra
> 0)
142 /* accept RA even if ip_forward is enabled */
149 static IPv6PrivacyExtensions
link_ipv6_privacy_extensions(Link
*link
) {
150 if (link
->flags
& IFF_LOOPBACK
)
151 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
154 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
156 return link
->network
->ipv6_privacy_extensions
;
159 void link_update_operstate(Link
*link
) {
160 LinkOperationalState operstate
;
163 if (link
->kernel_operstate
== IF_OPER_DORMANT
)
164 operstate
= LINK_OPERSTATE_DORMANT
;
165 else if (link_has_carrier(link
)) {
167 uint8_t scope
= RT_SCOPE_NOWHERE
;
170 /* if we have carrier, check what addresses we have */
171 SET_FOREACH(address
, link
->addresses
, i
) {
172 if (!address_is_ready(address
))
175 if (address
->scope
< scope
)
176 scope
= address
->scope
;
179 /* for operstate we also take foreign addresses into account */
180 SET_FOREACH(address
, link
->addresses_foreign
, i
) {
181 if (!address_is_ready(address
))
184 if (address
->scope
< scope
)
185 scope
= address
->scope
;
188 if (scope
< RT_SCOPE_SITE
)
189 /* universally accessible addresses found */
190 operstate
= LINK_OPERSTATE_ROUTABLE
;
191 else if (scope
< RT_SCOPE_HOST
)
192 /* only link or site local addresses found */
193 operstate
= LINK_OPERSTATE_DEGRADED
;
195 /* no useful addresses found */
196 operstate
= LINK_OPERSTATE_CARRIER
;
197 } else if (link
->flags
& IFF_UP
)
198 operstate
= LINK_OPERSTATE_NO_CARRIER
;
200 operstate
= LINK_OPERSTATE_OFF
;
202 if (link
->operstate
!= operstate
) {
203 link
->operstate
= operstate
;
204 link_send_changed(link
, "OperationalState", NULL
);
206 manager_dirty(link
->manager
);
210 #define FLAG_STRING(string, flag, old, new) \
211 (((old ^ new) & flag) \
212 ? ((old & flag) ? (" -" string) : (" +" string)) \
215 static int link_update_flags(Link
*link
, sd_netlink_message
*m
) {
216 unsigned flags
, unknown_flags_added
, unknown_flags_removed
, unknown_flags
;
222 r
= sd_rtnl_message_link_get_flags(m
, &flags
);
224 return log_link_warning_errno(link
, r
, "Could not get link flags: %m");
226 r
= sd_netlink_message_read_u8(m
, IFLA_OPERSTATE
, &operstate
);
228 /* if we got a message without operstate, take it to mean
229 the state was unchanged */
230 operstate
= link
->kernel_operstate
;
232 if ((link
->flags
== flags
) && (link
->kernel_operstate
== operstate
))
235 if (link
->flags
!= flags
) {
236 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",
237 FLAG_STRING("LOOPBACK", IFF_LOOPBACK
, link
->flags
, flags
),
238 FLAG_STRING("MASTER", IFF_MASTER
, link
->flags
, flags
),
239 FLAG_STRING("SLAVE", IFF_SLAVE
, link
->flags
, flags
),
240 FLAG_STRING("UP", IFF_UP
, link
->flags
, flags
),
241 FLAG_STRING("DORMANT", IFF_DORMANT
, link
->flags
, flags
),
242 FLAG_STRING("LOWER_UP", IFF_LOWER_UP
, link
->flags
, flags
),
243 FLAG_STRING("RUNNING", IFF_RUNNING
, link
->flags
, flags
),
244 FLAG_STRING("MULTICAST", IFF_MULTICAST
, link
->flags
, flags
),
245 FLAG_STRING("BROADCAST", IFF_BROADCAST
, link
->flags
, flags
),
246 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT
, link
->flags
, flags
),
247 FLAG_STRING("PROMISC", IFF_PROMISC
, link
->flags
, flags
),
248 FLAG_STRING("ALLMULTI", IFF_ALLMULTI
, link
->flags
, flags
),
249 FLAG_STRING("PORTSEL", IFF_PORTSEL
, link
->flags
, flags
),
250 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA
, link
->flags
, flags
),
251 FLAG_STRING("DYNAMIC", IFF_DYNAMIC
, link
->flags
, flags
),
252 FLAG_STRING("NOARP", IFF_NOARP
, link
->flags
, flags
),
253 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS
, link
->flags
, flags
),
254 FLAG_STRING("DEBUG", IFF_DEBUG
, link
->flags
, flags
),
255 FLAG_STRING("ECHO", IFF_ECHO
, link
->flags
, flags
));
257 unknown_flags
= ~(IFF_LOOPBACK
| IFF_MASTER
| IFF_SLAVE
| IFF_UP
|
258 IFF_DORMANT
| IFF_LOWER_UP
| IFF_RUNNING
|
259 IFF_MULTICAST
| IFF_BROADCAST
| IFF_POINTOPOINT
|
260 IFF_PROMISC
| IFF_ALLMULTI
| IFF_PORTSEL
|
261 IFF_AUTOMEDIA
| IFF_DYNAMIC
| IFF_NOARP
|
262 IFF_NOTRAILERS
| IFF_DEBUG
| IFF_ECHO
);
263 unknown_flags_added
= ((link
->flags
^ flags
) & flags
& unknown_flags
);
264 unknown_flags_removed
= ((link
->flags
^ flags
) & link
->flags
& unknown_flags
);
266 /* link flags are currently at most 18 bits, let's align to
268 if (unknown_flags_added
)
270 "Unknown link flags gained: %#.5x (ignoring)",
271 unknown_flags_added
);
273 if (unknown_flags_removed
)
275 "Unknown link flags lost: %#.5x (ignoring)",
276 unknown_flags_removed
);
280 link
->kernel_operstate
= operstate
;
282 link_update_operstate(link
);
287 static int link_new(Manager
*manager
, sd_netlink_message
*message
, Link
**ret
) {
288 _cleanup_link_unref_ Link
*link
= NULL
;
297 r
= sd_netlink_message_get_type(message
, &type
);
300 else if (type
!= RTM_NEWLINK
)
303 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
306 else if (ifindex
<= 0)
309 r
= sd_netlink_message_read_string(message
, IFLA_IFNAME
, &ifname
);
313 link
= new0(Link
, 1);
318 link
->manager
= manager
;
319 link
->state
= LINK_STATE_PENDING
;
320 link
->rtnl_extended_attrs
= true;
321 link
->ifindex
= ifindex
;
322 link
->ifname
= strdup(ifname
);
326 r
= sd_netlink_message_read_ether_addr(message
, IFLA_ADDRESS
, &link
->mac
);
328 log_link_debug(link
, "MAC address not found for new device, continuing without");
330 r
= asprintf(&link
->state_file
, "/run/systemd/netif/links/%d",
335 r
= asprintf(&link
->lease_file
, "/run/systemd/netif/leases/%d",
340 r
= asprintf(&link
->lldp_file
, "/run/systemd/netif/lldp/%d",
346 r
= hashmap_ensure_allocated(&manager
->links
, NULL
);
350 r
= hashmap_put(manager
->links
, INT_TO_PTR(link
->ifindex
), link
);
354 r
= link_update_flags(link
, message
);
364 static void link_free(Link
*link
) {
372 while (!set_isempty(link
->addresses
))
373 address_free(set_first(link
->addresses
));
375 while (!set_isempty(link
->addresses_foreign
))
376 address_free(set_first(link
->addresses_foreign
));
378 link
->addresses
= set_free(link
->addresses
);
380 link
->addresses_foreign
= set_free(link
->addresses_foreign
);
382 while ((address
= link
->pool_addresses
)) {
383 LIST_REMOVE(addresses
, link
->pool_addresses
, address
);
384 address_free(address
);
387 sd_dhcp_server_unref(link
->dhcp_server
);
388 sd_dhcp_client_unref(link
->dhcp_client
);
389 sd_dhcp_lease_unref(link
->dhcp_lease
);
391 free(link
->lease_file
);
393 sd_lldp_free(link
->lldp
);
395 free(link
->lldp_file
);
397 sd_ipv4ll_unref(link
->ipv4ll
);
398 sd_dhcp6_client_unref(link
->dhcp6_client
);
399 sd_ndisc_unref(link
->ndisc_router_discovery
);
402 hashmap_remove(link
->manager
->links
, INT_TO_PTR(link
->ifindex
));
406 (void)unlink(link
->state_file
);
407 free(link
->state_file
);
409 udev_device_unref(link
->udev_device
);
411 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
)
412 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(carrier
->ifindex
));
413 hashmap_free(link
->bound_to_links
);
415 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
)
416 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(carrier
->ifindex
));
417 hashmap_free(link
->bound_by_links
);
422 Link
*link_unref(Link
*link
) {
426 assert(link
->n_ref
> 0);
438 Link
*link_ref(Link
*link
) {
442 assert(link
->n_ref
> 0);
449 int link_get(Manager
*m
, int ifindex
, Link
**ret
) {
456 link
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
465 static void link_set_state(Link
*link
, LinkState state
) {
468 if (link
->state
== state
)
473 link_send_changed(link
, "AdministrativeState", NULL
);
478 static void link_enter_unmanaged(Link
*link
) {
481 log_link_debug(link
, "Unmanaged");
483 link_set_state(link
, LINK_STATE_UNMANAGED
);
488 static int link_stop_clients(Link
*link
) {
492 assert(link
->manager
);
493 assert(link
->manager
->event
);
498 if (link
->dhcp_client
) {
499 k
= sd_dhcp_client_stop(link
->dhcp_client
);
501 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv4 client: %m");
505 k
= sd_ipv4ll_stop(link
->ipv4ll
);
507 r
= log_link_warning_errno(link
, r
, "Could not stop IPv4 link-local: %m");
510 if (link
->dhcp6_client
) {
511 k
= sd_dhcp6_client_stop(link
->dhcp6_client
);
513 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv6 client: %m");
516 if (link
->ndisc_router_discovery
) {
517 k
= sd_ndisc_stop(link
->ndisc_router_discovery
);
519 r
= log_link_warning_errno(link
, r
, "Could not stop IPv6 Router Discovery: %m");
523 k
= sd_lldp_stop(link
->lldp
);
525 r
= log_link_warning_errno(link
, r
, "Could not stop LLDP: %m");
531 void link_enter_failed(Link
*link
) {
534 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
537 log_link_warning(link
, "Failed");
539 link_set_state(link
, LINK_STATE_FAILED
);
541 link_stop_clients(link
);
546 static Address
* link_find_dhcp_server_address(Link
*link
) {
550 assert(link
->network
);
552 /* The first statically configured address if there is any */
553 LIST_FOREACH(addresses
, address
, link
->network
->static_addresses
) {
555 if (address
->family
!= AF_INET
)
558 if (in_addr_is_null(address
->family
, &address
->in_addr
))
564 /* If that didn't work, find a suitable address we got from the pool */
565 LIST_FOREACH(addresses
, address
, link
->pool_addresses
) {
566 if (address
->family
!= AF_INET
)
575 static int link_enter_configured(Link
*link
) {
577 assert(link
->network
);
578 assert(link
->state
== LINK_STATE_SETTING_ROUTES
);
580 log_link_info(link
, "Configured");
582 link_set_state(link
, LINK_STATE_CONFIGURED
);
589 void link_check_ready(Link
*link
) {
598 if (!link
->static_configured
)
601 if (link_ipv4ll_enabled(link
))
602 if (!link
->ipv4ll_address
||
606 if ((link_dhcp4_enabled(link
) && !link_dhcp6_enabled(link
) &&
607 !link
->dhcp4_configured
) ||
608 (link_dhcp6_enabled(link
) && !link_dhcp4_enabled(link
) &&
609 !link
->dhcp6_configured
) ||
610 (link_dhcp4_enabled(link
) && link_dhcp6_enabled(link
) &&
611 !link
->dhcp4_configured
&& !link
->dhcp6_configured
))
614 SET_FOREACH(a
, link
->addresses
, i
)
615 if (!address_is_ready(a
))
618 if (link
->state
!= LINK_STATE_CONFIGURED
)
619 link_enter_configured(link
);
624 static int route_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
625 _cleanup_link_unref_ Link
*link
= userdata
;
628 assert(link
->link_messages
> 0);
629 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
630 LINK_STATE_SETTING_ROUTES
, LINK_STATE_FAILED
,
633 link
->link_messages
--;
635 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
638 r
= sd_netlink_message_get_errno(m
);
639 if (r
< 0 && r
!= -EEXIST
)
640 log_link_warning_errno(link
, r
, "Could not set route: %m");
642 if (link
->link_messages
== 0) {
643 log_link_debug(link
, "Routes set");
644 link
->static_configured
= true;
645 link_check_ready(link
);
651 static int link_enter_set_routes(Link
*link
) {
656 assert(link
->network
);
657 assert(link
->state
== LINK_STATE_SETTING_ADDRESSES
);
659 link_set_state(link
, LINK_STATE_SETTING_ROUTES
);
661 LIST_FOREACH(routes
, rt
, link
->network
->static_routes
) {
662 r
= route_configure(rt
, link
, &route_handler
);
664 log_link_warning_errno(link
, r
, "Could not set routes: %m");
665 link_enter_failed(link
);
669 link
->link_messages
++;
672 if (link
->link_messages
== 0) {
673 link
->static_configured
= true;
674 link_check_ready(link
);
676 log_link_debug(link
, "Setting routes");
681 int link_route_remove_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
682 _cleanup_link_unref_ Link
*link
= userdata
;
687 assert(link
->ifname
);
689 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
692 r
= sd_netlink_message_get_errno(m
);
693 if (r
< 0 && r
!= -ESRCH
)
694 log_link_warning_errno(link
, r
, "Could not drop route: %m");
699 static int address_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
700 _cleanup_link_unref_ Link
*link
= userdata
;
706 assert(link
->ifname
);
707 assert(link
->link_messages
> 0);
708 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
709 LINK_STATE_FAILED
, LINK_STATE_LINGER
));
711 link
->link_messages
--;
713 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
716 r
= sd_netlink_message_get_errno(m
);
717 if (r
< 0 && r
!= -EEXIST
)
718 log_link_warning_errno(link
, r
, "could not set address: %m");
720 manager_rtnl_process_address(rtnl
, m
, link
->manager
);
722 if (link
->link_messages
== 0) {
723 log_link_debug(link
, "Addresses set");
724 link_enter_set_routes(link
);
730 static int link_push_dns_to_dhcp_server(Link
*link
, sd_dhcp_server
*s
) {
731 _cleanup_free_
struct in_addr
*addresses
= NULL
;
732 size_t n_addresses
= 0, n_allocated
= 0;
735 log_debug("Copying DNS server information from %s", link
->ifname
);
740 STRV_FOREACH(a
, link
->network
->dns
) {
743 /* Only look for IPv4 addresses */
744 if (inet_pton(AF_INET
, *a
, &ia
) <= 0)
747 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ 1))
750 addresses
[n_addresses
++] = ia
;
753 if (link
->network
->dhcp_dns
&&
755 const struct in_addr
*da
= NULL
;
758 n
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &da
);
761 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ n
))
764 memcpy(addresses
+ n_addresses
, da
, n
* sizeof(struct in_addr
));
769 if (n_addresses
<= 0)
772 return sd_dhcp_server_set_dns(s
, addresses
, n_addresses
);
775 static int link_push_ntp_to_dhcp_server(Link
*link
, sd_dhcp_server
*s
) {
776 _cleanup_free_
struct in_addr
*addresses
= NULL
;
777 size_t n_addresses
= 0, n_allocated
= 0;
783 log_debug("Copying NTP server information from %s", link
->ifname
);
785 STRV_FOREACH(a
, link
->network
->ntp
) {
788 /* Only look for IPv4 addresses */
789 if (inet_pton(AF_INET
, *a
, &ia
) <= 0)
792 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ 1))
795 addresses
[n_addresses
++] = ia
;
798 if (link
->network
->dhcp_ntp
&&
800 const struct in_addr
*da
= NULL
;
803 n
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &da
);
806 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ n
))
809 memcpy(addresses
+ n_addresses
, da
, n
* sizeof(struct in_addr
));
814 if (n_addresses
<= 0)
817 return sd_dhcp_server_set_ntp(s
, addresses
, n_addresses
);
820 static int link_enter_set_addresses(Link
*link
) {
825 assert(link
->network
);
826 assert(link
->state
!= _LINK_STATE_INVALID
);
828 link_set_state(link
, LINK_STATE_SETTING_ADDRESSES
);
830 LIST_FOREACH(addresses
, ad
, link
->network
->static_addresses
) {
831 r
= address_configure(ad
, link
, &address_handler
, false);
833 log_link_warning_errno(link
, r
, "Could not set addresses: %m");
834 link_enter_failed(link
);
838 link
->link_messages
++;
841 /* now that we can figure out a default address for the dhcp server,
843 if (link_dhcp4_server_enabled(link
)) {
846 bool acquired_uplink
= false;
848 address
= link_find_dhcp_server_address(link
);
850 log_link_warning(link
, "Failed to find suitable address for DHCPv4 server instance.");
851 link_enter_failed(link
);
855 /* use the server address' subnet as the pool */
856 r
= sd_dhcp_server_configure_pool(link
->dhcp_server
, &address
->in_addr
.in
, address
->prefixlen
,
857 link
->network
->dhcp_server_pool_offset
, link
->network
->dhcp_server_pool_size
);
862 r = sd_dhcp_server_set_router(link->dhcp_server,
863 &main_address->in_addr.in);
868 if (link
->network
->dhcp_server_max_lease_time_usec
> 0) {
869 r
= sd_dhcp_server_set_max_lease_time(
871 DIV_ROUND_UP(link
->network
->dhcp_server_max_lease_time_usec
, USEC_PER_SEC
));
876 if (link
->network
->dhcp_server_default_lease_time_usec
> 0) {
877 r
= sd_dhcp_server_set_default_lease_time(
879 DIV_ROUND_UP(link
->network
->dhcp_server_default_lease_time_usec
, USEC_PER_SEC
));
884 if (link
->network
->dhcp_server_emit_dns
) {
886 if (link
->network
->n_dhcp_server_dns
> 0)
887 r
= sd_dhcp_server_set_dns(link
->dhcp_server
, link
->network
->dhcp_server_dns
, link
->network
->n_dhcp_server_dns
);
889 uplink
= manager_find_uplink(link
->manager
, link
);
890 acquired_uplink
= true;
893 log_link_debug(link
, "Not emitting DNS server information on link, couldn't find suitable uplink.");
896 r
= link_push_dns_to_dhcp_server(uplink
, link
->dhcp_server
);
899 log_link_warning_errno(link
, r
, "Failed to set DNS server for DHCP server, ignoring: %m");
903 if (link
->network
->dhcp_server_emit_ntp
) {
905 if (link
->network
->n_dhcp_server_ntp
> 0)
906 r
= sd_dhcp_server_set_ntp(link
->dhcp_server
, link
->network
->dhcp_server_ntp
, link
->network
->n_dhcp_server_ntp
);
908 if (!acquired_uplink
)
909 uplink
= manager_find_uplink(link
->manager
, link
);
912 log_link_debug(link
, "Not emitting NTP server information on link, couldn't find suitable uplink.");
915 r
= link_push_ntp_to_dhcp_server(uplink
, link
->dhcp_server
);
919 log_link_warning_errno(link
, r
, "Failed to set NTP server for DHCP server, ignoring: %m");
922 if (link
->network
->dhcp_server_emit_timezone
) {
923 _cleanup_free_
char *buffer
= NULL
;
924 const char *tz
= NULL
;
926 if (link
->network
->dhcp_server_timezone
)
927 tz
= link
->network
->dhcp_server_timezone
;
929 r
= get_timezone(&buffer
);
931 log_warning_errno(r
, "Failed to determine timezone: %m");
937 r
= sd_dhcp_server_set_timezone(link
->dhcp_server
, tz
);
943 r
= sd_dhcp_server_start(link
->dhcp_server
);
945 log_link_warning_errno(link
, r
, "Could not start DHCPv4 server instance: %m");
947 link_enter_failed(link
);
952 log_link_debug(link
, "Offering DHCPv4 leases");
955 if (link
->link_messages
== 0)
956 link_enter_set_routes(link
);
958 log_link_debug(link
, "Setting addresses");
963 int link_address_remove_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
964 _cleanup_link_unref_ Link
*link
= userdata
;
969 assert(link
->ifname
);
971 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
974 r
= sd_netlink_message_get_errno(m
);
975 if (r
< 0 && r
!= -EADDRNOTAVAIL
)
976 log_link_warning_errno(link
, r
, "Could not drop address: %m");
981 static int link_set_bridge_fdb(Link
*const link
) {
985 LIST_FOREACH(static_fdb_entries
, fdb_entry
, link
->network
->static_fdb_entries
) {
986 r
= fdb_entry_configure(link
, fdb_entry
);
988 log_link_error_errno(link
, r
, "Failed to add MAC entry to static MAC table: %m");
996 static int link_set_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
997 _cleanup_link_unref_ Link
*link
= userdata
;
1000 log_link_debug(link
, "Set link");
1002 r
= sd_netlink_message_get_errno(m
);
1003 if (r
< 0 && r
!= -EEXIST
) {
1004 log_link_error_errno(link
, r
, "Could not join netdev: %m");
1005 link_enter_failed(link
);
1012 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1013 _cleanup_link_unref_ Link
*link
= userdata
;
1014 const sd_bus_error
*e
;
1019 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1022 e
= sd_bus_message_get_error(m
);
1024 log_link_warning_errno(link
, sd_bus_error_get_errno(e
), "Could not set hostname: %s", e
->message
);
1029 int link_set_hostname(Link
*link
, const char *hostname
) {
1033 assert(link
->manager
);
1035 log_link_debug(link
, "Setting transient hostname: '%s'", strna(hostname
));
1037 if (!link
->manager
->bus
) {
1038 /* TODO: replace by assert when we can rely on kdbus */
1039 log_link_info(link
, "Not connected to system bus, ignoring transient hostname.");
1043 r
= sd_bus_call_method_async(
1046 "org.freedesktop.hostname1",
1047 "/org/freedesktop/hostname1",
1048 "org.freedesktop.hostname1",
1050 set_hostname_handler
,
1057 return log_link_error_errno(link
, r
, "Could not set transient hostname: %m");
1064 static int set_timezone_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1065 _cleanup_link_unref_ Link
*link
= userdata
;
1066 const sd_bus_error
*e
;
1071 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1074 e
= sd_bus_message_get_error(m
);
1076 log_link_warning_errno(link
, sd_bus_error_get_errno(e
), "Could not set timezone: %s", e
->message
);
1081 int link_set_timezone(Link
*link
, const char *tz
) {
1085 assert(link
->manager
);
1088 log_link_debug(link
, "Setting system timezone: '%s'", tz
);
1090 if (!link
->manager
->bus
) {
1091 log_link_info(link
, "Not connected to system bus, ignoring timezone.");
1095 r
= sd_bus_call_method_async(
1098 "org.freedesktop.timedate1",
1099 "/org/freedesktop/timedate1",
1100 "org.freedesktop.timedate1",
1102 set_timezone_handler
,
1108 return log_link_error_errno(link
, r
, "Could not set timezone: %m");
1115 static int set_mtu_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1116 _cleanup_link_unref_ Link
*link
= userdata
;
1121 assert(link
->ifname
);
1123 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1126 r
= sd_netlink_message_get_errno(m
);
1128 log_link_warning_errno(link
, r
, "Could not set MTU: %m");
1133 int link_set_mtu(Link
*link
, uint32_t mtu
) {
1134 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1138 assert(link
->manager
);
1139 assert(link
->manager
->rtnl
);
1141 log_link_debug(link
, "Setting MTU: %" PRIu32
, mtu
);
1143 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1145 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1147 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, mtu
);
1149 return log_link_error_errno(link
, r
, "Could not append MTU: %m");
1151 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, set_mtu_handler
, link
, 0, NULL
);
1153 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1160 static int link_set_bridge(Link
*link
) {
1161 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1165 assert(link
->network
);
1167 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1169 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1171 r
= sd_rtnl_message_link_set_family(req
, PF_BRIDGE
);
1173 return log_link_error_errno(link
, r
, "Could not set message family: %m");
1175 r
= sd_netlink_message_open_container(req
, IFLA_PROTINFO
);
1177 return log_link_error_errno(link
, r
, "Could not append IFLA_PROTINFO attribute: %m");
1179 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_GUARD
, !link
->network
->use_bpdu
);
1181 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_GUARD attribute: %m");
1183 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_MODE
, link
->network
->hairpin
);
1185 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_MODE attribute: %m");
1187 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_FAST_LEAVE
, link
->network
->fast_leave
);
1189 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_FAST_LEAVE attribute: %m");
1191 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_PROTECT
, !link
->network
->allow_port_to_be_root
);
1193 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_PROTECT attribute: %m");
1195 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_UNICAST_FLOOD
, link
->network
->unicast_flood
);
1197 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_UNICAST_FLOOD attribute: %m");
1199 if(link
->network
->cost
!= 0) {
1200 r
= sd_netlink_message_append_u32(req
, IFLA_BRPORT_COST
, link
->network
->cost
);
1202 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_COST attribute: %m");
1205 r
= sd_netlink_message_close_container(req
);
1207 return log_link_error_errno(link
, r
, "Could not append IFLA_LINKINFO attribute: %m");
1209 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_set_handler
, link
, 0, NULL
);
1211 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1218 static void lldp_handler(sd_lldp
*lldp
, int event
, void *userdata
) {
1219 Link
*link
= userdata
;
1223 assert(link
->network
);
1224 assert(link
->manager
);
1227 case SD_LLDP_EVENT_UPDATE_INFO
:
1228 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
1230 log_link_warning_errno(link
, r
, "Could not save LLDP: %m");
1238 static int link_acquire_conf(Link
*link
) {
1242 assert(link
->network
);
1243 assert(link
->manager
);
1244 assert(link
->manager
->event
);
1246 if (link_ipv4ll_enabled(link
)) {
1247 assert(link
->ipv4ll
);
1249 log_link_debug(link
, "Acquiring IPv4 link-local address");
1251 r
= sd_ipv4ll_start(link
->ipv4ll
);
1253 return log_link_warning_errno(link
, r
, "Could not acquire IPv4 link-local address: %m");
1256 if (link_dhcp4_enabled(link
)) {
1257 assert(link
->dhcp_client
);
1259 log_link_debug(link
, "Acquiring DHCPv4 lease");
1261 r
= sd_dhcp_client_start(link
->dhcp_client
);
1263 return log_link_warning_errno(link
, r
, "Could not acquire DHCPv4 lease: %m");
1266 if (link_dhcp6_enabled(link
)) {
1267 assert(link
->dhcp6_client
);
1269 log_link_debug(link
, "Acquiring DHCPv6 lease");
1271 r
= sd_dhcp6_client_start(link
->dhcp6_client
);
1273 return log_link_warning_errno(link
, r
, "Could not acquire DHCPv6 lease: %m");
1276 if (link_ipv6_accept_ra_enabled(link
)) {
1277 assert(link
->ndisc_router_discovery
);
1279 log_link_debug(link
, "Discovering IPv6 routers");
1281 r
= sd_ndisc_router_discovery_start(link
->ndisc_router_discovery
);
1283 return log_link_warning_errno(link
, r
, "Could not start IPv6 Router Discovery: %m");
1286 if (link_lldp_enabled(link
)) {
1289 log_link_debug(link
, "Starting LLDP");
1291 r
= sd_lldp_start(link
->lldp
);
1293 return log_link_warning_errno(link
, r
, "Could not start LLDP: %m");
1299 bool link_has_carrier(Link
*link
) {
1300 /* see Documentation/networking/operstates.txt in the kernel sources */
1302 if (link
->kernel_operstate
== IF_OPER_UP
)
1305 if (link
->kernel_operstate
== IF_OPER_UNKNOWN
)
1306 /* operstate may not be implemented, so fall back to flags */
1307 if ((link
->flags
& IFF_LOWER_UP
) && !(link
->flags
& IFF_DORMANT
))
1313 static int link_up_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1314 _cleanup_link_unref_ Link
*link
= userdata
;
1319 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1322 r
= sd_netlink_message_get_errno(m
);
1324 /* we warn but don't fail the link, as it may be
1326 log_link_warning_errno(link
, r
, "Could not bring up interface: %m");
1331 static int link_up(Link
*link
) {
1332 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1333 uint8_t ipv6ll_mode
;
1337 assert(link
->network
);
1338 assert(link
->manager
);
1339 assert(link
->manager
->rtnl
);
1341 log_link_debug(link
, "Bringing link up");
1343 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1345 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1347 r
= sd_rtnl_message_link_set_flags(req
, IFF_UP
, IFF_UP
);
1349 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1351 if (link
->network
->mac
) {
1352 r
= sd_netlink_message_append_ether_addr(req
, IFLA_ADDRESS
, link
->network
->mac
);
1354 return log_link_error_errno(link
, r
, "Could not set MAC address: %m");
1357 if (link
->network
->mtu
) {
1358 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, link
->network
->mtu
);
1360 return log_link_error_errno(link
, r
, "Could not set MTU: %m");
1363 r
= sd_netlink_message_open_container(req
, IFLA_AF_SPEC
);
1365 return log_link_error_errno(link
, r
, "Could not open IFLA_AF_SPEC container: %m");
1367 if (socket_ipv6_is_supported()) {
1368 /* if the kernel lacks ipv6 support setting IFF_UP fails if any ipv6 options are passed */
1369 r
= sd_netlink_message_open_container(req
, AF_INET6
);
1371 return log_link_error_errno(link
, r
, "Could not open AF_INET6 container: %m");
1373 ipv6ll_mode
= link_ipv6ll_enabled(link
) ? IN6_ADDR_GEN_MODE_EUI64
: IN6_ADDR_GEN_MODE_NONE
;
1374 r
= sd_netlink_message_append_u8(req
, IFLA_INET6_ADDR_GEN_MODE
, ipv6ll_mode
);
1376 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_ADDR_GEN_MODE: %m");
1378 if (!in_addr_is_null(AF_INET6
, &link
->network
->ipv6_token
)) {
1379 r
= sd_netlink_message_append_in6_addr(req
, IFLA_INET6_TOKEN
, &link
->network
->ipv6_token
.in6
);
1381 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_TOKEN: %m");
1384 r
= sd_netlink_message_close_container(req
);
1386 return log_link_error_errno(link
, r
, "Could not close AF_INET6 container: %m");
1389 r
= sd_netlink_message_close_container(req
);
1391 return log_link_error_errno(link
, r
, "Could not close IFLA_AF_SPEC container: %m");
1393 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_up_handler
, link
, 0, NULL
);
1395 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1402 static int link_down_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1403 _cleanup_link_unref_ Link
*link
= userdata
;
1408 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1411 r
= sd_netlink_message_get_errno(m
);
1413 log_link_warning_errno(link
, r
, "Could not bring down interface: %m");
1418 static int link_down(Link
*link
) {
1419 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1423 assert(link
->manager
);
1424 assert(link
->manager
->rtnl
);
1426 log_link_debug(link
, "Bringing link down");
1428 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
,
1429 RTM_SETLINK
, link
->ifindex
);
1431 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1433 r
= sd_rtnl_message_link_set_flags(req
, 0, IFF_UP
);
1435 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1437 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_down_handler
, link
, 0, NULL
);
1439 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1446 static int link_handle_bound_to_list(Link
*link
) {
1450 bool required_up
= false;
1451 bool link_is_up
= false;
1455 if (hashmap_isempty(link
->bound_to_links
))
1458 if (link
->flags
& IFF_UP
)
1461 HASHMAP_FOREACH (l
, link
->bound_to_links
, i
)
1462 if (link_has_carrier(l
)) {
1467 if (!required_up
&& link_is_up
) {
1468 r
= link_down(link
);
1471 } else if (required_up
&& !link_is_up
) {
1480 static int link_handle_bound_by_list(Link
*link
) {
1487 if (hashmap_isempty(link
->bound_by_links
))
1490 HASHMAP_FOREACH (l
, link
->bound_by_links
, i
) {
1491 r
= link_handle_bound_to_list(l
);
1499 static int link_put_carrier(Link
*link
, Link
*carrier
, Hashmap
**h
) {
1505 if (link
== carrier
)
1508 if (hashmap_get(*h
, INT_TO_PTR(carrier
->ifindex
)))
1511 r
= hashmap_ensure_allocated(h
, NULL
);
1515 r
= hashmap_put(*h
, INT_TO_PTR(carrier
->ifindex
), carrier
);
1522 static int link_new_bound_by_list(Link
*link
) {
1527 bool list_updated
= false;
1530 assert(link
->manager
);
1534 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1535 if (!carrier
->network
)
1538 if (strv_isempty(carrier
->network
->bind_carrier
))
1541 if (strv_fnmatch(carrier
->network
->bind_carrier
, link
->ifname
, 0)) {
1542 r
= link_put_carrier(link
, carrier
, &link
->bound_by_links
);
1546 list_updated
= true;
1553 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
) {
1554 r
= link_put_carrier(carrier
, link
, &carrier
->bound_to_links
);
1558 link_dirty(carrier
);
1564 static int link_new_bound_to_list(Link
*link
) {
1569 bool list_updated
= false;
1572 assert(link
->manager
);
1577 if (strv_isempty(link
->network
->bind_carrier
))
1582 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1583 if (strv_fnmatch(link
->network
->bind_carrier
, carrier
->ifname
, 0)) {
1584 r
= link_put_carrier(link
, carrier
, &link
->bound_to_links
);
1588 list_updated
= true;
1595 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
) {
1596 r
= link_put_carrier(carrier
, link
, &carrier
->bound_by_links
);
1600 link_dirty(carrier
);
1606 static int link_new_carrier_maps(Link
*link
) {
1609 r
= link_new_bound_by_list(link
);
1613 r
= link_handle_bound_by_list(link
);
1617 r
= link_new_bound_to_list(link
);
1621 r
= link_handle_bound_to_list(link
);
1628 static void link_free_bound_to_list(Link
*link
) {
1632 HASHMAP_FOREACH (bound_to
, link
->bound_to_links
, i
) {
1633 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(bound_to
->ifindex
));
1635 if (hashmap_remove(bound_to
->bound_by_links
, INT_TO_PTR(link
->ifindex
)))
1636 link_dirty(bound_to
);
1642 static void link_free_bound_by_list(Link
*link
) {
1646 HASHMAP_FOREACH (bound_by
, link
->bound_by_links
, i
) {
1647 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(bound_by
->ifindex
));
1649 if (hashmap_remove(bound_by
->bound_to_links
, INT_TO_PTR(link
->ifindex
))) {
1650 link_dirty(bound_by
);
1651 link_handle_bound_to_list(bound_by
);
1658 static void link_free_carrier_maps(Link
*link
) {
1659 bool list_updated
= false;
1663 if (!hashmap_isempty(link
->bound_to_links
)) {
1664 link_free_bound_to_list(link
);
1665 list_updated
= true;
1668 if (!hashmap_isempty(link
->bound_by_links
)) {
1669 link_free_bound_by_list(link
);
1670 list_updated
= true;
1679 void link_drop(Link
*link
) {
1680 if (!link
|| link
->state
== LINK_STATE_LINGER
)
1683 link_set_state(link
, LINK_STATE_LINGER
);
1685 link_free_carrier_maps(link
);
1687 log_link_debug(link
, "Link removed");
1689 (void)unlink(link
->state_file
);
1695 static int link_joined(Link
*link
) {
1699 assert(link
->network
);
1701 if (!hashmap_isempty(link
->bound_to_links
)) {
1702 r
= link_handle_bound_to_list(link
);
1705 } else if (!(link
->flags
& IFF_UP
)) {
1708 link_enter_failed(link
);
1713 if(link
->network
->bridge
) {
1714 r
= link_set_bridge(link
);
1716 log_link_error_errno(link
, r
, "Could not set bridge message: %m");
1719 return link_enter_set_addresses(link
);
1722 static int netdev_join_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1723 _cleanup_link_unref_ Link
*link
= userdata
;
1727 assert(link
->network
);
1731 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1734 r
= sd_netlink_message_get_errno(m
);
1735 if (r
< 0 && r
!= -EEXIST
) {
1736 log_link_error_errno(link
, r
, "Could not join netdev: %m");
1737 link_enter_failed(link
);
1740 log_link_debug(link
, "Joined netdev");
1742 if (link
->enslaving
<= 0)
1748 static int link_enter_join_netdev(Link
*link
) {
1754 assert(link
->network
);
1755 assert(link
->state
== LINK_STATE_PENDING
);
1757 link_set_state(link
, LINK_STATE_ENSLAVING
);
1761 if (!link
->network
->bridge
&&
1762 !link
->network
->bond
&&
1763 hashmap_isempty(link
->network
->stacked_netdevs
))
1764 return link_joined(link
);
1766 if (link
->network
->bond
) {
1767 log_struct(LOG_DEBUG
,
1768 LOG_LINK_INTERFACE(link
),
1769 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1770 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bond
->ifname
),
1773 r
= netdev_join(link
->network
->bond
, link
, netdev_join_handler
);
1775 log_struct_errno(LOG_WARNING
, r
,
1776 LOG_LINK_INTERFACE(link
),
1777 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1778 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bond
->ifname
),
1781 link_enter_failed(link
);
1788 if (link
->network
->bridge
) {
1789 log_struct(LOG_DEBUG
,
1790 LOG_LINK_INTERFACE(link
),
1791 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1792 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bridge
->ifname
),
1795 r
= netdev_join(link
->network
->bridge
, link
, netdev_join_handler
);
1797 log_struct_errno(LOG_WARNING
, r
,
1798 LOG_LINK_INTERFACE(link
),
1799 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1800 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bridge
->ifname
),
1802 link_enter_failed(link
);
1809 HASHMAP_FOREACH(netdev
, link
->network
->stacked_netdevs
, i
) {
1811 log_struct(LOG_DEBUG
,
1812 LOG_LINK_INTERFACE(link
),
1813 LOG_NETDEV_INTERFACE(netdev
),
1814 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", netdev
->ifname
),
1817 r
= netdev_join(netdev
, link
, netdev_join_handler
);
1819 log_struct_errno(LOG_WARNING
, r
,
1820 LOG_LINK_INTERFACE(link
),
1821 LOG_NETDEV_INTERFACE(netdev
),
1822 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", netdev
->ifname
),
1824 link_enter_failed(link
);
1834 static int link_set_ipv4_forward(Link
*link
) {
1835 const char *p
= NULL
, *v
;
1838 if (link
->flags
& IFF_LOOPBACK
)
1841 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1844 p
= strjoina("/proc/sys/net/ipv4/conf/", link
->ifname
, "/forwarding");
1845 v
= one_zero(link_ipv4_forward_enabled(link
));
1847 r
= write_string_file(p
, v
, 0);
1849 /* If the right value is set anyway, don't complain */
1850 if (verify_one_line_file(p
, v
) > 0)
1853 log_link_warning_errno(link
, r
, "Cannot configure IPv4 forwarding for interface %s: %m", link
->ifname
);
1859 static int link_set_ipv6_forward(Link
*link
) {
1860 const char *p
= NULL
, *v
= NULL
;
1863 /* Make this a NOP if IPv6 is not available */
1864 if (!socket_ipv6_is_supported())
1867 if (link
->flags
& IFF_LOOPBACK
)
1870 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1873 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/forwarding");
1874 v
= one_zero(link_ipv6_forward_enabled(link
));
1876 r
= write_string_file(p
, v
, 0);
1878 /* If the right value is set anyway, don't complain */
1879 if (verify_one_line_file(p
, v
) > 0)
1882 log_link_warning_errno(link
, r
, "Cannot configure IPv6 forwarding for interface: %m");
1888 static int link_set_ipv6_privacy_extensions(Link
*link
) {
1889 char buf
[DECIMAL_STR_MAX(unsigned) + 1];
1890 IPv6PrivacyExtensions s
;
1891 const char *p
= NULL
;
1894 /* Make this a NOP if IPv6 is not available */
1895 if (!socket_ipv6_is_supported())
1898 s
= link_ipv6_privacy_extensions(link
);
1899 if (s
== _IPV6_PRIVACY_EXTENSIONS_INVALID
)
1902 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/use_tempaddr");
1903 xsprintf(buf
, "%u", link
->network
->ipv6_privacy_extensions
);
1905 r
= write_string_file(p
, buf
, 0);
1907 /* If the right value is set anyway, don't complain */
1908 if (verify_one_line_file(p
, buf
) > 0)
1911 log_link_warning_errno(link
, r
, "Cannot configure IPv6 privacy extension for interface: %m");
1917 static int link_set_ipv6_accept_ra(Link
*link
) {
1918 const char *p
= NULL
, *v
= NULL
;
1921 /* Make this a NOP if IPv6 is not available */
1922 if (!socket_ipv6_is_supported())
1925 if (link
->flags
& IFF_LOOPBACK
)
1928 /* If unset use system default (enabled if local forwarding is disabled.
1929 * disabled if local forwarding is enabled).
1930 * If set, ignore or enforce RA independent of local forwarding state.
1932 if (link
->network
->ipv6_accept_ra
< 0)
1933 /* default to accept RA if ip_forward is disabled and ignore RA if ip_forward is enabled */
1935 else if (link
->network
->ipv6_accept_ra
> 0)
1936 /* "2" means accept RA even if ip_forward is enabled */
1939 /* "0" means ignore RA */
1942 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/accept_ra");
1944 r
= write_string_file(p
, v
, 0);
1946 /* If the right value is set anyway, don't complain */
1947 if (verify_one_line_file(p
, v
) > 0)
1950 log_link_warning_errno(link
, r
, "Cannot configure IPv6 accept_ra for interface: %m");
1956 static int link_set_ipv6_dad_transmits(Link
*link
) {
1957 char buf
[DECIMAL_STR_MAX(unsigned) + 1];
1958 const char *p
= NULL
;
1961 /* Make this a NOP if IPv6 is not available */
1962 if (!socket_ipv6_is_supported())
1965 if (link
->flags
& IFF_LOOPBACK
)
1968 if (link
->network
->ipv6_dad_transmits
< 0)
1971 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/dad_transmits");
1973 xsprintf(buf
, "%u", link
->network
->ipv6_dad_transmits
);
1975 r
= write_string_file(p
, buf
, 0);
1977 /* If the right value is set anyway, don't complain */
1978 if (verify_one_line_file(p
, buf
) > 0)
1981 log_link_warning_errno(link
, r
, "Cannot set IPv6 dad transmits for interface: %m");
1987 static int link_set_ipv6_hop_limit(Link
*link
) {
1988 char buf
[DECIMAL_STR_MAX(unsigned) + 1];
1989 const char *p
= NULL
;
1992 /* Make this a NOP if IPv6 is not available */
1993 if (!socket_ipv6_is_supported())
1996 if (link
->flags
& IFF_LOOPBACK
)
1999 if (link
->network
->ipv6_hop_limit
< 0)
2002 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/hop_limit");
2004 xsprintf(buf
, "%u", link
->network
->ipv6_hop_limit
);
2006 r
= write_string_file(p
, buf
, 0);
2008 /* If the right value is set anyway, don't complain */
2009 if (verify_one_line_file(p
, buf
) > 0)
2012 log_link_warning_errno(link
, r
, "Cannot set IPv6 hop limit for interface: %m");
2018 static int link_configure(Link
*link
) {
2022 assert(link
->network
);
2023 assert(link
->state
== LINK_STATE_PENDING
);
2025 r
= link_set_bridge_fdb(link
);
2029 r
= link_set_ipv4_forward(link
);
2033 r
= link_set_ipv6_forward(link
);
2037 r
= link_set_ipv6_privacy_extensions(link
);
2041 r
= link_set_ipv6_accept_ra(link
);
2045 r
= link_set_ipv6_dad_transmits(link
);
2049 r
= link_set_ipv6_hop_limit(link
);
2053 if (link_ipv4ll_enabled(link
)) {
2054 r
= ipv4ll_configure(link
);
2059 if (link_dhcp4_enabled(link
)) {
2060 r
= dhcp4_configure(link
);
2065 if (link_dhcp4_server_enabled(link
)) {
2066 r
= sd_dhcp_server_new(&link
->dhcp_server
, link
->ifindex
);
2070 r
= sd_dhcp_server_attach_event(link
->dhcp_server
, NULL
, 0);
2075 if (link_dhcp6_enabled(link
)) {
2076 r
= dhcp6_configure(link
);
2081 if (link_ipv6_accept_ra_enabled(link
)) {
2082 r
= ndisc_configure(link
);
2087 if (link_lldp_enabled(link
)) {
2088 r
= sd_lldp_new(link
->ifindex
, link
->ifname
, &link
->mac
, &link
->lldp
);
2092 r
= sd_lldp_attach_event(link
->lldp
, NULL
, 0);
2096 r
= sd_lldp_set_callback(link
->lldp
,
2097 lldp_handler
, link
);
2102 if (link_has_carrier(link
)) {
2103 r
= link_acquire_conf(link
);
2108 return link_enter_join_netdev(link
);
2111 static int link_initialized_and_synced(sd_netlink
*rtnl
, sd_netlink_message
*m
,
2113 _cleanup_link_unref_ Link
*link
= userdata
;
2118 assert(link
->ifname
);
2119 assert(link
->manager
);
2121 if (link
->state
!= LINK_STATE_PENDING
)
2124 log_link_debug(link
, "Link state is up-to-date");
2126 r
= link_new_bound_by_list(link
);
2130 r
= link_handle_bound_by_list(link
);
2134 if (!link
->network
) {
2135 r
= network_get(link
->manager
, link
->udev_device
, link
->ifname
,
2136 &link
->mac
, &network
);
2138 link_enter_unmanaged(link
);
2143 if (link
->flags
& IFF_LOOPBACK
) {
2144 if (network
->link_local
!= ADDRESS_FAMILY_NO
)
2145 log_link_debug(link
, "Ignoring link-local autoconfiguration for loopback link");
2147 if (network
->dhcp
!= ADDRESS_FAMILY_NO
)
2148 log_link_debug(link
, "Ignoring DHCP clients for loopback link");
2150 if (network
->dhcp_server
)
2151 log_link_debug(link
, "Ignoring DHCP server for loopback link");
2154 r
= network_apply(link
->manager
, network
, link
);
2159 r
= link_new_bound_to_list(link
);
2163 r
= link_configure(link
);
2170 int link_initialized(Link
*link
, struct udev_device
*device
) {
2171 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
2175 assert(link
->manager
);
2176 assert(link
->manager
->rtnl
);
2179 if (link
->state
!= LINK_STATE_PENDING
)
2182 if (link
->udev_device
)
2185 log_link_debug(link
, "udev initialized link");
2187 link
->udev_device
= udev_device_ref(device
);
2189 /* udev has initialized the link, but we don't know if we have yet
2190 * processed the NEWLINK messages with the latest state. Do a GETLINK,
2191 * when it returns we know that the pending NEWLINKs have already been
2192 * processed and that we are up-to-date */
2194 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_GETLINK
,
2199 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
,
2200 link_initialized_and_synced
, link
, 0, NULL
);
2209 static int link_load(Link
*link
) {
2210 _cleanup_free_
char *network_file
= NULL
,
2213 *dhcp4_address
= NULL
,
2214 *ipv4ll_address
= NULL
;
2215 union in_addr_union address
;
2216 union in_addr_union route_dst
;
2222 r
= parse_env_file(link
->state_file
, NEWLINE
,
2223 "NETWORK_FILE", &network_file
,
2224 "ADDRESSES", &addresses
,
2226 "DHCP4_ADDRESS", &dhcp4_address
,
2227 "IPV4LL_ADDRESS", &ipv4ll_address
,
2229 if (r
< 0 && r
!= -ENOENT
)
2230 return log_link_error_errno(link
, r
, "Failed to read %s: %m", link
->state_file
);
2237 suffix
= strrchr(network_file
, '.');
2239 log_link_debug(link
, "Failed to get network name from %s", network_file
);
2240 goto network_file_fail
;
2244 r
= network_get_by_name(link
->manager
, basename(network_file
), &network
);
2246 log_link_debug_errno(link
, r
, "Failed to get network %s: %m", basename(network_file
));
2247 goto network_file_fail
;
2250 r
= network_apply(link
->manager
, network
, link
);
2252 return log_link_error_errno(link
, r
, "Failed to apply network %s: %m", basename(network_file
));
2261 _cleanup_free_
char *address_str
= NULL
;
2262 char *prefixlen_str
;
2264 unsigned char prefixlen
;
2266 r
= extract_first_word(&p
, &address_str
, NULL
, 0);
2268 log_link_debug_errno(link
, r
, "Failed to extract next address string: %m");
2273 prefixlen_str
= strchr(address_str
, '/');
2274 if (!prefixlen_str
) {
2275 log_link_debug(link
, "Failed to parse address and prefix length %s", address_str
);
2279 *prefixlen_str
++ = '\0';
2281 r
= sscanf(prefixlen_str
, "%hhu", &prefixlen
);
2283 log_link_error(link
, "Failed to parse prefixlen %s", prefixlen_str
);
2287 r
= in_addr_from_string_auto(address_str
, &family
, &address
);
2289 log_link_debug_errno(link
, r
, "Failed to parse address %s: %m", address_str
);
2293 r
= address_add(link
, family
, &address
, prefixlen
, NULL
);
2295 return log_link_error_errno(link
, r
, "Failed to add address: %m");
2302 _cleanup_free_
char *route_str
= NULL
;
2303 _cleanup_event_source_unref_ sd_event_source
*expire
= NULL
;
2305 char *prefixlen_str
;
2307 unsigned char prefixlen
, tos
, table
;
2310 r
= extract_first_word(&p
, &route_str
, NULL
, 0);
2312 log_link_debug_errno(link
, r
, "Failed to extract next route string: %m");
2317 prefixlen_str
= strchr(route_str
, '/');
2318 if (!prefixlen_str
) {
2319 log_link_debug(link
, "Failed to parse route %s", route_str
);
2323 *prefixlen_str
++ = '\0';
2325 r
= sscanf(prefixlen_str
, "%hhu/%hhu/%"SCNu32
"/%hhu/"USEC_FMT
, &prefixlen
, &tos
, &priority
, &table
, &lifetime
);
2327 log_link_debug(link
,
2328 "Failed to parse destination prefix length, tos, priority, table or expiration %s",
2333 r
= in_addr_from_string_auto(route_str
, &family
, &route_dst
);
2335 log_link_debug_errno(link
, r
, "Failed to parse route destination %s: %m", route_str
);
2339 r
= route_add(link
, family
, &route_dst
, prefixlen
, tos
, priority
, table
, &route
);
2341 return log_link_error_errno(link
, r
, "Failed to add route: %m");
2343 if (lifetime
!= USEC_INFINITY
) {
2344 r
= sd_event_add_time(link
->manager
->event
, &expire
, clock_boottime_or_monotonic(), lifetime
,
2345 0, route_expire_handler
, route
);
2347 log_link_warning_errno(link
, r
, "Could not arm route expiration handler: %m");
2350 route
->lifetime
= lifetime
;
2351 sd_event_source_unref(route
->expire
);
2352 route
->expire
= expire
;
2357 if (dhcp4_address
) {
2358 r
= in_addr_from_string(AF_INET
, dhcp4_address
, &address
);
2360 log_link_debug_errno(link
, r
, "Falied to parse DHCPv4 address %s: %m", dhcp4_address
);
2361 goto dhcp4_address_fail
;
2364 r
= sd_dhcp_client_new(&link
->dhcp_client
);
2366 return log_link_error_errno(link
, r
, "Falied to create DHCPv4 client: %m");
2368 r
= sd_dhcp_client_set_request_address(link
->dhcp_client
, &address
.in
);
2370 return log_link_error_errno(link
, r
, "Falied to set inital DHCPv4 address %s: %m", dhcp4_address
);
2375 if (ipv4ll_address
) {
2376 r
= in_addr_from_string(AF_INET
, ipv4ll_address
, &address
);
2378 log_link_debug_errno(link
, r
, "Falied to parse IPv4LL address %s: %m", ipv4ll_address
);
2379 goto ipv4ll_address_fail
;
2382 r
= sd_ipv4ll_new(&link
->ipv4ll
);
2384 return log_link_error_errno(link
, r
, "Falied to create IPv4LL client: %m");
2386 r
= sd_ipv4ll_set_address(link
->ipv4ll
, &address
.in
);
2388 return log_link_error_errno(link
, r
, "Falied to set inital IPv4LL address %s: %m", ipv4ll_address
);
2391 ipv4ll_address_fail
:
2396 int link_add(Manager
*m
, sd_netlink_message
*message
, Link
**ret
) {
2398 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
2399 char ifindex_str
[2 + DECIMAL_STR_MAX(int)];
2407 r
= link_new(m
, message
, ret
);
2413 log_link_debug(link
, "Link %d added", link
->ifindex
);
2415 r
= link_load(link
);
2419 if (detect_container() <= 0) {
2420 /* not in a container, udev will be around */
2421 sprintf(ifindex_str
, "n%d", link
->ifindex
);
2422 device
= udev_device_new_from_device_id(m
->udev
, ifindex_str
);
2424 r
= log_link_warning_errno(link
, errno
, "Could not find udev device: %m");
2428 if (udev_device_get_is_initialized(device
) <= 0) {
2430 log_link_debug(link
, "link pending udev initialization...");
2434 r
= link_initialized(link
, device
);
2438 /* we are calling a callback directly, so must take a ref */
2441 r
= link_initialized_and_synced(m
->rtnl
, NULL
, link
);
2448 link_enter_failed(link
);
2452 static int link_carrier_gained(Link
*link
) {
2457 if (link
->network
) {
2458 r
= link_acquire_conf(link
);
2460 link_enter_failed(link
);
2465 r
= link_handle_bound_by_list(link
);
2472 static int link_carrier_lost(Link
*link
) {
2477 r
= link_stop_clients(link
);
2479 link_enter_failed(link
);
2483 r
= link_handle_bound_by_list(link
);
2490 int link_carrier_reset(Link
*link
) {
2495 if (link_has_carrier(link
)) {
2496 r
= link_carrier_lost(link
);
2500 r
= link_carrier_gained(link
);
2504 log_link_info(link
, "Reset carrier");
2511 int link_update(Link
*link
, sd_netlink_message
*m
) {
2512 struct ether_addr mac
;
2515 bool had_carrier
, carrier_gained
, carrier_lost
;
2519 assert(link
->ifname
);
2522 if (link
->state
== LINK_STATE_LINGER
) {
2524 log_link_info(link
, "Link readded");
2525 link_set_state(link
, LINK_STATE_ENSLAVING
);
2527 r
= link_new_carrier_maps(link
);
2532 r
= sd_netlink_message_read_string(m
, IFLA_IFNAME
, &ifname
);
2533 if (r
>= 0 && !streq(ifname
, link
->ifname
)) {
2534 log_link_info(link
, "Renamed to %s", ifname
);
2536 link_free_carrier_maps(link
);
2538 r
= free_and_strdup(&link
->ifname
, ifname
);
2542 r
= link_new_carrier_maps(link
);
2547 r
= sd_netlink_message_read_u32(m
, IFLA_MTU
, &mtu
);
2548 if (r
>= 0 && mtu
> 0) {
2550 if (!link
->original_mtu
) {
2551 link
->original_mtu
= mtu
;
2552 log_link_debug(link
, "Saved original MTU: %" PRIu32
, link
->original_mtu
);
2555 if (link
->dhcp_client
) {
2556 r
= sd_dhcp_client_set_mtu(link
->dhcp_client
,
2559 log_link_warning_errno(link
, r
, "Could not update MTU in DHCP client: %m");
2565 /* The kernel may broadcast NEWLINK messages without the MAC address
2566 set, simply ignore them. */
2567 r
= sd_netlink_message_read_ether_addr(m
, IFLA_ADDRESS
, &mac
);
2569 if (memcmp(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2572 memcpy(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2575 log_link_debug(link
, "MAC address: "
2576 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2577 mac
.ether_addr_octet
[0],
2578 mac
.ether_addr_octet
[1],
2579 mac
.ether_addr_octet
[2],
2580 mac
.ether_addr_octet
[3],
2581 mac
.ether_addr_octet
[4],
2582 mac
.ether_addr_octet
[5]);
2585 r
= sd_ipv4ll_set_mac(link
->ipv4ll
, &link
->mac
);
2587 return log_link_warning_errno(link
, r
, "Could not update MAC address in IPv4LL client: %m");
2590 if (link
->dhcp_client
) {
2591 r
= sd_dhcp_client_set_mac(link
->dhcp_client
,
2592 (const uint8_t *) &link
->mac
,
2596 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCP client: %m");
2599 if (link
->dhcp6_client
) {
2600 r
= sd_dhcp6_client_set_mac(link
->dhcp6_client
,
2601 (const uint8_t *) &link
->mac
,
2605 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCPv6 client: %m");
2610 had_carrier
= link_has_carrier(link
);
2612 r
= link_update_flags(link
, m
);
2616 carrier_gained
= !had_carrier
&& link_has_carrier(link
);
2617 carrier_lost
= had_carrier
&& !link_has_carrier(link
);
2619 if (carrier_gained
) {
2620 log_link_info(link
, "Gained carrier");
2622 r
= link_carrier_gained(link
);
2625 } else if (carrier_lost
) {
2626 log_link_info(link
, "Lost carrier");
2628 r
= link_carrier_lost(link
);
2637 int link_save(Link
*link
) {
2638 _cleanup_free_
char *temp_path
= NULL
;
2639 _cleanup_fclose_
FILE *f
= NULL
;
2640 const char *admin_state
, *oper_state
;
2647 assert(link
->state_file
);
2648 assert(link
->lease_file
);
2649 assert(link
->manager
);
2651 if (link
->state
== LINK_STATE_LINGER
) {
2652 unlink(link
->state_file
);
2656 admin_state
= link_state_to_string(link
->state
);
2657 assert(admin_state
);
2659 oper_state
= link_operstate_to_string(link
->operstate
);
2662 r
= fopen_temporary(link
->state_file
, &f
, &temp_path
);
2666 fchmod(fileno(f
), 0644);
2669 "# This is private data. Do not parse.\n"
2672 admin_state
, oper_state
);
2674 if (link
->network
) {
2675 char **address
, **domain
;
2677 sd_dhcp6_lease
*dhcp6_lease
= NULL
;
2679 if (link
->dhcp6_client
) {
2680 r
= sd_dhcp6_client_get_lease(link
->dhcp6_client
,
2683 log_link_debug(link
, "No DHCPv6 lease");
2686 fprintf(f
, "NETWORK_FILE=%s\n", link
->network
->filename
);
2690 STRV_FOREACH(address
, link
->network
->dns
) {
2697 if (link
->network
->dhcp_dns
&&
2699 const struct in_addr
*addresses
;
2701 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
2705 serialize_in_addrs(f
, addresses
, r
);
2710 if (link
->network
->dhcp_dns
&& dhcp6_lease
) {
2711 struct in6_addr
*in6_addrs
;
2713 r
= sd_dhcp6_lease_get_dns(dhcp6_lease
, &in6_addrs
);
2717 serialize_in6_addrs(f
, in6_addrs
, r
);
2725 STRV_FOREACH(address
, link
->network
->ntp
) {
2732 if (link
->network
->dhcp_ntp
&&
2734 const struct in_addr
*addresses
;
2736 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
2740 serialize_in_addrs(f
, addresses
, r
);
2745 if (link
->network
->dhcp_ntp
&& dhcp6_lease
) {
2746 struct in6_addr
*in6_addrs
;
2750 r
= sd_dhcp6_lease_get_ntp_addrs(dhcp6_lease
,
2755 serialize_in6_addrs(f
, in6_addrs
, r
);
2759 r
= sd_dhcp6_lease_get_ntp_fqdn(dhcp6_lease
, &hosts
);
2761 STRV_FOREACH(hostname
, hosts
) {
2764 fputs(*hostname
, f
);
2772 fputs("DOMAINS=", f
);
2774 STRV_FOREACH(domain
, link
->network
->domains
) {
2781 if (link
->network
->dhcp_domains
&&
2783 const char *domainname
;
2785 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
2789 fputs(domainname
, f
);
2794 if (link
->network
->dhcp_domains
&& dhcp6_lease
) {
2797 r
= sd_dhcp6_lease_get_domains(dhcp6_lease
, &domains
);
2799 STRV_FOREACH(domain
, domains
) {
2810 fprintf(f
, "WILDCARD_DOMAIN=%s\n",
2811 yes_no(link
->network
->wildcard_domain
));
2813 fprintf(f
, "LLMNR=%s\n",
2814 resolve_support_to_string(link
->network
->llmnr
));
2816 fputs("ADDRESSES=", f
);
2818 SET_FOREACH(a
, link
->addresses
, i
) {
2819 _cleanup_free_
char *address_str
= NULL
;
2821 r
= in_addr_to_string(a
->family
, &a
->in_addr
, &address_str
);
2825 fprintf(f
, "%s%s/%u", space
? " " : "", address_str
, a
->prefixlen
);
2831 fputs("ROUTES=", f
);
2833 SET_FOREACH(route
, link
->routes
, i
) {
2834 _cleanup_free_
char *route_str
= NULL
;
2836 r
= in_addr_to_string(route
->family
, &route
->dst
, &route_str
);
2840 fprintf(f
, "%s%s/%hhu/%hhu/%"PRIu32
"/%hhu/"USEC_FMT
, space
? " " : "", route_str
,
2841 route
->dst_prefixlen
, route
->tos
, route
->priority
, route
->table
, route
->lifetime
);
2848 if (!hashmap_isempty(link
->bound_to_links
)) {
2852 fputs("CARRIER_BOUND_TO=", f
);
2853 HASHMAP_FOREACH(carrier
, link
->bound_to_links
, i
) {
2856 fputs(carrier
->ifname
, f
);
2863 if (!hashmap_isempty(link
->bound_by_links
)) {
2867 fputs("CARRIER_BOUND_BY=", f
);
2868 HASHMAP_FOREACH(carrier
, link
->bound_by_links
, i
) {
2871 fputs(carrier
->ifname
, f
);
2878 if (link
->dhcp_lease
) {
2879 struct in_addr address
;
2880 const char *tz
= NULL
;
2882 assert(link
->network
);
2884 r
= sd_dhcp_lease_get_timezone(link
->dhcp_lease
, &tz
);
2886 fprintf(f
, "TIMEZONE=%s\n", tz
);
2888 r
= sd_dhcp_lease_get_address(link
->dhcp_lease
, &address
);
2890 fputs("DHCP4_ADDRESS=", f
);
2891 serialize_in_addrs(f
, &address
, 1);
2895 r
= dhcp_lease_save(link
->dhcp_lease
, link
->lease_file
);
2903 unlink(link
->lease_file
);
2906 struct in_addr address
;
2908 r
= sd_ipv4ll_get_address(link
->ipv4ll
, &address
);
2910 fputs("IPV4LL_ADDRESS=", f
);
2911 serialize_in_addrs(f
, &address
, 1);
2917 assert(link
->network
);
2919 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
2927 unlink(link
->lldp_file
);
2929 r
= fflush_and_check(f
);
2933 if (rename(temp_path
, link
->state_file
) < 0) {
2941 (void) unlink(link
->state_file
);
2943 (void) unlink(temp_path
);
2945 return log_link_error_errno(link
, r
, "Failed to save link data to %s: %m", link
->state_file
);
2948 /* The serialized state in /run is no longer up-to-date. */
2949 void link_dirty(Link
*link
) {
2954 r
= set_ensure_allocated(&link
->manager
->dirty_links
, NULL
);
2956 /* allocation errors are ignored */
2959 r
= set_put(link
->manager
->dirty_links
, link
);
2961 /* allocation errors are ignored */
2967 /* The serialized state in /run is up-to-date */
2968 void link_clean(Link
*link
) {
2970 assert(link
->manager
);
2972 set_remove(link
->manager
->dirty_links
, link
);
2976 static const char* const link_state_table
[_LINK_STATE_MAX
] = {
2977 [LINK_STATE_PENDING
] = "pending",
2978 [LINK_STATE_ENSLAVING
] = "configuring",
2979 [LINK_STATE_SETTING_ADDRESSES
] = "configuring",
2980 [LINK_STATE_SETTING_ROUTES
] = "configuring",
2981 [LINK_STATE_CONFIGURED
] = "configured",
2982 [LINK_STATE_UNMANAGED
] = "unmanaged",
2983 [LINK_STATE_FAILED
] = "failed",
2984 [LINK_STATE_LINGER
] = "linger",
2987 DEFINE_STRING_TABLE_LOOKUP(link_state
, LinkState
);
2989 static const char* const link_operstate_table
[_LINK_OPERSTATE_MAX
] = {
2990 [LINK_OPERSTATE_OFF
] = "off",
2991 [LINK_OPERSTATE_NO_CARRIER
] = "no-carrier",
2992 [LINK_OPERSTATE_DORMANT
] = "dormant",
2993 [LINK_OPERSTATE_CARRIER
] = "carrier",
2994 [LINK_OPERSTATE_DEGRADED
] = "degraded",
2995 [LINK_OPERSTATE_ROUTABLE
] = "routable",
2998 DEFINE_STRING_TABLE_LOOKUP(link_operstate
, LinkOperationalState
);