1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Tom Gundersen <teg@jklm.no>
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 #include <netinet/ether.h>
26 #include "libudev-private.h"
27 #include "udev-util.h"
31 #include "network-internal.h"
33 #include "network-util.h"
34 #include "dhcp-lease-internal.h"
36 static int ipv4ll_address_update(Link *link, bool deprecate);
37 static bool ipv4ll_is_bound(sd_ipv4ll *ll);
39 static int link_new(Manager *manager, sd_rtnl_message *message, Link **ret) {
40 _cleanup_link_unref_ Link *link = NULL;
46 assert(manager->links);
50 r = sd_rtnl_message_get_type(message, &type);
53 else if (type != RTM_NEWLINK)
56 r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
59 else if (ifindex <= 0)
62 r = sd_rtnl_message_read_string(message, IFLA_IFNAME, &ifname);
71 link->manager = manager;
72 link->state = LINK_STATE_INITIALIZING;
73 link->ifindex = ifindex;
74 link->ifname = strdup(ifname);
78 r = asprintf(&link->state_file, "/run/systemd/network/links/%"PRIu64,
83 r = asprintf(&link->lease_file, "/run/systemd/network/leases/%"PRIu64,
88 r = hashmap_put(manager->links, &link->ifindex, link);
98 static void link_free(Link *link) {
102 assert(link->manager);
104 sd_dhcp_client_unref(link->dhcp_client);
105 sd_dhcp_lease_unref(link->dhcp_lease);
107 unlink(link->lease_file);
108 free(link->lease_file);
110 sd_ipv4ll_unref(link->ipv4ll);
112 hashmap_remove(link->manager->links, &link->ifindex);
116 unlink(link->state_file);
117 free(link->state_file);
119 udev_device_unref(link->udev_device);
124 Link *link_unref(Link *link) {
125 if (link && (-- link->n_ref <= 0))
131 Link *link_ref(Link *link) {
133 assert_se(++ link->n_ref >= 2);
138 int link_get(Manager *m, int ifindex, Link **ret) {
147 ifindex_64 = ifindex;
148 link = hashmap_get(m->links, &ifindex_64);
157 static int link_enter_configured(Link *link) {
159 assert(link->state == LINK_STATE_SETTING_ROUTES);
161 log_info_link(link, "link configured");
163 link->state = LINK_STATE_CONFIGURED;
170 static void link_enter_unmanaged(Link *link) {
173 log_debug_link(link, "unmanaged");
175 link->state = LINK_STATE_UNMANAGED;
180 static int link_stop_clients(Link *link) {
184 assert(link->manager);
185 assert(link->manager->event);
190 if (link->network->dhcp) {
191 assert(link->dhcp_client);
193 k = sd_dhcp_client_stop(link->dhcp_client);
195 log_warning_link(link, "Could not stop DHCPv4 client: %s", strerror(-r));
200 if (link->network->ipv4ll) {
201 assert(link->ipv4ll);
203 k = sd_ipv4ll_stop(link->ipv4ll);
205 log_warning_link(link, "Could not stop IPv4 link-local: %s", strerror(-r));
213 static void link_enter_failed(Link *link) {
216 if (link->state == LINK_STATE_FAILED)
219 log_warning_link(link, "failed");
221 link->state = LINK_STATE_FAILED;
223 link_stop_clients(link);
228 static int route_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
229 Link *link = userdata;
232 assert(link->route_messages > 0);
233 assert(link->state == LINK_STATE_SETTING_ADDRESSES ||
234 link->state == LINK_STATE_SETTING_ROUTES ||
235 link->state == LINK_STATE_FAILED);
237 link->route_messages --;
239 if (link->state == LINK_STATE_FAILED) {
244 r = sd_rtnl_message_get_errno(m);
245 if (r < 0 && r != -EEXIST)
246 log_struct_link(LOG_WARNING, link,
247 "MESSAGE=%s: could not set route: %s",
248 link->ifname, strerror(-r),
252 /* we might have received an old reply after moving back to SETTING_ADDRESSES,
254 if (link->route_messages == 0 && link->state == LINK_STATE_SETTING_ROUTES) {
255 log_debug_link(link, "routes set");
256 link_enter_configured(link);
264 static int link_enter_set_routes(Link *link) {
269 assert(link->network);
270 assert(link->state == LINK_STATE_SETTING_ADDRESSES);
272 link->state = LINK_STATE_SETTING_ROUTES;
274 if (!link->network->static_routes && !link->dhcp_lease &&
275 (!link->ipv4ll || ipv4ll_is_bound(link->ipv4ll) == false))
276 return link_enter_configured(link);
278 log_debug_link(link, "setting routes");
280 LIST_FOREACH(static_routes, rt, link->network->static_routes) {
281 r = route_configure(rt, link, &route_handler);
283 log_warning_link(link,
284 "could not set routes: %s", strerror(-r));
285 link_enter_failed(link);
290 link->route_messages ++;
293 if (link->ipv4ll && !link->dhcp_lease) {
294 _cleanup_route_free_ Route *route = NULL;
297 r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
298 if (r < 0 && r != -ENOENT) {
299 log_warning_link(link, "IPV4LL error: no address: %s",
305 r = route_new_dynamic(&route);
307 log_error_link(link, "Could not allocate route: %s",
312 route->family = AF_INET;
313 route->scope = RT_SCOPE_LINK;
316 r = route_configure(route, link, &route_handler);
318 log_warning_link(link,
319 "could not set routes: %s", strerror(-r));
320 link_enter_failed(link);
325 link->route_messages ++;
329 if (link->dhcp_lease) {
330 _cleanup_route_free_ Route *route = NULL;
331 _cleanup_route_free_ Route *route_gw = NULL;
332 struct in_addr gateway;
334 r = sd_dhcp_lease_get_router(link->dhcp_lease, &gateway);
335 if (r < 0 && r != -ENOENT) {
336 log_warning_link(link, "DHCP error: %s", strerror(-r));
341 r = route_new_dynamic(&route);
343 log_error_link(link, "Could not allocate route: %s",
348 r = route_new_dynamic(&route_gw);
350 log_error_link(link, "Could not allocate route: %s",
355 /* The dhcp netmask may mask out the gateway. Add an explicit
356 * route for the gw host so that we can route no matter the
357 * netmask or existing kernel route tables. */
358 route_gw->family = AF_INET;
359 route_gw->dst_addr.in = gateway;
360 route_gw->dst_prefixlen = 32;
361 route_gw->scope = RT_SCOPE_LINK;
363 r = route_configure(route_gw, link, &route_handler);
365 log_warning_link(link,
366 "could not set host route: %s", strerror(-r));
371 link->route_messages ++;
373 route->family = AF_INET;
374 route->in_addr.in = gateway;
376 r = route_configure(route, link, &route_handler);
378 log_warning_link(link,
379 "could not set routes: %s", strerror(-r));
380 link_enter_failed(link);
385 link->route_messages ++;
389 if (link->route_messages == 0) {
390 link_enter_configured(link);
396 static int route_drop_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
397 Link *link = userdata;
402 assert(link->ifname);
404 if (link->state == LINK_STATE_FAILED) {
409 r = sd_rtnl_message_get_errno(m);
410 if (r < 0 && r != -ENOENT)
411 log_struct_link(LOG_WARNING, link,
412 "MESSAGE=%s: could not drop route: %s",
413 link->ifname, strerror(-r),
422 static int address_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
423 Link *link = userdata;
428 assert(link->ifname);
429 assert(link->addr_messages > 0);
430 assert(link->state == LINK_STATE_SETTING_ADDRESSES || link->state == LINK_STATE_FAILED);
432 link->addr_messages --;
434 if (link->state == LINK_STATE_FAILED) {
439 r = sd_rtnl_message_get_errno(m);
440 if (r < 0 && r != -EEXIST)
441 log_struct_link(LOG_WARNING, link,
442 "MESSAGE=%s: could not set address: %s",
443 link->ifname, strerror(-r),
447 if (link->addr_messages == 0) {
448 log_debug_link(link, "addresses set");
449 link_enter_set_routes(link);
457 static int link_enter_set_addresses(Link *link) {
462 assert(link->network);
463 assert(link->state != _LINK_STATE_INVALID);
465 link->state = LINK_STATE_SETTING_ADDRESSES;
467 if (!link->network->static_addresses && !link->dhcp_lease &&
468 (!link->ipv4ll || ipv4ll_is_bound(link->ipv4ll) == false))
469 return link_enter_set_routes(link);
471 log_debug_link(link, "setting addresses");
473 LIST_FOREACH(static_addresses, ad, link->network->static_addresses) {
474 r = address_configure(ad, link, &address_handler);
476 log_warning_link(link,
477 "could not set addresses: %s", strerror(-r));
478 link_enter_failed(link);
483 link->addr_messages ++;
486 if (link->ipv4ll && !link->dhcp_lease) {
487 _cleanup_address_free_ Address *ll_addr = NULL;
490 r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
491 if (r < 0 && r != -ENOENT) {
492 log_warning_link(link, "IPV4LL error: no address: %s",
498 r = address_new_dynamic(&ll_addr);
500 log_error_link(link, "Could not allocate address: %s", strerror(-r));
504 ll_addr->family = AF_INET;
505 ll_addr->in_addr.in = addr;
506 ll_addr->prefixlen = 16;
507 ll_addr->broadcast.s_addr = ll_addr->in_addr.in.s_addr | htonl(0xfffffffflu >> ll_addr->prefixlen);
508 ll_addr->scope = RT_SCOPE_LINK;
510 r = address_configure(ll_addr, link, &address_handler);
512 log_warning_link(link,
513 "could not set addresses: %s", strerror(-r));
514 link_enter_failed(link);
519 link->addr_messages ++;
523 if (link->dhcp_lease) {
524 _cleanup_address_free_ Address *address = NULL;
526 struct in_addr netmask;
529 r = sd_dhcp_lease_get_address(link->dhcp_lease, &addr);
531 log_warning_link(link, "DHCP error: no address: %s",
536 r = sd_dhcp_lease_get_netmask(link->dhcp_lease, &netmask);
538 log_warning_link(link, "DHCP error: no netmask: %s",
543 prefixlen = net_netmask_to_prefixlen(&netmask);
545 r = address_new_dynamic(&address);
547 log_error_link(link, "Could not allocate address: %s",
552 address->family = AF_INET;
553 address->in_addr.in = addr;
554 address->prefixlen = prefixlen;
555 address->broadcast.s_addr = addr.s_addr | ~netmask.s_addr;
557 r = address_configure(address, link, &address_handler);
559 log_warning_link(link,
560 "could not set addresses: %s", strerror(-r));
561 link_enter_failed(link);
566 link->addr_messages ++;
572 static int address_update_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
573 Link *link = userdata;
578 assert(link->ifname);
580 if (link->state == LINK_STATE_FAILED) {
585 r = sd_rtnl_message_get_errno(m);
586 if (r < 0 && r != -ENOENT)
587 log_struct_link(LOG_WARNING, link,
588 "MESSAGE=%s: could not update address: %s",
589 link->ifname, strerror(-r),
598 static int address_drop_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
599 Link *link = userdata;
604 assert(link->ifname);
606 if (link->state == LINK_STATE_FAILED) {
611 r = sd_rtnl_message_get_errno(m);
612 if (r < 0 && r != -ENOENT)
613 log_struct_link(LOG_WARNING, link,
614 "MESSAGE=%s: could not drop address: %s",
615 link->ifname, strerror(-r),
624 static int set_hostname_handler(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
625 Link *link = userdata;
630 r = sd_bus_message_get_errno(m);
632 log_warning("Could not set hostname: %s", strerror(-r));
639 static int link_set_hostname(Link *link, const char *hostname) {
640 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
644 assert(link->manager);
647 log_debug_link(link, "Setting transient hostname: '%s'", hostname);
649 if (!link->manager->bus) { /* TODO: replace by assert when we can rely on kdbus */
650 log_info_link(link, "Not connected to system bus, ignoring transient hostname.");
654 r = sd_bus_message_new_method_call(
657 "org.freedesktop.hostname1",
658 "/org/freedesktop/hostname1",
659 "org.freedesktop.hostname1",
664 r = sd_bus_message_append(m, "sb", hostname, false);
668 r = sd_bus_call_async(link->manager->bus, m, set_hostname_handler, link, 0, NULL);
670 log_error_link(link, "Could not set transient hostname: %s", strerror(-r));
677 static int set_mtu_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
678 Link *link = userdata;
683 assert(link->ifname);
685 if (link->state == LINK_STATE_FAILED) {
690 r = sd_rtnl_message_get_errno(m);
692 log_struct_link(LOG_WARNING, link,
693 "MESSAGE=%s: could not set MTU: %s",
694 link->ifname, strerror(-r),
703 static int link_set_mtu(Link *link, uint32_t mtu) {
704 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
708 assert(link->manager);
709 assert(link->manager->rtnl);
711 log_debug_link(link, "setting MTU: %" PRIu32, mtu);
713 r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
714 RTM_SETLINK, link->ifindex);
716 log_error_link(link, "Could not allocate RTM_SETLINK message");
720 r = sd_rtnl_message_append_u32(req, IFLA_MTU, mtu);
722 log_error_link(link, "Could not append MTU: %s", strerror(-r));
726 r = sd_rtnl_call_async(link->manager->rtnl, req, set_mtu_handler, link, 0, NULL);
729 "Could not send rtnetlink message: %s", strerror(-r));
738 static int dhcp_lease_lost(Link *link) {
739 _cleanup_address_free_ Address *address = NULL;
740 _cleanup_route_free_ Route *route_gw = NULL;
741 _cleanup_route_free_ Route *route = NULL;
743 struct in_addr netmask;
744 struct in_addr gateway;
749 assert(link->dhcp_lease);
751 log_warning_link(link, "DHCP lease lost");
753 r = address_new_dynamic(&address);
755 r = sd_dhcp_lease_get_router(link->dhcp_lease, &gateway);
757 r = route_new_dynamic(&route_gw);
759 route_gw->family = AF_INET;
760 route_gw->dst_addr.in = gateway;
761 route_gw->dst_prefixlen = 32;
762 route_gw->scope = RT_SCOPE_LINK;
764 route_drop(route_gw, link, &route_drop_handler);
768 r = route_new_dynamic(&route);
770 route->family = AF_INET;
771 route->in_addr.in = gateway;
773 route_drop(route, link, &route_drop_handler);
778 sd_dhcp_lease_get_address(link->dhcp_lease, &addr);
779 sd_dhcp_lease_get_netmask(link->dhcp_lease, &netmask);
780 prefixlen = net_netmask_to_prefixlen(&netmask);
782 address->family = AF_INET;
783 address->in_addr.in = addr;
784 address->prefixlen = prefixlen;
786 address_drop(address, link, &address_drop_handler);
790 if (link->network->dhcp_mtu) {
793 r = sd_dhcp_lease_get_mtu(link->dhcp_lease, &mtu);
794 if (r >= 0 && link->original_mtu != mtu) {
795 r = link_set_mtu(link, link->original_mtu);
797 log_warning_link(link, "DHCP error: could not reset MTU");
798 link_enter_failed(link);
804 if (link->network->dhcp_hostname) {
805 const char *hostname = NULL;
807 r = sd_dhcp_lease_get_hostname(link->dhcp_lease, &hostname);
808 if (r >= 0 && hostname) {
809 r = link_set_hostname(link, "");
811 log_error("Failed to reset transient hostname");
815 link->dhcp_lease = sd_dhcp_lease_unref(link->dhcp_lease);
820 static int dhcp_lease_acquired(sd_dhcp_client *client, Link *link) {
821 sd_dhcp_lease *lease;
822 struct in_addr address;
823 struct in_addr netmask;
824 struct in_addr gateway;
826 struct in_addr *nameservers;
827 size_t nameservers_size;
833 r = sd_dhcp_client_get_lease(client, &lease);
835 log_warning_link(link, "DHCP error: no lease: %s",
840 r = sd_dhcp_lease_get_address(lease, &address);
842 log_warning_link(link, "DHCP error: no address: %s",
847 r = sd_dhcp_lease_get_netmask(lease, &netmask);
849 log_warning_link(link, "DHCP error: no netmask: %s",
854 prefixlen = net_netmask_to_prefixlen(&netmask);
856 r = sd_dhcp_lease_get_router(lease, &gateway);
857 if (r < 0 && r != -ENOENT) {
858 log_warning_link(link, "DHCP error: %s", strerror(-r));
863 log_struct_link(LOG_INFO, link,
864 "MESSAGE=%s: DHCPv4 address %u.%u.%u.%u/%u via %u.%u.%u.%u",
866 ADDRESS_FMT_VAL(address),
868 ADDRESS_FMT_VAL(gateway),
869 "ADDRESS=%u.%u.%u.%u",
870 ADDRESS_FMT_VAL(address),
873 "GATEWAY=%u.%u.%u.%u",
874 ADDRESS_FMT_VAL(gateway),
877 log_struct_link(LOG_INFO, link,
878 "MESSAGE=%s: DHCPv4 address %u.%u.%u.%u/%u",
880 ADDRESS_FMT_VAL(address),
882 "ADDRESS=%u.%u.%u.%u",
883 ADDRESS_FMT_VAL(address),
888 link->dhcp_lease = lease;
890 if (link->network->dhcp_dns) {
891 r = sd_dhcp_lease_get_dns(lease, &nameservers, &nameservers_size);
893 r = manager_update_resolv_conf(link->manager);
895 log_error("Failed to update resolv.conf");
899 if (link->network->dhcp_mtu) {
902 r = sd_dhcp_lease_get_mtu(lease, &mtu);
904 r = link_set_mtu(link, mtu);
906 log_error_link(link, "Failed to set MTU "
911 if (link->network->dhcp_hostname) {
912 const char *hostname;
914 r = sd_dhcp_lease_get_hostname(lease, &hostname);
916 r = link_set_hostname(link, hostname);
918 log_error("Failed to set transient hostname "
919 "to '%s'", hostname);
923 link_enter_set_addresses(link);
928 static void dhcp_handler(sd_dhcp_client *client, int event, void *userdata) {
929 Link *link = userdata;
933 assert(link->network);
934 assert(link->manager);
936 if (link->state == LINK_STATE_FAILED)
940 case DHCP_EVENT_NO_LEASE:
941 log_debug_link(link, "IP address in use.");
943 case DHCP_EVENT_EXPIRED:
944 case DHCP_EVENT_STOP:
945 case DHCP_EVENT_IP_CHANGE:
946 if (link->network->dhcp_critical) {
947 log_error_link(link, "DHCPv4 connection considered system critical, "
948 "ignoring request to reconfigure it.");
952 if (link->dhcp_lease) {
953 r = dhcp_lease_lost(link);
955 link_enter_failed(link);
960 if (event == DHCP_EVENT_IP_CHANGE) {
961 r = dhcp_lease_acquired(client, link);
963 link_enter_failed(link);
968 if (event == DHCP_EVENT_EXPIRED && link->network->ipv4ll) {
969 if (!sd_ipv4ll_is_running(link->ipv4ll))
970 r = sd_ipv4ll_start(link->ipv4ll);
971 else if (ipv4ll_is_bound(link->ipv4ll))
972 r = ipv4ll_address_update(link, false);
974 link_enter_failed(link);
980 case DHCP_EVENT_IP_ACQUIRE:
981 r = dhcp_lease_acquired(client, link);
983 link_enter_failed(link);
987 if (ipv4ll_is_bound(link->ipv4ll))
988 r = ipv4ll_address_update(link, true);
990 r = sd_ipv4ll_stop(link->ipv4ll);
992 link_enter_failed(link);
999 log_warning_link(link, "DHCP error: %s", strerror(-event));
1001 log_warning_link(link, "DHCP unknown event: %d", event);
1008 static int ipv4ll_address_update(Link *link, bool deprecate) {
1010 struct in_addr addr;
1014 r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
1016 _cleanup_address_free_ Address *address = NULL;
1018 log_debug_link(link, "IPv4 link-local %s %u.%u.%u.%u",
1019 deprecate ? "deprecate" : "approve",
1020 ADDRESS_FMT_VAL(addr));
1022 r = address_new_dynamic(&address);
1024 log_error_link(link, "Could not allocate address: %s", strerror(-r));
1028 address->family = AF_INET;
1029 address->in_addr.in = addr;
1030 address->prefixlen = 16;
1031 address->scope = RT_SCOPE_LINK;
1032 address->cinfo.ifa_prefered = deprecate ? 0 : CACHE_INFO_INFINITY_LIFE_TIME;
1033 address->broadcast.s_addr = address->in_addr.in.s_addr | htonl(0xfffffffflu >> address->prefixlen);
1035 address_update(address, link, &address_update_handler);
1043 static int ipv4ll_address_lost(Link *link) {
1045 struct in_addr addr;
1049 r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
1051 _cleanup_address_free_ Address *address = NULL;
1052 _cleanup_route_free_ Route *route = NULL;
1054 log_debug_link(link, "IPv4 link-local release %u.%u.%u.%u",
1055 ADDRESS_FMT_VAL(addr));
1057 r = address_new_dynamic(&address);
1059 log_error_link(link, "Could not allocate address: %s", strerror(-r));
1063 address->family = AF_INET;
1064 address->in_addr.in = addr;
1065 address->prefixlen = 16;
1066 address->scope = RT_SCOPE_LINK;
1068 address_drop(address, link, &address_drop_handler);
1071 r = route_new_dynamic(&route);
1073 log_error_link(link, "Could not allocate route: %s",
1078 route->family = AF_INET;
1079 route->scope = RT_SCOPE_LINK;
1080 route->metrics = 99;
1082 route_drop(route, link, &route_drop_handler);
1089 static bool ipv4ll_is_bound(sd_ipv4ll *ll) {
1091 struct in_addr addr;
1095 r = sd_ipv4ll_get_address(ll, &addr);
1101 static int ipv4ll_address_claimed(sd_ipv4ll *ll, Link *link) {
1102 struct in_addr address;
1108 r = sd_ipv4ll_get_address(ll, &address);
1112 log_struct_link(LOG_INFO, link,
1113 "MESSAGE=%s: IPv4 link-local address %u.%u.%u.%u",
1115 ADDRESS_FMT_VAL(address),
1118 link_enter_set_addresses(link);
1123 static void ipv4ll_handler(sd_ipv4ll *ll, int event, void *userdata){
1124 Link *link = userdata;
1128 assert(link->network);
1129 assert(link->manager);
1132 case IPV4LL_EVENT_STOP:
1133 case IPV4LL_EVENT_CONFLICT:
1134 r = ipv4ll_address_lost(link);
1136 link_enter_failed(link);
1140 case IPV4LL_EVENT_BIND:
1141 r = ipv4ll_address_claimed(ll, link);
1143 link_enter_failed(link);
1149 log_warning_link(link, "IPv4 link-local error: %s", strerror(-event));
1151 log_warning_link(link, "IPv4 link-local unknown event: %d", event);
1156 static int link_acquire_conf(Link *link) {
1160 assert(link->network);
1161 assert(link->manager);
1162 assert(link->manager->event);
1164 if (link->network->ipv4ll) {
1165 assert(link->ipv4ll);
1167 log_debug_link(link, "acquiring IPv4 link-local address");
1169 r = sd_ipv4ll_start(link->ipv4ll);
1171 log_warning_link(link, "could not acquire IPv4 "
1172 "link-local address");
1177 if (link->network->dhcp) {
1178 assert(link->dhcp_client);
1180 log_debug_link(link, "acquiring DHCPv4 lease");
1182 r = sd_dhcp_client_start(link->dhcp_client);
1184 log_warning_link(link, "could not acquire DHCPv4 "
1193 bool link_has_carrier(unsigned flags, uint8_t operstate) {
1194 /* see Documentation/networking/operstates.txt in the kernel sources */
1196 if (operstate == IF_OPER_UP)
1199 if (operstate == IF_OPER_UNKNOWN)
1200 /* operstate may not be implemented, so fall back to flags */
1201 if ((flags & IFF_LOWER_UP) && !(flags & IFF_DORMANT))
1207 static int link_update_flags(Link *link, sd_rtnl_message *m) {
1208 unsigned flags, flags_added, flags_removed, generic_flags;
1210 bool carrier_gained = false, carrier_lost = false;
1215 r = sd_rtnl_message_link_get_flags(m, &flags);
1217 log_warning_link(link, "Could not get link flags");
1221 r = sd_rtnl_message_read_u8(m, IFLA_OPERSTATE, &operstate);
1223 /* if we got a message without operstate, take it to mean
1224 the state was unchanged */
1225 operstate = link->operstate;
1227 if ((link->flags == flags) && (link->operstate == operstate))
1230 flags_added = (link->flags ^ flags) & flags;
1231 flags_removed = (link->flags ^ flags) & link->flags;
1232 generic_flags = ~(IFF_UP | IFF_LOWER_UP | IFF_DORMANT | IFF_DEBUG |
1233 IFF_MULTICAST | IFF_BROADCAST | IFF_PROMISC |
1234 IFF_NOARP | IFF_MASTER | IFF_SLAVE | IFF_RUNNING);
1236 if (flags_added & IFF_UP)
1237 log_debug_link(link, "link is up");
1238 else if (flags_removed & IFF_UP)
1239 log_debug_link(link, "link is down");
1241 if (flags_added & IFF_LOWER_UP)
1242 log_debug_link(link, "link is lower up");
1243 else if (flags_removed & IFF_LOWER_UP)
1244 log_debug_link(link, "link is lower down");
1246 if (flags_added & IFF_DORMANT)
1247 log_debug_link(link, "link is dormant");
1248 else if (flags_removed & IFF_DORMANT)
1249 log_debug_link(link, "link is not dormant");
1251 if (flags_added & IFF_DEBUG)
1252 log_debug_link(link, "debugging enabled in the kernel");
1253 else if (flags_removed & IFF_DEBUG)
1254 log_debug_link(link, "debugging disabled in the kernel");
1256 if (flags_added & IFF_MULTICAST)
1257 log_debug_link(link, "multicast enabled");
1258 else if (flags_removed & IFF_MULTICAST)
1259 log_debug_link(link, "multicast disabled");
1261 if (flags_added & IFF_BROADCAST)
1262 log_debug_link(link, "broadcast enabled");
1263 else if (flags_removed & IFF_BROADCAST)
1264 log_debug_link(link, "broadcast disabled");
1266 if (flags_added & IFF_PROMISC)
1267 log_debug_link(link, "promiscuous mode enabled");
1268 else if (flags_removed & IFF_PROMISC)
1269 log_debug_link(link, "promiscuous mode disabled");
1271 if (flags_added & IFF_NOARP)
1272 log_debug_link(link, "ARP protocol disabled");
1273 else if (flags_removed & IFF_NOARP)
1274 log_debug_link(link, "ARP protocol enabled");
1276 if (flags_added & IFF_MASTER)
1277 log_debug_link(link, "link is master");
1278 else if (flags_removed & IFF_MASTER)
1279 log_debug_link(link, "link is no longer master");
1281 if (flags_added & IFF_SLAVE)
1282 log_debug_link(link, "link is slave");
1283 else if (flags_removed & IFF_SLAVE)
1284 log_debug_link(link, "link is no longer slave");
1286 /* link flags are currently at most 18 bits, let's default to printing 20 */
1287 if (flags_added & generic_flags)
1288 log_debug_link(link, "unknown link flags gained: %#.5x (ignoring)",
1289 flags_added & generic_flags);
1291 if (flags_removed & generic_flags)
1292 log_debug_link(link, "unknown link flags lost: %#.5x (ignoring)",
1293 flags_removed & generic_flags);
1295 carrier_gained = !link_has_carrier(link->flags, link->operstate) &&
1296 link_has_carrier(flags, operstate);
1297 carrier_lost = link_has_carrier(link->flags, link->operstate) &&
1298 !link_has_carrier(flags, operstate);
1300 link->flags = flags;
1301 link->operstate = operstate;
1305 if (link->state == LINK_STATE_FAILED ||
1306 link->state == LINK_STATE_UNMANAGED)
1309 if (carrier_gained) {
1310 log_info_link(link, "gained carrier");
1312 if (link->network) {
1313 r = link_acquire_conf(link);
1315 link_enter_failed(link);
1319 } else if (carrier_lost) {
1320 log_info_link(link, "lost carrier");
1322 r = link_stop_clients(link);
1324 link_enter_failed(link);
1332 static int link_up_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
1333 Link *link = userdata;
1338 if (link->state == LINK_STATE_FAILED) {
1343 r = sd_rtnl_message_get_errno(m);
1345 /* we warn but don't fail the link, as it may
1346 be brought up later */
1347 log_struct_link(LOG_WARNING, link,
1348 "MESSAGE=%s: could not bring up interface: %s",
1349 link->ifname, strerror(-r),
1359 static int link_up(Link *link) {
1360 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
1364 assert(link->manager);
1365 assert(link->manager->rtnl);
1367 log_debug_link(link, "bringing link up");
1369 r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
1370 RTM_SETLINK, link->ifindex);
1372 log_error_link(link, "Could not allocate RTM_SETLINK message");
1376 r = sd_rtnl_message_link_set_flags(req, IFF_UP, IFF_UP);
1378 log_error_link(link, "Could not set link flags: %s", strerror(-r));
1382 r = sd_rtnl_call_async(link->manager->rtnl, req, link_up_handler, link, 0, NULL);
1384 log_error_link(link,
1385 "Could not send rtnetlink message: %s", strerror(-r));
1394 static int link_enslaved(Link *link) {
1398 assert(link->state == LINK_STATE_ENSLAVING);
1399 assert(link->network);
1401 if (!(link->flags & IFF_UP)) {
1404 link_enter_failed(link);
1409 if (!link->network->dhcp && !link->network->ipv4ll)
1410 return link_enter_set_addresses(link);
1415 static int enslave_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
1416 Link *link = userdata;
1420 assert(link->state == LINK_STATE_ENSLAVING || link->state == LINK_STATE_FAILED);
1421 assert(link->network);
1425 if (link->state == LINK_STATE_FAILED) {
1430 r = sd_rtnl_message_get_errno(m);
1432 log_struct_link(LOG_ERR, link,
1433 "MESSAGE=%s: could not enslave: %s",
1434 link->ifname, strerror(-r),
1437 link_enter_failed(link);
1442 log_debug_link(link, "enslaved");
1444 if (link->enslaving == 0)
1445 link_enslaved(link);
1452 static int link_enter_enslave(Link *link) {
1453 NetDev *vlan, *macvlan;
1458 assert(link->network);
1459 assert(link->state == LINK_STATE_INITIALIZING);
1461 link->state = LINK_STATE_ENSLAVING;
1465 if (!link->network->bridge && !link->network->bond &&
1466 hashmap_isempty(link->network->vlans) &&
1467 hashmap_isempty(link->network->macvlans))
1468 return link_enslaved(link);
1470 if (link->network->bridge) {
1471 log_struct_link(LOG_DEBUG, link,
1472 "MESSAGE=%s: enslaving by '%s'",
1473 link->ifname, link->network->bridge->name,
1474 NETDEV(link->network->bridge),
1477 r = netdev_enslave(link->network->bridge, link, &enslave_handler);
1479 log_struct_link(LOG_WARNING, link,
1480 "MESSAGE=%s: could not enslave by '%s': %s",
1481 link->ifname, link->network->bridge->name, strerror(-r),
1482 NETDEV(link->network->bridge),
1484 link_enter_failed(link);
1492 if (link->network->bond) {
1493 log_struct_link(LOG_DEBUG, link,
1494 "MESSAGE=%s: enslaving by '%s'",
1495 link->ifname, link->network->bond->name,
1496 NETDEV(link->network->bond),
1499 r = netdev_enslave(link->network->bond, link, &enslave_handler);
1501 log_struct_link(LOG_WARNING, link,
1502 "MESSAGE=%s: could not enslave by '%s': %s",
1503 link->ifname, link->network->bond->name, strerror(-r),
1504 NETDEV(link->network->bond),
1506 link_enter_failed(link);
1514 HASHMAP_FOREACH(vlan, link->network->vlans, i) {
1515 log_struct_link(LOG_DEBUG, link,
1516 "MESSAGE=%s: enslaving by '%s'",
1517 link->ifname, vlan->name, NETDEV(vlan), NULL);
1519 r = netdev_enslave(vlan, link, &enslave_handler);
1521 log_struct_link(LOG_WARNING, link,
1522 "MESSAGE=%s: could not enslave by '%s': %s",
1523 link->ifname, vlan->name, strerror(-r),
1524 NETDEV(vlan), NULL);
1525 link_enter_failed(link);
1533 HASHMAP_FOREACH(macvlan, link->network->macvlans, i) {
1534 log_struct_link(LOG_DEBUG, link,
1535 "MESSAGE=%s: enslaving by '%s'",
1536 link->ifname, macvlan->name, NETDEV(macvlan), NULL);
1538 r = netdev_enslave(macvlan, link, &enslave_handler);
1540 log_struct_link(LOG_WARNING, link,
1541 "MESSAGE=%s: could not enslave by '%s': %s",
1542 link->ifname, macvlan->name, strerror(-r),
1543 NETDEV(macvlan), NULL);
1544 link_enter_failed(link);
1555 static int link_configure(Link *link) {
1559 assert(link->state == LINK_STATE_INITIALIZING);
1561 if (link->network->ipv4ll) {
1564 r = sd_ipv4ll_new(&link->ipv4ll);
1568 if (link->udev_device) {
1569 r = net_get_unique_predictable_data(link->udev_device, seed);
1571 r = sd_ipv4ll_set_address_seed(link->ipv4ll, seed);
1577 r = sd_ipv4ll_attach_event(link->ipv4ll, NULL, 0);
1581 r = sd_ipv4ll_set_mac(link->ipv4ll, &link->mac);
1585 r = sd_ipv4ll_set_index(link->ipv4ll, link->ifindex);
1589 r = sd_ipv4ll_set_callback(link->ipv4ll, ipv4ll_handler, link);
1594 if (link->network->dhcp) {
1595 r = sd_dhcp_client_new(&link->dhcp_client);
1599 r = sd_dhcp_client_attach_event(link->dhcp_client, NULL, 0);
1603 r = sd_dhcp_client_set_mac(link->dhcp_client, &link->mac);
1607 r = sd_dhcp_client_set_index(link->dhcp_client, link->ifindex);
1611 r = sd_dhcp_client_set_callback(link->dhcp_client, dhcp_handler, link);
1615 if (link->network->dhcp_mtu) {
1616 r = sd_dhcp_client_set_request_option(link->dhcp_client, 26);
1622 if (link_has_carrier(link->flags, link->operstate)) {
1623 r = link_acquire_conf(link);
1628 return link_enter_enslave(link);
1631 int link_initialized(Link *link, struct udev_device *device) {
1636 assert(link->ifname);
1637 assert(link->manager);
1639 if (link->state != LINK_STATE_INITIALIZING)
1643 link->udev_device = udev_device_ref(device);
1645 log_debug_link(link, "link initialized");
1647 r = network_get(link->manager, device, link->ifname, &link->mac, &network);
1649 link_enter_unmanaged(link);
1654 r = network_apply(link->manager, network, link);
1658 r = link_configure(link);
1665 int link_add(Manager *m, sd_rtnl_message *message, Link **ret) {
1667 _cleanup_udev_device_unref_ struct udev_device *device = NULL;
1668 char ifindex_str[2 + DECIMAL_STR_MAX(int)];
1675 r = link_new(m, message, ret);
1681 log_debug_link(link, "link added");
1683 if (detect_container(NULL) <= 0) {
1684 /* not in a container, udev will be around */
1685 sprintf(ifindex_str, "n%"PRIu64, link->ifindex);
1686 device = udev_device_new_from_device_id(m->udev, ifindex_str);
1688 log_warning_link(link, "could not find udev device");
1692 if (udev_device_get_is_initialized(device) <= 0)
1697 r = link_initialized(link, device);
1704 int link_update(Link *link, sd_rtnl_message *m) {
1705 struct ether_addr mac;
1710 assert(link->ifname);
1713 r = sd_rtnl_message_read_string(m, IFLA_IFNAME, &ifname);
1714 if (r >= 0 && !streq(ifname, link->ifname)) {
1715 log_info_link(link, "renamed to %s", ifname);
1718 link->ifname = strdup(ifname);
1723 if (!link->original_mtu) {
1724 r = sd_rtnl_message_read_u16(m, IFLA_MTU, &link->original_mtu);
1726 log_debug_link(link, "saved original MTU: %"
1727 PRIu16, link->original_mtu);
1730 /* The kernel may broadcast NEWLINK messages without the MAC address
1731 set, simply ignore them. */
1732 r = sd_rtnl_message_read_ether_addr(m, IFLA_ADDRESS, &mac);
1734 if (memcmp(link->mac.ether_addr_octet, mac.ether_addr_octet, ETH_ALEN)) {
1736 memcpy(link->mac.ether_addr_octet, mac.ether_addr_octet, ETH_ALEN);
1738 log_debug_link(link, "MAC address: "
1739 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
1740 mac.ether_addr_octet[0],
1741 mac.ether_addr_octet[1],
1742 mac.ether_addr_octet[2],
1743 mac.ether_addr_octet[3],
1744 mac.ether_addr_octet[4],
1745 mac.ether_addr_octet[5]);
1748 r = sd_ipv4ll_set_mac(link->ipv4ll, &link->mac);
1750 log_warning_link(link, "Could not update MAC "
1751 "address in IPv4LL client: %s",
1757 if (link->dhcp_client) {
1758 r = sd_dhcp_client_set_mac(link->dhcp_client, &link->mac);
1760 log_warning_link(link, "Could not update MAC "
1761 "address in DHCP client: %s",
1769 return link_update_flags(link, m);
1772 int link_save(Link *link) {
1773 _cleanup_free_ char *temp_path = NULL;
1774 _cleanup_fclose_ FILE *f = NULL;
1775 const char *admin_state, *oper_state = "unknown";
1779 assert(link->state_file);
1780 assert(link->lease_file);
1781 assert(link->manager);
1783 r = manager_save(link->manager);
1787 admin_state = link_state_to_string(link->state);
1788 assert(admin_state);
1790 if (link->operstate == IF_OPER_DORMANT)
1791 oper_state = "dormant";
1792 else if (link_has_carrier(link->flags, link->operstate))
1793 oper_state = "carrier";
1795 r = fopen_temporary(link->state_file, &f, &temp_path);
1799 fchmod(fileno(f), 0644);
1802 "# This is private data. Do not parse.\n"
1806 admin_state, oper_state, link->flags);
1808 if (link->dhcp_lease) {
1809 r = dhcp_lease_save(link->dhcp_lease, link->lease_file);
1813 fprintf(f, "DHCP_LEASE=%s\n", link->lease_file);
1815 unlink(link->lease_file);
1819 if (ferror(f) || rename(temp_path, link->state_file) < 0) {
1821 unlink(link->state_file);
1827 log_error("Failed to save link data to %s: %s", link->state_file, strerror(-r));
1832 static const char* const link_state_table[_LINK_STATE_MAX] = {
1833 [LINK_STATE_INITIALIZING] = "initializing",
1834 [LINK_STATE_ENSLAVING] = "configuring",
1835 [LINK_STATE_SETTING_ADDRESSES] = "configuring",
1836 [LINK_STATE_SETTING_ROUTES] = "configuring",
1837 [LINK_STATE_CONFIGURED] = "configured",
1838 [LINK_STATE_UNMANAGED] = "unmanaged",
1839 [LINK_STATE_FAILED] = "failed",
1842 DEFINE_STRING_TABLE_LOOKUP(link_state, LinkState);