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"
32 #include "conf-parser.h"
34 #include "network-util.h"
35 #include "dhcp-lease-internal.h"
37 static int ipv4ll_address_update(Link *link, bool deprecate);
38 static bool ipv4ll_is_bound(sd_ipv4ll *ll);
40 static int link_new(Manager *manager, sd_rtnl_message *message, Link **ret) {
41 _cleanup_link_unref_ Link *link = NULL;
47 assert(manager->links);
51 r = sd_rtnl_message_get_type(message, &type);
54 else if (type != RTM_NEWLINK)
57 r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
60 else if (ifindex <= 0)
63 r = sd_rtnl_message_read_string(message, IFLA_IFNAME, &ifname);
72 link->manager = manager;
73 link->state = LINK_STATE_INITIALIZING;
74 link->ifindex = ifindex;
75 link->ifname = strdup(ifname);
79 r = sd_rtnl_message_read_ether_addr(message, IFLA_ADDRESS, &link->mac);
83 r = asprintf(&link->state_file, "/run/systemd/netif/links/%"PRIu64,
88 r = asprintf(&link->lease_file, "/run/systemd/netif/leases/%"PRIu64,
93 r = hashmap_put(manager->links, &link->ifindex, link);
103 static void link_free(Link *link) {
109 assert(link->manager);
111 while ((address = link->addresses)) {
112 LIST_REMOVE(addresses, link->addresses, address);
113 address_free(address);
116 while ((address = link->pool_addresses)) {
117 LIST_REMOVE(addresses, link->pool_addresses, address);
118 address_free(address);
121 sd_dhcp_client_unref(link->dhcp_client);
122 sd_dhcp_lease_unref(link->dhcp_lease);
124 unlink(link->lease_file);
125 free(link->lease_file);
127 sd_ipv4ll_unref(link->ipv4ll);
128 sd_dhcp6_client_unref(link->dhcp6_client);
129 sd_icmp6_nd_unref(link->icmp6_router_discovery);
131 hashmap_remove(link->manager->links, &link->ifindex);
135 unlink(link->state_file);
136 free(link->state_file);
138 udev_device_unref(link->udev_device);
143 Link *link_unref(Link *link) {
144 if (link && (-- link->n_ref <= 0))
150 Link *link_ref(Link *link) {
152 assert_se(++ link->n_ref >= 2);
157 int link_get(Manager *m, int ifindex, Link **ret) {
166 ifindex_64 = ifindex;
167 link = hashmap_get(m->links, &ifindex_64);
176 void link_drop(Link *link) {
177 if (!link || link->state == LINK_STATE_LINGER)
180 link->state = LINK_STATE_LINGER;
182 log_debug_link(link, "link removed");
189 static void link_enter_unmanaged(Link *link) {
192 log_debug_link(link, "unmanaged");
194 link->state = LINK_STATE_UNMANAGED;
199 static int link_stop_clients(Link *link) {
203 assert(link->manager);
204 assert(link->manager->event);
209 if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V6)) {
210 assert(link->dhcp_client);
212 k = sd_dhcp_client_stop(link->dhcp_client);
214 log_warning_link(link, "Could not stop DHCPv4 client: %s", strerror(-r));
219 if (link->network->ipv4ll) {
220 assert(link->ipv4ll);
222 k = sd_ipv4ll_stop(link->ipv4ll);
224 log_warning_link(link, "Could not stop IPv4 link-local: %s", strerror(-r));
229 if (link->network->dhcp_server) {
230 assert(link->dhcp_server);
232 k = sd_dhcp_server_stop(link->dhcp_server);
234 log_warning_link(link, "Could not stop DHCPv4 server: %s", strerror(-r));
239 if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V6)) {
240 assert(link->icmp6_router_discovery);
242 if (link->dhcp6_client) {
243 k = sd_dhcp6_client_stop(link->dhcp6_client);
245 log_warning_link(link, "Could not stop DHCPv6 client: %s", strerror(-r));
250 k = sd_icmp6_nd_stop(link->icmp6_router_discovery);
252 log_warning_link(link, "Could not stop ICMPv6 router discovery: %s", strerror(-r));
260 static void link_enter_failed(Link *link) {
263 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
266 log_warning_link(link, "failed");
268 link->state = LINK_STATE_FAILED;
270 link_stop_clients(link);
275 static Address* link_find_dhcp_server_address(Link *link) {
279 assert(link->network);
281 /* The the first statically configured address if there is any */
282 LIST_FOREACH(addresses, address, link->network->static_addresses) {
284 if (address->family != AF_INET)
287 if (in_addr_null(address->family, &address->in_addr))
293 /* If that didn't work, find a suitable address we got from the pool */
294 LIST_FOREACH(addresses, address, link->pool_addresses) {
295 if (address->family != AF_INET)
304 static int link_enter_configured(Link *link) {
308 assert(link->network);
309 assert(link->state == LINK_STATE_SETTING_ROUTES);
311 if (link->network->dhcp_server &&
312 !sd_dhcp_server_is_running(link->dhcp_server)) {
313 struct in_addr pool_start;
316 address = link_find_dhcp_server_address(link);
318 log_warning_link(link, "Failed to find suitable address for DHCPv4 server instance.");
319 link_enter_failed(link);
323 log_debug_link(link, "offering DHCPv4 leases");
325 r = sd_dhcp_server_set_address(link->dhcp_server, &address->in_addr.in);
329 /* offer 32 addresses starting from the address following the server address */
330 pool_start.s_addr = htobe32(be32toh(address->in_addr.in.s_addr) + 1);
331 r = sd_dhcp_server_set_lease_pool(link->dhcp_server,
337 r = sd_dhcp_server_set_router(link->dhcp_server,
338 &main_address->in_addr.in);
342 r = sd_dhcp_server_set_prefixlen(link->dhcp_server,
343 main_address->prefixlen);
348 r = sd_dhcp_server_start(link->dhcp_server);
350 log_warning_link(link, "could not start DHCPv4 server "
351 "instance: %s", strerror(-r));
353 link_enter_failed(link);
359 log_info_link(link, "link configured");
361 link->state = LINK_STATE_CONFIGURED;
368 static int route_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
369 Link *link = userdata;
372 assert(link->route_messages > 0);
373 assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
374 LINK_STATE_SETTING_ROUTES, LINK_STATE_FAILED,
377 link->route_messages --;
379 if (IN_SET(LINK_STATE_FAILED, LINK_STATE_LINGER)) {
384 r = sd_rtnl_message_get_errno(m);
385 if (r < 0 && r != -EEXIST)
386 log_struct_link(LOG_WARNING, link,
387 "MESSAGE=%-*s: could not set route: %s",
389 link->ifname, strerror(-r),
393 /* we might have received an old reply after moving back to SETTING_ADDRESSES,
395 if (link->route_messages == 0 && link->state == LINK_STATE_SETTING_ROUTES) {
396 log_debug_link(link, "routes set");
397 link_enter_configured(link);
405 static int link_set_dhcp_routes(Link *link) {
406 struct sd_dhcp_route *static_routes;
407 size_t static_routes_size;
413 r = sd_dhcp_lease_get_routes(link->dhcp_lease, &static_routes, &static_routes_size);
416 log_warning_link(link, "DHCP error: could not get routes: %s", strerror(-r));
420 for (i = 0; i < static_routes_size; i++) {
421 _cleanup_route_free_ Route *route = NULL;
423 r = route_new_dynamic(&route);
425 log_error_link(link, "Could not allocate route: %s",
430 route->family = AF_INET;
431 route->in_addr.in = static_routes[i].gw_addr;
432 route->dst_addr.in = static_routes[i].dst_addr;
433 route->dst_prefixlen = static_routes[i].dst_prefixlen;
434 route->metrics = DHCP_STATIC_ROUTE_METRIC;
436 r = route_configure(route, link, &route_handler);
438 log_warning_link(link,
439 "could not set host route: %s", strerror(-r));
444 link->route_messages ++;
450 static int link_enter_set_routes(Link *link) {
455 assert(link->network);
456 assert(link->state == LINK_STATE_SETTING_ADDRESSES);
458 link->state = LINK_STATE_SETTING_ROUTES;
460 if (!link->network->static_routes && !link->dhcp_lease &&
461 (!link->ipv4ll || ipv4ll_is_bound(link->ipv4ll) == false))
462 return link_enter_configured(link);
464 log_debug_link(link, "setting routes");
466 LIST_FOREACH(routes, rt, link->network->static_routes) {
467 r = route_configure(rt, link, &route_handler);
469 log_warning_link(link,
470 "could not set routes: %s", strerror(-r));
471 link_enter_failed(link);
476 link->route_messages ++;
479 if (link->ipv4ll && !link->dhcp_lease) {
480 _cleanup_route_free_ Route *route = NULL;
483 r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
484 if (r < 0 && r != -ENOENT) {
485 log_warning_link(link, "IPV4LL error: no address: %s",
491 r = route_new_dynamic(&route);
493 log_error_link(link, "Could not allocate route: %s",
498 route->family = AF_INET;
499 route->scope = RT_SCOPE_LINK;
502 r = route_configure(route, link, &route_handler);
504 log_warning_link(link,
505 "could not set routes: %s", strerror(-r));
506 link_enter_failed(link);
511 link->route_messages ++;
515 if (link->dhcp_lease) {
516 _cleanup_route_free_ Route *route = NULL;
517 _cleanup_route_free_ Route *route_gw = NULL;
518 struct in_addr gateway;
520 r = sd_dhcp_lease_get_router(link->dhcp_lease, &gateway);
521 if (r < 0 && r != -ENOENT) {
522 log_warning_link(link, "DHCP error: could not get gateway: %s",
528 r = route_new_dynamic(&route);
530 log_error_link(link, "Could not allocate route: %s",
535 r = route_new_dynamic(&route_gw);
537 log_error_link(link, "Could not allocate route: %s",
542 /* The dhcp netmask may mask out the gateway. Add an explicit
543 * route for the gw host so that we can route no matter the
544 * netmask or existing kernel route tables. */
545 route_gw->family = AF_INET;
546 route_gw->dst_addr.in = gateway;
547 route_gw->dst_prefixlen = 32;
548 route_gw->scope = RT_SCOPE_LINK;
550 r = route_configure(route_gw, link, &route_handler);
552 log_warning_link(link,
553 "could not set host route: %s", strerror(-r));
558 link->route_messages ++;
560 route->family = AF_INET;
561 route->in_addr.in = gateway;
563 r = route_configure(route, link, &route_handler);
565 log_warning_link(link,
566 "could not set routes: %s", strerror(-r));
567 link_enter_failed(link);
572 link->route_messages ++;
575 if (link->network->dhcp_routes)
576 link_set_dhcp_routes(link);
579 if (link->route_messages == 0) {
580 link_enter_configured(link);
586 static int route_drop_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
587 Link *link = userdata;
592 assert(link->ifname);
594 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
599 r = sd_rtnl_message_get_errno(m);
600 if (r < 0 && r != -ESRCH)
601 log_struct_link(LOG_WARNING, link,
602 "MESSAGE=%-*s: could not drop route: %s",
604 link->ifname, strerror(-r),
613 static int address_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
614 Link *link = userdata;
619 assert(link->ifname);
620 assert(link->addr_messages > 0);
621 assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
622 LINK_STATE_FAILED, LINK_STATE_LINGER));
624 link->addr_messages --;
626 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
631 r = sd_rtnl_message_get_errno(m);
632 if (r < 0 && r != -EEXIST)
633 log_struct_link(LOG_WARNING, link,
634 "MESSAGE=%-*s: could not set address: %s",
636 link->ifname, strerror(-r),
640 if (link->addr_messages == 0) {
641 log_debug_link(link, "addresses set");
642 link_enter_set_routes(link);
650 static int link_enter_set_addresses(Link *link) {
653 uint32_t lifetime = CACHE_INFO_INFINITY_LIFE_TIME;
656 assert(link->network);
657 assert(link->state != _LINK_STATE_INVALID);
659 link->state = LINK_STATE_SETTING_ADDRESSES;
661 if (!link->network->static_addresses && !link->dhcp_lease &&
662 (!link->ipv4ll || ipv4ll_is_bound(link->ipv4ll) == false))
663 return link_enter_set_routes(link);
665 log_debug_link(link, "setting addresses");
667 LIST_FOREACH(addresses, ad, link->network->static_addresses) {
668 r = address_configure(ad, link, &address_handler);
670 log_warning_link(link,
671 "could not set addresses: %s", strerror(-r));
672 link_enter_failed(link);
677 link->addr_messages ++;
680 if (link->ipv4ll && !link->dhcp_lease) {
681 _cleanup_address_free_ Address *ll_addr = NULL;
684 r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
685 if (r < 0 && r != -ENOENT) {
686 log_warning_link(link, "IPV4LL error: no address: %s",
692 r = address_new_dynamic(&ll_addr);
694 log_error_link(link, "Could not allocate address: %s", strerror(-r));
698 ll_addr->family = AF_INET;
699 ll_addr->in_addr.in = addr;
700 ll_addr->prefixlen = 16;
701 ll_addr->broadcast.s_addr = ll_addr->in_addr.in.s_addr | htonl(0xfffffffflu >> ll_addr->prefixlen);
702 ll_addr->scope = RT_SCOPE_LINK;
704 r = address_configure(ll_addr, link, &address_handler);
706 log_warning_link(link,
707 "could not set addresses: %s", strerror(-r));
708 link_enter_failed(link);
713 link->addr_messages ++;
717 if (link->dhcp_lease) {
718 _cleanup_address_free_ Address *address = NULL;
720 struct in_addr netmask;
723 r = sd_dhcp_lease_get_address(link->dhcp_lease, &addr);
725 log_warning_link(link, "DHCP error: no address: %s",
730 if (!link->network->dhcp_critical) {
731 r = sd_dhcp_lease_get_lifetime(link->dhcp_lease,
734 log_warning_link(link, "DHCP error: no lifetime: %s",
740 r = sd_dhcp_lease_get_netmask(link->dhcp_lease, &netmask);
742 log_warning_link(link, "DHCP error: no netmask: %s",
747 prefixlen = net_netmask_to_prefixlen(&netmask);
749 r = address_new_dynamic(&address);
751 log_error_link(link, "Could not allocate address: %s",
756 address->family = AF_INET;
757 address->in_addr.in = addr;
758 address->cinfo.ifa_prefered = lifetime;
759 address->cinfo.ifa_valid = lifetime;
760 address->prefixlen = prefixlen;
761 address->broadcast.s_addr = addr.s_addr | ~netmask.s_addr;
763 /* use update rather than configure so that we will update the lifetime
764 of an existing address if it has already been configured */
765 r = address_update(address, link, &address_handler);
767 log_warning_link(link,
768 "could not set addresses: %s", strerror(-r));
769 link_enter_failed(link);
774 link->addr_messages ++;
780 static int address_update_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
781 Link *link = userdata;
786 assert(link->ifname);
788 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
793 r = sd_rtnl_message_get_errno(m);
794 if (r < 0 && r != -ENOENT)
795 log_struct_link(LOG_WARNING, link,
796 "MESSAGE=%-*s: could not update address: %s",
798 link->ifname, strerror(-r),
807 static int address_drop_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
808 Link *link = userdata;
813 assert(link->ifname);
815 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
820 r = sd_rtnl_message_get_errno(m);
821 if (r < 0 && r != -EADDRNOTAVAIL)
822 log_struct_link(LOG_WARNING, link,
823 "MESSAGE=%-*s: could not drop address: %s",
825 link->ifname, strerror(-r),
834 static int set_hostname_handler(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
835 Link *link = userdata;
840 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
845 r = sd_bus_message_get_errno(m);
847 log_warning_link(link, "Could not set hostname: %s", strerror(-r));
854 static int link_set_hostname(Link *link, const char *hostname) {
855 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
859 assert(link->manager);
862 log_debug_link(link, "Setting transient hostname: '%s'", hostname);
864 if (!link->manager->bus) { /* TODO: replace by assert when we can rely on kdbus */
865 log_info_link(link, "Not connected to system bus, ignoring transient hostname.");
869 r = sd_bus_message_new_method_call(
872 "org.freedesktop.hostname1",
873 "/org/freedesktop/hostname1",
874 "org.freedesktop.hostname1",
879 r = sd_bus_message_append(m, "sb", hostname, false);
883 r = sd_bus_call_async(link->manager->bus, NULL, m, set_hostname_handler, link, 0);
885 log_error_link(link, "Could not set transient hostname: %s", strerror(-r));
892 static int set_mtu_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
893 Link *link = userdata;
898 assert(link->ifname);
900 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
905 r = sd_rtnl_message_get_errno(m);
907 log_struct_link(LOG_WARNING, link,
908 "MESSAGE=%-*s: could not set MTU: %s",
909 IFNAMSIZ, link->ifname, strerror(-r),
918 static int link_set_mtu(Link *link, uint32_t mtu) {
919 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
923 assert(link->manager);
924 assert(link->manager->rtnl);
926 log_debug_link(link, "setting MTU: %" PRIu32, mtu);
928 r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
929 RTM_SETLINK, link->ifindex);
931 log_error_link(link, "Could not allocate RTM_SETLINK message");
935 r = sd_rtnl_message_append_u32(req, IFLA_MTU, mtu);
937 log_error_link(link, "Could not append MTU: %s", strerror(-r));
941 r = sd_rtnl_call_async(link->manager->rtnl, req, set_mtu_handler, link, 0, NULL);
944 "Could not send rtnetlink message: %s", strerror(-r));
953 static int dhcp_lease_lost(Link *link) {
954 _cleanup_address_free_ Address *address = NULL;
956 struct in_addr netmask;
957 struct in_addr gateway;
963 assert(link->dhcp_lease);
965 log_warning_link(link, "DHCP lease lost");
967 if (link->network->dhcp_routes) {
968 struct sd_dhcp_route *routes;
971 r = sd_dhcp_lease_get_routes(link->dhcp_lease, &routes, &routes_size);
973 for (i = 0; i < routes_size; i++) {
974 _cleanup_route_free_ Route *route = NULL;
976 r = route_new_dynamic(&route);
978 route->family = AF_INET;
979 route->in_addr.in = routes[i].gw_addr;
980 route->dst_addr.in = routes[i].dst_addr;
981 route->dst_prefixlen = routes[i].dst_prefixlen;
983 route_drop(route, link, &route_drop_handler);
990 r = address_new_dynamic(&address);
992 r = sd_dhcp_lease_get_router(link->dhcp_lease, &gateway);
994 _cleanup_route_free_ Route *route_gw = NULL;
995 _cleanup_route_free_ Route *route = NULL;
997 r = route_new_dynamic(&route_gw);
999 route_gw->family = AF_INET;
1000 route_gw->dst_addr.in = gateway;
1001 route_gw->dst_prefixlen = 32;
1002 route_gw->scope = RT_SCOPE_LINK;
1004 route_drop(route_gw, link, &route_drop_handler);
1008 r = route_new_dynamic(&route);
1010 route->family = AF_INET;
1011 route->in_addr.in = gateway;
1013 route_drop(route, link, &route_drop_handler);
1018 sd_dhcp_lease_get_address(link->dhcp_lease, &addr);
1019 sd_dhcp_lease_get_netmask(link->dhcp_lease, &netmask);
1020 prefixlen = net_netmask_to_prefixlen(&netmask);
1022 address->family = AF_INET;
1023 address->in_addr.in = addr;
1024 address->prefixlen = prefixlen;
1026 address_drop(address, link, &address_drop_handler);
1030 if (link->network->dhcp_mtu) {
1033 r = sd_dhcp_lease_get_mtu(link->dhcp_lease, &mtu);
1034 if (r >= 0 && link->original_mtu != mtu) {
1035 r = link_set_mtu(link, link->original_mtu);
1037 log_warning_link(link, "DHCP error: could not reset MTU");
1038 link_enter_failed(link);
1044 if (link->network->dhcp_hostname) {
1045 const char *hostname = NULL;
1047 r = sd_dhcp_lease_get_hostname(link->dhcp_lease, &hostname);
1048 if (r >= 0 && hostname) {
1049 r = link_set_hostname(link, "");
1051 log_error_link(link, "Failed to reset transient hostname");
1055 link->dhcp_lease = sd_dhcp_lease_unref(link->dhcp_lease);
1060 static int dhcp_lease_renew(sd_dhcp_client *client, Link *link) {
1061 sd_dhcp_lease *lease;
1064 r = sd_dhcp_client_get_lease(client, &lease);
1066 log_warning_link(link, "DHCP error: no lease %s",
1071 sd_dhcp_lease_unref(link->dhcp_lease);
1072 link->dhcp_lease = lease;
1074 link_enter_set_addresses(link);
1079 static int dhcp_lease_acquired(sd_dhcp_client *client, Link *link) {
1080 sd_dhcp_lease *lease;
1081 struct in_addr address;
1082 struct in_addr netmask;
1083 struct in_addr gateway;
1090 r = sd_dhcp_client_get_lease(client, &lease);
1092 log_warning_link(link, "DHCP error: no lease: %s",
1097 r = sd_dhcp_lease_get_address(lease, &address);
1099 log_warning_link(link, "DHCP error: no address: %s",
1104 r = sd_dhcp_lease_get_netmask(lease, &netmask);
1106 log_warning_link(link, "DHCP error: no netmask: %s",
1111 prefixlen = net_netmask_to_prefixlen(&netmask);
1113 r = sd_dhcp_lease_get_router(lease, &gateway);
1114 if (r < 0 && r != -ENOENT) {
1115 log_warning_link(link, "DHCP error: could not get gateway: %s",
1121 log_struct_link(LOG_INFO, link,
1122 "MESSAGE=%-*s: DHCPv4 address %u.%u.%u.%u/%u via %u.%u.%u.%u",
1125 ADDRESS_FMT_VAL(address),
1127 ADDRESS_FMT_VAL(gateway),
1128 "ADDRESS=%u.%u.%u.%u",
1129 ADDRESS_FMT_VAL(address),
1132 "GATEWAY=%u.%u.%u.%u",
1133 ADDRESS_FMT_VAL(gateway),
1136 log_struct_link(LOG_INFO, link,
1137 "MESSAGE=%-*s: DHCPv4 address %u.%u.%u.%u/%u",
1140 ADDRESS_FMT_VAL(address),
1142 "ADDRESS=%u.%u.%u.%u",
1143 ADDRESS_FMT_VAL(address),
1148 link->dhcp_lease = lease;
1150 if (link->network->dhcp_mtu) {
1153 r = sd_dhcp_lease_get_mtu(lease, &mtu);
1155 r = link_set_mtu(link, mtu);
1157 log_error_link(link, "Failed to set MTU "
1158 "to %" PRIu16, mtu);
1162 if (link->network->dhcp_hostname) {
1163 const char *hostname;
1165 r = sd_dhcp_lease_get_hostname(lease, &hostname);
1167 r = link_set_hostname(link, hostname);
1169 log_error_link(link, "Failed to set transient hostname "
1170 "to '%s'", hostname);
1174 link_enter_set_addresses(link);
1179 static void dhcp_handler(sd_dhcp_client *client, int event, void *userdata) {
1180 Link *link = userdata;
1184 assert(link->network);
1185 assert(link->manager);
1187 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1191 case DHCP_EVENT_NO_LEASE:
1192 log_debug_link(link, "IP address in use.");
1194 case DHCP_EVENT_EXPIRED:
1195 case DHCP_EVENT_STOP:
1196 case DHCP_EVENT_IP_CHANGE:
1197 if (link->network->dhcp_critical) {
1198 log_error_link(link, "DHCPv4 connection considered system critical, "
1199 "ignoring request to reconfigure it.");
1203 if (link->dhcp_lease) {
1204 r = dhcp_lease_lost(link);
1206 link_enter_failed(link);
1211 if (event == DHCP_EVENT_IP_CHANGE) {
1212 r = dhcp_lease_acquired(client, link);
1214 link_enter_failed(link);
1219 if (event == DHCP_EVENT_EXPIRED && link->network->ipv4ll) {
1220 if (!sd_ipv4ll_is_running(link->ipv4ll))
1221 r = sd_ipv4ll_start(link->ipv4ll);
1222 else if (ipv4ll_is_bound(link->ipv4ll))
1223 r = ipv4ll_address_update(link, false);
1225 link_enter_failed(link);
1231 case DHCP_EVENT_RENEW:
1232 r = dhcp_lease_renew(client, link);
1234 link_enter_failed(link);
1238 case DHCP_EVENT_IP_ACQUIRE:
1239 r = dhcp_lease_acquired(client, link);
1241 link_enter_failed(link);
1245 if (ipv4ll_is_bound(link->ipv4ll))
1246 r = ipv4ll_address_update(link, true);
1248 r = sd_ipv4ll_stop(link->ipv4ll);
1250 link_enter_failed(link);
1257 log_warning_link(link, "DHCP error: client failed: %s", strerror(-event));
1259 log_warning_link(link, "DHCP unknown event: %d", event);
1266 static int ipv4ll_address_update(Link *link, bool deprecate) {
1268 struct in_addr addr;
1272 r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
1274 _cleanup_address_free_ Address *address = NULL;
1276 log_debug_link(link, "IPv4 link-local %s %u.%u.%u.%u",
1277 deprecate ? "deprecate" : "approve",
1278 ADDRESS_FMT_VAL(addr));
1280 r = address_new_dynamic(&address);
1282 log_error_link(link, "Could not allocate address: %s", strerror(-r));
1286 address->family = AF_INET;
1287 address->in_addr.in = addr;
1288 address->prefixlen = 16;
1289 address->scope = RT_SCOPE_LINK;
1290 address->cinfo.ifa_prefered = deprecate ? 0 : CACHE_INFO_INFINITY_LIFE_TIME;
1291 address->broadcast.s_addr = address->in_addr.in.s_addr | htonl(0xfffffffflu >> address->prefixlen);
1293 address_update(address, link, &address_update_handler);
1301 static int ipv4ll_address_lost(Link *link) {
1303 struct in_addr addr;
1307 r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
1309 _cleanup_address_free_ Address *address = NULL;
1310 _cleanup_route_free_ Route *route = NULL;
1312 log_debug_link(link, "IPv4 link-local release %u.%u.%u.%u",
1313 ADDRESS_FMT_VAL(addr));
1315 r = address_new_dynamic(&address);
1317 log_error_link(link, "Could not allocate address: %s", strerror(-r));
1321 address->family = AF_INET;
1322 address->in_addr.in = addr;
1323 address->prefixlen = 16;
1324 address->scope = RT_SCOPE_LINK;
1326 address_drop(address, link, &address_drop_handler);
1329 r = route_new_dynamic(&route);
1331 log_error_link(link, "Could not allocate route: %s",
1336 route->family = AF_INET;
1337 route->scope = RT_SCOPE_LINK;
1338 route->metrics = 99;
1340 route_drop(route, link, &route_drop_handler);
1347 static bool ipv4ll_is_bound(sd_ipv4ll *ll) {
1349 struct in_addr addr;
1353 r = sd_ipv4ll_get_address(ll, &addr);
1359 static int ipv4ll_address_claimed(sd_ipv4ll *ll, Link *link) {
1360 struct in_addr address;
1366 r = sd_ipv4ll_get_address(ll, &address);
1370 log_struct_link(LOG_INFO, link,
1371 "MESSAGE=%-*s: IPv4 link-local address %u.%u.%u.%u",
1374 ADDRESS_FMT_VAL(address),
1377 link_enter_set_addresses(link);
1382 static void ipv4ll_handler(sd_ipv4ll *ll, int event, void *userdata){
1383 Link *link = userdata;
1387 assert(link->network);
1388 assert(link->manager);
1390 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1394 case IPV4LL_EVENT_STOP:
1395 case IPV4LL_EVENT_CONFLICT:
1396 r = ipv4ll_address_lost(link);
1398 link_enter_failed(link);
1402 case IPV4LL_EVENT_BIND:
1403 r = ipv4ll_address_claimed(ll, link);
1405 link_enter_failed(link);
1411 log_warning_link(link, "IPv4 link-local error: %s", strerror(-event));
1413 log_warning_link(link, "IPv4 link-local unknown event: %d", event);
1418 static void dhcp6_handler(sd_dhcp6_client *client, int event, void *userdata) {
1419 Link *link = userdata;
1422 assert(link->network);
1423 assert(link->manager);
1425 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1429 case DHCP6_EVENT_STOP:
1430 case DHCP6_EVENT_RESEND_EXPIRE:
1431 case DHCP6_EVENT_RETRANS_MAX:
1432 case DHCP6_EVENT_IP_ACQUIRE:
1433 log_debug_link(link, "DHCPv6 event %d", event);
1439 log_warning_link(link, "DHCPv6 error: %s",
1442 log_warning_link(link, "DHCPv6 unknown event: %d",
1448 static void icmp6_router_handler(sd_icmp6_nd *nd, int event, void *userdata) {
1449 Link *link = userdata;
1453 assert(link->network);
1454 assert(link->manager);
1456 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1460 case ICMP6_EVENT_ROUTER_ADVERTISMENT_NONE:
1461 case ICMP6_EVENT_ROUTER_ADVERTISMENT_OTHER:
1464 case ICMP6_EVENT_ROUTER_ADVERTISMENT_TIMEOUT:
1465 case ICMP6_EVENT_ROUTER_ADVERTISMENT_MANAGED:
1470 log_warning_link(link, "ICMPv6 error: %s",
1473 log_warning_link(link, "ICMPv6 unknown event: %d",
1479 if (link->dhcp6_client)
1482 r = sd_dhcp6_client_new(&link->dhcp6_client);
1486 r = sd_dhcp6_client_attach_event(link->dhcp6_client, NULL, 0);
1488 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1492 r = sd_dhcp6_client_set_mac(link->dhcp6_client, &link->mac);
1494 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1498 r = sd_dhcp6_client_set_index(link->dhcp6_client, link->ifindex);
1500 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1504 r = sd_dhcp6_client_set_callback(link->dhcp6_client, dhcp6_handler,
1507 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1511 r = sd_dhcp6_client_start(link->dhcp6_client);
1513 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1516 static int link_acquire_conf(Link *link) {
1520 assert(link->network);
1521 assert(link->manager);
1522 assert(link->manager->event);
1524 if (link->network->ipv4ll) {
1525 assert(link->ipv4ll);
1527 log_debug_link(link, "acquiring IPv4 link-local address");
1529 r = sd_ipv4ll_start(link->ipv4ll);
1531 log_warning_link(link, "could not acquire IPv4 "
1532 "link-local address");
1537 if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4)) {
1538 assert(link->dhcp_client);
1540 log_debug_link(link, "acquiring DHCPv4 lease");
1542 r = sd_dhcp_client_start(link->dhcp_client);
1544 log_warning_link(link, "could not acquire DHCPv4 "
1550 if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V6)) {
1551 assert(link->icmp6_router_discovery);
1553 log_debug_link(link, "discovering IPv6 routers");
1555 r = sd_icmp6_router_solicitation_start(link->icmp6_router_discovery);
1557 log_warning_link(link, "could not start IPv6 router discovery");
1565 bool link_has_carrier(unsigned flags, uint8_t operstate) {
1566 /* see Documentation/networking/operstates.txt in the kernel sources */
1568 if (operstate == IF_OPER_UP)
1571 if (operstate == IF_OPER_UNKNOWN)
1572 /* operstate may not be implemented, so fall back to flags */
1573 if ((flags & IFF_LOWER_UP) && !(flags & IFF_DORMANT))
1579 #define FLAG_STRING(string, flag, old, new) \
1580 (((old ^ new) & flag) \
1581 ? ((old & flag) ? (" -" string) : (" +" string)) \
1584 static int link_update_flags(Link *link, sd_rtnl_message *m) {
1585 unsigned flags, unknown_flags_added, unknown_flags_removed, unknown_flags;
1587 bool carrier_gained = false, carrier_lost = false;
1592 r = sd_rtnl_message_link_get_flags(m, &flags);
1594 log_warning_link(link, "Could not get link flags");
1598 r = sd_rtnl_message_read_u8(m, IFLA_OPERSTATE, &operstate);
1600 /* if we got a message without operstate, take it to mean
1601 the state was unchanged */
1602 operstate = link->kernel_operstate;
1604 if ((link->flags == flags) && (link->kernel_operstate == operstate))
1607 if (link->flags != flags) {
1608 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",
1609 FLAG_STRING("LOOPBACK", IFF_LOOPBACK, link->flags, flags),
1610 FLAG_STRING("MASTER", IFF_MASTER, link->flags, flags),
1611 FLAG_STRING("SLAVE", IFF_SLAVE, link->flags, flags),
1612 FLAG_STRING("UP", IFF_UP, link->flags, flags),
1613 FLAG_STRING("DORMANT", IFF_DORMANT, link->flags, flags),
1614 FLAG_STRING("LOWER_UP", IFF_LOWER_UP, link->flags, flags),
1615 FLAG_STRING("RUNNING", IFF_RUNNING, link->flags, flags),
1616 FLAG_STRING("MULTICAST", IFF_MULTICAST, link->flags, flags),
1617 FLAG_STRING("BROADCAST", IFF_BROADCAST, link->flags, flags),
1618 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT, link->flags, flags),
1619 FLAG_STRING("PROMISC", IFF_PROMISC, link->flags, flags),
1620 FLAG_STRING("ALLMULTI", IFF_ALLMULTI, link->flags, flags),
1621 FLAG_STRING("PORTSEL", IFF_PORTSEL, link->flags, flags),
1622 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA, link->flags, flags),
1623 FLAG_STRING("DYNAMIC", IFF_DYNAMIC, link->flags, flags),
1624 FLAG_STRING("NOARP", IFF_NOARP, link->flags, flags),
1625 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS, link->flags, flags),
1626 FLAG_STRING("DEBUG", IFF_DEBUG, link->flags, flags),
1627 FLAG_STRING("ECHO", IFF_ECHO, link->flags, flags));
1629 unknown_flags = ~(IFF_LOOPBACK | IFF_MASTER | IFF_SLAVE | IFF_UP |
1630 IFF_DORMANT | IFF_LOWER_UP | IFF_RUNNING |
1631 IFF_MULTICAST | IFF_BROADCAST | IFF_POINTOPOINT |
1632 IFF_PROMISC | IFF_ALLMULTI | IFF_PORTSEL |
1633 IFF_AUTOMEDIA | IFF_DYNAMIC | IFF_NOARP |
1634 IFF_NOTRAILERS | IFF_DEBUG | IFF_ECHO);
1635 unknown_flags_added = ((link->flags ^ flags) & flags & unknown_flags);
1636 unknown_flags_removed = ((link->flags ^ flags) & link->flags & unknown_flags);
1638 /* link flags are currently at most 18 bits, let's align to printing 20 */
1639 if (unknown_flags_added)
1640 log_debug_link(link, "unknown link flags gained: %#.5x (ignoring)",
1641 unknown_flags_added);
1643 if (unknown_flags_removed)
1644 log_debug_link(link, "unknown link flags lost: %#.5x (ignoring)",
1645 unknown_flags_removed);
1648 carrier_gained = !link_has_carrier(link->flags, link->kernel_operstate) &&
1649 link_has_carrier(flags, operstate);
1650 carrier_lost = link_has_carrier(link->flags, link->kernel_operstate) &&
1651 !link_has_carrier(flags, operstate);
1653 link->flags = flags;
1654 link->kernel_operstate = operstate;
1658 if (link->state == LINK_STATE_FAILED ||
1659 link->state == LINK_STATE_UNMANAGED)
1662 if (carrier_gained) {
1663 log_info_link(link, "gained carrier");
1665 if (link->network) {
1666 r = link_acquire_conf(link);
1668 link_enter_failed(link);
1672 } else if (carrier_lost) {
1673 log_info_link(link, "lost carrier");
1675 r = link_stop_clients(link);
1677 link_enter_failed(link);
1685 static int link_up_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
1686 Link *link = userdata;
1691 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
1696 r = sd_rtnl_message_get_errno(m);
1698 /* we warn but don't fail the link, as it may
1699 be brought up later */
1700 log_struct_link(LOG_WARNING, link,
1701 "MESSAGE=%-*s: could not bring up interface: %s",
1703 link->ifname, strerror(-r),
1713 static int link_up(Link *link) {
1714 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
1718 assert(link->manager);
1719 assert(link->manager->rtnl);
1721 log_debug_link(link, "bringing link up");
1723 r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
1724 RTM_SETLINK, link->ifindex);
1726 log_error_link(link, "Could not allocate RTM_SETLINK message");
1730 r = sd_rtnl_message_link_set_flags(req, IFF_UP, IFF_UP);
1732 log_error_link(link, "Could not set link flags: %s", strerror(-r));
1736 r = sd_rtnl_call_async(link->manager->rtnl, req, link_up_handler, link, 0, NULL);
1738 log_error_link(link,
1739 "Could not send rtnetlink message: %s", strerror(-r));
1748 static int link_enslaved(Link *link) {
1752 assert(link->state == LINK_STATE_ENSLAVING);
1753 assert(link->network);
1755 if (!(link->flags & IFF_UP)) {
1758 link_enter_failed(link);
1763 return link_enter_set_addresses(link);
1766 static int enslave_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
1767 Link *link = userdata;
1771 assert(IN_SET(link->state, LINK_STATE_ENSLAVING, LINK_STATE_FAILED,
1772 LINK_STATE_LINGER));
1773 assert(link->network);
1777 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
1782 r = sd_rtnl_message_get_errno(m);
1784 log_struct_link(LOG_ERR, link,
1785 "MESSAGE=%-*s: could not enslave: %s",
1787 link->ifname, strerror(-r),
1790 link_enter_failed(link);
1795 log_debug_link(link, "enslaved");
1797 if (link->enslaving == 0)
1798 link_enslaved(link);
1805 static int link_enter_enslave(Link *link) {
1806 NetDev *vlan, *macvlan, *vxlan;
1811 assert(link->network);
1812 assert(link->state == LINK_STATE_INITIALIZING);
1814 link->state = LINK_STATE_ENSLAVING;
1818 if (!link->network->bridge &&
1819 !link->network->bond &&
1820 !link->network->tunnel &&
1821 hashmap_isempty(link->network->vlans) &&
1822 hashmap_isempty(link->network->macvlans) &&
1823 hashmap_isempty(link->network->vxlans))
1824 return link_enslaved(link);
1826 if (link->network->bond) {
1827 log_struct_link(LOG_DEBUG, link,
1828 "MESSAGE=%-*s: enslaving by '%s'",
1830 link->ifname, link->network->bond->ifname,
1831 NETDEV(link->network->bond),
1834 r = netdev_enslave(link->network->bond, link, &enslave_handler);
1836 log_struct_link(LOG_WARNING, link,
1837 "MESSAGE=%-*s: could not enslave by '%s': %s",
1839 link->ifname, link->network->bond->ifname, strerror(-r),
1840 NETDEV(link->network->bond),
1842 link_enter_failed(link);
1850 if (link->network->bridge) {
1851 log_struct_link(LOG_DEBUG, link,
1852 "MESSAGE=%-*s: enslaving by '%s'",
1854 link->ifname, link->network->bridge->ifname,
1855 NETDEV(link->network->bridge),
1858 r = netdev_enslave(link->network->bridge, link, &enslave_handler);
1860 log_struct_link(LOG_WARNING, link,
1861 "MESSAGE=%-*s: could not enslave by '%s': %s",
1863 link->ifname, link->network->bridge->ifname, strerror(-r),
1864 NETDEV(link->network->bridge),
1866 link_enter_failed(link);
1874 if (link->network->tunnel) {
1875 log_struct_link(LOG_DEBUG, link,
1876 "MESSAGE=%-*s: enslaving by '%s'",
1878 link->ifname, link->network->tunnel->ifname,
1879 NETDEV(link->network->tunnel),
1882 r = netdev_enslave(link->network->tunnel, link, &enslave_handler);
1884 log_struct_link(LOG_WARNING, link,
1885 "MESSAGE=%-*s: could not enslave by '%s': %s",
1887 link->ifname, link->network->tunnel->ifname, strerror(-r),
1888 NETDEV(link->network->tunnel),
1890 link_enter_failed(link);
1898 HASHMAP_FOREACH(vlan, link->network->vlans, i) {
1899 log_struct_link(LOG_DEBUG, link,
1900 "MESSAGE=%-*s: enslaving by '%s'",
1902 link->ifname, vlan->ifname, NETDEV(vlan), NULL);
1904 r = netdev_enslave(vlan, link, &enslave_handler);
1906 log_struct_link(LOG_WARNING, link,
1907 "MESSAGE=%-*s: could not enslave by '%s': %s",
1909 link->ifname, vlan->ifname, strerror(-r),
1910 NETDEV(vlan), NULL);
1911 link_enter_failed(link);
1919 HASHMAP_FOREACH(macvlan, link->network->macvlans, i) {
1920 log_struct_link(LOG_DEBUG, link,
1921 "MESSAGE=%-*s: enslaving by '%s'",
1923 link->ifname, macvlan->ifname, NETDEV(macvlan), NULL);
1925 r = netdev_enslave(macvlan, link, &enslave_handler);
1927 log_struct_link(LOG_WARNING, link,
1928 "MESSAGE=%-*s: could not enslave by '%s': %s",
1930 link->ifname, macvlan->ifname, strerror(-r),
1931 NETDEV(macvlan), NULL);
1932 link_enter_failed(link);
1940 HASHMAP_FOREACH(vxlan, link->network->vxlans, i) {
1941 log_struct_link(LOG_DEBUG, link,
1942 "MESSAGE=%*s: enslaving by '%s'",
1944 link->ifname, vxlan->ifname, NETDEV(vxlan), NULL);
1946 r = netdev_enslave(vxlan, link, &enslave_handler);
1948 log_struct_link(LOG_WARNING, link,
1949 "MESSAGE=%*s: could not enslave by '%s': %s",
1951 link->ifname, vxlan->ifname, strerror(-r),
1952 NETDEV(vxlan), NULL);
1953 link_enter_failed(link);
1964 static int link_configure(Link *link) {
1968 assert(link->state == LINK_STATE_INITIALIZING);
1970 if (link->network->ipv4ll) {
1973 r = sd_ipv4ll_new(&link->ipv4ll);
1977 if (link->udev_device) {
1978 r = net_get_unique_predictable_data(link->udev_device, seed);
1980 r = sd_ipv4ll_set_address_seed(link->ipv4ll, seed);
1986 r = sd_ipv4ll_attach_event(link->ipv4ll, NULL, 0);
1990 r = sd_ipv4ll_set_mac(link->ipv4ll, &link->mac);
1994 r = sd_ipv4ll_set_index(link->ipv4ll, link->ifindex);
1998 r = sd_ipv4ll_set_callback(link->ipv4ll, ipv4ll_handler, link);
2003 if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4)) {
2004 r = sd_dhcp_client_new(&link->dhcp_client);
2008 r = sd_dhcp_client_attach_event(link->dhcp_client, NULL, 0);
2012 r = sd_dhcp_client_set_mac(link->dhcp_client, &link->mac);
2016 r = sd_dhcp_client_set_index(link->dhcp_client, link->ifindex);
2020 r = sd_dhcp_client_set_callback(link->dhcp_client, dhcp_handler, link);
2024 if (link->network->dhcp_mtu) {
2025 r = sd_dhcp_client_set_request_option(link->dhcp_client, 26);
2029 if (link->network->dhcp_routes) {
2030 r = sd_dhcp_client_set_request_option(link->dhcp_client, DHCP_OPTION_STATIC_ROUTE);
2033 r = sd_dhcp_client_set_request_option(link->dhcp_client, DHCP_OPTION_CLASSLESS_STATIC_ROUTE);
2039 if (link->network->dhcp_server) {
2040 r = sd_dhcp_server_new(&link->dhcp_server, link->ifindex);
2044 r = sd_dhcp_server_attach_event(link->dhcp_server, NULL, 0);
2049 if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V6)) {
2050 r = sd_icmp6_nd_new(&link->icmp6_router_discovery);
2054 r = sd_icmp6_nd_attach_event(link->icmp6_router_discovery,
2059 r = sd_icmp6_nd_set_mac(link->icmp6_router_discovery,
2064 r = sd_icmp6_nd_set_index(link->icmp6_router_discovery,
2069 r = sd_icmp6_nd_set_callback(link->icmp6_router_discovery,
2070 icmp6_router_handler, link);
2075 if (link_has_carrier(link->flags, link->kernel_operstate)) {
2076 r = link_acquire_conf(link);
2081 return link_enter_enslave(link);
2084 static int link_initialized_and_synced(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
2085 Link *link = userdata;
2090 assert(link->ifname);
2091 assert(link->manager);
2093 if (link->state != LINK_STATE_INITIALIZING)
2096 log_debug_link(link, "link state is up-to-date");
2098 r = network_get(link->manager, link->udev_device, link->ifname, &link->mac, &network);
2100 link_enter_unmanaged(link);
2105 r = network_apply(link->manager, network, link);
2109 r = link_configure(link);
2116 int link_initialized(Link *link, struct udev_device *device) {
2117 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
2121 assert(link->manager);
2122 assert(link->manager->rtnl);
2125 if (link->state != LINK_STATE_INITIALIZING)
2128 log_debug_link(link, "udev initialized link");
2130 link->udev_device = udev_device_ref(device);
2132 /* udev has initialized the link, but we don't know if we have yet processed
2133 the NEWLINK messages with the latest state. Do a GETLINK, when it returns
2134 we know that the pending NEWLINKs have already been processed and that we
2137 r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_GETLINK, link->ifindex);
2141 r = sd_rtnl_call_async(link->manager->rtnl, req, link_initialized_and_synced, link, 0, NULL);
2148 int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata) {
2149 Manager *m = userdata;
2152 _cleanup_address_free_ Address *address = NULL;
2154 char buf[INET6_ADDRSTRLEN];
2155 bool address_dropped = false;
2162 r = sd_rtnl_message_get_type(message, &type);
2164 log_warning("rtnl: could not get message type");
2168 r = sd_rtnl_message_addr_get_ifindex(message, &ifindex);
2169 if (r < 0 || ifindex <= 0) {
2170 log_warning("rtnl: received address message without valid ifindex, ignoring");
2173 r = link_get(m, ifindex, &link);
2174 if (r < 0 || !link) {
2175 log_warning("rtnl: received address for a nonexistent link, ignoring");
2180 r = address_new_dynamic(&address);
2184 r = sd_rtnl_message_addr_get_family(message, &address->family);
2185 if (r < 0 || !IN_SET(address->family, AF_INET, AF_INET6)) {
2186 log_warning_link(link, "rtnl: received address with invalid family, ignoring");
2190 r = sd_rtnl_message_addr_get_prefixlen(message, &address->prefixlen);
2192 log_warning_link(link, "rtnl: received address with invalid prefixlen, ignoring");
2196 r = sd_rtnl_message_addr_get_scope(message, &address->scope);
2198 log_warning_link(link, "rtnl: received address with invalid scope, ignoring");
2202 switch (address->family) {
2204 r = sd_rtnl_message_read_in_addr(message, IFA_LOCAL, &address->in_addr.in);
2206 log_warning_link(link, "rtnl: received address without valid address, ignoring");
2213 r = sd_rtnl_message_read_in6_addr(message, IFA_ADDRESS, &address->in_addr.in6);
2215 log_warning_link(link, "rtnl: received address without valid address, ignoring");
2222 assert_not_reached("invalid address family");
2225 if (!inet_ntop(address->family, &address->in_addr, buf, INET6_ADDRSTRLEN)) {
2226 log_warning_link(link, "could not print address");
2230 LIST_FOREACH(addresses, ad, link->addresses) {
2231 if (address_equal(ad, address)) {
2232 LIST_REMOVE(addresses, link->addresses, ad);
2236 address_dropped = true;
2244 if (!address_dropped)
2245 log_debug_link(link, "added address: %s/%u", buf,
2246 address->prefixlen);
2248 LIST_PREPEND(addresses, link->addresses, address);
2255 if (address_dropped) {
2256 log_debug_link(link, "removed address: %s/%u", buf,
2257 address->prefixlen);
2264 assert_not_reached("Received invalid RTNL message type");
2270 static int link_get_address_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
2271 Link *link = userdata;
2278 for (; m; m = sd_rtnl_message_next(m)) {
2279 r = sd_rtnl_message_get_errno(m);
2281 log_debug_link(link, "getting address failed: %s", strerror(-r));
2285 r = link_rtnl_process_address(rtnl, m, link->manager);
2287 log_warning_link(link, "could not process address: %s", strerror(-r));
2293 int link_add(Manager *m, sd_rtnl_message *message, Link **ret) {
2295 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
2296 _cleanup_udev_device_unref_ struct udev_device *device = NULL;
2297 char ifindex_str[2 + DECIMAL_STR_MAX(int)];
2305 r = link_new(m, message, ret);
2311 log_debug_link(link, "link %"PRIu64" added", link->ifindex);
2313 r = sd_rtnl_message_new_addr(m->rtnl, &req, RTM_GETADDR, link->ifindex, 0);
2317 r = sd_rtnl_call_async(m->rtnl, req, link_get_address_handler, link, 0, NULL);
2321 if (detect_container(NULL) <= 0) {
2322 /* not in a container, udev will be around */
2323 sprintf(ifindex_str, "n%"PRIu64, link->ifindex);
2324 device = udev_device_new_from_device_id(m->udev, ifindex_str);
2326 log_warning_link(link, "could not find udev device");
2330 if (udev_device_get_is_initialized(device) <= 0) {
2332 log_debug_link(link, "udev initializing link...");
2336 r = link_initialized(link, device);
2340 r = link_initialized_and_synced(m->rtnl, NULL, link);
2348 int link_update(Link *link, sd_rtnl_message *m) {
2349 struct ether_addr mac;
2354 assert(link->ifname);
2357 if (link->state == LINK_STATE_LINGER) {
2359 log_info_link(link, "link readded");
2360 link->state = LINK_STATE_ENSLAVING;
2363 r = sd_rtnl_message_read_string(m, IFLA_IFNAME, &ifname);
2364 if (r >= 0 && !streq(ifname, link->ifname)) {
2365 log_info_link(link, "renamed to %s", ifname);
2368 link->ifname = strdup(ifname);
2373 if (!link->original_mtu) {
2374 r = sd_rtnl_message_read_u16(m, IFLA_MTU, &link->original_mtu);
2376 log_debug_link(link, "saved original MTU: %"
2377 PRIu16, link->original_mtu);
2380 /* The kernel may broadcast NEWLINK messages without the MAC address
2381 set, simply ignore them. */
2382 r = sd_rtnl_message_read_ether_addr(m, IFLA_ADDRESS, &mac);
2384 if (memcmp(link->mac.ether_addr_octet, mac.ether_addr_octet, ETH_ALEN)) {
2386 memcpy(link->mac.ether_addr_octet, mac.ether_addr_octet, ETH_ALEN);
2388 log_debug_link(link, "MAC address: "
2389 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2390 mac.ether_addr_octet[0],
2391 mac.ether_addr_octet[1],
2392 mac.ether_addr_octet[2],
2393 mac.ether_addr_octet[3],
2394 mac.ether_addr_octet[4],
2395 mac.ether_addr_octet[5]);
2398 r = sd_ipv4ll_set_mac(link->ipv4ll, &link->mac);
2400 log_warning_link(link, "Could not update MAC "
2401 "address in IPv4LL client: %s",
2407 if (link->dhcp_client) {
2408 r = sd_dhcp_client_set_mac(link->dhcp_client, &link->mac);
2410 log_warning_link(link, "Could not update MAC "
2411 "address in DHCP client: %s",
2417 if (link->dhcp6_client) {
2418 r = sd_dhcp6_client_set_mac(link->dhcp6_client,
2421 log_warning_link(link, "Could not update MAC address in DHCPv6 client: %s",
2429 return link_update_flags(link, m);
2432 static void serialize_addresses(FILE *f, const char *key, Address *address) {
2441 fprintf(f, "%s=", key);
2443 LIST_FOREACH(addresses, ad, address) {
2444 char buf[INET6_ADDRSTRLEN];
2446 if (inet_ntop(ad->family, &ad->in_addr, buf, INET6_ADDRSTRLEN))
2447 fprintf(f, "%s%s", buf, (ad->addresses_next) ? " ": "");
2453 static void link_update_operstate(Link *link) {
2457 if (link->kernel_operstate == IF_OPER_DORMANT)
2458 link->operstate = LINK_OPERSTATE_DORMANT;
2459 else if (link_has_carrier(link->flags, link->kernel_operstate)) {
2461 uint8_t scope = RT_SCOPE_NOWHERE;
2463 /* if we have carrier, check what addresses we have */
2464 LIST_FOREACH(addresses, address, link->addresses) {
2465 if (address->scope < scope)
2466 scope = address->scope;
2469 if (scope < RT_SCOPE_SITE)
2470 /* universally accessible addresses found */
2471 link->operstate = LINK_OPERSTATE_ROUTABLE;
2472 else if (scope < RT_SCOPE_HOST)
2473 /* only link or site local addresses found */
2474 link->operstate = LINK_OPERSTATE_DEGRADED;
2476 /* no useful addresses found */
2477 link->operstate = LINK_OPERSTATE_CARRIER;
2479 link->operstate = LINK_OPERSTATE_UNKNOWN;
2482 int link_save(Link *link) {
2483 _cleanup_free_ char *temp_path = NULL;
2484 _cleanup_fclose_ FILE *f = NULL;
2485 const char *admin_state, *oper_state;
2489 assert(link->state_file);
2490 assert(link->lease_file);
2491 assert(link->manager);
2493 link_update_operstate(link);
2495 r = manager_save(link->manager);
2499 if (link->state == LINK_STATE_LINGER) {
2500 unlink(link->state_file);
2504 admin_state = link_state_to_string(link->state);
2505 assert(admin_state);
2507 oper_state = link_operstate_to_string(link->operstate);
2510 r = fopen_temporary(link->state_file, &f, &temp_path);
2514 fchmod(fileno(f), 0644);
2517 "# This is private data. Do not parse.\n"
2521 admin_state, oper_state, link->flags);
2523 if (link->network) {
2524 serialize_addresses(f, "DNS", link->network->dns);
2525 serialize_addresses(f, "NTP", link->network->ntp);
2528 if (link->dhcp_lease) {
2529 assert(link->network);
2531 r = dhcp_lease_save(link->dhcp_lease, link->lease_file);
2538 "DHCP_USE_NTP=%s\n",
2540 yes_no(link->network->dhcp_dns),
2541 yes_no(link->network->dhcp_ntp));
2543 unlink(link->lease_file);
2547 if (ferror(f) || rename(temp_path, link->state_file) < 0) {
2549 unlink(link->state_file);
2555 log_error_link(link, "Failed to save link data to %s: %s", link->state_file, strerror(-r));
2560 static const char* const link_state_table[_LINK_STATE_MAX] = {
2561 [LINK_STATE_INITIALIZING] = "initializing",
2562 [LINK_STATE_ENSLAVING] = "configuring",
2563 [LINK_STATE_SETTING_ADDRESSES] = "configuring",
2564 [LINK_STATE_SETTING_ROUTES] = "configuring",
2565 [LINK_STATE_CONFIGURED] = "configured",
2566 [LINK_STATE_UNMANAGED] = "unmanaged",
2567 [LINK_STATE_FAILED] = "failed",
2568 [LINK_STATE_LINGER] = "linger",
2571 DEFINE_STRING_TABLE_LOOKUP(link_state, LinkState);
2573 static const char* const link_operstate_table[_LINK_OPERSTATE_MAX] = {
2574 [LINK_OPERSTATE_UNKNOWN] = "unknown",
2575 [LINK_OPERSTATE_DORMANT] = "dormant",
2576 [LINK_OPERSTATE_CARRIER] = "carrier",
2577 [LINK_OPERSTATE_DEGRADED] = "degraded",
2578 [LINK_OPERSTATE_ROUTABLE] = "routable",
2581 DEFINE_STRING_TABLE_LOOKUP(link_operstate, LinkOperationalState);
2583 static const char* const dhcp_support_table[_DHCP_SUPPORT_MAX] = {
2584 [DHCP_SUPPORT_NONE] = "none",
2585 [DHCP_SUPPORT_BOTH] = "both",
2586 [DHCP_SUPPORT_V4] = "v4",
2587 [DHCP_SUPPORT_V6] = "v6",
2590 DEFINE_STRING_TABLE_LOOKUP(dhcp_support, DHCPSupport);
2592 int config_parse_dhcp(
2594 const char *filename,
2596 const char *section,
2597 unsigned section_line,
2604 DHCPSupport *dhcp = data;
2612 /* Our enum shall be a superset of booleans, hence first try
2613 * to parse as boolean, and then as enum */
2615 k = parse_boolean(rvalue);
2617 *dhcp = DHCP_SUPPORT_BOTH;
2619 *dhcp = DHCP_SUPPORT_NONE;
2623 s = dhcp_support_from_string(rvalue);
2625 log_syntax(unit, LOG_ERR, filename, line, -s, "Failed to parse DHCP option, ignoring: %s", rvalue);