]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/network/networkd-link.c
networkd: link - plug leak
[thirdparty/systemd.git] / src / network / networkd-link.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4 This file is part of systemd.
5
6 Copyright 2013 Tom Gundersen <teg@jklm.no>
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <netinet/ether.h>
23 #include <linux/if.h>
24 #include <unistd.h>
25
26 #include "networkd-link.h"
27 #include "networkd-netdev.h"
28 #include "libudev-private.h"
29 #include "udev-util.h"
30 #include "util.h"
31 #include "virt.h"
32 #include "bus-util.h"
33 #include "network-internal.h"
34 #include "conf-parser.h"
35
36 #include "dhcp-lease-internal.h"
37
38 static bool link_dhcp6_enabled(Link *link) {
39 if (link->flags & IFF_LOOPBACK)
40 return false;
41
42 if (!link->network)
43 return false;
44
45 return IN_SET(link->network->dhcp, DHCP_SUPPORT_V6, DHCP_SUPPORT_BOTH);
46 }
47
48 static bool link_dhcp4_enabled(Link *link) {
49 if (link->flags & IFF_LOOPBACK)
50 return false;
51
52 if (!link->network)
53 return false;
54
55 return IN_SET(link->network->dhcp, DHCP_SUPPORT_V4, DHCP_SUPPORT_BOTH);
56 }
57
58 static bool link_dhcp4_server_enabled(Link *link) {
59 if (link->flags & IFF_LOOPBACK)
60 return false;
61
62 if (!link->network)
63 return false;
64
65 return link->network->dhcp_server;
66 }
67
68 static bool link_ipv4ll_enabled(Link *link) {
69 if (link->flags & IFF_LOOPBACK)
70 return false;
71
72 if (!link->network)
73 return false;
74
75 return link->network->ipv4ll;
76 }
77
78 static bool link_lldp_enabled(Link *link) {
79 if (link->flags & IFF_LOOPBACK)
80 return false;
81
82 if (!link->network)
83 return false;
84
85 if(link->network->bridge)
86 return false;
87
88 return link->network->lldp;
89 }
90
91 #define FLAG_STRING(string, flag, old, new) \
92 (((old ^ new) & flag) \
93 ? ((old & flag) ? (" -" string) : (" +" string)) \
94 : "")
95
96 static int link_update_flags(Link *link, sd_rtnl_message *m) {
97 unsigned flags, unknown_flags_added, unknown_flags_removed, unknown_flags;
98 uint8_t operstate;
99 int r;
100
101 assert(link);
102
103 r = sd_rtnl_message_link_get_flags(m, &flags);
104 if (r < 0) {
105 log_link_warning(link, "Could not get link flags");
106 return r;
107 }
108
109 r = sd_rtnl_message_read_u8(m, IFLA_OPERSTATE, &operstate);
110 if (r < 0)
111 /* if we got a message without operstate, take it to mean
112 the state was unchanged */
113 operstate = link->kernel_operstate;
114
115 if ((link->flags == flags) && (link->kernel_operstate == operstate))
116 return 0;
117
118 if (link->flags != flags) {
119 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",
120 FLAG_STRING("LOOPBACK", IFF_LOOPBACK, link->flags, flags),
121 FLAG_STRING("MASTER", IFF_MASTER, link->flags, flags),
122 FLAG_STRING("SLAVE", IFF_SLAVE, link->flags, flags),
123 FLAG_STRING("UP", IFF_UP, link->flags, flags),
124 FLAG_STRING("DORMANT", IFF_DORMANT, link->flags, flags),
125 FLAG_STRING("LOWER_UP", IFF_LOWER_UP, link->flags, flags),
126 FLAG_STRING("RUNNING", IFF_RUNNING, link->flags, flags),
127 FLAG_STRING("MULTICAST", IFF_MULTICAST, link->flags, flags),
128 FLAG_STRING("BROADCAST", IFF_BROADCAST, link->flags, flags),
129 FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT, link->flags, flags),
130 FLAG_STRING("PROMISC", IFF_PROMISC, link->flags, flags),
131 FLAG_STRING("ALLMULTI", IFF_ALLMULTI, link->flags, flags),
132 FLAG_STRING("PORTSEL", IFF_PORTSEL, link->flags, flags),
133 FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA, link->flags, flags),
134 FLAG_STRING("DYNAMIC", IFF_DYNAMIC, link->flags, flags),
135 FLAG_STRING("NOARP", IFF_NOARP, link->flags, flags),
136 FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS, link->flags, flags),
137 FLAG_STRING("DEBUG", IFF_DEBUG, link->flags, flags),
138 FLAG_STRING("ECHO", IFF_ECHO, link->flags, flags));
139
140 unknown_flags = ~(IFF_LOOPBACK | IFF_MASTER | IFF_SLAVE | IFF_UP |
141 IFF_DORMANT | IFF_LOWER_UP | IFF_RUNNING |
142 IFF_MULTICAST | IFF_BROADCAST | IFF_POINTOPOINT |
143 IFF_PROMISC | IFF_ALLMULTI | IFF_PORTSEL |
144 IFF_AUTOMEDIA | IFF_DYNAMIC | IFF_NOARP |
145 IFF_NOTRAILERS | IFF_DEBUG | IFF_ECHO);
146 unknown_flags_added = ((link->flags ^ flags) & flags & unknown_flags);
147 unknown_flags_removed = ((link->flags ^ flags) & link->flags & unknown_flags);
148
149 /* link flags are currently at most 18 bits, let's align to
150 * printing 20 */
151 if (unknown_flags_added)
152 log_link_debug(link,
153 "unknown link flags gained: %#.5x (ignoring)",
154 unknown_flags_added);
155
156 if (unknown_flags_removed)
157 log_link_debug(link,
158 "unknown link flags lost: %#.5x (ignoring)",
159 unknown_flags_removed);
160 }
161
162 link->flags = flags;
163 link->kernel_operstate = operstate;
164
165 link_save(link);
166
167 return 0;
168 }
169
170 static int link_new(Manager *manager, sd_rtnl_message *message, Link **ret) {
171 _cleanup_link_unref_ Link *link = NULL;
172 uint16_t type;
173 const char *ifname;
174 int r, ifindex;
175
176 assert(manager);
177 assert(message);
178 assert(ret);
179
180 r = sd_rtnl_message_get_type(message, &type);
181 if (r < 0)
182 return r;
183 else if (type != RTM_NEWLINK)
184 return -EINVAL;
185
186 r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
187 if (r < 0)
188 return r;
189 else if (ifindex <= 0)
190 return -EINVAL;
191
192 r = sd_rtnl_message_read_string(message, IFLA_IFNAME, &ifname);
193 if (r < 0)
194 return r;
195
196 link = new0(Link, 1);
197 if (!link)
198 return -ENOMEM;
199
200 link->n_ref = 1;
201 link->manager = manager;
202 link->state = LINK_STATE_PENDING;
203 link->ifindex = ifindex;
204 link->ifname = strdup(ifname);
205 if (!link->ifname)
206 return -ENOMEM;
207
208 r = sd_rtnl_message_read_ether_addr(message, IFLA_ADDRESS, &link->mac);
209 if (r < 0)
210 log_link_debug(link, "MAC address not found for new device, continuing without");
211
212 r = asprintf(&link->state_file, "/run/systemd/netif/links/%d",
213 link->ifindex);
214 if (r < 0)
215 return -ENOMEM;
216
217 r = asprintf(&link->lease_file, "/run/systemd/netif/leases/%d",
218 link->ifindex);
219 if (r < 0)
220 return -ENOMEM;
221
222 r = asprintf(&link->lldp_file, "/run/systemd/netif/lldp/%d",
223 link->ifindex);
224 if (r < 0)
225 return -ENOMEM;
226
227
228 r = hashmap_ensure_allocated(&manager->links, NULL);
229 if (r < 0)
230 return r;
231
232 r = hashmap_put(manager->links, INT_TO_PTR(link->ifindex), link);
233 if (r < 0)
234 return r;
235
236 r = link_update_flags(link, message);
237 if (r < 0)
238 return r;
239
240 *ret = link;
241 link = NULL;
242
243 return 0;
244 }
245
246 static void link_free(Link *link) {
247 Address *address;
248
249 if (!link)
250 return;
251
252 while ((address = link->addresses)) {
253 LIST_REMOVE(addresses, link->addresses, address);
254 address_free(address);
255 }
256
257 while ((address = link->pool_addresses)) {
258 LIST_REMOVE(addresses, link->pool_addresses, address);
259 address_free(address);
260 }
261
262 sd_dhcp_server_unref(link->dhcp_server);
263 sd_dhcp_client_unref(link->dhcp_client);
264 sd_dhcp_lease_unref(link->dhcp_lease);
265
266 unlink(link->lease_file);
267 free(link->lease_file);
268
269 unlink(link->lldp_file);
270 free(link->lldp_file);
271
272 sd_ipv4ll_unref(link->ipv4ll);
273 sd_dhcp6_client_unref(link->dhcp6_client);
274 sd_icmp6_nd_unref(link->icmp6_router_discovery);
275
276 if (link->manager)
277 hashmap_remove(link->manager->links, INT_TO_PTR(link->ifindex));
278
279 free(link->ifname);
280
281 unlink(link->state_file);
282 free(link->state_file);
283
284 udev_device_unref(link->udev_device);
285
286 free(link);
287 }
288
289 Link *link_unref(Link *link) {
290 if (link && (-- link->n_ref <= 0))
291 link_free(link);
292
293 return NULL;
294 }
295
296 Link *link_ref(Link *link) {
297 if (link)
298 assert_se(++ link->n_ref >= 2);
299
300 return link;
301 }
302
303 int link_get(Manager *m, int ifindex, Link **ret) {
304 Link *link;
305
306 assert(m);
307 assert(ifindex);
308 assert(ret);
309
310 link = hashmap_get(m->links, INT_TO_PTR(ifindex));
311 if (!link)
312 return -ENODEV;
313
314 *ret = link;
315
316 return 0;
317 }
318
319 void link_drop(Link *link) {
320 if (!link || link->state == LINK_STATE_LINGER)
321 return;
322
323 link->state = LINK_STATE_LINGER;
324
325 log_link_debug(link, "link removed");
326
327 link_unref(link);
328
329 return;
330 }
331
332 static void link_enter_unmanaged(Link *link) {
333 assert(link);
334
335 log_link_debug(link, "unmanaged");
336
337 link->state = LINK_STATE_UNMANAGED;
338
339 link_save(link);
340 }
341
342 static int link_stop_clients(Link *link) {
343 int r = 0, k;
344
345 assert(link);
346 assert(link->manager);
347 assert(link->manager->event);
348
349 if (!link->network)
350 return 0;
351
352 if (link->dhcp_client) {
353 k = sd_dhcp_client_stop(link->dhcp_client);
354 if (k < 0) {
355 log_link_warning(link, "Could not stop DHCPv4 client: %s",
356 strerror(-r));
357 r = k;
358 }
359 }
360
361 if (link->ipv4ll) {
362 k = sd_ipv4ll_stop(link->ipv4ll);
363 if (k < 0) {
364 log_link_warning(link, "Could not stop IPv4 link-local: %s",
365 strerror(-r));
366 r = k;
367 }
368 }
369
370 if(link->icmp6_router_discovery) {
371
372 if (link->dhcp6_client) {
373 k = sd_dhcp6_client_stop(link->dhcp6_client);
374 if (k < 0) {
375 log_link_warning(link, "Could not stop DHCPv6 client: %s",
376 strerror(-r));
377 r = k;
378 }
379 }
380
381 k = sd_icmp6_nd_stop(link->icmp6_router_discovery);
382 if (k < 0) {
383 log_link_warning(link,
384 "Could not stop ICMPv6 router discovery: %s",
385 strerror(-r));
386 r = k;
387 }
388 }
389
390 if (link->lldp) {
391
392 k = sd_lldp_stop(link->lldp);
393 if (k < 0) {
394 log_link_warning(link, "Could not stop LLDP : %s",
395 strerror(-r));
396 r = k;
397 }
398 }
399
400 return r;
401 }
402
403 void link_enter_failed(Link *link) {
404 assert(link);
405
406 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
407 return;
408
409 log_link_warning(link, "failed");
410
411 link->state = LINK_STATE_FAILED;
412
413 link_stop_clients(link);
414
415 link_save(link);
416 }
417
418 static Address* link_find_dhcp_server_address(Link *link) {
419 Address *address;
420
421 assert(link);
422 assert(link->network);
423
424 /* The the first statically configured address if there is any */
425 LIST_FOREACH(addresses, address, link->network->static_addresses) {
426
427 if (address->family != AF_INET)
428 continue;
429
430 if (in_addr_is_null(address->family, &address->in_addr))
431 continue;
432
433 return address;
434 }
435
436 /* If that didn't work, find a suitable address we got from the pool */
437 LIST_FOREACH(addresses, address, link->pool_addresses) {
438 if (address->family != AF_INET)
439 continue;
440
441 return address;
442 }
443
444 return NULL;
445 }
446
447 static int link_enter_configured(Link *link) {
448 int r;
449
450 assert(link);
451 assert(link->network);
452 assert(link->state == LINK_STATE_SETTING_ROUTES);
453
454 if (link_dhcp4_server_enabled(link) &&
455 !sd_dhcp_server_is_running(link->dhcp_server)) {
456 struct in_addr pool_start;
457 Address *address;
458
459 address = link_find_dhcp_server_address(link);
460 if (!address) {
461 log_link_warning(link,
462 "Failed to find suitable address for DHCPv4 server instance.");
463 link_enter_failed(link);
464 return 0;
465 }
466
467 log_link_debug(link, "offering DHCPv4 leases");
468
469 r = sd_dhcp_server_set_address(link->dhcp_server,
470 &address->in_addr.in,
471 address->prefixlen);
472 if (r < 0)
473 return r;
474
475 /* offer 32 addresses starting from the address following the server address */
476 pool_start.s_addr = htobe32(be32toh(address->in_addr.in.s_addr) + 1);
477 r = sd_dhcp_server_set_lease_pool(link->dhcp_server,
478 &pool_start, 32);
479 if (r < 0)
480 return r;
481
482 /* TODO:
483 r = sd_dhcp_server_set_router(link->dhcp_server,
484 &main_address->in_addr.in);
485 if (r < 0)
486 return r;
487
488 r = sd_dhcp_server_set_prefixlen(link->dhcp_server,
489 main_address->prefixlen);
490 if (r < 0)
491 return r;
492 */
493
494 r = sd_dhcp_server_start(link->dhcp_server);
495 if (r < 0) {
496 log_link_warning(link, "could not start DHCPv4 server "
497 "instance: %s", strerror(-r));
498
499 link_enter_failed(link);
500
501 return 0;
502 }
503 }
504
505 log_link_info(link, "link configured");
506
507 link->state = LINK_STATE_CONFIGURED;
508
509 link_save(link);
510
511 return 0;
512 }
513
514 void link_client_handler(Link *link) {
515 assert(link);
516 assert(link->network);
517
518 if (!link->static_configured)
519 return;
520
521 if (link_ipv4ll_enabled(link))
522 if (!link->ipv4ll_address ||
523 !link->ipv4ll_route)
524 return;
525
526 if (link_dhcp4_enabled(link) && !link->dhcp4_configured)
527 return;
528
529 if (link->state != LINK_STATE_CONFIGURED)
530 link_enter_configured(link);
531
532 return;
533 }
534
535 static int route_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
536 _cleanup_link_unref_ Link *link = userdata;
537 int r;
538
539 assert(link->link_messages > 0);
540 assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
541 LINK_STATE_SETTING_ROUTES, LINK_STATE_FAILED,
542 LINK_STATE_LINGER));
543
544 link->link_messages --;
545
546 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
547 return 1;
548
549 r = sd_rtnl_message_get_errno(m);
550 if (r < 0 && r != -EEXIST)
551 log_link_warning_errno(link, -r, "%-*s: could not set route: %m", IFNAMSIZ, link->ifname);
552
553 if (link->link_messages == 0) {
554 log_link_debug(link, "routes set");
555 link->static_configured = true;
556 link_client_handler(link);
557 }
558
559 return 1;
560 }
561
562 static int link_enter_set_routes(Link *link) {
563 Route *rt;
564 int r;
565
566 assert(link);
567 assert(link->network);
568 assert(link->state == LINK_STATE_SETTING_ADDRESSES);
569
570 link->state = LINK_STATE_SETTING_ROUTES;
571
572 LIST_FOREACH(routes, rt, link->network->static_routes) {
573 r = route_configure(rt, link, &route_handler);
574 if (r < 0) {
575 log_link_warning(link,
576 "could not set routes: %s",
577 strerror(-r));
578 link_enter_failed(link);
579 return r;
580 }
581
582 link->link_messages ++;
583 }
584
585 if (link->link_messages == 0) {
586 link->static_configured = true;
587 link_client_handler(link);
588 } else
589 log_link_debug(link, "setting routes");
590
591 return 0;
592 }
593
594 int link_route_drop_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
595 _cleanup_link_unref_ Link *link = userdata;
596 int r;
597
598 assert(m);
599 assert(link);
600 assert(link->ifname);
601
602 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
603 return 1;
604
605 r = sd_rtnl_message_get_errno(m);
606 if (r < 0 && r != -ESRCH)
607 log_link_warning_errno(link, -r, "%-*s: could not drop route: %m", IFNAMSIZ, link->ifname);
608
609 return 1;
610 }
611
612 static int address_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
613 _cleanup_link_unref_ Link *link = userdata;
614 int r;
615
616 assert(rtnl);
617 assert(m);
618 assert(link);
619 assert(link->ifname);
620 assert(link->link_messages > 0);
621 assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
622 LINK_STATE_FAILED, LINK_STATE_LINGER));
623
624 link->link_messages --;
625
626 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
627 return 1;
628
629 r = sd_rtnl_message_get_errno(m);
630 if (r < 0 && r != -EEXIST)
631 log_link_warning_errno(link, -r, "%-*s: could not set address: %m", IFNAMSIZ, link->ifname);
632 else if (r >= 0)
633 link_rtnl_process_address(rtnl, m, link->manager);
634
635 if (link->link_messages == 0) {
636 log_link_debug(link, "addresses set");
637 link_enter_set_routes(link);
638 }
639
640 return 1;
641 }
642
643 static int link_enter_set_addresses(Link *link) {
644 Address *ad;
645 int r;
646
647 assert(link);
648 assert(link->network);
649 assert(link->state != _LINK_STATE_INVALID);
650
651 link->state = LINK_STATE_SETTING_ADDRESSES;
652
653 LIST_FOREACH(addresses, ad, link->network->static_addresses) {
654 r = address_configure(ad, link, &address_handler);
655 if (r < 0) {
656 log_link_warning(link,
657 "could not set addresses: %s",
658 strerror(-r));
659 link_enter_failed(link);
660 return r;
661 }
662
663 link->link_messages ++;
664 }
665
666 if (link->link_messages == 0) {
667 link_enter_set_routes(link);
668 } else
669 log_link_debug(link, "setting addresses");
670
671 return 0;
672 }
673
674 int link_address_drop_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
675 _cleanup_link_unref_ Link *link = userdata;
676 int r;
677
678 assert(m);
679 assert(link);
680 assert(link->ifname);
681
682 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
683 return 1;
684
685 r = sd_rtnl_message_get_errno(m);
686 if (r < 0 && r != -EADDRNOTAVAIL)
687 log_link_warning_errno(link, -r, "%-*s: could not drop address: %m", IFNAMSIZ, link->ifname);
688
689 return 1;
690 }
691
692 static int link_set_bridge_fdb(const Link *const link) {
693 FdbEntry *fdb_entry;
694 int r = 0;
695
696 LIST_FOREACH(static_fdb_entries, fdb_entry, link->network->static_fdb_entries) {
697 r = fdb_entry_configure(link->manager->rtnl, fdb_entry, link->ifindex);
698 if(r < 0) {
699 log_link_error(link, "Failed to add MAC entry to static MAC table: %s", strerror(-r));
700 break;
701 }
702 }
703
704 return r;
705 }
706
707 static int link_set_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
708 _cleanup_link_unref_ Link *link = userdata;
709 int r;
710
711 log_link_debug(link, "set link");
712
713 r = sd_rtnl_message_get_errno(m);
714 if (r < 0 && r != -EEXIST) {
715 log_link_struct(link, LOG_ERR,
716 "MESSAGE=%-*s: could not join netdev: %s",
717 IFNAMSIZ,
718 link->ifname, strerror(-r),
719 "ERRNO=%d", -r,
720 NULL);
721 link_enter_failed(link);
722 return 1;
723 }
724
725 return 0;
726 }
727
728 static int set_hostname_handler(sd_bus *bus, sd_bus_message *m, void *userdata,
729 sd_bus_error *ret_error) {
730 _cleanup_link_unref_ Link *link = userdata;
731 int r;
732
733 assert(link);
734
735 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
736 return 1;
737
738 r = sd_bus_message_get_errno(m);
739 if (r > 0)
740 log_link_warning(link, "Could not set hostname: %s",
741 strerror(r));
742
743 return 1;
744 }
745
746 int link_set_hostname(Link *link, const char *hostname) {
747 _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
748 int r = 0;
749
750 assert(link);
751 assert(link->manager);
752 assert(hostname);
753
754 log_link_debug(link, "Setting transient hostname: '%s'", hostname);
755
756 if (!link->manager->bus) {
757 /* TODO: replace by assert when we can rely on kdbus */
758 log_link_info(link,
759 "Not connected to system bus, ignoring transient hostname.");
760 return 0;
761 }
762
763 r = sd_bus_message_new_method_call(
764 link->manager->bus,
765 &m,
766 "org.freedesktop.hostname1",
767 "/org/freedesktop/hostname1",
768 "org.freedesktop.hostname1",
769 "SetHostname");
770 if (r < 0)
771 return r;
772
773 r = sd_bus_message_append(m, "sb", hostname, false);
774 if (r < 0)
775 return r;
776
777 r = sd_bus_call_async(link->manager->bus, NULL, m, set_hostname_handler,
778 link, 0);
779 if (r < 0) {
780 log_link_error(link, "Could not set transient hostname: %s",
781 strerror(-r));
782 return r;
783 }
784
785 link_ref(link);
786
787 return 0;
788 }
789
790 static int set_mtu_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
791 _cleanup_link_unref_ Link *link = userdata;
792 int r;
793
794 assert(m);
795 assert(link);
796 assert(link->ifname);
797
798 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
799 return 1;
800
801 r = sd_rtnl_message_get_errno(m);
802 if (r < 0)
803 log_link_warning_errno(link, -r, "%-*s: could not set MTU: %m", IFNAMSIZ, link->ifname);
804
805 return 1;
806 }
807
808 int link_set_mtu(Link *link, uint32_t mtu) {
809 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
810 int r;
811
812 assert(link);
813 assert(link->manager);
814 assert(link->manager->rtnl);
815
816 log_link_debug(link, "setting MTU: %" PRIu32, mtu);
817
818 r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
819 RTM_SETLINK, link->ifindex);
820 if (r < 0) {
821 log_link_error(link, "Could not allocate RTM_SETLINK message");
822 return r;
823 }
824
825 r = sd_rtnl_message_append_u32(req, IFLA_MTU, mtu);
826 if (r < 0) {
827 log_link_error(link, "Could not append MTU: %s", strerror(-r));
828 return r;
829 }
830
831 r = sd_rtnl_call_async(link->manager->rtnl, req, set_mtu_handler, link,
832 0, NULL);
833 if (r < 0) {
834 log_link_error(link,
835 "Could not send rtnetlink message: %s",
836 strerror(-r));
837 return r;
838 }
839
840 link_ref(link);
841
842 return 0;
843 }
844
845 static int link_set_bridge(Link *link) {
846 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
847 int r;
848
849 assert(link);
850 assert(link->network);
851
852 if(link->network->cost == 0)
853 return 0;
854
855 r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
856 RTM_SETLINK, link->ifindex);
857 if (r < 0) {
858 log_link_error(link, "Could not allocate RTM_SETLINK message");
859 return r;
860 }
861
862 r = sd_rtnl_message_link_set_family(req, PF_BRIDGE);
863 if (r < 0) {
864 log_link_error(link,
865 "Could not set message family %s", strerror(-r));
866 return r;
867 }
868
869 r = sd_rtnl_message_open_container(req, IFLA_PROTINFO);
870 if (r < 0) {
871 log_link_error(link,
872 "Could not append IFLA_PROTINFO attribute: %s",
873 strerror(-r));
874 return r;
875 }
876
877 if(link->network->cost != 0) {
878 r = sd_rtnl_message_append_u32(req, IFLA_BRPORT_COST, link->network->cost);
879 if (r < 0) {
880 log_link_error(link,
881 "Could not append IFLA_BRPORT_COST attribute: %s",
882 strerror(-r));
883 return r;
884 }
885 }
886
887 r = sd_rtnl_message_close_container(req);
888 if (r < 0) {
889 log_link_error(link,
890 "Could not append IFLA_LINKINFO attribute: %s",
891 strerror(-r));
892 return r;
893 }
894
895 r = sd_rtnl_call_async(link->manager->rtnl, req, link_set_handler, link, 0, NULL);
896 if (r < 0) {
897 log_link_error(link,
898 "Could not send rtnetlink message: %s",
899 strerror(-r));
900 return r;
901 }
902
903 link_ref(link);
904
905 return r;
906 }
907
908 static void lldp_handler(sd_lldp *lldp, int event, void *userdata) {
909 Link *link = userdata;
910 int r;
911
912 assert(link);
913 assert(link->network);
914 assert(link->manager);
915
916 if (event != UPDATE_INFO)
917 return;
918
919 r = sd_lldp_save(link->lldp, link->lldp_file);
920 if (r < 0)
921 log_link_warning(link, "could not save LLDP");
922
923 }
924
925 static int link_acquire_conf(Link *link) {
926 int r;
927
928 assert(link);
929 assert(link->network);
930 assert(link->manager);
931 assert(link->manager->event);
932
933 if (link_ipv4ll_enabled(link)) {
934 assert(link->ipv4ll);
935
936 log_link_debug(link, "acquiring IPv4 link-local address");
937
938 r = sd_ipv4ll_start(link->ipv4ll);
939 if (r < 0) {
940 log_link_warning(link, "could not acquire IPv4 "
941 "link-local address");
942 return r;
943 }
944 }
945
946 if (link_dhcp4_enabled(link)) {
947 assert(link->dhcp_client);
948
949 log_link_debug(link, "acquiring DHCPv4 lease");
950
951 r = sd_dhcp_client_start(link->dhcp_client);
952 if (r < 0) {
953 log_link_warning(link, "could not acquire DHCPv4 "
954 "lease");
955 return r;
956 }
957 }
958
959 if (link_dhcp6_enabled(link)) {
960 assert(link->icmp6_router_discovery);
961
962 log_link_debug(link, "discovering IPv6 routers");
963
964 r = sd_icmp6_router_solicitation_start(link->icmp6_router_discovery);
965 if (r < 0) {
966 log_link_warning(link,
967 "could not start IPv6 router discovery");
968 return r;
969 }
970 }
971
972 if (link_lldp_enabled(link)) {
973 assert(link->lldp);
974
975 log_link_debug(link, "Starting LLDP");
976
977 r = sd_lldp_start(link->lldp);
978 if (r < 0) {
979 log_link_warning(link, "could not start LLDP ");
980 return r;
981 }
982 }
983
984 return 0;
985 }
986
987 bool link_has_carrier(Link *link) {
988 /* see Documentation/networking/operstates.txt in the kernel sources */
989
990 if (link->kernel_operstate == IF_OPER_UP)
991 return true;
992
993 if (link->kernel_operstate == IF_OPER_UNKNOWN)
994 /* operstate may not be implemented, so fall back to flags */
995 if ((link->flags & IFF_LOWER_UP) && !(link->flags & IFF_DORMANT))
996 return true;
997
998 return false;
999 }
1000
1001 static int link_up_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
1002 _cleanup_link_unref_ Link *link = userdata;
1003 int r;
1004
1005 assert(link);
1006
1007 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1008 return 1;
1009
1010 r = sd_rtnl_message_get_errno(m);
1011 if (r < 0) {
1012 /* we warn but don't fail the link, as it may
1013 be brought up later */
1014 log_link_warning_errno(link, -r, "%-*s: could not bring up interface: %m", IFNAMSIZ, link->ifname);
1015 }
1016
1017 return 1;
1018 }
1019
1020 static int link_up(Link *link) {
1021 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
1022 int r;
1023
1024 assert(link);
1025 assert(link->network);
1026 assert(link->manager);
1027 assert(link->manager->rtnl);
1028
1029 log_link_debug(link, "bringing link up");
1030
1031 r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
1032 RTM_SETLINK, link->ifindex);
1033 if (r < 0) {
1034 log_link_error(link, "Could not allocate RTM_SETLINK message");
1035 return r;
1036 }
1037
1038 r = sd_rtnl_message_link_set_flags(req, IFF_UP, IFF_UP);
1039 if (r < 0) {
1040 log_link_error(link, "Could not set link flags: %s",
1041 strerror(-r));
1042 return r;
1043 }
1044
1045 if (link->network->mac) {
1046 r = sd_rtnl_message_append_ether_addr(req, IFLA_ADDRESS, link->network->mac);
1047 if (r < 0) {
1048 log_link_error(link, "Could not set MAC address: %s", strerror(-r));
1049 return r;
1050 }
1051 }
1052
1053 if (link->network->mtu) {
1054 r = sd_rtnl_message_append_u32(req, IFLA_MTU, link->network->mtu);
1055 if (r < 0) {
1056 log_link_error(link, "Could not set MTU: %s", strerror(-r));
1057 return r;
1058 }
1059 }
1060
1061 r = sd_rtnl_call_async(link->manager->rtnl, req, link_up_handler, link,
1062 0, NULL);
1063 if (r < 0) {
1064 log_link_error(link,
1065 "Could not send rtnetlink message: %s",
1066 strerror(-r));
1067 return r;
1068 }
1069
1070 link_ref(link);
1071
1072 return 0;
1073 }
1074
1075 static int link_joined(Link *link) {
1076 int r;
1077
1078 assert(link);
1079 assert(link->network);
1080
1081 if (!(link->flags & IFF_UP)) {
1082 r = link_up(link);
1083 if (r < 0) {
1084 link_enter_failed(link);
1085 return r;
1086 }
1087 }
1088
1089 if(link->network->bridge) {
1090 r = link_set_bridge(link);
1091 if (r < 0) {
1092 log_link_error(link,
1093 "Could not set bridge message: %s",
1094 strerror(-r));
1095 }
1096 }
1097
1098 return link_enter_set_addresses(link);
1099 }
1100
1101 static int netdev_join_handler(sd_rtnl *rtnl, sd_rtnl_message *m,
1102 void *userdata) {
1103 _cleanup_link_unref_ Link *link = userdata;
1104 int r;
1105
1106 assert(link);
1107 assert(link->network);
1108
1109 link->enslaving --;
1110
1111 if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1112 return 1;
1113
1114 r = sd_rtnl_message_get_errno(m);
1115 if (r < 0 && r != -EEXIST) {
1116 log_link_error_errno(link, -r, "%-*s: could not join netdev: %m", IFNAMSIZ, link->ifname);
1117 link_enter_failed(link);
1118 return 1;
1119 } else
1120 log_link_debug(link, "joined netdev");
1121
1122 if (link->enslaving <= 0)
1123 link_joined(link);
1124
1125 return 1;
1126 }
1127
1128 static int link_enter_join_netdev(Link *link) {
1129 NetDev *netdev;
1130 Iterator i;
1131 int r;
1132
1133 assert(link);
1134 assert(link->network);
1135 assert(link->state == LINK_STATE_PENDING);
1136
1137 link->state = LINK_STATE_ENSLAVING;
1138
1139 link_save(link);
1140
1141 if (!link->network->bridge &&
1142 !link->network->bond &&
1143 hashmap_isempty(link->network->stacked_netdevs))
1144 return link_joined(link);
1145
1146 if (link->network->bond) {
1147 log_link_struct(link, LOG_DEBUG,
1148 "MESSAGE=%-*s: enslaving by '%s'",
1149 IFNAMSIZ,
1150 link->ifname, link->network->bond->ifname,
1151 NETDEVIF(link->network->bond),
1152 NULL);
1153
1154 r = netdev_join(link->network->bond, link, &netdev_join_handler);
1155 if (r < 0) {
1156 log_link_struct(link, LOG_WARNING,
1157 "MESSAGE=%-*s: could not join netdev '%s': %s",
1158 IFNAMSIZ,
1159 link->ifname, link->network->bond->ifname,
1160 strerror(-r),
1161 NETDEVIF(link->network->bond),
1162 NULL);
1163 link_enter_failed(link);
1164 return r;
1165 }
1166
1167 link->enslaving ++;
1168 }
1169
1170 if (link->network->bridge) {
1171 log_link_struct(link, LOG_DEBUG,
1172 "MESSAGE=%-*s: enslaving by '%s'",
1173 IFNAMSIZ,
1174 link->ifname, link->network->bridge->ifname,
1175 NETDEVIF(link->network->bridge),
1176 NULL);
1177
1178 r = netdev_join(link->network->bridge, link,
1179 &netdev_join_handler);
1180 if (r < 0) {
1181 log_link_struct(link, LOG_WARNING,
1182 "MESSAGE=%-*s: could not join netdev '%s': %s",
1183 IFNAMSIZ,
1184 link->ifname, link->network->bridge->ifname,
1185 strerror(-r),
1186 NETDEVIF(link->network->bridge),
1187 NULL);
1188 link_enter_failed(link);
1189 return r;
1190 }
1191
1192 link->enslaving ++;
1193 }
1194
1195 HASHMAP_FOREACH(netdev, link->network->stacked_netdevs, i) {
1196 log_link_struct(link, LOG_DEBUG,
1197 "MESSAGE=%-*s: enslaving by '%s'",
1198 IFNAMSIZ,
1199 link->ifname, netdev->ifname, NETDEVIF(netdev),
1200 NULL);
1201
1202 r = netdev_join(netdev, link, &netdev_join_handler);
1203 if (r < 0) {
1204 log_link_struct(link, LOG_WARNING,
1205 "MESSAGE=%-*s: could not join netdev '%s': %s",
1206 IFNAMSIZ,
1207 link->ifname, netdev->ifname,
1208 strerror(-r),
1209 NETDEVIF(netdev), NULL);
1210 link_enter_failed(link);
1211 return r;
1212 }
1213
1214 link->enslaving ++;
1215 }
1216
1217 return 0;
1218 }
1219
1220 static int link_configure(Link *link) {
1221 int r;
1222
1223 assert(link);
1224 assert(link->network);
1225 assert(link->state == LINK_STATE_PENDING);
1226
1227 r = link_set_bridge_fdb(link);
1228 if (r < 0)
1229 return r;
1230
1231 if (link_ipv4ll_enabled(link)) {
1232 r = ipv4ll_configure(link);
1233 if (r < 0)
1234 return r;
1235 }
1236
1237 if (link_dhcp4_enabled(link)) {
1238 r = dhcp4_configure(link);
1239 if (r < 0)
1240 return r;
1241 }
1242
1243 if (link_dhcp4_server_enabled(link)) {
1244 r = sd_dhcp_server_new(&link->dhcp_server, link->ifindex);
1245 if (r < 0)
1246 return r;
1247
1248 r = sd_dhcp_server_attach_event(link->dhcp_server, NULL, 0);
1249 if (r < 0)
1250 return r;
1251 }
1252
1253 if (link_dhcp6_enabled(link)) {
1254 r = icmp6_configure(link);
1255 if (r < 0)
1256 return r;
1257 }
1258
1259 if (link_lldp_enabled(link)) {
1260 r = sd_lldp_new(link->ifindex, link->ifname, &link->mac, &link->lldp);
1261 if (r < 0)
1262 return r;
1263
1264 r = sd_lldp_attach_event(link->lldp, NULL, 0);
1265 if (r < 0)
1266 return r;
1267
1268 r = sd_lldp_set_callback(link->lldp,
1269 lldp_handler, link);
1270 if (r < 0)
1271 return r;
1272 }
1273
1274 if (link_has_carrier(link)) {
1275 r = link_acquire_conf(link);
1276 if (r < 0)
1277 return r;
1278 }
1279
1280 return link_enter_join_netdev(link);
1281 }
1282
1283 static int link_initialized_and_synced(sd_rtnl *rtnl, sd_rtnl_message *m,
1284 void *userdata) {
1285 _cleanup_link_unref_ Link *link = userdata;
1286 Network *network;
1287 int r;
1288
1289 assert(link);
1290 assert(link->ifname);
1291 assert(link->manager);
1292
1293 if (link->state != LINK_STATE_PENDING)
1294 return 1;
1295
1296 log_link_debug(link, "link state is up-to-date");
1297
1298 r = network_get(link->manager, link->udev_device, link->ifname,
1299 &link->mac, &network);
1300 if (r == -ENOENT) {
1301 link_enter_unmanaged(link);
1302 return 1;
1303 } else if (r < 0)
1304 return r;
1305
1306 if (link->flags & IFF_LOOPBACK) {
1307 if (network->ipv4ll)
1308 log_link_debug(link, "ignoring IPv4LL for loopback link");
1309
1310 if (network->dhcp != DHCP_SUPPORT_NONE)
1311 log_link_debug(link, "ignoring DHCP clients for loopback link");
1312
1313 if (network->dhcp_server)
1314 log_link_debug(link, "ignoring DHCP server for loopback link");
1315 }
1316
1317 r = network_apply(link->manager, network, link);
1318 if (r < 0)
1319 return r;
1320
1321 r = link_configure(link);
1322 if (r < 0)
1323 return r;
1324
1325 return 1;
1326 }
1327
1328 int link_initialized(Link *link, struct udev_device *device) {
1329 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
1330 int r;
1331
1332 assert(link);
1333 assert(link->manager);
1334 assert(link->manager->rtnl);
1335 assert(device);
1336
1337 if (link->state != LINK_STATE_PENDING)
1338 return 0;
1339
1340 if (link->udev_device)
1341 return 0;
1342
1343 log_link_debug(link, "udev initialized link");
1344
1345 link->udev_device = udev_device_ref(device);
1346
1347 /* udev has initialized the link, but we don't know if we have yet
1348 * processed the NEWLINK messages with the latest state. Do a GETLINK,
1349 * when it returns we know that the pending NEWLINKs have already been
1350 * processed and that we are up-to-date */
1351
1352 r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_GETLINK,
1353 link->ifindex);
1354 if (r < 0)
1355 return r;
1356
1357 r = sd_rtnl_call_async(link->manager->rtnl, req,
1358 link_initialized_and_synced, link, 0, NULL);
1359 if (r < 0)
1360 return r;
1361
1362 link_ref(link);
1363
1364 return 0;
1365 }
1366
1367 int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata) {
1368 Manager *m = userdata;
1369 Link *link = NULL;
1370 uint16_t type;
1371 _cleanup_address_free_ Address *address = NULL;
1372 Address *ad;
1373 char buf[INET6_ADDRSTRLEN];
1374 char valid_buf[FORMAT_TIMESPAN_MAX];
1375 const char *valid_str = NULL;
1376 bool address_dropped = false;
1377 int r, ifindex;
1378
1379 assert(rtnl);
1380 assert(message);
1381 assert(m);
1382
1383 if (sd_rtnl_message_is_error(message)) {
1384 r = sd_rtnl_message_get_errno(message);
1385 if (r < 0)
1386 log_warning_errno(r, "rtnl: failed to receive address: %m");
1387
1388 return 0;
1389 }
1390
1391 r = sd_rtnl_message_get_type(message, &type);
1392 if (r < 0) {
1393 log_warning("rtnl: could not get message type");
1394 return 0;
1395 }
1396
1397 r = sd_rtnl_message_addr_get_ifindex(message, &ifindex);
1398 if (r < 0) {
1399 log_warning_errno(r, "rtnl: could not get ifindex: %m");
1400 return 0;
1401 } else if (ifindex <= 0) {
1402 log_warning("rtnl: received address message with invalid ifindex: %d", ifindex);
1403 return 0;
1404 } else {
1405 r = link_get(m, ifindex, &link);
1406 if (r < 0 || !link) {
1407 log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex);
1408 return 0;
1409 }
1410 }
1411
1412 r = address_new_dynamic(&address);
1413 if (r < 0)
1414 return r;
1415
1416 r = sd_rtnl_message_addr_get_family(message, &address->family);
1417 if (r < 0 || !IN_SET(address->family, AF_INET, AF_INET6)) {
1418 log_link_warning(link,
1419 "rtnl: received address with invalid family, ignoring");
1420 return 0;
1421 }
1422
1423 r = sd_rtnl_message_addr_get_prefixlen(message, &address->prefixlen);
1424 if (r < 0) {
1425 log_link_warning(link,
1426 "rtnl: received address with invalid prefixlen, ignoring");
1427 return 0;
1428 }
1429
1430 r = sd_rtnl_message_addr_get_scope(message, &address->scope);
1431 if (r < 0) {
1432 log_link_warning(link,
1433 "rtnl: received address with invalid scope, ignoring");
1434 return 0;
1435 }
1436
1437 r = sd_rtnl_message_addr_get_flags(message, &address->flags);
1438 if (r < 0) {
1439 log_link_warning(link,
1440 "rtnl: received address with invalid flags, ignoring");
1441 return 0;
1442 }
1443
1444 switch (address->family) {
1445 case AF_INET:
1446 r = sd_rtnl_message_read_in_addr(message, IFA_LOCAL,
1447 &address->in_addr.in);
1448 if (r < 0) {
1449 log_link_warning(link,
1450 "rtnl: received address without valid address, ignoring");
1451 return 0;
1452 }
1453
1454 break;
1455
1456 case AF_INET6:
1457 r = sd_rtnl_message_read_in6_addr(message, IFA_ADDRESS,
1458 &address->in_addr.in6);
1459 if (r < 0) {
1460 log_link_warning(link,
1461 "rtnl: received address without valid address, ignoring");
1462 return 0;
1463 }
1464
1465 break;
1466
1467 default:
1468 assert_not_reached("invalid address family");
1469 }
1470
1471 if (!inet_ntop(address->family, &address->in_addr, buf,
1472 INET6_ADDRSTRLEN)) {
1473 log_link_warning(link, "could not print address");
1474 return 0;
1475 }
1476
1477 r = sd_rtnl_message_read_cache_info(message, IFA_CACHEINFO,
1478 &address->cinfo);
1479 if (r >= 0) {
1480 if (address->cinfo.ifa_valid == CACHE_INFO_INFINITY_LIFE_TIME)
1481 valid_str = "ever";
1482 else
1483 valid_str = format_timespan(valid_buf, FORMAT_TIMESPAN_MAX,
1484 address->cinfo.ifa_valid * USEC_PER_SEC,
1485 USEC_PER_SEC);
1486 }
1487
1488 LIST_FOREACH(addresses, ad, link->addresses) {
1489 if (address_equal(ad, address)) {
1490 LIST_REMOVE(addresses, link->addresses, ad);
1491
1492 address_free(ad);
1493
1494 address_dropped = true;
1495
1496 break;
1497 }
1498 }
1499
1500 switch (type) {
1501 case RTM_NEWADDR:
1502 if (!address_dropped)
1503 log_link_debug(link, "added address: %s/%u (valid for %s)",
1504 buf, address->prefixlen, valid_str);
1505 else
1506 log_link_debug(link, "updated address: %s/%u (valid for %s)",
1507 buf, address->prefixlen, valid_str);
1508
1509 LIST_PREPEND(addresses, link->addresses, address);
1510 address = NULL;
1511
1512 link_save(link);
1513
1514 break;
1515 case RTM_DELADDR:
1516 if (address_dropped) {
1517 log_link_debug(link, "removed address: %s/%u (valid for %s)",
1518 buf, address->prefixlen, valid_str);
1519
1520 link_save(link);
1521 } else
1522 log_link_warning(link,
1523 "removing non-existent address: %s/%u (valid for %s)",
1524 buf, address->prefixlen, valid_str);
1525
1526 break;
1527 default:
1528 assert_not_reached("Received invalid RTNL message type");
1529 }
1530
1531 return 1;
1532 }
1533
1534 int link_add(Manager *m, sd_rtnl_message *message, Link **ret) {
1535 Link *link;
1536 _cleanup_udev_device_unref_ struct udev_device *device = NULL;
1537 char ifindex_str[2 + DECIMAL_STR_MAX(int)];
1538 int r;
1539
1540 assert(m);
1541 assert(m->rtnl);
1542 assert(message);
1543 assert(ret);
1544
1545 r = link_new(m, message, ret);
1546 if (r < 0)
1547 return r;
1548
1549 link = *ret;
1550
1551 log_link_debug(link, "link %d added", link->ifindex);
1552
1553 if (detect_container(NULL) <= 0) {
1554 /* not in a container, udev will be around */
1555 sprintf(ifindex_str, "n%d", link->ifindex);
1556 device = udev_device_new_from_device_id(m->udev, ifindex_str);
1557 if (!device) {
1558 log_link_warning(link,
1559 "could not find udev device: %m");
1560 return -errno;
1561 }
1562
1563 if (udev_device_get_is_initialized(device) <= 0) {
1564 /* not yet ready */
1565 log_link_debug(link, "link pending udev initialization...");
1566 return 0;
1567 }
1568
1569 r = link_initialized(link, device);
1570 if (r < 0)
1571 return r;
1572 } else {
1573 /* we are calling a callback directly, so must take a ref */
1574 link_ref(link);
1575
1576 r = link_initialized_and_synced(m->rtnl, NULL, link);
1577 if (r < 0)
1578 return r;
1579 }
1580
1581 return 0;
1582 }
1583
1584 int link_update(Link *link, sd_rtnl_message *m) {
1585 struct ether_addr mac;
1586 const char *ifname;
1587 uint32_t mtu;
1588 bool had_carrier, carrier_gained, carrier_lost;
1589 int r;
1590
1591 assert(link);
1592 assert(link->ifname);
1593 assert(m);
1594
1595 if (link->state == LINK_STATE_LINGER) {
1596 link_ref(link);
1597 log_link_info(link, "link readded");
1598 link->state = LINK_STATE_ENSLAVING;
1599 }
1600
1601 r = sd_rtnl_message_read_string(m, IFLA_IFNAME, &ifname);
1602 if (r >= 0 && !streq(ifname, link->ifname)) {
1603 log_link_info(link, "renamed to %s", ifname);
1604
1605 free(link->ifname);
1606 link->ifname = strdup(ifname);
1607 if (!link->ifname)
1608 return -ENOMEM;
1609 }
1610
1611 r = sd_rtnl_message_read_u32(m, IFLA_MTU, &mtu);
1612 if (r >= 0 && mtu > 0) {
1613 link->mtu = mtu;
1614 if (!link->original_mtu) {
1615 link->original_mtu = mtu;
1616 log_link_debug(link, "saved original MTU: %"
1617 PRIu32, link->original_mtu);
1618 }
1619
1620 if (link->dhcp_client) {
1621 r = sd_dhcp_client_set_mtu(link->dhcp_client,
1622 link->mtu);
1623 if (r < 0) {
1624 log_link_warning(link,
1625 "Could not update MTU in DHCP client: %s",
1626 strerror(-r));
1627 return r;
1628 }
1629 }
1630 }
1631
1632 /* The kernel may broadcast NEWLINK messages without the MAC address
1633 set, simply ignore them. */
1634 r = sd_rtnl_message_read_ether_addr(m, IFLA_ADDRESS, &mac);
1635 if (r >= 0) {
1636 if (memcmp(link->mac.ether_addr_octet, mac.ether_addr_octet,
1637 ETH_ALEN)) {
1638
1639 memcpy(link->mac.ether_addr_octet, mac.ether_addr_octet,
1640 ETH_ALEN);
1641
1642 log_link_debug(link, "MAC address: "
1643 "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
1644 mac.ether_addr_octet[0],
1645 mac.ether_addr_octet[1],
1646 mac.ether_addr_octet[2],
1647 mac.ether_addr_octet[3],
1648 mac.ether_addr_octet[4],
1649 mac.ether_addr_octet[5]);
1650
1651 if (link->ipv4ll) {
1652 r = sd_ipv4ll_set_mac(link->ipv4ll, &link->mac);
1653 if (r < 0) {
1654 log_link_warning(link,
1655 "Could not update MAC address in IPv4LL client: %s",
1656 strerror(-r));
1657 return r;
1658 }
1659 }
1660
1661 if (link->dhcp_client) {
1662 r = sd_dhcp_client_set_mac(link->dhcp_client,
1663 (const uint8_t *) &link->mac,
1664 sizeof (link->mac),
1665 ARPHRD_ETHER);
1666 if (r < 0) {
1667 log_link_warning(link,
1668 "Could not update MAC address in DHCP client: %s",
1669 strerror(-r));
1670 return r;
1671 }
1672 }
1673
1674 if (link->dhcp6_client) {
1675 r = sd_dhcp6_client_set_mac(link->dhcp6_client,
1676 (const uint8_t *) &link->mac,
1677 sizeof (link->mac),
1678 ARPHRD_ETHER);
1679 if (r < 0) {
1680 log_link_warning(link,
1681 "Could not update MAC address in DHCPv6 client: %s",
1682 strerror(-r));
1683 return r;
1684 }
1685 }
1686 }
1687 }
1688
1689 had_carrier = link_has_carrier(link);
1690
1691 r = link_update_flags(link, m);
1692 if (r < 0)
1693 return r;
1694
1695 carrier_gained = !had_carrier && link_has_carrier(link);
1696 carrier_lost = had_carrier && !link_has_carrier(link);
1697
1698 if (carrier_gained) {
1699 log_link_info(link, "gained carrier");
1700
1701 if (link->network) {
1702 r = link_acquire_conf(link);
1703 if (r < 0) {
1704 link_enter_failed(link);
1705 return r;
1706 }
1707 }
1708 } else if (carrier_lost) {
1709 log_link_info(link, "lost carrier");
1710
1711 r = link_stop_clients(link);
1712 if (r < 0) {
1713 link_enter_failed(link);
1714 return r;
1715 }
1716 }
1717
1718 return 0;
1719 }
1720
1721 static void link_update_operstate(Link *link) {
1722
1723 assert(link);
1724
1725 if (link->kernel_operstate == IF_OPER_DORMANT)
1726 link->operstate = LINK_OPERSTATE_DORMANT;
1727 else if (link_has_carrier(link)) {
1728 Address *address;
1729 uint8_t scope = RT_SCOPE_NOWHERE;
1730
1731 /* if we have carrier, check what addresses we have */
1732 LIST_FOREACH(addresses, address, link->addresses) {
1733 if (address->flags & (IFA_F_TENTATIVE | IFA_F_DEPRECATED))
1734 continue;
1735
1736 if (address->scope < scope)
1737 scope = address->scope;
1738 }
1739
1740 if (scope < RT_SCOPE_SITE)
1741 /* universally accessible addresses found */
1742 link->operstate = LINK_OPERSTATE_ROUTABLE;
1743 else if (scope < RT_SCOPE_HOST)
1744 /* only link or site local addresses found */
1745 link->operstate = LINK_OPERSTATE_DEGRADED;
1746 else
1747 /* no useful addresses found */
1748 link->operstate = LINK_OPERSTATE_CARRIER;
1749 } else if (link->flags & IFF_UP)
1750 link->operstate = LINK_OPERSTATE_NO_CARRIER;
1751 else
1752 link->operstate = LINK_OPERSTATE_OFF;
1753 }
1754
1755 int link_save(Link *link) {
1756 _cleanup_free_ char *temp_path = NULL;
1757 _cleanup_fclose_ FILE *f = NULL;
1758 const char *admin_state, *oper_state;
1759 int r;
1760
1761 assert(link);
1762 assert(link->state_file);
1763 assert(link->lease_file);
1764 assert(link->manager);
1765
1766 link_update_operstate(link);
1767
1768 r = manager_save(link->manager);
1769 if (r < 0)
1770 return r;
1771
1772 if (link->state == LINK_STATE_LINGER) {
1773 unlink(link->state_file);
1774 return 0;
1775 }
1776
1777 admin_state = link_state_to_string(link->state);
1778 assert(admin_state);
1779
1780 oper_state = link_operstate_to_string(link->operstate);
1781 assert(oper_state);
1782
1783 r = fopen_temporary(link->state_file, &f, &temp_path);
1784 if (r < 0)
1785 return r;
1786
1787 fchmod(fileno(f), 0644);
1788
1789 fprintf(f,
1790 "# This is private data. Do not parse.\n"
1791 "ADMIN_STATE=%s\n"
1792 "OPER_STATE=%s\n",
1793 admin_state, oper_state);
1794
1795 if (link->network) {
1796 char **address, **domain;
1797 bool space;
1798
1799 fprintf(f, "NETWORK_FILE=%s\n", link->network->filename);
1800
1801 fputs("DNS=", f);
1802 space = false;
1803 STRV_FOREACH(address, link->network->dns) {
1804 if (space)
1805 fputc(' ', f);
1806 fputs(*address, f);
1807 space = true;
1808 }
1809
1810 if (link->network->dhcp_dns &&
1811 link->dhcp_lease) {
1812 const struct in_addr *addresses;
1813
1814 r = sd_dhcp_lease_get_dns(link->dhcp_lease, &addresses);
1815 if (r > 0) {
1816 if (space)
1817 fputc(' ', f);
1818 serialize_in_addrs(f, addresses, r);
1819 }
1820 }
1821
1822 fputs("\n", f);
1823
1824 fprintf(f, "NTP=");
1825 space = false;
1826 STRV_FOREACH(address, link->network->ntp) {
1827 if (space)
1828 fputc(' ', f);
1829 fputs(*address, f);
1830 space = true;
1831 }
1832
1833 if (link->network->dhcp_ntp &&
1834 link->dhcp_lease) {
1835 const struct in_addr *addresses;
1836
1837 r = sd_dhcp_lease_get_ntp(link->dhcp_lease, &addresses);
1838 if (r > 0) {
1839 if (space)
1840 fputc(' ', f);
1841 serialize_in_addrs(f, addresses, r);
1842 }
1843 }
1844
1845 fputs("\n", f);
1846
1847 fprintf(f, "DOMAINS=");
1848 space = false;
1849 STRV_FOREACH(domain, link->network->domains) {
1850 if (space)
1851 fputc(' ', f);
1852 fputs(*domain, f);
1853 space = true;
1854 }
1855
1856 if (link->network->dhcp_domains &&
1857 link->dhcp_lease) {
1858 const char *domainname;
1859
1860 r = sd_dhcp_lease_get_domainname(link->dhcp_lease, &domainname);
1861 if (r >= 0) {
1862 if (space)
1863 fputc(' ', f);
1864 fputs(domainname, f);
1865 }
1866 }
1867
1868 fputs("\n", f);
1869
1870 fprintf(f, "WILDCARD_DOMAIN=%s\n",
1871 yes_no(link->network->wildcard_domain));
1872
1873 fprintf(f, "LLMNR=%s\n",
1874 llmnr_support_to_string(link->network->llmnr));
1875 }
1876
1877 if (link->dhcp_lease) {
1878 assert(link->network);
1879
1880 r = sd_dhcp_lease_save(link->dhcp_lease, link->lease_file);
1881 if (r < 0)
1882 goto fail;
1883
1884 fprintf(f,
1885 "DHCP_LEASE=%s\n",
1886 link->lease_file);
1887 } else
1888 unlink(link->lease_file);
1889
1890 if (link->lldp) {
1891 assert(link->network);
1892
1893 r = sd_lldp_save(link->lldp, link->lldp_file);
1894 if (r < 0)
1895 goto fail;
1896
1897 fprintf(f,
1898 "LLDP_FILE=%s\n",
1899 link->lldp_file);
1900 } else
1901 unlink(link->lldp_file);
1902
1903 r = fflush_and_check(f);
1904 if (r < 0)
1905 goto fail;
1906
1907 if (rename(temp_path, link->state_file) < 0) {
1908 r = -errno;
1909 goto fail;
1910 }
1911
1912 return 0;
1913 fail:
1914 log_link_error(link, "Failed to save link data to %s: %s", link->state_file, strerror(-r));
1915 unlink(link->state_file);
1916 unlink(temp_path);
1917 return r;
1918 }
1919
1920 static const char* const link_state_table[_LINK_STATE_MAX] = {
1921 [LINK_STATE_PENDING] = "pending",
1922 [LINK_STATE_ENSLAVING] = "configuring",
1923 [LINK_STATE_SETTING_ADDRESSES] = "configuring",
1924 [LINK_STATE_SETTING_ROUTES] = "configuring",
1925 [LINK_STATE_CONFIGURED] = "configured",
1926 [LINK_STATE_UNMANAGED] = "unmanaged",
1927 [LINK_STATE_FAILED] = "failed",
1928 [LINK_STATE_LINGER] = "linger",
1929 };
1930
1931 DEFINE_STRING_TABLE_LOOKUP(link_state, LinkState);
1932
1933 static const char* const link_operstate_table[_LINK_OPERSTATE_MAX] = {
1934 [LINK_OPERSTATE_OFF] = "off",
1935 [LINK_OPERSTATE_NO_CARRIER] = "no-carrier",
1936 [LINK_OPERSTATE_DORMANT] = "dormant",
1937 [LINK_OPERSTATE_CARRIER] = "carrier",
1938 [LINK_OPERSTATE_DEGRADED] = "degraded",
1939 [LINK_OPERSTATE_ROUTABLE] = "routable",
1940 };
1941
1942 DEFINE_STRING_TABLE_LOOKUP(link_operstate, LinkOperationalState);