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