]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/network/networkd-link.c
network: make RADVPrefixDelegation enum bitfield
[thirdparty/systemd.git] / src / network / networkd-link.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2
3 #include <netinet/in.h>
4 #include <linux/if.h>
5 #include <linux/if_arp.h>
6 #include <linux/if_link.h>
7 #include <unistd.h>
8
9 #include "alloc-util.h"
10 #include "bond.h"
11 #include "bridge.h"
12 #include "bus-util.h"
13 #include "dhcp-identifier.h"
14 #include "dhcp-lease-internal.h"
15 #include "env-file.h"
16 #include "ethtool-util.h"
17 #include "fd-util.h"
18 #include "fileio.h"
19 #include "ipvlan.h"
20 #include "missing_network.h"
21 #include "netlink-util.h"
22 #include "network-internal.h"
23 #include "networkd-can.h"
24 #include "networkd-dhcp-server.h"
25 #include "networkd-dhcp4.h"
26 #include "networkd-dhcp6.h"
27 #include "networkd-ipv4ll.h"
28 #include "networkd-ipv6-proxy-ndp.h"
29 #include "networkd-link-bus.h"
30 #include "networkd-link.h"
31 #include "networkd-lldp-tx.h"
32 #include "networkd-manager.h"
33 #include "networkd-ndisc.h"
34 #include "networkd-neighbor.h"
35 #include "networkd-sriov.h"
36 #include "networkd-radv.h"
37 #include "networkd-routing-policy-rule.h"
38 #include "networkd-wifi.h"
39 #include "set.h"
40 #include "socket-util.h"
41 #include "stat-util.h"
42 #include "stdio-util.h"
43 #include "string-table.h"
44 #include "strv.h"
45 #include "sysctl-util.h"
46 #include "tc.h"
47 #include "tmpfile-util.h"
48 #include "udev-util.h"
49 #include "util.h"
50 #include "vrf.h"
51
52 uint32_t link_get_vrf_table(Link *link) {
53 return link->network->vrf ? VRF(link->network->vrf)->table : RT_TABLE_MAIN;
54 }
55
56 uint32_t link_get_dhcp_route_table(Link *link) {
57 /* When the interface is part of an VRF use the VRFs routing table, unless
58 * another table is explicitly specified. */
59 if (link->network->dhcp_route_table_set)
60 return link->network->dhcp_route_table;
61 return link_get_vrf_table(link);
62 }
63
64 uint32_t link_get_ipv6_accept_ra_route_table(Link *link) {
65 if (link->network->ipv6_accept_ra_route_table_set)
66 return link->network->ipv6_accept_ra_route_table;
67 return link_get_vrf_table(link);
68 }
69
70 DUID* link_get_duid(Link *link) {
71 if (link->network->duid.type != _DUID_TYPE_INVALID)
72 return &link->network->duid;
73 else
74 return &link->manager->duid;
75 }
76
77 static bool link_dhcp6_enabled(Link *link) {
78 assert(link);
79
80 if (!socket_ipv6_is_supported())
81 return false;
82
83 if (link->flags & IFF_LOOPBACK)
84 return false;
85
86 if (!link->network)
87 return false;
88
89 if (link->network->bond)
90 return false;
91
92 if (link->iftype == ARPHRD_CAN)
93 return false;
94
95 return link->network->dhcp & ADDRESS_FAMILY_IPV6;
96 }
97
98 static bool link_dhcp4_enabled(Link *link) {
99 assert(link);
100
101 if (link->flags & IFF_LOOPBACK)
102 return false;
103
104 if (!link->network)
105 return false;
106
107 if (link->network->bond)
108 return false;
109
110 if (link->iftype == ARPHRD_CAN)
111 return false;
112
113 return link->network->dhcp & ADDRESS_FAMILY_IPV4;
114 }
115
116 static bool link_dhcp4_server_enabled(Link *link) {
117 assert(link);
118
119 if (link->flags & IFF_LOOPBACK)
120 return false;
121
122 if (!link->network)
123 return false;
124
125 if (link->network->bond)
126 return false;
127
128 if (link->iftype == ARPHRD_CAN)
129 return false;
130
131 return link->network->dhcp_server;
132 }
133
134 bool link_ipv4ll_enabled(Link *link, AddressFamily mask) {
135 assert(link);
136 assert((mask & ~(ADDRESS_FAMILY_IPV4 | ADDRESS_FAMILY_FALLBACK_IPV4)) == 0);
137
138 if (link->flags & IFF_LOOPBACK)
139 return false;
140
141 if (!link->network)
142 return false;
143
144 if (link->iftype == ARPHRD_CAN)
145 return false;
146
147 if (STRPTR_IN_SET(link->kind,
148 "vrf", "wireguard", "ipip", "gre", "ip6gre","ip6tnl", "sit", "vti",
149 "vti6", "nlmon", "xfrm"))
150 return false;
151
152 /* L3 or L3S mode do not support ARP. */
153 if (IN_SET(link_get_ipvlan_mode(link), NETDEV_IPVLAN_MODE_L3, NETDEV_IPVLAN_MODE_L3S))
154 return false;
155
156 if (link->network->bond)
157 return false;
158
159 return link->network->link_local & mask;
160 }
161
162 static bool link_ipv6ll_enabled(Link *link) {
163 assert(link);
164
165 if (!socket_ipv6_is_supported())
166 return false;
167
168 if (link->flags & IFF_LOOPBACK)
169 return false;
170
171 if (!link->network)
172 return false;
173
174 if (link->iftype == ARPHRD_CAN)
175 return false;
176
177 if (STRPTR_IN_SET(link->kind, "vrf", "wireguard", "ipip", "gre", "sit", "vti", "nlmon"))
178 return false;
179
180 if (link->network->bond)
181 return false;
182
183 return link->network->link_local & ADDRESS_FAMILY_IPV6;
184 }
185
186 static bool link_ipv6_enabled(Link *link) {
187 assert(link);
188
189 if (!socket_ipv6_is_supported())
190 return false;
191
192 if (link->network->bond)
193 return false;
194
195 if (link->iftype == ARPHRD_CAN)
196 return false;
197
198 /* DHCPv6 client will not be started if no IPv6 link-local address is configured. */
199 if (link_ipv6ll_enabled(link))
200 return true;
201
202 if (network_has_static_ipv6_configurations(link->network))
203 return true;
204
205 return false;
206 }
207
208 static bool link_radv_enabled(Link *link) {
209 assert(link);
210
211 if (!link_ipv6ll_enabled(link))
212 return false;
213
214 return link->network->router_prefix_delegation != RADV_PREFIX_DELEGATION_NONE;
215 }
216
217 static bool link_ipv4_forward_enabled(Link *link) {
218 assert(link);
219
220 if (link->flags & IFF_LOOPBACK)
221 return false;
222
223 if (!link->network)
224 return false;
225
226 if (link->network->ip_forward == _ADDRESS_FAMILY_INVALID)
227 return false;
228
229 return link->network->ip_forward & ADDRESS_FAMILY_IPV4;
230 }
231
232 static bool link_ipv6_forward_enabled(Link *link) {
233 assert(link);
234
235 if (!socket_ipv6_is_supported())
236 return false;
237
238 if (link->flags & IFF_LOOPBACK)
239 return false;
240
241 if (!link->network)
242 return false;
243
244 if (link->network->ip_forward == _ADDRESS_FAMILY_INVALID)
245 return false;
246
247 return link->network->ip_forward & ADDRESS_FAMILY_IPV6;
248 }
249
250 static bool link_proxy_arp_enabled(Link *link) {
251 assert(link);
252
253 if (link->flags & IFF_LOOPBACK)
254 return false;
255
256 if (!link->network)
257 return false;
258
259 if (link->network->proxy_arp < 0)
260 return false;
261
262 return true;
263 }
264
265 static bool link_ipv6_accept_ra_enabled(Link *link) {
266 assert(link);
267
268 if (!socket_ipv6_is_supported())
269 return false;
270
271 if (link->flags & IFF_LOOPBACK)
272 return false;
273
274 if (!link->network)
275 return false;
276
277 if (!link_ipv6ll_enabled(link))
278 return false;
279
280 /* If unset use system default (enabled if local forwarding is disabled.
281 * disabled if local forwarding is enabled).
282 * If set, ignore or enforce RA independent of local forwarding state.
283 */
284 if (link->network->ipv6_accept_ra < 0)
285 /* default to accept RA if ip_forward is disabled and ignore RA if ip_forward is enabled */
286 return !link_ipv6_forward_enabled(link);
287 else if (link->network->ipv6_accept_ra > 0)
288 /* accept RA even if ip_forward is enabled */
289 return true;
290 else
291 /* ignore RA */
292 return false;
293 }
294
295 static IPv6PrivacyExtensions link_ipv6_privacy_extensions(Link *link) {
296 assert(link);
297
298 if (!socket_ipv6_is_supported())
299 return _IPV6_PRIVACY_EXTENSIONS_INVALID;
300
301 if (link->flags & IFF_LOOPBACK)
302 return _IPV6_PRIVACY_EXTENSIONS_INVALID;
303
304 if (!link->network)
305 return _IPV6_PRIVACY_EXTENSIONS_INVALID;
306
307 return link->network->ipv6_privacy_extensions;
308 }
309
310 static int link_update_ipv6_sysctl(Link *link) {
311 bool enabled;
312 int r;
313
314 if (link->flags & IFF_LOOPBACK)
315 return 0;
316
317 enabled = link_ipv6_enabled(link);
318 if (enabled) {
319 r = sysctl_write_ip_property_boolean(AF_INET6, link->ifname, "disable_ipv6", false);
320 if (r < 0)
321 return log_link_warning_errno(link, r, "Cannot enable IPv6: %m");
322
323 log_link_info(link, "IPv6 successfully enabled");
324 }
325
326 return 0;
327 }
328
329 static bool link_is_enslaved(Link *link) {
330 if (link->flags & IFF_SLAVE)
331 /* Even if the link is not managed by networkd, honor IFF_SLAVE flag. */
332 return true;
333
334 if (!link->network)
335 return false;
336
337 if (link->master_ifindex > 0 && link->network->bridge)
338 return true;
339
340 /* TODO: add conditions for other netdevs. */
341
342 return false;
343 }
344
345 static void link_update_master_operstate(Link *link, NetDev *netdev) {
346 Link *master;
347
348 if (!netdev)
349 return;
350
351 if (netdev->ifindex <= 0)
352 return;
353
354 if (link_get(link->manager, netdev->ifindex, &master) < 0)
355 return;
356
357 link_update_operstate(master, true);
358 }
359
360 void link_update_operstate(Link *link, bool also_update_master) {
361 LinkOperationalState operstate;
362 LinkCarrierState carrier_state;
363 LinkAddressState address_state;
364 _cleanup_strv_free_ char **p = NULL;
365 uint8_t scope = RT_SCOPE_NOWHERE;
366 bool changed = false;
367 Address *address;
368 Iterator i;
369
370 assert(link);
371
372 if (link->kernel_operstate == IF_OPER_DORMANT)
373 carrier_state = LINK_CARRIER_STATE_DORMANT;
374 else if (link_has_carrier(link)) {
375 if (link_is_enslaved(link))
376 carrier_state = LINK_CARRIER_STATE_ENSLAVED;
377 else
378 carrier_state = LINK_CARRIER_STATE_CARRIER;
379 } else if (link->flags & IFF_UP)
380 carrier_state = LINK_CARRIER_STATE_NO_CARRIER;
381 else
382 carrier_state = LINK_CARRIER_STATE_OFF;
383
384 if (carrier_state >= LINK_CARRIER_STATE_CARRIER) {
385 Link *slave;
386
387 SET_FOREACH(slave, link->slaves, i) {
388 link_update_operstate(slave, false);
389
390 if (slave->carrier_state < LINK_CARRIER_STATE_CARRIER)
391 carrier_state = LINK_CARRIER_STATE_DEGRADED_CARRIER;
392 }
393 }
394
395 SET_FOREACH(address, link->addresses, i) {
396 if (!address_is_ready(address))
397 continue;
398
399 if (address->scope < scope)
400 scope = address->scope;
401 }
402
403 /* for operstate we also take foreign addresses into account */
404 SET_FOREACH(address, link->addresses_foreign, i) {
405 if (!address_is_ready(address))
406 continue;
407
408 if (address->scope < scope)
409 scope = address->scope;
410 }
411
412 if (scope < RT_SCOPE_SITE)
413 /* universally accessible addresses found */
414 address_state = LINK_ADDRESS_STATE_ROUTABLE;
415 else if (scope < RT_SCOPE_HOST)
416 /* only link or site local addresses found */
417 address_state = LINK_ADDRESS_STATE_DEGRADED;
418 else
419 /* no useful addresses found */
420 address_state = LINK_ADDRESS_STATE_OFF;
421
422 /* Mapping of address and carrier state vs operational state
423 * carrier state
424 * | off | no-carrier | dormant | degraded-carrier | carrier | enslaved
425 * ------------------------------------------------------------------------------
426 * off | off | no-carrier | dormant | degraded-carrier | carrier | enslaved
427 * address_state degraded | off | no-carrier | dormant | degraded-carrier | degraded | enslaved
428 * routable | off | no-carrier | dormant | degraded-carrier | routable | routable
429 */
430
431 if (carrier_state < LINK_CARRIER_STATE_CARRIER || address_state == LINK_ADDRESS_STATE_OFF)
432 operstate = (LinkOperationalState) carrier_state;
433 else if (address_state == LINK_ADDRESS_STATE_ROUTABLE)
434 operstate = LINK_OPERSTATE_ROUTABLE;
435 else if (carrier_state == LINK_CARRIER_STATE_CARRIER)
436 operstate = LINK_OPERSTATE_DEGRADED;
437 else
438 operstate = LINK_OPERSTATE_ENSLAVED;
439
440 if (link->carrier_state != carrier_state) {
441 link->carrier_state = carrier_state;
442 changed = true;
443 if (strv_extend(&p, "CarrierState") < 0)
444 log_oom();
445 }
446
447 if (link->address_state != address_state) {
448 link->address_state = address_state;
449 changed = true;
450 if (strv_extend(&p, "AddressState") < 0)
451 log_oom();
452 }
453
454 if (link->operstate != operstate) {
455 link->operstate = operstate;
456 changed = true;
457 if (strv_extend(&p, "OperationalState") < 0)
458 log_oom();
459 }
460
461 if (p)
462 link_send_changed_strv(link, p);
463 if (changed)
464 link_dirty(link);
465
466 if (also_update_master && link->network) {
467 link_update_master_operstate(link, link->network->bond);
468 link_update_master_operstate(link, link->network->bridge);
469 }
470 }
471
472 #define FLAG_STRING(string, flag, old, new) \
473 (((old ^ new) & flag) \
474 ? ((old & flag) ? (" -" string) : (" +" string)) \
475 : "")
476
477 static int link_update_flags(Link *link, sd_netlink_message *m, bool force_update_operstate) {
478 unsigned flags, unknown_flags_added, unknown_flags_removed, unknown_flags;
479 uint8_t operstate;
480 int r;
481
482 assert(link);
483
484 r = sd_rtnl_message_link_get_flags(m, &flags);
485 if (r < 0)
486 return log_link_warning_errno(link, r, "Could not get link flags: %m");
487
488 r = sd_netlink_message_read_u8(m, IFLA_OPERSTATE, &operstate);
489 if (r < 0)
490 /* if we got a message without operstate, take it to mean
491 the state was unchanged */
492 operstate = link->kernel_operstate;
493
494 if (!force_update_operstate && (link->flags == flags) && (link->kernel_operstate == operstate))
495 return 0;
496
497 if (link->flags != flags) {
498 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",
499 FLAG_STRING("LOOPBACK", IFF_LOOPBACK, link->flags, flags),
500 FLAG_STRING("MASTER", IFF_MASTER, link->flags, flags),
501 FLAG_STRING("SLAVE", IFF_SLAVE, link->flags, flags),
502 FLAG_STRING("UP", IFF_UP, link->flags, flags),
503 FLAG_STRING("DORMANT", IFF_DORMANT, link->flags, flags),
504 FLAG_STRING("LOWER_UP", IFF_LOWER_UP, link->flags, flags),
505 FLAG_STRING("RUNNING", IFF_RUNNING, link->flags, flags),
506 FLAG_STRING("MULTICAST", IFF_MULTICAST, link->flags, flags),
507 FLAG_STRING("BROADCAST", IFF_BROADCAST, link->flags, flags),
508 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT, link->flags, flags),
509 FLAG_STRING("PROMISC", IFF_PROMISC, link->flags, flags),
510 FLAG_STRING("ALLMULTI", IFF_ALLMULTI, link->flags, flags),
511 FLAG_STRING("PORTSEL", IFF_PORTSEL, link->flags, flags),
512 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA, link->flags, flags),
513 FLAG_STRING("DYNAMIC", IFF_DYNAMIC, link->flags, flags),
514 FLAG_STRING("NOARP", IFF_NOARP, link->flags, flags),
515 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS, link->flags, flags),
516 FLAG_STRING("DEBUG", IFF_DEBUG, link->flags, flags),
517 FLAG_STRING("ECHO", IFF_ECHO, link->flags, flags));
518
519 unknown_flags = ~(IFF_LOOPBACK | IFF_MASTER | IFF_SLAVE | IFF_UP |
520 IFF_DORMANT | IFF_LOWER_UP | IFF_RUNNING |
521 IFF_MULTICAST | IFF_BROADCAST | IFF_POINTOPOINT |
522 IFF_PROMISC | IFF_ALLMULTI | IFF_PORTSEL |
523 IFF_AUTOMEDIA | IFF_DYNAMIC | IFF_NOARP |
524 IFF_NOTRAILERS | IFF_DEBUG | IFF_ECHO);
525 unknown_flags_added = ((link->flags ^ flags) & flags & unknown_flags);
526 unknown_flags_removed = ((link->flags ^ flags) & link->flags & unknown_flags);
527
528 /* link flags are currently at most 18 bits, let's align to
529 * printing 20 */
530 if (unknown_flags_added)
531 log_link_debug(link,
532 "Unknown link flags gained: %#.5x (ignoring)",
533 unknown_flags_added);
534
535 if (unknown_flags_removed)
536 log_link_debug(link,
537 "Unknown link flags lost: %#.5x (ignoring)",
538 unknown_flags_removed);
539 }
540
541 link->flags = flags;
542 link->kernel_operstate = operstate;
543
544 link_update_operstate(link, true);
545
546 return 0;
547 }
548
549 static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) {
550 _cleanup_(link_unrefp) Link *link = NULL;
551 const char *ifname, *kind = NULL;
552 unsigned short iftype;
553 int r, ifindex;
554 uint16_t type;
555
556 assert(manager);
557 assert(message);
558 assert(ret);
559
560 /* check for link kind */
561 r = sd_netlink_message_enter_container(message, IFLA_LINKINFO);
562 if (r == 0) {
563 (void) sd_netlink_message_read_string(message, IFLA_INFO_KIND, &kind);
564 r = sd_netlink_message_exit_container(message);
565 if (r < 0)
566 return r;
567 }
568
569 r = sd_netlink_message_get_type(message, &type);
570 if (r < 0)
571 return r;
572 else if (type != RTM_NEWLINK)
573 return -EINVAL;
574
575 r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
576 if (r < 0)
577 return r;
578 else if (ifindex <= 0)
579 return -EINVAL;
580
581 r = sd_rtnl_message_link_get_type(message, &iftype);
582 if (r < 0)
583 return r;
584
585 r = sd_netlink_message_read_string(message, IFLA_IFNAME, &ifname);
586 if (r < 0)
587 return r;
588
589 link = new(Link, 1);
590 if (!link)
591 return -ENOMEM;
592
593 *link = (Link) {
594 .n_ref = 1,
595 .manager = manager,
596 .state = LINK_STATE_PENDING,
597 .ifindex = ifindex,
598 .iftype = iftype,
599
600 .n_dns = (unsigned) -1,
601 .dns_default_route = -1,
602 .llmnr = _RESOLVE_SUPPORT_INVALID,
603 .mdns = _RESOLVE_SUPPORT_INVALID,
604 .dnssec_mode = _DNSSEC_MODE_INVALID,
605 .dns_over_tls_mode = _DNS_OVER_TLS_MODE_INVALID,
606 };
607
608 link->ifname = strdup(ifname);
609 if (!link->ifname)
610 return -ENOMEM;
611
612 if (kind) {
613 link->kind = strdup(kind);
614 if (!link->kind)
615 return -ENOMEM;
616 }
617
618 r = sd_netlink_message_read_u32(message, IFLA_MASTER, (uint32_t *)&link->master_ifindex);
619 if (r < 0)
620 log_link_debug_errno(link, r, "New device has no master, continuing without");
621
622 r = sd_netlink_message_read_ether_addr(message, IFLA_ADDRESS, &link->mac);
623 if (r < 0)
624 log_link_debug_errno(link, r, "MAC address not found for new device, continuing without");
625
626 r = ethtool_get_permanent_macaddr(&manager->ethtool_fd, link->ifname, &link->permanent_mac);
627 if (r < 0)
628 log_link_debug_errno(link, r, "Permanent MAC address not found for new device, continuing without: %m");
629
630 r = ethtool_get_driver(&manager->ethtool_fd, link->ifname, &link->driver);
631 if (r < 0)
632 log_link_debug_errno(link, r, "Failed to get driver, continuing without: %m");
633
634 r = sd_netlink_message_read_strv(message, IFLA_PROP_LIST, IFLA_ALT_IFNAME, &link->alternative_names);
635 if (r < 0 && r != -ENODATA)
636 return r;
637
638 if (asprintf(&link->state_file, "/run/systemd/netif/links/%d", link->ifindex) < 0)
639 return -ENOMEM;
640
641 if (asprintf(&link->lease_file, "/run/systemd/netif/leases/%d", link->ifindex) < 0)
642 return -ENOMEM;
643
644 if (asprintf(&link->lldp_file, "/run/systemd/netif/lldp/%d", link->ifindex) < 0)
645 return -ENOMEM;
646
647 r = hashmap_ensure_allocated(&manager->links, NULL);
648 if (r < 0)
649 return r;
650
651 r = hashmap_put(manager->links, INT_TO_PTR(link->ifindex), link);
652 if (r < 0)
653 return r;
654
655 r = link_update_flags(link, message, false);
656 if (r < 0)
657 return r;
658
659 *ret = TAKE_PTR(link);
660
661 return 0;
662 }
663
664 void link_ntp_settings_clear(Link *link) {
665 link->ntp = strv_free(link->ntp);
666 }
667
668 void link_dns_settings_clear(Link *link) {
669 if (link->n_dns != (unsigned) -1)
670 for (unsigned i = 0; i < link->n_dns; i++)
671 in_addr_full_free(link->dns[i]);
672 link->dns = mfree(link->dns);
673 link->n_dns = (unsigned) -1;
674
675 link->search_domains = ordered_set_free_free(link->search_domains);
676 link->route_domains = ordered_set_free_free(link->route_domains);
677
678 link->dns_default_route = -1;
679 link->llmnr = _RESOLVE_SUPPORT_INVALID;
680 link->mdns = _RESOLVE_SUPPORT_INVALID;
681 link->dnssec_mode = _DNSSEC_MODE_INVALID;
682 link->dns_over_tls_mode = _DNS_OVER_TLS_MODE_INVALID;
683
684 link->dnssec_negative_trust_anchors = set_free_free(link->dnssec_negative_trust_anchors);
685 }
686
687 static void link_free_engines(Link *link) {
688 if (!link)
689 return;
690
691 link->dhcp_server = sd_dhcp_server_unref(link->dhcp_server);
692 link->dhcp_client = sd_dhcp_client_unref(link->dhcp_client);
693 link->dhcp_lease = sd_dhcp_lease_unref(link->dhcp_lease);
694
695 link->lldp = sd_lldp_unref(link->lldp);
696
697 ndisc_flush(link);
698
699 link->ipv4ll = sd_ipv4ll_unref(link->ipv4ll);
700 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
701 link->dhcp6_lease = sd_dhcp6_lease_unref(link->dhcp6_lease);
702 link->ndisc = sd_ndisc_unref(link->ndisc);
703 link->radv = sd_radv_unref(link->radv);
704 }
705
706 static Link *link_free(Link *link) {
707 Address *address;
708
709 assert(link);
710
711 link_ntp_settings_clear(link);
712 link_dns_settings_clear(link);
713
714 link->routes = set_free(link->routes);
715 link->routes_foreign = set_free(link->routes_foreign);
716 link->dhcp_routes = set_free(link->dhcp_routes);
717 link->dhcp_routes_old = set_free(link->dhcp_routes_old);
718 link->dhcp6_routes = set_free(link->dhcp6_routes);
719 link->dhcp6_routes_old = set_free(link->dhcp6_routes_old);
720 link->dhcp6_pd_routes = set_free(link->dhcp6_pd_routes);
721 link->dhcp6_pd_routes_old = set_free(link->dhcp6_pd_routes_old);
722 link->ndisc_routes = set_free(link->ndisc_routes);
723 link->ndisc_routes_old = set_free(link->ndisc_routes_old);
724
725 link->nexthops = set_free(link->nexthops);
726 link->nexthops_foreign = set_free(link->nexthops_foreign);
727
728 link->neighbors = set_free(link->neighbors);
729 link->neighbors_foreign = set_free(link->neighbors_foreign);
730
731 link->addresses = set_free(link->addresses);
732 link->addresses_foreign = set_free(link->addresses_foreign);
733 link->static_addresses = set_free(link->static_addresses);
734 link->dhcp6_addresses = set_free(link->dhcp6_addresses);
735 link->dhcp6_addresses_old = set_free(link->dhcp6_addresses_old);
736 link->dhcp6_pd_addresses = set_free(link->dhcp6_pd_addresses);
737 link->dhcp6_pd_addresses_old = set_free(link->dhcp6_pd_addresses_old);
738 link->ndisc_addresses = set_free(link->ndisc_addresses);
739 link->ndisc_addresses_old = set_free(link->ndisc_addresses_old);
740
741 while ((address = link->pool_addresses)) {
742 LIST_REMOVE(addresses, link->pool_addresses, address);
743 address_free(address);
744 }
745
746 link_lldp_emit_stop(link);
747 link_free_engines(link);
748 free(link->lease_file);
749 free(link->lldp_file);
750
751 free(link->ifname);
752 strv_free(link->alternative_names);
753 free(link->kind);
754 free(link->ssid);
755 free(link->driver);
756
757 (void) unlink(link->state_file);
758 free(link->state_file);
759
760 sd_device_unref(link->sd_device);
761
762 hashmap_free(link->bound_to_links);
763 hashmap_free(link->bound_by_links);
764
765 set_free_with_destructor(link->slaves, link_unref);
766
767 network_unref(link->network);
768
769 return mfree(link);
770 }
771
772 DEFINE_TRIVIAL_REF_UNREF_FUNC(Link, link, link_free);
773
774 int link_get(Manager *m, int ifindex, Link **ret) {
775 Link *link;
776
777 assert(m);
778 assert(ifindex > 0);
779 assert(ret);
780
781 link = hashmap_get(m->links, INT_TO_PTR(ifindex));
782 if (!link)
783 return -ENODEV;
784
785 *ret = link;
786
787 return 0;
788 }
789
790 void link_set_state(Link *link, LinkState state) {
791 assert(link);
792
793 if (link->state == state)
794 return;
795
796 log_link_debug(link, "State changed: %s -> %s",
797 link_state_to_string(link->state),
798 link_state_to_string(state));
799
800 link->state = state;
801
802 link_send_changed(link, "AdministrativeState", NULL);
803 }
804
805 static void link_enter_unmanaged(Link *link) {
806 assert(link);
807
808 link_set_state(link, LINK_STATE_UNMANAGED);
809
810 link_dirty(link);
811 }
812
813 int link_stop_clients(Link *link, bool may_keep_dhcp) {
814 int r = 0, k;
815 Address *ad;
816
817 assert(link);
818 assert(link->manager);
819 assert(link->manager->event);
820
821 bool keep_dhcp = may_keep_dhcp &&
822 link->network &&
823 (link->manager->restarting ||
824 FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DHCP_ON_STOP));
825
826 if (link->dhcp_client && !keep_dhcp) {
827 k = sd_dhcp_client_stop(link->dhcp_client);
828 if (k < 0)
829 r = log_link_warning_errno(link, k, "Could not stop DHCPv4 client: %m");
830 }
831
832 if (link->ipv4ll) {
833 k = sd_ipv4ll_stop(link->ipv4ll);
834 if (k < 0)
835 r = log_link_warning_errno(link, k, "Could not stop IPv4 link-local: %m");
836 }
837
838 if (link->network)
839 LIST_FOREACH(addresses, ad, link->network->static_addresses)
840 if (ad->acd && sd_ipv4acd_is_running(ad->acd) == 0) {
841 k = sd_ipv4acd_stop(ad->acd);
842 if (k < 0)
843 r = log_link_warning_errno(link, k, "Could not stop IPv4 ACD client: %m");
844 }
845
846 if (link->dhcp6_client) {
847 k = sd_dhcp6_client_stop(link->dhcp6_client);
848 if (k < 0)
849 r = log_link_warning_errno(link, k, "Could not stop DHCPv6 client: %m");
850 }
851
852 if (link_dhcp6_pd_is_enabled(link)) {
853 k = dhcp6_pd_remove(link);
854 if (k < 0)
855 r = log_link_warning_errno(link, k, "Could not remove DHCPv6 PD addresses and routes: %m");
856 }
857
858 if (link->ndisc) {
859 k = sd_ndisc_stop(link->ndisc);
860 if (k < 0)
861 r = log_link_warning_errno(link, k, "Could not stop IPv6 Router Discovery: %m");
862 }
863
864 if (link->radv) {
865 k = sd_radv_stop(link->radv);
866 if (k < 0)
867 r = log_link_warning_errno(link, k, "Could not stop IPv6 Router Advertisement: %m");
868 }
869
870 link_lldp_emit_stop(link);
871 return r;
872 }
873
874 void link_enter_failed(Link *link) {
875 assert(link);
876
877 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
878 return;
879
880 log_link_warning(link, "Failed");
881
882 link_set_state(link, LINK_STATE_FAILED);
883
884 link_stop_clients(link, false);
885
886 link_dirty(link);
887 }
888
889 static int link_join_netdevs_after_configured(Link *link) {
890 NetDev *netdev;
891 Iterator i;
892 int r;
893
894 HASHMAP_FOREACH(netdev, link->network->stacked_netdevs, i) {
895 if (netdev->ifindex > 0)
896 /* Assume already enslaved. */
897 continue;
898
899 if (netdev_get_create_type(netdev) != NETDEV_CREATE_AFTER_CONFIGURED)
900 continue;
901
902 log_struct(LOG_DEBUG,
903 LOG_LINK_INTERFACE(link),
904 LOG_NETDEV_INTERFACE(netdev),
905 LOG_LINK_MESSAGE(link, "Enslaving by '%s'", netdev->ifname));
906
907 r = netdev_join(netdev, link, NULL);
908 if (r < 0)
909 return log_struct_errno(LOG_WARNING, r,
910 LOG_LINK_INTERFACE(link),
911 LOG_NETDEV_INTERFACE(netdev),
912 LOG_LINK_MESSAGE(link, "Could not join netdev '%s': %m", netdev->ifname));
913 }
914
915 return 0;
916 }
917
918 static void link_enter_configured(Link *link) {
919 assert(link);
920 assert(link->network);
921
922 if (link->state != LINK_STATE_CONFIGURING)
923 return;
924
925 link_set_state(link, LINK_STATE_CONFIGURED);
926
927 (void) link_join_netdevs_after_configured(link);
928
929 link_dirty(link);
930 }
931
932 static int link_request_set_routing_policy_rule(Link *link) {
933 RoutingPolicyRule *rule, *rrule = NULL;
934 int r;
935
936 assert(link);
937 assert(link->network);
938
939 link->routing_policy_rules_configured = false;
940
941 LIST_FOREACH(rules, rule, link->network->rules) {
942 r = routing_policy_rule_get(link->manager, rule, &rrule);
943 if (r >= 0) {
944 if (r == 0)
945 (void) routing_policy_rule_make_local(link->manager, rrule);
946 continue;
947 }
948
949 r = routing_policy_rule_configure(rule, link, NULL);
950 if (r < 0)
951 return log_link_warning_errno(link, r, "Could not set routing policy rules: %m");
952 if (r > 0)
953 link->routing_policy_rule_messages++;
954 }
955
956 routing_policy_rule_purge(link->manager, link);
957 if (link->routing_policy_rule_messages == 0)
958 link->routing_policy_rules_configured = true;
959 else {
960 log_link_debug(link, "Setting routing policy rules");
961 link_set_state(link, LINK_STATE_CONFIGURING);
962 }
963
964 return 0;
965 }
966
967 static int nexthop_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
968 int r;
969
970 assert(link);
971 assert(link->nexthop_messages > 0);
972 assert(IN_SET(link->state, LINK_STATE_CONFIGURING,
973 LINK_STATE_FAILED, LINK_STATE_LINGER));
974
975 link->nexthop_messages--;
976
977 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
978 return 1;
979
980 r = sd_netlink_message_get_errno(m);
981 if (r < 0 && r != -EEXIST) {
982 log_link_message_warning_errno(link, m, r, "Could not set nexthop");
983 link_enter_failed(link);
984 return 1;
985 }
986
987 if (link->nexthop_messages == 0) {
988 log_link_debug(link, "Nexthop set");
989 link->static_nexthops_configured = true;
990 link_check_ready(link);
991 }
992
993 return 1;
994 }
995
996 static int link_request_set_nexthop(Link *link) {
997 NextHop *nh;
998 int r;
999
1000 link->static_nexthops_configured = false;
1001
1002 LIST_FOREACH(nexthops, nh, link->network->static_nexthops) {
1003 r = nexthop_configure(nh, link, nexthop_handler);
1004 if (r < 0)
1005 return log_link_warning_errno(link, r, "Could not set nexthop: %m");
1006 if (r > 0)
1007 link->nexthop_messages++;
1008 }
1009
1010 if (link->nexthop_messages == 0) {
1011 link->static_nexthops_configured = true;
1012 link_check_ready(link);
1013 } else {
1014 log_link_debug(link, "Setting nexthop");
1015 link_set_state(link, LINK_STATE_CONFIGURING);
1016 }
1017
1018 return 1;
1019 }
1020
1021 static int route_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
1022 int r;
1023
1024 assert(link);
1025 assert(link->route_messages > 0);
1026 assert(IN_SET(link->state, LINK_STATE_CONFIGURING,
1027 LINK_STATE_FAILED, LINK_STATE_LINGER));
1028
1029 link->route_messages--;
1030
1031 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1032 return 1;
1033
1034 r = sd_netlink_message_get_errno(m);
1035 if (r < 0 && r != -EEXIST) {
1036 log_link_message_warning_errno(link, m, r, "Could not set route");
1037 link_enter_failed(link);
1038 return 1;
1039 }
1040
1041 if (link->route_messages == 0) {
1042 log_link_debug(link, "Routes set");
1043 link->static_routes_configured = true;
1044 link_request_set_nexthop(link);
1045 }
1046
1047 return 1;
1048 }
1049
1050 int link_request_set_routes(Link *link) {
1051 enum {
1052 PHASE_NON_GATEWAY, /* First phase: Routes without a gateway */
1053 PHASE_GATEWAY, /* Second phase: Routes with a gateway */
1054 _PHASE_MAX
1055 } phase;
1056 Route *rt;
1057 int r;
1058
1059 assert(link);
1060 assert(link->network);
1061 assert(link->state != _LINK_STATE_INVALID);
1062
1063 link->static_routes_configured = false;
1064
1065 if (!link->addresses_ready)
1066 return 0;
1067
1068 if (!link_has_carrier(link) && !link->network->configure_without_carrier)
1069 /* During configuring addresses, the link lost its carrier. As networkd is dropping
1070 * the addresses now, let's not configure the routes either. */
1071 return 0;
1072
1073 r = link_request_set_routing_policy_rule(link);
1074 if (r < 0)
1075 return r;
1076
1077 /* First add the routes that enable us to talk to gateways, then add in the others that need a gateway. */
1078 for (phase = 0; phase < _PHASE_MAX; phase++)
1079 LIST_FOREACH(routes, rt, link->network->static_routes) {
1080 if (rt->gateway_from_dhcp)
1081 continue;
1082
1083 if ((in_addr_is_null(rt->family, &rt->gw) && ordered_set_isempty(rt->multipath_routes)) != (phase == PHASE_NON_GATEWAY))
1084 continue;
1085
1086 r = route_configure(rt, link, route_handler, NULL);
1087 if (r < 0)
1088 return log_link_warning_errno(link, r, "Could not set routes: %m");
1089 if (r > 0)
1090 link->route_messages++;
1091 }
1092
1093 if (link->route_messages == 0) {
1094 link->static_routes_configured = true;
1095 link_request_set_nexthop(link);
1096 } else {
1097 log_link_debug(link, "Setting routes");
1098 link_set_state(link, LINK_STATE_CONFIGURING);
1099 }
1100
1101 return 0;
1102 }
1103
1104 void link_check_ready(Link *link) {
1105 Address *a;
1106 Iterator i;
1107
1108 assert(link);
1109
1110 if (link->state == LINK_STATE_CONFIGURED)
1111 return;
1112
1113 if (link->state != LINK_STATE_CONFIGURING) {
1114 log_link_debug(link, "%s(): link is in %s state.", __func__, link_state_to_string(link->state));
1115 return;
1116 }
1117
1118 if (!link->network)
1119 return;
1120
1121 if (!link->addresses_configured) {
1122 log_link_debug(link, "%s(): static addresses are not configured.", __func__);
1123 return;
1124 }
1125
1126 if (!link->neighbors_configured) {
1127 log_link_debug(link, "%s(): static neighbors are not configured.", __func__);
1128 return;
1129 }
1130
1131 SET_FOREACH(a, link->addresses, i)
1132 if (!address_is_ready(a)) {
1133 _cleanup_free_ char *str = NULL;
1134
1135 (void) in_addr_to_string(a->family, &a->in_addr, &str);
1136 log_link_debug(link, "%s(): an address %s/%d is not ready.", __func__, strnull(str), a->prefixlen);
1137 return;
1138 }
1139
1140 if (!link->static_routes_configured) {
1141 log_link_debug(link, "%s(): static routes are not configured.", __func__);
1142 return;
1143 }
1144
1145 if (!link->static_nexthops_configured) {
1146 log_link_debug(link, "%s(): static nexthops are not configured.", __func__);
1147 return;
1148 }
1149
1150 if (!link->routing_policy_rules_configured) {
1151 log_link_debug(link, "%s(): static routing policy rules are not configured.", __func__);
1152 return;
1153 }
1154
1155 if (!link->tc_configured) {
1156 log_link_debug(link, "%s(): traffic controls are not configured.", __func__);
1157 return;
1158 }
1159
1160 if (!link->sr_iov_configured) {
1161 log_link_debug(link, "%s(): SR-IOV is not configured.", __func__);
1162 return;
1163 }
1164
1165 if (link_has_carrier(link) || !link->network->configure_without_carrier) {
1166
1167 if (link_ipv4ll_enabled(link, ADDRESS_FAMILY_IPV4) && !link->ipv4ll_address_configured) {
1168 log_link_debug(link, "%s(): IPv4LL is not configured.", __func__);
1169 return;
1170 }
1171
1172 if (link_ipv6ll_enabled(link) &&
1173 in_addr_is_null(AF_INET6, (const union in_addr_union*) &link->ipv6ll_address)) {
1174 log_link_debug(link, "%s(): IPv6LL is not configured.", __func__);
1175 return;
1176 }
1177
1178 if ((link_dhcp4_enabled(link) || link_dhcp6_enabled(link)) &&
1179 !link->dhcp_address && set_isempty(link->dhcp6_addresses) && set_isempty(link->ndisc_addresses) &&
1180 !(link_ipv4ll_enabled(link, ADDRESS_FAMILY_FALLBACK_IPV4) && link->ipv4ll_address_configured)) {
1181 log_link_debug(link, "%s(): DHCP4 or DHCP6 is enabled but no dynamic address is assigned yet.", __func__);
1182 return;
1183 }
1184
1185 if (link_dhcp4_enabled(link) || link_dhcp6_enabled(link) || link_dhcp6_pd_is_enabled(link) || link_ipv6_accept_ra_enabled(link)) {
1186 if (!link->dhcp4_configured &&
1187 !(link->dhcp6_address_configured && link->dhcp6_route_configured) &&
1188 !(link->dhcp6_pd_address_configured && link->dhcp6_pd_route_configured) &&
1189 !(link->ndisc_addresses_configured && link->ndisc_routes_configured) &&
1190 !(link_ipv4ll_enabled(link, ADDRESS_FAMILY_FALLBACK_IPV4) && link->ipv4ll_address_configured)) {
1191 /* When DHCP or RA is enabled, at least one protocol must provide an address, or
1192 * an IPv4ll fallback address must be configured. */
1193 log_link_debug(link, "%s(): dynamic addresses or routes are not configured.", __func__);
1194 return;
1195 }
1196
1197 log_link_debug(link, "%s(): dhcp4:%s dhcp6_addresses:%s dhcp_routes:%s dhcp_pd_addresses:%s dhcp_pd_routes:%s ndisc_addresses:%s ndisc_routes:%s",
1198 __func__,
1199 yes_no(link->dhcp4_configured),
1200 yes_no(link->dhcp6_address_configured),
1201 yes_no(link->dhcp6_route_configured),
1202 yes_no(link->dhcp6_pd_address_configured),
1203 yes_no(link->dhcp6_pd_route_configured),
1204 yes_no(link->ndisc_addresses_configured),
1205 yes_no(link->ndisc_routes_configured));
1206 }
1207 }
1208
1209 link_enter_configured(link);
1210
1211 return;
1212 }
1213
1214 static int link_request_set_neighbors(Link *link) {
1215 Neighbor *neighbor;
1216 int r;
1217
1218 assert(link);
1219 assert(link->network);
1220 assert(link->state != _LINK_STATE_INVALID);
1221
1222 link->neighbors_configured = false;
1223
1224 LIST_FOREACH(neighbors, neighbor, link->network->neighbors) {
1225 r = neighbor_configure(neighbor, link, NULL);
1226 if (r < 0)
1227 return log_link_warning_errno(link, r, "Could not set neighbor: %m");
1228 }
1229
1230 if (link->neighbor_messages == 0) {
1231 link->neighbors_configured = true;
1232 link_check_ready(link);
1233 } else {
1234 log_link_debug(link, "Setting neighbors");
1235 link_set_state(link, LINK_STATE_CONFIGURING);
1236 }
1237
1238 return 0;
1239 }
1240
1241 static int link_set_bridge_fdb(Link *link) {
1242 FdbEntry *fdb_entry;
1243 int r;
1244
1245 LIST_FOREACH(static_fdb_entries, fdb_entry, link->network->static_fdb_entries) {
1246 r = fdb_entry_configure(link, fdb_entry);
1247 if (r < 0)
1248 return log_link_error_errno(link, r, "Failed to add MAC entry to static MAC table: %m");
1249 }
1250
1251 return 0;
1252 }
1253
1254 static int static_address_ready_callback(Address *address) {
1255 Address *a;
1256 Iterator i;
1257 Link *link;
1258
1259 assert(address);
1260 assert(address->link);
1261
1262 link = address->link;
1263
1264 if (!link->addresses_configured)
1265 return 0;
1266
1267 SET_FOREACH(a, link->static_addresses, i)
1268 if (!address_is_ready(a)) {
1269 _cleanup_free_ char *str = NULL;
1270
1271 (void) in_addr_to_string(a->family, &a->in_addr, &str);
1272 log_link_debug(link, "an address %s/%u is not ready", strnull(str), a->prefixlen);
1273 return 0;
1274 }
1275
1276 /* This should not be called again */
1277 SET_FOREACH(a, link->static_addresses, i)
1278 a->callback = NULL;
1279
1280 link->addresses_ready = true;
1281
1282 return link_request_set_routes(link);
1283 }
1284
1285 static int address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
1286 int r;
1287
1288 assert(rtnl);
1289 assert(m);
1290 assert(link);
1291 assert(link->ifname);
1292 assert(link->address_messages > 0);
1293 assert(IN_SET(link->state, LINK_STATE_CONFIGURING,
1294 LINK_STATE_FAILED, LINK_STATE_LINGER));
1295
1296 link->address_messages--;
1297
1298 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1299 return 1;
1300
1301 r = sd_netlink_message_get_errno(m);
1302 if (r < 0 && r != -EEXIST) {
1303 log_link_message_warning_errno(link, m, r, "Could not set address");
1304 link_enter_failed(link);
1305 return 1;
1306 } else if (r >= 0)
1307 (void) manager_rtnl_process_address(rtnl, m, link->manager);
1308
1309 if (link->address_messages == 0) {
1310 Address *a;
1311
1312 log_link_debug(link, "Addresses set");
1313 link->addresses_configured = true;
1314
1315 /* When all static addresses are already ready, then static_address_ready_callback()
1316 * will not be called automatically. So, call it here. */
1317 a = set_first(link->static_addresses);
1318 if (!a) {
1319 log_link_warning(link, "No static address is stored.");
1320 link_enter_failed(link);
1321 return 1;
1322 }
1323 if (!a->callback) {
1324 log_link_warning(link, "Address ready callback is not set.");
1325 link_enter_failed(link);
1326 return 1;
1327 }
1328 r = a->callback(a);
1329 if (r < 0)
1330 link_enter_failed(link);
1331 }
1332
1333 return 1;
1334 }
1335
1336 static int static_address_configure(Address *address, Link *link, bool update) {
1337 Address *ret;
1338 int r;
1339
1340 assert(address);
1341 assert(link);
1342
1343 r = address_configure(address, link, address_handler, update, &ret);
1344 if (r < 0)
1345 return log_link_warning_errno(link, r, "Could not configure static address: %m");
1346
1347 link->address_messages++;
1348
1349 r = set_ensure_put(&link->static_addresses, &address_hash_ops, ret);
1350 if (r < 0)
1351 return log_link_warning_errno(link, r, "Failed to store static address: %m");
1352
1353 ret->callback = static_address_ready_callback;
1354
1355 return 0;
1356 }
1357
1358 static int link_request_set_addresses(Link *link) {
1359 AddressLabel *label;
1360 Address *ad;
1361 Prefix *p;
1362 int r;
1363
1364 assert(link);
1365 assert(link->network);
1366 assert(link->state != _LINK_STATE_INVALID);
1367
1368 /* Reset all *_configured flags we are configuring. */
1369 link->addresses_configured = false;
1370 link->addresses_ready = false;
1371 link->neighbors_configured = false;
1372 link->static_routes_configured = false;
1373 link->static_nexthops_configured = false;
1374 link->routing_policy_rules_configured = false;
1375
1376 r = link_set_bridge_fdb(link);
1377 if (r < 0)
1378 return r;
1379
1380 r = link_request_set_neighbors(link);
1381 if (r < 0)
1382 return r;
1383
1384 LIST_FOREACH(addresses, ad, link->network->static_addresses) {
1385 bool update;
1386
1387 if (ad->family == AF_INET6 && !in_addr_is_null(ad->family, &ad->in_addr_peer))
1388 update = address_get(link, ad->family, &ad->in_addr_peer, ad->prefixlen, NULL) > 0;
1389 else
1390 update = address_get(link, ad->family, &ad->in_addr, ad->prefixlen, NULL) > 0;
1391
1392 r = static_address_configure(ad, link, update);
1393 if (r < 0)
1394 return r;
1395 }
1396
1397 if (link->network->router_prefix_delegation & RADV_PREFIX_DELEGATION_STATIC)
1398 LIST_FOREACH(prefixes, p, link->network->static_prefixes) {
1399 _cleanup_(address_freep) Address *address = NULL;
1400
1401 if (!p->assign)
1402 continue;
1403
1404 r = address_new(&address);
1405 if (r < 0)
1406 return log_oom();
1407
1408 r = sd_radv_prefix_get_prefix(p->radv_prefix, &address->in_addr.in6, &address->prefixlen);
1409 if (r < 0)
1410 return log_link_warning_errno(link, r, "Could not get RA prefix: %m");
1411
1412 r = generate_ipv6_eui_64_address(link, &address->in_addr.in6);
1413 if (r < 0)
1414 return log_link_warning_errno(link, r, "Could not generate EUI64 address: %m");
1415
1416 address->family = AF_INET6;
1417 r = static_address_configure(address, link, true);
1418 if (r < 0)
1419 return r;
1420 }
1421
1422 LIST_FOREACH(labels, label, link->network->address_labels) {
1423 r = address_label_configure(label, link, NULL, false);
1424 if (r < 0)
1425 return log_link_warning_errno(link, r, "Could not set address label: %m");
1426
1427 link->address_label_messages++;
1428 }
1429
1430 /* now that we can figure out a default address for the dhcp server, start it */
1431 if (link_dhcp4_server_enabled(link) && (link->flags & IFF_UP)) {
1432 r = dhcp4_server_configure(link);
1433 if (r < 0)
1434 return r;
1435 log_link_debug(link, "Offering DHCPv4 leases");
1436 }
1437
1438 if (link->address_messages == 0) {
1439 link->addresses_configured = true;
1440 link->addresses_ready = true;
1441 r = link_request_set_routes(link);
1442 if (r < 0)
1443 return r;
1444 } else {
1445 log_link_debug(link, "Setting addresses");
1446 link_set_state(link, LINK_STATE_CONFIGURING);
1447 }
1448
1449 return 0;
1450 }
1451
1452 static int link_set_bridge_vlan(Link *link) {
1453 int r;
1454
1455 r = br_vlan_configure(link, link->network->pvid, link->network->br_vid_bitmap, link->network->br_untagged_bitmap);
1456 if (r < 0)
1457 log_link_error_errno(link, r, "Failed to assign VLANs to bridge port: %m");
1458
1459 return r;
1460 }
1461
1462 static int link_set_proxy_arp(Link *link) {
1463 int r;
1464
1465 if (!link_proxy_arp_enabled(link))
1466 return 0;
1467
1468 r = sysctl_write_ip_property_boolean(AF_INET, link->ifname, "proxy_arp", link->network->proxy_arp > 0);
1469 if (r < 0)
1470 log_link_warning_errno(link, r, "Cannot configure proxy ARP for interface: %m");
1471
1472 return 0;
1473 }
1474
1475 static int link_configure_continue(Link *link);
1476
1477 static int set_mtu_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
1478 int r;
1479
1480 assert(m);
1481 assert(link);
1482 assert(link->ifname);
1483
1484 link->setting_mtu = false;
1485
1486 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1487 return 1;
1488
1489 r = sd_netlink_message_get_errno(m);
1490 if (r < 0)
1491 log_link_message_warning_errno(link, m, r, "Could not set MTU, ignoring");
1492 else
1493 log_link_debug(link, "Setting MTU done.");
1494
1495 if (link->state == LINK_STATE_INITIALIZED) {
1496 r = link_configure_continue(link);
1497 if (r < 0)
1498 link_enter_failed(link);
1499 }
1500
1501 return 1;
1502 }
1503
1504 int link_set_mtu(Link *link, uint32_t mtu) {
1505 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
1506 int r;
1507
1508 assert(link);
1509 assert(link->manager);
1510 assert(link->manager->rtnl);
1511
1512 if (mtu == 0 || link->setting_mtu)
1513 return 0;
1514
1515 if (link->mtu == mtu)
1516 return 0;
1517
1518 log_link_debug(link, "Setting MTU: %" PRIu32, mtu);
1519
1520 r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
1521 if (r < 0)
1522 return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
1523
1524 /* IPv6 protocol requires a minimum MTU of IPV6_MTU_MIN(1280) bytes
1525 * on the interface. Bump up MTU bytes to IPV6_MTU_MIN. */
1526 if (link_ipv6_enabled(link) && mtu < IPV6_MIN_MTU) {
1527
1528 log_link_warning(link, "Bumping MTU to " STRINGIFY(IPV6_MIN_MTU) ", as "
1529 "IPv6 is requested and requires a minimum MTU of " STRINGIFY(IPV6_MIN_MTU) " bytes");
1530
1531 mtu = IPV6_MIN_MTU;
1532 }
1533
1534 r = sd_netlink_message_append_u32(req, IFLA_MTU, mtu);
1535 if (r < 0)
1536 return log_link_error_errno(link, r, "Could not append MTU: %m");
1537
1538 r = netlink_call_async(link->manager->rtnl, NULL, req, set_mtu_handler,
1539 link_netlink_destroy_callback, link);
1540 if (r < 0)
1541 return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
1542
1543 link_ref(link);
1544 link->setting_mtu = true;
1545
1546 return 0;
1547 }
1548
1549 static bool link_reduces_vlan_mtu(Link *link) {
1550 /* See netif_reduces_vlan_mtu() in kernel. */
1551 return streq_ptr(link->kind, "macsec");
1552 }
1553
1554 static uint32_t link_get_requested_mtu_by_stacked_netdevs(Link *link) {
1555 uint32_t mtu = 0;
1556 NetDev *dev;
1557 Iterator i;
1558
1559 HASHMAP_FOREACH(dev, link->network->stacked_netdevs, i)
1560 if (dev->kind == NETDEV_KIND_VLAN && dev->mtu > 0)
1561 /* See vlan_dev_change_mtu() in kernel. */
1562 mtu = MAX(mtu, link_reduces_vlan_mtu(link) ? dev->mtu + 4 : dev->mtu);
1563
1564 else if (dev->kind == NETDEV_KIND_MACVLAN && dev->mtu > mtu)
1565 /* See macvlan_change_mtu() in kernel. */
1566 mtu = dev->mtu;
1567
1568 return mtu;
1569 }
1570
1571 static int link_configure_mtu(Link *link) {
1572 uint32_t mtu;
1573
1574 assert(link);
1575 assert(link->network);
1576
1577 if (link->network->mtu > 0)
1578 return link_set_mtu(link, link->network->mtu);
1579
1580 mtu = link_get_requested_mtu_by_stacked_netdevs(link);
1581 if (link->mtu >= mtu)
1582 return 0;
1583
1584 log_link_notice(link, "Bumping MTU bytes from %"PRIu32" to %"PRIu32" because of stacked device. "
1585 "If it is not desired, then please explicitly specify MTUBytes= setting.",
1586 link->mtu, mtu);
1587
1588 return link_set_mtu(link, mtu);
1589 }
1590
1591 static int set_flags_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
1592 int r;
1593
1594 assert(m);
1595 assert(link);
1596 assert(link->ifname);
1597
1598 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1599 return 1;
1600
1601 r = sd_netlink_message_get_errno(m);
1602 if (r < 0)
1603 log_link_message_warning_errno(link, m, r, "Could not set link flags, ignoring");
1604
1605 return 1;
1606 }
1607
1608 static int link_set_flags(Link *link) {
1609 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
1610 unsigned ifi_change = 0;
1611 unsigned ifi_flags = 0;
1612 int r;
1613
1614 assert(link);
1615 assert(link->manager);
1616 assert(link->manager->rtnl);
1617
1618 if (link->flags & IFF_LOOPBACK)
1619 return 0;
1620
1621 if (!link->network)
1622 return 0;
1623
1624 if (link->network->arp < 0 && link->network->multicast < 0 && link->network->allmulticast < 0)
1625 return 0;
1626
1627 r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
1628 if (r < 0)
1629 return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
1630
1631 if (link->network->arp >= 0) {
1632 ifi_change |= IFF_NOARP;
1633 SET_FLAG(ifi_flags, IFF_NOARP, link->network->arp == 0);
1634 }
1635
1636 if (link->network->multicast >= 0) {
1637 ifi_change |= IFF_MULTICAST;
1638 SET_FLAG(ifi_flags, IFF_MULTICAST, link->network->multicast);
1639 }
1640
1641 if (link->network->allmulticast >= 0) {
1642 ifi_change |= IFF_ALLMULTI;
1643 SET_FLAG(ifi_flags, IFF_ALLMULTI, link->network->allmulticast);
1644 }
1645
1646 r = sd_rtnl_message_link_set_flags(req, ifi_flags, ifi_change);
1647 if (r < 0)
1648 return log_link_error_errno(link, r, "Could not set link flags: %m");
1649
1650 r = netlink_call_async(link->manager->rtnl, NULL, req, set_flags_handler,
1651 link_netlink_destroy_callback, link);
1652 if (r < 0)
1653 return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
1654
1655 link_ref(link);
1656
1657 return 0;
1658 }
1659
1660 static int link_acquire_ipv6_conf(Link *link) {
1661 int r;
1662
1663 assert(link);
1664
1665 if (link_ipv6_accept_ra_enabled(link)) {
1666 assert(link->ndisc);
1667
1668 log_link_debug(link, "Discovering IPv6 routers");
1669
1670 r = sd_ndisc_start(link->ndisc);
1671 if (r < 0 && r != -EBUSY)
1672 return log_link_warning_errno(link, r, "Could not start IPv6 Router Discovery: %m");
1673 }
1674
1675 if (link_radv_enabled(link)) {
1676 assert(link->radv);
1677 assert(in_addr_is_link_local(AF_INET6, (const union in_addr_union*)&link->ipv6ll_address) > 0);
1678
1679 log_link_debug(link, "Starting IPv6 Router Advertisements");
1680
1681 r = radv_emit_dns(link);
1682 if (r < 0)
1683 return log_link_warning_errno(link, r, "Failed to configure DNS or Domains in IPv6 Router Advertisement: %m");
1684
1685 r = sd_radv_start(link->radv);
1686 if (r < 0 && r != -EBUSY)
1687 return log_link_warning_errno(link, r, "Could not start IPv6 Router Advertisement: %m");
1688 }
1689
1690 if (link_dhcp6_enabled(link) && IN_SET(link->network->dhcp6_without_ra,
1691 DHCP6_CLIENT_START_MODE_INFORMATION_REQUEST,
1692 DHCP6_CLIENT_START_MODE_SOLICIT)) {
1693 assert(link->dhcp6_client);
1694 assert(in_addr_is_link_local(AF_INET6, (const union in_addr_union*)&link->ipv6ll_address) > 0);
1695
1696 r = dhcp6_request_address(link, link->network->dhcp6_without_ra == DHCP6_CLIENT_START_MODE_INFORMATION_REQUEST);
1697 if (r < 0 && r != -EBUSY)
1698 return log_link_warning_errno(link, r, "Could not acquire DHCPv6 lease: %m");
1699 else
1700 log_link_debug(link, "Acquiring DHCPv6 lease");
1701 }
1702
1703 r = dhcp6_request_prefix_delegation(link);
1704 if (r < 0)
1705 return log_link_warning_errno(link, r, "Failed to request DHCPv6 prefix delegation: %m");
1706
1707 return 0;
1708 }
1709
1710 static int link_acquire_ipv4_conf(Link *link) {
1711 int r;
1712
1713 assert(link);
1714 assert(link->manager);
1715 assert(link->manager->event);
1716
1717 if (link_ipv4ll_enabled(link, ADDRESS_FAMILY_IPV4)) {
1718 assert(link->ipv4ll);
1719
1720 log_link_debug(link, "Acquiring IPv4 link-local address");
1721
1722 r = sd_ipv4ll_start(link->ipv4ll);
1723 if (r < 0)
1724 return log_link_warning_errno(link, r, "Could not acquire IPv4 link-local address: %m");
1725 }
1726
1727 if (link_dhcp4_enabled(link)) {
1728 assert(link->dhcp_client);
1729
1730 log_link_debug(link, "Acquiring DHCPv4 lease");
1731
1732 r = sd_dhcp_client_start(link->dhcp_client);
1733 if (r < 0)
1734 return log_link_warning_errno(link, r, "Could not acquire DHCPv4 lease: %m");
1735 }
1736
1737 return 0;
1738 }
1739
1740 static int link_acquire_conf(Link *link) {
1741 int r;
1742
1743 assert(link);
1744
1745 r = link_acquire_ipv4_conf(link);
1746 if (r < 0)
1747 return r;
1748
1749 if (!in_addr_is_null(AF_INET6, (const union in_addr_union*) &link->ipv6ll_address)) {
1750 r = link_acquire_ipv6_conf(link);
1751 if (r < 0)
1752 return r;
1753 }
1754
1755 if (link_lldp_emit_enabled(link)) {
1756 r = link_lldp_emit_start(link);
1757 if (r < 0)
1758 return log_link_warning_errno(link, r, "Failed to start LLDP transmission: %m");
1759 }
1760
1761 return 0;
1762 }
1763
1764 bool link_has_carrier(Link *link) {
1765 /* see Documentation/networking/operstates.txt in the kernel sources */
1766
1767 if (link->kernel_operstate == IF_OPER_UP)
1768 return true;
1769
1770 if (link->kernel_operstate == IF_OPER_UNKNOWN)
1771 /* operstate may not be implemented, so fall back to flags */
1772 if (FLAGS_SET(link->flags, IFF_LOWER_UP | IFF_RUNNING) &&
1773 !FLAGS_SET(link->flags, IFF_DORMANT))
1774 return true;
1775
1776 return false;
1777 }
1778
1779 static int link_address_genmode_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
1780 int r;
1781
1782 assert(link);
1783
1784 link->setting_genmode = false;
1785
1786 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1787 return 1;
1788
1789 r = sd_netlink_message_get_errno(m);
1790 if (r < 0)
1791 log_link_message_warning_errno(link, m, r, "Could not set address genmode for interface, ignoring");
1792 else
1793 log_link_debug(link, "Setting address genmode done.");
1794
1795 if (link->state == LINK_STATE_INITIALIZED) {
1796 r = link_configure_continue(link);
1797 if (r < 0)
1798 link_enter_failed(link);
1799 }
1800
1801 return 1;
1802 }
1803
1804 static int link_configure_addrgen_mode(Link *link) {
1805 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
1806 uint8_t ipv6ll_mode;
1807 int r;
1808
1809 assert(link);
1810 assert(link->network);
1811 assert(link->manager);
1812 assert(link->manager->rtnl);
1813
1814 if (!socket_ipv6_is_supported() || link->setting_genmode)
1815 return 0;
1816
1817 log_link_debug(link, "Setting address genmode for link");
1818
1819 r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
1820 if (r < 0)
1821 return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
1822
1823 r = sd_netlink_message_open_container(req, IFLA_AF_SPEC);
1824 if (r < 0)
1825 return log_link_error_errno(link, r, "Could not open IFLA_AF_SPEC container: %m");
1826
1827 r = sd_netlink_message_open_container(req, AF_INET6);
1828 if (r < 0)
1829 return log_link_error_errno(link, r, "Could not open AF_INET6 container: %m");
1830
1831 if (!link_ipv6ll_enabled(link))
1832 ipv6ll_mode = IN6_ADDR_GEN_MODE_NONE;
1833 else if (link->network->ipv6ll_address_gen_mode < 0) {
1834 r = sysctl_read_ip_property(AF_INET6, link->ifname, "stable_secret", NULL);
1835 if (r < 0) {
1836 /* The file may not exist. And even if it exists, when stable_secret is unset,
1837 * reading the file fails with EIO. */
1838 log_link_debug_errno(link, r, "Failed to read sysctl property stable_secret: %m");
1839
1840 ipv6ll_mode = IN6_ADDR_GEN_MODE_EUI64;
1841 } else
1842 ipv6ll_mode = IN6_ADDR_GEN_MODE_STABLE_PRIVACY;
1843 } else
1844 ipv6ll_mode = link->network->ipv6ll_address_gen_mode;
1845
1846 r = sd_netlink_message_append_u8(req, IFLA_INET6_ADDR_GEN_MODE, ipv6ll_mode);
1847 if (r < 0)
1848 return log_link_error_errno(link, r, "Could not append IFLA_INET6_ADDR_GEN_MODE: %m");
1849
1850 r = sd_netlink_message_close_container(req);
1851 if (r < 0)
1852 return log_link_error_errno(link, r, "Could not close AF_INET6 container: %m");
1853
1854 r = sd_netlink_message_close_container(req);
1855 if (r < 0)
1856 return log_link_error_errno(link, r, "Could not close IFLA_AF_SPEC container: %m");
1857
1858 r = netlink_call_async(link->manager->rtnl, NULL, req, link_address_genmode_handler,
1859 link_netlink_destroy_callback, link);
1860 if (r < 0)
1861 return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
1862
1863 link_ref(link);
1864 link->setting_genmode = true;
1865
1866 return 0;
1867 }
1868
1869 static int link_up_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
1870 int r;
1871
1872 assert(link);
1873
1874 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1875 return 1;
1876
1877 r = sd_netlink_message_get_errno(m);
1878 if (r < 0)
1879 /* we warn but don't fail the link, as it may be brought up later */
1880 log_link_message_warning_errno(link, m, r, "Could not bring up interface");
1881
1882 return 1;
1883 }
1884
1885 static int link_up(Link *link) {
1886 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
1887 int r;
1888
1889 assert(link);
1890 assert(link->network);
1891 assert(link->manager);
1892 assert(link->manager->rtnl);
1893
1894 log_link_debug(link, "Bringing link up");
1895
1896 r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
1897 if (r < 0)
1898 return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
1899
1900 /* set it free if not enslaved with networkd */
1901 if (!link->network->bridge && !link->network->bond && !link->network->vrf) {
1902 r = sd_netlink_message_append_u32(req, IFLA_MASTER, 0);
1903 if (r < 0)
1904 return log_link_error_errno(link, r, "Could not append IFLA_MASTER attribute: %m");
1905 }
1906
1907 r = sd_rtnl_message_link_set_flags(req, IFF_UP, IFF_UP);
1908 if (r < 0)
1909 return log_link_error_errno(link, r, "Could not set link flags: %m");
1910
1911 if (link->network->mac) {
1912 r = sd_netlink_message_append_ether_addr(req, IFLA_ADDRESS, link->network->mac);
1913 if (r < 0)
1914 return log_link_error_errno(link, r, "Could not set MAC address: %m");
1915 }
1916
1917 r = netlink_call_async(link->manager->rtnl, NULL, req, link_up_handler,
1918 link_netlink_destroy_callback, link);
1919 if (r < 0)
1920 return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
1921
1922 link_ref(link);
1923
1924 return 0;
1925 }
1926
1927 static int link_down_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
1928 int r;
1929
1930 assert(link);
1931
1932 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1933 return 1;
1934
1935 r = sd_netlink_message_get_errno(m);
1936 if (r < 0)
1937 log_link_message_warning_errno(link, m, r, "Could not bring down interface");
1938
1939 return 1;
1940 }
1941
1942 int link_down(Link *link, link_netlink_message_handler_t callback) {
1943 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
1944 int r;
1945
1946 assert(link);
1947 assert(link->manager);
1948 assert(link->manager->rtnl);
1949
1950 log_link_debug(link, "Bringing link down");
1951
1952 r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
1953 RTM_SETLINK, link->ifindex);
1954 if (r < 0)
1955 return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
1956
1957 r = sd_rtnl_message_link_set_flags(req, 0, IFF_UP);
1958 if (r < 0)
1959 return log_link_error_errno(link, r, "Could not set link flags: %m");
1960
1961 r = netlink_call_async(link->manager->rtnl, NULL, req,
1962 callback ?: link_down_handler,
1963 link_netlink_destroy_callback, link);
1964 if (r < 0)
1965 return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
1966
1967 link_ref(link);
1968
1969 return 0;
1970 }
1971
1972 static int link_group_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
1973 int r;
1974
1975 assert(link);
1976
1977 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1978 return 1;
1979
1980 r = sd_netlink_message_get_errno(m);
1981 if (r < 0)
1982 log_link_message_warning_errno(link, m, r, "Could not set group for the interface");
1983
1984 return 1;
1985 }
1986
1987 static int link_set_group(Link *link) {
1988 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
1989 int r;
1990
1991 assert(link);
1992 assert(link->network);
1993 assert(link->manager);
1994 assert(link->manager->rtnl);
1995
1996 if (link->network->group <= 0)
1997 return 0;
1998
1999 log_link_debug(link, "Setting group");
2000
2001 r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
2002 if (r < 0)
2003 return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
2004
2005 r = sd_netlink_message_append_u32(req, IFLA_GROUP, link->network->group);
2006 if (r < 0)
2007 return log_link_error_errno(link, r, "Could not set link group: %m");
2008
2009 r = netlink_call_async(link->manager->rtnl, NULL, req, link_group_handler,
2010 link_netlink_destroy_callback, link);
2011 if (r < 0)
2012 return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
2013
2014 link_ref(link);
2015
2016 return 0;
2017 }
2018
2019 static int link_handle_bound_to_list(Link *link) {
2020 Link *l;
2021 Iterator i;
2022 int r;
2023 bool required_up = false;
2024 bool link_is_up = false;
2025
2026 assert(link);
2027
2028 if (hashmap_isempty(link->bound_to_links))
2029 return 0;
2030
2031 if (link->flags & IFF_UP)
2032 link_is_up = true;
2033
2034 HASHMAP_FOREACH (l, link->bound_to_links, i)
2035 if (link_has_carrier(l)) {
2036 required_up = true;
2037 break;
2038 }
2039
2040 if (!required_up && link_is_up) {
2041 r = link_down(link, NULL);
2042 if (r < 0)
2043 return r;
2044 } else if (required_up && !link_is_up) {
2045 r = link_up(link);
2046 if (r < 0)
2047 return r;
2048 }
2049
2050 return 0;
2051 }
2052
2053 static int link_handle_bound_by_list(Link *link) {
2054 Iterator i;
2055 Link *l;
2056 int r;
2057
2058 assert(link);
2059
2060 if (hashmap_isempty(link->bound_by_links))
2061 return 0;
2062
2063 HASHMAP_FOREACH (l, link->bound_by_links, i) {
2064 r = link_handle_bound_to_list(l);
2065 if (r < 0)
2066 return r;
2067 }
2068
2069 return 0;
2070 }
2071
2072 static int link_put_carrier(Link *link, Link *carrier, Hashmap **h) {
2073 int r;
2074
2075 assert(link);
2076 assert(carrier);
2077
2078 if (link == carrier)
2079 return 0;
2080
2081 if (hashmap_get(*h, INT_TO_PTR(carrier->ifindex)))
2082 return 0;
2083
2084 r = hashmap_ensure_allocated(h, NULL);
2085 if (r < 0)
2086 return r;
2087
2088 r = hashmap_put(*h, INT_TO_PTR(carrier->ifindex), carrier);
2089 if (r < 0)
2090 return r;
2091
2092 return 0;
2093 }
2094
2095 static int link_new_bound_by_list(Link *link) {
2096 Manager *m;
2097 Link *carrier;
2098 Iterator i;
2099 int r;
2100 bool list_updated = false;
2101
2102 assert(link);
2103 assert(link->manager);
2104
2105 m = link->manager;
2106
2107 HASHMAP_FOREACH(carrier, m->links, i) {
2108 if (!carrier->network)
2109 continue;
2110
2111 if (strv_isempty(carrier->network->bind_carrier))
2112 continue;
2113
2114 if (strv_fnmatch(carrier->network->bind_carrier, link->ifname)) {
2115 r = link_put_carrier(link, carrier, &link->bound_by_links);
2116 if (r < 0)
2117 return r;
2118
2119 list_updated = true;
2120 }
2121 }
2122
2123 if (list_updated)
2124 link_dirty(link);
2125
2126 HASHMAP_FOREACH(carrier, link->bound_by_links, i) {
2127 r = link_put_carrier(carrier, link, &carrier->bound_to_links);
2128 if (r < 0)
2129 return r;
2130
2131 link_dirty(carrier);
2132 }
2133
2134 return 0;
2135 }
2136
2137 static int link_new_bound_to_list(Link *link) {
2138 Manager *m;
2139 Link *carrier;
2140 Iterator i;
2141 int r;
2142 bool list_updated = false;
2143
2144 assert(link);
2145 assert(link->manager);
2146
2147 if (!link->network)
2148 return 0;
2149
2150 if (strv_isempty(link->network->bind_carrier))
2151 return 0;
2152
2153 m = link->manager;
2154
2155 HASHMAP_FOREACH (carrier, m->links, i) {
2156 if (strv_fnmatch(link->network->bind_carrier, carrier->ifname)) {
2157 r = link_put_carrier(link, carrier, &link->bound_to_links);
2158 if (r < 0)
2159 return r;
2160
2161 list_updated = true;
2162 }
2163 }
2164
2165 if (list_updated)
2166 link_dirty(link);
2167
2168 HASHMAP_FOREACH (carrier, link->bound_to_links, i) {
2169 r = link_put_carrier(carrier, link, &carrier->bound_by_links);
2170 if (r < 0)
2171 return r;
2172
2173 link_dirty(carrier);
2174 }
2175
2176 return 0;
2177 }
2178
2179 static int link_new_carrier_maps(Link *link) {
2180 int r;
2181
2182 r = link_new_bound_by_list(link);
2183 if (r < 0)
2184 return r;
2185
2186 r = link_handle_bound_by_list(link);
2187 if (r < 0)
2188 return r;
2189
2190 r = link_new_bound_to_list(link);
2191 if (r < 0)
2192 return r;
2193
2194 r = link_handle_bound_to_list(link);
2195 if (r < 0)
2196 return r;
2197
2198 return 0;
2199 }
2200
2201 static void link_free_bound_to_list(Link *link) {
2202 Link *bound_to;
2203 Iterator i;
2204
2205 HASHMAP_FOREACH (bound_to, link->bound_to_links, i) {
2206 hashmap_remove(link->bound_to_links, INT_TO_PTR(bound_to->ifindex));
2207
2208 if (hashmap_remove(bound_to->bound_by_links, INT_TO_PTR(link->ifindex)))
2209 link_dirty(bound_to);
2210 }
2211
2212 return;
2213 }
2214
2215 static void link_free_bound_by_list(Link *link) {
2216 Link *bound_by;
2217 Iterator i;
2218
2219 HASHMAP_FOREACH (bound_by, link->bound_by_links, i) {
2220 hashmap_remove(link->bound_by_links, INT_TO_PTR(bound_by->ifindex));
2221
2222 if (hashmap_remove(bound_by->bound_to_links, INT_TO_PTR(link->ifindex))) {
2223 link_dirty(bound_by);
2224 link_handle_bound_to_list(bound_by);
2225 }
2226 }
2227
2228 return;
2229 }
2230
2231 static void link_free_carrier_maps(Link *link) {
2232 bool list_updated = false;
2233
2234 assert(link);
2235
2236 if (!hashmap_isempty(link->bound_to_links)) {
2237 link_free_bound_to_list(link);
2238 list_updated = true;
2239 }
2240
2241 if (!hashmap_isempty(link->bound_by_links)) {
2242 link_free_bound_by_list(link);
2243 list_updated = true;
2244 }
2245
2246 if (list_updated)
2247 link_dirty(link);
2248
2249 return;
2250 }
2251
2252 static int link_append_to_master(Link *link, NetDev *netdev) {
2253 Link *master;
2254 int r;
2255
2256 assert(link);
2257 assert(netdev);
2258
2259 r = link_get(link->manager, netdev->ifindex, &master);
2260 if (r < 0)
2261 return r;
2262
2263 r = set_ensure_put(&master->slaves, NULL, link);
2264 if (r <= 0)
2265 return r;
2266
2267 link_ref(link);
2268 return 0;
2269 }
2270
2271 static void link_drop_from_master(Link *link, NetDev *netdev) {
2272 Link *master;
2273
2274 assert(link);
2275
2276 if (!link->manager || !netdev)
2277 return;
2278
2279 if (link_get(link->manager, netdev->ifindex, &master) < 0)
2280 return;
2281
2282 link_unref(set_remove(master->slaves, link));
2283 }
2284
2285 static void link_detach_from_manager(Link *link) {
2286 if (!link || !link->manager)
2287 return;
2288
2289 link_unref(set_remove(link->manager->links_requesting_uuid, link));
2290 link_clean(link);
2291
2292 /* The following must be called at last. */
2293 assert_se(hashmap_remove(link->manager->links, INT_TO_PTR(link->ifindex)) == link);
2294 link_unref(link);
2295 }
2296
2297 void link_drop(Link *link) {
2298 if (!link || link->state == LINK_STATE_LINGER)
2299 return;
2300
2301 link_set_state(link, LINK_STATE_LINGER);
2302
2303 link_free_carrier_maps(link);
2304
2305 if (link->network) {
2306 link_drop_from_master(link, link->network->bridge);
2307 link_drop_from_master(link, link->network->bond);
2308 }
2309
2310 log_link_debug(link, "Link removed");
2311
2312 (void) unlink(link->state_file);
2313 link_detach_from_manager(link);
2314 }
2315
2316 static int link_joined(Link *link) {
2317 int r;
2318
2319 assert(link);
2320 assert(link->network);
2321
2322 if (!hashmap_isempty(link->bound_to_links)) {
2323 r = link_handle_bound_to_list(link);
2324 if (r < 0)
2325 return r;
2326 } else if (!(link->flags & IFF_UP)) {
2327 r = link_up(link);
2328 if (r < 0) {
2329 link_enter_failed(link);
2330 return r;
2331 }
2332 }
2333
2334 if (link->network->bridge) {
2335 r = link_set_bridge(link);
2336 if (r < 0)
2337 log_link_error_errno(link, r, "Could not set bridge message: %m");
2338
2339 r = link_append_to_master(link, link->network->bridge);
2340 if (r < 0)
2341 log_link_error_errno(link, r, "Failed to add to bridge master's slave list: %m");
2342 }
2343
2344 if (link->network->bond) {
2345 r = link_set_bond(link);
2346 if (r < 0)
2347 log_link_error_errno(link, r, "Could not set bond message: %m");
2348
2349 r = link_append_to_master(link, link->network->bond);
2350 if (r < 0)
2351 log_link_error_errno(link, r, "Failed to add to bond master's slave list: %m");
2352 }
2353
2354 if (link->network->use_br_vlan &&
2355 (link->network->bridge || streq_ptr("bridge", link->kind))) {
2356 r = link_set_bridge_vlan(link);
2357 if (r < 0)
2358 log_link_error_errno(link, r, "Could not set bridge vlan: %m");
2359 }
2360
2361 /* Skip setting up addresses until it gets carrier,
2362 or it would try to set addresses twice,
2363 which is bad for non-idempotent steps. */
2364 if (!link_has_carrier(link) && !link->network->configure_without_carrier)
2365 return 0;
2366
2367 link_set_state(link, LINK_STATE_CONFIGURING);
2368 return link_request_set_addresses(link);
2369 }
2370
2371 static int netdev_join_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
2372 int r;
2373
2374 assert(link);
2375 assert(link->network);
2376 assert(link->enslaving > 0);
2377
2378 link->enslaving--;
2379
2380 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
2381 return 1;
2382
2383 r = sd_netlink_message_get_errno(m);
2384 if (r < 0 && r != -EEXIST) {
2385 log_link_message_warning_errno(link, m, r, "Could not join netdev");
2386 link_enter_failed(link);
2387 return 1;
2388 }
2389
2390 log_link_debug(link, "Joined netdev");
2391
2392 if (link->enslaving == 0) {
2393 r = link_joined(link);
2394 if (r < 0)
2395 link_enter_failed(link);
2396 }
2397
2398 return 1;
2399 }
2400
2401 static int link_enter_join_netdev(Link *link) {
2402 NetDev *netdev;
2403 Iterator i;
2404 int r;
2405
2406 assert(link);
2407 assert(link->network);
2408 assert(link->state == LINK_STATE_INITIALIZED);
2409
2410 link_set_state(link, LINK_STATE_CONFIGURING);
2411
2412 link_dirty(link);
2413 link->enslaving = 0;
2414
2415 if (link->network->bond) {
2416 if (link->network->bond->state == NETDEV_STATE_READY &&
2417 link->network->bond->ifindex == link->master_ifindex)
2418 return link_joined(link);
2419
2420 log_struct(LOG_DEBUG,
2421 LOG_LINK_INTERFACE(link),
2422 LOG_NETDEV_INTERFACE(link->network->bond),
2423 LOG_LINK_MESSAGE(link, "Enslaving by '%s'", link->network->bond->ifname));
2424
2425 link->enslaving++;
2426
2427 r = netdev_join(link->network->bond, link, netdev_join_handler);
2428 if (r < 0) {
2429 log_struct_errno(LOG_WARNING, r,
2430 LOG_LINK_INTERFACE(link),
2431 LOG_NETDEV_INTERFACE(link->network->bond),
2432 LOG_LINK_MESSAGE(link, "Could not join netdev '%s': %m", link->network->bond->ifname));
2433 link_enter_failed(link);
2434 return r;
2435 }
2436 }
2437
2438 if (link->network->bridge) {
2439 log_struct(LOG_DEBUG,
2440 LOG_LINK_INTERFACE(link),
2441 LOG_NETDEV_INTERFACE(link->network->bridge),
2442 LOG_LINK_MESSAGE(link, "Enslaving by '%s'", link->network->bridge->ifname));
2443
2444 link->enslaving++;
2445
2446 r = netdev_join(link->network->bridge, link, netdev_join_handler);
2447 if (r < 0) {
2448 log_struct_errno(LOG_WARNING, r,
2449 LOG_LINK_INTERFACE(link),
2450 LOG_NETDEV_INTERFACE(link->network->bridge),
2451 LOG_LINK_MESSAGE(link, "Could not join netdev '%s': %m", link->network->bridge->ifname));
2452 link_enter_failed(link);
2453 return r;
2454 }
2455 }
2456
2457 if (link->network->vrf) {
2458 log_struct(LOG_DEBUG,
2459 LOG_LINK_INTERFACE(link),
2460 LOG_NETDEV_INTERFACE(link->network->vrf),
2461 LOG_LINK_MESSAGE(link, "Enslaving by '%s'", link->network->vrf->ifname));
2462
2463 link->enslaving++;
2464
2465 r = netdev_join(link->network->vrf, link, netdev_join_handler);
2466 if (r < 0) {
2467 log_struct_errno(LOG_WARNING, r,
2468 LOG_LINK_INTERFACE(link),
2469 LOG_NETDEV_INTERFACE(link->network->vrf),
2470 LOG_LINK_MESSAGE(link, "Could not join netdev '%s': %m", link->network->vrf->ifname));
2471 link_enter_failed(link);
2472 return r;
2473 }
2474 }
2475
2476 HASHMAP_FOREACH(netdev, link->network->stacked_netdevs, i) {
2477
2478 if (netdev->ifindex > 0)
2479 /* Assume already enslaved. */
2480 continue;
2481
2482 if (netdev_get_create_type(netdev) != NETDEV_CREATE_STACKED)
2483 continue;
2484
2485 log_struct(LOG_DEBUG,
2486 LOG_LINK_INTERFACE(link),
2487 LOG_NETDEV_INTERFACE(netdev),
2488 LOG_LINK_MESSAGE(link, "Enslaving by '%s'", netdev->ifname));
2489
2490 link->enslaving++;
2491
2492 r = netdev_join(netdev, link, netdev_join_handler);
2493 if (r < 0) {
2494 log_struct_errno(LOG_WARNING, r,
2495 LOG_LINK_INTERFACE(link),
2496 LOG_NETDEV_INTERFACE(netdev),
2497 LOG_LINK_MESSAGE(link, "Could not join netdev '%s': %m", netdev->ifname));
2498 link_enter_failed(link);
2499 return r;
2500 }
2501 }
2502
2503 if (link->enslaving == 0)
2504 return link_joined(link);
2505
2506 return 0;
2507 }
2508
2509 static int link_set_ipv4_forward(Link *link) {
2510 int r;
2511
2512 if (!link_ipv4_forward_enabled(link))
2513 return 0;
2514
2515 /* We propagate the forwarding flag from one interface to the
2516 * global setting one way. This means: as long as at least one
2517 * interface was configured at any time that had IP forwarding
2518 * enabled the setting will stay on for good. We do this
2519 * primarily to keep IPv4 and IPv6 packet forwarding behaviour
2520 * somewhat in sync (see below). */
2521
2522 r = sysctl_write_ip_property(AF_INET, NULL, "ip_forward", "1");
2523 if (r < 0)
2524 log_link_warning_errno(link, r, "Cannot turn on IPv4 packet forwarding, ignoring: %m");
2525
2526 return 0;
2527 }
2528
2529 static int link_set_ipv6_forward(Link *link) {
2530 int r;
2531
2532 if (!link_ipv6_forward_enabled(link))
2533 return 0;
2534
2535 /* On Linux, the IPv6 stack does not know a per-interface
2536 * packet forwarding setting: either packet forwarding is on
2537 * for all, or off for all. We hence don't bother with a
2538 * per-interface setting, but simply propagate the interface
2539 * flag, if it is set, to the global flag, one-way. Note that
2540 * while IPv4 would allow a per-interface flag, we expose the
2541 * same behaviour there and also propagate the setting from
2542 * one to all, to keep things simple (see above). */
2543
2544 r = sysctl_write_ip_property(AF_INET6, "all", "forwarding", "1");
2545 if (r < 0)
2546 log_link_warning_errno(link, r, "Cannot configure IPv6 packet forwarding, ignoring: %m");
2547
2548 return 0;
2549 }
2550
2551 static int link_set_ipv6_privacy_extensions(Link *link) {
2552 IPv6PrivacyExtensions s;
2553 int r;
2554
2555 s = link_ipv6_privacy_extensions(link);
2556 if (s < 0)
2557 return 0;
2558
2559 r = sysctl_write_ip_property_int(AF_INET6, link->ifname, "use_tempaddr", (int) link->network->ipv6_privacy_extensions);
2560 if (r < 0)
2561 log_link_warning_errno(link, r, "Cannot configure IPv6 privacy extension for interface: %m");
2562
2563 return 0;
2564 }
2565
2566 static int link_set_ipv6_accept_ra(Link *link) {
2567 int r;
2568
2569 /* Make this a NOP if IPv6 is not available */
2570 if (!socket_ipv6_is_supported())
2571 return 0;
2572
2573 if (link->flags & IFF_LOOPBACK)
2574 return 0;
2575
2576 if (!link->network)
2577 return 0;
2578
2579 r = sysctl_write_ip_property(AF_INET6, link->ifname, "accept_ra", "0");
2580 if (r < 0)
2581 log_link_warning_errno(link, r, "Cannot disable kernel IPv6 accept_ra for interface: %m");
2582
2583 return 0;
2584 }
2585
2586 static int link_set_ipv6_dad_transmits(Link *link) {
2587 int r;
2588
2589 /* Make this a NOP if IPv6 is not available */
2590 if (!socket_ipv6_is_supported())
2591 return 0;
2592
2593 if (link->flags & IFF_LOOPBACK)
2594 return 0;
2595
2596 if (!link->network)
2597 return 0;
2598
2599 if (link->network->ipv6_dad_transmits < 0)
2600 return 0;
2601
2602 r = sysctl_write_ip_property_int(AF_INET6, link->ifname, "dad_transmits", link->network->ipv6_dad_transmits);
2603 if (r < 0)
2604 log_link_warning_errno(link, r, "Cannot set IPv6 dad transmits for interface: %m");
2605
2606 return 0;
2607 }
2608
2609 static int link_set_ipv6_hop_limit(Link *link) {
2610 int r;
2611
2612 /* Make this a NOP if IPv6 is not available */
2613 if (!socket_ipv6_is_supported())
2614 return 0;
2615
2616 if (link->flags & IFF_LOOPBACK)
2617 return 0;
2618
2619 if (!link->network)
2620 return 0;
2621
2622 if (link->network->ipv6_hop_limit < 0)
2623 return 0;
2624
2625 r = sysctl_write_ip_property_int(AF_INET6, link->ifname, "hop_limit", link->network->ipv6_hop_limit);
2626 if (r < 0)
2627 log_link_warning_errno(link, r, "Cannot set IPv6 hop limit for interface: %m");
2628
2629 return 0;
2630 }
2631
2632 static int link_set_ipv6_mtu(Link *link) {
2633 int r;
2634
2635 /* Make this a NOP if IPv6 is not available */
2636 if (!socket_ipv6_is_supported())
2637 return 0;
2638
2639 if (link->flags & IFF_LOOPBACK)
2640 return 0;
2641
2642 if (link->network->ipv6_mtu == 0)
2643 return 0;
2644
2645 /* IPv6 protocol requires a minimum MTU of IPV6_MTU_MIN(1280) bytes
2646 * on the interface. Bump up IPv6 MTU bytes to IPV6_MTU_MIN. */
2647 if (link->network->ipv6_mtu < IPV6_MIN_MTU) {
2648 log_link_notice(link, "Bumping IPv6 MTU to "STRINGIFY(IPV6_MIN_MTU)" byte minimum required");
2649 link->network->ipv6_mtu = IPV6_MIN_MTU;
2650 }
2651
2652 r = sysctl_write_ip_property_uint32(AF_INET6, link->ifname, "mtu", link->network->ipv6_mtu);
2653 if (r < 0) {
2654 if (link->mtu < link->network->ipv6_mtu)
2655 log_link_warning(link, "Cannot set IPv6 MTU %"PRIu32" higher than device MTU %"PRIu32,
2656 link->network->ipv6_mtu, link->mtu);
2657 else
2658 log_link_warning_errno(link, r, "Cannot set IPv6 MTU for interface: %m");
2659 }
2660
2661 link->ipv6_mtu_set = true;
2662
2663 return 0;
2664 }
2665
2666 static int link_set_ipv4_accept_local(Link *link) {
2667 int r;
2668
2669 if (link->flags & IFF_LOOPBACK)
2670 return 0;
2671
2672 if (link->network->ipv4_accept_local < 0)
2673 return 0;
2674
2675 r = sysctl_write_ip_property_boolean(AF_INET, link->ifname, "accept_local", link->network->ipv4_accept_local);
2676 if (r < 0)
2677 log_link_warning_errno(link, r, "Cannot set IPv4 accept_local flag for interface: %m");
2678
2679 return 0;
2680 }
2681
2682 static bool link_is_static_address_configured(Link *link, Address *address) {
2683 Address *net_address;
2684
2685 assert(link);
2686 assert(address);
2687
2688 if (!link->network)
2689 return false;
2690
2691 LIST_FOREACH(addresses, net_address, link->network->static_addresses)
2692 if (address_equal(net_address, address))
2693 return true;
2694 else if (address->family == AF_INET6 && net_address->family == AF_INET6 &&
2695 in_addr_equal(AF_INET6, &address->in_addr, &net_address->in_addr_peer) > 0)
2696 return true;
2697
2698 return false;
2699 }
2700
2701 static bool link_is_neighbor_configured(Link *link, Neighbor *neighbor) {
2702 Neighbor *net_neighbor;
2703
2704 assert(link);
2705 assert(neighbor);
2706
2707 if (!link->network)
2708 return false;
2709
2710 LIST_FOREACH(neighbors, net_neighbor, link->network->neighbors)
2711 if (neighbor_equal(net_neighbor, neighbor))
2712 return true;
2713
2714 return false;
2715 }
2716
2717 static bool link_is_static_route_configured(Link *link, Route *route) {
2718 Route *net_route;
2719
2720 assert(link);
2721 assert(route);
2722
2723 if (!link->network)
2724 return false;
2725
2726 LIST_FOREACH(routes, net_route, link->network->static_routes)
2727 if (route_equal(net_route, route))
2728 return true;
2729
2730 return false;
2731 }
2732
2733 static bool link_address_is_dynamic(Link *link, Address *address) {
2734 Route *route;
2735 Iterator i;
2736
2737 assert(link);
2738 assert(address);
2739
2740 if (address->cinfo.ifa_prefered != CACHE_INFO_INFINITY_LIFE_TIME)
2741 return true;
2742
2743 /* Even when the address is leased from a DHCP server, networkd assign the address
2744 * without lifetime when KeepConfiguration=dhcp. So, let's check that we have
2745 * corresponding routes with RTPROT_DHCP. */
2746 SET_FOREACH(route, link->routes_foreign, i) {
2747 if (route->protocol != RTPROT_DHCP)
2748 continue;
2749
2750 if (address->family != route->family)
2751 continue;
2752
2753 if (in_addr_equal(address->family, &address->in_addr, &route->prefsrc))
2754 return true;
2755 }
2756
2757 return false;
2758 }
2759
2760 static int link_enumerate_ipv6_tentative_addresses(Link *link) {
2761 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL, *reply = NULL;
2762 sd_netlink_message *addr;
2763 int r;
2764
2765 assert(link);
2766 assert(link->manager);
2767 assert(link->manager->rtnl);
2768
2769 r = sd_rtnl_message_new_addr(link->manager->rtnl, &req, RTM_GETADDR, 0, AF_INET6);
2770 if (r < 0)
2771 return r;
2772
2773 r = sd_netlink_call(link->manager->rtnl, req, 0, &reply);
2774 if (r < 0)
2775 return r;
2776
2777 for (addr = reply; addr; addr = sd_netlink_message_next(addr)) {
2778 unsigned char flags;
2779 int ifindex;
2780
2781 r = sd_rtnl_message_addr_get_ifindex(addr, &ifindex);
2782 if (r < 0) {
2783 log_link_warning_errno(link, r, "rtnl: invalid ifindex, ignoring: %m");
2784 continue;
2785 } else if (link->ifindex != ifindex)
2786 continue;
2787
2788 r = sd_rtnl_message_addr_get_flags(addr, &flags);
2789 if (r < 0) {
2790 log_link_warning_errno(link, r, "rtnl: received address message with invalid flags, ignoring: %m");
2791 continue;
2792 } else if (!(flags & IFA_F_TENTATIVE))
2793 continue;
2794
2795 log_link_debug(link, "Found tentative ipv6 link-local address");
2796 (void) manager_rtnl_process_address(link->manager->rtnl, addr, link->manager);
2797 }
2798
2799 return 0;
2800 }
2801
2802 static int link_drop_foreign_config(Link *link) {
2803 Address *address;
2804 Neighbor *neighbor;
2805 Route *route;
2806 Iterator i;
2807 int r;
2808
2809 /* The kernel doesn't notify us about tentative addresses;
2810 * so if ipv6ll is disabled, we need to enumerate them now so we can drop them below */
2811 if (!link_ipv6ll_enabled(link)) {
2812 r = link_enumerate_ipv6_tentative_addresses(link);
2813 if (r < 0)
2814 return r;
2815 }
2816
2817 SET_FOREACH(address, link->addresses_foreign, i) {
2818 /* we consider IPv6LL addresses to be managed by the kernel */
2819 if (address->family == AF_INET6 && in_addr_is_link_local(AF_INET6, &address->in_addr) == 1 && link_ipv6ll_enabled(link))
2820 continue;
2821
2822 if (link_address_is_dynamic(link, address)) {
2823 if (link->network && FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DHCP))
2824 continue;
2825 } else if (link->network && FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_STATIC))
2826 continue;
2827
2828 if (link_is_static_address_configured(link, address)) {
2829 r = address_add(link, address->family, &address->in_addr, address->prefixlen, NULL);
2830 if (r < 0)
2831 return log_link_error_errno(link, r, "Failed to add address: %m");
2832 } else {
2833 r = address_remove(address, link, NULL);
2834 if (r < 0)
2835 return r;
2836 }
2837 }
2838
2839 SET_FOREACH(neighbor, link->neighbors_foreign, i) {
2840 if (link_is_neighbor_configured(link, neighbor)) {
2841 r = neighbor_add(link, neighbor->family, &neighbor->in_addr, &neighbor->lladdr, neighbor->lladdr_size, NULL);
2842 if (r < 0)
2843 return r;
2844 } else {
2845 r = neighbor_remove(neighbor, link, NULL);
2846 if (r < 0)
2847 return r;
2848 }
2849 }
2850
2851 SET_FOREACH(route, link->routes_foreign, i) {
2852 /* do not touch routes managed by the kernel */
2853 if (route->protocol == RTPROT_KERNEL)
2854 continue;
2855
2856 /* do not touch multicast route added by kernel */
2857 /* FIXME: Why the kernel adds this route with protocol RTPROT_BOOT??? We need to investigate that.
2858 * https://tools.ietf.org/html/rfc4862#section-5.4 may explain why. */
2859 if (route->protocol == RTPROT_BOOT &&
2860 route->family == AF_INET6 &&
2861 route->dst_prefixlen == 8 &&
2862 in_addr_equal(AF_INET6, &route->dst, &(union in_addr_union) { .in6 = {{{ 0xff,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }}} }))
2863 continue;
2864
2865 if (route->protocol == RTPROT_STATIC && link->network &&
2866 FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_STATIC))
2867 continue;
2868
2869 if (route->protocol == RTPROT_DHCP && link->network &&
2870 FLAGS_SET(link->network->keep_configuration, KEEP_CONFIGURATION_DHCP))
2871 continue;
2872
2873 if (link_is_static_route_configured(link, route)) {
2874 r = route_add(link, route, NULL);
2875 if (r < 0)
2876 return r;
2877 } else {
2878 r = route_remove(route, link, NULL);
2879 if (r < 0)
2880 return r;
2881 }
2882 }
2883
2884 return 0;
2885 }
2886
2887 static int link_drop_config(Link *link) {
2888 Address *address, *pool_address;
2889 Neighbor *neighbor;
2890 Route *route;
2891 Iterator i;
2892 int r;
2893
2894 SET_FOREACH(address, link->addresses, i) {
2895 /* we consider IPv6LL addresses to be managed by the kernel */
2896 if (address->family == AF_INET6 && in_addr_is_link_local(AF_INET6, &address->in_addr) == 1 && link_ipv6ll_enabled(link))
2897 continue;
2898
2899 r = address_remove(address, link, NULL);
2900 if (r < 0)
2901 return r;
2902
2903 /* If this address came from an address pool, clean up the pool */
2904 LIST_FOREACH(addresses, pool_address, link->pool_addresses) {
2905 if (address_equal(address, pool_address)) {
2906 LIST_REMOVE(addresses, link->pool_addresses, pool_address);
2907 address_free(pool_address);
2908 break;
2909 }
2910 }
2911 }
2912
2913 SET_FOREACH(neighbor, link->neighbors, i) {
2914 r = neighbor_remove(neighbor, link, NULL);
2915 if (r < 0)
2916 return r;
2917 }
2918
2919 SET_FOREACH(route, link->routes, i) {
2920 /* do not touch routes managed by the kernel */
2921 if (route->protocol == RTPROT_KERNEL)
2922 continue;
2923
2924 r = route_remove(route, link, NULL);
2925 if (r < 0)
2926 return r;
2927 }
2928
2929 ndisc_flush(link);
2930
2931 return 0;
2932 }
2933
2934 static int link_configure_ipv4_dad(Link *link) {
2935 Address *address;
2936 int r;
2937
2938 assert(link);
2939 assert(link->network);
2940
2941 LIST_FOREACH(addresses, address, link->network->static_addresses)
2942 if (address->family == AF_INET &&
2943 FLAGS_SET(address->duplicate_address_detection, ADDRESS_FAMILY_IPV4)) {
2944 r = configure_ipv4_duplicate_address_detection(link, address);
2945 if (r < 0)
2946 return log_link_error_errno(link, r, "Failed to configure IPv4ACD: %m");
2947 }
2948
2949 return 0;
2950 }
2951
2952 static int link_configure_traffic_control(Link *link) {
2953 TrafficControl *tc;
2954 Iterator i;
2955 int r;
2956
2957 link->tc_configured = false;
2958 link->tc_messages = 0;
2959
2960 ORDERED_HASHMAP_FOREACH(tc, link->network->tc_by_section, i) {
2961 r = traffic_control_configure(link, tc);
2962 if (r < 0)
2963 return r;
2964 }
2965
2966 if (link->tc_messages == 0)
2967 link->tc_configured = true;
2968 else
2969 log_link_debug(link, "Configuring traffic control");
2970
2971 return 0;
2972 }
2973
2974 static int link_configure_sr_iov(Link *link) {
2975 SRIOV *sr_iov;
2976 Iterator i;
2977 int r;
2978
2979 link->sr_iov_configured = false;
2980 link->sr_iov_messages = 0;
2981
2982 ORDERED_HASHMAP_FOREACH(sr_iov, link->network->sr_iov_by_section, i) {
2983 r = sr_iov_configure(link, sr_iov);
2984 if (r < 0)
2985 return r;
2986 }
2987
2988 if (link->sr_iov_messages == 0)
2989 link->sr_iov_configured = true;
2990 else
2991 log_link_debug(link, "Configuring SR-IOV");
2992
2993 return 0;
2994 }
2995
2996 static int link_configure(Link *link) {
2997 int r;
2998
2999 assert(link);
3000 assert(link->network);
3001 assert(link->state == LINK_STATE_INITIALIZED);
3002
3003 r = link_configure_traffic_control(link);
3004 if (r < 0)
3005 return r;
3006
3007 r = link_configure_sr_iov(link);
3008 if (r < 0)
3009 return r;
3010
3011 if (link->iftype == ARPHRD_CAN)
3012 return link_configure_can(link);
3013
3014 /* If IPv6 configured that is static IPv6 address and IPv6LL autoconfiguration is enabled
3015 * for this interface, then enable IPv6 */
3016 (void) link_update_ipv6_sysctl(link);
3017
3018 r = link_set_proxy_arp(link);
3019 if (r < 0)
3020 return r;
3021
3022 r = ipv6_proxy_ndp_addresses_configure(link);
3023 if (r < 0)
3024 return r;
3025
3026 r = link_set_ipv4_forward(link);
3027 if (r < 0)
3028 return r;
3029
3030 r = link_set_ipv6_forward(link);
3031 if (r < 0)
3032 return r;
3033
3034 r = link_set_ipv6_privacy_extensions(link);
3035 if (r < 0)
3036 return r;
3037
3038 r = link_set_ipv6_accept_ra(link);
3039 if (r < 0)
3040 return r;
3041
3042 r = link_set_ipv6_dad_transmits(link);
3043 if (r < 0)
3044 return r;
3045
3046 r = link_set_ipv6_hop_limit(link);
3047 if (r < 0)
3048 return r;
3049
3050 r = link_set_ipv4_accept_local(link);
3051 if (r < 0)
3052 return r;
3053
3054 r = link_set_flags(link);
3055 if (r < 0)
3056 return r;
3057
3058 r = link_set_group(link);
3059 if (r < 0)
3060 return r;
3061
3062 if (link_ipv4ll_enabled(link, ADDRESS_FAMILY_IPV4 | ADDRESS_FAMILY_FALLBACK_IPV4)) {
3063 r = ipv4ll_configure(link);
3064 if (r < 0)
3065 return r;
3066 }
3067
3068 if (link_dhcp4_enabled(link)) {
3069 r = dhcp4_set_promote_secondaries(link);
3070 if (r < 0)
3071 return r;
3072
3073 r = dhcp4_configure(link);
3074 if (r < 0)
3075 return r;
3076 }
3077
3078 if (link_dhcp4_server_enabled(link)) {
3079 r = sd_dhcp_server_new(&link->dhcp_server, link->ifindex);
3080 if (r < 0)
3081 return r;
3082
3083 r = sd_dhcp_server_attach_event(link->dhcp_server, NULL, 0);
3084 if (r < 0)
3085 return r;
3086 }
3087
3088 if (link_dhcp6_enabled(link) ||
3089 link_ipv6_accept_ra_enabled(link)) {
3090 r = dhcp6_configure(link);
3091 if (r < 0)
3092 return r;
3093 }
3094
3095 if (link_ipv6_accept_ra_enabled(link)) {
3096 r = ndisc_configure(link);
3097 if (r < 0)
3098 return r;
3099 }
3100
3101 if (link_radv_enabled(link)) {
3102 r = radv_configure(link);
3103 if (r < 0)
3104 return r;
3105 }
3106
3107 if (link_lldp_rx_enabled(link)) {
3108 r = link_lldp_rx_configure(link);
3109 if (r < 0)
3110 return r;
3111 }
3112
3113 r = link_configure_mtu(link);
3114 if (r < 0)
3115 return r;
3116
3117 r = link_configure_addrgen_mode(link);
3118 if (r < 0)
3119 return r;
3120
3121 r = link_configure_ipv4_dad(link);
3122 if (r < 0)
3123 return r;
3124
3125 return link_configure_continue(link);
3126 }
3127
3128 /* The configuration continues in this separate function, instead of
3129 * including this in the above link_configure() function, for two
3130 * reasons:
3131 * 1) some devices reset the link when the mtu is set, which caused
3132 * an infinite loop here in networkd; see:
3133 * https://github.com/systemd/systemd/issues/6593
3134 * https://github.com/systemd/systemd/issues/9831
3135 * 2) if ipv6ll is disabled, then bringing the interface up must be
3136 * delayed until after we get confirmation from the kernel that
3137 * the addr_gen_mode parameter has been set (via netlink), see:
3138 * https://github.com/systemd/systemd/issues/13882
3139 */
3140 static int link_configure_continue(Link *link) {
3141 int r;
3142
3143 assert(link);
3144 assert(link->network);
3145 assert(link->state == LINK_STATE_INITIALIZED);
3146
3147 if (link->setting_mtu || link->setting_genmode)
3148 return 0;
3149
3150 /* Drop foreign config, but ignore loopback or critical devices.
3151 * We do not want to remove loopback address or addresses used for root NFS. */
3152 if (!(link->flags & IFF_LOOPBACK) &&
3153 link->network->keep_configuration != KEEP_CONFIGURATION_YES) {
3154 r = link_drop_foreign_config(link);
3155 if (r < 0)
3156 return r;
3157 }
3158
3159 /* The kernel resets ipv6 mtu after changing device mtu;
3160 * we must set this here, after we've set device mtu */
3161 r = link_set_ipv6_mtu(link);
3162 if (r < 0)
3163 return r;
3164
3165 if (link_has_carrier(link) || link->network->configure_without_carrier) {
3166 r = link_acquire_conf(link);
3167 if (r < 0)
3168 return r;
3169 }
3170
3171 return link_enter_join_netdev(link);
3172 }
3173
3174 static int duid_set_uuid(DUID *duid, sd_id128_t uuid) {
3175 assert(duid);
3176
3177 if (duid->raw_data_len > 0)
3178 return 0;
3179
3180 if (duid->type != DUID_TYPE_UUID)
3181 return -EINVAL;
3182
3183 memcpy(&duid->raw_data, &uuid, sizeof(sd_id128_t));
3184 duid->raw_data_len = sizeof(sd_id128_t);
3185
3186 return 1;
3187 }
3188
3189 int get_product_uuid_handler(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
3190 Manager *manager = userdata;
3191 const sd_bus_error *e;
3192 const void *a;
3193 size_t sz;
3194 DUID *duid;
3195 Link *link;
3196 int r;
3197
3198 assert(m);
3199 assert(manager);
3200
3201 e = sd_bus_message_get_error(m);
3202 if (e) {
3203 log_error_errno(sd_bus_error_get_errno(e),
3204 "Could not get product UUID. Falling back to use machine-app-specific ID as DUID-UUID: %s",
3205 e->message);
3206 goto configure;
3207 }
3208
3209 r = sd_bus_message_read_array(m, 'y', &a, &sz);
3210 if (r < 0)
3211 goto configure;
3212
3213 if (sz != sizeof(sd_id128_t)) {
3214 log_error("Invalid product UUID. Falling back to use machine-app-specific ID as DUID-UUID.");
3215 goto configure;
3216 }
3217
3218 memcpy(&manager->product_uuid, a, sz);
3219 while ((duid = set_steal_first(manager->duids_requesting_uuid)))
3220 (void) duid_set_uuid(duid, manager->product_uuid);
3221
3222 manager->duids_requesting_uuid = set_free(manager->duids_requesting_uuid);
3223
3224 configure:
3225 while ((link = set_steal_first(manager->links_requesting_uuid))) {
3226 link_unref(link);
3227
3228 r = link_configure(link);
3229 if (r < 0)
3230 link_enter_failed(link);
3231 }
3232
3233 manager->links_requesting_uuid = set_free(manager->links_requesting_uuid);
3234
3235 /* To avoid calling GetProductUUID() bus method so frequently, set the flag below
3236 * even if the method fails. */
3237 manager->has_product_uuid = true;
3238
3239 return 1;
3240 }
3241
3242 static bool link_requires_uuid(Link *link) {
3243 const DUID *duid;
3244
3245 assert(link);
3246 assert(link->manager);
3247 assert(link->network);
3248
3249 duid = link_get_duid(link);
3250 if (duid->type != DUID_TYPE_UUID || duid->raw_data_len != 0)
3251 return false;
3252
3253 if (link_dhcp4_enabled(link) && IN_SET(link->network->dhcp_client_identifier, DHCP_CLIENT_ID_DUID, DHCP_CLIENT_ID_DUID_ONLY))
3254 return true;
3255
3256 if (link_dhcp6_enabled(link) || link_ipv6_accept_ra_enabled(link))
3257 return true;
3258
3259 return false;
3260 }
3261
3262 static int link_configure_duid(Link *link) {
3263 Manager *m;
3264 DUID *duid;
3265 int r;
3266
3267 assert(link);
3268 assert(link->manager);
3269 assert(link->network);
3270
3271 m = link->manager;
3272 duid = link_get_duid(link);
3273
3274 if (!link_requires_uuid(link))
3275 return 1;
3276
3277 if (m->has_product_uuid) {
3278 (void) duid_set_uuid(duid, m->product_uuid);
3279 return 1;
3280 }
3281
3282 if (!m->links_requesting_uuid) {
3283 r = manager_request_product_uuid(m, link);
3284 if (r < 0) {
3285 if (r == -ENOMEM)
3286 return r;
3287
3288 log_link_warning_errno(link, r,
3289 "Failed to get product UUID. Falling back to use machine-app-specific ID as DUID-UUID: %m");
3290 return 1;
3291 }
3292 } else {
3293 r = set_put(m->links_requesting_uuid, link);
3294 if (r < 0)
3295 return log_oom();
3296 if (r > 0)
3297 link_ref(link);
3298
3299 r = set_put(m->duids_requesting_uuid, duid);
3300 if (r < 0)
3301 return log_oom();
3302 }
3303
3304 return 0;
3305 }
3306
3307 static int link_reconfigure_internal(Link *link, sd_netlink_message *m, bool force) {
3308 Network *network;
3309 int r;
3310
3311 if (m) {
3312 _cleanup_strv_free_ char **s = NULL;
3313
3314 r = sd_netlink_message_get_errno(m);
3315 if (r < 0)
3316 return r;
3317
3318 r = sd_netlink_message_read_strv(m, IFLA_PROP_LIST, IFLA_ALT_IFNAME, &s);
3319 if (r < 0 && r != -ENODATA)
3320 return r;
3321
3322 strv_free_and_replace(link->alternative_names, s);
3323 }
3324
3325 r = network_get(link->manager, link->iftype, link->sd_device,
3326 link->ifname, link->alternative_names, link->driver,
3327 &link->mac, &link->permanent_mac,
3328 link->wlan_iftype, link->ssid, &link->bssid, &network);
3329 if (r == -ENOENT) {
3330 link_enter_unmanaged(link);
3331 return 0;
3332 } else if (r == 0 && network->unmanaged) {
3333 link_enter_unmanaged(link);
3334 return 0;
3335 } else if (r < 0)
3336 return r;
3337
3338 if (link->network == network && !force)
3339 return 0;
3340
3341 log_link_info(link, "Re-configuring with %s", network->filename);
3342
3343 /* Dropping old .network file */
3344 r = link_stop_clients(link, false);
3345 if (r < 0)
3346 return r;
3347
3348 if (link_dhcp4_server_enabled(link))
3349 (void) sd_dhcp_server_stop(link->dhcp_server);
3350
3351 r = link_drop_config(link);
3352 if (r < 0)
3353 return r;
3354
3355 if (!IN_SET(link->state, LINK_STATE_UNMANAGED, LINK_STATE_PENDING, LINK_STATE_INITIALIZED)) {
3356 log_link_debug(link, "State is %s, dropping config", link_state_to_string(link->state));
3357 r = link_drop_foreign_config(link);
3358 if (r < 0)
3359 return r;
3360 }
3361
3362 link_free_carrier_maps(link);
3363 link_free_engines(link);
3364 link->network = network_unref(link->network);
3365
3366 /* Then, apply new .network file */
3367 r = network_apply(network, link);
3368 if (r < 0)
3369 return r;
3370
3371 r = link_new_carrier_maps(link);
3372 if (r < 0)
3373 return r;
3374
3375 link_set_state(link, LINK_STATE_INITIALIZED);
3376 link_dirty(link);
3377
3378 /* link_configure_duid() returns 0 if it requests product UUID. In that case,
3379 * link_configure() is called later asynchronously. */
3380 r = link_configure_duid(link);
3381 if (r <= 0)
3382 return r;
3383
3384 r = link_configure(link);
3385 if (r < 0)
3386 return r;
3387
3388 return 0;
3389 }
3390
3391 static int link_reconfigure_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
3392 int r;
3393
3394 r = link_reconfigure_internal(link, m, false);
3395 if (r < 0)
3396 link_enter_failed(link);
3397
3398 return 1;
3399 }
3400
3401 static int link_force_reconfigure_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
3402 int r;
3403
3404 r = link_reconfigure_internal(link, m, true);
3405 if (r < 0)
3406 link_enter_failed(link);
3407
3408 return 1;
3409 }
3410
3411 int link_reconfigure(Link *link, bool force) {
3412 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
3413 int r;
3414
3415 if (IN_SET(link->state, LINK_STATE_PENDING, LINK_STATE_LINGER))
3416 return 0;
3417
3418 r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_GETLINK,
3419 link->ifindex);
3420 if (r < 0)
3421 return r;
3422
3423 r = netlink_call_async(link->manager->rtnl, NULL, req,
3424 force ? link_force_reconfigure_handler : link_reconfigure_handler,
3425 link_netlink_destroy_callback, link);
3426 if (r < 0)
3427 return r;
3428
3429 link_ref(link);
3430
3431 return 0;
3432 }
3433
3434 static int link_initialized_and_synced(Link *link) {
3435 Network *network;
3436 int r;
3437
3438 assert(link);
3439 assert(link->ifname);
3440 assert(link->manager);
3441
3442 /* We may get called either from the asynchronous netlink callback,
3443 * or directly for link_add() if running in a container. See link_add(). */
3444 if (!IN_SET(link->state, LINK_STATE_PENDING, LINK_STATE_INITIALIZED))
3445 return 0;
3446
3447 log_link_debug(link, "Link state is up-to-date");
3448 link_set_state(link, LINK_STATE_INITIALIZED);
3449
3450 r = link_new_bound_by_list(link);
3451 if (r < 0)
3452 return r;
3453
3454 r = link_handle_bound_by_list(link);
3455 if (r < 0)
3456 return r;
3457
3458 if (!link->network) {
3459 r = wifi_get_info(link);
3460 if (r < 0)
3461 return r;
3462
3463 r = network_get(link->manager, link->iftype, link->sd_device,
3464 link->ifname, link->alternative_names, link->driver,
3465 &link->mac, &link->permanent_mac,
3466 link->wlan_iftype, link->ssid, &link->bssid, &network);
3467 if (r == -ENOENT) {
3468 link_enter_unmanaged(link);
3469 return 0;
3470 } else if (r == 0 && network->unmanaged) {
3471 link_enter_unmanaged(link);
3472 return 0;
3473 } else if (r < 0)
3474 return r;
3475
3476 if (link->flags & IFF_LOOPBACK) {
3477 if (network->link_local != ADDRESS_FAMILY_NO)
3478 log_link_debug(link, "Ignoring link-local autoconfiguration for loopback link");
3479
3480 if (network->dhcp != ADDRESS_FAMILY_NO)
3481 log_link_debug(link, "Ignoring DHCP clients for loopback link");
3482
3483 if (network->dhcp_server)
3484 log_link_debug(link, "Ignoring DHCP server for loopback link");
3485 }
3486
3487 r = network_apply(network, link);
3488 if (r < 0)
3489 return r;
3490 }
3491
3492 r = link_new_bound_to_list(link);
3493 if (r < 0)
3494 return r;
3495
3496 /* link_configure_duid() returns 0 if it requests product UUID. In that case,
3497 * link_configure() is called later asynchronously. */
3498 r = link_configure_duid(link);
3499 if (r <= 0)
3500 return r;
3501
3502 r = link_configure(link);
3503 if (r < 0)
3504 return r;
3505
3506 return 0;
3507 }
3508
3509 static int link_initialized_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
3510 _cleanup_strv_free_ char **s = NULL;
3511 int r;
3512
3513 r = sd_netlink_message_get_errno(m);
3514 if (r < 0) {
3515 log_link_warning_errno(link, r, "Failed to wait for the interface to be initialized: %m");
3516 link_enter_failed(link);
3517 return 0;
3518 }
3519
3520 r = sd_netlink_message_read_strv(m, IFLA_PROP_LIST, IFLA_ALT_IFNAME, &s);
3521 if (r < 0 && r != -ENODATA) {
3522 link_enter_failed(link);
3523 return 0;
3524 }
3525
3526 strv_free_and_replace(link->alternative_names, s);
3527
3528 r = link_initialized_and_synced(link);
3529 if (r < 0)
3530 link_enter_failed(link);
3531 return 1;
3532 }
3533
3534 int link_initialized(Link *link, sd_device *device) {
3535 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
3536 int r;
3537
3538 assert(link);
3539 assert(link->manager);
3540 assert(link->manager->rtnl);
3541 assert(device);
3542
3543 if (link->state != LINK_STATE_PENDING)
3544 return 0;
3545
3546 if (link->sd_device)
3547 return 0;
3548
3549 log_link_debug(link, "udev initialized link");
3550 link_set_state(link, LINK_STATE_INITIALIZED);
3551
3552 link->sd_device = sd_device_ref(device);
3553
3554 /* udev has initialized the link, but we don't know if we have yet
3555 * processed the NEWLINK messages with the latest state. Do a GETLINK,
3556 * when it returns we know that the pending NEWLINKs have already been
3557 * processed and that we are up-to-date */
3558
3559 r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_GETLINK,
3560 link->ifindex);
3561 if (r < 0)
3562 return r;
3563
3564 r = netlink_call_async(link->manager->rtnl, NULL, req, link_initialized_handler,
3565 link_netlink_destroy_callback, link);
3566 if (r < 0)
3567 return r;
3568
3569 link_ref(link);
3570
3571 return 0;
3572 }
3573
3574 static int link_load(Link *link) {
3575 _cleanup_free_ char *network_file = NULL,
3576 *addresses = NULL,
3577 *routes = NULL,
3578 *dhcp4_address = NULL,
3579 *ipv4ll_address = NULL;
3580 union in_addr_union address;
3581 int r;
3582
3583 assert(link);
3584
3585 r = parse_env_file(NULL, link->state_file,
3586 "NETWORK_FILE", &network_file,
3587 "ADDRESSES", &addresses,
3588 "ROUTES", &routes,
3589 "DHCP4_ADDRESS", &dhcp4_address,
3590 "IPV4LL_ADDRESS", &ipv4ll_address);
3591 if (r < 0 && r != -ENOENT)
3592 return log_link_error_errno(link, r, "Failed to read %s: %m", link->state_file);
3593
3594 if (network_file) {
3595 Network *network;
3596 char *suffix;
3597
3598 /* drop suffix */
3599 suffix = strrchr(network_file, '.');
3600 if (!suffix) {
3601 log_link_debug(link, "Failed to get network name from %s", network_file);
3602 goto network_file_fail;
3603 }
3604 *suffix = '\0';
3605
3606 r = network_get_by_name(link->manager, basename(network_file), &network);
3607 if (r < 0) {
3608 log_link_debug_errno(link, r, "Failed to get network %s: %m", basename(network_file));
3609 goto network_file_fail;
3610 }
3611
3612 r = network_apply(network, link);
3613 if (r < 0)
3614 return log_link_error_errno(link, r, "Failed to apply network %s: %m", basename(network_file));
3615 }
3616
3617 network_file_fail:
3618
3619 for (const char *p = addresses; p; ) {
3620 _cleanup_free_ char *address_str = NULL;
3621 char *prefixlen_str;
3622 int family;
3623 unsigned char prefixlen;
3624
3625 r = extract_first_word(&p, &address_str, NULL, 0);
3626 if (r < 0)
3627 log_link_warning_errno(link, r, "failed to parse ADDRESSES: %m");
3628 if (r <= 0)
3629 break;
3630
3631 prefixlen_str = strchr(address_str, '/');
3632 if (!prefixlen_str) {
3633 log_link_debug(link, "Failed to parse address and prefix length %s", address_str);
3634 continue;
3635 }
3636 *prefixlen_str++ = '\0';
3637
3638 r = sscanf(prefixlen_str, "%hhu", &prefixlen);
3639 if (r != 1) {
3640 log_link_error(link, "Failed to parse prefixlen %s", prefixlen_str);
3641 continue;
3642 }
3643
3644 r = in_addr_from_string_auto(address_str, &family, &address);
3645 if (r < 0) {
3646 log_link_debug_errno(link, r, "Failed to parse address %s: %m", address_str);
3647 continue;
3648 }
3649
3650 r = address_add(link, family, &address, prefixlen, NULL);
3651 if (r < 0)
3652 return log_link_error_errno(link, r, "Failed to add address: %m");
3653 }
3654
3655 for (const char *p = routes; p; ) {
3656 _cleanup_(sd_event_source_unrefp) sd_event_source *expire = NULL;
3657 _cleanup_(route_freep) Route *tmp = NULL;
3658 _cleanup_free_ char *route_str = NULL;
3659 char *prefixlen_str;
3660 Route *route;
3661
3662 r = extract_first_word(&p, &route_str, NULL, 0);
3663 if (r < 0)
3664 log_link_debug_errno(link, r, "failed to parse ROUTES: %m");
3665 if (r <= 0)
3666 break;
3667
3668 prefixlen_str = strchr(route_str, '/');
3669 if (!prefixlen_str) {
3670 log_link_debug(link, "Failed to parse route %s", route_str);
3671 continue;
3672 }
3673 *prefixlen_str++ = '\0';
3674
3675 r = route_new(&tmp);
3676 if (r < 0)
3677 return log_oom();
3678
3679 r = sscanf(prefixlen_str,
3680 "%hhu/%hhu/%"SCNu32"/%"PRIu32"/"USEC_FMT,
3681 &tmp->dst_prefixlen,
3682 &tmp->tos,
3683 &tmp->priority,
3684 &tmp->table,
3685 &tmp->lifetime);
3686 if (r != 5) {
3687 log_link_debug(link,
3688 "Failed to parse destination prefix length, tos, priority, table or expiration %s",
3689 prefixlen_str);
3690 continue;
3691 }
3692
3693 r = in_addr_from_string_auto(route_str, &tmp->family, &tmp->dst);
3694 if (r < 0) {
3695 log_link_debug_errno(link, r, "Failed to parse route destination %s: %m", route_str);
3696 continue;
3697 }
3698
3699 r = route_add(link, tmp, &route);
3700 if (r < 0)
3701 return log_link_error_errno(link, r, "Failed to add route: %m");
3702
3703 if (route->lifetime != USEC_INFINITY && !kernel_route_expiration_supported()) {
3704 r = sd_event_add_time(link->manager->event, &expire,
3705 clock_boottime_or_monotonic(),
3706 route->lifetime, 0, route_expire_handler, route);
3707 if (r < 0)
3708 log_link_warning_errno(link, r, "Could not arm route expiration handler: %m");
3709 }
3710
3711 sd_event_source_unref(route->expire);
3712 route->expire = TAKE_PTR(expire);
3713 }
3714
3715 if (dhcp4_address) {
3716 r = in_addr_from_string(AF_INET, dhcp4_address, &address);
3717 if (r < 0) {
3718 log_link_debug_errno(link, r, "Failed to parse DHCPv4 address %s: %m", dhcp4_address);
3719 goto dhcp4_address_fail;
3720 }
3721
3722 r = sd_dhcp_client_new(&link->dhcp_client, link->network ? link->network->dhcp_anonymize : 0);
3723 if (r < 0)
3724 return log_link_error_errno(link, r, "Failed to create DHCPv4 client: %m");
3725
3726 r = sd_dhcp_client_attach_event(link->dhcp_client, NULL, 0);
3727 if (r < 0)
3728 return log_link_error_errno(link, r, "Failed to attach DHCPv4 event: %m");
3729
3730 r = sd_dhcp_client_set_request_address(link->dhcp_client, &address.in);
3731 if (r < 0)
3732 return log_link_error_errno(link, r, "Failed to set initial DHCPv4 address %s: %m", dhcp4_address);
3733 }
3734
3735 dhcp4_address_fail:
3736
3737 if (ipv4ll_address) {
3738 r = in_addr_from_string(AF_INET, ipv4ll_address, &address);
3739 if (r < 0) {
3740 log_link_debug_errno(link, r, "Failed to parse IPv4LL address %s: %m", ipv4ll_address);
3741 goto ipv4ll_address_fail;
3742 }
3743
3744 r = sd_ipv4ll_new(&link->ipv4ll);
3745 if (r < 0)
3746 return log_link_error_errno(link, r, "Failed to create IPv4LL client: %m");
3747
3748 r = sd_ipv4ll_attach_event(link->ipv4ll, NULL, 0);
3749 if (r < 0)
3750 return log_link_error_errno(link, r, "Failed to attach IPv4LL event: %m");
3751
3752 r = sd_ipv4ll_set_address(link->ipv4ll, &address.in);
3753 if (r < 0)
3754 return log_link_error_errno(link, r, "Failed to set initial IPv4LL address %s: %m", ipv4ll_address);
3755 }
3756
3757 ipv4ll_address_fail:
3758
3759 return 0;
3760 }
3761
3762 int link_add(Manager *m, sd_netlink_message *message, Link **ret) {
3763 _cleanup_(sd_device_unrefp) sd_device *device = NULL;
3764 char ifindex_str[2 + DECIMAL_STR_MAX(int)];
3765 Link *link;
3766 int r;
3767
3768 assert(m);
3769 assert(m->rtnl);
3770 assert(message);
3771 assert(ret);
3772
3773 r = link_new(m, message, ret);
3774 if (r < 0)
3775 return r;
3776
3777 link = *ret;
3778
3779 log_link_debug(link, "Link %d added", link->ifindex);
3780
3781 r = link_load(link);
3782 if (r < 0)
3783 return r;
3784
3785 if (path_is_read_only_fs("/sys") <= 0) {
3786 /* udev should be around */
3787 sprintf(ifindex_str, "n%d", link->ifindex);
3788 r = sd_device_new_from_device_id(&device, ifindex_str);
3789 if (r < 0) {
3790 log_link_warning_errno(link, r, "Could not find device, waiting for device initialization: %m");
3791 return 0;
3792 }
3793
3794 r = sd_device_get_is_initialized(device);
3795 if (r < 0) {
3796 log_link_warning_errno(link, r, "Could not determine whether the device is initialized: %m");
3797 goto failed;
3798 }
3799 if (r == 0) {
3800 /* not yet ready */
3801 log_link_debug(link, "link pending udev initialization...");
3802 return 0;
3803 }
3804
3805 r = device_is_renaming(device);
3806 if (r < 0) {
3807 log_link_warning_errno(link, r, "Failed to determine the device is being renamed: %m");
3808 goto failed;
3809 }
3810 if (r > 0) {
3811 log_link_debug(link, "Interface is being renamed, pending initialization.");
3812 return 0;
3813 }
3814
3815 r = link_initialized(link, device);
3816 if (r < 0)
3817 goto failed;
3818 } else {
3819 r = link_initialized_and_synced(link);
3820 if (r < 0)
3821 goto failed;
3822 }
3823
3824 return 0;
3825 failed:
3826 link_enter_failed(link);
3827 return r;
3828 }
3829
3830 int link_ipv6ll_gained(Link *link, const struct in6_addr *address) {
3831 int r;
3832
3833 assert(link);
3834
3835 log_link_info(link, "Gained IPv6LL");
3836
3837 link->ipv6ll_address = *address;
3838 link_check_ready(link);
3839
3840 if (IN_SET(link->state, LINK_STATE_CONFIGURING, LINK_STATE_CONFIGURED)) {
3841 r = link_acquire_ipv6_conf(link);
3842 if (r < 0) {
3843 link_enter_failed(link);
3844 return r;
3845 }
3846 }
3847
3848 return 0;
3849 }
3850
3851 static int link_carrier_gained(Link *link) {
3852 int r;
3853
3854 assert(link);
3855
3856 r = wifi_get_info(link);
3857 if (r < 0)
3858 return r;
3859 if (r > 0) {
3860 r = link_reconfigure_internal(link, NULL, false);
3861 if (r < 0) {
3862 link_enter_failed(link);
3863 return r;
3864 }
3865 }
3866
3867 if (IN_SET(link->state, LINK_STATE_CONFIGURING, LINK_STATE_CONFIGURED)) {
3868 r = link_acquire_conf(link);
3869 if (r < 0) {
3870 link_enter_failed(link);
3871 return r;
3872 }
3873
3874 link_set_state(link, LINK_STATE_CONFIGURING);
3875 r = link_request_set_addresses(link);
3876 if (r < 0)
3877 return r;
3878 }
3879
3880 r = link_handle_bound_by_list(link);
3881 if (r < 0)
3882 return r;
3883
3884 return 0;
3885 }
3886
3887 static int link_carrier_lost(Link *link) {
3888 int r;
3889
3890 assert(link);
3891
3892 if (link->network && link->network->ignore_carrier_loss)
3893 return 0;
3894
3895 /* Some devices reset itself while setting the MTU. This causes the DHCP client fall into a loop.
3896 * setting_mtu keep track whether the device got reset because of setting MTU and does not drop the
3897 * configuration and stop the clients as well. */
3898 if (link->setting_mtu)
3899 return 0;
3900
3901 r = link_stop_clients(link, false);
3902 if (r < 0) {
3903 link_enter_failed(link);
3904 return r;
3905 }
3906
3907 if (link_dhcp4_server_enabled(link))
3908 (void) sd_dhcp_server_stop(link->dhcp_server);
3909
3910 r = link_drop_config(link);
3911 if (r < 0)
3912 return r;
3913
3914 if (!IN_SET(link->state, LINK_STATE_UNMANAGED, LINK_STATE_PENDING, LINK_STATE_INITIALIZED)) {
3915 log_link_debug(link, "State is %s, dropping config", link_state_to_string(link->state));
3916 r = link_drop_foreign_config(link);
3917 if (r < 0)
3918 return r;
3919 }
3920
3921 r = link_handle_bound_by_list(link);
3922 if (r < 0)
3923 return r;
3924
3925 return 0;
3926 }
3927
3928 int link_carrier_reset(Link *link) {
3929 int r;
3930
3931 assert(link);
3932
3933 if (link_has_carrier(link)) {
3934 r = link_carrier_lost(link);
3935 if (r < 0)
3936 return r;
3937
3938 r = link_carrier_gained(link);
3939 if (r < 0)
3940 return r;
3941
3942 log_link_info(link, "Reset carrier");
3943 }
3944
3945 return 0;
3946 }
3947
3948 /* This is called every time an interface admin state changes to up;
3949 * specifically, when IFF_UP flag changes from unset to set */
3950 static int link_admin_state_up(Link *link) {
3951 int r;
3952
3953 /* We set the ipv6 mtu after the device mtu, but the kernel resets
3954 * ipv6 mtu on NETDEV_UP, so we need to reset it. The check for
3955 * ipv6_mtu_set prevents this from trying to set it too early before
3956 * the link->network has been setup; we only need to reset it
3957 * here if we've already set it during normal initialization. */
3958 if (link->ipv6_mtu_set) {
3959 r = link_set_ipv6_mtu(link);
3960 if (r < 0)
3961 return r;
3962 }
3963
3964 return 0;
3965 }
3966
3967 int link_update(Link *link, sd_netlink_message *m) {
3968 _cleanup_strv_free_ char **s = NULL;
3969 struct ether_addr mac;
3970 const char *ifname;
3971 uint32_t mtu;
3972 bool had_carrier, carrier_gained, carrier_lost, link_was_admin_up;
3973 int old_master, r;
3974
3975 assert(link);
3976 assert(link->ifname);
3977 assert(m);
3978
3979 if (link->state == LINK_STATE_LINGER) {
3980 log_link_info(link, "Link re-added");
3981 link_set_state(link, LINK_STATE_CONFIGURING);
3982
3983 r = link_new_carrier_maps(link);
3984 if (r < 0)
3985 return r;
3986 }
3987
3988 r = sd_netlink_message_read_string(m, IFLA_IFNAME, &ifname);
3989 if (r >= 0 && !streq(ifname, link->ifname)) {
3990 Manager *manager = link->manager;
3991
3992 log_link_info(link, "Interface name change detected, %s has been renamed to %s.", link->ifname, ifname);
3993
3994 link_drop(link);
3995 r = link_add(manager, m, &link);
3996 if (r < 0)
3997 return r;
3998 }
3999
4000 r = sd_netlink_message_read_strv(m, IFLA_PROP_LIST, IFLA_ALT_IFNAME, &s);
4001 if (r >= 0)
4002 strv_free_and_replace(link->alternative_names, s);
4003
4004 r = sd_netlink_message_read_u32(m, IFLA_MTU, &mtu);
4005 if (r >= 0 && mtu > 0) {
4006 link->mtu = mtu;
4007 if (link->original_mtu == 0) {
4008 link->original_mtu = mtu;
4009 log_link_debug(link, "Saved original MTU: %" PRIu32, link->original_mtu);
4010 }
4011
4012 if (link->dhcp_client) {
4013 r = sd_dhcp_client_set_mtu(link->dhcp_client,
4014 link->mtu);
4015 if (r < 0)
4016 return log_link_warning_errno(link, r, "Could not update MTU in DHCP client: %m");
4017 }
4018
4019 if (link->radv) {
4020 r = sd_radv_set_mtu(link->radv, link->mtu);
4021 if (r < 0)
4022 return log_link_warning_errno(link, r, "Could not set MTU for Router Advertisement: %m");
4023 }
4024 }
4025
4026 /* The kernel may broadcast NEWLINK messages without the MAC address
4027 set, simply ignore them. */
4028 r = sd_netlink_message_read_ether_addr(m, IFLA_ADDRESS, &mac);
4029 if (r >= 0 && memcmp(link->mac.ether_addr_octet, mac.ether_addr_octet, ETH_ALEN) != 0) {
4030
4031 memcpy(link->mac.ether_addr_octet, mac.ether_addr_octet, ETH_ALEN);
4032
4033 log_link_debug(link, "Gained new MAC address: "
4034 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
4035 mac.ether_addr_octet[0],
4036 mac.ether_addr_octet[1],
4037 mac.ether_addr_octet[2],
4038 mac.ether_addr_octet[3],
4039 mac.ether_addr_octet[4],
4040 mac.ether_addr_octet[5]);
4041
4042 if (link->ipv4ll) {
4043 bool restart = sd_ipv4ll_is_running(link->ipv4ll) > 0;
4044
4045 if (restart) {
4046 r = sd_ipv4ll_stop(link->ipv4ll);
4047 if (r < 0)
4048 return log_link_warning_errno(link, r, "Could not stop IPv4LL client: %m");
4049 }
4050
4051 r = sd_ipv4ll_set_mac(link->ipv4ll, &link->mac);
4052 if (r < 0)
4053 return log_link_warning_errno(link, r, "Could not update MAC address in IPv4LL client: %m");
4054
4055 if (restart) {
4056 r = sd_ipv4ll_start(link->ipv4ll);
4057 if (r < 0)
4058 return log_link_warning_errno(link, r, "Could not restart IPv4LL client: %m");
4059 }
4060 }
4061
4062 if (link->dhcp_client) {
4063 r = sd_dhcp_client_set_mac(link->dhcp_client,
4064 (const uint8_t *) &link->mac,
4065 sizeof (link->mac),
4066 ARPHRD_ETHER);
4067 if (r < 0)
4068 return log_link_warning_errno(link, r, "Could not update MAC address in DHCP client: %m");
4069
4070 r = dhcp4_set_client_identifier(link);
4071 if (r < 0)
4072 return log_link_warning_errno(link, r, "Could not set DHCP client identifier: %m");
4073 }
4074
4075 if (link->dhcp6_client) {
4076 const DUID* duid = link_get_duid(link);
4077 bool restart = sd_dhcp6_client_is_running(link->dhcp6_client) > 0;
4078
4079 if (restart) {
4080 r = sd_dhcp6_client_stop(link->dhcp6_client);
4081 if (r < 0)
4082 return log_link_warning_errno(link, r, "Could not stop DHCPv6 client: %m");
4083 }
4084
4085 r = sd_dhcp6_client_set_mac(link->dhcp6_client,
4086 (const uint8_t *) &link->mac,
4087 sizeof (link->mac),
4088 ARPHRD_ETHER);
4089 if (r < 0)
4090 return log_link_warning_errno(link, r, "Could not update MAC address in DHCPv6 client: %m");
4091
4092 if (link->network->iaid_set) {
4093 r = sd_dhcp6_client_set_iaid(link->dhcp6_client, link->network->iaid);
4094 if (r < 0)
4095 return log_link_warning_errno(link, r, "Could not update DHCPv6 IAID: %m");
4096 }
4097
4098 r = sd_dhcp6_client_set_duid(link->dhcp6_client,
4099 duid->type,
4100 duid->raw_data_len > 0 ? duid->raw_data : NULL,
4101 duid->raw_data_len);
4102 if (r < 0)
4103 return log_link_warning_errno(link, r, "Could not update DHCPv6 DUID: %m");
4104
4105 if (restart) {
4106 r = sd_dhcp6_client_start(link->dhcp6_client);
4107 if (r < 0)
4108 return log_link_warning_errno(link, r, "Could not restart DHCPv6 client: %m");
4109 }
4110 }
4111
4112 if (link->radv) {
4113 bool restart = sd_radv_is_running(link->radv);
4114
4115 if (restart) {
4116 r = sd_radv_stop(link->radv);
4117 if (r < 0)
4118 return log_link_warning_errno(link, r, "Could not stop Router Advertisement: %m");
4119 }
4120
4121 r = sd_radv_set_mac(link->radv, &link->mac);
4122 if (r < 0)
4123 return log_link_warning_errno(link, r, "Could not update MAC for Router Advertisement: %m");
4124
4125 if (restart) {
4126 r = sd_radv_start(link->radv);
4127 if (r < 0)
4128 return log_link_warning_errno(link, r, "Could not restart Router Advertisement: %m");
4129 }
4130 }
4131
4132 if (link->ndisc) {
4133 r = sd_ndisc_set_mac(link->ndisc, &link->mac);
4134 if (r < 0)
4135 return log_link_warning_errno(link, r, "Could not update MAC for NDisc: %m");
4136 }
4137 }
4138
4139 old_master = link->master_ifindex;
4140 (void) sd_netlink_message_read_u32(m, IFLA_MASTER, (uint32_t *) &link->master_ifindex);
4141
4142 link_was_admin_up = link->flags & IFF_UP;
4143 had_carrier = link_has_carrier(link);
4144
4145 r = link_update_flags(link, m, old_master != link->master_ifindex);
4146 if (r < 0)
4147 return r;
4148
4149 if (!link_was_admin_up && (link->flags & IFF_UP)) {
4150 log_link_info(link, "Link UP");
4151
4152 r = link_admin_state_up(link);
4153 if (r < 0)
4154 return r;
4155 } else if (link_was_admin_up && !(link->flags & IFF_UP))
4156 log_link_info(link, "Link DOWN");
4157
4158 r = link_update_lldp(link);
4159 if (r < 0)
4160 return r;
4161
4162 carrier_gained = !had_carrier && link_has_carrier(link);
4163 carrier_lost = had_carrier && !link_has_carrier(link);
4164
4165 if (carrier_gained) {
4166 log_link_info(link, "Gained carrier");
4167
4168 r = link_carrier_gained(link);
4169 if (r < 0)
4170 return r;
4171 } else if (carrier_lost) {
4172 log_link_info(link, "Lost carrier");
4173
4174 r = link_carrier_lost(link);
4175 if (r < 0)
4176 return r;
4177 }
4178
4179 return 0;
4180 }
4181
4182 static void print_link_hashmap(FILE *f, const char *prefix, Hashmap* h) {
4183 bool space = false;
4184 Iterator i;
4185 Link *link;
4186
4187 assert(f);
4188 assert(prefix);
4189
4190 if (hashmap_isempty(h))
4191 return;
4192
4193 fputs(prefix, f);
4194 HASHMAP_FOREACH(link, h, i) {
4195 if (space)
4196 fputc(' ', f);
4197
4198 fprintf(f, "%i", link->ifindex);
4199 space = true;
4200 }
4201
4202 fputc('\n', f);
4203 }
4204
4205 static void link_save_dns(Link *link, FILE *f, struct in_addr_full **dns, unsigned n_dns, bool *space) {
4206 for (unsigned j = 0; j < n_dns; j++) {
4207 const char *str;
4208
4209 if (dns[j]->ifindex != 0 && dns[j]->ifindex != link->ifindex)
4210 continue;
4211
4212 str = in_addr_full_to_string(dns[j]);
4213 if (!str)
4214 continue;
4215
4216 if (*space)
4217 fputc(' ', f);
4218 fputs(str, f);
4219 *space = true;
4220 }
4221 }
4222
4223 static void serialize_addresses(
4224 FILE *f,
4225 const char *lvalue,
4226 bool *space,
4227 char **addresses,
4228 sd_dhcp_lease *lease,
4229 bool conditional,
4230 sd_dhcp_lease_server_type what,
4231 sd_dhcp6_lease *lease6,
4232 bool conditional6,
4233 int (*lease6_get_addr)(sd_dhcp6_lease*, const struct in6_addr**),
4234 int (*lease6_get_fqdn)(sd_dhcp6_lease*, char ***)) {
4235 int r;
4236
4237 bool _space = false;
4238 if (!space)
4239 space = &_space;
4240
4241 if (lvalue)
4242 fprintf(f, "%s=", lvalue);
4243 fputstrv(f, addresses, NULL, space);
4244
4245 if (lease && conditional) {
4246 const struct in_addr *lease_addresses;
4247
4248 r = sd_dhcp_lease_get_servers(lease, what, &lease_addresses);
4249 if (r > 0)
4250 serialize_in_addrs(f, lease_addresses, r, space, in4_addr_is_non_local);
4251 }
4252
4253 if (lease6 && conditional6 && lease6_get_addr) {
4254 const struct in6_addr *in6_addrs;
4255
4256 r = lease6_get_addr(lease6, &in6_addrs);
4257 if (r > 0)
4258 serialize_in6_addrs(f, in6_addrs, r, space);
4259 }
4260
4261 if (lease6 && conditional6 && lease6_get_fqdn) {
4262 char **in6_hosts;
4263
4264 r = lease6_get_fqdn(lease6, &in6_hosts);
4265 if (r > 0)
4266 fputstrv(f, in6_hosts, NULL, space);
4267 }
4268
4269 if (lvalue)
4270 fputc('\n', f);
4271 }
4272
4273 int link_save(Link *link) {
4274 const char *admin_state, *oper_state, *carrier_state, *address_state;
4275 _cleanup_free_ char *temp_path = NULL;
4276 _cleanup_fclose_ FILE *f = NULL;
4277 Route *route;
4278 Address *a;
4279 Iterator i;
4280 int r;
4281
4282 assert(link);
4283 assert(link->state_file);
4284 assert(link->lease_file);
4285 assert(link->manager);
4286
4287 if (link->state == LINK_STATE_LINGER) {
4288 (void) unlink(link->state_file);
4289 return 0;
4290 }
4291
4292 link_lldp_save(link);
4293
4294 admin_state = link_state_to_string(link->state);
4295 assert(admin_state);
4296
4297 oper_state = link_operstate_to_string(link->operstate);
4298 assert(oper_state);
4299
4300 carrier_state = link_carrier_state_to_string(link->carrier_state);
4301 assert(carrier_state);
4302
4303 address_state = link_address_state_to_string(link->address_state);
4304 assert(address_state);
4305
4306 r = fopen_temporary(link->state_file, &f, &temp_path);
4307 if (r < 0)
4308 goto fail;
4309
4310 (void) fchmod(fileno(f), 0644);
4311
4312 fprintf(f,
4313 "# This is private data. Do not parse.\n"
4314 "ADMIN_STATE=%s\n"
4315 "OPER_STATE=%s\n"
4316 "CARRIER_STATE=%s\n"
4317 "ADDRESS_STATE=%s\n",
4318 admin_state, oper_state, carrier_state, address_state);
4319
4320 if (link->network) {
4321 char **dhcp6_domains = NULL, **dhcp_domains = NULL;
4322 const char *dhcp_domainname = NULL, *p;
4323 bool space;
4324
4325 fprintf(f, "REQUIRED_FOR_ONLINE=%s\n",
4326 yes_no(link->network->required_for_online));
4327
4328 LinkOperationalStateRange st = link->network->required_operstate_for_online;
4329 fprintf(f, "REQUIRED_OPER_STATE_FOR_ONLINE=%s%s%s\n",
4330 strempty(link_operstate_to_string(st.min)),
4331 st.max != LINK_OPERSTATE_RANGE_DEFAULT.max ? ":" : "",
4332 st.max != LINK_OPERSTATE_RANGE_DEFAULT.max ? strempty(link_operstate_to_string(st.max)) : "");
4333
4334 fprintf(f, "NETWORK_FILE=%s\n", link->network->filename);
4335
4336 /************************************************************/
4337
4338 fputs("DNS=", f);
4339 space = false;
4340 if (link->n_dns != (unsigned) -1)
4341 link_save_dns(link, f, link->dns, link->n_dns, &space);
4342 else
4343 link_save_dns(link, f, link->network->dns, link->network->n_dns, &space);
4344
4345 serialize_addresses(f, NULL, &space,
4346 NULL,
4347 link->dhcp_lease,
4348 link->network->dhcp_use_dns,
4349 SD_DHCP_LEASE_DNS,
4350 link->dhcp6_lease,
4351 link->network->dhcp6_use_dns,
4352 sd_dhcp6_lease_get_dns,
4353 NULL);
4354
4355 /* Make sure to flush out old entries before we use the NDisc data */
4356 ndisc_vacuum(link);
4357
4358 if (link->network->ipv6_accept_ra_use_dns && link->ndisc_rdnss) {
4359 NDiscRDNSS *dd;
4360
4361 SET_FOREACH(dd, link->ndisc_rdnss, i)
4362 serialize_in6_addrs(f, &dd->address, 1, &space);
4363 }
4364
4365 fputc('\n', f);
4366
4367 /************************************************************/
4368
4369 serialize_addresses(f, "NTP", NULL,
4370 link->ntp ?: link->network->ntp,
4371 link->dhcp_lease,
4372 link->network->dhcp_use_ntp,
4373 SD_DHCP_LEASE_NTP,
4374 link->dhcp6_lease,
4375 link->network->dhcp6_use_ntp,
4376 sd_dhcp6_lease_get_ntp_addrs,
4377 sd_dhcp6_lease_get_ntp_fqdn);
4378
4379 serialize_addresses(f, "SIP", NULL,
4380 NULL,
4381 link->dhcp_lease,
4382 link->network->dhcp_use_sip,
4383 SD_DHCP_LEASE_SIP,
4384 NULL, false, NULL, NULL);
4385
4386 /************************************************************/
4387
4388 if (link->network->dhcp_use_domains != DHCP_USE_DOMAINS_NO) {
4389 if (link->dhcp_lease) {
4390 (void) sd_dhcp_lease_get_domainname(link->dhcp_lease, &dhcp_domainname);
4391 (void) sd_dhcp_lease_get_search_domains(link->dhcp_lease, &dhcp_domains);
4392 }
4393 if (link->dhcp6_lease)
4394 (void) sd_dhcp6_lease_get_domains(link->dhcp6_lease, &dhcp6_domains);
4395 }
4396
4397 fputs("DOMAINS=", f);
4398 space = false;
4399 ORDERED_SET_FOREACH(p, link->search_domains ?: link->network->search_domains, i)
4400 fputs_with_space(f, p, NULL, &space);
4401
4402 if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_YES) {
4403 if (dhcp_domainname)
4404 fputs_with_space(f, dhcp_domainname, NULL, &space);
4405 if (dhcp_domains)
4406 fputstrv(f, dhcp_domains, NULL, &space);
4407 if (dhcp6_domains)
4408 fputstrv(f, dhcp6_domains, NULL, &space);
4409 }
4410
4411 if (link->network->ipv6_accept_ra_use_domains == DHCP_USE_DOMAINS_YES) {
4412 NDiscDNSSL *dd;
4413
4414 SET_FOREACH(dd, link->ndisc_dnssl, i)
4415 fputs_with_space(f, NDISC_DNSSL_DOMAIN(dd), NULL, &space);
4416 }
4417
4418 fputc('\n', f);
4419
4420 /************************************************************/
4421
4422 fputs("ROUTE_DOMAINS=", f);
4423 space = false;
4424 ORDERED_SET_FOREACH(p, link->route_domains ?: link->network->route_domains, i)
4425 fputs_with_space(f, p, NULL, &space);
4426
4427 if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_ROUTE) {
4428 if (dhcp_domainname)
4429 fputs_with_space(f, dhcp_domainname, NULL, &space);
4430 if (dhcp_domains)
4431 fputstrv(f, dhcp_domains, NULL, &space);
4432 if (dhcp6_domains)
4433 fputstrv(f, dhcp6_domains, NULL, &space);
4434 }
4435
4436 if (link->network->ipv6_accept_ra_use_domains == DHCP_USE_DOMAINS_ROUTE) {
4437 NDiscDNSSL *dd;
4438
4439 SET_FOREACH(dd, link->ndisc_dnssl, i)
4440 fputs_with_space(f, NDISC_DNSSL_DOMAIN(dd), NULL, &space);
4441 }
4442
4443 fputc('\n', f);
4444
4445 /************************************************************/
4446
4447 fprintf(f, "LLMNR=%s\n",
4448 resolve_support_to_string(link->llmnr >= 0 ? link->llmnr : link->network->llmnr));
4449
4450 /************************************************************/
4451
4452 fprintf(f, "MDNS=%s\n",
4453 resolve_support_to_string(link->mdns >= 0 ? link->mdns : link->network->mdns));
4454
4455 /************************************************************/
4456
4457 int dns_default_route =
4458 link->dns_default_route >= 0 ? link->dns_default_route :
4459 link->network->dns_default_route;
4460 if (dns_default_route >= 0)
4461 fprintf(f, "DNS_DEFAULT_ROUTE=%s\n", yes_no(dns_default_route));
4462
4463 /************************************************************/
4464
4465 DnsOverTlsMode dns_over_tls_mode =
4466 link->dns_over_tls_mode != _DNS_OVER_TLS_MODE_INVALID ? link->dns_over_tls_mode :
4467 link->network->dns_over_tls_mode;
4468 if (dns_over_tls_mode != _DNS_OVER_TLS_MODE_INVALID)
4469 fprintf(f, "DNS_OVER_TLS=%s\n", dns_over_tls_mode_to_string(dns_over_tls_mode));
4470
4471 /************************************************************/
4472
4473 DnssecMode dnssec_mode =
4474 link->dnssec_mode != _DNSSEC_MODE_INVALID ? link->dnssec_mode :
4475 link->network->dnssec_mode;
4476 if (dnssec_mode != _DNSSEC_MODE_INVALID)
4477 fprintf(f, "DNSSEC=%s\n", dnssec_mode_to_string(dnssec_mode));
4478
4479 /************************************************************/
4480
4481 Set *nta_anchors = link->dnssec_negative_trust_anchors;
4482 if (set_isempty(nta_anchors))
4483 nta_anchors = link->network->dnssec_negative_trust_anchors;
4484
4485 if (!set_isempty(nta_anchors)) {
4486 const char *n;
4487
4488 fputs("DNSSEC_NTA=", f);
4489 space = false;
4490 SET_FOREACH(n, nta_anchors, i)
4491 fputs_with_space(f, n, NULL, &space);
4492 fputc('\n', f);
4493 }
4494
4495 /************************************************************/
4496
4497 fputs("ADDRESSES=", f);
4498 space = false;
4499 SET_FOREACH(a, link->addresses, i) {
4500 _cleanup_free_ char *address_str = NULL;
4501
4502 r = in_addr_to_string(a->family, &a->in_addr, &address_str);
4503 if (r < 0)
4504 goto fail;
4505
4506 fprintf(f, "%s%s/%u", space ? " " : "", address_str, a->prefixlen);
4507 space = true;
4508 }
4509 fputc('\n', f);
4510
4511 /************************************************************/
4512
4513 fputs("ROUTES=", f);
4514 space = false;
4515 SET_FOREACH(route, link->routes, i) {
4516 _cleanup_free_ char *route_str = NULL;
4517
4518 r = in_addr_to_string(route->family, &route->dst, &route_str);
4519 if (r < 0)
4520 goto fail;
4521
4522 fprintf(f, "%s%s/%hhu/%hhu/%"PRIu32"/%"PRIu32"/"USEC_FMT,
4523 space ? " " : "", route_str,
4524 route->dst_prefixlen, route->tos, route->priority, route->table, route->lifetime);
4525 space = true;
4526 }
4527
4528 fputc('\n', f);
4529 }
4530
4531 print_link_hashmap(f, "CARRIER_BOUND_TO=", link->bound_to_links);
4532 print_link_hashmap(f, "CARRIER_BOUND_BY=", link->bound_by_links);
4533
4534 if (link->dhcp_lease) {
4535 r = dhcp_lease_save(link->dhcp_lease, link->lease_file);
4536 if (r < 0)
4537 goto fail;
4538
4539 fprintf(f,
4540 "DHCP_LEASE=%s\n",
4541 link->lease_file);
4542 } else
4543 (void) unlink(link->lease_file);
4544
4545 if (link->ipv4ll) {
4546 struct in_addr address;
4547
4548 r = sd_ipv4ll_get_address(link->ipv4ll, &address);
4549 if (r >= 0) {
4550 fputs("IPV4LL_ADDRESS=", f);
4551 serialize_in_addrs(f, &address, 1, false, NULL);
4552 fputc('\n', f);
4553 }
4554 }
4555
4556 if (link->dhcp6_client) {
4557 _cleanup_free_ char *duid = NULL;
4558 uint32_t iaid;
4559
4560 r = sd_dhcp6_client_get_iaid(link->dhcp6_client, &iaid);
4561 if (r >= 0)
4562 fprintf(f, "DHCP6_CLIENT_IAID=0x%x\n", iaid);
4563
4564 r = sd_dhcp6_client_duid_as_string(link->dhcp6_client, &duid);
4565 if (r >= 0)
4566 fprintf(f, "DHCP6_CLIENT_DUID=%s\n", duid);
4567 }
4568
4569 r = fflush_and_check(f);
4570 if (r < 0)
4571 goto fail;
4572
4573 if (rename(temp_path, link->state_file) < 0) {
4574 r = -errno;
4575 goto fail;
4576 }
4577
4578 return 0;
4579
4580 fail:
4581 (void) unlink(link->state_file);
4582 if (temp_path)
4583 (void) unlink(temp_path);
4584
4585 return log_link_error_errno(link, r, "Failed to save link data to %s: %m", link->state_file);
4586 }
4587
4588 /* The serialized state in /run is no longer up-to-date. */
4589 void link_dirty(Link *link) {
4590 int r;
4591
4592 assert(link);
4593
4594 /* mark manager dirty as link is dirty */
4595 manager_dirty(link->manager);
4596
4597 r = set_ensure_put(&link->manager->dirty_links, NULL, link);
4598 if (r <= 0)
4599 /* Ignore allocation errors and don't take another ref if the link was already dirty */
4600 return;
4601 link_ref(link);
4602 }
4603
4604 /* The serialized state in /run is up-to-date */
4605 void link_clean(Link *link) {
4606 assert(link);
4607 assert(link->manager);
4608
4609 link_unref(set_remove(link->manager->dirty_links, link));
4610 }
4611
4612 int link_save_and_clean(Link *link) {
4613 int r;
4614
4615 r = link_save(link);
4616 if (r < 0)
4617 return r;
4618
4619 link_clean(link);
4620 return 0;
4621 }
4622
4623 static const char* const link_state_table[_LINK_STATE_MAX] = {
4624 [LINK_STATE_PENDING] = "pending",
4625 [LINK_STATE_INITIALIZED] = "initialized",
4626 [LINK_STATE_CONFIGURING] = "configuring",
4627 [LINK_STATE_CONFIGURED] = "configured",
4628 [LINK_STATE_UNMANAGED] = "unmanaged",
4629 [LINK_STATE_FAILED] = "failed",
4630 [LINK_STATE_LINGER] = "linger",
4631 };
4632
4633 DEFINE_STRING_TABLE_LOOKUP(link_state, LinkState);
4634
4635 int log_link_message_full_errno(Link *link, sd_netlink_message *m, int level, int err, const char *msg) {
4636 const char *err_msg = NULL;
4637
4638 (void) sd_netlink_message_read_string(m, NLMSGERR_ATTR_MSG, &err_msg);
4639 return log_link_full(link, level, err,
4640 "%s: %s%s%s%m",
4641 msg,
4642 strempty(err_msg),
4643 err_msg && !endswith(err_msg, ".") ? "." : "",
4644 err_msg ? " " : "");
4645 }