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