chiark / gitweb /
328c4d8003191edf0dc82890e142de4cd6d9da55
[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.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 "network-util.h"
37 #include "dhcp-lease-internal.h"
38
39 static int ipv4ll_address_update(Link *link, bool deprecate);
40 static bool ipv4ll_is_bound(sd_ipv4ll *ll);
41
42 static int link_new(Manager *manager, sd_rtnl_message *message, Link **ret) {
43         _cleanup_link_unref_ Link *link = NULL;
44         uint16_t type;
45         char *ifname;
46         int r, ifindex;
47
48         assert(manager);
49         assert(manager->links);
50         assert(message);
51         assert(ret);
52
53         r = sd_rtnl_message_get_type(message, &type);
54         if (r < 0)
55                 return r;
56         else if (type != RTM_NEWLINK)
57                 return -EINVAL;
58
59         r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
60         if (r < 0)
61                 return r;
62         else if (ifindex <= 0)
63                 return -EINVAL;
64
65         r = sd_rtnl_message_read_string(message, IFLA_IFNAME, &ifname);
66         if (r < 0)
67                 return r;
68
69         link = new0(Link, 1);
70         if (!link)
71                 return -ENOMEM;
72
73         link->n_ref = 1;
74         link->manager = manager;
75         link->state = LINK_STATE_INITIALIZING;
76         link->ifindex = ifindex;
77         link->ifname = strdup(ifname);
78         if (!link->ifname)
79                 return -ENOMEM;
80
81         r = sd_rtnl_message_read_ether_addr(message, IFLA_ADDRESS, &link->mac);
82         if (r < 0)
83                 log_debug_link(link, "MAC address not found for new device, continuing without");
84
85         r = asprintf(&link->state_file, "/run/systemd/netif/links/%"PRIu64,
86                      link->ifindex);
87         if (r < 0)
88                 return -ENOMEM;
89
90         r = asprintf(&link->lease_file, "/run/systemd/netif/leases/%"PRIu64,
91                      link->ifindex);
92         if (r < 0)
93                 return -ENOMEM;
94
95         r = hashmap_put(manager->links, &link->ifindex, link);
96         if (r < 0)
97                 return r;
98
99         *ret = link;
100         link = NULL;
101
102         return 0;
103 }
104
105 static void link_free(Link *link) {
106         Address *address;
107
108         if (!link)
109                 return;
110
111         while ((address = link->addresses)) {
112                 LIST_REMOVE(addresses, link->addresses, address);
113                 address_free(address);
114         }
115
116         while ((address = link->pool_addresses)) {
117                 LIST_REMOVE(addresses, link->pool_addresses, address);
118                 address_free(address);
119         }
120
121         sd_dhcp_client_unref(link->dhcp_client);
122         sd_dhcp_lease_unref(link->dhcp_lease);
123
124         unlink(link->lease_file);
125         free(link->lease_file);
126
127         sd_ipv4ll_unref(link->ipv4ll);
128         sd_dhcp6_client_unref(link->dhcp6_client);
129         sd_icmp6_nd_unref(link->icmp6_router_discovery);
130
131         if (link->manager)
132                 hashmap_remove(link->manager->links, &link->ifindex);
133
134         free(link->ifname);
135
136         unlink(link->state_file);
137         free(link->state_file);
138
139         udev_device_unref(link->udev_device);
140
141         free(link);
142 }
143
144 Link *link_unref(Link *link) {
145         if (link && (-- link->n_ref <= 0))
146                 link_free(link);
147
148         return NULL;
149 }
150
151 Link *link_ref(Link *link) {
152         if (link)
153                 assert_se(++ link->n_ref >= 2);
154
155         return link;
156 }
157
158 int link_get(Manager *m, int ifindex, Link **ret) {
159         Link *link;
160         uint64_t ifindex_64;
161
162         assert(m);
163         assert(m->links);
164         assert(ifindex);
165         assert(ret);
166
167         ifindex_64 = ifindex;
168         link = hashmap_get(m->links, &ifindex_64);
169         if (!link)
170                 return -ENODEV;
171
172         *ret = link;
173
174         return 0;
175 }
176
177 void link_drop(Link *link) {
178         if (!link || link->state == LINK_STATE_LINGER)
179                 return;
180
181         link->state = LINK_STATE_LINGER;
182
183         log_debug_link(link, "link removed");
184
185         link_unref(link);
186
187         return;
188 }
189
190 static void link_enter_unmanaged(Link *link) {
191         assert(link);
192
193         log_debug_link(link, "unmanaged");
194
195         link->state = LINK_STATE_UNMANAGED;
196
197         link_save(link);
198 }
199
200 static int link_stop_clients(Link *link) {
201         int r = 0, k;
202
203         assert(link);
204         assert(link->manager);
205         assert(link->manager->event);
206
207         if (!link->network)
208                 return 0;
209
210         if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V6)) {
211                 assert(link->dhcp_client);
212
213                 k = sd_dhcp_client_stop(link->dhcp_client);
214                 if (k < 0) {
215                         log_warning_link(link, "Could not stop DHCPv4 client: %s", strerror(-r));
216                         r = k;
217                 }
218         }
219
220         if (link->network->ipv4ll) {
221                 assert(link->ipv4ll);
222
223                 k = sd_ipv4ll_stop(link->ipv4ll);
224                 if (k < 0) {
225                         log_warning_link(link, "Could not stop IPv4 link-local: %s", strerror(-r));
226                         r = k;
227                 }
228         }
229
230         if (link->network->dhcp_server) {
231                 assert(link->dhcp_server);
232
233                 k = sd_dhcp_server_stop(link->dhcp_server);
234                 if (k < 0) {
235                         log_warning_link(link, "Could not stop DHCPv4 server: %s", strerror(-r));
236                         r = k;
237                 }
238         }
239
240         if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V6)) {
241                 assert(link->icmp6_router_discovery);
242
243                 if (link->dhcp6_client) {
244                         k = sd_dhcp6_client_stop(link->dhcp6_client);
245                         if (k < 0) {
246                                 log_warning_link(link, "Could not stop DHCPv6 client: %s", strerror(-r));
247                                 r = k;
248                         }
249                 }
250
251                 k = sd_icmp6_nd_stop(link->icmp6_router_discovery);
252                 if (k < 0) {
253                         log_warning_link(link, "Could not stop ICMPv6 router discovery: %s", strerror(-r));
254                         r = k;
255                 }
256         }
257
258         return r;
259 }
260
261 static void link_enter_failed(Link *link) {
262         assert(link);
263
264         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
265                 return;
266
267         log_warning_link(link, "failed");
268
269         link->state = LINK_STATE_FAILED;
270
271         link_stop_clients(link);
272
273         link_save(link);
274 }
275
276 static Address* link_find_dhcp_server_address(Link *link) {
277         Address *address;
278
279         assert(link);
280         assert(link->network);
281
282         /* The the first statically configured address if there is any */
283         LIST_FOREACH(addresses, address, link->network->static_addresses) {
284
285                 if (address->family != AF_INET)
286                         continue;
287
288                 if (in_addr_null(address->family, &address->in_addr))
289                         continue;
290
291                 return address;
292         }
293
294         /* If that didn't work, find a suitable address we got from the pool */
295         LIST_FOREACH(addresses, address, link->pool_addresses) {
296                 if (address->family != AF_INET)
297                         continue;
298
299                 return address;
300         }
301
302         return NULL;
303 }
304
305 static int link_enter_configured(Link *link) {
306         int r;
307
308         assert(link);
309         assert(link->network);
310         assert(link->state == LINK_STATE_SETTING_ROUTES);
311
312         if (link->network->dhcp_server &&
313             !sd_dhcp_server_is_running(link->dhcp_server)) {
314                 struct in_addr pool_start;
315                 Address *address;
316
317                 address = link_find_dhcp_server_address(link);
318                 if (!address) {
319                         log_warning_link(link, "Failed to find suitable address for DHCPv4 server instance.");
320                         link_enter_failed(link);
321                         return 0;
322                 }
323
324                 log_debug_link(link, "offering DHCPv4 leases");
325
326                 r = sd_dhcp_server_set_address(link->dhcp_server, &address->in_addr.in);
327                 if (r < 0)
328                         return r;
329
330                 /* offer 32 addresses starting from the address following the server address */
331                 pool_start.s_addr = htobe32(be32toh(address->in_addr.in.s_addr) + 1);
332                 r = sd_dhcp_server_set_lease_pool(link->dhcp_server,
333                                                   &pool_start, 32);
334                 if (r < 0)
335                         return r;
336
337                 /* TODO:
338                 r = sd_dhcp_server_set_router(link->dhcp_server,
339                                               &main_address->in_addr.in);
340                 if (r < 0)
341                         return r;
342
343                 r = sd_dhcp_server_set_prefixlen(link->dhcp_server,
344                                                  main_address->prefixlen);
345                 if (r < 0)
346                         return r;
347                 */
348
349                 r = sd_dhcp_server_start(link->dhcp_server);
350                 if (r < 0) {
351                         log_warning_link(link, "could not start DHCPv4 server "
352                                          "instance: %s", strerror(-r));
353
354                         link_enter_failed(link);
355
356                         return 0;
357                 }
358         }
359
360         log_info_link(link, "link configured");
361
362         link->state = LINK_STATE_CONFIGURED;
363
364         link_save(link);
365
366         return 0;
367 }
368
369 static int route_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
370         _cleanup_link_unref_ Link *link = userdata;
371         int r;
372
373         assert(link->route_messages > 0);
374         assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
375                       LINK_STATE_SETTING_ROUTES, LINK_STATE_FAILED,
376                       LINK_STATE_LINGER));
377
378         link->route_messages --;
379
380         if (IN_SET(LINK_STATE_FAILED, LINK_STATE_LINGER))
381                 return 1;
382
383         r = sd_rtnl_message_get_errno(m);
384         if (r < 0 && r != -EEXIST)
385                 log_struct_link(LOG_WARNING, link,
386                                 "MESSAGE=%-*s: could not set route: %s",
387                                 IFNAMSIZ,
388                                 link->ifname, strerror(-r),
389                                 "ERRNO=%d", -r,
390                                 NULL);
391
392         /* we might have received an old reply after moving back to SETTING_ADDRESSES,
393          * ignore it */
394         if (link->route_messages == 0 && link->state == LINK_STATE_SETTING_ROUTES) {
395                 log_debug_link(link, "routes set");
396                 link_enter_configured(link);
397         }
398
399         return 1;
400 }
401
402 static int link_set_dhcp_routes(Link *link) {
403         struct sd_dhcp_route *static_routes;
404         int r, n, i;
405
406         assert(link);
407
408         n = sd_dhcp_lease_get_routes(link->dhcp_lease, &static_routes);
409         if (n < 0) {
410                 if (n != -ENOENT)
411                         log_warning_link(link, "DHCP error: could not get routes: %s", strerror(-n));
412                 return n;
413         }
414
415         for (i = 0; i < n; i++) {
416                 _cleanup_route_free_ Route *route = NULL;
417
418                 r = route_new_dynamic(&route);
419                 if (r < 0) {
420                         log_error_link(link, "Could not allocate route: %s",
421                                        strerror(-r));
422                         return r;
423                 }
424
425                 route->family = AF_INET;
426                 route->in_addr.in = static_routes[i].gw_addr;
427                 route->dst_addr.in = static_routes[i].dst_addr;
428                 route->dst_prefixlen = static_routes[i].dst_prefixlen;
429                 route->metrics = DHCP_ROUTE_METRIC;
430
431                 r = route_configure(route, link, &route_handler);
432                 if (r < 0) {
433                         log_warning_link(link,
434                                          "could not set host route: %s", strerror(-r));
435                         return r;
436                 }
437
438                 link->route_messages ++;
439         }
440
441         return 0;
442 }
443
444 static int link_enter_set_routes(Link *link) {
445         Route *rt;
446         int r;
447
448         assert(link);
449         assert(link->network);
450         assert(link->state == LINK_STATE_SETTING_ADDRESSES);
451
452         link->state = LINK_STATE_SETTING_ROUTES;
453
454         if (!link->network->static_routes && !link->dhcp_lease &&
455             (!link->ipv4ll || ipv4ll_is_bound(link->ipv4ll) == false))
456                 return link_enter_configured(link);
457
458         log_debug_link(link, "setting routes");
459
460         LIST_FOREACH(routes, rt, link->network->static_routes) {
461                 r = route_configure(rt, link, &route_handler);
462                 if (r < 0) {
463                         log_warning_link(link,
464                                          "could not set routes: %s", strerror(-r));
465                         link_enter_failed(link);
466                         return r;
467                 }
468
469                 link->route_messages ++;
470         }
471
472         if (link->ipv4ll && !link->dhcp_lease) {
473                 _cleanup_route_free_ Route *route = NULL;
474                 struct in_addr addr;
475
476                 r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
477                 if (r < 0 && r != -ENOENT) {
478                         log_warning_link(link, "IPV4LL error: no address: %s",
479                                         strerror(-r));
480                         return r;
481                 }
482
483                 if (r != -ENOENT) {
484                         r = route_new_dynamic(&route);
485                         if (r < 0) {
486                                 log_error_link(link, "Could not allocate route: %s",
487                                                strerror(-r));
488                                 return r;
489                         }
490
491                         route->family = AF_INET;
492                         route->scope = RT_SCOPE_LINK;
493                         route->metrics = IPV4LL_ROUTE_METRIC;
494
495                         r = route_configure(route, link, &route_handler);
496                         if (r < 0) {
497                                 log_warning_link(link,
498                                                  "could not set routes: %s", strerror(-r));
499                                 link_enter_failed(link);
500                                 return r;
501                         }
502
503                         link->route_messages ++;
504                 }
505         }
506
507         if (link->dhcp_lease) {
508                 _cleanup_route_free_ Route *route = NULL;
509                 _cleanup_route_free_ Route *route_gw = NULL;
510                 struct in_addr gateway;
511
512                 r = sd_dhcp_lease_get_router(link->dhcp_lease, &gateway);
513                 if (r < 0 && r != -ENOENT) {
514                         log_warning_link(link, "DHCP error: could not get gateway: %s",
515                                          strerror(-r));
516                         return r;
517                 }
518
519                 if (r >= 0) {
520                         r = route_new_dynamic(&route);
521                         if (r < 0) {
522                                 log_error_link(link, "Could not allocate route: %s",
523                                                strerror(-r));
524                                 return r;
525                         }
526
527                         r = route_new_dynamic(&route_gw);
528                         if (r < 0) {
529                                 log_error_link(link, "Could not allocate route: %s",
530                                                strerror(-r));
531                                 return r;
532                         }
533
534                         /* The dhcp netmask may mask out the gateway. Add an explicit
535                          * route for the gw host so that we can route no matter the
536                          * netmask or existing kernel route tables. */
537                         route_gw->family = AF_INET;
538                         route_gw->dst_addr.in = gateway;
539                         route_gw->dst_prefixlen = 32;
540                         route_gw->scope = RT_SCOPE_LINK;
541                         route_gw->metrics = DHCP_ROUTE_METRIC;
542
543                         r = route_configure(route_gw, link, &route_handler);
544                         if (r < 0) {
545                                 log_warning_link(link,
546                                                  "could not set host route: %s", strerror(-r));
547                                 return r;
548                         }
549
550                         link->route_messages ++;
551
552                         route->family = AF_INET;
553                         route->in_addr.in = gateway;
554                         route->metrics = DHCP_ROUTE_METRIC;
555
556                         r = route_configure(route, link, &route_handler);
557                         if (r < 0) {
558                                 log_warning_link(link,
559                                                  "could not set routes: %s", strerror(-r));
560                                 link_enter_failed(link);
561                                 return r;
562                         }
563
564                         link->route_messages ++;
565                 }
566
567                 if (link->network->dhcp_routes)
568                         link_set_dhcp_routes(link);
569         }
570
571         if (link->route_messages == 0) {
572                 link_enter_configured(link);
573         }
574
575         return 0;
576 }
577
578 static int route_drop_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
579         _cleanup_link_unref_ Link *link = userdata;
580         int r;
581
582         assert(m);
583         assert(link);
584         assert(link->ifname);
585
586         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
587                 return 1;
588
589         r = sd_rtnl_message_get_errno(m);
590         if (r < 0 && r != -ESRCH)
591                 log_struct_link(LOG_WARNING, link,
592                                 "MESSAGE=%-*s: could not drop route: %s",
593                                 IFNAMSIZ,
594                                 link->ifname, strerror(-r),
595                                 "ERRNO=%d", -r,
596                                 NULL);
597
598         return 1;
599 }
600
601 static int link_get_address_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
602         _cleanup_link_unref_ Link *link = userdata;
603         int r;
604
605         assert(rtnl);
606         assert(m);
607         assert(link);
608         assert(link->manager);
609
610         for (; m; m = sd_rtnl_message_next(m)) {
611                 r = sd_rtnl_message_get_errno(m);
612                 if (r < 0) {
613                         log_debug_link(link, "getting address failed: %s", strerror(-r));
614                         continue;
615                 }
616
617                 r = link_rtnl_process_address(rtnl, m, link->manager);
618                 if (r < 0)
619                         log_warning_link(link, "could not process address: %s", strerror(-r));
620         }
621
622         return 1;
623 }
624
625 static int address_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
626         _cleanup_link_unref_ Link *link = userdata;
627         int r;
628
629         assert(rtnl);
630         assert(m);
631         assert(link);
632         assert(link->ifname);
633         assert(link->addr_messages > 0);
634         assert(IN_SET(link->state, LINK_STATE_SETTING_ADDRESSES,
635                LINK_STATE_FAILED, LINK_STATE_LINGER));
636
637         link->addr_messages --;
638
639         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
640                 return 1;
641
642         r = sd_rtnl_message_get_errno(m);
643         if (r < 0 && r != -EEXIST)
644                 log_struct_link(LOG_WARNING, link,
645                                 "MESSAGE=%-*s: could not set address: %s",
646                                 IFNAMSIZ,
647                                 link->ifname, strerror(-r),
648                                 "ERRNO=%d", -r,
649                                 NULL);
650         else if (r >= 0) {
651                 /* calling handler directly so take a ref */
652                 link_ref(link);
653                 link_get_address_handler(rtnl, m, link);
654         }
655
656         if (link->addr_messages == 0) {
657                 log_debug_link(link, "addresses set");
658                 link_enter_set_routes(link);
659         }
660
661         return 1;
662 }
663
664 static int link_enter_set_addresses(Link *link) {
665         Address *ad;
666         int r;
667         uint32_t lifetime = CACHE_INFO_INFINITY_LIFE_TIME;
668
669         assert(link);
670         assert(link->network);
671         assert(link->state != _LINK_STATE_INVALID);
672
673         link->state = LINK_STATE_SETTING_ADDRESSES;
674
675         if (!link->network->static_addresses && !link->dhcp_lease &&
676                 (!link->ipv4ll || ipv4ll_is_bound(link->ipv4ll) == false))
677                 return link_enter_set_routes(link);
678
679         log_debug_link(link, "setting addresses");
680
681         LIST_FOREACH(addresses, ad, link->network->static_addresses) {
682                 r = address_configure(ad, link, &address_handler);
683                 if (r < 0) {
684                         log_warning_link(link,
685                                          "could not set addresses: %s", strerror(-r));
686                         link_enter_failed(link);
687                         return r;
688                 }
689
690                 link->addr_messages ++;
691         }
692
693         if (link->ipv4ll && !link->dhcp_lease) {
694                 _cleanup_address_free_ Address *ll_addr = NULL;
695                 struct in_addr addr;
696
697                 r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
698                 if (r < 0 && r != -ENOENT) {
699                         log_warning_link(link, "IPV4LL error: no address: %s",
700                                         strerror(-r));
701                         return r;
702                 }
703
704                 if (r != -ENOENT) {
705                         r = address_new_dynamic(&ll_addr);
706                         if (r < 0) {
707                                 log_error_link(link, "Could not allocate address: %s", strerror(-r));
708                                 return r;
709                         }
710
711                         ll_addr->family = AF_INET;
712                         ll_addr->in_addr.in = addr;
713                         ll_addr->prefixlen = 16;
714                         ll_addr->broadcast.s_addr = ll_addr->in_addr.in.s_addr | htonl(0xfffffffflu >> ll_addr->prefixlen);
715                         ll_addr->scope = RT_SCOPE_LINK;
716
717                         r = address_configure(ll_addr, link, &address_handler);
718                         if (r < 0) {
719                                 log_warning_link(link,
720                                          "could not set addresses: %s", strerror(-r));
721                                 link_enter_failed(link);
722                                 return r;
723                         }
724
725                         link->addr_messages ++;
726                 }
727         }
728
729         if (link->dhcp_lease) {
730                 _cleanup_address_free_ Address *address = NULL;
731                 struct in_addr addr;
732                 struct in_addr netmask;
733                 unsigned prefixlen;
734
735                 r = sd_dhcp_lease_get_address(link->dhcp_lease, &addr);
736                 if (r < 0) {
737                         log_warning_link(link, "DHCP error: no address: %s",
738                                          strerror(-r));
739                         return r;
740                 }
741
742                 if (!link->network->dhcp_critical) {
743                         r = sd_dhcp_lease_get_lifetime(link->dhcp_lease,
744                                                        &lifetime);
745                         if (r < 0) {
746                                 log_warning_link(link, "DHCP error: no lifetime: %s",
747                                                  strerror(-r));
748                                 return r;
749                         }
750                 }
751
752                 r = sd_dhcp_lease_get_netmask(link->dhcp_lease, &netmask);
753                 if (r < 0) {
754                         log_warning_link(link, "DHCP error: no netmask: %s",
755                                          strerror(-r));
756                         return r;
757                 }
758
759                 prefixlen = net_netmask_to_prefixlen(&netmask);
760
761                 r = address_new_dynamic(&address);
762                 if (r < 0) {
763                         log_error_link(link, "Could not allocate address: %s",
764                                        strerror(-r));
765                         return r;
766                 }
767
768                 address->family = AF_INET;
769                 address->in_addr.in = addr;
770                 address->cinfo.ifa_prefered = lifetime;
771                 address->cinfo.ifa_valid = lifetime;
772                 address->prefixlen = prefixlen;
773                 address->broadcast.s_addr = addr.s_addr | ~netmask.s_addr;
774
775                 /* use update rather than configure so that we will update the lifetime
776                    of an existing address if it has already been configured */
777                 r = address_update(address, link, &address_handler);
778                 if (r < 0) {
779                         log_warning_link(link,
780                                          "could not set addresses: %s", strerror(-r));
781                         link_enter_failed(link);
782                         return r;
783                 }
784
785                 link->addr_messages ++;
786         }
787
788         return 0;
789 }
790
791 static int address_update_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
792         _cleanup_link_unref_ Link *link = userdata;
793         int r;
794
795         assert(m);
796         assert(link);
797         assert(link->ifname);
798
799         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
800                 return 1;
801
802         r = sd_rtnl_message_get_errno(m);
803         if (r < 0 && r != -ENOENT)
804                 log_struct_link(LOG_WARNING, link,
805                                 "MESSAGE=%-*s: could not update address: %s",
806                                 IFNAMSIZ,
807                                 link->ifname, strerror(-r),
808                                 "ERRNO=%d", -r,
809                                 NULL);
810
811         return 1;
812 }
813
814 static int address_drop_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
815         _cleanup_link_unref_ Link *link = userdata;
816         int r;
817
818         assert(m);
819         assert(link);
820         assert(link->ifname);
821
822         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
823                 return 1;
824
825         r = sd_rtnl_message_get_errno(m);
826         if (r < 0 && r != -EADDRNOTAVAIL)
827                 log_struct_link(LOG_WARNING, link,
828                                 "MESSAGE=%-*s: could not drop address: %s",
829                                 IFNAMSIZ,
830                                 link->ifname, strerror(-r),
831                                 "ERRNO=%d", -r,
832                                 NULL);
833
834         return 1;
835 }
836
837 static int set_hostname_handler(sd_bus *bus, sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
838         _cleanup_link_unref_ Link *link = userdata;
839         int r;
840
841         assert(link);
842
843         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
844                 return 1;
845
846         r = sd_bus_message_get_errno(m);
847         if (r < 0)
848                 log_warning_link(link, "Could not set hostname: %s", strerror(-r));
849
850         return 1;
851 }
852
853 static int link_set_hostname(Link *link, const char *hostname) {
854         _cleanup_bus_message_unref_ sd_bus_message *m = NULL;
855         int r = 0;
856
857         assert(link);
858         assert(link->manager);
859         assert(hostname);
860
861         log_debug_link(link, "Setting transient hostname: '%s'", hostname);
862
863         if (!link->manager->bus) { /* TODO: replace by assert when we can rely on kdbus */
864                 log_info_link(link, "Not connected to system bus, ignoring transient hostname.");
865                 return 0;
866         }
867
868         r = sd_bus_message_new_method_call(
869                         link->manager->bus,
870                         &m,
871                         "org.freedesktop.hostname1",
872                         "/org/freedesktop/hostname1",
873                         "org.freedesktop.hostname1",
874                         "SetHostname");
875         if (r < 0)
876                 return r;
877
878         r = sd_bus_message_append(m, "sb", hostname, false);
879         if (r < 0)
880                 return r;
881
882         r = sd_bus_call_async(link->manager->bus, NULL, m, set_hostname_handler, link, 0);
883         if (r < 0) {
884                 log_error_link(link, "Could not set transient hostname: %s", strerror(-r));
885                 return r;
886         }
887
888         link_ref(link);
889
890         return 0;
891 }
892
893 static int set_mtu_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
894         _cleanup_link_unref_ Link *link = userdata;
895         int r;
896
897         assert(m);
898         assert(link);
899         assert(link->ifname);
900
901         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
902                 return 1;
903
904         r = sd_rtnl_message_get_errno(m);
905         if (r < 0)
906                 log_struct_link(LOG_WARNING, link,
907                                 "MESSAGE=%-*s: could not set MTU: %s",
908                                 IFNAMSIZ, link->ifname, strerror(-r),
909                                 "ERRNO=%d", -r,
910                                 NULL);
911
912         return 1;
913 }
914
915 static int link_set_mtu(Link *link, uint32_t mtu) {
916         _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
917         int r;
918
919         assert(link);
920         assert(link->manager);
921         assert(link->manager->rtnl);
922
923         log_debug_link(link, "setting MTU: %" PRIu32, mtu);
924
925         r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
926                                      RTM_SETLINK, link->ifindex);
927         if (r < 0) {
928                 log_error_link(link, "Could not allocate RTM_SETLINK message");
929                 return r;
930         }
931
932         r = sd_rtnl_message_append_u32(req, IFLA_MTU, mtu);
933         if (r < 0) {
934                 log_error_link(link, "Could not append MTU: %s", strerror(-r));
935                 return r;
936         }
937
938         r = sd_rtnl_call_async(link->manager->rtnl, req, set_mtu_handler, link, 0, NULL);
939         if (r < 0) {
940                 log_error_link(link,
941                                "Could not send rtnetlink message: %s", strerror(-r));
942                 return r;
943         }
944
945         link_ref(link);
946
947         return 0;
948 }
949
950 static int dhcp_lease_lost(Link *link) {
951         _cleanup_address_free_ Address *address = NULL;
952         struct in_addr addr;
953         struct in_addr netmask;
954         struct in_addr gateway;
955         unsigned prefixlen;
956         int r;
957
958         assert(link);
959         assert(link->dhcp_lease);
960
961         log_warning_link(link, "DHCP lease lost");
962
963         if (link->network->dhcp_routes) {
964                 struct sd_dhcp_route *routes;
965                 int n, i;
966
967                 n = sd_dhcp_lease_get_routes(link->dhcp_lease, &routes);
968                 if (n >= 0) {
969                         for (i = 0; i < n; i++) {
970                                 _cleanup_route_free_ Route *route = NULL;
971
972                                 r = route_new_dynamic(&route);
973                                 if (r >= 0) {
974                                         route->family = AF_INET;
975                                         route->in_addr.in = routes[i].gw_addr;
976                                         route->dst_addr.in = routes[i].dst_addr;
977                                         route->dst_prefixlen = routes[i].dst_prefixlen;
978
979                                         route_drop(route, link, &route_drop_handler);
980                                 }
981                         }
982                 }
983         }
984
985         r = address_new_dynamic(&address);
986         if (r >= 0) {
987                 r = sd_dhcp_lease_get_router(link->dhcp_lease, &gateway);
988                 if (r >= 0) {
989                         _cleanup_route_free_ Route *route_gw = NULL;
990                         _cleanup_route_free_ Route *route = NULL;
991
992                         r = route_new_dynamic(&route_gw);
993                         if (r >= 0) {
994                                 route_gw->family = AF_INET;
995                                 route_gw->dst_addr.in = gateway;
996                                 route_gw->dst_prefixlen = 32;
997                                 route_gw->scope = RT_SCOPE_LINK;
998
999                                 route_drop(route_gw, link, &route_drop_handler);
1000                         }
1001
1002                         r = route_new_dynamic(&route);
1003                         if (r >= 0) {
1004                                 route->family = AF_INET;
1005                                 route->in_addr.in = gateway;
1006
1007                                 route_drop(route, link, &route_drop_handler);
1008                         }
1009                 }
1010
1011                 sd_dhcp_lease_get_address(link->dhcp_lease, &addr);
1012                 sd_dhcp_lease_get_netmask(link->dhcp_lease, &netmask);
1013                 prefixlen = net_netmask_to_prefixlen(&netmask);
1014
1015                 address->family = AF_INET;
1016                 address->in_addr.in = addr;
1017                 address->prefixlen = prefixlen;
1018
1019                 address_drop(address, link, &address_drop_handler);
1020         }
1021
1022         if (link->network->dhcp_mtu) {
1023                 uint16_t mtu;
1024
1025                 r = sd_dhcp_lease_get_mtu(link->dhcp_lease, &mtu);
1026                 if (r >= 0 && link->original_mtu != mtu) {
1027                         r = link_set_mtu(link, link->original_mtu);
1028                         if (r < 0) {
1029                                 log_warning_link(link, "DHCP error: could not reset MTU");
1030                                 link_enter_failed(link);
1031                                 return r;
1032                         }
1033                 }
1034         }
1035
1036         if (link->network->dhcp_hostname) {
1037                 const char *hostname = NULL;
1038
1039                 r = sd_dhcp_lease_get_hostname(link->dhcp_lease, &hostname);
1040                 if (r >= 0 && hostname) {
1041                         r = link_set_hostname(link, "");
1042                         if (r < 0)
1043                                 log_error_link(link, "Failed to reset transient hostname");
1044                 }
1045         }
1046
1047         link->dhcp_lease = sd_dhcp_lease_unref(link->dhcp_lease);
1048
1049         return 0;
1050 }
1051
1052 static int dhcp_lease_renew(sd_dhcp_client *client, Link *link) {
1053         sd_dhcp_lease *lease;
1054         int r;
1055
1056         r = sd_dhcp_client_get_lease(client, &lease);
1057         if (r < 0) {
1058                 log_warning_link(link, "DHCP error: no lease %s",
1059                                  strerror(-r));
1060                 return r;
1061         }
1062
1063         sd_dhcp_lease_unref(link->dhcp_lease);
1064         link->dhcp_lease = lease;
1065
1066         link_enter_set_addresses(link);
1067
1068         return 0;
1069 }
1070
1071 static int dhcp_lease_acquired(sd_dhcp_client *client, Link *link) {
1072         sd_dhcp_lease *lease;
1073         struct in_addr address;
1074         struct in_addr netmask;
1075         struct in_addr gateway;
1076         unsigned prefixlen;
1077         int r;
1078
1079         assert(client);
1080         assert(link);
1081
1082         r = sd_dhcp_client_get_lease(client, &lease);
1083         if (r < 0) {
1084                 log_warning_link(link, "DHCP error: no lease: %s",
1085                                  strerror(-r));
1086                 return r;
1087         }
1088
1089         r = sd_dhcp_lease_get_address(lease, &address);
1090         if (r < 0) {
1091                 log_warning_link(link, "DHCP error: no address: %s",
1092                                  strerror(-r));
1093                 return r;
1094         }
1095
1096         r = sd_dhcp_lease_get_netmask(lease, &netmask);
1097         if (r < 0) {
1098                 log_warning_link(link, "DHCP error: no netmask: %s",
1099                                  strerror(-r));
1100                 return r;
1101         }
1102
1103         prefixlen = net_netmask_to_prefixlen(&netmask);
1104
1105         r = sd_dhcp_lease_get_router(lease, &gateway);
1106         if (r < 0 && r != -ENOENT) {
1107                 log_warning_link(link, "DHCP error: could not get gateway: %s",
1108                                  strerror(-r));
1109                 return r;
1110         }
1111
1112         if (r >= 0)
1113                 log_struct_link(LOG_INFO, link,
1114                                 "MESSAGE=%-*s: DHCPv4 address %u.%u.%u.%u/%u via %u.%u.%u.%u",
1115                                  IFNAMSIZ,
1116                                  link->ifname,
1117                                  ADDRESS_FMT_VAL(address),
1118                                  prefixlen,
1119                                  ADDRESS_FMT_VAL(gateway),
1120                                  "ADDRESS=%u.%u.%u.%u",
1121                                  ADDRESS_FMT_VAL(address),
1122                                  "PREFIXLEN=%u",
1123                                  prefixlen,
1124                                  "GATEWAY=%u.%u.%u.%u",
1125                                  ADDRESS_FMT_VAL(gateway),
1126                                  NULL);
1127         else
1128                 log_struct_link(LOG_INFO, link,
1129                                 "MESSAGE=%-*s: DHCPv4 address %u.%u.%u.%u/%u",
1130                                  IFNAMSIZ,
1131                                  link->ifname,
1132                                  ADDRESS_FMT_VAL(address),
1133                                  prefixlen,
1134                                  "ADDRESS=%u.%u.%u.%u",
1135                                  ADDRESS_FMT_VAL(address),
1136                                  "PREFIXLEN=%u",
1137                                  prefixlen,
1138                                  NULL);
1139
1140         link->dhcp_lease = lease;
1141
1142         if (link->network->dhcp_mtu) {
1143                 uint16_t mtu;
1144
1145                 r = sd_dhcp_lease_get_mtu(lease, &mtu);
1146                 if (r >= 0) {
1147                         r = link_set_mtu(link, mtu);
1148                         if (r < 0)
1149                                 log_error_link(link, "Failed to set MTU "
1150                                                "to %" PRIu16, mtu);
1151                 }
1152         }
1153
1154         if (link->network->dhcp_hostname) {
1155                 const char *hostname;
1156
1157                 r = sd_dhcp_lease_get_hostname(lease, &hostname);
1158                 if (r >= 0) {
1159                         r = link_set_hostname(link, hostname);
1160                         if (r < 0)
1161                                 log_error_link(link, "Failed to set transient hostname "
1162                                           "to '%s'", hostname);
1163                 }
1164         }
1165
1166         link_enter_set_addresses(link);
1167
1168         return 0;
1169 }
1170
1171 static void dhcp_handler(sd_dhcp_client *client, int event, void *userdata) {
1172         Link *link = userdata;
1173         int r = 0;
1174
1175         assert(link);
1176         assert(link->network);
1177         assert(link->manager);
1178
1179         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1180                 return;
1181
1182         switch (event) {
1183                 case DHCP_EVENT_NO_LEASE:
1184                         log_debug_link(link, "IP address in use.");
1185                         break;
1186                 case DHCP_EVENT_EXPIRED:
1187                 case DHCP_EVENT_STOP:
1188                 case DHCP_EVENT_IP_CHANGE:
1189                         if (link->network->dhcp_critical) {
1190                                 log_error_link(link, "DHCPv4 connection considered system critical, "
1191                                                "ignoring request to reconfigure it.");
1192                                 return;
1193                         }
1194
1195                         if (link->dhcp_lease) {
1196                                 r = dhcp_lease_lost(link);
1197                                 if (r < 0) {
1198                                         link_enter_failed(link);
1199                                         return;
1200                                 }
1201                         }
1202
1203                         if (event == DHCP_EVENT_IP_CHANGE) {
1204                                 r = dhcp_lease_acquired(client, link);
1205                                 if (r < 0) {
1206                                         link_enter_failed(link);
1207                                         return;
1208                                 }
1209                         }
1210
1211                         if (event == DHCP_EVENT_EXPIRED && link->network->ipv4ll) {
1212                                 if (!sd_ipv4ll_is_running(link->ipv4ll))
1213                                         r = sd_ipv4ll_start(link->ipv4ll);
1214                                 else if (ipv4ll_is_bound(link->ipv4ll))
1215                                         r = ipv4ll_address_update(link, false);
1216                                 if (r < 0) {
1217                                         link_enter_failed(link);
1218                                         return;
1219                                 }
1220                         }
1221
1222                         break;
1223                 case DHCP_EVENT_RENEW:
1224                         r = dhcp_lease_renew(client, link);
1225                         if (r < 0) {
1226                                 link_enter_failed(link);
1227                                 return;
1228                         }
1229                         break;
1230                 case DHCP_EVENT_IP_ACQUIRE:
1231                         r = dhcp_lease_acquired(client, link);
1232                         if (r < 0) {
1233                                 link_enter_failed(link);
1234                                 return;
1235                         }
1236                         if (link->ipv4ll) {
1237                                 if (ipv4ll_is_bound(link->ipv4ll))
1238                                         r = ipv4ll_address_update(link, true);
1239                                 else
1240                                         r = sd_ipv4ll_stop(link->ipv4ll);
1241                                 if (r < 0) {
1242                                         link_enter_failed(link);
1243                                         return;
1244                                 }
1245                         }
1246                         break;
1247                 default:
1248                         if (event < 0)
1249                                 log_warning_link(link, "DHCP error: client failed: %s", strerror(-event));
1250                         else
1251                                 log_warning_link(link, "DHCP unknown event: %d", event);
1252                         break;
1253         }
1254
1255         return;
1256 }
1257
1258 static int ipv4ll_address_update(Link *link, bool deprecate) {
1259         int r;
1260         struct in_addr addr;
1261
1262         assert(link);
1263
1264         r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
1265         if (r >= 0) {
1266                 _cleanup_address_free_ Address *address = NULL;
1267
1268                 log_debug_link(link, "IPv4 link-local %s %u.%u.%u.%u",
1269                                deprecate ? "deprecate" : "approve",
1270                                ADDRESS_FMT_VAL(addr));
1271
1272                 r = address_new_dynamic(&address);
1273                 if (r < 0) {
1274                         log_error_link(link, "Could not allocate address: %s", strerror(-r));
1275                         return r;
1276                 }
1277
1278                 address->family = AF_INET;
1279                 address->in_addr.in = addr;
1280                 address->prefixlen = 16;
1281                 address->scope = RT_SCOPE_LINK;
1282                 address->cinfo.ifa_prefered = deprecate ? 0 : CACHE_INFO_INFINITY_LIFE_TIME;
1283                 address->broadcast.s_addr = address->in_addr.in.s_addr | htonl(0xfffffffflu >> address->prefixlen);
1284
1285                 address_update(address, link, &address_update_handler);
1286         }
1287
1288         return 0;
1289
1290 }
1291
1292 static int ipv4ll_address_lost(Link *link) {
1293         int r;
1294         struct in_addr addr;
1295
1296         assert(link);
1297
1298         r = sd_ipv4ll_get_address(link->ipv4ll, &addr);
1299         if (r >= 0) {
1300                 _cleanup_address_free_ Address *address = NULL;
1301                 _cleanup_route_free_ Route *route = NULL;
1302
1303                 log_debug_link(link, "IPv4 link-local release %u.%u.%u.%u",
1304                                 ADDRESS_FMT_VAL(addr));
1305
1306                 r = address_new_dynamic(&address);
1307                 if (r < 0) {
1308                         log_error_link(link, "Could not allocate address: %s", strerror(-r));
1309                         return r;
1310                 }
1311
1312                 address->family = AF_INET;
1313                 address->in_addr.in = addr;
1314                 address->prefixlen = 16;
1315                 address->scope = RT_SCOPE_LINK;
1316
1317                 address_drop(address, link, &address_drop_handler);
1318
1319                 r = route_new_dynamic(&route);
1320                 if (r < 0) {
1321                         log_error_link(link, "Could not allocate route: %s",
1322                                        strerror(-r));
1323                         return r;
1324                 }
1325
1326                 route->family = AF_INET;
1327                 route->scope = RT_SCOPE_LINK;
1328                 route->metrics = 99;
1329
1330                 route_drop(route, link, &route_drop_handler);
1331         }
1332
1333         return 0;
1334 }
1335
1336 static bool ipv4ll_is_bound(sd_ipv4ll *ll) {
1337         int r;
1338         struct in_addr addr;
1339
1340         assert(ll);
1341
1342         r = sd_ipv4ll_get_address(ll, &addr);
1343         if (r < 0)
1344                 return false;
1345         return true;
1346 }
1347
1348 static int ipv4ll_address_claimed(sd_ipv4ll *ll, Link *link) {
1349         struct in_addr address;
1350         int r;
1351
1352         assert(ll);
1353         assert(link);
1354
1355         r = sd_ipv4ll_get_address(ll, &address);
1356         if (r < 0)
1357                 return r;
1358
1359         log_struct_link(LOG_INFO, link,
1360                         "MESSAGE=%-*s: IPv4 link-local address %u.%u.%u.%u",
1361                         IFNAMSIZ,
1362                         link->ifname,
1363                         ADDRESS_FMT_VAL(address),
1364                         NULL);
1365
1366        link_enter_set_addresses(link);
1367
1368        return 0;
1369 }
1370
1371 static void ipv4ll_handler(sd_ipv4ll *ll, int event, void *userdata){
1372         Link *link = userdata;
1373         int r;
1374
1375         assert(link);
1376         assert(link->network);
1377         assert(link->manager);
1378
1379         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1380                 return;
1381
1382         switch(event) {
1383                 case IPV4LL_EVENT_STOP:
1384                 case IPV4LL_EVENT_CONFLICT:
1385                         r = ipv4ll_address_lost(link);
1386                         if (r < 0) {
1387                                 link_enter_failed(link);
1388                                 return;
1389                         }
1390                         break;
1391                 case IPV4LL_EVENT_BIND:
1392                         r = ipv4ll_address_claimed(ll, link);
1393                         if (r < 0) {
1394                                 link_enter_failed(link);
1395                                 return;
1396                         }
1397                         break;
1398                 default:
1399                         if (event < 0)
1400                                 log_warning_link(link, "IPv4 link-local error: %s", strerror(-event));
1401                         else
1402                                 log_warning_link(link, "IPv4 link-local unknown event: %d", event);
1403                         break;
1404         }
1405 }
1406
1407 static void dhcp6_handler(sd_dhcp6_client *client, int event, void *userdata) {
1408         Link *link = userdata;
1409
1410         assert(link);
1411         assert(link->network);
1412         assert(link->manager);
1413
1414         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1415                 return;
1416
1417         switch(event) {
1418         case DHCP6_EVENT_STOP:
1419         case DHCP6_EVENT_RESEND_EXPIRE:
1420         case DHCP6_EVENT_RETRANS_MAX:
1421         case DHCP6_EVENT_IP_ACQUIRE:
1422                 log_debug_link(link, "DHCPv6 event %d", event);
1423
1424                 break;
1425
1426         default:
1427                 if (event < 0)
1428                         log_warning_link(link, "DHCPv6 error: %s",
1429                                          strerror(-event));
1430                 else
1431                         log_warning_link(link, "DHCPv6 unknown event: %d",
1432                                          event);
1433                 return;
1434         }
1435 }
1436
1437 static void icmp6_router_handler(sd_icmp6_nd *nd, int event, void *userdata) {
1438         Link *link = userdata;
1439         int r;
1440
1441         assert(link);
1442         assert(link->network);
1443         assert(link->manager);
1444
1445         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1446                 return;
1447
1448         switch(event) {
1449         case ICMP6_EVENT_ROUTER_ADVERTISMENT_NONE:
1450         case ICMP6_EVENT_ROUTER_ADVERTISMENT_OTHER:
1451                 return;
1452
1453         case ICMP6_EVENT_ROUTER_ADVERTISMENT_TIMEOUT:
1454         case ICMP6_EVENT_ROUTER_ADVERTISMENT_MANAGED:
1455                 break;
1456
1457         default:
1458                 if (event < 0)
1459                         log_warning_link(link, "ICMPv6 error: %s",
1460                                          strerror(-event));
1461                 else
1462                         log_warning_link(link, "ICMPv6 unknown event: %d",
1463                                          event);
1464
1465                 return;
1466         }
1467
1468         if (link->dhcp6_client)
1469                 return;
1470
1471         r = sd_dhcp6_client_new(&link->dhcp6_client);
1472         if (r < 0)
1473                 return;
1474
1475         r = sd_dhcp6_client_attach_event(link->dhcp6_client, NULL, 0);
1476         if (r < 0) {
1477                 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1478                 return;
1479         }
1480
1481         r = sd_dhcp6_client_set_mac(link->dhcp6_client, &link->mac);
1482         if (r < 0) {
1483                 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1484                 return;
1485         }
1486
1487         r = sd_dhcp6_client_set_index(link->dhcp6_client, link->ifindex);
1488         if (r < 0) {
1489                 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1490                 return;
1491         }
1492
1493         r = sd_dhcp6_client_set_callback(link->dhcp6_client, dhcp6_handler,
1494                                          link);
1495         if (r < 0) {
1496                 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1497                 return;
1498         }
1499
1500         r = sd_dhcp6_client_start(link->dhcp6_client);
1501         if (r < 0)
1502                 link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client);
1503 }
1504
1505 static int link_acquire_conf(Link *link) {
1506         int r;
1507
1508         assert(link);
1509         assert(link->network);
1510         assert(link->manager);
1511         assert(link->manager->event);
1512
1513         if (link->network->ipv4ll) {
1514                 assert(link->ipv4ll);
1515
1516                 log_debug_link(link, "acquiring IPv4 link-local address");
1517
1518                 r = sd_ipv4ll_start(link->ipv4ll);
1519                 if (r < 0) {
1520                         log_warning_link(link, "could not acquire IPv4 "
1521                                          "link-local address");
1522                         return r;
1523                 }
1524         }
1525
1526         if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4)) {
1527                 assert(link->dhcp_client);
1528
1529                 log_debug_link(link, "acquiring DHCPv4 lease");
1530
1531                 r = sd_dhcp_client_start(link->dhcp_client);
1532                 if (r < 0) {
1533                         log_warning_link(link, "could not acquire DHCPv4 "
1534                                          "lease");
1535                         return r;
1536                 }
1537         }
1538
1539         if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V6)) {
1540                 assert(link->icmp6_router_discovery);
1541
1542                 log_debug_link(link, "discovering IPv6 routers");
1543
1544                 r = sd_icmp6_router_solicitation_start(link->icmp6_router_discovery);
1545                 if (r < 0) {
1546                         log_warning_link(link, "could not start IPv6 router discovery");
1547                         return r;
1548                 }
1549         }
1550
1551         return 0;
1552 }
1553
1554 bool link_has_carrier(unsigned flags, uint8_t operstate) {
1555         /* see Documentation/networking/operstates.txt in the kernel sources */
1556
1557         if (operstate == IF_OPER_UP)
1558                 return true;
1559
1560         if (operstate == IF_OPER_UNKNOWN)
1561                 /* operstate may not be implemented, so fall back to flags */
1562                 if ((flags & IFF_LOWER_UP) && !(flags & IFF_DORMANT))
1563                         return true;
1564
1565         return false;
1566 }
1567
1568 #define FLAG_STRING(string, flag, old, new) \
1569         (((old ^ new) & flag) \
1570                 ? ((old & flag) ? (" -" string) : (" +" string)) \
1571                 : "")
1572
1573 static int link_update_flags(Link *link, sd_rtnl_message *m) {
1574         unsigned flags, unknown_flags_added, unknown_flags_removed, unknown_flags;
1575         uint8_t operstate;
1576         bool carrier_gained = false, carrier_lost = false;
1577         int r;
1578
1579         assert(link);
1580
1581         r = sd_rtnl_message_link_get_flags(m, &flags);
1582         if (r < 0) {
1583                 log_warning_link(link, "Could not get link flags");
1584                 return r;
1585         }
1586
1587         r = sd_rtnl_message_read_u8(m, IFLA_OPERSTATE, &operstate);
1588         if (r < 0)
1589                 /* if we got a message without operstate, take it to mean
1590                    the state was unchanged */
1591                 operstate = link->kernel_operstate;
1592
1593         if ((link->flags == flags) && (link->kernel_operstate == operstate))
1594                 return 0;
1595
1596         if (link->flags != flags) {
1597                 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",
1598                                FLAG_STRING("LOOPBACK", IFF_LOOPBACK, link->flags, flags),
1599                                FLAG_STRING("MASTER", IFF_MASTER, link->flags, flags),
1600                                FLAG_STRING("SLAVE", IFF_SLAVE, link->flags, flags),
1601                                FLAG_STRING("UP", IFF_UP, link->flags, flags),
1602                                FLAG_STRING("DORMANT", IFF_DORMANT, link->flags, flags),
1603                                FLAG_STRING("LOWER_UP", IFF_LOWER_UP, link->flags, flags),
1604                                FLAG_STRING("RUNNING", IFF_RUNNING, link->flags, flags),
1605                                FLAG_STRING("MULTICAST", IFF_MULTICAST, link->flags, flags),
1606                                FLAG_STRING("BROADCAST", IFF_BROADCAST, link->flags, flags),
1607                                FLAG_STRING("POINTOPOINT", IFF_POINTOPOINT, link->flags, flags),
1608                                FLAG_STRING("PROMISC", IFF_PROMISC, link->flags, flags),
1609                                FLAG_STRING("ALLMULTI", IFF_ALLMULTI, link->flags, flags),
1610                                FLAG_STRING("PORTSEL", IFF_PORTSEL, link->flags, flags),
1611                                FLAG_STRING("AUTOMEDIA", IFF_AUTOMEDIA, link->flags, flags),
1612                                FLAG_STRING("DYNAMIC", IFF_DYNAMIC, link->flags, flags),
1613                                FLAG_STRING("NOARP", IFF_NOARP, link->flags, flags),
1614                                FLAG_STRING("NOTRAILERS", IFF_NOTRAILERS, link->flags, flags),
1615                                FLAG_STRING("DEBUG", IFF_DEBUG, link->flags, flags),
1616                                FLAG_STRING("ECHO", IFF_ECHO, link->flags, flags));
1617
1618                 unknown_flags = ~(IFF_LOOPBACK | IFF_MASTER | IFF_SLAVE | IFF_UP |
1619                                   IFF_DORMANT | IFF_LOWER_UP | IFF_RUNNING |
1620                                   IFF_MULTICAST | IFF_BROADCAST | IFF_POINTOPOINT |
1621                                   IFF_PROMISC | IFF_ALLMULTI | IFF_PORTSEL |
1622                                   IFF_AUTOMEDIA | IFF_DYNAMIC | IFF_NOARP |
1623                                   IFF_NOTRAILERS | IFF_DEBUG | IFF_ECHO);
1624                 unknown_flags_added = ((link->flags ^ flags) & flags & unknown_flags);
1625                 unknown_flags_removed = ((link->flags ^ flags) & link->flags & unknown_flags);
1626
1627                 /* link flags are currently at most 18 bits, let's align to printing 20 */
1628                 if (unknown_flags_added)
1629                         log_debug_link(link, "unknown link flags gained: %#.5x (ignoring)",
1630                                        unknown_flags_added);
1631
1632                 if (unknown_flags_removed)
1633                         log_debug_link(link, "unknown link flags lost: %#.5x (ignoring)",
1634                                        unknown_flags_removed);
1635         }
1636
1637         carrier_gained = !link_has_carrier(link->flags, link->kernel_operstate) &&
1638                        link_has_carrier(flags, operstate);
1639         carrier_lost = link_has_carrier(link->flags, link->kernel_operstate) &&
1640                          !link_has_carrier(flags, operstate);
1641
1642         link->flags = flags;
1643         link->kernel_operstate = operstate;
1644
1645         link_save(link);
1646
1647         if (link->state == LINK_STATE_FAILED ||
1648             link->state == LINK_STATE_UNMANAGED)
1649                 return 0;
1650
1651         if (carrier_gained) {
1652                 log_info_link(link, "gained carrier");
1653
1654                 if (link->network) {
1655                         r = link_acquire_conf(link);
1656                         if (r < 0) {
1657                                 link_enter_failed(link);
1658                                 return r;
1659                         }
1660                 }
1661         } else if (carrier_lost) {
1662                 log_info_link(link, "lost carrier");
1663
1664                 r = link_stop_clients(link);
1665                 if (r < 0) {
1666                         link_enter_failed(link);
1667                         return r;
1668                 }
1669         }
1670
1671         return 0;
1672 }
1673
1674 static int link_up_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
1675         _cleanup_link_unref_ Link *link = userdata;
1676         int r;
1677
1678         assert(link);
1679
1680         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1681                 return 1;
1682
1683         r = sd_rtnl_message_get_errno(m);
1684         if (r < 0) {
1685                 /* we warn but don't fail the link, as it may
1686                    be brought up later */
1687                 log_struct_link(LOG_WARNING, link,
1688                                 "MESSAGE=%-*s: could not bring up interface: %s",
1689                                 IFNAMSIZ,
1690                                 link->ifname, strerror(-r),
1691                                 "ERRNO=%d", -r,
1692                                 NULL);
1693         }
1694
1695         return 1;
1696 }
1697
1698 static int link_up(Link *link) {
1699         _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
1700         int r;
1701
1702         assert(link);
1703         assert(link->manager);
1704         assert(link->manager->rtnl);
1705
1706         log_debug_link(link, "bringing link up");
1707
1708         r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
1709                                      RTM_SETLINK, link->ifindex);
1710         if (r < 0) {
1711                 log_error_link(link, "Could not allocate RTM_SETLINK message");
1712                 return r;
1713         }
1714
1715         r = sd_rtnl_message_link_set_flags(req, IFF_UP, IFF_UP);
1716         if (r < 0) {
1717                 log_error_link(link, "Could not set link flags: %s", strerror(-r));
1718                 return r;
1719         }
1720
1721         r = sd_rtnl_call_async(link->manager->rtnl, req, link_up_handler, link, 0, NULL);
1722         if (r < 0) {
1723                 log_error_link(link,
1724                                "Could not send rtnetlink message: %s", strerror(-r));
1725                 return r;
1726         }
1727
1728         link_ref(link);
1729
1730         return 0;
1731 }
1732
1733 static int link_joined(Link *link) {
1734         int r;
1735
1736         assert(link);
1737         assert(link->state == LINK_STATE_ENSLAVING);
1738         assert(link->network);
1739
1740         log_debug_link(link, "joined netdev");
1741
1742         if (!(link->flags & IFF_UP)) {
1743                 r = link_up(link);
1744                 if (r < 0) {
1745                         link_enter_failed(link);
1746                         return r;
1747                 }
1748         }
1749
1750         return link_enter_set_addresses(link);
1751 }
1752
1753 static int netdev_join_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
1754         _cleanup_link_unref_ Link *link = userdata;
1755         int r;
1756
1757         assert(link);
1758         assert(IN_SET(link->state, LINK_STATE_ENSLAVING, LINK_STATE_FAILED,
1759                       LINK_STATE_LINGER));
1760         assert(link->network);
1761
1762         link->enslaving --;
1763
1764         if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
1765                 return 1;
1766
1767         r = sd_rtnl_message_get_errno(m);
1768         if (r < 0 && r != -EEXIST) {
1769                 log_struct_link(LOG_ERR, link,
1770                                 "MESSAGE=%-*s: could not join netdev: %s",
1771                                 IFNAMSIZ,
1772                                 link->ifname, strerror(-r),
1773                                 "ERRNO=%d", -r,
1774                                 NULL);
1775                 link_enter_failed(link);
1776                 return 1;
1777         }
1778
1779         if (link->enslaving <= 0)
1780                 link_joined(link);
1781
1782         return 1;
1783 }
1784
1785 static int link_enter_join_netdev(Link *link) {
1786         NetDev *vlan, *macvlan, *vxlan;
1787         Iterator i;
1788         int r;
1789
1790         assert(link);
1791         assert(link->network);
1792         assert(link->state == LINK_STATE_INITIALIZING);
1793
1794         link->state = LINK_STATE_ENSLAVING;
1795
1796         link_save(link);
1797
1798         if (!link->network->bridge &&
1799             !link->network->bond &&
1800             !link->network->tunnel &&
1801             hashmap_isempty(link->network->vlans) &&
1802             hashmap_isempty(link->network->macvlans) &&
1803             hashmap_isempty(link->network->vxlans))
1804                 return link_joined(link);
1805
1806         if (link->network->bond) {
1807                 log_struct_link(LOG_DEBUG, link,
1808                                 "MESSAGE=%-*s: enslaving by '%s'",
1809                                 IFNAMSIZ,
1810                                 link->ifname, link->network->bond->ifname,
1811                                 NETDEV(link->network->bond),
1812                                 NULL);
1813
1814                 r = netdev_join(link->network->bond, link, &netdev_join_handler);
1815                 if (r < 0) {
1816                         log_struct_link(LOG_WARNING, link,
1817                                         "MESSAGE=%-*s: could not join netdev '%s': %s",
1818                                         IFNAMSIZ,
1819                                         link->ifname, link->network->bond->ifname, strerror(-r),
1820                                         NETDEV(link->network->bond),
1821                                         NULL);
1822                         link_enter_failed(link);
1823                         return r;
1824                 }
1825
1826                 link->enslaving ++;
1827         }
1828
1829         if (link->network->bridge) {
1830                 log_struct_link(LOG_DEBUG, link,
1831                                 "MESSAGE=%-*s: enslaving by '%s'",
1832                                 IFNAMSIZ,
1833                                 link->ifname, link->network->bridge->ifname,
1834                                 NETDEV(link->network->bridge),
1835                                 NULL);
1836
1837                 r = netdev_join(link->network->bridge, link, &netdev_join_handler);
1838                 if (r < 0) {
1839                         log_struct_link(LOG_WARNING, link,
1840                                         "MESSAGE=%-*s: could not join netdev '%s': %s",
1841                                         IFNAMSIZ,
1842                                         link->ifname, link->network->bridge->ifname, strerror(-r),
1843                                         NETDEV(link->network->bridge),
1844                                         NULL);
1845                         link_enter_failed(link);
1846                         return r;
1847                 }
1848
1849                 link->enslaving ++;
1850         }
1851
1852         if (link->network->tunnel) {
1853                 log_struct_link(LOG_DEBUG, link,
1854                                 "MESSAGE=%-*s: enslaving by '%s'",
1855                                 IFNAMSIZ,
1856                                 link->ifname, link->network->tunnel->ifname,
1857                                 NETDEV(link->network->tunnel),
1858                                 NULL);
1859
1860                 r = netdev_join(link->network->tunnel, link, &netdev_join_handler);
1861                 if (r < 0) {
1862                         log_struct_link(LOG_WARNING, link,
1863                                         "MESSAGE=%-*s: could not join netdev '%s': %s",
1864                                         IFNAMSIZ,
1865                                         link->ifname, link->network->tunnel->ifname, strerror(-r),
1866                                         NETDEV(link->network->tunnel),
1867                                         NULL);
1868                         link_enter_failed(link);
1869                         return r;
1870                 }
1871
1872                 link->enslaving ++;
1873         }
1874
1875         HASHMAP_FOREACH(vlan, link->network->vlans, i) {
1876                 log_struct_link(LOG_DEBUG, link,
1877                                 "MESSAGE=%-*s: enslaving by '%s'",
1878                                 IFNAMSIZ,
1879                                 link->ifname, vlan->ifname, NETDEV(vlan), NULL);
1880
1881                 r = netdev_join(vlan, link, &netdev_join_handler);
1882                 if (r < 0) {
1883                         log_struct_link(LOG_WARNING, link,
1884                                         "MESSAGE=%-*s: could not join netdev '%s': %s",
1885                                         IFNAMSIZ,
1886                                         link->ifname, vlan->ifname, strerror(-r),
1887                                         NETDEV(vlan), NULL);
1888                         link_enter_failed(link);
1889                         return r;
1890                 }
1891
1892                 link->enslaving ++;
1893         }
1894
1895         HASHMAP_FOREACH(macvlan, link->network->macvlans, i) {
1896                 log_struct_link(LOG_DEBUG, link,
1897                                 "MESSAGE=%-*s: enslaving by '%s'",
1898                                 IFNAMSIZ,
1899                                 link->ifname, macvlan->ifname, NETDEV(macvlan), NULL);
1900
1901                 r = netdev_join(macvlan, link, &netdev_join_handler);
1902                 if (r < 0) {
1903                         log_struct_link(LOG_WARNING, link,
1904                                         "MESSAGE=%-*s: could not join netdev '%s': %s",
1905                                         IFNAMSIZ,
1906                                         link->ifname, macvlan->ifname, strerror(-r),
1907                                         NETDEV(macvlan), NULL);
1908                         link_enter_failed(link);
1909                         return r;
1910                 }
1911
1912                 link->enslaving ++;
1913         }
1914
1915         HASHMAP_FOREACH(vxlan, link->network->vxlans, i) {
1916                 log_struct_link(LOG_DEBUG, link,
1917                                 "MESSAGE=%*s: enslaving by '%s'",
1918                                 IFNAMSIZ,
1919                                 link->ifname, vxlan->ifname, NETDEV(vxlan), NULL);
1920
1921                 r = netdev_join(vxlan, link, &netdev_join_handler);
1922                 if (r < 0) {
1923                         log_struct_link(LOG_WARNING, link,
1924                                         "MESSAGE=%*s: could not join netdev '%s': %s",
1925                                         IFNAMSIZ,
1926                                         link->ifname, vxlan->ifname, strerror(-r),
1927                                         NETDEV(vxlan), NULL);
1928                         link_enter_failed(link);
1929                         return r;
1930                 }
1931
1932                 link->enslaving ++;
1933         }
1934
1935         return 0;
1936 }
1937
1938 static int link_configure(Link *link) {
1939         int r;
1940
1941         assert(link);
1942         assert(link->state == LINK_STATE_INITIALIZING);
1943
1944         if (link->network->ipv4ll) {
1945                 uint8_t seed[8];
1946
1947                 r = sd_ipv4ll_new(&link->ipv4ll);
1948                 if (r < 0)
1949                         return r;
1950
1951                 if (link->udev_device) {
1952                         r = net_get_unique_predictable_data(link->udev_device, seed);
1953                         if (r >= 0) {
1954                                 r = sd_ipv4ll_set_address_seed(link->ipv4ll, seed);
1955                                 if (r < 0)
1956                                         return r;
1957                         }
1958                 }
1959
1960                 r = sd_ipv4ll_attach_event(link->ipv4ll, NULL, 0);
1961                 if (r < 0)
1962                         return r;
1963
1964                 r = sd_ipv4ll_set_mac(link->ipv4ll, &link->mac);
1965                 if (r < 0)
1966                         return r;
1967
1968                 r = sd_ipv4ll_set_index(link->ipv4ll, link->ifindex);
1969                 if (r < 0)
1970                         return r;
1971
1972                 r = sd_ipv4ll_set_callback(link->ipv4ll, ipv4ll_handler, link);
1973                 if (r < 0)
1974                         return r;
1975         }
1976
1977         if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4)) {
1978                 r = sd_dhcp_client_new(&link->dhcp_client);
1979                 if (r < 0)
1980                         return r;
1981
1982                 r = sd_dhcp_client_attach_event(link->dhcp_client, NULL, 0);
1983                 if (r < 0)
1984                         return r;
1985
1986                 r = sd_dhcp_client_set_mac(link->dhcp_client, &link->mac);
1987                 if (r < 0)
1988                         return r;
1989
1990                 r = sd_dhcp_client_set_index(link->dhcp_client, link->ifindex);
1991                 if (r < 0)
1992                         return r;
1993
1994                 r = sd_dhcp_client_set_callback(link->dhcp_client, dhcp_handler, link);
1995                 if (r < 0)
1996                         return r;
1997
1998                 r = sd_dhcp_client_set_request_broadcast(link->dhcp_client, link->network->dhcp_broadcast);
1999                 if (r < 0)
2000                         return r;
2001
2002                 if (link->network->dhcp_mtu) {
2003                         r = sd_dhcp_client_set_request_option(link->dhcp_client, 26);
2004                         if (r < 0)
2005                                 return r;
2006                 }
2007
2008                 if (link->network->dhcp_routes) {
2009                         r = sd_dhcp_client_set_request_option(link->dhcp_client, DHCP_OPTION_STATIC_ROUTE);
2010                         if (r < 0)
2011                                 return r;
2012                         r = sd_dhcp_client_set_request_option(link->dhcp_client, DHCP_OPTION_CLASSLESS_STATIC_ROUTE);
2013                         if (r < 0)
2014                                 return r;
2015                 }
2016
2017                 if (link->network->dhcp_sendhost) {
2018                         _cleanup_free_ char *hostname = gethostname_malloc();
2019                         if (!hostname)
2020                                 return -ENOMEM;
2021
2022                         if (!is_localhost(hostname)) {
2023                                 r = sd_dhcp_client_set_hostname(link->dhcp_client, hostname);
2024                                 if (r < 0)
2025                                         return r;
2026                         }
2027                 }
2028
2029                 if (link->network->dhcp_vendor_class_identifier) {
2030                         r = sd_dhcp_client_set_vendor_class_identifier(link->dhcp_client,
2031                                                                        link->network->dhcp_vendor_class_identifier);
2032                         if (r < 0)
2033                                 return r;
2034                 }
2035         }
2036
2037         if (link->network->dhcp_server) {
2038                 r = sd_dhcp_server_new(&link->dhcp_server, link->ifindex);
2039                 if (r < 0)
2040                         return r;
2041
2042                 r = sd_dhcp_server_attach_event(link->dhcp_server, NULL, 0);
2043                 if (r < 0)
2044                         return r;
2045         }
2046
2047         if (IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V6)) {
2048                 r = sd_icmp6_nd_new(&link->icmp6_router_discovery);
2049                 if (r < 0)
2050                         return r;
2051
2052                 r = sd_icmp6_nd_attach_event(link->icmp6_router_discovery,
2053                                              NULL, 0);
2054                 if (r < 0)
2055                         return r;
2056
2057                 r = sd_icmp6_nd_set_mac(link->icmp6_router_discovery,
2058                                         &link->mac);
2059                 if (r < 0)
2060                         return r;
2061
2062                 r = sd_icmp6_nd_set_index(link->icmp6_router_discovery,
2063                                           link->ifindex);
2064                 if (r < 0)
2065                         return r;
2066
2067                 r = sd_icmp6_nd_set_callback(link->icmp6_router_discovery,
2068                                              icmp6_router_handler, link);
2069                 if (r < 0)
2070                         return r;
2071         }
2072
2073         if (link_has_carrier(link->flags, link->kernel_operstate)) {
2074                 r = link_acquire_conf(link);
2075                 if (r < 0)
2076                         return r;
2077         }
2078
2079         return link_enter_join_netdev(link);
2080 }
2081
2082 static int link_initialized_and_synced(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
2083         _cleanup_link_unref_ Link *link = userdata;
2084         Network *network;
2085         int r;
2086
2087         assert(link);
2088         assert(link->ifname);
2089         assert(link->manager);
2090
2091         if (link->state != LINK_STATE_INITIALIZING)
2092                 return 1;
2093
2094         log_debug_link(link, "link state is up-to-date");
2095
2096         r = network_get(link->manager, link->udev_device, link->ifname, &link->mac, &network);
2097         if (r == -ENOENT) {
2098                 link_enter_unmanaged(link);
2099                 return 1;
2100         } else if (r < 0)
2101                 return r;
2102
2103         r = network_apply(link->manager, network, link);
2104         if (r < 0)
2105                 return r;
2106
2107         r = link_configure(link);
2108         if (r < 0)
2109                 return r;
2110
2111         return 1;
2112 }
2113
2114 int link_initialized(Link *link, struct udev_device *device) {
2115         _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
2116         int r;
2117
2118         assert(link);
2119         assert(link->manager);
2120         assert(link->manager->rtnl);
2121         assert(device);
2122
2123         if (link->state != LINK_STATE_INITIALIZING)
2124                 return 0;
2125
2126         if (link->udev_device)
2127                 return 0;
2128
2129         log_debug_link(link, "udev initialized link");
2130
2131         link->udev_device = udev_device_ref(device);
2132
2133         /* udev has initialized the link, but we don't know if we have yet processed
2134            the NEWLINK messages with the latest state. Do a GETLINK, when it returns
2135            we know that the pending NEWLINKs have already been processed and that we
2136            are up-to-date */
2137
2138         r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_GETLINK, link->ifindex);
2139         if (r < 0)
2140                 return r;
2141
2142         r = sd_rtnl_call_async(link->manager->rtnl, req, link_initialized_and_synced, link, 0, NULL);
2143         if (r < 0)
2144                 return r;
2145
2146         link_ref(link);
2147
2148         return 0;
2149 }
2150
2151 int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata) {
2152         Manager *m = userdata;
2153         Link *link = NULL;
2154         uint16_t type;
2155         _cleanup_address_free_ Address *address = NULL;
2156         Address *ad;
2157         char buf[INET6_ADDRSTRLEN];
2158         bool address_dropped = false;
2159         int r, ifindex;
2160
2161         assert(rtnl);
2162         assert(message);
2163         assert(m);
2164
2165         r = sd_rtnl_message_get_type(message, &type);
2166         if (r < 0) {
2167                 log_warning("rtnl: could not get message type");
2168                 return 0;
2169         }
2170
2171         r = sd_rtnl_message_addr_get_ifindex(message, &ifindex);
2172         if (r < 0 || ifindex <= 0) {
2173                 log_warning("rtnl: received address message without valid ifindex, ignoring");
2174                 return 0;
2175         } else {
2176                 r = link_get(m, ifindex, &link);
2177                 if (r < 0 || !link) {
2178                         log_warning("rtnl: received address for a nonexistent link, ignoring");
2179                         return 0;
2180                 }
2181         }
2182
2183         r = address_new_dynamic(&address);
2184         if (r < 0)
2185                 return r;
2186
2187         r = sd_rtnl_message_addr_get_family(message, &address->family);
2188         if (r < 0 || !IN_SET(address->family, AF_INET, AF_INET6)) {
2189                 log_warning_link(link, "rtnl: received address with invalid family, ignoring");
2190                 return 0;
2191         }
2192
2193         r = sd_rtnl_message_addr_get_prefixlen(message, &address->prefixlen);
2194         if (r < 0) {
2195                 log_warning_link(link, "rtnl: received address with invalid prefixlen, ignoring");
2196                 return 0;
2197         }
2198
2199         r = sd_rtnl_message_addr_get_scope(message, &address->scope);
2200         if (r < 0) {
2201                 log_warning_link(link, "rtnl: received address with invalid scope, ignoring");
2202                 return 0;
2203         }
2204
2205         switch (address->family) {
2206         case AF_INET:
2207                 r = sd_rtnl_message_read_in_addr(message, IFA_LOCAL, &address->in_addr.in);
2208                 if (r < 0) {
2209                         log_warning_link(link, "rtnl: received address without valid address, ignoring");
2210                         return 0;
2211                 }
2212
2213                 break;
2214
2215         case AF_INET6:
2216                 r = sd_rtnl_message_read_in6_addr(message, IFA_ADDRESS, &address->in_addr.in6);
2217                 if (r < 0) {
2218                         log_warning_link(link, "rtnl: received address without valid address, ignoring");
2219                         return 0;
2220                 }
2221
2222                 break;
2223
2224         default:
2225                 assert_not_reached("invalid address family");
2226         }
2227
2228         if (!inet_ntop(address->family, &address->in_addr, buf, INET6_ADDRSTRLEN)) {
2229                 log_warning_link(link, "could not print address");
2230                 return 0;
2231         }
2232
2233         LIST_FOREACH(addresses, ad, link->addresses) {
2234                 if (address_equal(ad, address)) {
2235                         LIST_REMOVE(addresses, link->addresses, ad);
2236
2237                         address_free(ad);
2238
2239                         address_dropped = true;
2240
2241                         break;
2242                 }
2243         }
2244
2245         switch (type) {
2246         case RTM_NEWADDR:
2247                 if (!address_dropped)
2248                         log_debug_link(link, "added address: %s/%u", buf,
2249                                        address->prefixlen);
2250                 else
2251                         log_debug_link(link, "updated address: %s/%u", buf,
2252                                        address->prefixlen);
2253
2254                 LIST_PREPEND(addresses, link->addresses, address);
2255                 address = NULL;
2256
2257                 link_save(link);
2258
2259                 break;
2260         case RTM_DELADDR:
2261                 if (address_dropped) {
2262                         log_debug_link(link, "removed address: %s/%u", buf,
2263                                        address->prefixlen);
2264
2265                         link_save(link);
2266                 } else
2267                         log_warning_link(link, "removing non-existent address: %s/%u",
2268                                          buf, address->prefixlen);
2269
2270                 break;
2271         default:
2272                 assert_not_reached("Received invalid RTNL message type");
2273         }
2274
2275         return 1;
2276 }
2277
2278 int link_add(Manager *m, sd_rtnl_message *message, Link **ret) {
2279         Link *link;
2280         _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL;
2281         _cleanup_udev_device_unref_ struct udev_device *device = NULL;
2282         char ifindex_str[2 + DECIMAL_STR_MAX(int)];
2283         int r;
2284
2285         assert(m);
2286         assert(m->rtnl);
2287         assert(message);
2288         assert(ret);
2289
2290         r = link_new(m, message, ret);
2291         if (r < 0)
2292                 return r;
2293
2294         link = *ret;
2295
2296         log_debug_link(link, "link %"PRIu64" added", link->ifindex);
2297
2298         r = sd_rtnl_message_new_addr(m->rtnl, &req, RTM_GETADDR, link->ifindex, 0);
2299         if (r < 0)
2300                 return r;
2301
2302         r = sd_rtnl_call_async(m->rtnl, req, link_get_address_handler, link, 0, NULL);
2303         if (r < 0)
2304                 return r;
2305
2306         link_ref(link);
2307
2308         if (detect_container(NULL) <= 0) {
2309                 /* not in a container, udev will be around */
2310                 sprintf(ifindex_str, "n%"PRIu64, link->ifindex);
2311                 device = udev_device_new_from_device_id(m->udev, ifindex_str);
2312                 if (!device) {
2313                         log_warning_link(link, "could not find udev device");
2314                         return -errno;
2315                 }
2316
2317                 if (udev_device_get_is_initialized(device) <= 0) {
2318                         /* not yet ready */
2319                         log_debug_link(link, "udev initializing link...");
2320                         return 0;
2321                 }
2322
2323                 r = link_initialized(link, device);
2324                 if (r < 0)
2325                         return r;
2326         } else {
2327                 /* we are calling a callback directly, so must take a ref */
2328                 link_ref(link);
2329
2330                 r = link_initialized_and_synced(m->rtnl, NULL, link);
2331                 if (r < 0)
2332                         return r;
2333         }
2334
2335         return 0;
2336 }
2337
2338 int link_update(Link *link, sd_rtnl_message *m) {
2339         struct ether_addr mac;
2340         char *ifname;
2341         int r;
2342
2343         assert(link);
2344         assert(link->ifname);
2345         assert(m);
2346
2347         if (link->state == LINK_STATE_LINGER) {
2348                 link_ref(link);
2349                 log_info_link(link, "link readded");
2350                 link->state = LINK_STATE_ENSLAVING;
2351         }
2352
2353         r = sd_rtnl_message_read_string(m, IFLA_IFNAME, &ifname);
2354         if (r >= 0 && !streq(ifname, link->ifname)) {
2355                 log_info_link(link, "renamed to %s", ifname);
2356
2357                 free(link->ifname);
2358                 link->ifname = strdup(ifname);
2359                 if (!link->ifname)
2360                         return -ENOMEM;
2361         }
2362
2363         if (!link->original_mtu) {
2364                 r = sd_rtnl_message_read_u16(m, IFLA_MTU, &link->original_mtu);
2365                 if (r >= 0)
2366                         log_debug_link(link, "saved original MTU: %"
2367                                        PRIu16, link->original_mtu);
2368         }
2369
2370         /* The kernel may broadcast NEWLINK messages without the MAC address
2371            set, simply ignore them. */
2372         r = sd_rtnl_message_read_ether_addr(m, IFLA_ADDRESS, &mac);
2373         if (r >= 0) {
2374                 if (memcmp(link->mac.ether_addr_octet, mac.ether_addr_octet, ETH_ALEN)) {
2375
2376                         memcpy(link->mac.ether_addr_octet, mac.ether_addr_octet, ETH_ALEN);
2377
2378                         log_debug_link(link, "MAC address: "
2379                                        "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
2380                                        mac.ether_addr_octet[0],
2381                                        mac.ether_addr_octet[1],
2382                                        mac.ether_addr_octet[2],
2383                                        mac.ether_addr_octet[3],
2384                                        mac.ether_addr_octet[4],
2385                                        mac.ether_addr_octet[5]);
2386
2387                         if (link->ipv4ll) {
2388                                 r = sd_ipv4ll_set_mac(link->ipv4ll, &link->mac);
2389                                 if (r < 0) {
2390                                         log_warning_link(link, "Could not update MAC "
2391                                                          "address in IPv4LL client: %s",
2392                                                          strerror(-r));
2393                                         return r;
2394                                 }
2395                         }
2396
2397                         if (link->dhcp_client) {
2398                                 r = sd_dhcp_client_set_mac(link->dhcp_client, &link->mac);
2399                                 if (r < 0) {
2400                                         log_warning_link(link, "Could not update MAC "
2401                                                          "address in DHCP client: %s",
2402                                                          strerror(-r));
2403                                         return r;
2404                                 }
2405                         }
2406
2407                         if (link->dhcp6_client) {
2408                                 r = sd_dhcp6_client_set_mac(link->dhcp6_client,
2409                                                             &link->mac);
2410                                 if (r < 0) {
2411                                         log_warning_link(link, "Could not update MAC address in DHCPv6 client: %s",
2412                                                          strerror(-r));
2413                                         return r;
2414                                 }
2415                         }
2416                 }
2417         }
2418
2419         return link_update_flags(link, m);
2420 }
2421
2422 static void serialize_addresses(FILE *f, const char *key, Address *address) {
2423         Address *ad;
2424
2425         assert(f);
2426         assert(key);
2427
2428         if (!address)
2429                 return;
2430
2431         fprintf(f, "%s=", key);
2432
2433         LIST_FOREACH(addresses, ad, address) {
2434                 char buf[INET6_ADDRSTRLEN];
2435
2436                 if (inet_ntop(ad->family, &ad->in_addr, buf, INET6_ADDRSTRLEN))
2437                         fprintf(f, "%s%s", buf, (ad->addresses_next) ? " ": "");
2438         }
2439
2440         fputs("\n", f);
2441 }
2442
2443 static void link_update_operstate(Link *link) {
2444
2445         assert(link);
2446
2447         if (link->kernel_operstate == IF_OPER_DORMANT)
2448                 link->operstate = LINK_OPERSTATE_DORMANT;
2449         else if (link_has_carrier(link->flags, link->kernel_operstate)) {
2450                 Address *address;
2451                 uint8_t scope = RT_SCOPE_NOWHERE;
2452
2453                 /* if we have carrier, check what addresses we have */
2454                 LIST_FOREACH(addresses, address, link->addresses) {
2455                         if (address->scope < scope)
2456                                 scope = address->scope;
2457                 }
2458
2459                 if (scope < RT_SCOPE_SITE)
2460                         /* universally accessible addresses found */
2461                         link->operstate = LINK_OPERSTATE_ROUTABLE;
2462                 else if (scope < RT_SCOPE_HOST)
2463                         /* only link or site local addresses found */
2464                         link->operstate = LINK_OPERSTATE_DEGRADED;
2465                 else
2466                         /* no useful addresses found */
2467                         link->operstate = LINK_OPERSTATE_CARRIER;
2468         } else
2469                 link->operstate = LINK_OPERSTATE_UNKNOWN;
2470 }
2471
2472 int link_save(Link *link) {
2473         _cleanup_free_ char *temp_path = NULL;
2474         _cleanup_fclose_ FILE *f = NULL;
2475         const char *admin_state, *oper_state;
2476         int r;
2477
2478         assert(link);
2479         assert(link->state_file);
2480         assert(link->lease_file);
2481         assert(link->manager);
2482
2483         link_update_operstate(link);
2484
2485         r = manager_save(link->manager);
2486         if (r < 0)
2487                 return r;
2488
2489         if (link->state == LINK_STATE_LINGER) {
2490                 unlink(link->state_file);
2491                 return 0;
2492         }
2493
2494         admin_state = link_state_to_string(link->state);
2495         assert(admin_state);
2496
2497         oper_state = link_operstate_to_string(link->operstate);
2498         assert(oper_state);
2499
2500         r = fopen_temporary(link->state_file, &f, &temp_path);
2501         if (r < 0)
2502                 goto finish;
2503
2504         fchmod(fileno(f), 0644);
2505
2506         fprintf(f,
2507                 "# This is private data. Do not parse.\n"
2508                 "ADMIN_STATE=%s\n"
2509                 "OPER_STATE=%s\n",
2510                 admin_state, oper_state);
2511
2512         if (link->network) {
2513                 serialize_addresses(f, "DNS", link->network->dns);
2514                 serialize_addresses(f, "NTP", link->network->ntp);
2515         }
2516
2517         if (link->dhcp_lease) {
2518                 assert(link->network);
2519
2520                 r = dhcp_lease_save(link->dhcp_lease, link->lease_file);
2521                 if (r < 0)
2522                         goto finish;
2523
2524                 fprintf(f,
2525                         "DHCP_LEASE=%s\n"
2526                         "DHCP_USE_DNS=%s\n"
2527                         "DHCP_USE_NTP=%s\n",
2528                         link->lease_file,
2529                         yes_no(link->network->dhcp_dns),
2530                         yes_no(link->network->dhcp_ntp));
2531         } else
2532                 unlink(link->lease_file);
2533
2534         fflush(f);
2535
2536         if (ferror(f) || rename(temp_path, link->state_file) < 0) {
2537                 r = -errno;
2538                 unlink(link->state_file);
2539                 unlink(temp_path);
2540         }
2541
2542 finish:
2543         if (r < 0)
2544                 log_error_link(link, "Failed to save link data to %s: %s", link->state_file, strerror(-r));
2545
2546         return r;
2547 }
2548
2549 static const char* const link_state_table[_LINK_STATE_MAX] = {
2550         [LINK_STATE_INITIALIZING] = "initializing",
2551         [LINK_STATE_ENSLAVING] = "configuring",
2552         [LINK_STATE_SETTING_ADDRESSES] = "configuring",
2553         [LINK_STATE_SETTING_ROUTES] = "configuring",
2554         [LINK_STATE_CONFIGURED] = "configured",
2555         [LINK_STATE_UNMANAGED] = "unmanaged",
2556         [LINK_STATE_FAILED] = "failed",
2557         [LINK_STATE_LINGER] = "linger",
2558 };
2559
2560 DEFINE_STRING_TABLE_LOOKUP(link_state, LinkState);
2561
2562 static const char* const link_operstate_table[_LINK_OPERSTATE_MAX] = {
2563         [LINK_OPERSTATE_UNKNOWN] = "unknown",
2564         [LINK_OPERSTATE_DORMANT] = "dormant",
2565         [LINK_OPERSTATE_CARRIER] = "carrier",
2566         [LINK_OPERSTATE_DEGRADED] = "degraded",
2567         [LINK_OPERSTATE_ROUTABLE] = "routable",
2568 };
2569
2570 DEFINE_STRING_TABLE_LOOKUP(link_operstate, LinkOperationalState);
2571
2572 static const char* const dhcp_support_table[_DHCP_SUPPORT_MAX] = {
2573         [DHCP_SUPPORT_NONE] = "none",
2574         [DHCP_SUPPORT_BOTH] = "both",
2575         [DHCP_SUPPORT_V4] = "v4",
2576         [DHCP_SUPPORT_V6] = "v6",
2577 };
2578
2579 DEFINE_STRING_TABLE_LOOKUP(dhcp_support, DHCPSupport);
2580
2581 int config_parse_dhcp(
2582                 const char* unit,
2583                 const char *filename,
2584                 unsigned line,
2585                 const char *section,
2586                 unsigned section_line,
2587                 const char *lvalue,
2588                 int ltype,
2589                 const char *rvalue,
2590                 void *data,
2591                 void *userdata) {
2592
2593         DHCPSupport *dhcp = data;
2594         int k;
2595
2596         assert(filename);
2597         assert(lvalue);
2598         assert(rvalue);
2599         assert(data);
2600
2601         /* Our enum shall be a superset of booleans, hence first try
2602          * to parse as boolean, and then as enum */
2603
2604         k = parse_boolean(rvalue);
2605         if (k > 0)
2606                 *dhcp = DHCP_SUPPORT_BOTH;
2607         else if (k == 0)
2608                 *dhcp = DHCP_SUPPORT_NONE;
2609         else {
2610                 DHCPSupport s;
2611
2612                 s = dhcp_support_from_string(rvalue);
2613                 if (s < 0){
2614                         log_syntax(unit, LOG_ERR, filename, line, -s, "Failed to parse DHCP option, ignoring: %s", rvalue);
2615                         return 0;
2616                 }
2617
2618                 *dhcp = s;
2619         }
2620
2621         return 0;
2622 }