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
) {
151 if (!socket_ipv6_is_supported())
152 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
154 if (link
->flags
& IFF_LOOPBACK
)
155 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
158 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
160 return link
->network
->ipv6_privacy_extensions
;
163 void link_update_operstate(Link
*link
) {
164 LinkOperationalState operstate
;
167 if (link
->kernel_operstate
== IF_OPER_DORMANT
)
168 operstate
= LINK_OPERSTATE_DORMANT
;
169 else if (link_has_carrier(link
)) {
171 uint8_t scope
= RT_SCOPE_NOWHERE
;
174 /* if we have carrier, check what addresses we have */
175 SET_FOREACH(address
, link
->addresses
, i
) {
176 if (!address_is_ready(address
))
179 if (address
->scope
< scope
)
180 scope
= address
->scope
;
183 /* for operstate we also take foreign addresses into account */
184 SET_FOREACH(address
, link
->addresses_foreign
, i
) {
185 if (!address_is_ready(address
))
188 if (address
->scope
< scope
)
189 scope
= address
->scope
;
192 if (scope
< RT_SCOPE_SITE
)
193 /* universally accessible addresses found */
194 operstate
= LINK_OPERSTATE_ROUTABLE
;
195 else if (scope
< RT_SCOPE_HOST
)
196 /* only link or site local addresses found */
197 operstate
= LINK_OPERSTATE_DEGRADED
;
199 /* no useful addresses found */
200 operstate
= LINK_OPERSTATE_CARRIER
;
201 } else if (link
->flags
& IFF_UP
)
202 operstate
= LINK_OPERSTATE_NO_CARRIER
;
204 operstate
= LINK_OPERSTATE_OFF
;
206 if (link
->operstate
!= operstate
) {
207 link
->operstate
= operstate
;
208 link_send_changed(link
, "OperationalState", NULL
);
210 manager_dirty(link
->manager
);
214 #define FLAG_STRING(string, flag, old, new) \
215 (((old ^ new) & flag) \
216 ? ((old & flag) ? (" -" string) : (" +" string)) \
219 static int link_update_flags(Link
*link
, sd_netlink_message
*m
) {
220 unsigned flags
, unknown_flags_added
, unknown_flags_removed
, unknown_flags
;
226 r
= sd_rtnl_message_link_get_flags(m
, &flags
);
228 return log_link_warning_errno(link
, r
, "Could not get link flags: %m");
230 r
= sd_netlink_message_read_u8(m
, IFLA_OPERSTATE
, &operstate
);
232 /* if we got a message without operstate, take it to mean
233 the state was unchanged */
234 operstate
= link
->kernel_operstate
;
236 if ((link
->flags
== flags
) && (link
->kernel_operstate
== operstate
))
239 if (link
->flags
!= flags
) {
240 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",
241 FLAG_STRING("LOOPBACK", IFF_LOOPBACK
, link
->flags
, flags
),
242 FLAG_STRING("MASTER", IFF_MASTER
, link
->flags
, flags
),
243 FLAG_STRING("SLAVE", IFF_SLAVE
, link
->flags
, flags
),
244 FLAG_STRING("UP", IFF_UP
, link
->flags
, flags
),
245 FLAG_STRING("DORMANT", IFF_DORMANT
, link
->flags
, flags
),
246 FLAG_STRING("LOWER_UP", IFF_LOWER_UP
, link
->flags
, flags
),
247 FLAG_STRING("RUNNING", IFF_RUNNING
, link
->flags
, flags
),
248 FLAG_STRING("MULTICAST", IFF_MULTICAST
, link
->flags
, flags
),
249 FLAG_STRING("BROADCAST", IFF_BROADCAST
, link
->flags
, flags
),
250 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT
, link
->flags
, flags
),
251 FLAG_STRING("PROMISC", IFF_PROMISC
, link
->flags
, flags
),
252 FLAG_STRING("ALLMULTI", IFF_ALLMULTI
, link
->flags
, flags
),
253 FLAG_STRING("PORTSEL", IFF_PORTSEL
, link
->flags
, flags
),
254 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA
, link
->flags
, flags
),
255 FLAG_STRING("DYNAMIC", IFF_DYNAMIC
, link
->flags
, flags
),
256 FLAG_STRING("NOARP", IFF_NOARP
, link
->flags
, flags
),
257 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS
, link
->flags
, flags
),
258 FLAG_STRING("DEBUG", IFF_DEBUG
, link
->flags
, flags
),
259 FLAG_STRING("ECHO", IFF_ECHO
, link
->flags
, flags
));
261 unknown_flags
= ~(IFF_LOOPBACK
| IFF_MASTER
| IFF_SLAVE
| IFF_UP
|
262 IFF_DORMANT
| IFF_LOWER_UP
| IFF_RUNNING
|
263 IFF_MULTICAST
| IFF_BROADCAST
| IFF_POINTOPOINT
|
264 IFF_PROMISC
| IFF_ALLMULTI
| IFF_PORTSEL
|
265 IFF_AUTOMEDIA
| IFF_DYNAMIC
| IFF_NOARP
|
266 IFF_NOTRAILERS
| IFF_DEBUG
| IFF_ECHO
);
267 unknown_flags_added
= ((link
->flags
^ flags
) & flags
& unknown_flags
);
268 unknown_flags_removed
= ((link
->flags
^ flags
) & link
->flags
& unknown_flags
);
270 /* link flags are currently at most 18 bits, let's align to
272 if (unknown_flags_added
)
274 "Unknown link flags gained: %#.5x (ignoring)",
275 unknown_flags_added
);
277 if (unknown_flags_removed
)
279 "Unknown link flags lost: %#.5x (ignoring)",
280 unknown_flags_removed
);
284 link
->kernel_operstate
= operstate
;
286 link_update_operstate(link
);
291 static int link_new(Manager
*manager
, sd_netlink_message
*message
, Link
**ret
) {
292 _cleanup_link_unref_ Link
*link
= NULL
;
301 r
= sd_netlink_message_get_type(message
, &type
);
304 else if (type
!= RTM_NEWLINK
)
307 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
310 else if (ifindex
<= 0)
313 r
= sd_netlink_message_read_string(message
, IFLA_IFNAME
, &ifname
);
317 link
= new0(Link
, 1);
322 link
->manager
= manager
;
323 link
->state
= LINK_STATE_PENDING
;
324 link
->rtnl_extended_attrs
= true;
325 link
->ifindex
= ifindex
;
326 link
->ifname
= strdup(ifname
);
330 r
= sd_netlink_message_read_ether_addr(message
, IFLA_ADDRESS
, &link
->mac
);
332 log_link_debug(link
, "MAC address not found for new device, continuing without");
334 r
= asprintf(&link
->state_file
, "/run/systemd/netif/links/%d",
339 r
= asprintf(&link
->lease_file
, "/run/systemd/netif/leases/%d",
344 r
= asprintf(&link
->lldp_file
, "/run/systemd/netif/lldp/%d",
350 r
= hashmap_ensure_allocated(&manager
->links
, NULL
);
354 r
= hashmap_put(manager
->links
, INT_TO_PTR(link
->ifindex
), link
);
358 r
= link_update_flags(link
, message
);
368 static void link_free(Link
*link
) {
376 while (!set_isempty(link
->addresses
))
377 address_free(set_first(link
->addresses
));
379 while (!set_isempty(link
->addresses_foreign
))
380 address_free(set_first(link
->addresses_foreign
));
382 link
->addresses
= set_free(link
->addresses
);
384 link
->addresses_foreign
= set_free(link
->addresses_foreign
);
386 while ((address
= link
->pool_addresses
)) {
387 LIST_REMOVE(addresses
, link
->pool_addresses
, address
);
388 address_free(address
);
391 sd_dhcp_server_unref(link
->dhcp_server
);
392 sd_dhcp_client_unref(link
->dhcp_client
);
393 sd_dhcp_lease_unref(link
->dhcp_lease
);
395 free(link
->lease_file
);
397 sd_lldp_free(link
->lldp
);
399 free(link
->lldp_file
);
401 sd_ipv4ll_unref(link
->ipv4ll
);
402 sd_dhcp6_client_unref(link
->dhcp6_client
);
403 sd_ndisc_unref(link
->ndisc_router_discovery
);
406 hashmap_remove(link
->manager
->links
, INT_TO_PTR(link
->ifindex
));
410 (void)unlink(link
->state_file
);
411 free(link
->state_file
);
413 udev_device_unref(link
->udev_device
);
415 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
)
416 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(carrier
->ifindex
));
417 hashmap_free(link
->bound_to_links
);
419 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
)
420 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(carrier
->ifindex
));
421 hashmap_free(link
->bound_by_links
);
426 Link
*link_unref(Link
*link
) {
430 assert(link
->n_ref
> 0);
442 Link
*link_ref(Link
*link
) {
446 assert(link
->n_ref
> 0);
453 int link_get(Manager
*m
, int ifindex
, Link
**ret
) {
460 link
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
469 static void link_set_state(Link
*link
, LinkState state
) {
472 if (link
->state
== state
)
477 link_send_changed(link
, "AdministrativeState", NULL
);
482 static void link_enter_unmanaged(Link
*link
) {
485 log_link_debug(link
, "Unmanaged");
487 link_set_state(link
, LINK_STATE_UNMANAGED
);
492 static int link_stop_clients(Link
*link
) {
496 assert(link
->manager
);
497 assert(link
->manager
->event
);
502 if (link
->dhcp_client
) {
503 k
= sd_dhcp_client_stop(link
->dhcp_client
);
505 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv4 client: %m");
509 k
= sd_ipv4ll_stop(link
->ipv4ll
);
511 r
= log_link_warning_errno(link
, r
, "Could not stop IPv4 link-local: %m");
514 if (link
->dhcp6_client
) {
515 k
= sd_dhcp6_client_stop(link
->dhcp6_client
);
517 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv6 client: %m");
520 if (link
->ndisc_router_discovery
) {
521 k
= sd_ndisc_stop(link
->ndisc_router_discovery
);
523 r
= log_link_warning_errno(link
, r
, "Could not stop IPv6 Router Discovery: %m");
527 k
= sd_lldp_stop(link
->lldp
);
529 r
= log_link_warning_errno(link
, r
, "Could not stop LLDP: %m");
535 void link_enter_failed(Link
*link
) {
538 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
541 log_link_warning(link
, "Failed");
543 link_set_state(link
, LINK_STATE_FAILED
);
545 link_stop_clients(link
);
550 static Address
* link_find_dhcp_server_address(Link
*link
) {
554 assert(link
->network
);
556 /* The first statically configured address if there is any */
557 LIST_FOREACH(addresses
, address
, link
->network
->static_addresses
) {
559 if (address
->family
!= AF_INET
)
562 if (in_addr_is_null(address
->family
, &address
->in_addr
))
568 /* If that didn't work, find a suitable address we got from the pool */
569 LIST_FOREACH(addresses
, address
, link
->pool_addresses
) {
570 if (address
->family
!= AF_INET
)
579 static int link_enter_configured(Link
*link
) {
581 assert(link
->network
);
582 assert(link
->state
== LINK_STATE_SETTING_ROUTES
);
584 log_link_info(link
, "Configured");
586 link_set_state(link
, LINK_STATE_CONFIGURED
);
593 void link_check_ready(Link
*link
) {
602 if (!link
->static_configured
)
605 if (link_ipv4ll_enabled(link
))
606 if (!link
->ipv4ll_address
||
610 if (link_ipv6ll_enabled(link
))
611 if (!link
->ipv6ll_address
)
614 if ((link_dhcp4_enabled(link
) && !link_dhcp6_enabled(link
) &&
615 !link
->dhcp4_configured
) ||
616 (link_dhcp6_enabled(link
) && !link_dhcp4_enabled(link
) &&
617 !link
->dhcp6_configured
) ||
618 (link_dhcp4_enabled(link
) && link_dhcp6_enabled(link
) &&
619 !link
->dhcp4_configured
&& !link
->dhcp6_configured
))
622 if (link_ipv6_accept_ra_enabled(link
) && !link
->ndisc_configured
)
625 SET_FOREACH(a
, link
->addresses
, i
)
626 if (!address_is_ready(a
))
629 if (link
->state
!= LINK_STATE_CONFIGURED
)
630 link_enter_configured(link
);
635 static int route_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
636 _cleanup_link_unref_ Link
*link
= userdata
;
639 assert(link
->link_messages
> 0);
640 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
641 LINK_STATE_SETTING_ROUTES
, LINK_STATE_FAILED
,
644 link
->link_messages
--;
646 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
649 r
= sd_netlink_message_get_errno(m
);
650 if (r
< 0 && r
!= -EEXIST
)
651 log_link_warning_errno(link
, r
, "Could not set route: %m");
653 if (link
->link_messages
== 0) {
654 log_link_debug(link
, "Routes set");
655 link
->static_configured
= true;
656 link_check_ready(link
);
662 static int link_enter_set_routes(Link
*link
) {
667 assert(link
->network
);
668 assert(link
->state
== LINK_STATE_SETTING_ADDRESSES
);
670 link_set_state(link
, LINK_STATE_SETTING_ROUTES
);
672 LIST_FOREACH(routes
, rt
, link
->network
->static_routes
) {
673 r
= route_configure(rt
, link
, &route_handler
);
675 log_link_warning_errno(link
, r
, "Could not set routes: %m");
676 link_enter_failed(link
);
680 link
->link_messages
++;
683 if (link
->link_messages
== 0) {
684 link
->static_configured
= true;
685 link_check_ready(link
);
687 log_link_debug(link
, "Setting routes");
692 int link_route_remove_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
693 _cleanup_link_unref_ Link
*link
= userdata
;
698 assert(link
->ifname
);
700 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
703 r
= sd_netlink_message_get_errno(m
);
704 if (r
< 0 && r
!= -ESRCH
)
705 log_link_warning_errno(link
, r
, "Could not drop route: %m");
710 static int address_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
711 _cleanup_link_unref_ Link
*link
= userdata
;
717 assert(link
->ifname
);
718 assert(link
->link_messages
> 0);
719 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
720 LINK_STATE_FAILED
, LINK_STATE_LINGER
));
722 link
->link_messages
--;
724 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
727 r
= sd_netlink_message_get_errno(m
);
728 if (r
< 0 && r
!= -EEXIST
)
729 log_link_warning_errno(link
, r
, "could not set address: %m");
731 manager_rtnl_process_address(rtnl
, m
, link
->manager
);
733 if (link
->link_messages
== 0) {
734 log_link_debug(link
, "Addresses set");
735 link_enter_set_routes(link
);
741 static int link_push_dns_to_dhcp_server(Link
*link
, sd_dhcp_server
*s
) {
742 _cleanup_free_
struct in_addr
*addresses
= NULL
;
743 size_t n_addresses
= 0, n_allocated
= 0;
746 log_debug("Copying DNS server information from %s", link
->ifname
);
751 STRV_FOREACH(a
, link
->network
->dns
) {
754 /* Only look for IPv4 addresses */
755 if (inet_pton(AF_INET
, *a
, &ia
) <= 0)
758 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ 1))
761 addresses
[n_addresses
++] = ia
;
764 if (link
->network
->dhcp_dns
&&
766 const struct in_addr
*da
= NULL
;
769 n
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &da
);
772 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ n
))
775 memcpy(addresses
+ n_addresses
, da
, n
* sizeof(struct in_addr
));
780 if (n_addresses
<= 0)
783 return sd_dhcp_server_set_dns(s
, addresses
, n_addresses
);
786 static int link_push_ntp_to_dhcp_server(Link
*link
, sd_dhcp_server
*s
) {
787 _cleanup_free_
struct in_addr
*addresses
= NULL
;
788 size_t n_addresses
= 0, n_allocated
= 0;
794 log_debug("Copying NTP server information from %s", link
->ifname
);
796 STRV_FOREACH(a
, link
->network
->ntp
) {
799 /* Only look for IPv4 addresses */
800 if (inet_pton(AF_INET
, *a
, &ia
) <= 0)
803 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ 1))
806 addresses
[n_addresses
++] = ia
;
809 if (link
->network
->dhcp_ntp
&&
811 const struct in_addr
*da
= NULL
;
814 n
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &da
);
817 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ n
))
820 memcpy(addresses
+ n_addresses
, da
, n
* sizeof(struct in_addr
));
825 if (n_addresses
<= 0)
828 return sd_dhcp_server_set_ntp(s
, addresses
, n_addresses
);
831 static int link_enter_set_addresses(Link
*link
) {
836 assert(link
->network
);
837 assert(link
->state
!= _LINK_STATE_INVALID
);
839 link_set_state(link
, LINK_STATE_SETTING_ADDRESSES
);
841 LIST_FOREACH(addresses
, ad
, link
->network
->static_addresses
) {
842 r
= address_configure(ad
, link
, &address_handler
, false);
844 log_link_warning_errno(link
, r
, "Could not set addresses: %m");
845 link_enter_failed(link
);
849 link
->link_messages
++;
852 /* now that we can figure out a default address for the dhcp server,
854 if (link_dhcp4_server_enabled(link
)) {
857 bool acquired_uplink
= false;
859 address
= link_find_dhcp_server_address(link
);
861 log_link_warning(link
, "Failed to find suitable address for DHCPv4 server instance.");
862 link_enter_failed(link
);
866 /* use the server address' subnet as the pool */
867 r
= sd_dhcp_server_configure_pool(link
->dhcp_server
, &address
->in_addr
.in
, address
->prefixlen
,
868 link
->network
->dhcp_server_pool_offset
, link
->network
->dhcp_server_pool_size
);
873 r = sd_dhcp_server_set_router(link->dhcp_server,
874 &main_address->in_addr.in);
879 if (link
->network
->dhcp_server_max_lease_time_usec
> 0) {
880 r
= sd_dhcp_server_set_max_lease_time(
882 DIV_ROUND_UP(link
->network
->dhcp_server_max_lease_time_usec
, USEC_PER_SEC
));
887 if (link
->network
->dhcp_server_default_lease_time_usec
> 0) {
888 r
= sd_dhcp_server_set_default_lease_time(
890 DIV_ROUND_UP(link
->network
->dhcp_server_default_lease_time_usec
, USEC_PER_SEC
));
895 if (link
->network
->dhcp_server_emit_dns
) {
897 if (link
->network
->n_dhcp_server_dns
> 0)
898 r
= sd_dhcp_server_set_dns(link
->dhcp_server
, link
->network
->dhcp_server_dns
, link
->network
->n_dhcp_server_dns
);
900 uplink
= manager_find_uplink(link
->manager
, link
);
901 acquired_uplink
= true;
904 log_link_debug(link
, "Not emitting DNS server information on link, couldn't find suitable uplink.");
907 r
= link_push_dns_to_dhcp_server(uplink
, link
->dhcp_server
);
910 log_link_warning_errno(link
, r
, "Failed to set DNS server for DHCP server, ignoring: %m");
914 if (link
->network
->dhcp_server_emit_ntp
) {
916 if (link
->network
->n_dhcp_server_ntp
> 0)
917 r
= sd_dhcp_server_set_ntp(link
->dhcp_server
, link
->network
->dhcp_server_ntp
, link
->network
->n_dhcp_server_ntp
);
919 if (!acquired_uplink
)
920 uplink
= manager_find_uplink(link
->manager
, link
);
923 log_link_debug(link
, "Not emitting NTP server information on link, couldn't find suitable uplink.");
926 r
= link_push_ntp_to_dhcp_server(uplink
, link
->dhcp_server
);
930 log_link_warning_errno(link
, r
, "Failed to set NTP server for DHCP server, ignoring: %m");
933 if (link
->network
->dhcp_server_emit_timezone
) {
934 _cleanup_free_
char *buffer
= NULL
;
935 const char *tz
= NULL
;
937 if (link
->network
->dhcp_server_timezone
)
938 tz
= link
->network
->dhcp_server_timezone
;
940 r
= get_timezone(&buffer
);
942 log_warning_errno(r
, "Failed to determine timezone: %m");
948 r
= sd_dhcp_server_set_timezone(link
->dhcp_server
, tz
);
954 r
= sd_dhcp_server_start(link
->dhcp_server
);
956 log_link_warning_errno(link
, r
, "Could not start DHCPv4 server instance: %m");
958 link_enter_failed(link
);
963 log_link_debug(link
, "Offering DHCPv4 leases");
966 if (link
->link_messages
== 0)
967 link_enter_set_routes(link
);
969 log_link_debug(link
, "Setting addresses");
974 int link_address_remove_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
975 _cleanup_link_unref_ Link
*link
= userdata
;
980 assert(link
->ifname
);
982 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
985 r
= sd_netlink_message_get_errno(m
);
986 if (r
< 0 && r
!= -EADDRNOTAVAIL
)
987 log_link_warning_errno(link
, r
, "Could not drop address: %m");
992 static int link_set_bridge_fdb(Link
*const link
) {
996 LIST_FOREACH(static_fdb_entries
, fdb_entry
, link
->network
->static_fdb_entries
) {
997 r
= fdb_entry_configure(link
, fdb_entry
);
999 log_link_error_errno(link
, r
, "Failed to add MAC entry to static MAC table: %m");
1007 static int link_set_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1008 _cleanup_link_unref_ Link
*link
= userdata
;
1011 log_link_debug(link
, "Set link");
1013 r
= sd_netlink_message_get_errno(m
);
1014 if (r
< 0 && r
!= -EEXIST
) {
1015 log_link_error_errno(link
, r
, "Could not join netdev: %m");
1016 link_enter_failed(link
);
1023 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1024 _cleanup_link_unref_ Link
*link
= userdata
;
1025 const sd_bus_error
*e
;
1030 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1033 e
= sd_bus_message_get_error(m
);
1035 log_link_warning_errno(link
, sd_bus_error_get_errno(e
), "Could not set hostname: %s", e
->message
);
1040 int link_set_hostname(Link
*link
, const char *hostname
) {
1044 assert(link
->manager
);
1046 log_link_debug(link
, "Setting transient hostname: '%s'", strna(hostname
));
1048 if (!link
->manager
->bus
) {
1049 /* TODO: replace by assert when we can rely on kdbus */
1050 log_link_info(link
, "Not connected to system bus, ignoring transient hostname.");
1054 r
= sd_bus_call_method_async(
1057 "org.freedesktop.hostname1",
1058 "/org/freedesktop/hostname1",
1059 "org.freedesktop.hostname1",
1061 set_hostname_handler
,
1068 return log_link_error_errno(link
, r
, "Could not set transient hostname: %m");
1075 static int set_timezone_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1076 _cleanup_link_unref_ Link
*link
= userdata
;
1077 const sd_bus_error
*e
;
1082 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1085 e
= sd_bus_message_get_error(m
);
1087 log_link_warning_errno(link
, sd_bus_error_get_errno(e
), "Could not set timezone: %s", e
->message
);
1092 int link_set_timezone(Link
*link
, const char *tz
) {
1096 assert(link
->manager
);
1099 log_link_debug(link
, "Setting system timezone: '%s'", tz
);
1101 if (!link
->manager
->bus
) {
1102 log_link_info(link
, "Not connected to system bus, ignoring timezone.");
1106 r
= sd_bus_call_method_async(
1109 "org.freedesktop.timedate1",
1110 "/org/freedesktop/timedate1",
1111 "org.freedesktop.timedate1",
1113 set_timezone_handler
,
1119 return log_link_error_errno(link
, r
, "Could not set timezone: %m");
1126 static int set_mtu_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1127 _cleanup_link_unref_ Link
*link
= userdata
;
1132 assert(link
->ifname
);
1134 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1137 r
= sd_netlink_message_get_errno(m
);
1139 log_link_warning_errno(link
, r
, "Could not set MTU: %m");
1144 int link_set_mtu(Link
*link
, uint32_t mtu
) {
1145 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1149 assert(link
->manager
);
1150 assert(link
->manager
->rtnl
);
1152 log_link_debug(link
, "Setting MTU: %" PRIu32
, mtu
);
1154 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1156 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1158 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, mtu
);
1160 return log_link_error_errno(link
, r
, "Could not append MTU: %m");
1162 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, set_mtu_handler
, link
, 0, NULL
);
1164 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1171 static int link_set_bridge(Link
*link
) {
1172 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1176 assert(link
->network
);
1178 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1180 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1182 r
= sd_rtnl_message_link_set_family(req
, PF_BRIDGE
);
1184 return log_link_error_errno(link
, r
, "Could not set message family: %m");
1186 r
= sd_netlink_message_open_container(req
, IFLA_PROTINFO
);
1188 return log_link_error_errno(link
, r
, "Could not append IFLA_PROTINFO attribute: %m");
1190 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_GUARD
, !link
->network
->use_bpdu
);
1192 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_GUARD attribute: %m");
1194 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_MODE
, link
->network
->hairpin
);
1196 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_MODE attribute: %m");
1198 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_FAST_LEAVE
, link
->network
->fast_leave
);
1200 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_FAST_LEAVE attribute: %m");
1202 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_PROTECT
, !link
->network
->allow_port_to_be_root
);
1204 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_PROTECT attribute: %m");
1206 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_UNICAST_FLOOD
, link
->network
->unicast_flood
);
1208 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_UNICAST_FLOOD attribute: %m");
1210 if(link
->network
->cost
!= 0) {
1211 r
= sd_netlink_message_append_u32(req
, IFLA_BRPORT_COST
, link
->network
->cost
);
1213 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_COST attribute: %m");
1216 r
= sd_netlink_message_close_container(req
);
1218 return log_link_error_errno(link
, r
, "Could not append IFLA_LINKINFO attribute: %m");
1220 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_set_handler
, link
, 0, NULL
);
1222 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1229 static void lldp_handler(sd_lldp
*lldp
, int event
, void *userdata
) {
1230 Link
*link
= userdata
;
1234 assert(link
->network
);
1235 assert(link
->manager
);
1238 case SD_LLDP_EVENT_UPDATE_INFO
:
1239 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
1241 log_link_warning_errno(link
, r
, "Could not save LLDP: %m");
1249 static int link_acquire_ipv6_conf(Link
*link
) {
1254 if (link_dhcp6_enabled(link
)) {
1255 assert(link
->dhcp6_client
);
1257 log_link_debug(link
, "Acquiring DHCPv6 lease");
1259 r
= sd_dhcp6_client_start(link
->dhcp6_client
);
1261 return log_link_warning_errno(link
, r
, "Could not acquire DHCPv6 lease: %m");
1264 if (link_ipv6_accept_ra_enabled(link
)) {
1265 assert(link
->ndisc_router_discovery
);
1267 log_link_debug(link
, "Discovering IPv6 routers");
1269 r
= sd_ndisc_router_discovery_start(link
->ndisc_router_discovery
);
1271 return log_link_warning_errno(link
, r
, "Could not start IPv6 Router Discovery: %m");
1277 static int link_acquire_conf(Link
*link
) {
1281 assert(link
->network
);
1282 assert(link
->manager
);
1283 assert(link
->manager
->event
);
1285 if (link_ipv4ll_enabled(link
)) {
1286 assert(link
->ipv4ll
);
1288 log_link_debug(link
, "Acquiring IPv4 link-local address");
1290 r
= sd_ipv4ll_start(link
->ipv4ll
);
1292 return log_link_warning_errno(link
, r
, "Could not acquire IPv4 link-local address: %m");
1295 if (link_dhcp4_enabled(link
)) {
1296 assert(link
->dhcp_client
);
1298 log_link_debug(link
, "Acquiring DHCPv4 lease");
1300 r
= sd_dhcp_client_start(link
->dhcp_client
);
1302 return log_link_warning_errno(link
, r
, "Could not acquire DHCPv4 lease: %m");
1305 if (link_lldp_enabled(link
)) {
1308 log_link_debug(link
, "Starting LLDP");
1310 r
= sd_lldp_start(link
->lldp
);
1312 return log_link_warning_errno(link
, r
, "Could not start LLDP: %m");
1318 bool link_has_carrier(Link
*link
) {
1319 /* see Documentation/networking/operstates.txt in the kernel sources */
1321 if (link
->kernel_operstate
== IF_OPER_UP
)
1324 if (link
->kernel_operstate
== IF_OPER_UNKNOWN
)
1325 /* operstate may not be implemented, so fall back to flags */
1326 if ((link
->flags
& IFF_LOWER_UP
) && !(link
->flags
& IFF_DORMANT
))
1332 static int link_up_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1333 _cleanup_link_unref_ Link
*link
= userdata
;
1338 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1341 r
= sd_netlink_message_get_errno(m
);
1343 /* we warn but don't fail the link, as it may be
1345 log_link_warning_errno(link
, r
, "Could not bring up interface: %m");
1350 static int link_up(Link
*link
) {
1351 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1352 uint8_t ipv6ll_mode
;
1356 assert(link
->network
);
1357 assert(link
->manager
);
1358 assert(link
->manager
->rtnl
);
1360 log_link_debug(link
, "Bringing link up");
1362 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1364 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1366 r
= sd_rtnl_message_link_set_flags(req
, IFF_UP
, IFF_UP
);
1368 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1370 if (link
->network
->mac
) {
1371 r
= sd_netlink_message_append_ether_addr(req
, IFLA_ADDRESS
, link
->network
->mac
);
1373 return log_link_error_errno(link
, r
, "Could not set MAC address: %m");
1376 if (link
->network
->mtu
) {
1377 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, link
->network
->mtu
);
1379 return log_link_error_errno(link
, r
, "Could not set MTU: %m");
1382 r
= sd_netlink_message_open_container(req
, IFLA_AF_SPEC
);
1384 return log_link_error_errno(link
, r
, "Could not open IFLA_AF_SPEC container: %m");
1386 if (socket_ipv6_is_supported()) {
1387 /* if the kernel lacks ipv6 support setting IFF_UP fails if any ipv6 options are passed */
1388 r
= sd_netlink_message_open_container(req
, AF_INET6
);
1390 return log_link_error_errno(link
, r
, "Could not open AF_INET6 container: %m");
1392 ipv6ll_mode
= link_ipv6ll_enabled(link
) ? IN6_ADDR_GEN_MODE_EUI64
: IN6_ADDR_GEN_MODE_NONE
;
1393 r
= sd_netlink_message_append_u8(req
, IFLA_INET6_ADDR_GEN_MODE
, ipv6ll_mode
);
1395 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_ADDR_GEN_MODE: %m");
1397 if (!in_addr_is_null(AF_INET6
, &link
->network
->ipv6_token
)) {
1398 r
= sd_netlink_message_append_in6_addr(req
, IFLA_INET6_TOKEN
, &link
->network
->ipv6_token
.in6
);
1400 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_TOKEN: %m");
1403 r
= sd_netlink_message_close_container(req
);
1405 return log_link_error_errno(link
, r
, "Could not close AF_INET6 container: %m");
1408 r
= sd_netlink_message_close_container(req
);
1410 return log_link_error_errno(link
, r
, "Could not close IFLA_AF_SPEC container: %m");
1412 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_up_handler
, link
, 0, NULL
);
1414 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1421 static int link_down_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1422 _cleanup_link_unref_ Link
*link
= userdata
;
1427 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1430 r
= sd_netlink_message_get_errno(m
);
1432 log_link_warning_errno(link
, r
, "Could not bring down interface: %m");
1437 static int link_down(Link
*link
) {
1438 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1442 assert(link
->manager
);
1443 assert(link
->manager
->rtnl
);
1445 log_link_debug(link
, "Bringing link down");
1447 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
,
1448 RTM_SETLINK
, link
->ifindex
);
1450 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1452 r
= sd_rtnl_message_link_set_flags(req
, 0, IFF_UP
);
1454 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1456 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_down_handler
, link
, 0, NULL
);
1458 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1465 static int link_handle_bound_to_list(Link
*link
) {
1469 bool required_up
= false;
1470 bool link_is_up
= false;
1474 if (hashmap_isempty(link
->bound_to_links
))
1477 if (link
->flags
& IFF_UP
)
1480 HASHMAP_FOREACH (l
, link
->bound_to_links
, i
)
1481 if (link_has_carrier(l
)) {
1486 if (!required_up
&& link_is_up
) {
1487 r
= link_down(link
);
1490 } else if (required_up
&& !link_is_up
) {
1499 static int link_handle_bound_by_list(Link
*link
) {
1506 if (hashmap_isempty(link
->bound_by_links
))
1509 HASHMAP_FOREACH (l
, link
->bound_by_links
, i
) {
1510 r
= link_handle_bound_to_list(l
);
1518 static int link_put_carrier(Link
*link
, Link
*carrier
, Hashmap
**h
) {
1524 if (link
== carrier
)
1527 if (hashmap_get(*h
, INT_TO_PTR(carrier
->ifindex
)))
1530 r
= hashmap_ensure_allocated(h
, NULL
);
1534 r
= hashmap_put(*h
, INT_TO_PTR(carrier
->ifindex
), carrier
);
1541 static int link_new_bound_by_list(Link
*link
) {
1546 bool list_updated
= false;
1549 assert(link
->manager
);
1553 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1554 if (!carrier
->network
)
1557 if (strv_isempty(carrier
->network
->bind_carrier
))
1560 if (strv_fnmatch(carrier
->network
->bind_carrier
, link
->ifname
, 0)) {
1561 r
= link_put_carrier(link
, carrier
, &link
->bound_by_links
);
1565 list_updated
= true;
1572 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
) {
1573 r
= link_put_carrier(carrier
, link
, &carrier
->bound_to_links
);
1577 link_dirty(carrier
);
1583 static int link_new_bound_to_list(Link
*link
) {
1588 bool list_updated
= false;
1591 assert(link
->manager
);
1596 if (strv_isempty(link
->network
->bind_carrier
))
1601 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1602 if (strv_fnmatch(link
->network
->bind_carrier
, carrier
->ifname
, 0)) {
1603 r
= link_put_carrier(link
, carrier
, &link
->bound_to_links
);
1607 list_updated
= true;
1614 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
) {
1615 r
= link_put_carrier(carrier
, link
, &carrier
->bound_by_links
);
1619 link_dirty(carrier
);
1625 static int link_new_carrier_maps(Link
*link
) {
1628 r
= link_new_bound_by_list(link
);
1632 r
= link_handle_bound_by_list(link
);
1636 r
= link_new_bound_to_list(link
);
1640 r
= link_handle_bound_to_list(link
);
1647 static void link_free_bound_to_list(Link
*link
) {
1651 HASHMAP_FOREACH (bound_to
, link
->bound_to_links
, i
) {
1652 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(bound_to
->ifindex
));
1654 if (hashmap_remove(bound_to
->bound_by_links
, INT_TO_PTR(link
->ifindex
)))
1655 link_dirty(bound_to
);
1661 static void link_free_bound_by_list(Link
*link
) {
1665 HASHMAP_FOREACH (bound_by
, link
->bound_by_links
, i
) {
1666 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(bound_by
->ifindex
));
1668 if (hashmap_remove(bound_by
->bound_to_links
, INT_TO_PTR(link
->ifindex
))) {
1669 link_dirty(bound_by
);
1670 link_handle_bound_to_list(bound_by
);
1677 static void link_free_carrier_maps(Link
*link
) {
1678 bool list_updated
= false;
1682 if (!hashmap_isempty(link
->bound_to_links
)) {
1683 link_free_bound_to_list(link
);
1684 list_updated
= true;
1687 if (!hashmap_isempty(link
->bound_by_links
)) {
1688 link_free_bound_by_list(link
);
1689 list_updated
= true;
1698 void link_drop(Link
*link
) {
1699 if (!link
|| link
->state
== LINK_STATE_LINGER
)
1702 link_set_state(link
, LINK_STATE_LINGER
);
1704 link_free_carrier_maps(link
);
1706 log_link_debug(link
, "Link removed");
1708 (void)unlink(link
->state_file
);
1714 static int link_joined(Link
*link
) {
1718 assert(link
->network
);
1720 if (!hashmap_isempty(link
->bound_to_links
)) {
1721 r
= link_handle_bound_to_list(link
);
1724 } else if (!(link
->flags
& IFF_UP
)) {
1727 link_enter_failed(link
);
1732 if(link
->network
->bridge
) {
1733 r
= link_set_bridge(link
);
1735 log_link_error_errno(link
, r
, "Could not set bridge message: %m");
1738 return link_enter_set_addresses(link
);
1741 static int netdev_join_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1742 _cleanup_link_unref_ Link
*link
= userdata
;
1746 assert(link
->network
);
1750 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1753 r
= sd_netlink_message_get_errno(m
);
1754 if (r
< 0 && r
!= -EEXIST
) {
1755 log_link_error_errno(link
, r
, "Could not join netdev: %m");
1756 link_enter_failed(link
);
1759 log_link_debug(link
, "Joined netdev");
1761 if (link
->enslaving
<= 0)
1767 static int link_enter_join_netdev(Link
*link
) {
1773 assert(link
->network
);
1774 assert(link
->state
== LINK_STATE_PENDING
);
1776 link_set_state(link
, LINK_STATE_ENSLAVING
);
1780 if (!link
->network
->bridge
&&
1781 !link
->network
->bond
&&
1782 hashmap_isempty(link
->network
->stacked_netdevs
))
1783 return link_joined(link
);
1785 if (link
->network
->bond
) {
1786 log_struct(LOG_DEBUG
,
1787 LOG_LINK_INTERFACE(link
),
1788 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1789 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bond
->ifname
),
1792 r
= netdev_join(link
->network
->bond
, link
, netdev_join_handler
);
1794 log_struct_errno(LOG_WARNING
, r
,
1795 LOG_LINK_INTERFACE(link
),
1796 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1797 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bond
->ifname
),
1800 link_enter_failed(link
);
1807 if (link
->network
->bridge
) {
1808 log_struct(LOG_DEBUG
,
1809 LOG_LINK_INTERFACE(link
),
1810 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1811 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bridge
->ifname
),
1814 r
= netdev_join(link
->network
->bridge
, link
, netdev_join_handler
);
1816 log_struct_errno(LOG_WARNING
, r
,
1817 LOG_LINK_INTERFACE(link
),
1818 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1819 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bridge
->ifname
),
1821 link_enter_failed(link
);
1828 HASHMAP_FOREACH(netdev
, link
->network
->stacked_netdevs
, i
) {
1830 log_struct(LOG_DEBUG
,
1831 LOG_LINK_INTERFACE(link
),
1832 LOG_NETDEV_INTERFACE(netdev
),
1833 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", netdev
->ifname
),
1836 r
= netdev_join(netdev
, link
, netdev_join_handler
);
1838 log_struct_errno(LOG_WARNING
, r
,
1839 LOG_LINK_INTERFACE(link
),
1840 LOG_NETDEV_INTERFACE(netdev
),
1841 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", netdev
->ifname
),
1843 link_enter_failed(link
);
1853 static int link_set_ipv4_forward(Link
*link
) {
1854 const char *p
= NULL
, *v
;
1857 if (link
->flags
& IFF_LOOPBACK
)
1860 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1863 p
= strjoina("/proc/sys/net/ipv4/conf/", link
->ifname
, "/forwarding");
1864 v
= one_zero(link_ipv4_forward_enabled(link
));
1866 r
= write_string_file(p
, v
, WRITE_STRING_FILE_VERIFY_ON_FAILURE
);
1868 log_link_warning_errno(link
, r
, "Cannot configure IPv4 forwarding for interface %s: %m", link
->ifname
);
1873 static int link_set_ipv6_forward(Link
*link
) {
1874 const char *p
= NULL
, *v
= NULL
;
1877 /* Make this a NOP if IPv6 is not available */
1878 if (!socket_ipv6_is_supported())
1881 if (link
->flags
& IFF_LOOPBACK
)
1884 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1887 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/forwarding");
1888 v
= one_zero(link_ipv6_forward_enabled(link
));
1890 r
= write_string_file(p
, v
, WRITE_STRING_FILE_VERIFY_ON_FAILURE
);
1892 log_link_warning_errno(link
, r
, "Cannot configure IPv6 forwarding for interface: %m");
1897 static int link_set_ipv6_privacy_extensions(Link
*link
) {
1898 char buf
[DECIMAL_STR_MAX(unsigned) + 1];
1899 IPv6PrivacyExtensions s
;
1900 const char *p
= NULL
;
1903 s
= link_ipv6_privacy_extensions(link
);
1907 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/use_tempaddr");
1908 xsprintf(buf
, "%u", (unsigned) link
->network
->ipv6_privacy_extensions
);
1910 r
= write_string_file(p
, buf
, WRITE_STRING_FILE_VERIFY_ON_FAILURE
);
1912 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
;
1921 /* Make this a NOP if IPv6 is not available */
1922 if (!socket_ipv6_is_supported())
1925 if (link
->flags
& IFF_LOOPBACK
)
1931 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/accept_ra");
1933 /* We handle router advertisments ourselves, tell the kernel to GTFO */
1934 r
= write_string_file(p
, "0", WRITE_STRING_FILE_VERIFY_ON_FAILURE
);
1936 log_link_warning_errno(link
, r
, "Cannot disable kernel IPv6 accept_ra for interface: %m");
1941 static int link_set_ipv6_dad_transmits(Link
*link
) {
1942 char buf
[DECIMAL_STR_MAX(int) + 1];
1943 const char *p
= NULL
;
1946 /* Make this a NOP if IPv6 is not available */
1947 if (!socket_ipv6_is_supported())
1950 if (link
->flags
& IFF_LOOPBACK
)
1956 if (link
->network
->ipv6_dad_transmits
< 0)
1959 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/dad_transmits");
1960 xsprintf(buf
, "%i", link
->network
->ipv6_dad_transmits
);
1962 r
= write_string_file(p
, buf
, WRITE_STRING_FILE_VERIFY_ON_FAILURE
);
1964 log_link_warning_errno(link
, r
, "Cannot set IPv6 dad transmits for interface: %m");
1969 static int link_set_ipv6_hop_limit(Link
*link
) {
1970 char buf
[DECIMAL_STR_MAX(int) + 1];
1971 const char *p
= NULL
;
1974 /* Make this a NOP if IPv6 is not available */
1975 if (!socket_ipv6_is_supported())
1978 if (link
->flags
& IFF_LOOPBACK
)
1984 if (link
->network
->ipv6_hop_limit
< 0)
1987 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/hop_limit");
1988 xsprintf(buf
, "%i", link
->network
->ipv6_hop_limit
);
1990 r
= write_string_file(p
, buf
, WRITE_STRING_FILE_VERIFY_ON_FAILURE
);
1992 log_link_warning_errno(link
, r
, "Cannot set IPv6 hop limit for interface: %m");
1997 static int link_drop_foreign_config(Link
*link
) {
2003 SET_FOREACH(address
, link
->addresses_foreign
, i
) {
2004 /* we consider IPv6LL addresses to be managed by the kernel */
2005 if (address
->family
== AF_INET6
&& in_addr_is_link_local(AF_INET6
, &address
->in_addr
) == 1)
2008 r
= address_remove(address
, link
, link_address_remove_handler
);
2013 SET_FOREACH(route
, link
->routes_foreign
, i
) {
2014 /* do not touch routes managed by the kernel */
2015 if (route
->protocol
== RTPROT_KERNEL
)
2018 r
= route_remove(route
, link
, link_address_remove_handler
);
2026 static int link_configure(Link
*link
) {
2030 assert(link
->network
);
2031 assert(link
->state
== LINK_STATE_PENDING
);
2033 r
= link_drop_foreign_config(link
);
2037 r
= link_set_bridge_fdb(link
);
2041 r
= link_set_ipv4_forward(link
);
2045 r
= link_set_ipv6_forward(link
);
2049 r
= link_set_ipv6_privacy_extensions(link
);
2053 r
= link_set_ipv6_accept_ra(link
);
2057 r
= link_set_ipv6_dad_transmits(link
);
2061 r
= link_set_ipv6_hop_limit(link
);
2065 if (link_ipv4ll_enabled(link
)) {
2066 r
= ipv4ll_configure(link
);
2071 if (link_dhcp4_enabled(link
)) {
2072 r
= dhcp4_configure(link
);
2077 if (link_dhcp4_server_enabled(link
)) {
2078 r
= sd_dhcp_server_new(&link
->dhcp_server
, link
->ifindex
);
2082 r
= sd_dhcp_server_attach_event(link
->dhcp_server
, NULL
, 0);
2087 if (link_dhcp6_enabled(link
)) {
2088 r
= dhcp6_configure(link
);
2093 if (link_ipv6_accept_ra_enabled(link
)) {
2094 r
= ndisc_configure(link
);
2099 if (link_lldp_enabled(link
)) {
2100 r
= sd_lldp_new(link
->ifindex
, link
->ifname
, &link
->mac
, &link
->lldp
);
2104 r
= sd_lldp_attach_event(link
->lldp
, NULL
, 0);
2108 r
= sd_lldp_set_callback(link
->lldp
,
2109 lldp_handler
, link
);
2114 if (link_has_carrier(link
)) {
2115 r
= link_acquire_conf(link
);
2119 if (link
->ipv6ll_address
) {
2120 r
= link_acquire_ipv6_conf(link
);
2126 return link_enter_join_netdev(link
);
2129 static int link_initialized_and_synced(sd_netlink
*rtnl
, sd_netlink_message
*m
,
2131 _cleanup_link_unref_ Link
*link
= userdata
;
2136 assert(link
->ifname
);
2137 assert(link
->manager
);
2139 if (link
->state
!= LINK_STATE_PENDING
)
2142 log_link_debug(link
, "Link state is up-to-date");
2144 r
= link_new_bound_by_list(link
);
2148 r
= link_handle_bound_by_list(link
);
2152 if (!link
->network
) {
2153 r
= network_get(link
->manager
, link
->udev_device
, link
->ifname
,
2154 &link
->mac
, &network
);
2156 link_enter_unmanaged(link
);
2161 if (link
->flags
& IFF_LOOPBACK
) {
2162 if (network
->link_local
!= ADDRESS_FAMILY_NO
)
2163 log_link_debug(link
, "Ignoring link-local autoconfiguration for loopback link");
2165 if (network
->dhcp
!= ADDRESS_FAMILY_NO
)
2166 log_link_debug(link
, "Ignoring DHCP clients for loopback link");
2168 if (network
->dhcp_server
)
2169 log_link_debug(link
, "Ignoring DHCP server for loopback link");
2172 r
= network_apply(link
->manager
, network
, link
);
2177 r
= link_new_bound_to_list(link
);
2181 r
= link_configure(link
);
2188 int link_initialized(Link
*link
, struct udev_device
*device
) {
2189 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
2193 assert(link
->manager
);
2194 assert(link
->manager
->rtnl
);
2197 if (link
->state
!= LINK_STATE_PENDING
)
2200 if (link
->udev_device
)
2203 log_link_debug(link
, "udev initialized link");
2205 link
->udev_device
= udev_device_ref(device
);
2207 /* udev has initialized the link, but we don't know if we have yet
2208 * processed the NEWLINK messages with the latest state. Do a GETLINK,
2209 * when it returns we know that the pending NEWLINKs have already been
2210 * processed and that we are up-to-date */
2212 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_GETLINK
,
2217 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
,
2218 link_initialized_and_synced
, link
, 0, NULL
);
2227 static int link_load(Link
*link
) {
2228 _cleanup_free_
char *network_file
= NULL
,
2231 *dhcp4_address
= NULL
,
2232 *ipv4ll_address
= NULL
;
2233 union in_addr_union address
;
2234 union in_addr_union route_dst
;
2240 r
= parse_env_file(link
->state_file
, NEWLINE
,
2241 "NETWORK_FILE", &network_file
,
2242 "ADDRESSES", &addresses
,
2244 "DHCP4_ADDRESS", &dhcp4_address
,
2245 "IPV4LL_ADDRESS", &ipv4ll_address
,
2247 if (r
< 0 && r
!= -ENOENT
)
2248 return log_link_error_errno(link
, r
, "Failed to read %s: %m", link
->state_file
);
2255 suffix
= strrchr(network_file
, '.');
2257 log_link_debug(link
, "Failed to get network name from %s", network_file
);
2258 goto network_file_fail
;
2262 r
= network_get_by_name(link
->manager
, basename(network_file
), &network
);
2264 log_link_debug_errno(link
, r
, "Failed to get network %s: %m", basename(network_file
));
2265 goto network_file_fail
;
2268 r
= network_apply(link
->manager
, network
, link
);
2270 return log_link_error_errno(link
, r
, "Failed to apply network %s: %m", basename(network_file
));
2279 _cleanup_free_
char *address_str
= NULL
;
2280 char *prefixlen_str
;
2282 unsigned char prefixlen
;
2284 r
= extract_first_word(&p
, &address_str
, NULL
, 0);
2286 log_link_debug_errno(link
, r
, "Failed to extract next address string: %m");
2291 prefixlen_str
= strchr(address_str
, '/');
2292 if (!prefixlen_str
) {
2293 log_link_debug(link
, "Failed to parse address and prefix length %s", address_str
);
2297 *prefixlen_str
++ = '\0';
2299 r
= sscanf(prefixlen_str
, "%hhu", &prefixlen
);
2301 log_link_error(link
, "Failed to parse prefixlen %s", prefixlen_str
);
2305 r
= in_addr_from_string_auto(address_str
, &family
, &address
);
2307 log_link_debug_errno(link
, r
, "Failed to parse address %s: %m", address_str
);
2311 r
= address_add(link
, family
, &address
, prefixlen
, NULL
);
2313 return log_link_error_errno(link
, r
, "Failed to add address: %m");
2320 _cleanup_free_
char *route_str
= NULL
;
2321 _cleanup_event_source_unref_ sd_event_source
*expire
= NULL
;
2323 char *prefixlen_str
;
2325 unsigned char prefixlen
, tos
, table
;
2328 r
= extract_first_word(&p
, &route_str
, NULL
, 0);
2330 log_link_debug_errno(link
, r
, "Failed to extract next route string: %m");
2335 prefixlen_str
= strchr(route_str
, '/');
2336 if (!prefixlen_str
) {
2337 log_link_debug(link
, "Failed to parse route %s", route_str
);
2341 *prefixlen_str
++ = '\0';
2343 r
= sscanf(prefixlen_str
, "%hhu/%hhu/%"SCNu32
"/%hhu/"USEC_FMT
, &prefixlen
, &tos
, &priority
, &table
, &lifetime
);
2345 log_link_debug(link
,
2346 "Failed to parse destination prefix length, tos, priority, table or expiration %s",
2351 r
= in_addr_from_string_auto(route_str
, &family
, &route_dst
);
2353 log_link_debug_errno(link
, r
, "Failed to parse route destination %s: %m", route_str
);
2357 r
= route_add(link
, family
, &route_dst
, prefixlen
, tos
, priority
, table
, &route
);
2359 return log_link_error_errno(link
, r
, "Failed to add route: %m");
2361 if (lifetime
!= USEC_INFINITY
) {
2362 r
= sd_event_add_time(link
->manager
->event
, &expire
, clock_boottime_or_monotonic(), lifetime
,
2363 0, route_expire_handler
, route
);
2365 log_link_warning_errno(link
, r
, "Could not arm route expiration handler: %m");
2368 route
->lifetime
= lifetime
;
2369 sd_event_source_unref(route
->expire
);
2370 route
->expire
= expire
;
2375 if (dhcp4_address
) {
2376 r
= in_addr_from_string(AF_INET
, dhcp4_address
, &address
);
2378 log_link_debug_errno(link
, r
, "Falied to parse DHCPv4 address %s: %m", dhcp4_address
);
2379 goto dhcp4_address_fail
;
2382 r
= sd_dhcp_client_new(&link
->dhcp_client
);
2384 return log_link_error_errno(link
, r
, "Falied to create DHCPv4 client: %m");
2386 r
= sd_dhcp_client_set_request_address(link
->dhcp_client
, &address
.in
);
2388 return log_link_error_errno(link
, r
, "Falied to set inital DHCPv4 address %s: %m", dhcp4_address
);
2393 if (ipv4ll_address
) {
2394 r
= in_addr_from_string(AF_INET
, ipv4ll_address
, &address
);
2396 log_link_debug_errno(link
, r
, "Falied to parse IPv4LL address %s: %m", ipv4ll_address
);
2397 goto ipv4ll_address_fail
;
2400 r
= sd_ipv4ll_new(&link
->ipv4ll
);
2402 return log_link_error_errno(link
, r
, "Falied to create IPv4LL client: %m");
2404 r
= sd_ipv4ll_set_address(link
->ipv4ll
, &address
.in
);
2406 return log_link_error_errno(link
, r
, "Falied to set inital IPv4LL address %s: %m", ipv4ll_address
);
2409 ipv4ll_address_fail
:
2414 int link_add(Manager
*m
, sd_netlink_message
*message
, Link
**ret
) {
2416 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
2417 char ifindex_str
[2 + DECIMAL_STR_MAX(int)];
2425 r
= link_new(m
, message
, ret
);
2431 log_link_debug(link
, "Link %d added", link
->ifindex
);
2433 r
= link_load(link
);
2437 if (detect_container() <= 0) {
2438 /* not in a container, udev will be around */
2439 sprintf(ifindex_str
, "n%d", link
->ifindex
);
2440 device
= udev_device_new_from_device_id(m
->udev
, ifindex_str
);
2442 r
= log_link_warning_errno(link
, errno
, "Could not find udev device: %m");
2446 if (udev_device_get_is_initialized(device
) <= 0) {
2448 log_link_debug(link
, "link pending udev initialization...");
2452 r
= link_initialized(link
, device
);
2456 /* we are calling a callback directly, so must take a ref */
2459 r
= link_initialized_and_synced(m
->rtnl
, NULL
, link
);
2466 link_enter_failed(link
);
2470 int link_ipv6ll_gained(Link
*link
) {
2475 log_link_info(link
, "Gained IPv6LL");
2477 link
->ipv6ll_address
= true;
2478 link_check_ready(link
);
2480 if (link
->network
) {
2481 r
= link_acquire_ipv6_conf(link
);
2483 link_enter_failed(link
);
2491 static int link_carrier_gained(Link
*link
) {
2496 if (link
->network
) {
2497 r
= link_acquire_conf(link
);
2499 link_enter_failed(link
);
2504 r
= link_handle_bound_by_list(link
);
2511 static int link_carrier_lost(Link
*link
) {
2516 r
= link_stop_clients(link
);
2518 link_enter_failed(link
);
2522 r
= link_handle_bound_by_list(link
);
2529 int link_carrier_reset(Link
*link
) {
2534 if (link_has_carrier(link
)) {
2535 r
= link_carrier_lost(link
);
2539 r
= link_carrier_gained(link
);
2543 log_link_info(link
, "Reset carrier");
2550 int link_update(Link
*link
, sd_netlink_message
*m
) {
2551 struct ether_addr mac
;
2554 bool had_carrier
, carrier_gained
, carrier_lost
;
2558 assert(link
->ifname
);
2561 if (link
->state
== LINK_STATE_LINGER
) {
2563 log_link_info(link
, "Link readded");
2564 link_set_state(link
, LINK_STATE_ENSLAVING
);
2566 r
= link_new_carrier_maps(link
);
2571 r
= sd_netlink_message_read_string(m
, IFLA_IFNAME
, &ifname
);
2572 if (r
>= 0 && !streq(ifname
, link
->ifname
)) {
2573 log_link_info(link
, "Renamed to %s", ifname
);
2575 link_free_carrier_maps(link
);
2577 r
= free_and_strdup(&link
->ifname
, ifname
);
2581 r
= link_new_carrier_maps(link
);
2586 r
= sd_netlink_message_read_u32(m
, IFLA_MTU
, &mtu
);
2587 if (r
>= 0 && mtu
> 0) {
2589 if (!link
->original_mtu
) {
2590 link
->original_mtu
= mtu
;
2591 log_link_debug(link
, "Saved original MTU: %" PRIu32
, link
->original_mtu
);
2594 if (link
->dhcp_client
) {
2595 r
= sd_dhcp_client_set_mtu(link
->dhcp_client
,
2598 log_link_warning_errno(link
, r
, "Could not update MTU in DHCP client: %m");
2604 /* The kernel may broadcast NEWLINK messages without the MAC address
2605 set, simply ignore them. */
2606 r
= sd_netlink_message_read_ether_addr(m
, IFLA_ADDRESS
, &mac
);
2608 if (memcmp(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2611 memcpy(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2614 log_link_debug(link
, "MAC address: "
2615 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2616 mac
.ether_addr_octet
[0],
2617 mac
.ether_addr_octet
[1],
2618 mac
.ether_addr_octet
[2],
2619 mac
.ether_addr_octet
[3],
2620 mac
.ether_addr_octet
[4],
2621 mac
.ether_addr_octet
[5]);
2624 r
= sd_ipv4ll_set_mac(link
->ipv4ll
, &link
->mac
);
2626 return log_link_warning_errno(link
, r
, "Could not update MAC address in IPv4LL client: %m");
2629 if (link
->dhcp_client
) {
2630 r
= sd_dhcp_client_set_mac(link
->dhcp_client
,
2631 (const uint8_t *) &link
->mac
,
2635 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCP client: %m");
2638 if (link
->dhcp6_client
) {
2639 r
= sd_dhcp6_client_set_mac(link
->dhcp6_client
,
2640 (const uint8_t *) &link
->mac
,
2644 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCPv6 client: %m");
2649 had_carrier
= link_has_carrier(link
);
2651 r
= link_update_flags(link
, m
);
2655 carrier_gained
= !had_carrier
&& link_has_carrier(link
);
2656 carrier_lost
= had_carrier
&& !link_has_carrier(link
);
2658 if (carrier_gained
) {
2659 log_link_info(link
, "Gained carrier");
2661 r
= link_carrier_gained(link
);
2664 } else if (carrier_lost
) {
2665 log_link_info(link
, "Lost carrier");
2667 r
= link_carrier_lost(link
);
2676 int link_save(Link
*link
) {
2677 _cleanup_free_
char *temp_path
= NULL
;
2678 _cleanup_fclose_
FILE *f
= NULL
;
2679 const char *admin_state
, *oper_state
;
2686 assert(link
->state_file
);
2687 assert(link
->lease_file
);
2688 assert(link
->manager
);
2690 if (link
->state
== LINK_STATE_LINGER
) {
2691 unlink(link
->state_file
);
2695 admin_state
= link_state_to_string(link
->state
);
2696 assert(admin_state
);
2698 oper_state
= link_operstate_to_string(link
->operstate
);
2701 r
= fopen_temporary(link
->state_file
, &f
, &temp_path
);
2705 fchmod(fileno(f
), 0644);
2708 "# This is private data. Do not parse.\n"
2711 admin_state
, oper_state
);
2713 if (link
->network
) {
2714 char **address
, **domain
;
2716 sd_dhcp6_lease
*dhcp6_lease
= NULL
;
2718 if (link
->dhcp6_client
) {
2719 r
= sd_dhcp6_client_get_lease(link
->dhcp6_client
, &dhcp6_lease
);
2720 if (r
< 0 && r
!= -ENOMSG
)
2721 log_link_debug(link
, "No DHCPv6 lease");
2724 fprintf(f
, "NETWORK_FILE=%s\n", link
->network
->filename
);
2728 STRV_FOREACH(address
, link
->network
->dns
) {
2735 if (link
->network
->dhcp_dns
&&
2737 const struct in_addr
*addresses
;
2739 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
2743 serialize_in_addrs(f
, addresses
, r
);
2748 if (link
->network
->dhcp_dns
&& dhcp6_lease
) {
2749 struct in6_addr
*in6_addrs
;
2751 r
= sd_dhcp6_lease_get_dns(dhcp6_lease
, &in6_addrs
);
2755 serialize_in6_addrs(f
, in6_addrs
, r
);
2763 STRV_FOREACH(address
, link
->network
->ntp
) {
2770 if (link
->network
->dhcp_ntp
&&
2772 const struct in_addr
*addresses
;
2774 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
2778 serialize_in_addrs(f
, addresses
, r
);
2783 if (link
->network
->dhcp_ntp
&& dhcp6_lease
) {
2784 struct in6_addr
*in6_addrs
;
2788 r
= sd_dhcp6_lease_get_ntp_addrs(dhcp6_lease
,
2793 serialize_in6_addrs(f
, in6_addrs
, r
);
2797 r
= sd_dhcp6_lease_get_ntp_fqdn(dhcp6_lease
, &hosts
);
2799 STRV_FOREACH(hostname
, hosts
) {
2802 fputs(*hostname
, f
);
2810 fputs("DOMAINS=", f
);
2812 STRV_FOREACH(domain
, link
->network
->domains
) {
2819 if (link
->network
->dhcp_domains
&&
2821 const char *domainname
;
2823 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
2827 fputs(domainname
, f
);
2832 if (link
->network
->dhcp_domains
&& dhcp6_lease
) {
2835 r
= sd_dhcp6_lease_get_domains(dhcp6_lease
, &domains
);
2837 STRV_FOREACH(domain
, domains
) {
2848 fprintf(f
, "WILDCARD_DOMAIN=%s\n",
2849 yes_no(link
->network
->wildcard_domain
));
2851 fprintf(f
, "LLMNR=%s\n",
2852 resolve_support_to_string(link
->network
->llmnr
));
2854 fputs("ADDRESSES=", f
);
2856 SET_FOREACH(a
, link
->addresses
, i
) {
2857 _cleanup_free_
char *address_str
= NULL
;
2859 r
= in_addr_to_string(a
->family
, &a
->in_addr
, &address_str
);
2863 fprintf(f
, "%s%s/%u", space
? " " : "", address_str
, a
->prefixlen
);
2869 fputs("ROUTES=", f
);
2871 SET_FOREACH(route
, link
->routes
, i
) {
2872 _cleanup_free_
char *route_str
= NULL
;
2874 r
= in_addr_to_string(route
->family
, &route
->dst
, &route_str
);
2878 fprintf(f
, "%s%s/%hhu/%hhu/%"PRIu32
"/%hhu/"USEC_FMT
, space
? " " : "", route_str
,
2879 route
->dst_prefixlen
, route
->tos
, route
->priority
, route
->table
, route
->lifetime
);
2886 if (!hashmap_isempty(link
->bound_to_links
)) {
2890 fputs("CARRIER_BOUND_TO=", f
);
2891 HASHMAP_FOREACH(carrier
, link
->bound_to_links
, i
) {
2894 fputs(carrier
->ifname
, f
);
2901 if (!hashmap_isempty(link
->bound_by_links
)) {
2905 fputs("CARRIER_BOUND_BY=", f
);
2906 HASHMAP_FOREACH(carrier
, link
->bound_by_links
, i
) {
2909 fputs(carrier
->ifname
, f
);
2916 if (link
->dhcp_lease
) {
2917 struct in_addr address
;
2918 const char *tz
= NULL
;
2920 assert(link
->network
);
2922 r
= sd_dhcp_lease_get_timezone(link
->dhcp_lease
, &tz
);
2924 fprintf(f
, "TIMEZONE=%s\n", tz
);
2926 r
= sd_dhcp_lease_get_address(link
->dhcp_lease
, &address
);
2928 fputs("DHCP4_ADDRESS=", f
);
2929 serialize_in_addrs(f
, &address
, 1);
2933 r
= dhcp_lease_save(link
->dhcp_lease
, link
->lease_file
);
2941 unlink(link
->lease_file
);
2944 struct in_addr address
;
2946 r
= sd_ipv4ll_get_address(link
->ipv4ll
, &address
);
2948 fputs("IPV4LL_ADDRESS=", f
);
2949 serialize_in_addrs(f
, &address
, 1);
2955 assert(link
->network
);
2957 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
2965 unlink(link
->lldp_file
);
2967 r
= fflush_and_check(f
);
2971 if (rename(temp_path
, link
->state_file
) < 0) {
2979 (void) unlink(link
->state_file
);
2981 (void) unlink(temp_path
);
2983 return log_link_error_errno(link
, r
, "Failed to save link data to %s: %m", link
->state_file
);
2986 /* The serialized state in /run is no longer up-to-date. */
2987 void link_dirty(Link
*link
) {
2992 r
= set_ensure_allocated(&link
->manager
->dirty_links
, NULL
);
2994 /* allocation errors are ignored */
2997 r
= set_put(link
->manager
->dirty_links
, link
);
2999 /* allocation errors are ignored */
3005 /* The serialized state in /run is up-to-date */
3006 void link_clean(Link
*link
) {
3008 assert(link
->manager
);
3010 set_remove(link
->manager
->dirty_links
, link
);
3014 static const char* const link_state_table
[_LINK_STATE_MAX
] = {
3015 [LINK_STATE_PENDING
] = "pending",
3016 [LINK_STATE_ENSLAVING
] = "configuring",
3017 [LINK_STATE_SETTING_ADDRESSES
] = "configuring",
3018 [LINK_STATE_SETTING_ROUTES
] = "configuring",
3019 [LINK_STATE_CONFIGURED
] = "configured",
3020 [LINK_STATE_UNMANAGED
] = "unmanaged",
3021 [LINK_STATE_FAILED
] = "failed",
3022 [LINK_STATE_LINGER
] = "linger",
3025 DEFINE_STRING_TABLE_LOOKUP(link_state
, LinkState
);
3027 static const char* const link_operstate_table
[_LINK_OPERSTATE_MAX
] = {
3028 [LINK_OPERSTATE_OFF
] = "off",
3029 [LINK_OPERSTATE_NO_CARRIER
] = "no-carrier",
3030 [LINK_OPERSTATE_DORMANT
] = "dormant",
3031 [LINK_OPERSTATE_CARRIER
] = "carrier",
3032 [LINK_OPERSTATE_DEGRADED
] = "degraded",
3033 [LINK_OPERSTATE_ROUTABLE
] = "routable",
3036 DEFINE_STRING_TABLE_LOOKUP(link_operstate
, LinkOperationalState
);