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