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