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