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>
30 #include "udev-util.h"
31 #include "libudev-private.h"
32 #include "network-internal.h"
33 #include "networkd-link.h"
34 #include "networkd-netdev.h"
35 #include "conf-parser.h"
36 #include "dhcp-lease-internal.h"
38 static bool link_dhcp6_enabled(Link *link) {
39 if (link->flags & IFF_LOOPBACK)
45 return IN_SET(link->network->dhcp, ADDRESS_FAMILY_IPV6, ADDRESS_FAMILY_YES);
48 static bool link_dhcp4_enabled(Link *link) {
49 if (link->flags & IFF_LOOPBACK)
55 return IN_SET(link->network->dhcp, ADDRESS_FAMILY_IPV4, ADDRESS_FAMILY_YES);
58 static bool link_dhcp4_server_enabled(Link *link) {
59 if (link->flags & IFF_LOOPBACK)
65 return link->network->dhcp_server;
68 static bool link_ipv4ll_enabled(Link *link) {
69 if (link->flags & IFF_LOOPBACK)
75 return link->network->ipv4ll;
78 static bool link_lldp_enabled(Link *link) {
79 if (link->flags & IFF_LOOPBACK)
85 if (link->network->bridge)
88 return link->network->lldp;
91 static bool link_ipv4_forward_enabled(Link *link) {
92 if (link->flags & IFF_LOOPBACK)
98 return IN_SET(link->network->ip_forward, ADDRESS_FAMILY_IPV4, ADDRESS_FAMILY_YES);
101 static bool link_ipv6_forward_enabled(Link *link) {
102 if (link->flags & IFF_LOOPBACK)
108 return IN_SET(link->network->ip_forward, ADDRESS_FAMILY_IPV6, ADDRESS_FAMILY_YES);
111 #define FLAG_STRING(string, flag, old, new) \
112 (((old ^ new) & flag) \
113 ? ((old & flag) ? (" -" string) : (" +" string)) \
116 static int link_update_flags(Link *link, sd_rtnl_message *m) {
117 unsigned flags, unknown_flags_added, unknown_flags_removed, unknown_flags;
123 r = sd_rtnl_message_link_get_flags(m, &flags);
125 log_link_warning(link, "Could not get link flags");
129 r = sd_rtnl_message_read_u8(m, IFLA_OPERSTATE, &operstate);
131 /* if we got a message without operstate, take it to mean
132 the state was unchanged */
133 operstate = link->kernel_operstate;
135 if ((link->flags == flags) && (link->kernel_operstate == operstate))
138 if (link->flags != flags) {
139 log_link_debug(link, "flags change:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
140 FLAG_STRING("LOOPBACK", IFF_LOOPBACK, link->flags, flags),
141 FLAG_STRING("MASTER", IFF_MASTER, link->flags, flags),
142 FLAG_STRING("SLAVE", IFF_SLAVE, link->flags, flags),
143 FLAG_STRING("UP", IFF_UP, link->flags, flags),
144 FLAG_STRING("DORMANT", IFF_DORMANT, link->flags, flags),
145 FLAG_STRING("LOWER_UP", IFF_LOWER_UP, link->flags, flags),
146 FLAG_STRING("RUNNING", IFF_RUNNING, link->flags, flags),
147 FLAG_STRING("MULTICAST", IFF_MULTICAST, link->flags, flags),
148 FLAG_STRING("BROADCAST", IFF_BROADCAST, link->flags, flags),
149 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT, link->flags, flags),
150 FLAG_STRING("PROMISC", IFF_PROMISC, link->flags, flags),
151 FLAG_STRING("ALLMULTI", IFF_ALLMULTI, link->flags, flags),
152 FLAG_STRING("PORTSEL", IFF_PORTSEL, link->flags, flags),
153 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA, link->flags, flags),
154 FLAG_STRING("DYNAMIC", IFF_DYNAMIC, link->flags, flags),
155 FLAG_STRING("NOARP", IFF_NOARP, link->flags, flags),
156 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS, link->flags, flags),
157 FLAG_STRING("DEBUG", IFF_DEBUG, link->flags, flags),
158 FLAG_STRING("ECHO", IFF_ECHO, link->flags, flags));
160 unknown_flags = ~(IFF_LOOPBACK | IFF_MASTER | IFF_SLAVE | IFF_UP |
161 IFF_DORMANT | IFF_LOWER_UP | IFF_RUNNING |
162 IFF_MULTICAST | IFF_BROADCAST | IFF_POINTOPOINT |
163 IFF_PROMISC | IFF_ALLMULTI | IFF_PORTSEL |
164 IFF_AUTOMEDIA | IFF_DYNAMIC | IFF_NOARP |
165 IFF_NOTRAILERS | IFF_DEBUG | IFF_ECHO);
166 unknown_flags_added = ((link->flags ^ flags) & flags & unknown_flags);
167 unknown_flags_removed = ((link->flags ^ flags) & link->flags & unknown_flags);
169 /* link flags are currently at most 18 bits, let's align to
171 if (unknown_flags_added)
173 "unknown link flags gained: %#.5x (ignoring)",
174 unknown_flags_added);
176 if (unknown_flags_removed)
178 "unknown link flags lost: %#.5x (ignoring)",
179 unknown_flags_removed);
183 link->kernel_operstate = operstate;
190 static int link_new(Manager *manager, sd_rtnl_message *message, Link **ret) {
191 _cleanup_link_unref_ Link *link = NULL;
200 r = sd_rtnl_message_get_type(message, &type);
203 else if (type != RTM_NEWLINK)
206 r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
209 else if (ifindex <= 0)
212 r = sd_rtnl_message_read_string(message, IFLA_IFNAME, &ifname);
216 link = new0(Link, 1);
221 link->manager = manager;
222 link->state = LINK_STATE_PENDING;
223 link->ifindex = ifindex;
224 link->ifname = strdup(ifname);
228 r = sd_rtnl_message_read_ether_addr(message, IFLA_ADDRESS, &link->mac);
230 log_link_debug(link, "MAC address not found for new device, continuing without");
232 r = asprintf(&link->state_file, "/run/systemd/netif/links/%d",
237 r = asprintf(&link->lease_file, "/run/systemd/netif/leases/%d",
242 r = asprintf(&link->lldp_file, "/run/systemd/netif/lldp/%d",
248 r = hashmap_ensure_allocated(&manager->links, NULL);
252 r = hashmap_put(manager->links, INT_TO_PTR(link->ifindex), link);
256 r = link_update_flags(link, message);
266 static void link_free(Link *link) {
272 while ((address = link->addresses)) {
273 LIST_REMOVE(addresses, link->addresses, address);
274 address_free(address);
277 while ((address = link->pool_addresses)) {
278 LIST_REMOVE(addresses, link->pool_addresses, address);
279 address_free(address);
282 sd_dhcp_server_unref(link->dhcp_server);
283 sd_dhcp_client_unref(link->dhcp_client);
284 sd_dhcp_lease_unref(link->dhcp_lease);
286 unlink(link->lease_file);
287 free(link->lease_file);
289 sd_lldp_free(link->lldp);
291 unlink(link->lldp_file);
292 free(link->lldp_file);
294 sd_ipv4ll_unref(link->ipv4ll);
295 sd_dhcp6_client_unref(link->dhcp6_client);
296 sd_icmp6_nd_unref(link->icmp6_router_discovery);
299 hashmap_remove(link->manager->links, INT_TO_PTR(link->ifindex));
303 unlink(link->state_file);
304 free(link->state_file);
306 udev_device_unref(link->udev_device);
311 Link *link_unref(Link *link) {
312 if (link && (-- link->n_ref <= 0))
318 Link *link_ref(Link *link) {
320 assert_se(++ link->n_ref >= 2);
325 int link_get(Manager *m, int ifindex, Link **ret) {
332 link = hashmap_get(m->links, INT_TO_PTR(ifindex));
341 static void link_set_state(Link *link, LinkState state) {
344 if (link->state == state)
349 link_send_changed(link, "AdministrativeState", NULL);
354 void link_drop(Link *link) {
355 if (!link || link->state == LINK_STATE_LINGER)
358 link_set_state(link, LINK_STATE_LINGER);
360 log_link_debug(link, "link removed");
367 static void link_enter_unmanaged(Link *link) {
370 log_link_debug(link, "unmanaged");
372 link_set_state(link, LINK_STATE_UNMANAGED);
377 static int link_stop_clients(Link *link) {
381 assert(link->manager);
382 assert(link->manager->event);
387 if (link->dhcp_client) {
388 k = sd_dhcp_client_stop(link->dhcp_client);
390 log_link_warning(link, "Could not stop DHCPv4 client: %s",
397 k = sd_ipv4ll_stop(link->ipv4ll);
399 log_link_warning(link, "Could not stop IPv4 link-local: %s",
405 if(link->icmp6_router_discovery) {
407 if (link->dhcp6_client) {
408 k = sd_dhcp6_client_stop(link->dhcp6_client);
410 log_link_warning(link, "Could not stop DHCPv6 client: %s",
416 k = sd_icmp6_nd_stop(link->icmp6_router_discovery);
418 log_link_warning(link,
419 "Could not stop ICMPv6 router discovery: %s",
427 k = sd_lldp_stop(link->lldp);
429 log_link_warning(link, "Could not stop LLDP : %s",
438 void link_enter_failed(Link *link) {
441 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
444 log_link_warning(link, "failed");
446 link_set_state(link, LINK_STATE_FAILED);
448 link_stop_clients(link);
453 static Address* link_find_dhcp_server_address(Link *link) {
457 assert(link->network);
459 /* The first statically configured address if there is any */
460 LIST_FOREACH(addresses, address, link->network->static_addresses) {
462 if (address->family != AF_INET)
465 if (in_addr_is_null(address->family, &address->in_addr))
471 /* If that didn't work, find a suitable address we got from the pool */
472 LIST_FOREACH(addresses, address, link->pool_addresses) {
473 if (address->family != AF_INET)
482 static int link_enter_configured(Link *link) {
484 assert(link->network);
485 assert(link->state == LINK_STATE_SETTING_ROUTES);
487 log_link_info(link, "link configured");
489 link_set_state(link, LINK_STATE_CONFIGURED);
496 void link_client_handler(Link *link) {
498 assert(link->network);
500 if (!link->static_configured)
503 if (link_ipv4ll_enabled(link))
504 if (!link->ipv4ll_address ||
508 if (link_dhcp4_enabled(link) && !link->dhcp4_configured)
511 if (link->state != LINK_STATE_CONFIGURED)
512 link_enter_configured(link);
517 static int route_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
518 _cleanup_link_unref_ Link *link = userdata;
521 assert(link->link_messages > 0);
522 assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
523 LINK_STATE_SETTING_ROUTES, LINK_STATE_FAILED,
526 link->link_messages --;
528 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
531 r = sd_rtnl_message_get_errno(m);
532 if (r < 0 && r != -EEXIST)
533 log_link_warning_errno(link, -r, "%-*s: could not set route: %m", IFNAMSIZ, link->ifname);
535 if (link->link_messages == 0) {
536 log_link_debug(link, "routes set");
537 link->static_configured = true;
538 link_client_handler(link);
544 static int link_enter_set_routes(Link *link) {
549 assert(link->network);
550 assert(link->state == LINK_STATE_SETTING_ADDRESSES);
552 link_set_state(link, LINK_STATE_SETTING_ROUTES);
554 LIST_FOREACH(routes, rt, link->network->static_routes) {
555 r = route_configure(rt, link, &route_handler);
557 log_link_warning(link,
558 "could not set routes: %s",
560 link_enter_failed(link);
564 link->link_messages ++;
567 if (link->link_messages == 0) {
568 link->static_configured = true;
569 link_client_handler(link);
571 log_link_debug(link, "setting routes");
576 int link_route_drop_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
577 _cleanup_link_unref_ Link *link = userdata;
582 assert(link->ifname);
584 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
587 r = sd_rtnl_message_get_errno(m);
588 if (r < 0 && r != -ESRCH)
589 log_link_warning_errno(link, -r, "%-*s: could not drop route: %m", IFNAMSIZ, link->ifname);
594 static int address_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
595 _cleanup_link_unref_ Link *link = userdata;
601 assert(link->ifname);
602 assert(link->link_messages > 0);
603 assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
604 LINK_STATE_FAILED, LINK_STATE_LINGER));
606 link->link_messages --;
608 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
611 r = sd_rtnl_message_get_errno(m);
612 if (r < 0 && r != -EEXIST)
613 log_link_warning_errno(link, -r, "%-*s: could not set address: %m", IFNAMSIZ, link->ifname);
615 link_rtnl_process_address(rtnl, m, link->manager);
617 if (link->link_messages == 0) {
618 log_link_debug(link, "addresses set");
619 link_enter_set_routes(link);
625 static int link_enter_set_addresses(Link *link) {
630 assert(link->network);
631 assert(link->state != _LINK_STATE_INVALID);
633 link_set_state(link, LINK_STATE_SETTING_ADDRESSES);
635 LIST_FOREACH(addresses, ad, link->network->static_addresses) {
636 r = address_configure(ad, link, &address_handler);
638 log_link_warning_errno(link, r, "Could not set addresses: %m");
639 link_enter_failed(link);
643 link->link_messages ++;
646 /* now that we can figure out a default address for the dhcp server,
648 if (link_dhcp4_server_enabled(link)) {
649 struct in_addr pool_start;
652 address = link_find_dhcp_server_address(link);
654 log_link_warning(link,
655 "Failed to find suitable address for DHCPv4 server instance.");
656 link_enter_failed(link);
660 r = sd_dhcp_server_set_address(link->dhcp_server,
661 &address->in_addr.in,
666 /* offer 32 addresses starting from the address following the server address */
667 pool_start.s_addr = htobe32(be32toh(address->in_addr.in.s_addr) + 1);
668 r = sd_dhcp_server_set_lease_pool(link->dhcp_server,
674 r = sd_dhcp_server_set_router(link->dhcp_server,
675 &main_address->in_addr.in);
679 r = sd_dhcp_server_set_prefixlen(link->dhcp_server,
680 main_address->prefixlen);
685 r = sd_dhcp_server_start(link->dhcp_server);
687 log_link_warning(link, "could not start DHCPv4 server "
688 "instance: %s", strerror(-r));
690 link_enter_failed(link);
695 log_link_debug(link, "offering DHCPv4 leases");
698 if (link->link_messages == 0) {
699 link_enter_set_routes(link);
701 log_link_debug(link, "setting addresses");
706 int link_address_drop_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
707 _cleanup_link_unref_ Link *link = userdata;
712 assert(link->ifname);
714 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
717 r = sd_rtnl_message_get_errno(m);
718 if (r < 0 && r != -EADDRNOTAVAIL)
719 log_link_warning_errno(link, -r, "%-*s: could not drop address: %m", IFNAMSIZ, link->ifname);
724 static int link_set_bridge_fdb(const Link *const link) {
728 LIST_FOREACH(static_fdb_entries, fdb_entry, link->network->static_fdb_entries) {
729 r = fdb_entry_configure(link->manager->rtnl, fdb_entry, link->ifindex);
731 log_link_error(link, "Failed to add MAC entry to static MAC table: %s", strerror(-r));
739 static int link_set_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
740 _cleanup_link_unref_ Link *link = userdata;
743 log_link_debug(link, "set link");
745 r = sd_rtnl_message_get_errno(m);
746 if (r < 0 && r != -EEXIST) {
747 log_link_struct(link, LOG_ERR,
748 "MESSAGE=%-*s: could not join netdev: %s",
750 link->ifname, strerror(-r),
753 link_enter_failed(link);
760 static int set_hostname_handler(sd_bus *bus, sd_bus_message *m, void *userdata,
761 sd_bus_error *ret_error) {
762 _cleanup_link_unref_ Link *link = userdata;
767 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
770 r = sd_bus_message_get_errno(m);
772 log_link_warning(link, "Could not set hostname: %s",
778 int link_set_hostname(Link *link, const char *hostname) {
779 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
783 assert(link->manager);
786 log_link_debug(link, "Setting transient hostname: '%s'", hostname);
788 if (!link->manager->bus) {
789 /* TODO: replace by assert when we can rely on kdbus */
791 "Not connected to system bus, ignoring transient hostname.");
795 r = sd_bus_message_new_method_call(
798 "org.freedesktop.hostname1",
799 "/org/freedesktop/hostname1",
800 "org.freedesktop.hostname1",
805 r = sd_bus_message_append(m, "sb", hostname, false);
809 r = sd_bus_call_async(link->manager->bus, NULL, m, set_hostname_handler,
812 log_link_error(link, "Could not set transient hostname: %s",
822 static int set_mtu_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
823 _cleanup_link_unref_ Link *link = userdata;
828 assert(link->ifname);
830 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
833 r = sd_rtnl_message_get_errno(m);
835 log_link_warning_errno(link, -r, "%-*s: could not set MTU: %m", IFNAMSIZ, link->ifname);
840 int link_set_mtu(Link *link, uint32_t mtu) {
841 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
845 assert(link->manager);
846 assert(link->manager->rtnl);
848 log_link_debug(link, "setting MTU: %" PRIu32, mtu);
850 r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
851 RTM_SETLINK, link->ifindex);
853 log_link_error(link, "Could not allocate RTM_SETLINK message");
857 r = sd_rtnl_message_append_u32(req, IFLA_MTU, mtu);
859 log_link_error(link, "Could not append MTU: %s", strerror(-r));
863 r = sd_rtnl_call_async(link->manager->rtnl, req, set_mtu_handler, link,
867 "Could not send rtnetlink message: %s",
877 static int link_set_bridge(Link *link) {
878 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
882 assert(link->network);
884 if(link->network->cost == 0)
887 r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
888 RTM_SETLINK, link->ifindex);
890 log_link_error(link, "Could not allocate RTM_SETLINK message");
894 r = sd_rtnl_message_link_set_family(req, PF_BRIDGE);
897 "Could not set message family %s", strerror(-r));
901 r = sd_rtnl_message_open_container(req, IFLA_PROTINFO);
904 "Could not append IFLA_PROTINFO attribute: %s",
909 if(link->network->cost != 0) {
910 r = sd_rtnl_message_append_u32(req, IFLA_BRPORT_COST, link->network->cost);
913 "Could not append IFLA_BRPORT_COST attribute: %s",
919 r = sd_rtnl_message_close_container(req);
922 "Could not append IFLA_LINKINFO attribute: %s",
927 r = sd_rtnl_call_async(link->manager->rtnl, req, link_set_handler, link, 0, NULL);
930 "Could not send rtnetlink message: %s",
940 static void lldp_handler(sd_lldp *lldp, int event, void *userdata) {
941 Link *link = userdata;
945 assert(link->network);
946 assert(link->manager);
948 if (event != UPDATE_INFO)
951 r = sd_lldp_save(link->lldp, link->lldp_file);
953 log_link_warning(link, "could not save LLDP");
957 static int link_acquire_conf(Link *link) {
961 assert(link->network);
962 assert(link->manager);
963 assert(link->manager->event);
965 if (link_ipv4ll_enabled(link)) {
966 assert(link->ipv4ll);
968 log_link_debug(link, "acquiring IPv4 link-local address");
970 r = sd_ipv4ll_start(link->ipv4ll);
972 log_link_warning(link, "could not acquire IPv4 "
973 "link-local address");
978 if (link_dhcp4_enabled(link)) {
979 assert(link->dhcp_client);
981 log_link_debug(link, "acquiring DHCPv4 lease");
983 r = sd_dhcp_client_start(link->dhcp_client);
985 log_link_warning(link, "could not acquire DHCPv4 "
991 if (link_dhcp6_enabled(link)) {
992 assert(link->icmp6_router_discovery);
994 log_link_debug(link, "discovering IPv6 routers");
996 r = sd_icmp6_router_solicitation_start(link->icmp6_router_discovery);
998 log_link_warning(link,
999 "could not start IPv6 router discovery");
1004 if (link_lldp_enabled(link)) {
1007 log_link_debug(link, "Starting LLDP");
1009 r = sd_lldp_start(link->lldp);
1011 log_link_warning(link, "could not start LLDP ");
1019 bool link_has_carrier(Link *link) {
1020 /* see Documentation/networking/operstates.txt in the kernel sources */
1022 if (link->kernel_operstate == IF_OPER_UP)
1025 if (link->kernel_operstate == IF_OPER_UNKNOWN)
1026 /* operstate may not be implemented, so fall back to flags */
1027 if ((link->flags & IFF_LOWER_UP) && !(link->flags & IFF_DORMANT))
1033 static int link_up_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
1034 _cleanup_link_unref_ Link *link = userdata;
1039 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1042 r = sd_rtnl_message_get_errno(m);
1044 /* we warn but don't fail the link, as it may
1045 be brought up later */
1046 log_link_warning_errno(link, -r, "%-*s: could not bring up interface: %m", IFNAMSIZ, link->ifname);
1052 static int link_up(Link *link) {
1053 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
1057 assert(link->network);
1058 assert(link->manager);
1059 assert(link->manager->rtnl);
1061 log_link_debug(link, "bringing link up");
1063 r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
1064 RTM_SETLINK, link->ifindex);
1066 log_link_error(link, "Could not allocate RTM_SETLINK message");
1070 r = sd_rtnl_message_link_set_flags(req, IFF_UP, IFF_UP);
1072 log_link_error(link, "Could not set link flags: %s",
1077 if (link->network->mac) {
1078 r = sd_rtnl_message_append_ether_addr(req, IFLA_ADDRESS, link->network->mac);
1080 log_link_error(link, "Could not set MAC address: %s", strerror(-r));
1085 if (link->network->mtu) {
1086 r = sd_rtnl_message_append_u32(req, IFLA_MTU, link->network->mtu);
1088 log_link_error(link, "Could not set MTU: %s", strerror(-r));
1093 r = sd_rtnl_call_async(link->manager->rtnl, req, link_up_handler, link,
1096 log_link_error(link,
1097 "Could not send rtnetlink message: %s",
1107 static int link_joined(Link *link) {
1111 assert(link->network);
1113 if (!(link->flags & IFF_UP)) {
1116 link_enter_failed(link);
1121 if(link->network->bridge) {
1122 r = link_set_bridge(link);
1124 log_link_error(link,
1125 "Could not set bridge message: %s",
1130 return link_enter_set_addresses(link);
1133 static int netdev_join_handler(sd_rtnl *rtnl, sd_rtnl_message *m,
1135 _cleanup_link_unref_ Link *link = userdata;
1139 assert(link->network);
1143 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1146 r = sd_rtnl_message_get_errno(m);
1147 if (r < 0 && r != -EEXIST) {
1148 log_link_error_errno(link, -r, "%-*s: could not join netdev: %m", IFNAMSIZ, link->ifname);
1149 link_enter_failed(link);
1152 log_link_debug(link, "joined netdev");
1154 if (link->enslaving <= 0)
1160 static int link_enter_join_netdev(Link *link) {
1166 assert(link->network);
1167 assert(link->state == LINK_STATE_PENDING);
1169 link_set_state(link, LINK_STATE_ENSLAVING);
1173 if (!link->network->bridge &&
1174 !link->network->bond &&
1175 hashmap_isempty(link->network->stacked_netdevs))
1176 return link_joined(link);
1178 if (link->network->bond) {
1179 log_link_struct(link, LOG_DEBUG,
1180 "MESSAGE=%-*s: enslaving by '%s'",
1182 link->ifname, link->network->bond->ifname,
1183 NETDEVIF(link->network->bond),
1186 r = netdev_join(link->network->bond, link, &netdev_join_handler);
1188 log_link_struct(link, LOG_WARNING,
1189 "MESSAGE=%-*s: could not join netdev '%s': %s",
1191 link->ifname, link->network->bond->ifname,
1193 NETDEVIF(link->network->bond),
1195 link_enter_failed(link);
1202 if (link->network->bridge) {
1203 log_link_struct(link, LOG_DEBUG,
1204 "MESSAGE=%-*s: enslaving by '%s'",
1206 link->ifname, link->network->bridge->ifname,
1207 NETDEVIF(link->network->bridge),
1210 r = netdev_join(link->network->bridge, link,
1211 &netdev_join_handler);
1213 log_link_struct(link, LOG_WARNING,
1214 "MESSAGE=%-*s: could not join netdev '%s': %s",
1216 link->ifname, link->network->bridge->ifname,
1218 NETDEVIF(link->network->bridge),
1220 link_enter_failed(link);
1227 HASHMAP_FOREACH(netdev, link->network->stacked_netdevs, i) {
1228 log_link_struct(link, LOG_DEBUG,
1229 "MESSAGE=%-*s: enslaving by '%s'",
1231 link->ifname, netdev->ifname, NETDEVIF(netdev),
1234 r = netdev_join(netdev, link, &netdev_join_handler);
1236 log_link_struct(link, LOG_WARNING,
1237 "MESSAGE=%-*s: could not join netdev '%s': %s",
1239 link->ifname, netdev->ifname,
1241 NETDEVIF(netdev), NULL);
1242 link_enter_failed(link);
1252 static int link_set_ipv4_forward(Link *link) {
1253 const char *p = NULL;
1257 b = link_ipv4_forward_enabled(link);
1259 p = strjoina("/proc/sys/net/ipv4/conf/", link->ifname, "/forwarding");
1260 r = write_string_file_no_create(p, one_zero(b));
1262 log_link_warning_errno(link, r, "Cannot configure IPv4 forwarding for interface %s: %m", link->ifname);
1265 _cleanup_free_ char *buf = NULL;
1267 /* If IP forwarding is turned on for this interface,
1268 * then propagate this to the global setting. Given
1269 * that turning this on has side-effects on other
1270 * fields, we'll try to avoid doing this unless
1271 * necessary, hence check the previous value
1272 * first. Note that we never turn this option off
1273 * again, since all interfaces we manage do not do
1274 * forwarding anyway by default, and ownership rules
1275 * of this control are so unclear. */
1277 r = read_one_line_file("/proc/sys/net/ipv4/ip_forward", &buf);
1279 log_link_warning_errno(link, r, "Cannot read /proc/sys/net/ipv4/ip_forward: %m");
1280 else if (!streq(buf, "1")) {
1281 r = write_string_file_no_create("/proc/sys/net/ipv4/ip_forward", "1");
1283 log_link_warning_errno(link, r, "Cannot write /proc/sys/net/ipv4/ip_forward: %m");
1290 static int link_set_ipv6_forward(Link *link) {
1291 const char *p = NULL;
1294 p = strjoina("/proc/sys/net/ipv6/conf/", link->ifname, "/forwarding");
1295 r = write_string_file_no_create(p, one_zero(link_ipv6_forward_enabled(link)));
1297 log_link_warning_errno(link, r, "Cannot configure IPv6 forwarding for interface: %m");
1302 static int link_configure(Link *link) {
1306 assert(link->network);
1307 assert(link->state == LINK_STATE_PENDING);
1309 r = link_set_bridge_fdb(link);
1313 r = link_set_ipv4_forward(link);
1317 r = link_set_ipv6_forward(link);
1321 if (link_ipv4ll_enabled(link)) {
1322 r = ipv4ll_configure(link);
1327 if (link_dhcp4_enabled(link)) {
1328 r = dhcp4_configure(link);
1333 if (link_dhcp4_server_enabled(link)) {
1334 r = sd_dhcp_server_new(&link->dhcp_server, link->ifindex);
1338 r = sd_dhcp_server_attach_event(link->dhcp_server, NULL, 0);
1343 if (link_dhcp6_enabled(link)) {
1344 r = icmp6_configure(link);
1349 if (link_lldp_enabled(link)) {
1350 r = sd_lldp_new(link->ifindex, link->ifname, &link->mac, &link->lldp);
1354 r = sd_lldp_attach_event(link->lldp, NULL, 0);
1358 r = sd_lldp_set_callback(link->lldp,
1359 lldp_handler, link);
1364 if (link_has_carrier(link)) {
1365 r = link_acquire_conf(link);
1370 return link_enter_join_netdev(link);
1373 static int link_initialized_and_synced(sd_rtnl *rtnl, sd_rtnl_message *m,
1375 _cleanup_link_unref_ Link *link = userdata;
1380 assert(link->ifname);
1381 assert(link->manager);
1383 if (link->state != LINK_STATE_PENDING)
1386 log_link_debug(link, "link state is up-to-date");
1388 r = network_get(link->manager, link->udev_device, link->ifname,
1389 &link->mac, &network);
1391 link_enter_unmanaged(link);
1396 if (link->flags & IFF_LOOPBACK) {
1397 if (network->ipv4ll)
1398 log_link_debug(link, "ignoring IPv4LL for loopback link");
1400 if (network->dhcp != ADDRESS_FAMILY_NO)
1401 log_link_debug(link, "ignoring DHCP clients for loopback link");
1403 if (network->dhcp_server)
1404 log_link_debug(link, "ignoring DHCP server for loopback link");
1407 r = network_apply(link->manager, network, link);
1411 r = link_configure(link);
1418 int link_initialized(Link *link, struct udev_device *device) {
1419 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
1423 assert(link->manager);
1424 assert(link->manager->rtnl);
1427 if (link->state != LINK_STATE_PENDING)
1430 if (link->udev_device)
1433 log_link_debug(link, "udev initialized link");
1435 link->udev_device = udev_device_ref(device);
1437 /* udev has initialized the link, but we don't know if we have yet
1438 * processed the NEWLINK messages with the latest state. Do a GETLINK,
1439 * when it returns we know that the pending NEWLINKs have already been
1440 * processed and that we are up-to-date */
1442 r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_GETLINK,
1447 r = sd_rtnl_call_async(link->manager->rtnl, req,
1448 link_initialized_and_synced, link, 0, NULL);
1457 static Address* link_get_equal_address(Link *link, Address *needle) {
1463 LIST_FOREACH(addresses, i, link->addresses)
1464 if (address_equal(i, needle))
1470 int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata) {
1471 Manager *m = userdata;
1474 _cleanup_address_free_ Address *address = NULL;
1476 char buf[INET6_ADDRSTRLEN], valid_buf[FORMAT_TIMESPAN_MAX];
1477 const char *valid_str = NULL;
1484 if (sd_rtnl_message_is_error(message)) {
1485 r = sd_rtnl_message_get_errno(message);
1487 log_warning_errno(r, "rtnl: failed to receive address: %m");
1492 r = sd_rtnl_message_get_type(message, &type);
1494 log_warning("rtnl: could not get message type");
1498 r = sd_rtnl_message_addr_get_ifindex(message, &ifindex);
1500 log_warning_errno(r, "rtnl: could not get ifindex: %m");
1502 } else if (ifindex <= 0) {
1503 log_warning("rtnl: received address message with invalid ifindex: %d", ifindex);
1506 r = link_get(m, ifindex, &link);
1507 if (r < 0 || !link) {
1508 /* when enumerating we might be out of sync, but we will
1509 * get the address again, so just ignore it */
1510 if (!m->enumerating)
1511 log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex);
1516 r = address_new_dynamic(&address);
1520 r = sd_rtnl_message_addr_get_family(message, &address->family);
1521 if (r < 0 || !IN_SET(address->family, AF_INET, AF_INET6)) {
1522 log_link_warning(link, "rtnl: received address with invalid family, ignoring");
1526 r = sd_rtnl_message_addr_get_prefixlen(message, &address->prefixlen);
1528 log_link_warning(link, "rtnl: received address with invalid prefixlen, ignoring");
1532 r = sd_rtnl_message_addr_get_scope(message, &address->scope);
1534 log_link_warning(link, "rtnl: received address with invalid scope, ignoring");
1538 r = sd_rtnl_message_addr_get_flags(message, &address->flags);
1540 log_link_warning(link, "rtnl: received address with invalid flags, ignoring");
1544 switch (address->family) {
1546 r = sd_rtnl_message_read_in_addr(message, IFA_LOCAL, &address->in_addr.in);
1548 log_link_warning(link, "rtnl: received address without valid address, ignoring");
1555 r = sd_rtnl_message_read_in6_addr(message, IFA_ADDRESS, &address->in_addr.in6);
1557 log_link_warning(link, "rtnl: received address without valid address, ignoring");
1564 assert_not_reached("invalid address family");
1567 if (!inet_ntop(address->family, &address->in_addr, buf, INET6_ADDRSTRLEN)) {
1568 log_link_warning(link, "could not print address");
1572 r = sd_rtnl_message_read_cache_info(message, IFA_CACHEINFO, &address->cinfo);
1574 if (address->cinfo.ifa_valid == CACHE_INFO_INFINITY_LIFE_TIME)
1577 valid_str = format_timespan(valid_buf, FORMAT_TIMESPAN_MAX,
1578 address->cinfo.ifa_valid * USEC_PER_SEC,
1582 existing = link_get_equal_address(link, address);
1587 log_link_debug(link, "Updating address: %s/%u (valid for %s)", buf, address->prefixlen, valid_str);
1590 existing->scope = address->scope;
1591 existing->flags = address->flags;
1592 existing->cinfo = address->cinfo;
1595 log_link_debug(link, "Adding address: %s/%u (valid for %s)", buf, address->prefixlen, valid_str);
1597 LIST_PREPEND(addresses, link->addresses, address);
1598 address_establish(address, link);
1610 log_link_debug(link, "Removing address: %s/%u (valid for %s)", buf, address->prefixlen, valid_str);
1611 address_release(existing, link);
1612 LIST_REMOVE(addresses, link->addresses, existing);
1613 address_free(existing);
1615 log_link_warning(link, "Removing non-existent address: %s/%u (valid for %s)", buf, address->prefixlen, valid_str);
1619 assert_not_reached("Received invalid RTNL message type");
1625 int link_add(Manager *m, sd_rtnl_message *message, Link **ret) {
1627 _cleanup_udev_device_unref_ struct udev_device *device = NULL;
1628 char ifindex_str[2 + DECIMAL_STR_MAX(int)];
1636 r = link_new(m, message, ret);
1642 log_link_debug(link, "link %d added", link->ifindex);
1644 if (detect_container(NULL) <= 0) {
1645 /* not in a container, udev will be around */
1646 sprintf(ifindex_str, "n%d", link->ifindex);
1647 device = udev_device_new_from_device_id(m->udev, ifindex_str);
1649 log_link_warning(link,
1650 "could not find udev device: %m");
1654 if (udev_device_get_is_initialized(device) <= 0) {
1656 log_link_debug(link, "link pending udev initialization...");
1660 r = link_initialized(link, device);
1664 /* we are calling a callback directly, so must take a ref */
1667 r = link_initialized_and_synced(m->rtnl, NULL, link);
1675 static int link_carrier_gained(Link *link) {
1680 if (link->network) {
1681 r = link_acquire_conf(link);
1683 link_enter_failed(link);
1691 static int link_carrier_lost(Link *link) {
1696 r = link_stop_clients(link);
1698 link_enter_failed(link);
1705 int link_carrier_reset(Link *link) {
1710 if (link_has_carrier(link)) {
1711 r = link_carrier_lost(link);
1715 r = link_carrier_gained(link);
1719 log_link_info(link, "reset carrier");
1726 int link_update(Link *link, sd_rtnl_message *m) {
1727 struct ether_addr mac;
1730 bool had_carrier, carrier_gained, carrier_lost;
1734 assert(link->ifname);
1737 if (link->state == LINK_STATE_LINGER) {
1739 log_link_info(link, "link readded");
1740 link_set_state(link, LINK_STATE_ENSLAVING);
1743 r = sd_rtnl_message_read_string(m, IFLA_IFNAME, &ifname);
1744 if (r >= 0 && !streq(ifname, link->ifname)) {
1745 log_link_info(link, "renamed to %s", ifname);
1748 link->ifname = strdup(ifname);
1753 r = sd_rtnl_message_read_u32(m, IFLA_MTU, &mtu);
1754 if (r >= 0 && mtu > 0) {
1756 if (!link->original_mtu) {
1757 link->original_mtu = mtu;
1758 log_link_debug(link, "saved original MTU: %"
1759 PRIu32, link->original_mtu);
1762 if (link->dhcp_client) {
1763 r = sd_dhcp_client_set_mtu(link->dhcp_client,
1766 log_link_warning(link,
1767 "Could not update MTU in DHCP client: %s",
1774 /* The kernel may broadcast NEWLINK messages without the MAC address
1775 set, simply ignore them. */
1776 r = sd_rtnl_message_read_ether_addr(m, IFLA_ADDRESS, &mac);
1778 if (memcmp(link->mac.ether_addr_octet, mac.ether_addr_octet,
1781 memcpy(link->mac.ether_addr_octet, mac.ether_addr_octet,
1784 log_link_debug(link, "MAC address: "
1785 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
1786 mac.ether_addr_octet[0],
1787 mac.ether_addr_octet[1],
1788 mac.ether_addr_octet[2],
1789 mac.ether_addr_octet[3],
1790 mac.ether_addr_octet[4],
1791 mac.ether_addr_octet[5]);
1794 r = sd_ipv4ll_set_mac(link->ipv4ll, &link->mac);
1796 log_link_warning(link,
1797 "Could not update MAC address in IPv4LL client: %s",
1803 if (link->dhcp_client) {
1804 r = sd_dhcp_client_set_mac(link->dhcp_client,
1805 (const uint8_t *) &link->mac,
1809 log_link_warning(link,
1810 "Could not update MAC address in DHCP client: %s",
1816 if (link->dhcp6_client) {
1817 r = sd_dhcp6_client_set_mac(link->dhcp6_client,
1818 (const uint8_t *) &link->mac,
1822 log_link_warning(link,
1823 "Could not update MAC address in DHCPv6 client: %s",
1831 had_carrier = link_has_carrier(link);
1833 r = link_update_flags(link, m);
1837 carrier_gained = !had_carrier && link_has_carrier(link);
1838 carrier_lost = had_carrier && !link_has_carrier(link);
1840 if (carrier_gained) {
1841 log_link_info(link, "gained carrier");
1843 r = link_carrier_gained(link);
1846 } else if (carrier_lost) {
1847 log_link_info(link, "lost carrier");
1849 r = link_carrier_lost(link);
1858 static void link_update_operstate(Link *link) {
1859 LinkOperationalState operstate;
1862 if (link->kernel_operstate == IF_OPER_DORMANT)
1863 operstate = LINK_OPERSTATE_DORMANT;
1864 else if (link_has_carrier(link)) {
1866 uint8_t scope = RT_SCOPE_NOWHERE;
1868 /* if we have carrier, check what addresses we have */
1869 LIST_FOREACH(addresses, address, link->addresses) {
1870 if (address->flags & (IFA_F_TENTATIVE | IFA_F_DEPRECATED))
1873 if (address->scope < scope)
1874 scope = address->scope;
1877 if (scope < RT_SCOPE_SITE)
1878 /* universally accessible addresses found */
1879 operstate = LINK_OPERSTATE_ROUTABLE;
1880 else if (scope < RT_SCOPE_HOST)
1881 /* only link or site local addresses found */
1882 operstate = LINK_OPERSTATE_DEGRADED;
1884 /* no useful addresses found */
1885 operstate = LINK_OPERSTATE_CARRIER;
1886 } else if (link->flags & IFF_UP)
1887 operstate = LINK_OPERSTATE_NO_CARRIER;
1889 operstate = LINK_OPERSTATE_OFF;
1891 if (link->operstate != operstate) {
1892 link->operstate = operstate;
1893 link_send_changed(link, "OperationalState", NULL);
1897 int link_save(Link *link) {
1898 _cleanup_free_ char *temp_path = NULL;
1899 _cleanup_fclose_ FILE *f = NULL;
1900 const char *admin_state, *oper_state;
1904 assert(link->state_file);
1905 assert(link->lease_file);
1906 assert(link->manager);
1908 link_update_operstate(link);
1910 r = manager_save(link->manager);
1914 if (link->state == LINK_STATE_LINGER) {
1915 unlink(link->state_file);
1919 admin_state = link_state_to_string(link->state);
1920 assert(admin_state);
1922 oper_state = link_operstate_to_string(link->operstate);
1925 r = fopen_temporary(link->state_file, &f, &temp_path);
1929 fchmod(fileno(f), 0644);
1932 "# This is private data. Do not parse.\n"
1935 admin_state, oper_state);
1937 if (link->network) {
1938 char **address, **domain;
1941 fprintf(f, "NETWORK_FILE=%s\n", link->network->filename);
1945 STRV_FOREACH(address, link->network->dns) {
1952 if (link->network->dhcp_dns &&
1954 const struct in_addr *addresses;
1956 r = sd_dhcp_lease_get_dns(link->dhcp_lease, &addresses);
1960 serialize_in_addrs(f, addresses, r);
1968 STRV_FOREACH(address, link->network->ntp) {
1975 if (link->network->dhcp_ntp &&
1977 const struct in_addr *addresses;
1979 r = sd_dhcp_lease_get_ntp(link->dhcp_lease, &addresses);
1983 serialize_in_addrs(f, addresses, r);
1989 fprintf(f, "DOMAINS=");
1991 STRV_FOREACH(domain, link->network->domains) {
1998 if (link->network->dhcp_domains &&
2000 const char *domainname;
2002 r = sd_dhcp_lease_get_domainname(link->dhcp_lease, &domainname);
2006 fputs(domainname, f);
2012 fprintf(f, "WILDCARD_DOMAIN=%s\n",
2013 yes_no(link->network->wildcard_domain));
2015 fprintf(f, "LLMNR=%s\n",
2016 llmnr_support_to_string(link->network->llmnr));
2019 if (link->dhcp_lease) {
2020 assert(link->network);
2022 r = sd_dhcp_lease_save(link->dhcp_lease, link->lease_file);
2030 unlink(link->lease_file);
2033 assert(link->network);
2035 r = sd_lldp_save(link->lldp, link->lldp_file);
2043 unlink(link->lldp_file);
2045 r = fflush_and_check(f);
2049 if (rename(temp_path, link->state_file) < 0) {
2056 log_link_error(link, "Failed to save link data to %s: %s", link->state_file, strerror(-r));
2057 unlink(link->state_file);
2062 static const char* const link_state_table[_LINK_STATE_MAX] = {
2063 [LINK_STATE_PENDING] = "pending",
2064 [LINK_STATE_ENSLAVING] = "configuring",
2065 [LINK_STATE_SETTING_ADDRESSES] = "configuring",
2066 [LINK_STATE_SETTING_ROUTES] = "configuring",
2067 [LINK_STATE_CONFIGURED] = "configured",
2068 [LINK_STATE_UNMANAGED] = "unmanaged",
2069 [LINK_STATE_FAILED] = "failed",
2070 [LINK_STATE_LINGER] = "linger",
2073 DEFINE_STRING_TABLE_LOOKUP(link_state, LinkState);
2075 static const char* const link_operstate_table[_LINK_OPERSTATE_MAX] = {
2076 [LINK_OPERSTATE_OFF] = "off",
2077 [LINK_OPERSTATE_NO_CARRIER] = "no-carrier",
2078 [LINK_OPERSTATE_DORMANT] = "dormant",
2079 [LINK_OPERSTATE_CARRIER] = "carrier",
2080 [LINK_OPERSTATE_DEGRADED] = "degraded",
2081 [LINK_OPERSTATE_ROUTABLE] = "routable",
2084 DEFINE_STRING_TABLE_LOOKUP(link_operstate, LinkOperationalState);