1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Tom Gundersen <teg@jklm.no>
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 #include <netinet/ether.h>
27 #include "dhcp-lease-internal.h"
30 #include "netlink-util.h"
31 #include "network-internal.h"
32 #include "networkd-link.h"
33 #include "networkd-netdev.h"
35 #include "socket-util.h"
36 #include "udev-util.h"
40 bool link_dhcp6_enabled(Link
*link
) {
41 if (link
->flags
& IFF_LOOPBACK
)
47 return link
->network
->dhcp
& ADDRESS_FAMILY_IPV6
;
50 bool link_dhcp4_enabled(Link
*link
) {
51 if (link
->flags
& IFF_LOOPBACK
)
57 return link
->network
->dhcp
& ADDRESS_FAMILY_IPV4
;
60 bool link_dhcp4_server_enabled(Link
*link
) {
61 if (link
->flags
& IFF_LOOPBACK
)
67 return link
->network
->dhcp_server
;
70 bool link_ipv4ll_enabled(Link
*link
) {
71 if (link
->flags
& IFF_LOOPBACK
)
77 return link
->network
->link_local
& ADDRESS_FAMILY_IPV4
;
80 bool link_ipv6ll_enabled(Link
*link
) {
81 if (link
->flags
& IFF_LOOPBACK
)
87 return link
->network
->link_local
& ADDRESS_FAMILY_IPV6
;
90 bool link_lldp_enabled(Link
*link
) {
91 if (link
->flags
& IFF_LOOPBACK
)
97 if (link
->network
->bridge
)
100 return link
->network
->lldp
;
103 static bool link_ipv4_forward_enabled(Link
*link
) {
104 if (link
->flags
& IFF_LOOPBACK
)
110 return link
->network
->ip_forward
& ADDRESS_FAMILY_IPV4
;
113 static bool link_ipv6_forward_enabled(Link
*link
) {
114 if (link
->flags
& IFF_LOOPBACK
)
120 return link
->network
->ip_forward
& ADDRESS_FAMILY_IPV6
;
123 static IPv6PrivacyExtensions
link_ipv6_privacy_extensions(Link
*link
) {
124 if (link
->flags
& IFF_LOOPBACK
)
125 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
128 return _IPV6_PRIVACY_EXTENSIONS_INVALID
;
130 return link
->network
->ipv6_privacy_extensions
;
133 void link_update_operstate(Link
*link
) {
134 LinkOperationalState operstate
;
137 if (link
->kernel_operstate
== IF_OPER_DORMANT
)
138 operstate
= LINK_OPERSTATE_DORMANT
;
139 else if (link_has_carrier(link
)) {
141 uint8_t scope
= RT_SCOPE_NOWHERE
;
144 /* if we have carrier, check what addresses we have */
145 SET_FOREACH(address
, link
->addresses
, i
) {
146 if (!address_is_ready(address
))
149 if (address
->scope
< scope
)
150 scope
= address
->scope
;
153 /* for operstate we also take foreign addresses into account */
154 SET_FOREACH(address
, link
->addresses_foreign
, i
) {
155 if (!address_is_ready(address
))
158 if (address
->scope
< scope
)
159 scope
= address
->scope
;
162 if (scope
< RT_SCOPE_SITE
)
163 /* universally accessible addresses found */
164 operstate
= LINK_OPERSTATE_ROUTABLE
;
165 else if (scope
< RT_SCOPE_HOST
)
166 /* only link or site local addresses found */
167 operstate
= LINK_OPERSTATE_DEGRADED
;
169 /* no useful addresses found */
170 operstate
= LINK_OPERSTATE_CARRIER
;
171 } else if (link
->flags
& IFF_UP
)
172 operstate
= LINK_OPERSTATE_NO_CARRIER
;
174 operstate
= LINK_OPERSTATE_OFF
;
176 if (link
->operstate
!= operstate
) {
177 link
->operstate
= operstate
;
178 link_send_changed(link
, "OperationalState", NULL
);
180 manager_dirty(link
->manager
);
184 #define FLAG_STRING(string, flag, old, new) \
185 (((old ^ new) & flag) \
186 ? ((old & flag) ? (" -" string) : (" +" string)) \
189 static int link_update_flags(Link
*link
, sd_netlink_message
*m
) {
190 unsigned flags
, unknown_flags_added
, unknown_flags_removed
, unknown_flags
;
196 r
= sd_rtnl_message_link_get_flags(m
, &flags
);
198 return log_link_warning_errno(link
, r
, "Could not get link flags: %m");
200 r
= sd_netlink_message_read_u8(m
, IFLA_OPERSTATE
, &operstate
);
202 /* if we got a message without operstate, take it to mean
203 the state was unchanged */
204 operstate
= link
->kernel_operstate
;
206 if ((link
->flags
== flags
) && (link
->kernel_operstate
== operstate
))
209 if (link
->flags
!= flags
) {
210 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",
211 FLAG_STRING("LOOPBACK", IFF_LOOPBACK
, link
->flags
, flags
),
212 FLAG_STRING("MASTER", IFF_MASTER
, link
->flags
, flags
),
213 FLAG_STRING("SLAVE", IFF_SLAVE
, link
->flags
, flags
),
214 FLAG_STRING("UP", IFF_UP
, link
->flags
, flags
),
215 FLAG_STRING("DORMANT", IFF_DORMANT
, link
->flags
, flags
),
216 FLAG_STRING("LOWER_UP", IFF_LOWER_UP
, link
->flags
, flags
),
217 FLAG_STRING("RUNNING", IFF_RUNNING
, link
->flags
, flags
),
218 FLAG_STRING("MULTICAST", IFF_MULTICAST
, link
->flags
, flags
),
219 FLAG_STRING("BROADCAST", IFF_BROADCAST
, link
->flags
, flags
),
220 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT
, link
->flags
, flags
),
221 FLAG_STRING("PROMISC", IFF_PROMISC
, link
->flags
, flags
),
222 FLAG_STRING("ALLMULTI", IFF_ALLMULTI
, link
->flags
, flags
),
223 FLAG_STRING("PORTSEL", IFF_PORTSEL
, link
->flags
, flags
),
224 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA
, link
->flags
, flags
),
225 FLAG_STRING("DYNAMIC", IFF_DYNAMIC
, link
->flags
, flags
),
226 FLAG_STRING("NOARP", IFF_NOARP
, link
->flags
, flags
),
227 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS
, link
->flags
, flags
),
228 FLAG_STRING("DEBUG", IFF_DEBUG
, link
->flags
, flags
),
229 FLAG_STRING("ECHO", IFF_ECHO
, link
->flags
, flags
));
231 unknown_flags
= ~(IFF_LOOPBACK
| IFF_MASTER
| IFF_SLAVE
| IFF_UP
|
232 IFF_DORMANT
| IFF_LOWER_UP
| IFF_RUNNING
|
233 IFF_MULTICAST
| IFF_BROADCAST
| IFF_POINTOPOINT
|
234 IFF_PROMISC
| IFF_ALLMULTI
| IFF_PORTSEL
|
235 IFF_AUTOMEDIA
| IFF_DYNAMIC
| IFF_NOARP
|
236 IFF_NOTRAILERS
| IFF_DEBUG
| IFF_ECHO
);
237 unknown_flags_added
= ((link
->flags
^ flags
) & flags
& unknown_flags
);
238 unknown_flags_removed
= ((link
->flags
^ flags
) & link
->flags
& unknown_flags
);
240 /* link flags are currently at most 18 bits, let's align to
242 if (unknown_flags_added
)
244 "Unknown link flags gained: %#.5x (ignoring)",
245 unknown_flags_added
);
247 if (unknown_flags_removed
)
249 "Unknown link flags lost: %#.5x (ignoring)",
250 unknown_flags_removed
);
254 link
->kernel_operstate
= operstate
;
256 link_update_operstate(link
);
261 static int link_new(Manager
*manager
, sd_netlink_message
*message
, Link
**ret
) {
262 _cleanup_link_unref_ Link
*link
= NULL
;
271 r
= sd_netlink_message_get_type(message
, &type
);
274 else if (type
!= RTM_NEWLINK
)
277 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
280 else if (ifindex
<= 0)
283 r
= sd_netlink_message_read_string(message
, IFLA_IFNAME
, &ifname
);
287 link
= new0(Link
, 1);
292 link
->manager
= manager
;
293 link
->state
= LINK_STATE_PENDING
;
294 link
->rtnl_extended_attrs
= true;
295 link
->ifindex
= ifindex
;
296 link
->ifname
= strdup(ifname
);
300 r
= sd_netlink_message_read_ether_addr(message
, IFLA_ADDRESS
, &link
->mac
);
302 log_link_debug(link
, "MAC address not found for new device, continuing without");
304 r
= asprintf(&link
->state_file
, "/run/systemd/netif/links/%d",
309 r
= asprintf(&link
->lease_file
, "/run/systemd/netif/leases/%d",
314 r
= asprintf(&link
->lldp_file
, "/run/systemd/netif/lldp/%d",
320 r
= hashmap_ensure_allocated(&manager
->links
, NULL
);
324 r
= hashmap_put(manager
->links
, INT_TO_PTR(link
->ifindex
), link
);
328 r
= link_update_flags(link
, message
);
338 static void link_free(Link
*link
) {
346 while (!set_isempty(link
->addresses
))
347 address_free(set_first(link
->addresses
));
349 set_free(link
->addresses
);
351 while (!set_isempty(link
->addresses_foreign
))
352 address_free(set_first(link
->addresses_foreign
));
354 set_free(link
->addresses_foreign
);
356 while ((address
= link
->pool_addresses
)) {
357 LIST_REMOVE(addresses
, link
->pool_addresses
, address
);
358 address_free(address
);
361 sd_dhcp_server_unref(link
->dhcp_server
);
362 sd_dhcp_client_unref(link
->dhcp_client
);
363 sd_dhcp_lease_unref(link
->dhcp_lease
);
365 free(link
->lease_file
);
367 sd_lldp_free(link
->lldp
);
369 free(link
->lldp_file
);
371 sd_ipv4ll_unref(link
->ipv4ll
);
372 sd_dhcp6_client_unref(link
->dhcp6_client
);
373 sd_ndisc_unref(link
->ndisc_router_discovery
);
376 hashmap_remove(link
->manager
->links
, INT_TO_PTR(link
->ifindex
));
380 (void)unlink(link
->state_file
);
381 free(link
->state_file
);
383 udev_device_unref(link
->udev_device
);
385 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
)
386 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(carrier
->ifindex
));
387 hashmap_free(link
->bound_to_links
);
389 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
)
390 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(carrier
->ifindex
));
391 hashmap_free(link
->bound_by_links
);
396 Link
*link_unref(Link
*link
) {
400 assert(link
->n_ref
> 0);
412 Link
*link_ref(Link
*link
) {
416 assert(link
->n_ref
> 0);
423 int link_get(Manager
*m
, int ifindex
, Link
**ret
) {
430 link
= hashmap_get(m
->links
, INT_TO_PTR(ifindex
));
439 static void link_set_state(Link
*link
, LinkState state
) {
442 if (link
->state
== state
)
447 link_send_changed(link
, "AdministrativeState", NULL
);
452 static void link_enter_unmanaged(Link
*link
) {
455 log_link_debug(link
, "Unmanaged");
457 link_set_state(link
, LINK_STATE_UNMANAGED
);
462 static int link_stop_clients(Link
*link
) {
466 assert(link
->manager
);
467 assert(link
->manager
->event
);
472 if (link
->dhcp_client
) {
473 k
= sd_dhcp_client_stop(link
->dhcp_client
);
475 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv4 client: %m");
479 k
= sd_ipv4ll_stop(link
->ipv4ll
);
481 r
= log_link_warning_errno(link
, r
, "Could not stop IPv4 link-local: %m");
484 if(link
->ndisc_router_discovery
) {
485 if (link
->dhcp6_client
) {
486 k
= sd_dhcp6_client_stop(link
->dhcp6_client
);
488 r
= log_link_warning_errno(link
, r
, "Could not stop DHCPv6 client: %m");
491 k
= sd_ndisc_stop(link
->ndisc_router_discovery
);
493 r
= log_link_warning_errno(link
, r
, "Could not stop IPv6 Router Discovery: %m");
497 k
= sd_lldp_stop(link
->lldp
);
499 r
= log_link_warning_errno(link
, r
, "Could not stop LLDP: %m");
505 void link_enter_failed(Link
*link
) {
508 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
511 log_link_warning(link
, "Failed");
513 link_set_state(link
, LINK_STATE_FAILED
);
515 link_stop_clients(link
);
520 static Address
* link_find_dhcp_server_address(Link
*link
) {
524 assert(link
->network
);
526 /* The first statically configured address if there is any */
527 LIST_FOREACH(addresses
, address
, link
->network
->static_addresses
) {
529 if (address
->family
!= AF_INET
)
532 if (in_addr_is_null(address
->family
, &address
->in_addr
))
538 /* If that didn't work, find a suitable address we got from the pool */
539 LIST_FOREACH(addresses
, address
, link
->pool_addresses
) {
540 if (address
->family
!= AF_INET
)
549 static int link_enter_configured(Link
*link
) {
551 assert(link
->network
);
552 assert(link
->state
== LINK_STATE_SETTING_ROUTES
);
554 log_link_info(link
, "Configured");
556 link_set_state(link
, LINK_STATE_CONFIGURED
);
563 void link_check_ready(Link
*link
) {
572 if (!link
->static_configured
)
575 if (link_ipv4ll_enabled(link
))
576 if (!link
->ipv4ll_address
||
580 if ((link_dhcp4_enabled(link
) && !link_dhcp6_enabled(link
) &&
581 !link
->dhcp4_configured
) ||
582 (link_dhcp6_enabled(link
) && !link_dhcp4_enabled(link
) &&
583 !link
->dhcp6_configured
) ||
584 (link_dhcp4_enabled(link
) && link_dhcp6_enabled(link
) &&
585 !link
->dhcp4_configured
&& !link
->dhcp6_configured
))
588 SET_FOREACH(a
, link
->addresses
, i
)
589 if (!address_is_ready(a
))
592 if (link
->state
!= LINK_STATE_CONFIGURED
)
593 link_enter_configured(link
);
598 static int route_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
599 _cleanup_link_unref_ Link
*link
= userdata
;
602 assert(link
->link_messages
> 0);
603 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
604 LINK_STATE_SETTING_ROUTES
, LINK_STATE_FAILED
,
607 link
->link_messages
--;
609 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
612 r
= sd_netlink_message_get_errno(m
);
613 if (r
< 0 && r
!= -EEXIST
)
614 log_link_warning_errno(link
, r
, "Could not set route: %m");
616 if (link
->link_messages
== 0) {
617 log_link_debug(link
, "Routes set");
618 link
->static_configured
= true;
619 link_check_ready(link
);
625 static int link_enter_set_routes(Link
*link
) {
630 assert(link
->network
);
631 assert(link
->state
== LINK_STATE_SETTING_ADDRESSES
);
633 link_set_state(link
, LINK_STATE_SETTING_ROUTES
);
635 LIST_FOREACH(routes
, rt
, link
->network
->static_routes
) {
636 r
= route_configure(rt
, link
, &route_handler
);
638 log_link_warning_errno(link
, r
, "Could not set routes: %m");
639 link_enter_failed(link
);
643 link
->link_messages
++;
646 if (link
->link_messages
== 0) {
647 link
->static_configured
= true;
648 link_check_ready(link
);
650 log_link_debug(link
, "Setting routes");
655 int link_route_remove_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
656 _cleanup_link_unref_ Link
*link
= userdata
;
661 assert(link
->ifname
);
663 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
666 r
= sd_netlink_message_get_errno(m
);
667 if (r
< 0 && r
!= -ESRCH
)
668 log_link_warning_errno(link
, r
, "Could not drop route: %m");
673 static int address_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
674 _cleanup_link_unref_ Link
*link
= userdata
;
680 assert(link
->ifname
);
681 assert(link
->link_messages
> 0);
682 assert(IN_SET(link
->state
, LINK_STATE_SETTING_ADDRESSES
,
683 LINK_STATE_FAILED
, LINK_STATE_LINGER
));
685 link
->link_messages
--;
687 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
690 r
= sd_netlink_message_get_errno(m
);
691 if (r
< 0 && r
!= -EEXIST
)
692 log_link_warning_errno(link
, r
, "could not set address: %m");
694 manager_rtnl_process_address(rtnl
, m
, link
->manager
);
696 if (link
->link_messages
== 0) {
697 log_link_debug(link
, "Addresses set");
698 link_enter_set_routes(link
);
704 static int link_push_dns_to_dhcp_server(Link
*link
, sd_dhcp_server
*s
) {
705 _cleanup_free_
struct in_addr
*addresses
= NULL
;
706 size_t n_addresses
= 0, n_allocated
= 0;
709 log_debug("Copying DNS server information from %s", link
->ifname
);
714 STRV_FOREACH(a
, link
->network
->dns
) {
717 /* Only look for IPv4 addresses */
718 if (inet_pton(AF_INET
, *a
, &ia
) <= 0)
721 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ 1))
724 addresses
[n_addresses
++] = ia
;
727 if (link
->network
->dhcp_dns
&&
729 const struct in_addr
*da
= NULL
;
732 n
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &da
);
735 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ n
))
738 memcpy(addresses
+ n_addresses
, da
, n
* sizeof(struct in_addr
));
743 if (n_addresses
<= 0)
746 return sd_dhcp_server_set_dns(s
, addresses
, n_addresses
);
749 static int link_push_ntp_to_dhcp_server(Link
*link
, sd_dhcp_server
*s
) {
750 _cleanup_free_
struct in_addr
*addresses
= NULL
;
751 size_t n_addresses
= 0, n_allocated
= 0;
757 log_debug("Copying NTP server information from %s", link
->ifname
);
759 STRV_FOREACH(a
, link
->network
->ntp
) {
762 /* Only look for IPv4 addresses */
763 if (inet_pton(AF_INET
, *a
, &ia
) <= 0)
766 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ 1))
769 addresses
[n_addresses
++] = ia
;
772 if (link
->network
->dhcp_ntp
&&
774 const struct in_addr
*da
= NULL
;
777 n
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &da
);
780 if (!GREEDY_REALLOC(addresses
, n_allocated
, n_addresses
+ n
))
783 memcpy(addresses
+ n_addresses
, da
, n
* sizeof(struct in_addr
));
788 if (n_addresses
<= 0)
791 return sd_dhcp_server_set_ntp(s
, addresses
, n_addresses
);
794 static int link_enter_set_addresses(Link
*link
) {
799 assert(link
->network
);
800 assert(link
->state
!= _LINK_STATE_INVALID
);
802 link_set_state(link
, LINK_STATE_SETTING_ADDRESSES
);
804 LIST_FOREACH(addresses
, ad
, link
->network
->static_addresses
) {
805 r
= address_configure(ad
, link
, &address_handler
, false);
807 log_link_warning_errno(link
, r
, "Could not set addresses: %m");
808 link_enter_failed(link
);
812 link
->link_messages
++;
815 /* now that we can figure out a default address for the dhcp server,
817 if (link_dhcp4_server_enabled(link
)) {
820 bool acquired_uplink
= false;
822 address
= link_find_dhcp_server_address(link
);
824 log_link_warning(link
, "Failed to find suitable address for DHCPv4 server instance.");
825 link_enter_failed(link
);
829 /* use the server address' subnet as the pool */
830 r
= sd_dhcp_server_configure_pool(link
->dhcp_server
, &address
->in_addr
.in
, address
->prefixlen
,
831 link
->network
->dhcp_server_pool_offset
, link
->network
->dhcp_server_pool_size
);
836 r = sd_dhcp_server_set_router(link->dhcp_server,
837 &main_address->in_addr.in);
842 if (link
->network
->dhcp_server_max_lease_time_usec
> 0) {
843 r
= sd_dhcp_server_set_max_lease_time(
845 DIV_ROUND_UP(link
->network
->dhcp_server_max_lease_time_usec
, USEC_PER_SEC
));
850 if (link
->network
->dhcp_server_default_lease_time_usec
> 0) {
851 r
= sd_dhcp_server_set_default_lease_time(
853 DIV_ROUND_UP(link
->network
->dhcp_server_default_lease_time_usec
, USEC_PER_SEC
));
858 if (link
->network
->dhcp_server_emit_dns
) {
860 if (link
->network
->n_dhcp_server_dns
> 0)
861 r
= sd_dhcp_server_set_dns(link
->dhcp_server
, link
->network
->dhcp_server_dns
, link
->network
->n_dhcp_server_dns
);
863 uplink
= manager_find_uplink(link
->manager
, link
);
864 acquired_uplink
= true;
867 log_link_debug(link
, "Not emitting DNS server information on link, couldn't find suitable uplink.");
870 r
= link_push_dns_to_dhcp_server(uplink
, link
->dhcp_server
);
873 log_link_warning_errno(link
, r
, "Failed to set DNS server for DHCP server, ignoring: %m");
877 if (link
->network
->dhcp_server_emit_ntp
) {
879 if (link
->network
->n_dhcp_server_ntp
> 0)
880 r
= sd_dhcp_server_set_ntp(link
->dhcp_server
, link
->network
->dhcp_server_ntp
, link
->network
->n_dhcp_server_ntp
);
882 if (!acquired_uplink
)
883 uplink
= manager_find_uplink(link
->manager
, link
);
886 log_link_debug(link
, "Not emitting NTP server information on link, couldn't find suitable uplink.");
889 r
= link_push_ntp_to_dhcp_server(uplink
, link
->dhcp_server
);
893 log_link_warning_errno(link
, r
, "Failed to set NTP server for DHCP server, ignoring: %m");
896 if (link
->network
->dhcp_server_emit_timezone
) {
897 _cleanup_free_
char *buffer
= NULL
;
898 const char *tz
= NULL
;
900 if (link
->network
->dhcp_server_timezone
)
901 tz
= link
->network
->dhcp_server_timezone
;
903 r
= get_timezone(&buffer
);
905 log_warning_errno(r
, "Failed to determine timezone: %m");
911 r
= sd_dhcp_server_set_timezone(link
->dhcp_server
, tz
);
917 r
= sd_dhcp_server_start(link
->dhcp_server
);
919 log_link_warning_errno(link
, r
, "Could not start DHCPv4 server instance: %m");
921 link_enter_failed(link
);
926 log_link_debug(link
, "Offering DHCPv4 leases");
929 if (link
->link_messages
== 0)
930 link_enter_set_routes(link
);
932 log_link_debug(link
, "Setting addresses");
937 int link_address_remove_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
938 _cleanup_link_unref_ Link
*link
= userdata
;
943 assert(link
->ifname
);
945 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
948 r
= sd_netlink_message_get_errno(m
);
949 if (r
< 0 && r
!= -EADDRNOTAVAIL
)
950 log_link_warning_errno(link
, r
, "Could not drop address: %m");
955 static int link_set_bridge_fdb(Link
*const link
) {
959 LIST_FOREACH(static_fdb_entries
, fdb_entry
, link
->network
->static_fdb_entries
) {
960 r
= fdb_entry_configure(link
, fdb_entry
);
962 log_link_error_errno(link
, r
, "Failed to add MAC entry to static MAC table: %m");
970 static int link_set_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
971 _cleanup_link_unref_ Link
*link
= userdata
;
974 log_link_debug(link
, "Set link");
976 r
= sd_netlink_message_get_errno(m
);
977 if (r
< 0 && r
!= -EEXIST
) {
978 log_link_error_errno(link
, r
, "Could not join netdev: %m");
979 link_enter_failed(link
);
986 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
987 _cleanup_link_unref_ Link
*link
= userdata
;
988 const sd_bus_error
*e
;
993 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
996 e
= sd_bus_message_get_error(m
);
998 log_link_warning_errno(link
, sd_bus_error_get_errno(e
), "Could not set hostname: %s", e
->message
);
1003 int link_set_hostname(Link
*link
, const char *hostname
) {
1007 assert(link
->manager
);
1009 log_link_debug(link
, "Setting transient hostname: '%s'", strna(hostname
));
1011 if (!link
->manager
->bus
) {
1012 /* TODO: replace by assert when we can rely on kdbus */
1013 log_link_info(link
, "Not connected to system bus, ignoring transient hostname.");
1017 r
= sd_bus_call_method_async(
1020 "org.freedesktop.hostname1",
1021 "/org/freedesktop/hostname1",
1022 "org.freedesktop.hostname1",
1024 set_hostname_handler
,
1031 return log_link_error_errno(link
, r
, "Could not set transient hostname: %m");
1038 static int set_timezone_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1039 _cleanup_link_unref_ Link
*link
= userdata
;
1040 const sd_bus_error
*e
;
1045 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1048 e
= sd_bus_message_get_error(m
);
1050 log_link_warning_errno(link
, sd_bus_error_get_errno(e
), "Could not set timezone: %s", e
->message
);
1055 int link_set_timezone(Link
*link
, const char *tz
) {
1059 assert(link
->manager
);
1062 log_link_debug(link
, "Setting system timezone: '%s'", tz
);
1064 if (!link
->manager
->bus
) {
1065 log_link_info(link
, "Not connected to system bus, ignoring timezone.");
1069 r
= sd_bus_call_method_async(
1072 "org.freedesktop.timedate1",
1073 "/org/freedesktop/timedate1",
1074 "org.freedesktop.timedate1",
1076 set_timezone_handler
,
1082 return log_link_error_errno(link
, r
, "Could not set timezone: %m");
1089 static int set_mtu_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1090 _cleanup_link_unref_ Link
*link
= userdata
;
1095 assert(link
->ifname
);
1097 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1100 r
= sd_netlink_message_get_errno(m
);
1102 log_link_warning_errno(link
, r
, "Could not set MTU: %m");
1107 int link_set_mtu(Link
*link
, uint32_t mtu
) {
1108 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1112 assert(link
->manager
);
1113 assert(link
->manager
->rtnl
);
1115 log_link_debug(link
, "Setting MTU: %" PRIu32
, mtu
);
1117 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1119 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1121 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, mtu
);
1123 return log_link_error_errno(link
, r
, "Could not append MTU: %m");
1125 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, set_mtu_handler
, link
, 0, NULL
);
1127 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1134 static int link_set_bridge(Link
*link
) {
1135 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1139 assert(link
->network
);
1141 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1143 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1145 r
= sd_rtnl_message_link_set_family(req
, PF_BRIDGE
);
1147 return log_link_error_errno(link
, r
, "Could not set message family: %m");
1149 r
= sd_netlink_message_open_container(req
, IFLA_PROTINFO
);
1151 return log_link_error_errno(link
, r
, "Could not append IFLA_PROTINFO attribute: %m");
1153 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_GUARD
, !link
->network
->use_bpdu
);
1155 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_GUARD attribute: %m");
1157 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_MODE
, link
->network
->hairpin
);
1159 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_MODE attribute: %m");
1161 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_FAST_LEAVE
, link
->network
->fast_leave
);
1163 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_FAST_LEAVE attribute: %m");
1165 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_PROTECT
, !link
->network
->allow_port_to_be_root
);
1167 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_PROTECT attribute: %m");
1169 r
= sd_netlink_message_append_u8(req
, IFLA_BRPORT_UNICAST_FLOOD
, link
->network
->unicast_flood
);
1171 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_UNICAST_FLOOD attribute: %m");
1173 if(link
->network
->cost
!= 0) {
1174 r
= sd_netlink_message_append_u32(req
, IFLA_BRPORT_COST
, link
->network
->cost
);
1176 return log_link_error_errno(link
, r
, "Could not append IFLA_BRPORT_COST attribute: %m");
1179 r
= sd_netlink_message_close_container(req
);
1181 return log_link_error_errno(link
, r
, "Could not append IFLA_LINKINFO attribute: %m");
1183 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_set_handler
, link
, 0, NULL
);
1185 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1192 static void lldp_handler(sd_lldp
*lldp
, int event
, void *userdata
) {
1193 Link
*link
= userdata
;
1197 assert(link
->network
);
1198 assert(link
->manager
);
1201 case SD_LLDP_EVENT_UPDATE_INFO
:
1202 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
1204 log_link_warning_errno(link
, r
, "Could not save LLDP: %m");
1212 static int link_acquire_conf(Link
*link
) {
1216 assert(link
->network
);
1217 assert(link
->manager
);
1218 assert(link
->manager
->event
);
1220 if (link_ipv4ll_enabled(link
)) {
1221 assert(link
->ipv4ll
);
1223 log_link_debug(link
, "Acquiring IPv4 link-local address");
1225 r
= sd_ipv4ll_start(link
->ipv4ll
);
1227 return log_link_warning_errno(link
, r
, "Could not acquire IPv4 link-local address: %m");
1230 if (link_dhcp4_enabled(link
)) {
1231 assert(link
->dhcp_client
);
1233 log_link_debug(link
, "Acquiring DHCPv4 lease");
1235 r
= sd_dhcp_client_start(link
->dhcp_client
);
1237 return log_link_warning_errno(link
, r
, "Could not acquire DHCPv4 lease: %m");
1240 if (link_dhcp6_enabled(link
)) {
1241 assert(link
->ndisc_router_discovery
);
1243 log_link_debug(link
, "Discovering IPv6 routers");
1245 r
= sd_ndisc_router_discovery_start(link
->ndisc_router_discovery
);
1247 return log_link_warning_errno(link
, r
, "Could not start IPv6 Router Discovery: %m");
1250 if (link_lldp_enabled(link
)) {
1253 log_link_debug(link
, "Starting LLDP");
1255 r
= sd_lldp_start(link
->lldp
);
1257 return log_link_warning_errno(link
, r
, "Could not start LLDP: %m");
1263 bool link_has_carrier(Link
*link
) {
1264 /* see Documentation/networking/operstates.txt in the kernel sources */
1266 if (link
->kernel_operstate
== IF_OPER_UP
)
1269 if (link
->kernel_operstate
== IF_OPER_UNKNOWN
)
1270 /* operstate may not be implemented, so fall back to flags */
1271 if ((link
->flags
& IFF_LOWER_UP
) && !(link
->flags
& IFF_DORMANT
))
1277 static int link_up_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1278 _cleanup_link_unref_ Link
*link
= userdata
;
1283 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1286 r
= sd_netlink_message_get_errno(m
);
1288 /* we warn but don't fail the link, as it may be
1290 log_link_warning_errno(link
, r
, "Could not bring up interface: %m");
1295 static int link_up(Link
*link
) {
1296 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1297 uint8_t ipv6ll_mode
;
1301 assert(link
->network
);
1302 assert(link
->manager
);
1303 assert(link
->manager
->rtnl
);
1305 log_link_debug(link
, "Bringing link up");
1307 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_SETLINK
, link
->ifindex
);
1309 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1311 r
= sd_rtnl_message_link_set_flags(req
, IFF_UP
, IFF_UP
);
1313 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1315 if (link
->network
->mac
) {
1316 r
= sd_netlink_message_append_ether_addr(req
, IFLA_ADDRESS
, link
->network
->mac
);
1318 return log_link_error_errno(link
, r
, "Could not set MAC address: %m");
1321 if (link
->network
->mtu
) {
1322 r
= sd_netlink_message_append_u32(req
, IFLA_MTU
, link
->network
->mtu
);
1324 return log_link_error_errno(link
, r
, "Could not set MTU: %m");
1327 r
= sd_netlink_message_open_container(req
, IFLA_AF_SPEC
);
1329 return log_link_error_errno(link
, r
, "Could not open IFLA_AF_SPEC container: %m");
1331 if (socket_ipv6_is_supported()) {
1332 /* if the kernel lacks ipv6 support setting IFF_UP fails if any ipv6 options are passed */
1333 r
= sd_netlink_message_open_container(req
, AF_INET6
);
1335 return log_link_error_errno(link
, r
, "Could not open AF_INET6 container: %m");
1337 ipv6ll_mode
= link_ipv6ll_enabled(link
) ? IN6_ADDR_GEN_MODE_EUI64
: IN6_ADDR_GEN_MODE_NONE
;
1338 r
= sd_netlink_message_append_u8(req
, IFLA_INET6_ADDR_GEN_MODE
, ipv6ll_mode
);
1340 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_ADDR_GEN_MODE: %m");
1342 if (!in_addr_is_null(AF_INET6
, &link
->network
->ipv6_token
)) {
1343 r
= sd_netlink_message_append_in6_addr(req
, IFLA_INET6_TOKEN
, &link
->network
->ipv6_token
.in6
);
1345 return log_link_error_errno(link
, r
, "Could not append IFLA_INET6_TOKEN: %m");
1348 r
= sd_netlink_message_close_container(req
);
1350 return log_link_error_errno(link
, r
, "Could not close AF_INET6 container: %m");
1353 r
= sd_netlink_message_close_container(req
);
1355 return log_link_error_errno(link
, r
, "Could not close IFLA_AF_SPEC container: %m");
1357 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_up_handler
, link
, 0, NULL
);
1359 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1366 static int link_down_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1367 _cleanup_link_unref_ Link
*link
= userdata
;
1372 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1375 r
= sd_netlink_message_get_errno(m
);
1377 log_link_warning_errno(link
, r
, "Could not bring down interface: %m");
1382 static int link_down(Link
*link
) {
1383 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
1387 assert(link
->manager
);
1388 assert(link
->manager
->rtnl
);
1390 log_link_debug(link
, "Bringing link down");
1392 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
,
1393 RTM_SETLINK
, link
->ifindex
);
1395 return log_link_error_errno(link
, r
, "Could not allocate RTM_SETLINK message: %m");
1397 r
= sd_rtnl_message_link_set_flags(req
, 0, IFF_UP
);
1399 return log_link_error_errno(link
, r
, "Could not set link flags: %m");
1401 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
, link_down_handler
, link
, 0, NULL
);
1403 return log_link_error_errno(link
, r
, "Could not send rtnetlink message: %m");
1410 static int link_handle_bound_to_list(Link
*link
) {
1414 bool required_up
= false;
1415 bool link_is_up
= false;
1419 if (hashmap_isempty(link
->bound_to_links
))
1422 if (link
->flags
& IFF_UP
)
1425 HASHMAP_FOREACH (l
, link
->bound_to_links
, i
)
1426 if (link_has_carrier(l
)) {
1431 if (!required_up
&& link_is_up
) {
1432 r
= link_down(link
);
1435 } else if (required_up
&& !link_is_up
) {
1444 static int link_handle_bound_by_list(Link
*link
) {
1451 if (hashmap_isempty(link
->bound_by_links
))
1454 HASHMAP_FOREACH (l
, link
->bound_by_links
, i
) {
1455 r
= link_handle_bound_to_list(l
);
1463 static int link_put_carrier(Link
*link
, Link
*carrier
, Hashmap
**h
) {
1469 if (link
== carrier
)
1472 if (hashmap_get(*h
, INT_TO_PTR(carrier
->ifindex
)))
1475 r
= hashmap_ensure_allocated(h
, NULL
);
1479 r
= hashmap_put(*h
, INT_TO_PTR(carrier
->ifindex
), carrier
);
1486 static int link_new_bound_by_list(Link
*link
) {
1491 bool list_updated
= false;
1494 assert(link
->manager
);
1498 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1499 if (!carrier
->network
)
1502 if (strv_isempty(carrier
->network
->bind_carrier
))
1505 if (strv_fnmatch(carrier
->network
->bind_carrier
, link
->ifname
, 0)) {
1506 r
= link_put_carrier(link
, carrier
, &link
->bound_by_links
);
1510 list_updated
= true;
1517 HASHMAP_FOREACH (carrier
, link
->bound_by_links
, i
) {
1518 r
= link_put_carrier(carrier
, link
, &carrier
->bound_to_links
);
1522 link_dirty(carrier
);
1528 static int link_new_bound_to_list(Link
*link
) {
1533 bool list_updated
= false;
1536 assert(link
->manager
);
1541 if (strv_isempty(link
->network
->bind_carrier
))
1546 HASHMAP_FOREACH (carrier
, m
->links
, i
) {
1547 if (strv_fnmatch(link
->network
->bind_carrier
, carrier
->ifname
, 0)) {
1548 r
= link_put_carrier(link
, carrier
, &link
->bound_to_links
);
1552 list_updated
= true;
1559 HASHMAP_FOREACH (carrier
, link
->bound_to_links
, i
) {
1560 r
= link_put_carrier(carrier
, link
, &carrier
->bound_by_links
);
1564 link_dirty(carrier
);
1570 static int link_new_carrier_maps(Link
*link
) {
1573 r
= link_new_bound_by_list(link
);
1577 r
= link_handle_bound_by_list(link
);
1581 r
= link_new_bound_to_list(link
);
1585 r
= link_handle_bound_to_list(link
);
1592 static void link_free_bound_to_list(Link
*link
) {
1596 HASHMAP_FOREACH (bound_to
, link
->bound_to_links
, i
) {
1597 hashmap_remove(link
->bound_to_links
, INT_TO_PTR(bound_to
->ifindex
));
1599 if (hashmap_remove(bound_to
->bound_by_links
, INT_TO_PTR(link
->ifindex
)))
1600 link_dirty(bound_to
);
1606 static void link_free_bound_by_list(Link
*link
) {
1610 HASHMAP_FOREACH (bound_by
, link
->bound_by_links
, i
) {
1611 hashmap_remove(link
->bound_by_links
, INT_TO_PTR(bound_by
->ifindex
));
1613 if (hashmap_remove(bound_by
->bound_to_links
, INT_TO_PTR(link
->ifindex
))) {
1614 link_dirty(bound_by
);
1615 link_handle_bound_to_list(bound_by
);
1622 static void link_free_carrier_maps(Link
*link
) {
1623 bool list_updated
= false;
1627 if (!hashmap_isempty(link
->bound_to_links
)) {
1628 link_free_bound_to_list(link
);
1629 list_updated
= true;
1632 if (!hashmap_isempty(link
->bound_by_links
)) {
1633 link_free_bound_by_list(link
);
1634 list_updated
= true;
1643 void link_drop(Link
*link
) {
1644 if (!link
|| link
->state
== LINK_STATE_LINGER
)
1647 link_set_state(link
, LINK_STATE_LINGER
);
1649 link_free_carrier_maps(link
);
1651 log_link_debug(link
, "Link removed");
1653 (void)unlink(link
->state_file
);
1659 static int link_joined(Link
*link
) {
1663 assert(link
->network
);
1665 if (!hashmap_isempty(link
->bound_to_links
)) {
1666 r
= link_handle_bound_to_list(link
);
1669 } else if (!(link
->flags
& IFF_UP
)) {
1672 link_enter_failed(link
);
1677 if(link
->network
->bridge
) {
1678 r
= link_set_bridge(link
);
1680 log_link_error_errno(link
, r
, "Could not set bridge message: %m");
1683 return link_enter_set_addresses(link
);
1686 static int netdev_join_handler(sd_netlink
*rtnl
, sd_netlink_message
*m
, void *userdata
) {
1687 _cleanup_link_unref_ Link
*link
= userdata
;
1691 assert(link
->network
);
1695 if (IN_SET(link
->state
, LINK_STATE_FAILED
, LINK_STATE_LINGER
))
1698 r
= sd_netlink_message_get_errno(m
);
1699 if (r
< 0 && r
!= -EEXIST
) {
1700 log_link_error_errno(link
, r
, "Could not join netdev: %m");
1701 link_enter_failed(link
);
1704 log_link_debug(link
, "Joined netdev");
1706 if (link
->enslaving
<= 0)
1712 static int link_enter_join_netdev(Link
*link
) {
1718 assert(link
->network
);
1719 assert(link
->state
== LINK_STATE_PENDING
);
1721 link_set_state(link
, LINK_STATE_ENSLAVING
);
1725 if (!link
->network
->bridge
&&
1726 !link
->network
->bond
&&
1727 hashmap_isempty(link
->network
->stacked_netdevs
))
1728 return link_joined(link
);
1730 if (link
->network
->bond
) {
1731 log_struct(LOG_DEBUG
,
1732 LOG_LINK_INTERFACE(link
),
1733 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1734 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bond
->ifname
),
1737 r
= netdev_join(link
->network
->bond
, link
, netdev_join_handler
);
1739 log_struct_errno(LOG_WARNING
, r
,
1740 LOG_LINK_INTERFACE(link
),
1741 LOG_NETDEV_INTERFACE(link
->network
->bond
),
1742 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bond
->ifname
),
1745 link_enter_failed(link
);
1752 if (link
->network
->bridge
) {
1753 log_struct(LOG_DEBUG
,
1754 LOG_LINK_INTERFACE(link
),
1755 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1756 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", link
->network
->bridge
->ifname
),
1759 r
= netdev_join(link
->network
->bridge
, link
, netdev_join_handler
);
1761 log_struct_errno(LOG_WARNING
, r
,
1762 LOG_LINK_INTERFACE(link
),
1763 LOG_NETDEV_INTERFACE(link
->network
->bridge
),
1764 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", link
->network
->bridge
->ifname
),
1766 link_enter_failed(link
);
1773 HASHMAP_FOREACH(netdev
, link
->network
->stacked_netdevs
, i
) {
1775 log_struct(LOG_DEBUG
,
1776 LOG_LINK_INTERFACE(link
),
1777 LOG_NETDEV_INTERFACE(netdev
),
1778 LOG_LINK_MESSAGE(link
, "Enslaving by '%s'", netdev
->ifname
),
1781 r
= netdev_join(netdev
, link
, netdev_join_handler
);
1783 log_struct_errno(LOG_WARNING
, r
,
1784 LOG_LINK_INTERFACE(link
),
1785 LOG_NETDEV_INTERFACE(netdev
),
1786 LOG_LINK_MESSAGE(link
, "Could not join netdev '%s': %m", netdev
->ifname
),
1788 link_enter_failed(link
);
1798 static int link_set_ipv4_forward(Link
*link
) {
1799 const char *p
= NULL
, *v
;
1802 if (link
->flags
& IFF_LOOPBACK
)
1805 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1808 p
= strjoina("/proc/sys/net/ipv4/conf/", link
->ifname
, "/forwarding");
1809 v
= one_zero(link_ipv4_forward_enabled(link
));
1811 r
= write_string_file(p
, v
, 0);
1813 /* If the right value is set anyway, don't complain */
1814 if (verify_one_line_file(p
, v
) > 0)
1817 log_link_warning_errno(link
, r
, "Cannot configure IPv4 forwarding for interface %s: %m", link
->ifname
);
1823 static int link_set_ipv6_forward(Link
*link
) {
1824 const char *p
= NULL
, *v
= NULL
;
1827 /* Make this a NOP if IPv6 is not available */
1828 if (!socket_ipv6_is_supported())
1831 if (link
->flags
& IFF_LOOPBACK
)
1834 if (link
->network
->ip_forward
== _ADDRESS_FAMILY_BOOLEAN_INVALID
)
1837 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/forwarding");
1838 v
= one_zero(link_ipv6_forward_enabled(link
));
1840 r
= write_string_file(p
, v
, 0);
1842 /* If the right value is set anyway, don't complain */
1843 if (verify_one_line_file(p
, v
) > 0)
1846 log_link_warning_errno(link
, r
, "Cannot configure IPv6 forwarding for interface: %m");
1852 static int link_set_ipv6_privacy_extensions(Link
*link
) {
1853 char buf
[DECIMAL_STR_MAX(unsigned) + 1];
1854 IPv6PrivacyExtensions s
;
1855 const char *p
= NULL
;
1858 /* Make this a NOP if IPv6 is not available */
1859 if (!socket_ipv6_is_supported())
1862 s
= link_ipv6_privacy_extensions(link
);
1863 if (s
== _IPV6_PRIVACY_EXTENSIONS_INVALID
)
1866 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/use_tempaddr");
1867 xsprintf(buf
, "%u", link
->network
->ipv6_privacy_extensions
);
1869 r
= write_string_file(p
, buf
, 0);
1871 /* If the right value is set anyway, don't complain */
1872 if (verify_one_line_file(p
, buf
) > 0)
1875 log_link_warning_errno(link
, r
, "Cannot configure IPv6 privacy extension for interface: %m");
1881 static int link_set_ipv6_accept_ra(Link
*link
) {
1882 const char *p
= NULL
, *v
= NULL
;
1885 /* Make this a NOP if IPv6 is not available */
1886 if (!socket_ipv6_is_supported())
1889 if (link
->flags
& IFF_LOOPBACK
)
1892 /* If unset use system default (enabled if local forwarding is disabled.
1893 * disabled if local forwarding is enabled).
1894 * If set, ignore or enforce RA independent of local forwarding state.
1896 if (link
->network
->ipv6_accept_ra
< 0)
1897 /* default to accept RA if ip_forward is disabled and ignore RA if ip_forward is enabled */
1899 else if (link
->network
->ipv6_accept_ra
> 0)
1900 /* "2" means accept RA even if ip_forward is enabled */
1903 /* "0" means ignore RA */
1906 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/accept_ra");
1908 r
= write_string_file(p
, v
, 0);
1910 /* If the right value is set anyway, don't complain */
1911 if (verify_one_line_file(p
, v
) > 0)
1914 log_link_warning_errno(link
, r
, "Cannot configure IPv6 accept_ra for interface: %m");
1920 static int link_set_ipv6_dad_transmits(Link
*link
) {
1921 char buf
[DECIMAL_STR_MAX(unsigned) + 1];
1922 const char *p
= NULL
;
1925 /* Make this a NOP if IPv6 is not available */
1926 if (!socket_ipv6_is_supported())
1929 if (link
->flags
& IFF_LOOPBACK
)
1932 if (link
->network
->ipv6_dad_transmits
< 0)
1935 p
= strjoina("/proc/sys/net/ipv6/conf/", link
->ifname
, "/dad_transmits");
1937 xsprintf(buf
, "%u", link
->network
->ipv6_dad_transmits
);
1939 r
= write_string_file(p
, buf
, 0);
1941 /* If the right value is set anyway, don't complain */
1942 if (verify_one_line_file(p
, buf
) > 0)
1945 log_link_warning_errno(link
, r
, "Cannot set IPv6 dad transmits for interface: %m");
1951 static int link_configure(Link
*link
) {
1955 assert(link
->network
);
1956 assert(link
->state
== LINK_STATE_PENDING
);
1958 r
= link_set_bridge_fdb(link
);
1962 r
= link_set_ipv4_forward(link
);
1966 r
= link_set_ipv6_forward(link
);
1970 r
= link_set_ipv6_privacy_extensions(link
);
1974 r
= link_set_ipv6_accept_ra(link
);
1978 r
= link_set_ipv6_dad_transmits(link
);
1982 if (link_ipv4ll_enabled(link
)) {
1983 r
= ipv4ll_configure(link
);
1988 if (link_dhcp4_enabled(link
)) {
1989 r
= dhcp4_configure(link
);
1994 if (link_dhcp4_server_enabled(link
)) {
1995 r
= sd_dhcp_server_new(&link
->dhcp_server
, link
->ifindex
);
1999 r
= sd_dhcp_server_attach_event(link
->dhcp_server
, NULL
, 0);
2004 if (link_dhcp6_enabled(link
)) {
2005 r
= ndisc_configure(link
);
2010 if (link_lldp_enabled(link
)) {
2011 r
= sd_lldp_new(link
->ifindex
, link
->ifname
, &link
->mac
, &link
->lldp
);
2015 r
= sd_lldp_attach_event(link
->lldp
, NULL
, 0);
2019 r
= sd_lldp_set_callback(link
->lldp
,
2020 lldp_handler
, link
);
2025 if (link_has_carrier(link
)) {
2026 r
= link_acquire_conf(link
);
2031 return link_enter_join_netdev(link
);
2034 static int link_initialized_and_synced(sd_netlink
*rtnl
, sd_netlink_message
*m
,
2036 _cleanup_link_unref_ Link
*link
= userdata
;
2041 assert(link
->ifname
);
2042 assert(link
->manager
);
2044 if (link
->state
!= LINK_STATE_PENDING
)
2047 log_link_debug(link
, "Link state is up-to-date");
2049 r
= link_new_bound_by_list(link
);
2053 r
= link_handle_bound_by_list(link
);
2057 r
= network_get(link
->manager
, link
->udev_device
, link
->ifname
,
2058 &link
->mac
, &network
);
2060 link_enter_unmanaged(link
);
2065 if (link
->flags
& IFF_LOOPBACK
) {
2066 if (network
->link_local
!= ADDRESS_FAMILY_NO
)
2067 log_link_debug(link
, "Ignoring link-local autoconfiguration for loopback link");
2069 if (network
->dhcp
!= ADDRESS_FAMILY_NO
)
2070 log_link_debug(link
, "Ignoring DHCP clients for loopback link");
2072 if (network
->dhcp_server
)
2073 log_link_debug(link
, "Ignoring DHCP server for loopback link");
2076 r
= network_apply(link
->manager
, network
, link
);
2080 r
= link_new_bound_to_list(link
);
2084 r
= link_configure(link
);
2091 int link_initialized(Link
*link
, struct udev_device
*device
) {
2092 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
;
2096 assert(link
->manager
);
2097 assert(link
->manager
->rtnl
);
2100 if (link
->state
!= LINK_STATE_PENDING
)
2103 if (link
->udev_device
)
2106 log_link_debug(link
, "udev initialized link");
2108 link
->udev_device
= udev_device_ref(device
);
2110 /* udev has initialized the link, but we don't know if we have yet
2111 * processed the NEWLINK messages with the latest state. Do a GETLINK,
2112 * when it returns we know that the pending NEWLINKs have already been
2113 * processed and that we are up-to-date */
2115 r
= sd_rtnl_message_new_link(link
->manager
->rtnl
, &req
, RTM_GETLINK
,
2120 r
= sd_netlink_call_async(link
->manager
->rtnl
, req
,
2121 link_initialized_and_synced
, link
, 0, NULL
);
2130 int link_add(Manager
*m
, sd_netlink_message
*message
, Link
**ret
) {
2132 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
2133 char ifindex_str
[2 + DECIMAL_STR_MAX(int)];
2141 r
= link_new(m
, message
, ret
);
2147 log_link_debug(link
, "Link %d added", link
->ifindex
);
2149 if (detect_container() <= 0) {
2150 /* not in a container, udev will be around */
2151 sprintf(ifindex_str
, "n%d", link
->ifindex
);
2152 device
= udev_device_new_from_device_id(m
->udev
, ifindex_str
);
2154 r
= log_link_warning_errno(link
, errno
, "Could not find udev device: %m");
2158 if (udev_device_get_is_initialized(device
) <= 0) {
2160 log_link_debug(link
, "link pending udev initialization...");
2164 r
= link_initialized(link
, device
);
2168 /* we are calling a callback directly, so must take a ref */
2171 r
= link_initialized_and_synced(m
->rtnl
, NULL
, link
);
2178 link_enter_failed(link
);
2182 static int link_carrier_gained(Link
*link
) {
2187 if (link
->network
) {
2188 r
= link_acquire_conf(link
);
2190 link_enter_failed(link
);
2195 r
= link_handle_bound_by_list(link
);
2202 static int link_carrier_lost(Link
*link
) {
2207 r
= link_stop_clients(link
);
2209 link_enter_failed(link
);
2213 r
= link_handle_bound_by_list(link
);
2220 int link_carrier_reset(Link
*link
) {
2225 if (link_has_carrier(link
)) {
2226 r
= link_carrier_lost(link
);
2230 r
= link_carrier_gained(link
);
2234 log_link_info(link
, "Reset carrier");
2241 int link_update(Link
*link
, sd_netlink_message
*m
) {
2242 struct ether_addr mac
;
2245 bool had_carrier
, carrier_gained
, carrier_lost
;
2249 assert(link
->ifname
);
2252 if (link
->state
== LINK_STATE_LINGER
) {
2254 log_link_info(link
, "Link readded");
2255 link_set_state(link
, LINK_STATE_ENSLAVING
);
2257 r
= link_new_carrier_maps(link
);
2262 r
= sd_netlink_message_read_string(m
, IFLA_IFNAME
, &ifname
);
2263 if (r
>= 0 && !streq(ifname
, link
->ifname
)) {
2264 log_link_info(link
, "Renamed to %s", ifname
);
2266 link_free_carrier_maps(link
);
2268 r
= free_and_strdup(&link
->ifname
, ifname
);
2272 r
= link_new_carrier_maps(link
);
2277 r
= sd_netlink_message_read_u32(m
, IFLA_MTU
, &mtu
);
2278 if (r
>= 0 && mtu
> 0) {
2280 if (!link
->original_mtu
) {
2281 link
->original_mtu
= mtu
;
2282 log_link_debug(link
, "Saved original MTU: %" PRIu32
, link
->original_mtu
);
2285 if (link
->dhcp_client
) {
2286 r
= sd_dhcp_client_set_mtu(link
->dhcp_client
,
2289 log_link_warning_errno(link
, r
, "Could not update MTU in DHCP client: %m");
2295 /* The kernel may broadcast NEWLINK messages without the MAC address
2296 set, simply ignore them. */
2297 r
= sd_netlink_message_read_ether_addr(m
, IFLA_ADDRESS
, &mac
);
2299 if (memcmp(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2302 memcpy(link
->mac
.ether_addr_octet
, mac
.ether_addr_octet
,
2305 log_link_debug(link
, "MAC address: "
2306 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2307 mac
.ether_addr_octet
[0],
2308 mac
.ether_addr_octet
[1],
2309 mac
.ether_addr_octet
[2],
2310 mac
.ether_addr_octet
[3],
2311 mac
.ether_addr_octet
[4],
2312 mac
.ether_addr_octet
[5]);
2315 r
= sd_ipv4ll_set_mac(link
->ipv4ll
, &link
->mac
);
2317 return log_link_warning_errno(link
, r
, "Could not update MAC address in IPv4LL client: %m");
2320 if (link
->dhcp_client
) {
2321 r
= sd_dhcp_client_set_mac(link
->dhcp_client
,
2322 (const uint8_t *) &link
->mac
,
2326 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCP client: %m");
2329 if (link
->dhcp6_client
) {
2330 r
= sd_dhcp6_client_set_mac(link
->dhcp6_client
,
2331 (const uint8_t *) &link
->mac
,
2335 return log_link_warning_errno(link
, r
, "Could not update MAC address in DHCPv6 client: %m");
2340 had_carrier
= link_has_carrier(link
);
2342 r
= link_update_flags(link
, m
);
2346 carrier_gained
= !had_carrier
&& link_has_carrier(link
);
2347 carrier_lost
= had_carrier
&& !link_has_carrier(link
);
2349 if (carrier_gained
) {
2350 log_link_info(link
, "Gained carrier");
2352 r
= link_carrier_gained(link
);
2355 } else if (carrier_lost
) {
2356 log_link_info(link
, "Lost carrier");
2358 r
= link_carrier_lost(link
);
2367 int link_save(Link
*link
) {
2368 _cleanup_free_
char *temp_path
= NULL
;
2369 _cleanup_fclose_
FILE *f
= NULL
;
2370 const char *admin_state
, *oper_state
;
2376 assert(link
->state_file
);
2377 assert(link
->lease_file
);
2378 assert(link
->manager
);
2380 if (link
->state
== LINK_STATE_LINGER
) {
2381 unlink(link
->state_file
);
2385 admin_state
= link_state_to_string(link
->state
);
2386 assert(admin_state
);
2388 oper_state
= link_operstate_to_string(link
->operstate
);
2391 r
= fopen_temporary(link
->state_file
, &f
, &temp_path
);
2395 fchmod(fileno(f
), 0644);
2398 "# This is private data. Do not parse.\n"
2401 admin_state
, oper_state
);
2403 if (link
->network
) {
2404 char **address
, **domain
;
2406 sd_dhcp6_lease
*dhcp6_lease
= NULL
;
2408 if (link
->dhcp6_client
) {
2409 r
= sd_dhcp6_client_get_lease(link
->dhcp6_client
,
2412 log_link_debug(link
, "No DHCPv6 lease");
2415 fprintf(f
, "NETWORK_FILE=%s\n", link
->network
->filename
);
2419 STRV_FOREACH(address
, link
->network
->dns
) {
2426 if (link
->network
->dhcp_dns
&&
2428 const struct in_addr
*addresses
;
2430 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
2434 serialize_in_addrs(f
, addresses
, r
);
2439 if (link
->network
->dhcp_dns
&& dhcp6_lease
) {
2440 struct in6_addr
*in6_addrs
;
2442 r
= sd_dhcp6_lease_get_dns(dhcp6_lease
, &in6_addrs
);
2446 serialize_in6_addrs(f
, in6_addrs
, r
);
2454 STRV_FOREACH(address
, link
->network
->ntp
) {
2461 if (link
->network
->dhcp_ntp
&&
2463 const struct in_addr
*addresses
;
2465 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
2469 serialize_in_addrs(f
, addresses
, r
);
2474 if (link
->network
->dhcp_ntp
&& dhcp6_lease
) {
2475 struct in6_addr
*in6_addrs
;
2479 r
= sd_dhcp6_lease_get_ntp_addrs(dhcp6_lease
,
2484 serialize_in6_addrs(f
, in6_addrs
, r
);
2488 r
= sd_dhcp6_lease_get_ntp_fqdn(dhcp6_lease
, &hosts
);
2490 STRV_FOREACH(hostname
, hosts
) {
2493 fputs(*hostname
, f
);
2501 fprintf(f
, "DOMAINS=");
2503 STRV_FOREACH(domain
, link
->network
->domains
) {
2510 if (link
->network
->dhcp_domains
&&
2512 const char *domainname
;
2514 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
2518 fputs(domainname
, f
);
2523 if (link
->network
->dhcp_domains
&& dhcp6_lease
) {
2526 r
= sd_dhcp6_lease_get_domains(dhcp6_lease
, &domains
);
2528 STRV_FOREACH(domain
, domains
) {
2539 fprintf(f
, "WILDCARD_DOMAIN=%s\n",
2540 yes_no(link
->network
->wildcard_domain
));
2542 fprintf(f
, "LLMNR=%s\n",
2543 resolve_support_to_string(link
->network
->llmnr
));
2545 fprintf(f
, "ADDRESSES=");
2547 SET_FOREACH(a
, link
->addresses
, i
) {
2548 _cleanup_free_
char *address_str
= NULL
;
2550 r
= in_addr_to_string(a
->family
, &a
->in_addr
, &address_str
);
2554 fprintf(f
, "%s%s/%u", space
? " " : "", address_str
, a
->prefixlen
);
2561 if (!hashmap_isempty(link
->bound_to_links
)) {
2565 fputs("CARRIER_BOUND_TO=", f
);
2566 HASHMAP_FOREACH(carrier
, link
->bound_to_links
, i
) {
2569 fputs(carrier
->ifname
, f
);
2576 if (!hashmap_isempty(link
->bound_by_links
)) {
2580 fputs("CARRIER_BOUND_BY=", f
);
2581 HASHMAP_FOREACH(carrier
, link
->bound_by_links
, i
) {
2584 fputs(carrier
->ifname
, f
);
2591 if (link
->dhcp_lease
) {
2592 const char *tz
= NULL
;
2594 r
= sd_dhcp_lease_get_timezone(link
->dhcp_lease
, &tz
);
2596 fprintf(f
, "TIMEZONE=%s\n", tz
);
2599 if (link
->dhcp_lease
) {
2600 assert(link
->network
);
2602 r
= dhcp_lease_save(link
->dhcp_lease
, link
->lease_file
);
2610 unlink(link
->lease_file
);
2613 assert(link
->network
);
2615 r
= sd_lldp_save(link
->lldp
, link
->lldp_file
);
2623 unlink(link
->lldp_file
);
2625 r
= fflush_and_check(f
);
2629 if (rename(temp_path
, link
->state_file
) < 0) {
2637 (void) unlink(link
->state_file
);
2639 (void) unlink(temp_path
);
2641 return log_link_error_errno(link
, r
, "Failed to save link data to %s: %m", link
->state_file
);
2644 /* The serialized state in /run is no longer up-to-date. */
2645 void link_dirty(Link
*link
) {
2650 r
= set_ensure_allocated(&link
->manager
->dirty_links
, NULL
);
2652 /* allocation errors are ignored */
2655 r
= set_put(link
->manager
->dirty_links
, link
);
2657 /* allocation errors are ignored */
2663 /* The serialized state in /run is up-to-date */
2664 void link_clean(Link
*link
) {
2666 assert(link
->manager
);
2668 set_remove(link
->manager
->dirty_links
, link
);
2672 static const char* const link_state_table
[_LINK_STATE_MAX
] = {
2673 [LINK_STATE_PENDING
] = "pending",
2674 [LINK_STATE_ENSLAVING
] = "configuring",
2675 [LINK_STATE_SETTING_ADDRESSES
] = "configuring",
2676 [LINK_STATE_SETTING_ROUTES
] = "configuring",
2677 [LINK_STATE_CONFIGURED
] = "configured",
2678 [LINK_STATE_UNMANAGED
] = "unmanaged",
2679 [LINK_STATE_FAILED
] = "failed",
2680 [LINK_STATE_LINGER
] = "linger",
2683 DEFINE_STRING_TABLE_LOOKUP(link_state
, LinkState
);
2685 static const char* const link_operstate_table
[_LINK_OPERSTATE_MAX
] = {
2686 [LINK_OPERSTATE_OFF
] = "off",
2687 [LINK_OPERSTATE_NO_CARRIER
] = "no-carrier",
2688 [LINK_OPERSTATE_DORMANT
] = "dormant",
2689 [LINK_OPERSTATE_CARRIER
] = "carrier",
2690 [LINK_OPERSTATE_DEGRADED
] = "degraded",
2691 [LINK_OPERSTATE_ROUTABLE
] = "routable",
2694 DEFINE_STRING_TABLE_LOOKUP(link_operstate
, LinkOperationalState
);