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