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: %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: %s", strerror(-r));
527 r = route_new_dynamic(&route);
529 log_error_link(link, "Could not allocate route: %s",
534 r = route_new_dynamic(&route_gw);
536 log_error_link(link, "Could not allocate route: %s",
541 /* The dhcp netmask may mask out the gateway. Add an explicit
542 * route for the gw host so that we can route no matter the
543 * netmask or existing kernel route tables. */
544 route_gw->family = AF_INET;
545 route_gw->dst_addr.in = gateway;
546 route_gw->dst_prefixlen = 32;
547 route_gw->scope = RT_SCOPE_LINK;
549 r = route_configure(route_gw, link, &route_handler);
551 log_warning_link(link,
552 "could not set host route: %s", strerror(-r));
557 link->route_messages ++;
559 route->family = AF_INET;
560 route->in_addr.in = gateway;
562 r = route_configure(route, link, &route_handler);
564 log_warning_link(link,
565 "could not set routes: %s", strerror(-r));
566 link_enter_failed(link);
571 link->route_messages ++;
574 if (link->network->dhcp_routes)
575 link_set_dhcp_routes(link);
578 if (link->route_messages == 0) {
579 link_enter_configured(link);
585 static int route_drop_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
586 Link *link = userdata;
591 assert(link->ifname);
593 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
598 r = sd_rtnl_message_get_errno(m);
599 if (r < 0 && r != -ESRCH)
600 log_struct_link(LOG_WARNING, link,
601 "MESSAGE=%-*s: could not drop route: %s",
603 link->ifname, strerror(-r),
612 static int address_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
613 Link *link = userdata;
618 assert(link->ifname);
619 assert(link->addr_messages > 0);
620 assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
621 LINK_STATE_FAILED, LINK_STATE_LINGER));
623 link->addr_messages --;
625 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
630 r = sd_rtnl_message_get_errno(m);
631 if (r < 0 && r != -EEXIST)
632 log_struct_link(LOG_WARNING, link,
633 "MESSAGE=%-*s: could not set address: %s",
635 link->ifname, strerror(-r),
639 if (link->addr_messages == 0) {
640 log_debug_link(link, "addresses set");
641 link_enter_set_routes(link);
649 static int link_enter_set_addresses(Link *link) {
652 uint32_t lifetime = CACHE_INFO_INFINITY_LIFE_TIME;
655 assert(link->network);
656 assert(link->state != _LINK_STATE_INVALID);
658 link->state = LINK_STATE_SETTING_ADDRESSES;
660 if (!link->network->static_addresses && !link->dhcp_lease &&
661 (!link->ipv4ll || ipv4ll_is_bound(link->ipv4ll) == false))
662 return link_enter_set_routes(link);
664 log_debug_link(link, "setting addresses");
666 LIST_FOREACH(addresses, ad, link->network->static_addresses) {
667 r = address_configure(ad, link, &address_handler);
669 log_warning_link(link,
670 "could not set addresses: %s", strerror(-r));
671 link_enter_failed(link);
676 link->addr_messages ++;
679 if (link->ipv4ll && !link->dhcp_lease) {
680 _cleanup_address_free_ Address *ll_addr = NULL;
683 r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
684 if (r < 0 && r != -ENOENT) {
685 log_warning_link(link, "IPV4LL error: no address: %s",
691 r = address_new_dynamic(&ll_addr);
693 log_error_link(link, "Could not allocate address: %s", strerror(-r));
697 ll_addr->family = AF_INET;
698 ll_addr->in_addr.in = addr;
699 ll_addr->prefixlen = 16;
700 ll_addr->broadcast.s_addr = ll_addr->in_addr.in.s_addr | htonl(0xfffffffflu >> ll_addr->prefixlen);
701 ll_addr->scope = RT_SCOPE_LINK;
703 r = address_configure(ll_addr, link, &address_handler);
705 log_warning_link(link,
706 "could not set addresses: %s", strerror(-r));
707 link_enter_failed(link);
712 link->addr_messages ++;
716 if (link->dhcp_lease) {
717 _cleanup_address_free_ Address *address = NULL;
719 struct in_addr netmask;
722 r = sd_dhcp_lease_get_address(link->dhcp_lease, &addr);
724 log_warning_link(link, "DHCP error: no address: %s",
729 if (!link->network->dhcp_critical) {
730 r = sd_dhcp_lease_get_lifetime(link->dhcp_lease,
733 log_warning_link(link, "DHCP error: no lifetime: %s",
739 r = sd_dhcp_lease_get_netmask(link->dhcp_lease, &netmask);
741 log_warning_link(link, "DHCP error: no netmask: %s",
746 prefixlen = net_netmask_to_prefixlen(&netmask);
748 r = address_new_dynamic(&address);
750 log_error_link(link, "Could not allocate address: %s",
755 address->family = AF_INET;
756 address->in_addr.in = addr;
757 address->cinfo.ifa_prefered = lifetime;
758 address->cinfo.ifa_valid = lifetime;
759 address->prefixlen = prefixlen;
760 address->broadcast.s_addr = addr.s_addr | ~netmask.s_addr;
762 r = address_configure(address, link, &address_handler);
764 log_warning_link(link,
765 "could not set addresses: %s", strerror(-r));
766 link_enter_failed(link);
771 link->addr_messages ++;
777 static int address_update_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
778 Link *link = userdata;
783 assert(link->ifname);
785 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
790 r = sd_rtnl_message_get_errno(m);
791 if (r < 0 && r != -ENOENT)
792 log_struct_link(LOG_WARNING, link,
793 "MESSAGE=%-*s: could not update address: %s",
795 link->ifname, strerror(-r),
804 static int address_drop_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
805 Link *link = userdata;
810 assert(link->ifname);
812 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
817 r = sd_rtnl_message_get_errno(m);
818 if (r < 0 && r != -EADDRNOTAVAIL)
819 log_struct_link(LOG_WARNING, link,
820 "MESSAGE=%-*s: could not drop address: %s",
822 link->ifname, strerror(-r),
831 static int set_hostname_handler(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
832 Link *link = userdata;
837 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
842 r = sd_bus_message_get_errno(m);
844 log_warning_link(link, "Could not set hostname: %s", strerror(-r));
851 static int link_set_hostname(Link *link, const char *hostname) {
852 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
856 assert(link->manager);
859 log_debug_link(link, "Setting transient hostname: '%s'", hostname);
861 if (!link->manager->bus) { /* TODO: replace by assert when we can rely on kdbus */
862 log_info_link(link, "Not connected to system bus, ignoring transient hostname.");
866 r = sd_bus_message_new_method_call(
869 "org.freedesktop.hostname1",
870 "/org/freedesktop/hostname1",
871 "org.freedesktop.hostname1",
876 r = sd_bus_message_append(m, "sb", hostname, false);
880 r = sd_bus_call_async(link->manager->bus, NULL, m, set_hostname_handler, link, 0);
882 log_error_link(link, "Could not set transient hostname: %s", strerror(-r));
889 static int set_mtu_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
890 Link *link = userdata;
895 assert(link->ifname);
897 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
902 r = sd_rtnl_message_get_errno(m);
904 log_struct_link(LOG_WARNING, link,
905 "MESSAGE=%-*s: could not set MTU: %s",
906 IFNAMSIZ, link->ifname, strerror(-r),
915 static int link_set_mtu(Link *link, uint32_t mtu) {
916 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
920 assert(link->manager);
921 assert(link->manager->rtnl);
923 log_debug_link(link, "setting MTU: %" PRIu32, mtu);
925 r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
926 RTM_SETLINK, link->ifindex);
928 log_error_link(link, "Could not allocate RTM_SETLINK message");
932 r = sd_rtnl_message_append_u32(req, IFLA_MTU, mtu);
934 log_error_link(link, "Could not append MTU: %s", strerror(-r));
938 r = sd_rtnl_call_async(link->manager->rtnl, req, set_mtu_handler, link, 0, NULL);
941 "Could not send rtnetlink message: %s", strerror(-r));
950 static int dhcp_lease_lost(Link *link) {
951 _cleanup_address_free_ Address *address = NULL;
953 struct in_addr netmask;
954 struct in_addr gateway;
960 assert(link->dhcp_lease);
962 log_warning_link(link, "DHCP lease lost");
964 if (link->network->dhcp_routes) {
965 struct sd_dhcp_route *routes;
968 r = sd_dhcp_lease_get_routes(link->dhcp_lease, &routes, &routes_size);
970 for (i = 0; i < routes_size; i++) {
971 _cleanup_route_free_ Route *route = NULL;
973 r = route_new_dynamic(&route);
975 route->family = AF_INET;
976 route->in_addr.in = routes[i].gw_addr;
977 route->dst_addr.in = routes[i].dst_addr;
978 route->dst_prefixlen = routes[i].dst_prefixlen;
980 route_drop(route, link, &route_drop_handler);
987 r = address_new_dynamic(&address);
989 r = sd_dhcp_lease_get_router(link->dhcp_lease, &gateway);
991 _cleanup_route_free_ Route *route_gw = NULL;
992 _cleanup_route_free_ Route *route = NULL;
994 r = route_new_dynamic(&route_gw);
996 route_gw->family = AF_INET;
997 route_gw->dst_addr.in = gateway;
998 route_gw->dst_prefixlen = 32;
999 route_gw->scope = RT_SCOPE_LINK;
1001 route_drop(route_gw, link, &route_drop_handler);
1005 r = route_new_dynamic(&route);
1007 route->family = AF_INET;
1008 route->in_addr.in = gateway;
1010 route_drop(route, link, &route_drop_handler);
1015 sd_dhcp_lease_get_address(link->dhcp_lease, &addr);
1016 sd_dhcp_lease_get_netmask(link->dhcp_lease, &netmask);
1017 prefixlen = net_netmask_to_prefixlen(&netmask);
1019 address->family = AF_INET;
1020 address->in_addr.in = addr;
1021 address->prefixlen = prefixlen;
1023 address_drop(address, link, &address_drop_handler);
1027 if (link->network->dhcp_mtu) {
1030 r = sd_dhcp_lease_get_mtu(link->dhcp_lease, &mtu);
1031 if (r >= 0 && link->original_mtu != mtu) {
1032 r = link_set_mtu(link, link->original_mtu);
1034 log_warning_link(link, "DHCP error: could not reset MTU");
1035 link_enter_failed(link);
1041 if (link->network->dhcp_hostname) {
1042 const char *hostname = NULL;
1044 r = sd_dhcp_lease_get_hostname(link->dhcp_lease, &hostname);
1045 if (r >= 0 && hostname) {
1046 r = link_set_hostname(link, "");
1048 log_error_link(link, "Failed to reset transient hostname");
1052 link->dhcp_lease = sd_dhcp_lease_unref(link->dhcp_lease);
1057 static int dhcp_lease_renew(sd_dhcp_client *client, Link *link) {
1058 sd_dhcp_lease *lease;
1061 r = sd_dhcp_client_get_lease(client, &lease);
1063 log_warning_link(link, "DHCP error: no lease %s",
1068 sd_dhcp_lease_unref(link->dhcp_lease);
1069 link->dhcp_lease = lease;
1071 link_enter_set_addresses(link);
1076 static int dhcp_lease_acquired(sd_dhcp_client *client, Link *link) {
1077 sd_dhcp_lease *lease;
1078 struct in_addr address;
1079 struct in_addr netmask;
1080 struct in_addr gateway;
1087 r = sd_dhcp_client_get_lease(client, &lease);
1089 log_warning_link(link, "DHCP error: no lease: %s",
1094 r = sd_dhcp_lease_get_address(lease, &address);
1096 log_warning_link(link, "DHCP error: no address: %s",
1101 r = sd_dhcp_lease_get_netmask(lease, &netmask);
1103 log_warning_link(link, "DHCP error: no netmask: %s",
1108 prefixlen = net_netmask_to_prefixlen(&netmask);
1110 r = sd_dhcp_lease_get_router(lease, &gateway);
1111 if (r < 0 && r != -ENOENT) {
1112 log_warning_link(link, "DHCP error: %s", strerror(-r));
1117 log_struct_link(LOG_INFO, link,
1118 "MESSAGE=%-*s: DHCPv4 address %u.%u.%u.%u/%u via %u.%u.%u.%u",
1121 ADDRESS_FMT_VAL(address),
1123 ADDRESS_FMT_VAL(gateway),
1124 "ADDRESS=%u.%u.%u.%u",
1125 ADDRESS_FMT_VAL(address),
1128 "GATEWAY=%u.%u.%u.%u",
1129 ADDRESS_FMT_VAL(gateway),
1132 log_struct_link(LOG_INFO, link,
1133 "MESSAGE=%-*s: DHCPv4 address %u.%u.%u.%u/%u",
1136 ADDRESS_FMT_VAL(address),
1138 "ADDRESS=%u.%u.%u.%u",
1139 ADDRESS_FMT_VAL(address),
1144 link->dhcp_lease = lease;
1146 if (link->network->dhcp_mtu) {
1149 r = sd_dhcp_lease_get_mtu(lease, &mtu);
1151 r = link_set_mtu(link, mtu);
1153 log_error_link(link, "Failed to set MTU "
1154 "to %" PRIu16, mtu);
1158 if (link->network->dhcp_hostname) {
1159 const char *hostname;
1161 r = sd_dhcp_lease_get_hostname(lease, &hostname);
1163 r = link_set_hostname(link, hostname);
1165 log_error_link(link, "Failed to set transient hostname "
1166 "to '%s'", hostname);
1170 link_enter_set_addresses(link);
1175 static void dhcp_handler(sd_dhcp_client *client, int event, void *userdata) {
1176 Link *link = userdata;
1180 assert(link->network);
1181 assert(link->manager);
1183 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1187 case DHCP_EVENT_NO_LEASE:
1188 log_debug_link(link, "IP address in use.");
1190 case DHCP_EVENT_EXPIRED:
1191 case DHCP_EVENT_STOP:
1192 case DHCP_EVENT_IP_CHANGE:
1193 if (link->network->dhcp_critical) {
1194 log_error_link(link, "DHCPv4 connection considered system critical, "
1195 "ignoring request to reconfigure it.");
1199 if (link->dhcp_lease) {
1200 r = dhcp_lease_lost(link);
1202 link_enter_failed(link);
1207 if (event == DHCP_EVENT_IP_CHANGE) {
1208 r = dhcp_lease_acquired(client, link);
1210 link_enter_failed(link);
1215 if (event == DHCP_EVENT_EXPIRED && link->network->ipv4ll) {
1216 if (!sd_ipv4ll_is_running(link->ipv4ll))
1217 r = sd_ipv4ll_start(link->ipv4ll);
1218 else if (ipv4ll_is_bound(link->ipv4ll))
1219 r = ipv4ll_address_update(link, false);
1221 link_enter_failed(link);
1227 case DHCP_EVENT_RENEW:
1228 r = dhcp_lease_renew(client, link);
1230 link_enter_failed(link);
1234 case DHCP_EVENT_IP_ACQUIRE:
1235 r = dhcp_lease_acquired(client, link);
1237 link_enter_failed(link);
1241 if (ipv4ll_is_bound(link->ipv4ll))
1242 r = ipv4ll_address_update(link, true);
1244 r = sd_ipv4ll_stop(link->ipv4ll);
1246 link_enter_failed(link);
1253 log_warning_link(link, "DHCP error: %s", strerror(-event));
1255 log_warning_link(link, "DHCP unknown event: %d", event);
1262 static int ipv4ll_address_update(Link *link, bool deprecate) {
1264 struct in_addr addr;
1268 r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
1270 _cleanup_address_free_ Address *address = NULL;
1272 log_debug_link(link, "IPv4 link-local %s %u.%u.%u.%u",
1273 deprecate ? "deprecate" : "approve",
1274 ADDRESS_FMT_VAL(addr));
1276 r = address_new_dynamic(&address);
1278 log_error_link(link, "Could not allocate address: %s", strerror(-r));
1282 address->family = AF_INET;
1283 address->in_addr.in = addr;
1284 address->prefixlen = 16;
1285 address->scope = RT_SCOPE_LINK;
1286 address->cinfo.ifa_prefered = deprecate ? 0 : CACHE_INFO_INFINITY_LIFE_TIME;
1287 address->broadcast.s_addr = address->in_addr.in.s_addr | htonl(0xfffffffflu >> address->prefixlen);
1289 address_update(address, link, &address_update_handler);
1297 static int ipv4ll_address_lost(Link *link) {
1299 struct in_addr addr;
1303 r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
1305 _cleanup_address_free_ Address *address = NULL;
1306 _cleanup_route_free_ Route *route = NULL;
1308 log_debug_link(link, "IPv4 link-local release %u.%u.%u.%u",
1309 ADDRESS_FMT_VAL(addr));
1311 r = address_new_dynamic(&address);
1313 log_error_link(link, "Could not allocate address: %s", strerror(-r));
1317 address->family = AF_INET;
1318 address->in_addr.in = addr;
1319 address->prefixlen = 16;
1320 address->scope = RT_SCOPE_LINK;
1322 address_drop(address, link, &address_drop_handler);
1325 r = route_new_dynamic(&route);
1327 log_error_link(link, "Could not allocate route: %s",
1332 route->family = AF_INET;
1333 route->scope = RT_SCOPE_LINK;
1334 route->metrics = 99;
1336 route_drop(route, link, &route_drop_handler);
1343 static bool ipv4ll_is_bound(sd_ipv4ll *ll) {
1345 struct in_addr addr;
1349 r = sd_ipv4ll_get_address(ll, &addr);
1355 static int ipv4ll_address_claimed(sd_ipv4ll *ll, Link *link) {
1356 struct in_addr address;
1362 r = sd_ipv4ll_get_address(ll, &address);
1366 log_struct_link(LOG_INFO, link,
1367 "MESSAGE=%-*s: IPv4 link-local address %u.%u.%u.%u",
1370 ADDRESS_FMT_VAL(address),
1373 link_enter_set_addresses(link);
1378 static void ipv4ll_handler(sd_ipv4ll *ll, int event, void *userdata){
1379 Link *link = userdata;
1383 assert(link->network);
1384 assert(link->manager);
1386 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1390 case IPV4LL_EVENT_STOP:
1391 case IPV4LL_EVENT_CONFLICT:
1392 r = ipv4ll_address_lost(link);
1394 link_enter_failed(link);
1398 case IPV4LL_EVENT_BIND:
1399 r = ipv4ll_address_claimed(ll, link);
1401 link_enter_failed(link);
1407 log_warning_link(link, "IPv4 link-local error: %s", strerror(-event));
1409 log_warning_link(link, "IPv4 link-local unknown event: %d", event);
1414 static void dhcp6_handler(sd_dhcp6_client *client, int event, void *userdata) {
1415 Link *link = userdata;
1418 assert(link->network);
1419 assert(link->manager);
1421 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1425 case DHCP6_EVENT_STOP:
1426 case DHCP6_EVENT_RESEND_EXPIRE:
1427 case DHCP6_EVENT_RETRANS_MAX:
1428 case DHCP6_EVENT_IP_ACQUIRE:
1429 log_debug_link(link, "DHCPv6 event %d", event);
1435 log_warning_link(link, "DHCPv6 error: %s",
1438 log_warning_link(link, "DHCPv6 unknown event: %d",
1444 static void icmp6_router_handler(sd_icmp6_nd *nd, int event, void *userdata) {
1445 Link *link = userdata;
1449 assert(link->network);
1450 assert(link->manager);
1452 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1456 case ICMP6_EVENT_ROUTER_ADVERTISMENT_NONE:
1457 case ICMP6_EVENT_ROUTER_ADVERTISMENT_OTHER:
1460 case ICMP6_EVENT_ROUTER_ADVERTISMENT_TIMEOUT:
1461 case ICMP6_EVENT_ROUTER_ADVERTISMENT_MANAGED:
1466 log_warning_link(link, "ICMPv6 error: %s",
1469 log_warning_link(link, "ICMPv6 unknown event: %d",
1475 if (link->dhcp6_client)
1478 r = sd_dhcp6_client_new(&link->dhcp6_client);
1482 r = sd_dhcp6_client_attach_event(link->dhcp6_client, NULL, 0);
1484 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1488 r = sd_dhcp6_client_set_mac(link->dhcp6_client, &link->mac);
1490 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1494 r = sd_dhcp6_client_set_index(link->dhcp6_client, link->ifindex);
1496 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1500 r = sd_dhcp6_client_set_callback(link->dhcp6_client, dhcp6_handler,
1503 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1507 r = sd_dhcp6_client_start(link->dhcp6_client);
1509 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1512 static int link_acquire_conf(Link *link) {
1516 assert(link->network);
1517 assert(link->manager);
1518 assert(link->manager->event);
1520 if (link->network->ipv4ll) {
1521 assert(link->ipv4ll);
1523 log_debug_link(link, "acquiring IPv4 link-local address");
1525 r = sd_ipv4ll_start(link->ipv4ll);
1527 log_warning_link(link, "could not acquire IPv4 "
1528 "link-local address");
1533 if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4)) {
1534 assert(link->dhcp_client);
1536 log_debug_link(link, "acquiring DHCPv4 lease");
1538 r = sd_dhcp_client_start(link->dhcp_client);
1540 log_warning_link(link, "could not acquire DHCPv4 "
1546 if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V6)) {
1547 assert(link->icmp6_router_discovery);
1549 log_debug_link(link, "discovering IPv6 routers");
1551 r = sd_icmp6_router_solicitation_start(link->icmp6_router_discovery);
1553 log_warning_link(link, "could not start IPv6 router discovery");
1561 bool link_has_carrier(unsigned flags, uint8_t operstate) {
1562 /* see Documentation/networking/operstates.txt in the kernel sources */
1564 if (operstate == IF_OPER_UP)
1567 if (operstate == IF_OPER_UNKNOWN)
1568 /* operstate may not be implemented, so fall back to flags */
1569 if ((flags & IFF_LOWER_UP) && !(flags & IFF_DORMANT))
1575 #define FLAG_STRING(string, flag, old, new) \
1576 (((old ^ new) & flag) \
1577 ? ((old & flag) ? (" -" string) : (" +" string)) \
1580 static int link_update_flags(Link *link, sd_rtnl_message *m) {
1581 unsigned flags, unknown_flags_added, unknown_flags_removed, unknown_flags;
1583 bool carrier_gained = false, carrier_lost = false;
1588 r = sd_rtnl_message_link_get_flags(m, &flags);
1590 log_warning_link(link, "Could not get link flags");
1594 r = sd_rtnl_message_read_u8(m, IFLA_OPERSTATE, &operstate);
1596 /* if we got a message without operstate, take it to mean
1597 the state was unchanged */
1598 operstate = link->kernel_operstate;
1600 if ((link->flags == flags) && (link->kernel_operstate == operstate))
1603 if (link->flags != flags) {
1604 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",
1605 FLAG_STRING("LOOPBACK", IFF_LOOPBACK, link->flags, flags),
1606 FLAG_STRING("MASTER", IFF_MASTER, link->flags, flags),
1607 FLAG_STRING("SLAVE", IFF_SLAVE, link->flags, flags),
1608 FLAG_STRING("UP", IFF_UP, link->flags, flags),
1609 FLAG_STRING("DORMANT", IFF_DORMANT, link->flags, flags),
1610 FLAG_STRING("LOWER_UP", IFF_LOWER_UP, link->flags, flags),
1611 FLAG_STRING("RUNNING", IFF_RUNNING, link->flags, flags),
1612 FLAG_STRING("MULTICAST", IFF_MULTICAST, link->flags, flags),
1613 FLAG_STRING("BROADCAST", IFF_BROADCAST, link->flags, flags),
1614 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT, link->flags, flags),
1615 FLAG_STRING("PROMISC", IFF_PROMISC, link->flags, flags),
1616 FLAG_STRING("ALLMULTI", IFF_ALLMULTI, link->flags, flags),
1617 FLAG_STRING("PORTSEL", IFF_PORTSEL, link->flags, flags),
1618 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA, link->flags, flags),
1619 FLAG_STRING("DYNAMIC", IFF_DYNAMIC, link->flags, flags),
1620 FLAG_STRING("NOARP", IFF_NOARP, link->flags, flags),
1621 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS, link->flags, flags),
1622 FLAG_STRING("DEBUG", IFF_DEBUG, link->flags, flags),
1623 FLAG_STRING("ECHO", IFF_ECHO, link->flags, flags));
1625 unknown_flags = ~(IFF_LOOPBACK | IFF_MASTER | IFF_SLAVE | IFF_UP |
1626 IFF_DORMANT | IFF_LOWER_UP | IFF_RUNNING |
1627 IFF_MULTICAST | IFF_BROADCAST | IFF_POINTOPOINT |
1628 IFF_PROMISC | IFF_ALLMULTI | IFF_PORTSEL |
1629 IFF_AUTOMEDIA | IFF_DYNAMIC | IFF_NOARP |
1630 IFF_NOTRAILERS | IFF_DEBUG | IFF_ECHO);
1631 unknown_flags_added = ((link->flags ^ flags) & flags & unknown_flags);
1632 unknown_flags_removed = ((link->flags ^ flags) & link->flags & unknown_flags);
1634 /* link flags are currently at most 18 bits, let's align to printing 20 */
1635 if (unknown_flags_added)
1636 log_debug_link(link, "unknown link flags gained: %#.5x (ignoring)",
1637 unknown_flags_added);
1639 if (unknown_flags_removed)
1640 log_debug_link(link, "unknown link flags lost: %#.5x (ignoring)",
1641 unknown_flags_removed);
1644 carrier_gained = !link_has_carrier(link->flags, link->kernel_operstate) &&
1645 link_has_carrier(flags, operstate);
1646 carrier_lost = link_has_carrier(link->flags, link->kernel_operstate) &&
1647 !link_has_carrier(flags, operstate);
1649 link->flags = flags;
1650 link->kernel_operstate = operstate;
1654 if (link->state == LINK_STATE_FAILED ||
1655 link->state == LINK_STATE_UNMANAGED)
1658 if (carrier_gained) {
1659 log_info_link(link, "gained carrier");
1661 if (link->network) {
1662 r = link_acquire_conf(link);
1664 link_enter_failed(link);
1668 } else if (carrier_lost) {
1669 log_info_link(link, "lost carrier");
1671 r = link_stop_clients(link);
1673 link_enter_failed(link);
1681 static int link_up_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
1682 Link *link = userdata;
1687 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
1692 r = sd_rtnl_message_get_errno(m);
1694 /* we warn but don't fail the link, as it may
1695 be brought up later */
1696 log_struct_link(LOG_WARNING, link,
1697 "MESSAGE=%-*s: could not bring up interface: %s",
1699 link->ifname, strerror(-r),
1709 static int link_up(Link *link) {
1710 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
1714 assert(link->manager);
1715 assert(link->manager->rtnl);
1717 log_debug_link(link, "bringing link up");
1719 r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
1720 RTM_SETLINK, link->ifindex);
1722 log_error_link(link, "Could not allocate RTM_SETLINK message");
1726 r = sd_rtnl_message_link_set_flags(req, IFF_UP, IFF_UP);
1728 log_error_link(link, "Could not set link flags: %s", strerror(-r));
1732 r = sd_rtnl_call_async(link->manager->rtnl, req, link_up_handler, link, 0, NULL);
1734 log_error_link(link,
1735 "Could not send rtnetlink message: %s", strerror(-r));
1744 static int link_enslaved(Link *link) {
1748 assert(link->state == LINK_STATE_ENSLAVING);
1749 assert(link->network);
1751 if (!(link->flags & IFF_UP)) {
1754 link_enter_failed(link);
1759 if ((link->network->dhcp == DHCP_SUPPORT_NONE) && !link->network->ipv4ll)
1760 return link_enter_set_addresses(link);
1765 static int enslave_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
1766 Link *link = userdata;
1770 assert(IN_SET(link->state, LINK_STATE_ENSLAVING, LINK_STATE_FAILED,
1771 LINK_STATE_LINGER));
1772 assert(link->network);
1776 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) {
1781 r = sd_rtnl_message_get_errno(m);
1783 log_struct_link(LOG_ERR, link,
1784 "MESSAGE=%-*s: could not enslave: %s",
1786 link->ifname, strerror(-r),
1789 link_enter_failed(link);
1794 log_debug_link(link, "enslaved");
1796 if (link->enslaving == 0)
1797 link_enslaved(link);
1804 static int link_enter_enslave(Link *link) {
1805 NetDev *vlan, *macvlan, *vxlan;
1810 assert(link->network);
1811 assert(link->state == LINK_STATE_INITIALIZING);
1813 link->state = LINK_STATE_ENSLAVING;
1817 if (!link->network->bridge &&
1818 !link->network->bond &&
1819 !link->network->tunnel &&
1820 hashmap_isempty(link->network->vlans) &&
1821 hashmap_isempty(link->network->macvlans) &&
1822 hashmap_isempty(link->network->vxlans))
1823 return link_enslaved(link);
1825 if (link->network->bond) {
1826 log_struct_link(LOG_DEBUG, link,
1827 "MESSAGE=%-*s: enslaving by '%s'",
1829 link->ifname, link->network->bond->ifname,
1830 NETDEV(link->network->bond),
1833 r = netdev_enslave(link->network->bond, link, &enslave_handler);
1835 log_struct_link(LOG_WARNING, link,
1836 "MESSAGE=%-*s: could not enslave by '%s': %s",
1838 link->ifname, link->network->bond->ifname, strerror(-r),
1839 NETDEV(link->network->bond),
1841 link_enter_failed(link);
1849 if (link->network->bridge) {
1850 log_struct_link(LOG_DEBUG, link,
1851 "MESSAGE=%-*s: enslaving by '%s'",
1853 link->ifname, link->network->bridge->ifname,
1854 NETDEV(link->network->bridge),
1857 r = netdev_enslave(link->network->bridge, link, &enslave_handler);
1859 log_struct_link(LOG_WARNING, link,
1860 "MESSAGE=%-*s: could not enslave by '%s': %s",
1862 link->ifname, link->network->bridge->ifname, strerror(-r),
1863 NETDEV(link->network->bridge),
1865 link_enter_failed(link);
1873 if (link->network->tunnel) {
1874 log_struct_link(LOG_DEBUG, link,
1875 "MESSAGE=%-*s: enslaving by '%s'",
1877 link->ifname, link->network->tunnel->ifname,
1878 NETDEV(link->network->tunnel),
1881 r = netdev_enslave(link->network->tunnel, link, &enslave_handler);
1883 log_struct_link(LOG_WARNING, link,
1884 "MESSAGE=%-*s: could not enslave by '%s': %s",
1886 link->ifname, link->network->tunnel->ifname, strerror(-r),
1887 NETDEV(link->network->tunnel),
1889 link_enter_failed(link);
1897 HASHMAP_FOREACH(vlan, link->network->vlans, i) {
1898 log_struct_link(LOG_DEBUG, link,
1899 "MESSAGE=%-*s: enslaving by '%s'",
1901 link->ifname, vlan->ifname, NETDEV(vlan), NULL);
1903 r = netdev_enslave(vlan, link, &enslave_handler);
1905 log_struct_link(LOG_WARNING, link,
1906 "MESSAGE=%-*s: could not enslave by '%s': %s",
1908 link->ifname, vlan->ifname, strerror(-r),
1909 NETDEV(vlan), NULL);
1910 link_enter_failed(link);
1918 HASHMAP_FOREACH(macvlan, link->network->macvlans, i) {
1919 log_struct_link(LOG_DEBUG, link,
1920 "MESSAGE=%-*s: enslaving by '%s'",
1922 link->ifname, macvlan->ifname, NETDEV(macvlan), NULL);
1924 r = netdev_enslave(macvlan, link, &enslave_handler);
1926 log_struct_link(LOG_WARNING, link,
1927 "MESSAGE=%-*s: could not enslave by '%s': %s",
1929 link->ifname, macvlan->ifname, strerror(-r),
1930 NETDEV(macvlan), NULL);
1931 link_enter_failed(link);
1939 HASHMAP_FOREACH(vxlan, link->network->vxlans, i) {
1940 log_struct_link(LOG_DEBUG, link,
1941 "MESSAGE=%*s: enslaving by '%s'",
1943 link->ifname, vxlan->ifname, NETDEV(vxlan), NULL);
1945 r = netdev_enslave(vxlan, link, &enslave_handler);
1947 log_struct_link(LOG_WARNING, link,
1948 "MESSAGE=%*s: could not enslave by '%s': %s",
1950 link->ifname, vxlan->ifname, strerror(-r),
1951 NETDEV(vxlan), NULL);
1952 link_enter_failed(link);
1963 static int link_configure(Link *link) {
1967 assert(link->state == LINK_STATE_INITIALIZING);
1969 if (link->network->ipv4ll) {
1972 r = sd_ipv4ll_new(&link->ipv4ll);
1976 if (link->udev_device) {
1977 r = net_get_unique_predictable_data(link->udev_device, seed);
1979 r = sd_ipv4ll_set_address_seed(link->ipv4ll, seed);
1985 r = sd_ipv4ll_attach_event(link->ipv4ll, NULL, 0);
1989 r = sd_ipv4ll_set_mac(link->ipv4ll, &link->mac);
1993 r = sd_ipv4ll_set_index(link->ipv4ll, link->ifindex);
1997 r = sd_ipv4ll_set_callback(link->ipv4ll, ipv4ll_handler, link);
2002 if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4)) {
2003 r = sd_dhcp_client_new(&link->dhcp_client);
2007 r = sd_dhcp_client_attach_event(link->dhcp_client, NULL, 0);
2011 r = sd_dhcp_client_set_mac(link->dhcp_client, &link->mac);
2015 r = sd_dhcp_client_set_index(link->dhcp_client, link->ifindex);
2019 r = sd_dhcp_client_set_callback(link->dhcp_client, dhcp_handler, link);
2023 if (link->network->dhcp_mtu) {
2024 r = sd_dhcp_client_set_request_option(link->dhcp_client, 26);
2028 if (link->network->dhcp_routes) {
2029 r = sd_dhcp_client_set_request_option(link->dhcp_client, DHCP_OPTION_STATIC_ROUTE);
2032 r = sd_dhcp_client_set_request_option(link->dhcp_client, DHCP_OPTION_CLASSLESS_STATIC_ROUTE);
2038 if (link->network->dhcp_server) {
2039 r = sd_dhcp_server_new(&link->dhcp_server, link->ifindex);
2043 r = sd_dhcp_server_attach_event(link->dhcp_server, NULL, 0);
2048 if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V6)) {
2049 r = sd_icmp6_nd_new(&link->icmp6_router_discovery);
2053 r = sd_icmp6_nd_attach_event(link->icmp6_router_discovery,
2058 r = sd_icmp6_nd_set_mac(link->icmp6_router_discovery,
2063 r = sd_icmp6_nd_set_index(link->icmp6_router_discovery,
2068 r = sd_icmp6_nd_set_callback(link->icmp6_router_discovery,
2069 icmp6_router_handler, link);
2074 if (link_has_carrier(link->flags, link->kernel_operstate)) {
2075 r = link_acquire_conf(link);
2080 return link_enter_enslave(link);
2083 static int link_initialized_and_synced(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
2084 Link *link = userdata;
2089 assert(link->ifname);
2090 assert(link->manager);
2092 if (link->state != LINK_STATE_INITIALIZING)
2095 log_debug_link(link, "link state is up-to-date");
2097 r = network_get(link->manager, link->udev_device, link->ifname, &link->mac, &network);
2099 link_enter_unmanaged(link);
2104 r = network_apply(link->manager, network, link);
2108 r = link_configure(link);
2115 int link_initialized(Link *link, struct udev_device *device) {
2116 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
2120 assert(link->manager);
2121 assert(link->manager->rtnl);
2124 if (link->state != LINK_STATE_INITIALIZING)
2127 log_debug_link(link, "udev initialized link");
2129 link->udev_device = udev_device_ref(device);
2131 /* udev has initialized the link, but we don't know if we have yet processed
2132 the NEWLINK messages with the latest state. Do a GETLINK, when it returns
2133 we know that the pending NEWLINKs have already been processed and that we
2136 r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_GETLINK, link->ifindex);
2140 r = sd_rtnl_call_async(link->manager->rtnl, req, link_initialized_and_synced, link, 0, NULL);
2147 int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata) {
2148 Manager *m = userdata;
2151 _cleanup_address_free_ Address *address = NULL;
2153 char buf[INET6_ADDRSTRLEN];
2154 bool address_dropped = false;
2161 r = sd_rtnl_message_get_type(message, &type);
2163 log_warning("rtnl: could not get message type");
2167 r = sd_rtnl_message_addr_get_ifindex(message, &ifindex);
2168 if (r < 0 || ifindex <= 0) {
2169 log_warning("rtnl: received address message without valid ifindex, ignoring");
2172 r = link_get(m, ifindex, &link);
2173 if (r < 0 || !link) {
2174 log_warning("rtnl: received address for a nonexistent link, ignoring");
2179 r = address_new_dynamic(&address);
2183 r = sd_rtnl_message_addr_get_family(message, &address->family);
2184 if (r < 0 || !IN_SET(address->family, AF_INET, AF_INET6)) {
2185 log_warning_link(link, "rtnl: received address with invalid family, ignoring");
2189 r = sd_rtnl_message_addr_get_prefixlen(message, &address->prefixlen);
2191 log_warning_link(link, "rtnl: received address with invalid prefixlen, ignoring");
2195 r = sd_rtnl_message_addr_get_scope(message, &address->scope);
2197 log_warning_link(link, "rtnl: received address with invalid scope, ignoring");
2201 switch (address->family) {
2203 r = sd_rtnl_message_read_in_addr(message, IFA_LOCAL, &address->in_addr.in);
2205 log_warning_link(link, "rtnl: received address without valid address, ignoring");
2212 r = sd_rtnl_message_read_in6_addr(message, IFA_ADDRESS, &address->in_addr.in6);
2214 log_warning_link(link, "rtnl: received address without valid address, ignoring");
2221 assert_not_reached("invalid address family");
2224 if (!inet_ntop(address->family, &address->in_addr, buf, INET6_ADDRSTRLEN)) {
2225 log_warning_link(link, "could not print address");
2229 LIST_FOREACH(addresses, ad, link->addresses) {
2230 if (address_equal(ad, address)) {
2231 LIST_REMOVE(addresses, link->addresses, ad);
2235 address_dropped = true;
2243 if (!address_dropped)
2244 log_debug_link(link, "added address: %s/%u", buf,
2245 address->prefixlen);
2247 LIST_PREPEND(addresses, link->addresses, address);
2254 if (address_dropped) {
2255 log_debug_link(link, "removed address: %s/%u", buf,
2256 address->prefixlen);
2263 assert_not_reached("Received invalid RTNL message type");
2269 static int link_get_address_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
2270 Link *link = userdata;
2277 for (; m; m = sd_rtnl_message_next(m)) {
2278 r = sd_rtnl_message_get_errno(m);
2280 log_debug_link(link, "getting address failed: %s", strerror(-r));
2284 r = link_rtnl_process_address(rtnl, m, link->manager);
2286 log_warning_link(link, "could not process address: %s", strerror(-r));
2292 int link_add(Manager *m, sd_rtnl_message *message, Link **ret) {
2294 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
2295 _cleanup_udev_device_unref_ struct udev_device *device = NULL;
2296 char ifindex_str[2 + DECIMAL_STR_MAX(int)];
2304 r = link_new(m, message, ret);
2310 log_debug_link(link, "link %"PRIu64" added", link->ifindex);
2312 r = sd_rtnl_message_new_addr(m->rtnl, &req, RTM_GETADDR, link->ifindex, 0);
2316 r = sd_rtnl_call_async(m->rtnl, req, link_get_address_handler, link, 0, NULL);
2320 if (detect_container(NULL) <= 0) {
2321 /* not in a container, udev will be around */
2322 sprintf(ifindex_str, "n%"PRIu64, link->ifindex);
2323 device = udev_device_new_from_device_id(m->udev, ifindex_str);
2325 log_warning_link(link, "could not find udev device");
2329 if (udev_device_get_is_initialized(device) <= 0) {
2331 log_debug_link(link, "udev initializing link...");
2335 r = link_initialized(link, device);
2339 r = link_initialized_and_synced(m->rtnl, NULL, link);
2347 int link_update(Link *link, sd_rtnl_message *m) {
2348 struct ether_addr mac;
2353 assert(link->ifname);
2356 if (link->state == LINK_STATE_LINGER) {
2358 log_info_link(link, "link readded");
2359 link->state = LINK_STATE_ENSLAVING;
2362 r = sd_rtnl_message_read_string(m, IFLA_IFNAME, &ifname);
2363 if (r >= 0 && !streq(ifname, link->ifname)) {
2364 log_info_link(link, "renamed to %s", ifname);
2367 link->ifname = strdup(ifname);
2372 if (!link->original_mtu) {
2373 r = sd_rtnl_message_read_u16(m, IFLA_MTU, &link->original_mtu);
2375 log_debug_link(link, "saved original MTU: %"
2376 PRIu16, link->original_mtu);
2379 /* The kernel may broadcast NEWLINK messages without the MAC address
2380 set, simply ignore them. */
2381 r = sd_rtnl_message_read_ether_addr(m, IFLA_ADDRESS, &mac);
2383 if (memcmp(link->mac.ether_addr_octet, mac.ether_addr_octet, ETH_ALEN)) {
2385 memcpy(link->mac.ether_addr_octet, mac.ether_addr_octet, ETH_ALEN);
2387 log_debug_link(link, "MAC address: "
2388 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2389 mac.ether_addr_octet[0],
2390 mac.ether_addr_octet[1],
2391 mac.ether_addr_octet[2],
2392 mac.ether_addr_octet[3],
2393 mac.ether_addr_octet[4],
2394 mac.ether_addr_octet[5]);
2397 r = sd_ipv4ll_set_mac(link->ipv4ll, &link->mac);
2399 log_warning_link(link, "Could not update MAC "
2400 "address in IPv4LL client: %s",
2406 if (link->dhcp_client) {
2407 r = sd_dhcp_client_set_mac(link->dhcp_client, &link->mac);
2409 log_warning_link(link, "Could not update MAC "
2410 "address in DHCP client: %s",
2416 if (link->dhcp6_client) {
2417 r = sd_dhcp6_client_set_mac(link->dhcp6_client,
2420 log_warning_link(link, "Could not update MAC address in DHCPv6 client: %s",
2428 return link_update_flags(link, m);
2431 static void serialize_addresses(FILE *f, const char *key, Address *address) {
2440 fprintf(f, "%s=", key);
2442 LIST_FOREACH(addresses, ad, address) {
2443 char buf[INET6_ADDRSTRLEN];
2445 if (inet_ntop(ad->family, &ad->in_addr, buf, INET6_ADDRSTRLEN))
2446 fprintf(f, "%s%s", buf, (ad->addresses_next) ? " ": "");
2452 static void link_update_operstate(Link *link) {
2456 if (link->kernel_operstate == IF_OPER_DORMANT)
2457 link->operstate = LINK_OPERSTATE_DORMANT;
2458 else if (link_has_carrier(link->flags, link->kernel_operstate)) {
2460 uint8_t scope = RT_SCOPE_NOWHERE;
2462 /* if we have carrier, check what addresses we have */
2463 LIST_FOREACH(addresses, address, link->addresses) {
2464 if (address->scope < scope)
2465 scope = address->scope;
2468 if (scope < RT_SCOPE_SITE)
2469 /* universally accessible addresses found */
2470 link->operstate = LINK_OPERSTATE_ROUTABLE;
2471 else if (scope < RT_SCOPE_HOST)
2472 /* only link or site local addresses found */
2473 link->operstate = LINK_OPERSTATE_DEGRADED;
2475 /* no useful addresses found */
2476 link->operstate = LINK_OPERSTATE_CARRIER;
2478 link->operstate = LINK_OPERSTATE_UNKNOWN;
2481 int link_save(Link *link) {
2482 _cleanup_free_ char *temp_path = NULL;
2483 _cleanup_fclose_ FILE *f = NULL;
2484 const char *admin_state, *oper_state;
2488 assert(link->state_file);
2489 assert(link->lease_file);
2490 assert(link->manager);
2492 link_update_operstate(link);
2494 r = manager_save(link->manager);
2498 if (link->state == LINK_STATE_LINGER) {
2499 unlink(link->state_file);
2503 admin_state = link_state_to_string(link->state);
2504 assert(admin_state);
2506 oper_state = link_operstate_to_string(link->operstate);
2509 r = fopen_temporary(link->state_file, &f, &temp_path);
2513 fchmod(fileno(f), 0644);
2516 "# This is private data. Do not parse.\n"
2520 admin_state, oper_state, link->flags);
2522 if (link->network) {
2523 serialize_addresses(f, "DNS", link->network->dns);
2524 serialize_addresses(f, "NTP", link->network->ntp);
2527 if (link->dhcp_lease) {
2528 assert(link->network);
2530 r = dhcp_lease_save(link->dhcp_lease, link->lease_file);
2537 "DHCP_USE_NTP=%s\n",
2539 yes_no(link->network->dhcp_dns),
2540 yes_no(link->network->dhcp_ntp));
2542 unlink(link->lease_file);
2546 if (ferror(f) || rename(temp_path, link->state_file) < 0) {
2548 unlink(link->state_file);
2554 log_error_link(link, "Failed to save link data to %s: %s", link->state_file, strerror(-r));
2559 static const char* const link_state_table[_LINK_STATE_MAX] = {
2560 [LINK_STATE_INITIALIZING] = "initializing",
2561 [LINK_STATE_ENSLAVING] = "configuring",
2562 [LINK_STATE_SETTING_ADDRESSES] = "configuring",
2563 [LINK_STATE_SETTING_ROUTES] = "configuring",
2564 [LINK_STATE_CONFIGURED] = "configured",
2565 [LINK_STATE_UNMANAGED] = "unmanaged",
2566 [LINK_STATE_FAILED] = "failed",
2567 [LINK_STATE_LINGER] = "linger",
2570 DEFINE_STRING_TABLE_LOOKUP(link_state, LinkState);
2572 static const char* const link_operstate_table[_LINK_OPERSTATE_MAX] = {
2573 [LINK_OPERSTATE_UNKNOWN] = "unknown",
2574 [LINK_OPERSTATE_DORMANT] = "dormant",
2575 [LINK_OPERSTATE_CARRIER] = "carrier",
2576 [LINK_OPERSTATE_DEGRADED] = "degraded",
2577 [LINK_OPERSTATE_ROUTABLE] = "routable",
2580 DEFINE_STRING_TABLE_LOOKUP(link_operstate, LinkOperationalState);
2582 static const char* const dhcp_support_table[_DHCP_SUPPORT_MAX] = {
2583 [DHCP_SUPPORT_NONE] = "none",
2584 [DHCP_SUPPORT_BOTH] = "both",
2585 [DHCP_SUPPORT_V4] = "v4",
2586 [DHCP_SUPPORT_V6] = "v6",
2589 DEFINE_STRING_TABLE_LOOKUP(dhcp_support, DHCPSupport);
2591 int config_parse_dhcp(
2593 const char *filename,
2595 const char *section,
2596 unsigned section_line,
2603 DHCPSupport *dhcp = data;
2611 /* Our enum shall be a superset of booleans, hence first try
2612 * to parse as boolean, and then as enum */
2614 k = parse_boolean(rvalue);
2616 *dhcp = DHCP_SUPPORT_BOTH;
2618 *dhcp = DHCP_SUPPORT_NONE;
2622 s = dhcp_support_from_string(rvalue);
2624 log_syntax(unit, LOG_ERR, filename, line, -s, "Failed to parse DHCP option, ignoring: %s", rvalue);