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 "libudev-private.h"
27 #include "udev-util.h"
31 #include "network-internal.h"
33 #include "network-util.h"
34 #include "dhcp-lease-internal.h"
36 static int ipv4ll_address_update(Link *link, bool deprecate);
37 static bool ipv4ll_is_bound(sd_ipv4ll *ll);
39 static int link_new(Manager *manager, sd_rtnl_message *message, Link **ret) {
40 _cleanup_link_unref_ Link *link = NULL;
46 assert(manager->links);
50 r = sd_rtnl_message_get_type(message, &type);
53 else if (type != RTM_NEWLINK)
56 r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
59 else if (ifindex <= 0)
62 r = sd_rtnl_message_read_string(message, IFLA_IFNAME, &ifname);
71 link->manager = manager;
72 link->state = LINK_STATE_INITIALIZING;
73 link->ifindex = ifindex;
74 link->ifname = strdup(ifname);
78 r = sd_rtnl_message_read_ether_addr(message, IFLA_ADDRESS, &link->mac);
82 r = asprintf(&link->state_file, "/run/systemd/netif/links/%"PRIu64,
87 r = asprintf(&link->lease_file, "/run/systemd/netif/leases/%"PRIu64,
92 r = hashmap_put(manager->links, &link->ifindex, link);
102 static void link_free(Link *link) {
108 assert(link->manager);
110 while ((address = link->addresses)) {
111 LIST_REMOVE(addresses, link->addresses, address);
112 address_free(address);
115 while ((address = link->pool_addresses)) {
116 LIST_REMOVE(addresses, link->pool_addresses, address);
117 address_free(address);
120 sd_dhcp_client_unref(link->dhcp_client);
121 sd_dhcp_lease_unref(link->dhcp_lease);
123 unlink(link->lease_file);
124 free(link->lease_file);
126 sd_ipv4ll_unref(link->ipv4ll);
127 sd_dhcp6_client_unref(link->dhcp6_client);
128 sd_icmp6_nd_unref(link->icmp6_router_discovery);
130 hashmap_remove(link->manager->links, &link->ifindex);
134 unlink(link->state_file);
135 free(link->state_file);
137 udev_device_unref(link->udev_device);
142 Link *link_unref(Link *link) {
143 if (link && (-- link->n_ref <= 0))
149 Link *link_ref(Link *link) {
151 assert_se(++ link->n_ref >= 2);
156 int link_get(Manager *m, int ifindex, Link **ret) {
165 ifindex_64 = ifindex;
166 link = hashmap_get(m->links, &ifindex_64);
175 void link_drop(Link *link) {
176 if (!link || link->state == LINK_STATE_LINGER)
179 link->state = LINK_STATE_LINGER;
181 log_debug_link(link, "link removed");
188 static void link_enter_unmanaged(Link *link) {
191 log_debug_link(link, "unmanaged");
193 link->state = LINK_STATE_UNMANAGED;
198 static int link_stop_clients(Link *link) {
202 assert(link->manager);
203 assert(link->manager->event);
208 if (link->network->dhcp) {
209 assert(link->dhcp_client);
211 k = sd_dhcp_client_stop(link->dhcp_client);
213 log_warning_link(link, "Could not stop DHCPv4 client: %s", strerror(-r));
218 if (link->network->ipv4ll) {
219 assert(link->ipv4ll);
221 k = sd_ipv4ll_stop(link->ipv4ll);
223 log_warning_link(link, "Could not stop IPv4 link-local: %s", strerror(-r));
228 if (link->network->dhcp_server) {
229 assert(link->dhcp_server);
231 k = sd_dhcp_server_stop(link->dhcp_server);
233 log_warning_link(link, "Could not stop DHCPv4 server: %s", strerror(-r));
238 if (link->network->dhcp6) {
239 assert(link->icmp6_router_discovery);
241 if (link->dhcp6_client) {
242 k = sd_dhcp6_client_stop(link->dhcp6_client);
244 log_warning_link(link, "Could not stop DHCPv6 client: %s", strerror(-r));
249 k = sd_icmp6_nd_stop(link->icmp6_router_discovery);
251 log_warning_link(link, "Could not stop ICMPv6 router discovery: %s", strerror(-r));
259 static void link_enter_failed(Link *link) {
262 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
265 log_warning_link(link, "failed");
267 link->state = LINK_STATE_FAILED;
269 link_stop_clients(link);
274 static Address* link_find_dhcp_server_address(Link *link) {
278 assert(link->network);
280 /* The the first statically configured address if there is any */
281 LIST_FOREACH(addresses, address, link->network->static_addresses) {
283 if (address->family != AF_INET)
286 if (in_addr_null(address->family, &address->in_addr))
292 /* If that didn't work, find a suitable address we got from the pool */
293 LIST_FOREACH(addresses, address, link->pool_addresses) {
294 if (address->family != AF_INET)
303 static int link_enter_configured(Link *link) {
307 assert(link->network);
308 assert(link->state == LINK_STATE_SETTING_ROUTES);
310 if (link->network->dhcp_server &&
311 !sd_dhcp_server_is_running(link->dhcp_server)) {
312 struct in_addr pool_start;
315 address = link_find_dhcp_server_address(link);
317 log_warning_link(link, "Failed to find suitable address for DHCPv4 server instance.");
318 link_enter_failed(link);
322 log_debug_link(link, "offering DHCPv4 leases");
324 r = sd_dhcp_server_set_address(link->dhcp_server, &address->in_addr.in);
328 /* offer 32 addresses starting from the address following the server address */
329 pool_start.s_addr = htobe32(be32toh(address->in_addr.in.s_addr) + 1);
330 r = sd_dhcp_server_set_lease_pool(link->dhcp_server,
336 r = sd_dhcp_server_set_router(link->dhcp_server,
337 &main_address->in_addr.in);
341 r = sd_dhcp_server_set_prefixlen(link->dhcp_server,
342 main_address->prefixlen);
347 r = sd_dhcp_server_start(link->dhcp_server);
349 log_warning_link(link, "could not start DHCPv4 server "
350 "instance: %s", strerror(-r));
352 link_enter_failed(link);
358 log_info_link(link, "link configured");
360 link->state = LINK_STATE_CONFIGURED;
367 static int route_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
368 Link *link = userdata;
371 assert(link->route_messages > 0);
372 assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
373 LINK_STATE_SETTING_ROUTES, LINK_STATE_FAILED,
376 link->route_messages --;
378 if (IN_SET(LINK_STATE_FAILED, LINK_STATE_LINGER)) {
383 r = sd_rtnl_message_get_errno(m);
384 if (r < 0 && r != -EEXIST)
385 log_struct_link(LOG_WARNING, link,
386 "MESSAGE=%-*s: could not set route: %s",
388 link->ifname, strerror(-r),
392 /* we might have received an old reply after moving back to SETTING_ADDRESSES,
394 if (link->route_messages == 0 && link->state == LINK_STATE_SETTING_ROUTES) {
395 log_debug_link(link, "routes set");
396 link_enter_configured(link);
404 static int link_enter_set_routes(Link *link) {
409 assert(link->network);
410 assert(link->state == LINK_STATE_SETTING_ADDRESSES);
412 link->state = LINK_STATE_SETTING_ROUTES;
414 if (!link->network->static_routes && !link->dhcp_lease &&
415 (!link->ipv4ll || ipv4ll_is_bound(link->ipv4ll) == false))
416 return link_enter_configured(link);
418 log_debug_link(link, "setting routes");
420 LIST_FOREACH(routes, rt, link->network->static_routes) {
421 r = route_configure(rt, link, &route_handler);
423 log_warning_link(link,
424 "could not set routes: %s", strerror(-r));
425 link_enter_failed(link);
430 link->route_messages ++;
433 if (link->ipv4ll && !link->dhcp_lease) {
434 _cleanup_route_free_ Route *route = NULL;
437 r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
438 if (r < 0 && r != -ENOENT) {
439 log_warning_link(link, "IPV4LL error: no address: %s",
445 r = route_new_dynamic(&route);
447 log_error_link(link, "Could not allocate route: %s",
452 route->family = AF_INET;
453 route->scope = RT_SCOPE_LINK;
456 r = route_configure(route, link, &route_handler);
458 log_warning_link(link,
459 "could not set routes: %s", strerror(-r));
460 link_enter_failed(link);
465 link->route_messages ++;
469 if (link->dhcp_lease) {
470 _cleanup_route_free_ Route *route = NULL;
471 _cleanup_route_free_ Route *route_gw = NULL;
472 struct in_addr gateway;
474 r = sd_dhcp_lease_get_router(link->dhcp_lease, &gateway);
475 if (r < 0 && r != -ENOENT) {
476 log_warning_link(link, "DHCP error: %s", strerror(-r));
481 r = route_new_dynamic(&route);
483 log_error_link(link, "Could not allocate route: %s",
488 r = route_new_dynamic(&route_gw);
490 log_error_link(link, "Could not allocate route: %s",
495 /* The dhcp netmask may mask out the gateway. Add an explicit
496 * route for the gw host so that we can route no matter the
497 * netmask or existing kernel route tables. */
498 route_gw->family = AF_INET;
499 route_gw->dst_addr.in = gateway;
500 route_gw->dst_prefixlen = 32;
501 route_gw->scope = RT_SCOPE_LINK;
503 r = route_configure(route_gw, link, &route_handler);
505 log_warning_link(link,
506 "could not set host route: %s", strerror(-r));
511 link->route_messages ++;
513 route->family = AF_INET;
514 route->in_addr.in = gateway;
516 r = route_configure(route, link, &route_handler);
518 log_warning_link(link,
519 "could not set routes: %s", strerror(-r));
520 link_enter_failed(link);
525 link->route_messages ++;
529 if (link->route_messages == 0) {
530 link_enter_configured(link);
536 static int route_drop_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
537 Link *link = userdata;
542 assert(link->ifname);
544 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
549 r = sd_rtnl_message_get_errno(m);
550 if (r < 0 && r != -ESRCH)
551 log_struct_link(LOG_WARNING, link,
552 "MESSAGE=%-*s: could not drop route: %s",
554 link->ifname, strerror(-r),
563 static int address_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
564 Link *link = userdata;
569 assert(link->ifname);
570 assert(link->addr_messages > 0);
571 assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
572 LINK_STATE_FAILED, LINK_STATE_LINGER));
574 link->addr_messages --;
576 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
581 r = sd_rtnl_message_get_errno(m);
582 if (r < 0 && r != -EEXIST)
583 log_struct_link(LOG_WARNING, link,
584 "MESSAGE=%-*s: could not set address: %s",
586 link->ifname, strerror(-r),
590 if (link->addr_messages == 0) {
591 log_debug_link(link, "addresses set");
592 link_enter_set_routes(link);
600 static int link_enter_set_addresses(Link *link) {
605 assert(link->network);
606 assert(link->state != _LINK_STATE_INVALID);
608 link->state = LINK_STATE_SETTING_ADDRESSES;
610 if (!link->network->static_addresses && !link->dhcp_lease &&
611 (!link->ipv4ll || ipv4ll_is_bound(link->ipv4ll) == false))
612 return link_enter_set_routes(link);
614 log_debug_link(link, "setting addresses");
616 LIST_FOREACH(addresses, ad, link->network->static_addresses) {
617 r = address_configure(ad, link, &address_handler);
619 log_warning_link(link,
620 "could not set addresses: %s", strerror(-r));
621 link_enter_failed(link);
626 link->addr_messages ++;
629 if (link->ipv4ll && !link->dhcp_lease) {
630 _cleanup_address_free_ Address *ll_addr = NULL;
633 r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
634 if (r < 0 && r != -ENOENT) {
635 log_warning_link(link, "IPV4LL error: no address: %s",
641 r = address_new_dynamic(&ll_addr);
643 log_error_link(link, "Could not allocate address: %s", strerror(-r));
647 ll_addr->family = AF_INET;
648 ll_addr->in_addr.in = addr;
649 ll_addr->prefixlen = 16;
650 ll_addr->broadcast.s_addr = ll_addr->in_addr.in.s_addr | htonl(0xfffffffflu >> ll_addr->prefixlen);
651 ll_addr->scope = RT_SCOPE_LINK;
653 r = address_configure(ll_addr, link, &address_handler);
655 log_warning_link(link,
656 "could not set addresses: %s", strerror(-r));
657 link_enter_failed(link);
662 link->addr_messages ++;
666 if (link->dhcp_lease) {
667 _cleanup_address_free_ Address *address = NULL;
669 struct in_addr netmask;
672 r = sd_dhcp_lease_get_address(link->dhcp_lease, &addr);
674 log_warning_link(link, "DHCP error: no address: %s",
679 r = sd_dhcp_lease_get_netmask(link->dhcp_lease, &netmask);
681 log_warning_link(link, "DHCP error: no netmask: %s",
686 prefixlen = net_netmask_to_prefixlen(&netmask);
688 r = address_new_dynamic(&address);
690 log_error_link(link, "Could not allocate address: %s",
695 address->family = AF_INET;
696 address->in_addr.in = addr;
697 address->prefixlen = prefixlen;
698 address->broadcast.s_addr = addr.s_addr | ~netmask.s_addr;
700 r = address_configure(address, link, &address_handler);
702 log_warning_link(link,
703 "could not set addresses: %s", strerror(-r));
704 link_enter_failed(link);
709 link->addr_messages ++;
715 static int address_update_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
716 Link *link = userdata;
721 assert(link->ifname);
723 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
728 r = sd_rtnl_message_get_errno(m);
729 if (r < 0 && r != -ENOENT)
730 log_struct_link(LOG_WARNING, link,
731 "MESSAGE=%-*s: could not update address: %s",
733 link->ifname, strerror(-r),
742 static int address_drop_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
743 Link *link = userdata;
748 assert(link->ifname);
750 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
755 r = sd_rtnl_message_get_errno(m);
756 if (r < 0 && r != -EADDRNOTAVAIL)
757 log_struct_link(LOG_WARNING, link,
758 "MESSAGE=%-*s: could not drop address: %s",
760 link->ifname, strerror(-r),
769 static int set_hostname_handler(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
770 Link *link = userdata;
775 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
780 r = sd_bus_message_get_errno(m);
782 log_warning_link(link, "Could not set hostname: %s", strerror(-r));
789 static int link_set_hostname(Link *link, const char *hostname) {
790 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
794 assert(link->manager);
797 log_debug_link(link, "Setting transient hostname: '%s'", hostname);
799 if (!link->manager->bus) { /* TODO: replace by assert when we can rely on kdbus */
800 log_info_link(link, "Not connected to system bus, ignoring transient hostname.");
804 r = sd_bus_message_new_method_call(
807 "org.freedesktop.hostname1",
808 "/org/freedesktop/hostname1",
809 "org.freedesktop.hostname1",
814 r = sd_bus_message_append(m, "sb", hostname, false);
818 r = sd_bus_call_async(link->manager->bus, NULL, m, set_hostname_handler, link, 0);
820 log_error_link(link, "Could not set transient hostname: %s", strerror(-r));
827 static int set_mtu_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
828 Link *link = userdata;
833 assert(link->ifname);
835 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
840 r = sd_rtnl_message_get_errno(m);
842 log_struct_link(LOG_WARNING, link,
843 "MESSAGE=%-*s: could not set MTU: %s",
844 IFNAMSIZ, link->ifname, strerror(-r),
853 static int link_set_mtu(Link *link, uint32_t mtu) {
854 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
858 assert(link->manager);
859 assert(link->manager->rtnl);
861 log_debug_link(link, "setting MTU: %" PRIu32, mtu);
863 r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
864 RTM_SETLINK, link->ifindex);
866 log_error_link(link, "Could not allocate RTM_SETLINK message");
870 r = sd_rtnl_message_append_u32(req, IFLA_MTU, mtu);
872 log_error_link(link, "Could not append MTU: %s", strerror(-r));
876 r = sd_rtnl_call_async(link->manager->rtnl, req, set_mtu_handler, link, 0, NULL);
879 "Could not send rtnetlink message: %s", strerror(-r));
888 static int dhcp_lease_lost(Link *link) {
889 _cleanup_address_free_ Address *address = NULL;
890 _cleanup_route_free_ Route *route_gw = NULL;
891 _cleanup_route_free_ Route *route = NULL;
893 struct in_addr netmask;
894 struct in_addr gateway;
899 assert(link->dhcp_lease);
901 log_warning_link(link, "DHCP lease lost");
903 r = address_new_dynamic(&address);
905 r = sd_dhcp_lease_get_router(link->dhcp_lease, &gateway);
907 r = route_new_dynamic(&route_gw);
909 route_gw->family = AF_INET;
910 route_gw->dst_addr.in = gateway;
911 route_gw->dst_prefixlen = 32;
912 route_gw->scope = RT_SCOPE_LINK;
914 route_drop(route_gw, link, &route_drop_handler);
918 r = route_new_dynamic(&route);
920 route->family = AF_INET;
921 route->in_addr.in = gateway;
923 route_drop(route, link, &route_drop_handler);
928 sd_dhcp_lease_get_address(link->dhcp_lease, &addr);
929 sd_dhcp_lease_get_netmask(link->dhcp_lease, &netmask);
930 prefixlen = net_netmask_to_prefixlen(&netmask);
932 address->family = AF_INET;
933 address->in_addr.in = addr;
934 address->prefixlen = prefixlen;
936 address_drop(address, link, &address_drop_handler);
940 if (link->network->dhcp_mtu) {
943 r = sd_dhcp_lease_get_mtu(link->dhcp_lease, &mtu);
944 if (r >= 0 && link->original_mtu != mtu) {
945 r = link_set_mtu(link, link->original_mtu);
947 log_warning_link(link, "DHCP error: could not reset MTU");
948 link_enter_failed(link);
954 if (link->network->dhcp_hostname) {
955 const char *hostname = NULL;
957 r = sd_dhcp_lease_get_hostname(link->dhcp_lease, &hostname);
958 if (r >= 0 && hostname) {
959 r = link_set_hostname(link, "");
961 log_error_link(link, "Failed to reset transient hostname");
965 link->dhcp_lease = sd_dhcp_lease_unref(link->dhcp_lease);
970 static int dhcp_lease_acquired(sd_dhcp_client *client, Link *link) {
971 sd_dhcp_lease *lease;
972 struct in_addr address;
973 struct in_addr netmask;
974 struct in_addr gateway;
981 r = sd_dhcp_client_get_lease(client, &lease);
983 log_warning_link(link, "DHCP error: no lease: %s",
988 r = sd_dhcp_lease_get_address(lease, &address);
990 log_warning_link(link, "DHCP error: no address: %s",
995 r = sd_dhcp_lease_get_netmask(lease, &netmask);
997 log_warning_link(link, "DHCP error: no netmask: %s",
1002 prefixlen = net_netmask_to_prefixlen(&netmask);
1004 r = sd_dhcp_lease_get_router(lease, &gateway);
1005 if (r < 0 && r != -ENOENT) {
1006 log_warning_link(link, "DHCP error: %s", strerror(-r));
1011 log_struct_link(LOG_INFO, link,
1012 "MESSAGE=%-*s: DHCPv4 address %u.%u.%u.%u/%u via %u.%u.%u.%u",
1015 ADDRESS_FMT_VAL(address),
1017 ADDRESS_FMT_VAL(gateway),
1018 "ADDRESS=%u.%u.%u.%u",
1019 ADDRESS_FMT_VAL(address),
1022 "GATEWAY=%u.%u.%u.%u",
1023 ADDRESS_FMT_VAL(gateway),
1026 log_struct_link(LOG_INFO, link,
1027 "MESSAGE=%-*s: DHCPv4 address %u.%u.%u.%u/%u",
1030 ADDRESS_FMT_VAL(address),
1032 "ADDRESS=%u.%u.%u.%u",
1033 ADDRESS_FMT_VAL(address),
1038 link->dhcp_lease = lease;
1040 if (link->network->dhcp_mtu) {
1043 r = sd_dhcp_lease_get_mtu(lease, &mtu);
1045 r = link_set_mtu(link, mtu);
1047 log_error_link(link, "Failed to set MTU "
1048 "to %" PRIu16, mtu);
1052 if (link->network->dhcp_hostname) {
1053 const char *hostname;
1055 r = sd_dhcp_lease_get_hostname(lease, &hostname);
1057 r = link_set_hostname(link, hostname);
1059 log_error_link(link, "Failed to set transient hostname "
1060 "to '%s'", hostname);
1064 link_enter_set_addresses(link);
1069 static void dhcp_handler(sd_dhcp_client *client, int event, void *userdata) {
1070 Link *link = userdata;
1074 assert(link->network);
1075 assert(link->manager);
1077 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1081 case DHCP_EVENT_NO_LEASE:
1082 log_debug_link(link, "IP address in use.");
1084 case DHCP_EVENT_EXPIRED:
1085 case DHCP_EVENT_STOP:
1086 case DHCP_EVENT_IP_CHANGE:
1087 if (link->network->dhcp_critical) {
1088 log_error_link(link, "DHCPv4 connection considered system critical, "
1089 "ignoring request to reconfigure it.");
1093 if (link->dhcp_lease) {
1094 r = dhcp_lease_lost(link);
1096 link_enter_failed(link);
1101 if (event == DHCP_EVENT_IP_CHANGE) {
1102 r = dhcp_lease_acquired(client, link);
1104 link_enter_failed(link);
1109 if (event == DHCP_EVENT_EXPIRED && link->network->ipv4ll) {
1110 if (!sd_ipv4ll_is_running(link->ipv4ll))
1111 r = sd_ipv4ll_start(link->ipv4ll);
1112 else if (ipv4ll_is_bound(link->ipv4ll))
1113 r = ipv4ll_address_update(link, false);
1115 link_enter_failed(link);
1121 case DHCP_EVENT_IP_ACQUIRE:
1122 r = dhcp_lease_acquired(client, link);
1124 link_enter_failed(link);
1128 if (ipv4ll_is_bound(link->ipv4ll))
1129 r = ipv4ll_address_update(link, true);
1131 r = sd_ipv4ll_stop(link->ipv4ll);
1133 link_enter_failed(link);
1140 log_warning_link(link, "DHCP error: %s", strerror(-event));
1142 log_warning_link(link, "DHCP unknown event: %d", event);
1149 static int ipv4ll_address_update(Link *link, bool deprecate) {
1151 struct in_addr addr;
1155 r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
1157 _cleanup_address_free_ Address *address = NULL;
1159 log_debug_link(link, "IPv4 link-local %s %u.%u.%u.%u",
1160 deprecate ? "deprecate" : "approve",
1161 ADDRESS_FMT_VAL(addr));
1163 r = address_new_dynamic(&address);
1165 log_error_link(link, "Could not allocate address: %s", strerror(-r));
1169 address->family = AF_INET;
1170 address->in_addr.in = addr;
1171 address->prefixlen = 16;
1172 address->scope = RT_SCOPE_LINK;
1173 address->cinfo.ifa_prefered = deprecate ? 0 : CACHE_INFO_INFINITY_LIFE_TIME;
1174 address->broadcast.s_addr = address->in_addr.in.s_addr | htonl(0xfffffffflu >> address->prefixlen);
1176 address_update(address, link, &address_update_handler);
1184 static int ipv4ll_address_lost(Link *link) {
1186 struct in_addr addr;
1190 r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
1192 _cleanup_address_free_ Address *address = NULL;
1193 _cleanup_route_free_ Route *route = NULL;
1195 log_debug_link(link, "IPv4 link-local release %u.%u.%u.%u",
1196 ADDRESS_FMT_VAL(addr));
1198 r = address_new_dynamic(&address);
1200 log_error_link(link, "Could not allocate address: %s", strerror(-r));
1204 address->family = AF_INET;
1205 address->in_addr.in = addr;
1206 address->prefixlen = 16;
1207 address->scope = RT_SCOPE_LINK;
1209 address_drop(address, link, &address_drop_handler);
1212 r = route_new_dynamic(&route);
1214 log_error_link(link, "Could not allocate route: %s",
1219 route->family = AF_INET;
1220 route->scope = RT_SCOPE_LINK;
1221 route->metrics = 99;
1223 route_drop(route, link, &route_drop_handler);
1230 static bool ipv4ll_is_bound(sd_ipv4ll *ll) {
1232 struct in_addr addr;
1236 r = sd_ipv4ll_get_address(ll, &addr);
1242 static int ipv4ll_address_claimed(sd_ipv4ll *ll, Link *link) {
1243 struct in_addr address;
1249 r = sd_ipv4ll_get_address(ll, &address);
1253 log_struct_link(LOG_INFO, link,
1254 "MESSAGE=%-*s: IPv4 link-local address %u.%u.%u.%u",
1257 ADDRESS_FMT_VAL(address),
1260 link_enter_set_addresses(link);
1265 static void ipv4ll_handler(sd_ipv4ll *ll, int event, void *userdata){
1266 Link *link = userdata;
1270 assert(link->network);
1271 assert(link->manager);
1273 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1277 case IPV4LL_EVENT_STOP:
1278 case IPV4LL_EVENT_CONFLICT:
1279 r = ipv4ll_address_lost(link);
1281 link_enter_failed(link);
1285 case IPV4LL_EVENT_BIND:
1286 r = ipv4ll_address_claimed(ll, link);
1288 link_enter_failed(link);
1294 log_warning_link(link, "IPv4 link-local error: %s", strerror(-event));
1296 log_warning_link(link, "IPv4 link-local unknown event: %d", event);
1301 static void dhcp6_handler(sd_dhcp6_client *client, int event, void *userdata) {
1302 Link *link = userdata;
1305 assert(link->network);
1306 assert(link->manager);
1308 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1312 case DHCP6_EVENT_STOP:
1313 case DHCP6_EVENT_RESEND_EXPIRE:
1314 case DHCP6_EVENT_RETRANS_MAX:
1315 case DHCP6_EVENT_IP_ACQUIRE:
1316 log_debug_link(link, "DHCPv6 event %d", event);
1322 log_warning_link(link, "DHCPv6 error: %s",
1325 log_warning_link(link, "DHCPv6 unknown event: %d",
1331 static void icmp6_router_handler(sd_icmp6_nd *nd, int event, void *userdata) {
1332 Link *link = userdata;
1336 assert(link->network);
1337 assert(link->manager);
1339 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1343 case ICMP6_EVENT_ROUTER_ADVERTISMENT_NONE:
1344 case ICMP6_EVENT_ROUTER_ADVERTISMENT_OTHER:
1347 case ICMP6_EVENT_ROUTER_ADVERTISMENT_TIMEOUT:
1348 case ICMP6_EVENT_ROUTER_ADVERTISMENT_MANAGED:
1353 log_warning_link(link, "ICMPv6 error: %s",
1356 log_warning_link(link, "ICMPv6 unknown event: %d",
1362 if (link->dhcp6_client)
1365 r = sd_dhcp6_client_new(&link->dhcp6_client);
1369 r = sd_dhcp6_client_attach_event(link->dhcp6_client, NULL, 0);
1371 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1375 r = sd_dhcp6_client_set_mac(link->dhcp6_client, &link->mac);
1377 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1381 r = sd_dhcp6_client_set_index(link->dhcp6_client, link->ifindex);
1383 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1387 r = sd_dhcp6_client_set_callback(link->dhcp6_client, dhcp6_handler,
1390 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1394 r = sd_dhcp6_client_start(link->dhcp6_client);
1396 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1399 static int link_acquire_conf(Link *link) {
1403 assert(link->network);
1404 assert(link->manager);
1405 assert(link->manager->event);
1407 if (link->network->ipv4ll) {
1408 assert(link->ipv4ll);
1410 log_debug_link(link, "acquiring IPv4 link-local address");
1412 r = sd_ipv4ll_start(link->ipv4ll);
1414 log_warning_link(link, "could not acquire IPv4 "
1415 "link-local address");
1420 if (link->network->dhcp) {
1421 assert(link->dhcp_client);
1423 log_debug_link(link, "acquiring DHCPv4 lease");
1425 r = sd_dhcp_client_start(link->dhcp_client);
1427 log_warning_link(link, "could not acquire DHCPv4 "
1433 if (link->network->dhcp6) {
1434 assert(link->icmp6_router_discovery);
1436 log_debug_link(link, "discovering IPv6 routers");
1438 r = sd_icmp6_router_solicitation_start(link->icmp6_router_discovery);
1440 log_warning_link(link, "could not start IPv6 router discovery");
1448 bool link_has_carrier(unsigned flags, uint8_t operstate) {
1449 /* see Documentation/networking/operstates.txt in the kernel sources */
1451 if (operstate == IF_OPER_UP)
1454 if (operstate == IF_OPER_UNKNOWN)
1455 /* operstate may not be implemented, so fall back to flags */
1456 if ((flags & IFF_LOWER_UP) && !(flags & IFF_DORMANT))
1462 #define FLAG_STRING(string, flag, old, new) \
1463 (((old ^ new) & flag) \
1464 ? ((old & flag) ? (" -" string) : (" +" string)) \
1467 static int link_update_flags(Link *link, sd_rtnl_message *m) {
1468 unsigned flags, unknown_flags_added, unknown_flags_removed, unknown_flags;
1470 bool carrier_gained = false, carrier_lost = false;
1475 r = sd_rtnl_message_link_get_flags(m, &flags);
1477 log_warning_link(link, "Could not get link flags");
1481 r = sd_rtnl_message_read_u8(m, IFLA_OPERSTATE, &operstate);
1483 /* if we got a message without operstate, take it to mean
1484 the state was unchanged */
1485 operstate = link->kernel_operstate;
1487 if ((link->flags == flags) && (link->kernel_operstate == operstate))
1490 if (link->flags != flags) {
1491 log_debug_link(link, "flags change:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
1492 FLAG_STRING("LOOPBACK", IFF_LOOPBACK, link->flags, flags),
1493 FLAG_STRING("MASTER", IFF_MASTER, link->flags, flags),
1494 FLAG_STRING("SLAVE", IFF_SLAVE, link->flags, flags),
1495 FLAG_STRING("UP", IFF_UP, link->flags, flags),
1496 FLAG_STRING("DORMANT", IFF_DORMANT, link->flags, flags),
1497 FLAG_STRING("LOWER_UP", IFF_LOWER_UP, link->flags, flags),
1498 FLAG_STRING("RUNNING", IFF_RUNNING, link->flags, flags),
1499 FLAG_STRING("MULTICAST", IFF_MULTICAST, link->flags, flags),
1500 FLAG_STRING("BROADCAST", IFF_BROADCAST, link->flags, flags),
1501 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT, link->flags, flags),
1502 FLAG_STRING("PROMISC", IFF_PROMISC, link->flags, flags),
1503 FLAG_STRING("ALLMULTI", IFF_ALLMULTI, link->flags, flags),
1504 FLAG_STRING("PORTSEL", IFF_PORTSEL, link->flags, flags),
1505 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA, link->flags, flags),
1506 FLAG_STRING("DYNAMIC", IFF_DYNAMIC, link->flags, flags),
1507 FLAG_STRING("NOARP", IFF_NOARP, link->flags, flags),
1508 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS, link->flags, flags),
1509 FLAG_STRING("DEBUG", IFF_DEBUG, link->flags, flags),
1510 FLAG_STRING("ECHO", IFF_ECHO, link->flags, flags));
1512 unknown_flags = ~(IFF_LOOPBACK | IFF_MASTER | IFF_SLAVE | IFF_UP |
1513 IFF_DORMANT | IFF_LOWER_UP | IFF_RUNNING |
1514 IFF_MULTICAST | IFF_BROADCAST | IFF_POINTOPOINT |
1515 IFF_PROMISC | IFF_ALLMULTI | IFF_PORTSEL |
1516 IFF_AUTOMEDIA | IFF_DYNAMIC | IFF_NOARP |
1517 IFF_NOTRAILERS | IFF_DEBUG | IFF_ECHO);
1518 unknown_flags_added = ((link->flags ^ flags) & flags & unknown_flags);
1519 unknown_flags_removed = ((link->flags ^ flags) & link->flags & unknown_flags);
1521 /* link flags are currently at most 18 bits, let's align to printing 20 */
1522 if (unknown_flags_added)
1523 log_debug_link(link, "unknown link flags gained: %#.5x (ignoring)",
1524 unknown_flags_added);
1526 if (unknown_flags_removed)
1527 log_debug_link(link, "unknown link flags lost: %#.5x (ignoring)",
1528 unknown_flags_removed);
1531 carrier_gained = !link_has_carrier(link->flags, link->kernel_operstate) &&
1532 link_has_carrier(flags, operstate);
1533 carrier_lost = link_has_carrier(link->flags, link->kernel_operstate) &&
1534 !link_has_carrier(flags, operstate);
1536 link->flags = flags;
1537 link->kernel_operstate = operstate;
1541 if (link->state == LINK_STATE_FAILED ||
1542 link->state == LINK_STATE_UNMANAGED)
1545 if (carrier_gained) {
1546 log_info_link(link, "gained carrier");
1548 if (link->network) {
1549 r = link_acquire_conf(link);
1551 link_enter_failed(link);
1555 } else if (carrier_lost) {
1556 log_info_link(link, "lost carrier");
1558 r = link_stop_clients(link);
1560 link_enter_failed(link);
1568 static int link_up_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
1569 Link *link = userdata;
1574 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
1579 r = sd_rtnl_message_get_errno(m);
1581 /* we warn but don't fail the link, as it may
1582 be brought up later */
1583 log_struct_link(LOG_WARNING, link,
1584 "MESSAGE=%-*s: could not bring up interface: %s",
1586 link->ifname, strerror(-r),
1596 static int link_up(Link *link) {
1597 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
1601 assert(link->manager);
1602 assert(link->manager->rtnl);
1604 log_debug_link(link, "bringing link up");
1606 r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
1607 RTM_SETLINK, link->ifindex);
1609 log_error_link(link, "Could not allocate RTM_SETLINK message");
1613 r = sd_rtnl_message_link_set_flags(req, IFF_UP, IFF_UP);
1615 log_error_link(link, "Could not set link flags: %s", strerror(-r));
1619 r = sd_rtnl_call_async(link->manager->rtnl, req, link_up_handler, link, 0, NULL);
1621 log_error_link(link,
1622 "Could not send rtnetlink message: %s", strerror(-r));
1631 static int link_enslaved(Link *link) {
1635 assert(link->state == LINK_STATE_ENSLAVING);
1636 assert(link->network);
1638 if (!(link->flags & IFF_UP)) {
1641 link_enter_failed(link);
1646 if (!link->network->dhcp && !link->network->ipv4ll)
1647 return link_enter_set_addresses(link);
1652 static int enslave_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
1653 Link *link = userdata;
1657 assert(IN_SET(link->state, LINK_STATE_ENSLAVING, LINK_STATE_FAILED,
1658 LINK_STATE_LINGER));
1659 assert(link->network);
1663 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
1668 r = sd_rtnl_message_get_errno(m);
1670 log_struct_link(LOG_ERR, link,
1671 "MESSAGE=%-*s: could not enslave: %s",
1673 link->ifname, strerror(-r),
1676 link_enter_failed(link);
1681 log_debug_link(link, "enslaved");
1683 if (link->enslaving == 0)
1684 link_enslaved(link);
1691 static int link_enter_enslave(Link *link) {
1692 NetDev *vlan, *macvlan, *vxlan;
1697 assert(link->network);
1698 assert(link->state == LINK_STATE_INITIALIZING);
1700 link->state = LINK_STATE_ENSLAVING;
1704 if (!link->network->bridge &&
1705 !link->network->bond &&
1706 !link->network->tunnel &&
1707 hashmap_isempty(link->network->vlans) &&
1708 hashmap_isempty(link->network->macvlans) &&
1709 hashmap_isempty(link->network->vxlans))
1710 return link_enslaved(link);
1712 if (link->network->bond) {
1713 log_struct_link(LOG_DEBUG, link,
1714 "MESSAGE=%-*s: enslaving by '%s'",
1716 link->ifname, link->network->bond->ifname,
1717 NETDEV(link->network->bond),
1720 r = netdev_enslave(link->network->bond, link, &enslave_handler);
1722 log_struct_link(LOG_WARNING, link,
1723 "MESSAGE=%-*s: could not enslave by '%s': %s",
1725 link->ifname, link->network->bond->ifname, strerror(-r),
1726 NETDEV(link->network->bond),
1728 link_enter_failed(link);
1736 if (link->network->bridge) {
1737 log_struct_link(LOG_DEBUG, link,
1738 "MESSAGE=%-*s: enslaving by '%s'",
1740 link->ifname, link->network->bridge->ifname,
1741 NETDEV(link->network->bridge),
1744 r = netdev_enslave(link->network->bridge, link, &enslave_handler);
1746 log_struct_link(LOG_WARNING, link,
1747 "MESSAGE=%-*s: could not enslave by '%s': %s",
1749 link->ifname, link->network->bridge->ifname, strerror(-r),
1750 NETDEV(link->network->bridge),
1752 link_enter_failed(link);
1760 if (link->network->tunnel) {
1761 log_struct_link(LOG_DEBUG, link,
1762 "MESSAGE=%-*s: enslaving by '%s'",
1764 link->ifname, link->network->tunnel->ifname,
1765 NETDEV(link->network->tunnel),
1768 r = netdev_enslave(link->network->tunnel, link, &enslave_handler);
1770 log_struct_link(LOG_WARNING, link,
1771 "MESSAGE=%-*s: could not enslave by '%s': %s",
1773 link->ifname, link->network->tunnel->ifname, strerror(-r),
1774 NETDEV(link->network->tunnel),
1776 link_enter_failed(link);
1784 HASHMAP_FOREACH(vlan, link->network->vlans, i) {
1785 log_struct_link(LOG_DEBUG, link,
1786 "MESSAGE=%-*s: enslaving by '%s'",
1788 link->ifname, vlan->ifname, NETDEV(vlan), NULL);
1790 r = netdev_enslave(vlan, link, &enslave_handler);
1792 log_struct_link(LOG_WARNING, link,
1793 "MESSAGE=%-*s: could not enslave by '%s': %s",
1795 link->ifname, vlan->ifname, strerror(-r),
1796 NETDEV(vlan), NULL);
1797 link_enter_failed(link);
1805 HASHMAP_FOREACH(macvlan, link->network->macvlans, i) {
1806 log_struct_link(LOG_DEBUG, link,
1807 "MESSAGE=%-*s: enslaving by '%s'",
1809 link->ifname, macvlan->ifname, NETDEV(macvlan), NULL);
1811 r = netdev_enslave(macvlan, link, &enslave_handler);
1813 log_struct_link(LOG_WARNING, link,
1814 "MESSAGE=%-*s: could not enslave by '%s': %s",
1816 link->ifname, macvlan->ifname, strerror(-r),
1817 NETDEV(macvlan), NULL);
1818 link_enter_failed(link);
1826 HASHMAP_FOREACH(vxlan, link->network->vxlans, i) {
1827 log_struct_link(LOG_DEBUG, link,
1828 "MESSAGE=%*s: enslaving by '%s'",
1830 link->ifname, vxlan->ifname, NETDEV(vxlan), NULL);
1832 r = netdev_enslave(vxlan, link, &enslave_handler);
1834 log_struct_link(LOG_WARNING, link,
1835 "MESSAGE=%*s: could not enslave by '%s': %s",
1837 link->ifname, vxlan->ifname, strerror(-r),
1838 NETDEV(vxlan), NULL);
1839 link_enter_failed(link);
1850 static int link_configure(Link *link) {
1854 assert(link->state == LINK_STATE_INITIALIZING);
1856 if (link->network->ipv4ll) {
1859 r = sd_ipv4ll_new(&link->ipv4ll);
1863 if (link->udev_device) {
1864 r = net_get_unique_predictable_data(link->udev_device, seed);
1866 r = sd_ipv4ll_set_address_seed(link->ipv4ll, seed);
1872 r = sd_ipv4ll_attach_event(link->ipv4ll, NULL, 0);
1876 r = sd_ipv4ll_set_mac(link->ipv4ll, &link->mac);
1880 r = sd_ipv4ll_set_index(link->ipv4ll, link->ifindex);
1884 r = sd_ipv4ll_set_callback(link->ipv4ll, ipv4ll_handler, link);
1889 if (link->network->dhcp) {
1890 r = sd_dhcp_client_new(&link->dhcp_client);
1894 r = sd_dhcp_client_attach_event(link->dhcp_client, NULL, 0);
1898 r = sd_dhcp_client_set_mac(link->dhcp_client, &link->mac);
1902 r = sd_dhcp_client_set_index(link->dhcp_client, link->ifindex);
1906 r = sd_dhcp_client_set_callback(link->dhcp_client, dhcp_handler, link);
1910 if (link->network->dhcp_mtu) {
1911 r = sd_dhcp_client_set_request_option(link->dhcp_client, 26);
1917 if (link->network->dhcp_server) {
1918 r = sd_dhcp_server_new(&link->dhcp_server, link->ifindex);
1922 r = sd_dhcp_server_attach_event(link->dhcp_server, NULL, 0);
1927 if (link->network->dhcp6) {
1928 r = sd_icmp6_nd_new(&link->icmp6_router_discovery);
1932 r = sd_icmp6_nd_attach_event(link->icmp6_router_discovery,
1937 r = sd_icmp6_nd_set_mac(link->icmp6_router_discovery,
1942 r = sd_icmp6_nd_set_index(link->icmp6_router_discovery,
1947 r = sd_icmp6_nd_set_callback(link->icmp6_router_discovery,
1948 icmp6_router_handler, link);
1953 if (link_has_carrier(link->flags, link->kernel_operstate)) {
1954 r = link_acquire_conf(link);
1959 return link_enter_enslave(link);
1962 static int link_initialized_and_synced(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
1963 Link *link = userdata;
1968 assert(link->ifname);
1969 assert(link->manager);
1971 if (link->state != LINK_STATE_INITIALIZING)
1974 log_debug_link(link, "link state is up-to-date");
1976 r = network_get(link->manager, link->udev_device, link->ifname, &link->mac, &network);
1978 link_enter_unmanaged(link);
1983 r = network_apply(link->manager, network, link);
1987 r = link_configure(link);
1994 int link_initialized(Link *link, struct udev_device *device) {
1995 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
1999 assert(link->manager);
2000 assert(link->manager->rtnl);
2003 if (link->state != LINK_STATE_INITIALIZING)
2006 log_debug_link(link, "udev initialized link");
2008 link->udev_device = udev_device_ref(device);
2010 /* udev has initialized the link, but we don't know if we have yet processed
2011 the NEWLINK messages with the latest state. Do a GETLINK, when it returns
2012 we know that the pending NEWLINKs have already been processed and that we
2015 r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_GETLINK, link->ifindex);
2019 r = sd_rtnl_call_async(link->manager->rtnl, req, link_initialized_and_synced, link, 0, NULL);
2026 int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata) {
2027 Manager *m = userdata;
2030 _cleanup_address_free_ Address *address = NULL;
2032 char buf[INET6_ADDRSTRLEN];
2033 bool address_dropped = false;
2040 r = sd_rtnl_message_get_type(message, &type);
2042 log_warning("rtnl: could not get message type");
2046 r = sd_rtnl_message_addr_get_ifindex(message, &ifindex);
2047 if (r < 0 || ifindex <= 0) {
2048 log_warning("rtnl: received address message without valid ifindex, ignoring");
2051 r = link_get(m, ifindex, &link);
2052 if (r < 0 || !link) {
2053 log_warning("rtnl: received address for a nonexistent link, ignoring");
2058 r = address_new_dynamic(&address);
2062 r = sd_rtnl_message_addr_get_family(message, &address->family);
2063 if (r < 0 || !IN_SET(address->family, AF_INET, AF_INET6)) {
2064 log_warning_link(link, "rtnl: received address with invalid family, ignoring");
2068 r = sd_rtnl_message_addr_get_prefixlen(message, &address->prefixlen);
2070 log_warning_link(link, "rtnl: received address with invalid prefixlen, ignoring");
2074 r = sd_rtnl_message_addr_get_scope(message, &address->scope);
2076 log_warning_link(link, "rtnl: received address with invalid scope, ignoring");
2080 switch (address->family) {
2082 r = sd_rtnl_message_read_in_addr(message, IFA_LOCAL, &address->in_addr.in);
2084 log_warning_link(link, "rtnl: received address without valid address, ignoring");
2091 r = sd_rtnl_message_read_in6_addr(message, IFA_ADDRESS, &address->in_addr.in6);
2093 log_warning_link(link, "rtnl: received address without valid address, ignoring");
2100 assert_not_reached("invalid address family");
2103 if (!inet_ntop(address->family, &address->in_addr, buf, INET6_ADDRSTRLEN)) {
2104 log_warning_link(link, "could not print address");
2108 LIST_FOREACH(addresses, ad, link->addresses) {
2109 if (address_equal(ad, address)) {
2110 LIST_REMOVE(addresses, link->addresses, ad);
2114 address_dropped = true;
2122 if (!address_dropped)
2123 log_debug_link(link, "added address: %s/%u", buf,
2124 address->prefixlen);
2126 LIST_PREPEND(addresses, link->addresses, address);
2133 if (address_dropped) {
2134 log_debug_link(link, "removed address: %s/%u", buf,
2135 address->prefixlen);
2142 assert_not_reached("Received invalid RTNL message type");
2148 static int link_get_address_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
2149 Link *link = userdata;
2156 for (; m; m = sd_rtnl_message_next(m)) {
2157 r = sd_rtnl_message_get_errno(m);
2159 log_debug_link(link, "getting address failed: %s", strerror(-r));
2163 r = link_rtnl_process_address(rtnl, m, link->manager);
2165 log_warning_link(link, "could not process address: %s", strerror(-r));
2171 int link_add(Manager *m, sd_rtnl_message *message, Link **ret) {
2173 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
2174 _cleanup_udev_device_unref_ struct udev_device *device = NULL;
2175 char ifindex_str[2 + DECIMAL_STR_MAX(int)];
2183 r = link_new(m, message, ret);
2189 log_debug_link(link, "link %"PRIu64" added", link->ifindex);
2191 r = sd_rtnl_message_new_addr(m->rtnl, &req, RTM_GETADDR, link->ifindex, 0);
2195 r = sd_rtnl_call_async(m->rtnl, req, link_get_address_handler, link, 0, NULL);
2199 if (detect_container(NULL) <= 0) {
2200 /* not in a container, udev will be around */
2201 sprintf(ifindex_str, "n%"PRIu64, link->ifindex);
2202 device = udev_device_new_from_device_id(m->udev, ifindex_str);
2204 log_warning_link(link, "could not find udev device");
2208 if (udev_device_get_is_initialized(device) <= 0) {
2210 log_debug_link(link, "udev initializing link...");
2214 r = link_initialized(link, device);
2218 r = link_initialized_and_synced(m->rtnl, NULL, link);
2226 int link_update(Link *link, sd_rtnl_message *m) {
2227 struct ether_addr mac;
2232 assert(link->ifname);
2235 if (link->state == LINK_STATE_LINGER) {
2237 log_info_link(link, "link readded");
2238 link->state = LINK_STATE_ENSLAVING;
2241 r = sd_rtnl_message_read_string(m, IFLA_IFNAME, &ifname);
2242 if (r >= 0 && !streq(ifname, link->ifname)) {
2243 log_info_link(link, "renamed to %s", ifname);
2246 link->ifname = strdup(ifname);
2251 if (!link->original_mtu) {
2252 r = sd_rtnl_message_read_u16(m, IFLA_MTU, &link->original_mtu);
2254 log_debug_link(link, "saved original MTU: %"
2255 PRIu16, link->original_mtu);
2258 /* The kernel may broadcast NEWLINK messages without the MAC address
2259 set, simply ignore them. */
2260 r = sd_rtnl_message_read_ether_addr(m, IFLA_ADDRESS, &mac);
2262 if (memcmp(link->mac.ether_addr_octet, mac.ether_addr_octet, ETH_ALEN)) {
2264 memcpy(link->mac.ether_addr_octet, mac.ether_addr_octet, ETH_ALEN);
2266 log_debug_link(link, "MAC address: "
2267 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2268 mac.ether_addr_octet[0],
2269 mac.ether_addr_octet[1],
2270 mac.ether_addr_octet[2],
2271 mac.ether_addr_octet[3],
2272 mac.ether_addr_octet[4],
2273 mac.ether_addr_octet[5]);
2276 r = sd_ipv4ll_set_mac(link->ipv4ll, &link->mac);
2278 log_warning_link(link, "Could not update MAC "
2279 "address in IPv4LL client: %s",
2285 if (link->dhcp_client) {
2286 r = sd_dhcp_client_set_mac(link->dhcp_client, &link->mac);
2288 log_warning_link(link, "Could not update MAC "
2289 "address in DHCP client: %s",
2295 if (link->dhcp6_client) {
2296 r = sd_dhcp6_client_set_mac(link->dhcp6_client,
2299 log_warning_link(link, "Could not update MAC address in DHCPv6 client: %s",
2307 return link_update_flags(link, m);
2310 static void serialize_addresses(FILE *f, const char *key, Address *address) {
2319 fprintf(f, "%s=", key);
2321 LIST_FOREACH(addresses, ad, address) {
2322 char buf[INET6_ADDRSTRLEN];
2324 if (inet_ntop(ad->family, &ad->in_addr, buf, INET6_ADDRSTRLEN))
2325 fprintf(f, "%s%s", buf, (ad->addresses_next) ? " ": "");
2331 static void link_update_operstate(Link *link) {
2335 if (link->kernel_operstate == IF_OPER_DORMANT)
2336 link->operstate = LINK_OPERSTATE_DORMANT;
2337 else if (link_has_carrier(link->flags, link->kernel_operstate)) {
2339 uint8_t scope = RT_SCOPE_NOWHERE;
2341 /* if we have carrier, check what addresses we have */
2342 LIST_FOREACH(addresses, address, link->addresses) {
2343 if (address->scope < scope)
2344 scope = address->scope;
2347 if (scope < RT_SCOPE_SITE)
2348 /* universally accessible addresses found */
2349 link->operstate = LINK_OPERSTATE_ROUTABLE;
2350 else if (scope < RT_SCOPE_HOST)
2351 /* only link or site local addresses found */
2352 link->operstate = LINK_OPERSTATE_DEGRADED;
2354 /* no useful addresses found */
2355 link->operstate = LINK_OPERSTATE_CARRIER;
2357 link->operstate = LINK_OPERSTATE_UNKNOWN;
2360 int link_save(Link *link) {
2361 _cleanup_free_ char *temp_path = NULL;
2362 _cleanup_fclose_ FILE *f = NULL;
2363 const char *admin_state, *oper_state;
2367 assert(link->state_file);
2368 assert(link->lease_file);
2369 assert(link->manager);
2371 link_update_operstate(link);
2373 r = manager_save(link->manager);
2377 if (link->state == LINK_STATE_LINGER) {
2378 unlink(link->state_file);
2382 admin_state = link_state_to_string(link->state);
2383 assert(admin_state);
2385 oper_state = link_operstate_to_string(link->operstate);
2388 r = fopen_temporary(link->state_file, &f, &temp_path);
2392 fchmod(fileno(f), 0644);
2395 "# This is private data. Do not parse.\n"
2399 admin_state, oper_state, link->flags);
2401 if (link->network) {
2402 serialize_addresses(f, "DNS", link->network->dns);
2403 serialize_addresses(f, "NTP", link->network->ntp);
2406 if (link->dhcp_lease) {
2407 assert(link->network);
2409 r = dhcp_lease_save(link->dhcp_lease, link->lease_file);
2416 "DHCP_USE_NTP=%s\n",
2418 yes_no(link->network->dhcp_dns),
2419 yes_no(link->network->dhcp_ntp));
2421 unlink(link->lease_file);
2425 if (ferror(f) || rename(temp_path, link->state_file) < 0) {
2427 unlink(link->state_file);
2433 log_error_link(link, "Failed to save link data to %s: %s", link->state_file, strerror(-r));
2438 static const char* const link_state_table[_LINK_STATE_MAX] = {
2439 [LINK_STATE_INITIALIZING] = "initializing",
2440 [LINK_STATE_ENSLAVING] = "configuring",
2441 [LINK_STATE_SETTING_ADDRESSES] = "configuring",
2442 [LINK_STATE_SETTING_ROUTES] = "configuring",
2443 [LINK_STATE_CONFIGURED] = "configured",
2444 [LINK_STATE_UNMANAGED] = "unmanaged",
2445 [LINK_STATE_FAILED] = "failed",
2446 [LINK_STATE_LINGER] = "linger",
2449 DEFINE_STRING_TABLE_LOOKUP(link_state, LinkState);
2451 static const char* const link_operstate_table[_LINK_OPERSTATE_MAX] = {
2452 [LINK_OPERSTATE_UNKNOWN] = "unknown",
2453 [LINK_OPERSTATE_DORMANT] = "dormant",
2454 [LINK_OPERSTATE_CARRIER] = "carrier",
2455 [LINK_OPERSTATE_DEGRADED] = "degraded",
2456 [LINK_OPERSTATE_ROUTABLE] = "routable",
2459 DEFINE_STRING_TABLE_LOOKUP(link_operstate, LinkOperationalState);