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 "networkd-link.h"
27 #include "networkd-netdev.h"
28 #include "libudev-private.h"
29 #include "udev-util.h"
33 #include "network-internal.h"
34 #include "conf-parser.h"
36 #include "dhcp-lease-internal.h"
38 static bool link_dhcp6_enabled(Link *link) {
39 if (link->flags & IFF_LOOPBACK)
45 return IN_SET(link->network->dhcp, DHCP_SUPPORT_V6, DHCP_SUPPORT_BOTH);
48 static bool link_dhcp4_enabled(Link *link) {
49 if (link->flags & IFF_LOOPBACK)
55 return IN_SET(link->network->dhcp, DHCP_SUPPORT_V4, DHCP_SUPPORT_BOTH);
58 static bool link_dhcp4_server_enabled(Link *link) {
59 if (link->flags & IFF_LOOPBACK)
65 return link->network->dhcp_server;
68 static bool link_ipv4ll_enabled(Link *link) {
69 if (link->flags & IFF_LOOPBACK)
75 return link->network->ipv4ll;
78 static bool link_lldp_enabled(Link *link) {
79 if (link->flags & IFF_LOOPBACK)
85 if(link->network->bridge)
88 return link->network->lldp;
91 #define FLAG_STRING(string, flag, old, new) \
92 (((old ^ new) & flag) \
93 ? ((old & flag) ? (" -" string) : (" +" string)) \
96 static int link_update_flags(Link *link, sd_rtnl_message *m) {
97 unsigned flags, unknown_flags_added, unknown_flags_removed, unknown_flags;
103 r = sd_rtnl_message_link_get_flags(m, &flags);
105 log_link_warning(link, "Could not get link flags");
109 r = sd_rtnl_message_read_u8(m, IFLA_OPERSTATE, &operstate);
111 /* if we got a message without operstate, take it to mean
112 the state was unchanged */
113 operstate = link->kernel_operstate;
115 if ((link->flags == flags) && (link->kernel_operstate == operstate))
118 if (link->flags != flags) {
119 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",
120 FLAG_STRING("LOOPBACK", IFF_LOOPBACK, link->flags, flags),
121 FLAG_STRING("MASTER", IFF_MASTER, link->flags, flags),
122 FLAG_STRING("SLAVE", IFF_SLAVE, link->flags, flags),
123 FLAG_STRING("UP", IFF_UP, link->flags, flags),
124 FLAG_STRING("DORMANT", IFF_DORMANT, link->flags, flags),
125 FLAG_STRING("LOWER_UP", IFF_LOWER_UP, link->flags, flags),
126 FLAG_STRING("RUNNING", IFF_RUNNING, link->flags, flags),
127 FLAG_STRING("MULTICAST", IFF_MULTICAST, link->flags, flags),
128 FLAG_STRING("BROADCAST", IFF_BROADCAST, link->flags, flags),
129 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT, link->flags, flags),
130 FLAG_STRING("PROMISC", IFF_PROMISC, link->flags, flags),
131 FLAG_STRING("ALLMULTI", IFF_ALLMULTI, link->flags, flags),
132 FLAG_STRING("PORTSEL", IFF_PORTSEL, link->flags, flags),
133 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA, link->flags, flags),
134 FLAG_STRING("DYNAMIC", IFF_DYNAMIC, link->flags, flags),
135 FLAG_STRING("NOARP", IFF_NOARP, link->flags, flags),
136 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS, link->flags, flags),
137 FLAG_STRING("DEBUG", IFF_DEBUG, link->flags, flags),
138 FLAG_STRING("ECHO", IFF_ECHO, link->flags, flags));
140 unknown_flags = ~(IFF_LOOPBACK | IFF_MASTER | IFF_SLAVE | IFF_UP |
141 IFF_DORMANT | IFF_LOWER_UP | IFF_RUNNING |
142 IFF_MULTICAST | IFF_BROADCAST | IFF_POINTOPOINT |
143 IFF_PROMISC | IFF_ALLMULTI | IFF_PORTSEL |
144 IFF_AUTOMEDIA | IFF_DYNAMIC | IFF_NOARP |
145 IFF_NOTRAILERS | IFF_DEBUG | IFF_ECHO);
146 unknown_flags_added = ((link->flags ^ flags) & flags & unknown_flags);
147 unknown_flags_removed = ((link->flags ^ flags) & link->flags & unknown_flags);
149 /* link flags are currently at most 18 bits, let's align to
151 if (unknown_flags_added)
153 "unknown link flags gained: %#.5x (ignoring)",
154 unknown_flags_added);
156 if (unknown_flags_removed)
158 "unknown link flags lost: %#.5x (ignoring)",
159 unknown_flags_removed);
163 link->kernel_operstate = operstate;
170 static int link_new(Manager *manager, sd_rtnl_message *message, Link **ret) {
171 _cleanup_link_unref_ Link *link = NULL;
180 r = sd_rtnl_message_get_type(message, &type);
183 else if (type != RTM_NEWLINK)
186 r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
189 else if (ifindex <= 0)
192 r = sd_rtnl_message_read_string(message, IFLA_IFNAME, &ifname);
196 link = new0(Link, 1);
201 link->manager = manager;
202 link->state = LINK_STATE_PENDING;
203 link->ifindex = ifindex;
204 link->ifname = strdup(ifname);
208 r = sd_rtnl_message_read_ether_addr(message, IFLA_ADDRESS, &link->mac);
210 log_link_debug(link, "MAC address not found for new device, continuing without");
212 r = asprintf(&link->state_file, "/run/systemd/netif/links/%d",
217 r = asprintf(&link->lease_file, "/run/systemd/netif/leases/%d",
222 r = asprintf(&link->lldp_file, "/run/systemd/netif/lldp/%d",
228 r = hashmap_ensure_allocated(&manager->links, NULL);
232 r = hashmap_put(manager->links, INT_TO_PTR(link->ifindex), link);
236 r = link_update_flags(link, message);
246 static void link_free(Link *link) {
252 while ((address = link->addresses)) {
253 LIST_REMOVE(addresses, link->addresses, address);
254 address_free(address);
257 while ((address = link->pool_addresses)) {
258 LIST_REMOVE(addresses, link->pool_addresses, address);
259 address_free(address);
262 sd_dhcp_client_unref(link->dhcp_client);
263 sd_dhcp_lease_unref(link->dhcp_lease);
265 unlink(link->lease_file);
266 free(link->lease_file);
268 unlink(link->lldp_file);
269 free(link->lldp_file);
271 sd_ipv4ll_unref(link->ipv4ll);
272 sd_dhcp6_client_unref(link->dhcp6_client);
273 sd_icmp6_nd_unref(link->icmp6_router_discovery);
276 hashmap_remove(link->manager->links, INT_TO_PTR(link->ifindex));
280 unlink(link->state_file);
281 free(link->state_file);
283 udev_device_unref(link->udev_device);
288 Link *link_unref(Link *link) {
289 if (link && (-- link->n_ref <= 0))
295 Link *link_ref(Link *link) {
297 assert_se(++ link->n_ref >= 2);
302 int link_get(Manager *m, int ifindex, Link **ret) {
309 link = hashmap_get(m->links, INT_TO_PTR(ifindex));
318 void link_drop(Link *link) {
319 if (!link || link->state == LINK_STATE_LINGER)
322 link->state = LINK_STATE_LINGER;
324 log_link_debug(link, "link removed");
331 static void link_enter_unmanaged(Link *link) {
334 log_link_debug(link, "unmanaged");
336 link->state = LINK_STATE_UNMANAGED;
341 static int link_stop_clients(Link *link) {
345 assert(link->manager);
346 assert(link->manager->event);
351 if (link->dhcp_client) {
352 k = sd_dhcp_client_stop(link->dhcp_client);
354 log_link_warning(link, "Could not stop DHCPv4 client: %s",
361 k = sd_ipv4ll_stop(link->ipv4ll);
363 log_link_warning(link, "Could not stop IPv4 link-local: %s",
369 if(link->icmp6_router_discovery) {
371 if (link->dhcp6_client) {
372 k = sd_dhcp6_client_stop(link->dhcp6_client);
374 log_link_warning(link, "Could not stop DHCPv6 client: %s",
380 k = sd_icmp6_nd_stop(link->icmp6_router_discovery);
382 log_link_warning(link,
383 "Could not stop ICMPv6 router discovery: %s",
391 k = sd_lldp_stop(link->lldp);
393 log_link_warning(link, "Could not stop LLDP : %s",
402 void link_enter_failed(Link *link) {
405 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
408 log_link_warning(link, "failed");
410 link->state = LINK_STATE_FAILED;
412 link_stop_clients(link);
417 static Address* link_find_dhcp_server_address(Link *link) {
421 assert(link->network);
423 /* The the first statically configured address if there is any */
424 LIST_FOREACH(addresses, address, link->network->static_addresses) {
426 if (address->family != AF_INET)
429 if (in_addr_is_null(address->family, &address->in_addr))
435 /* If that didn't work, find a suitable address we got from the pool */
436 LIST_FOREACH(addresses, address, link->pool_addresses) {
437 if (address->family != AF_INET)
446 static int link_enter_configured(Link *link) {
450 assert(link->network);
451 assert(link->state == LINK_STATE_SETTING_ROUTES);
453 if (link_dhcp4_server_enabled(link) &&
454 !sd_dhcp_server_is_running(link->dhcp_server)) {
455 struct in_addr pool_start;
458 address = link_find_dhcp_server_address(link);
460 log_link_warning(link,
461 "Failed to find suitable address for DHCPv4 server instance.");
462 link_enter_failed(link);
466 log_link_debug(link, "offering DHCPv4 leases");
468 r = sd_dhcp_server_set_address(link->dhcp_server,
469 &address->in_addr.in,
474 /* offer 32 addresses starting from the address following the server address */
475 pool_start.s_addr = htobe32(be32toh(address->in_addr.in.s_addr) + 1);
476 r = sd_dhcp_server_set_lease_pool(link->dhcp_server,
482 r = sd_dhcp_server_set_router(link->dhcp_server,
483 &main_address->in_addr.in);
487 r = sd_dhcp_server_set_prefixlen(link->dhcp_server,
488 main_address->prefixlen);
493 r = sd_dhcp_server_start(link->dhcp_server);
495 log_link_warning(link, "could not start DHCPv4 server "
496 "instance: %s", strerror(-r));
498 link_enter_failed(link);
504 log_link_info(link, "link configured");
506 link->state = LINK_STATE_CONFIGURED;
513 void link_client_handler(Link *link) {
515 assert(link->network);
517 if (!link->static_configured)
520 if (link_ipv4ll_enabled(link))
521 if (!link->ipv4ll_address ||
525 if (link_dhcp4_enabled(link) && !link->dhcp4_configured)
528 if (link->state != LINK_STATE_CONFIGURED)
529 link_enter_configured(link);
534 static int route_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
535 _cleanup_link_unref_ Link *link = userdata;
538 assert(link->link_messages > 0);
539 assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
540 LINK_STATE_SETTING_ROUTES, LINK_STATE_FAILED,
543 link->link_messages --;
545 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
548 r = sd_rtnl_message_get_errno(m);
549 if (r < 0 && r != -EEXIST)
550 log_link_warning_errno(link, -r, "%-*s: could not set route: %m", IFNAMSIZ, link->ifname);
552 if (link->link_messages == 0) {
553 log_link_debug(link, "routes set");
554 link->static_configured = true;
555 link_client_handler(link);
561 static int link_enter_set_routes(Link *link) {
566 assert(link->network);
567 assert(link->state == LINK_STATE_SETTING_ADDRESSES);
569 link->state = LINK_STATE_SETTING_ROUTES;
571 LIST_FOREACH(routes, rt, link->network->static_routes) {
572 r = route_configure(rt, link, &route_handler);
574 log_link_warning(link,
575 "could not set routes: %s",
577 link_enter_failed(link);
581 link->link_messages ++;
584 if (link->link_messages == 0) {
585 link->static_configured = true;
586 link_client_handler(link);
588 log_link_debug(link, "setting routes");
593 int link_route_drop_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
594 _cleanup_link_unref_ Link *link = userdata;
599 assert(link->ifname);
601 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
604 r = sd_rtnl_message_get_errno(m);
605 if (r < 0 && r != -ESRCH)
606 log_link_warning_errno(link, -r, "%-*s: could not drop route: %m", IFNAMSIZ, link->ifname);
611 static int address_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
612 _cleanup_link_unref_ Link *link = userdata;
618 assert(link->ifname);
619 assert(link->link_messages > 0);
620 assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
621 LINK_STATE_FAILED, LINK_STATE_LINGER));
623 link->link_messages --;
625 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
628 r = sd_rtnl_message_get_errno(m);
629 if (r < 0 && r != -EEXIST)
630 log_link_warning_errno(link, -r, "%-*s: could not set address: %m", IFNAMSIZ, link->ifname);
632 link_rtnl_process_address(rtnl, m, link->manager);
634 if (link->link_messages == 0) {
635 log_link_debug(link, "addresses set");
636 link_enter_set_routes(link);
642 static int link_enter_set_addresses(Link *link) {
647 assert(link->network);
648 assert(link->state != _LINK_STATE_INVALID);
650 link->state = LINK_STATE_SETTING_ADDRESSES;
652 LIST_FOREACH(addresses, ad, link->network->static_addresses) {
653 r = address_configure(ad, link, &address_handler);
655 log_link_warning(link,
656 "could not set addresses: %s",
658 link_enter_failed(link);
662 link->link_messages ++;
665 if (link->link_messages == 0) {
666 link_enter_set_routes(link);
668 log_link_debug(link, "setting addresses");
673 int link_address_drop_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
674 _cleanup_link_unref_ Link *link = userdata;
679 assert(link->ifname);
681 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
684 r = sd_rtnl_message_get_errno(m);
685 if (r < 0 && r != -EADDRNOTAVAIL)
686 log_link_warning_errno(link, -r, "%-*s: could not drop address: %m", IFNAMSIZ, link->ifname);
691 static int link_set_bridge_fdb(const Link *const link) {
695 LIST_FOREACH(static_fdb_entries, fdb_entry, link->network->static_fdb_entries) {
696 r = fdb_entry_configure(link->manager->rtnl, fdb_entry, link->ifindex);
698 log_link_error(link, "Failed to add MAC entry to static MAC table: %s", strerror(-r));
706 static int link_set_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
707 _cleanup_link_unref_ Link *link = userdata;
710 log_link_debug(link, "set link");
712 r = sd_rtnl_message_get_errno(m);
713 if (r < 0 && r != -EEXIST) {
714 log_link_struct(link, LOG_ERR,
715 "MESSAGE=%-*s: could not join netdev: %s",
717 link->ifname, strerror(-r),
720 link_enter_failed(link);
727 static int set_hostname_handler(sd_bus *bus, sd_bus_message *m, void *userdata,
728 sd_bus_error *ret_error) {
729 _cleanup_link_unref_ Link *link = userdata;
734 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
737 r = sd_bus_message_get_errno(m);
739 log_link_warning(link, "Could not set hostname: %s",
745 int link_set_hostname(Link *link, const char *hostname) {
746 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
750 assert(link->manager);
753 log_link_debug(link, "Setting transient hostname: '%s'", hostname);
755 if (!link->manager->bus) {
756 /* TODO: replace by assert when we can rely on kdbus */
758 "Not connected to system bus, ignoring transient hostname.");
762 r = sd_bus_message_new_method_call(
765 "org.freedesktop.hostname1",
766 "/org/freedesktop/hostname1",
767 "org.freedesktop.hostname1",
772 r = sd_bus_message_append(m, "sb", hostname, false);
776 r = sd_bus_call_async(link->manager->bus, NULL, m, set_hostname_handler,
779 log_link_error(link, "Could not set transient hostname: %s",
789 static int set_mtu_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
790 _cleanup_link_unref_ Link *link = userdata;
795 assert(link->ifname);
797 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
800 r = sd_rtnl_message_get_errno(m);
802 log_link_warning_errno(link, -r, "%-*s: could not set MTU: %m", IFNAMSIZ, link->ifname);
807 int link_set_mtu(Link *link, uint32_t mtu) {
808 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
812 assert(link->manager);
813 assert(link->manager->rtnl);
815 log_link_debug(link, "setting MTU: %" PRIu32, mtu);
817 r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
818 RTM_SETLINK, link->ifindex);
820 log_link_error(link, "Could not allocate RTM_SETLINK message");
824 r = sd_rtnl_message_append_u32(req, IFLA_MTU, mtu);
826 log_link_error(link, "Could not append MTU: %s", strerror(-r));
830 r = sd_rtnl_call_async(link->manager->rtnl, req, set_mtu_handler, link,
834 "Could not send rtnetlink message: %s",
844 static int link_set_bridge(Link *link) {
845 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
849 assert(link->network);
851 if(link->network->cost == 0)
854 r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
855 RTM_SETLINK, link->ifindex);
857 log_link_error(link, "Could not allocate RTM_SETLINK message");
861 r = sd_rtnl_message_link_set_family(req, PF_BRIDGE);
864 "Could not set message family %s", strerror(-r));
868 r = sd_rtnl_message_open_container(req, IFLA_PROTINFO);
871 "Could not append IFLA_PROTINFO attribute: %s",
876 if(link->network->cost != 0) {
877 r = sd_rtnl_message_append_u32(req, IFLA_BRPORT_COST, link->network->cost);
880 "Could not append IFLA_BRPORT_COST attribute: %s",
886 r = sd_rtnl_message_close_container(req);
889 "Could not append IFLA_LINKINFO attribute: %s",
894 r = sd_rtnl_call_async(link->manager->rtnl, req, link_set_handler, link, 0, NULL);
897 "Could not send rtnetlink message: %s",
907 static void lldp_handler(sd_lldp *lldp, int event, void *userdata) {
908 Link *link = userdata;
912 assert(link->network);
913 assert(link->manager);
915 if (event != UPDATE_INFO)
918 r = sd_lldp_save(link->lldp, link->lldp_file);
920 log_link_warning(link, "could not save LLDP");
924 static int link_acquire_conf(Link *link) {
928 assert(link->network);
929 assert(link->manager);
930 assert(link->manager->event);
932 if (link_ipv4ll_enabled(link)) {
933 assert(link->ipv4ll);
935 log_link_debug(link, "acquiring IPv4 link-local address");
937 r = sd_ipv4ll_start(link->ipv4ll);
939 log_link_warning(link, "could not acquire IPv4 "
940 "link-local address");
945 if (link_dhcp4_enabled(link)) {
946 assert(link->dhcp_client);
948 log_link_debug(link, "acquiring DHCPv4 lease");
950 r = sd_dhcp_client_start(link->dhcp_client);
952 log_link_warning(link, "could not acquire DHCPv4 "
958 if (link_dhcp6_enabled(link)) {
959 assert(link->icmp6_router_discovery);
961 log_link_debug(link, "discovering IPv6 routers");
963 r = sd_icmp6_router_solicitation_start(link->icmp6_router_discovery);
965 log_link_warning(link,
966 "could not start IPv6 router discovery");
971 if (link_lldp_enabled(link)) {
974 log_link_debug(link, "Starting LLDP");
976 r = sd_lldp_start(link->lldp);
978 log_link_warning(link, "could not start LLDP ");
986 bool link_has_carrier(Link *link) {
987 /* see Documentation/networking/operstates.txt in the kernel sources */
989 if (link->kernel_operstate == IF_OPER_UP)
992 if (link->kernel_operstate == IF_OPER_UNKNOWN)
993 /* operstate may not be implemented, so fall back to flags */
994 if ((link->flags & IFF_LOWER_UP) && !(link->flags & IFF_DORMANT))
1000 static int link_up_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
1001 _cleanup_link_unref_ Link *link = userdata;
1006 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1009 r = sd_rtnl_message_get_errno(m);
1011 /* we warn but don't fail the link, as it may
1012 be brought up later */
1013 log_link_warning_errno(link, -r, "%-*s: could not bring up interface: %m", IFNAMSIZ, link->ifname);
1019 static int link_up(Link *link) {
1020 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
1024 assert(link->network);
1025 assert(link->manager);
1026 assert(link->manager->rtnl);
1028 log_link_debug(link, "bringing link up");
1030 r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
1031 RTM_SETLINK, link->ifindex);
1033 log_link_error(link, "Could not allocate RTM_SETLINK message");
1037 r = sd_rtnl_message_link_set_flags(req, IFF_UP, IFF_UP);
1039 log_link_error(link, "Could not set link flags: %s",
1044 if (link->network->mac) {
1045 r = sd_rtnl_message_append_ether_addr(req, IFLA_ADDRESS, link->network->mac);
1047 log_link_error(link, "Could not set MAC address: %s", strerror(-r));
1052 if (link->network->mtu) {
1053 r = sd_rtnl_message_append_u32(req, IFLA_MTU, link->network->mtu);
1055 log_link_error(link, "Could not set MTU: %s", strerror(-r));
1060 r = sd_rtnl_call_async(link->manager->rtnl, req, link_up_handler, link,
1063 log_link_error(link,
1064 "Could not send rtnetlink message: %s",
1074 static int link_joined(Link *link) {
1078 assert(link->network);
1080 if (!(link->flags & IFF_UP)) {
1083 link_enter_failed(link);
1088 if(link->network->bridge) {
1089 r = link_set_bridge(link);
1091 log_link_error(link,
1092 "Could not set bridge message: %s",
1097 return link_enter_set_addresses(link);
1100 static int netdev_join_handler(sd_rtnl *rtnl, sd_rtnl_message *m,
1102 _cleanup_link_unref_ Link *link = userdata;
1106 assert(link->network);
1110 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1113 r = sd_rtnl_message_get_errno(m);
1114 if (r < 0 && r != -EEXIST) {
1115 log_link_error_errno(link, -r, "%-*s: could not join netdev: %m", IFNAMSIZ, link->ifname);
1116 link_enter_failed(link);
1119 log_link_debug(link, "joined netdev");
1121 if (link->enslaving <= 0)
1127 static int link_enter_join_netdev(Link *link) {
1133 assert(link->network);
1134 assert(link->state == LINK_STATE_PENDING);
1136 link->state = LINK_STATE_ENSLAVING;
1140 if (!link->network->bridge &&
1141 !link->network->bond &&
1142 hashmap_isempty(link->network->stacked_netdevs))
1143 return link_joined(link);
1145 if (link->network->bond) {
1146 log_link_struct(link, LOG_DEBUG,
1147 "MESSAGE=%-*s: enslaving by '%s'",
1149 link->ifname, link->network->bond->ifname,
1150 NETDEVIF(link->network->bond),
1153 r = netdev_join(link->network->bond, link, &netdev_join_handler);
1155 log_link_struct(link, LOG_WARNING,
1156 "MESSAGE=%-*s: could not join netdev '%s': %s",
1158 link->ifname, link->network->bond->ifname,
1160 NETDEVIF(link->network->bond),
1162 link_enter_failed(link);
1169 if (link->network->bridge) {
1170 log_link_struct(link, LOG_DEBUG,
1171 "MESSAGE=%-*s: enslaving by '%s'",
1173 link->ifname, link->network->bridge->ifname,
1174 NETDEVIF(link->network->bridge),
1177 r = netdev_join(link->network->bridge, link,
1178 &netdev_join_handler);
1180 log_link_struct(link, LOG_WARNING,
1181 "MESSAGE=%-*s: could not join netdev '%s': %s",
1183 link->ifname, link->network->bridge->ifname,
1185 NETDEVIF(link->network->bridge),
1187 link_enter_failed(link);
1194 HASHMAP_FOREACH(netdev, link->network->stacked_netdevs, i) {
1195 log_link_struct(link, LOG_DEBUG,
1196 "MESSAGE=%-*s: enslaving by '%s'",
1198 link->ifname, netdev->ifname, NETDEVIF(netdev),
1201 r = netdev_join(netdev, link, &netdev_join_handler);
1203 log_link_struct(link, LOG_WARNING,
1204 "MESSAGE=%-*s: could not join netdev '%s': %s",
1206 link->ifname, netdev->ifname,
1208 NETDEVIF(netdev), NULL);
1209 link_enter_failed(link);
1219 static int link_configure(Link *link) {
1223 assert(link->network);
1224 assert(link->state == LINK_STATE_PENDING);
1226 r = link_set_bridge_fdb(link);
1230 if (link_ipv4ll_enabled(link)) {
1231 r = ipv4ll_configure(link);
1236 if (link_dhcp4_enabled(link)) {
1237 r = dhcp4_configure(link);
1242 if (link_dhcp4_server_enabled(link)) {
1243 r = sd_dhcp_server_new(&link->dhcp_server, link->ifindex);
1247 r = sd_dhcp_server_attach_event(link->dhcp_server, NULL, 0);
1252 if (link_dhcp6_enabled(link)) {
1253 r = icmp6_configure(link);
1258 if (link_lldp_enabled(link)) {
1259 r = sd_lldp_new(link->ifindex, link->ifname, &link->mac, &link->lldp);
1263 r = sd_lldp_attach_event(link->lldp, NULL, 0);
1267 r = sd_lldp_set_callback(link->lldp,
1268 lldp_handler, link);
1273 if (link_has_carrier(link)) {
1274 r = link_acquire_conf(link);
1279 return link_enter_join_netdev(link);
1282 static int link_initialized_and_synced(sd_rtnl *rtnl, sd_rtnl_message *m,
1284 _cleanup_link_unref_ Link *link = userdata;
1289 assert(link->ifname);
1290 assert(link->manager);
1292 if (link->state != LINK_STATE_PENDING)
1295 log_link_debug(link, "link state is up-to-date");
1297 r = network_get(link->manager, link->udev_device, link->ifname,
1298 &link->mac, &network);
1300 link_enter_unmanaged(link);
1305 if (link->flags & IFF_LOOPBACK) {
1306 if (network->ipv4ll)
1307 log_link_debug(link, "ignoring IPv4LL for loopback link");
1309 if (network->dhcp != DHCP_SUPPORT_NONE)
1310 log_link_debug(link, "ignoring DHCP clients for loopback link");
1312 if (network->dhcp_server)
1313 log_link_debug(link, "ignoring DHCP server for loopback link");
1316 r = network_apply(link->manager, network, link);
1320 r = link_configure(link);
1327 int link_initialized(Link *link, struct udev_device *device) {
1328 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
1332 assert(link->manager);
1333 assert(link->manager->rtnl);
1336 if (link->state != LINK_STATE_PENDING)
1339 if (link->udev_device)
1342 log_link_debug(link, "udev initialized link");
1344 link->udev_device = udev_device_ref(device);
1346 /* udev has initialized the link, but we don't know if we have yet
1347 * processed the NEWLINK messages with the latest state. Do a GETLINK,
1348 * when it returns we know that the pending NEWLINKs have already been
1349 * processed and that we are up-to-date */
1351 r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_GETLINK,
1356 r = sd_rtnl_call_async(link->manager->rtnl, req,
1357 link_initialized_and_synced, link, 0, NULL);
1366 int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata) {
1367 Manager *m = userdata;
1370 _cleanup_address_free_ Address *address = NULL;
1372 char buf[INET6_ADDRSTRLEN];
1373 char valid_buf[FORMAT_TIMESPAN_MAX];
1374 const char *valid_str = NULL;
1375 bool address_dropped = false;
1382 if (sd_rtnl_message_is_error(message)) {
1383 r = sd_rtnl_message_get_errno(message);
1385 log_warning_errno(r, "rtnl: failed to receive address: %m");
1390 r = sd_rtnl_message_get_type(message, &type);
1392 log_warning("rtnl: could not get message type");
1396 r = sd_rtnl_message_addr_get_ifindex(message, &ifindex);
1398 log_warning_errno(r, "rtnl: could not get ifindex: %m");
1400 } else if (ifindex <= 0) {
1401 log_warning("rtnl: received address message with invalid ifindex: %d", ifindex);
1404 r = link_get(m, ifindex, &link);
1405 if (r < 0 || !link) {
1406 log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex);
1411 r = address_new_dynamic(&address);
1415 r = sd_rtnl_message_addr_get_family(message, &address->family);
1416 if (r < 0 || !IN_SET(address->family, AF_INET, AF_INET6)) {
1417 log_link_warning(link,
1418 "rtnl: received address with invalid family, ignoring");
1422 r = sd_rtnl_message_addr_get_prefixlen(message, &address->prefixlen);
1424 log_link_warning(link,
1425 "rtnl: received address with invalid prefixlen, ignoring");
1429 r = sd_rtnl_message_addr_get_scope(message, &address->scope);
1431 log_link_warning(link,
1432 "rtnl: received address with invalid scope, ignoring");
1436 r = sd_rtnl_message_addr_get_flags(message, &address->flags);
1438 log_link_warning(link,
1439 "rtnl: received address with invalid flags, ignoring");
1443 switch (address->family) {
1445 r = sd_rtnl_message_read_in_addr(message, IFA_LOCAL,
1446 &address->in_addr.in);
1448 log_link_warning(link,
1449 "rtnl: received address without valid address, ignoring");
1456 r = sd_rtnl_message_read_in6_addr(message, IFA_ADDRESS,
1457 &address->in_addr.in6);
1459 log_link_warning(link,
1460 "rtnl: received address without valid address, ignoring");
1467 assert_not_reached("invalid address family");
1470 if (!inet_ntop(address->family, &address->in_addr, buf,
1471 INET6_ADDRSTRLEN)) {
1472 log_link_warning(link, "could not print address");
1476 r = sd_rtnl_message_read_cache_info(message, IFA_CACHEINFO,
1479 if (address->cinfo.ifa_valid == CACHE_INFO_INFINITY_LIFE_TIME)
1482 valid_str = format_timespan(valid_buf, FORMAT_TIMESPAN_MAX,
1483 address->cinfo.ifa_valid * USEC_PER_SEC,
1487 LIST_FOREACH(addresses, ad, link->addresses) {
1488 if (address_equal(ad, address)) {
1489 LIST_REMOVE(addresses, link->addresses, ad);
1493 address_dropped = true;
1501 if (!address_dropped)
1502 log_link_debug(link, "added address: %s/%u (valid for %s)",
1503 buf, address->prefixlen, valid_str);
1505 log_link_debug(link, "updated address: %s/%u (valid for %s)",
1506 buf, address->prefixlen, valid_str);
1508 LIST_PREPEND(addresses, link->addresses, address);
1515 if (address_dropped) {
1516 log_link_debug(link, "removed address: %s/%u (valid for %s)",
1517 buf, address->prefixlen, valid_str);
1521 log_link_warning(link,
1522 "removing non-existent address: %s/%u (valid for %s)",
1523 buf, address->prefixlen, valid_str);
1527 assert_not_reached("Received invalid RTNL message type");
1533 int link_add(Manager *m, sd_rtnl_message *message, Link **ret) {
1535 _cleanup_udev_device_unref_ struct udev_device *device = NULL;
1536 char ifindex_str[2 + DECIMAL_STR_MAX(int)];
1544 r = link_new(m, message, ret);
1550 log_link_debug(link, "link %d added", link->ifindex);
1552 if (detect_container(NULL) <= 0) {
1553 /* not in a container, udev will be around */
1554 sprintf(ifindex_str, "n%d", link->ifindex);
1555 device = udev_device_new_from_device_id(m->udev, ifindex_str);
1557 log_link_warning(link,
1558 "could not find udev device: %m");
1562 if (udev_device_get_is_initialized(device) <= 0) {
1564 log_link_debug(link, "link pending udev initialization...");
1568 r = link_initialized(link, device);
1572 /* we are calling a callback directly, so must take a ref */
1575 r = link_initialized_and_synced(m->rtnl, NULL, link);
1583 int link_update(Link *link, sd_rtnl_message *m) {
1584 struct ether_addr mac;
1587 bool had_carrier, carrier_gained, carrier_lost;
1591 assert(link->ifname);
1594 if (link->state == LINK_STATE_LINGER) {
1596 log_link_info(link, "link readded");
1597 link->state = LINK_STATE_ENSLAVING;
1600 r = sd_rtnl_message_read_string(m, IFLA_IFNAME, &ifname);
1601 if (r >= 0 && !streq(ifname, link->ifname)) {
1602 log_link_info(link, "renamed to %s", ifname);
1605 link->ifname = strdup(ifname);
1610 r = sd_rtnl_message_read_u32(m, IFLA_MTU, &mtu);
1611 if (r >= 0 && mtu > 0) {
1613 if (!link->original_mtu) {
1614 link->original_mtu = mtu;
1615 log_link_debug(link, "saved original MTU: %"
1616 PRIu32, link->original_mtu);
1619 if (link->dhcp_client) {
1620 r = sd_dhcp_client_set_mtu(link->dhcp_client,
1623 log_link_warning(link,
1624 "Could not update MTU in DHCP client: %s",
1631 /* The kernel may broadcast NEWLINK messages without the MAC address
1632 set, simply ignore them. */
1633 r = sd_rtnl_message_read_ether_addr(m, IFLA_ADDRESS, &mac);
1635 if (memcmp(link->mac.ether_addr_octet, mac.ether_addr_octet,
1638 memcpy(link->mac.ether_addr_octet, mac.ether_addr_octet,
1641 log_link_debug(link, "MAC address: "
1642 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
1643 mac.ether_addr_octet[0],
1644 mac.ether_addr_octet[1],
1645 mac.ether_addr_octet[2],
1646 mac.ether_addr_octet[3],
1647 mac.ether_addr_octet[4],
1648 mac.ether_addr_octet[5]);
1651 r = sd_ipv4ll_set_mac(link->ipv4ll, &link->mac);
1653 log_link_warning(link,
1654 "Could not update MAC address in IPv4LL client: %s",
1660 if (link->dhcp_client) {
1661 r = sd_dhcp_client_set_mac(link->dhcp_client,
1662 (const uint8_t *) &link->mac,
1666 log_link_warning(link,
1667 "Could not update MAC address in DHCP client: %s",
1673 if (link->dhcp6_client) {
1674 r = sd_dhcp6_client_set_mac(link->dhcp6_client,
1675 (const uint8_t *) &link->mac,
1679 log_link_warning(link,
1680 "Could not update MAC address in DHCPv6 client: %s",
1688 had_carrier = link_has_carrier(link);
1690 r = link_update_flags(link, m);
1694 carrier_gained = !had_carrier && link_has_carrier(link);
1695 carrier_lost = had_carrier && !link_has_carrier(link);
1697 if (carrier_gained) {
1698 log_link_info(link, "gained carrier");
1700 if (link->network) {
1701 r = link_acquire_conf(link);
1703 link_enter_failed(link);
1707 } else if (carrier_lost) {
1708 log_link_info(link, "lost carrier");
1710 r = link_stop_clients(link);
1712 link_enter_failed(link);
1720 static void link_update_operstate(Link *link) {
1724 if (link->kernel_operstate == IF_OPER_DORMANT)
1725 link->operstate = LINK_OPERSTATE_DORMANT;
1726 else if (link_has_carrier(link)) {
1728 uint8_t scope = RT_SCOPE_NOWHERE;
1730 /* if we have carrier, check what addresses we have */
1731 LIST_FOREACH(addresses, address, link->addresses) {
1732 if (address->flags & (IFA_F_TENTATIVE | IFA_F_DEPRECATED))
1735 if (address->scope < scope)
1736 scope = address->scope;
1739 if (scope < RT_SCOPE_SITE)
1740 /* universally accessible addresses found */
1741 link->operstate = LINK_OPERSTATE_ROUTABLE;
1742 else if (scope < RT_SCOPE_HOST)
1743 /* only link or site local addresses found */
1744 link->operstate = LINK_OPERSTATE_DEGRADED;
1746 /* no useful addresses found */
1747 link->operstate = LINK_OPERSTATE_CARRIER;
1748 } else if (link->flags & IFF_UP)
1749 link->operstate = LINK_OPERSTATE_NO_CARRIER;
1751 link->operstate = LINK_OPERSTATE_OFF;
1754 int link_save(Link *link) {
1755 _cleanup_free_ char *temp_path = NULL;
1756 _cleanup_fclose_ FILE *f = NULL;
1757 const char *admin_state, *oper_state;
1761 assert(link->state_file);
1762 assert(link->lease_file);
1763 assert(link->manager);
1765 link_update_operstate(link);
1767 r = manager_save(link->manager);
1771 if (link->state == LINK_STATE_LINGER) {
1772 unlink(link->state_file);
1776 admin_state = link_state_to_string(link->state);
1777 assert(admin_state);
1779 oper_state = link_operstate_to_string(link->operstate);
1782 r = fopen_temporary(link->state_file, &f, &temp_path);
1786 fchmod(fileno(f), 0644);
1789 "# This is private data. Do not parse.\n"
1792 admin_state, oper_state);
1794 if (link->network) {
1795 char **address, **domain;
1798 fprintf(f, "NETWORK_FILE=%s\n", link->network->filename);
1802 STRV_FOREACH(address, link->network->dns) {
1809 if (link->network->dhcp_dns &&
1811 const struct in_addr *addresses;
1813 r = sd_dhcp_lease_get_dns(link->dhcp_lease, &addresses);
1817 serialize_in_addrs(f, addresses, r);
1825 STRV_FOREACH(address, link->network->ntp) {
1832 if (link->network->dhcp_ntp &&
1834 const struct in_addr *addresses;
1836 r = sd_dhcp_lease_get_ntp(link->dhcp_lease, &addresses);
1840 serialize_in_addrs(f, addresses, r);
1846 fprintf(f, "DOMAINS=");
1848 STRV_FOREACH(domain, link->network->domains) {
1855 if (link->network->dhcp_domains &&
1857 const char *domainname;
1859 r = sd_dhcp_lease_get_domainname(link->dhcp_lease, &domainname);
1863 fputs(domainname, f);
1869 fprintf(f, "WILDCARD_DOMAIN=%s\n",
1870 yes_no(link->network->wildcard_domain));
1872 fprintf(f, "LLMNR=%s\n",
1873 llmnr_support_to_string(link->network->llmnr));
1876 if (link->dhcp_lease) {
1877 assert(link->network);
1879 r = sd_dhcp_lease_save(link->dhcp_lease, link->lease_file);
1887 unlink(link->lease_file);
1890 assert(link->network);
1892 r = sd_lldp_save(link->lldp, link->lldp_file);
1900 unlink(link->lldp_file);
1902 r = fflush_and_check(f);
1906 if (rename(temp_path, link->state_file) < 0) {
1913 log_link_error(link, "Failed to save link data to %s: %s", link->state_file, strerror(-r));
1914 unlink(link->state_file);
1919 static const char* const link_state_table[_LINK_STATE_MAX] = {
1920 [LINK_STATE_PENDING] = "pending",
1921 [LINK_STATE_ENSLAVING] = "configuring",
1922 [LINK_STATE_SETTING_ADDRESSES] = "configuring",
1923 [LINK_STATE_SETTING_ROUTES] = "configuring",
1924 [LINK_STATE_CONFIGURED] = "configured",
1925 [LINK_STATE_UNMANAGED] = "unmanaged",
1926 [LINK_STATE_FAILED] = "failed",
1927 [LINK_STATE_LINGER] = "linger",
1930 DEFINE_STRING_TABLE_LOOKUP(link_state, LinkState);
1932 static const char* const link_operstate_table[_LINK_OPERSTATE_MAX] = {
1933 [LINK_OPERSTATE_OFF] = "off",
1934 [LINK_OPERSTATE_NO_CARRIER] = "no-carrier",
1935 [LINK_OPERSTATE_DORMANT] = "dormant",
1936 [LINK_OPERSTATE_CARRIER] = "carrier",
1937 [LINK_OPERSTATE_DEGRADED] = "degraded",
1938 [LINK_OPERSTATE_ROUTABLE] = "routable",
1941 DEFINE_STRING_TABLE_LOOKUP(link_operstate, LinkOperationalState);