]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/network/networkd-manager.c
Merge pull request #6741 from keszybz/template-loading-fix
[thirdparty/systemd.git] / src / network / networkd-manager.c
1 /***
2 This file is part of systemd.
3
4 Copyright 2013 Tom Gundersen <teg@jklm.no>
5
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
10
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
18 ***/
19
20 #include <sys/socket.h>
21 #include <linux/if.h>
22
23 #include "sd-daemon.h"
24 #include "sd-netlink.h"
25
26 #include "alloc-util.h"
27 #include "bus-util.h"
28 #include "conf-parser.h"
29 #include "def.h"
30 #include "dns-domain.h"
31 #include "fd-util.h"
32 #include "fileio.h"
33 #include "libudev-private.h"
34 #include "local-addresses.h"
35 #include "netlink-util.h"
36 #include "networkd-manager.h"
37 #include "ordered-set.h"
38 #include "path-util.h"
39 #include "set.h"
40 #include "udev-util.h"
41 #include "virt.h"
42
43 /* use 8 MB for receive socket kernel queue. */
44 #define RCVBUF_SIZE (8*1024*1024)
45
46 const char* const network_dirs[] = {
47 "/etc/systemd/network",
48 "/run/systemd/network",
49 "/usr/lib/systemd/network",
50 #ifdef HAVE_SPLIT_USR
51 "/lib/systemd/network",
52 #endif
53 NULL};
54
55 static int setup_default_address_pool(Manager *m) {
56 AddressPool *p;
57 int r;
58
59 assert(m);
60
61 /* Add in the well-known private address ranges. */
62
63 r = address_pool_new_from_string(m, &p, AF_INET6, "fc00::", 7);
64 if (r < 0)
65 return r;
66
67 r = address_pool_new_from_string(m, &p, AF_INET, "192.168.0.0", 16);
68 if (r < 0)
69 return r;
70
71 r = address_pool_new_from_string(m, &p, AF_INET, "172.16.0.0", 12);
72 if (r < 0)
73 return r;
74
75 r = address_pool_new_from_string(m, &p, AF_INET, "10.0.0.0", 8);
76 if (r < 0)
77 return r;
78
79 return 0;
80 }
81
82 static int on_bus_retry(sd_event_source *s, usec_t usec, void *userdata) {
83 Manager *m = userdata;
84
85 assert(s);
86 assert(m);
87
88 m->bus_retry_event_source = sd_event_source_unref(m->bus_retry_event_source);
89
90 manager_connect_bus(m);
91
92 return 0;
93 }
94
95 static int manager_reset_all(Manager *m) {
96 Link *link;
97 Iterator i;
98 int r;
99
100 assert(m);
101
102 HASHMAP_FOREACH(link, m->links, i) {
103 r = link_carrier_reset(link);
104 if (r < 0)
105 log_link_warning_errno(link, r, "Could not reset carrier: %m");
106 }
107
108 return 0;
109 }
110
111 static int match_prepare_for_sleep(sd_bus_message *message, void *userdata, sd_bus_error *ret_error) {
112 Manager *m = userdata;
113 int b, r;
114
115 assert(message);
116
117 r = sd_bus_message_read(message, "b", &b);
118 if (r < 0) {
119 log_debug_errno(r, "Failed to parse PrepareForSleep signal: %m");
120 return 0;
121 }
122
123 if (b)
124 return 0;
125
126 log_debug("Coming back from suspend, resetting all connections...");
127
128 manager_reset_all(m);
129
130 return 0;
131 }
132
133 int manager_connect_bus(Manager *m) {
134 int r;
135
136 assert(m);
137
138 r = sd_bus_default_system(&m->bus);
139 if (r < 0) {
140 /* We failed to connect? Yuck, we must be in early
141 * boot. Let's try in 5s again. */
142
143 log_debug_errno(r, "Failed to connect to bus, trying again in 5s: %m");
144
145 r = sd_event_add_time(m->event, &m->bus_retry_event_source, CLOCK_MONOTONIC, now(CLOCK_MONOTONIC) + 5*USEC_PER_SEC, 0, on_bus_retry, m);
146 if (r < 0)
147 return log_error_errno(r, "Failed to install bus reconnect time event: %m");
148
149 return 0;
150 }
151
152 if (r < 0)
153 return r;
154
155 r = sd_bus_add_match(m->bus, &m->prepare_for_sleep_slot,
156 "type='signal',"
157 "sender='org.freedesktop.login1',"
158 "interface='org.freedesktop.login1.Manager',"
159 "member='PrepareForSleep',"
160 "path='/org/freedesktop/login1'",
161 match_prepare_for_sleep,
162 m);
163 if (r < 0)
164 return log_error_errno(r, "Failed to add match for PrepareForSleep: %m");
165
166 r = sd_bus_add_object_vtable(m->bus, NULL, "/org/freedesktop/network1", "org.freedesktop.network1.Manager", manager_vtable, m);
167 if (r < 0)
168 return log_error_errno(r, "Failed to add manager object vtable: %m");
169
170 r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/network1/link", "org.freedesktop.network1.Link", link_vtable, link_object_find, m);
171 if (r < 0)
172 return log_error_errno(r, "Failed to add link object vtable: %m");
173
174 r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/network1/link", link_node_enumerator, m);
175 if (r < 0)
176 return log_error_errno(r, "Failed to add link enumerator: %m");
177
178 r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/network1/network", "org.freedesktop.network1.Network", network_vtable, network_object_find, m);
179 if (r < 0)
180 return log_error_errno(r, "Failed to add network object vtable: %m");
181
182 r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/network1/network", network_node_enumerator, m);
183 if (r < 0)
184 return log_error_errno(r, "Failed to add network enumerator: %m");
185
186 r = sd_bus_request_name(m->bus, "org.freedesktop.network1", 0);
187 if (r < 0)
188 return log_error_errno(r, "Failed to register name: %m");
189
190 r = sd_bus_attach_event(m->bus, m->event, 0);
191 if (r < 0)
192 return log_error_errno(r, "Failed to attach bus to event loop: %m");
193
194 /* Did we get a timezone or transient hostname from DHCP while D-Bus wasn't up yet? */
195 if (m->dynamic_hostname) {
196 r = manager_set_hostname(m, m->dynamic_hostname);
197 if (r < 0)
198 return r;
199 }
200 if (m->dynamic_timezone) {
201 r = manager_set_timezone(m, m->dynamic_timezone);
202 if (r < 0)
203 return r;
204 }
205
206 return 0;
207 }
208
209 static int manager_udev_process_link(Manager *m, struct udev_device *device) {
210 Link *link = NULL;
211 int r, ifindex;
212
213 assert(m);
214 assert(device);
215
216 if (!streq_ptr(udev_device_get_action(device), "add"))
217 return 0;
218
219 ifindex = udev_device_get_ifindex(device);
220 if (ifindex <= 0) {
221 log_debug("Ignoring udev ADD event for device with invalid ifindex");
222 return 0;
223 }
224
225 r = link_get(m, ifindex, &link);
226 if (r == -ENODEV)
227 return 0;
228 else if (r < 0)
229 return r;
230
231 r = link_initialized(link, device);
232 if (r < 0)
233 return r;
234
235 return 0;
236 }
237
238 static int manager_dispatch_link_udev(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
239 Manager *m = userdata;
240 struct udev_monitor *monitor = m->udev_monitor;
241 _cleanup_udev_device_unref_ struct udev_device *device = NULL;
242
243 device = udev_monitor_receive_device(monitor);
244 if (!device)
245 return -ENOMEM;
246
247 manager_udev_process_link(m, device);
248 return 0;
249 }
250
251 static int manager_connect_udev(Manager *m) {
252 int r;
253
254 /* udev does not initialize devices inside containers,
255 * so we rely on them being already initialized before
256 * entering the container */
257 if (detect_container() > 0)
258 return 0;
259
260 m->udev = udev_new();
261 if (!m->udev)
262 return -ENOMEM;
263
264 m->udev_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
265 if (!m->udev_monitor)
266 return -ENOMEM;
267
268 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_monitor, "net", NULL);
269 if (r < 0)
270 return log_error_errno(r, "Could not add udev monitor filter: %m");
271
272 r = udev_monitor_enable_receiving(m->udev_monitor);
273 if (r < 0) {
274 log_error("Could not enable udev monitor");
275 return r;
276 }
277
278 r = sd_event_add_io(m->event,
279 &m->udev_event_source,
280 udev_monitor_get_fd(m->udev_monitor),
281 EPOLLIN, manager_dispatch_link_udev,
282 m);
283 if (r < 0)
284 return r;
285
286 r = sd_event_source_set_description(m->udev_event_source, "networkd-udev");
287 if (r < 0)
288 return r;
289
290 return 0;
291 }
292
293 int manager_rtnl_process_route(sd_netlink *rtnl, sd_netlink_message *message, void *userdata) {
294 Manager *m = userdata;
295 Link *link = NULL;
296 uint16_t type;
297 uint32_t ifindex, priority = 0;
298 unsigned char protocol, scope, tos, table;
299 int family;
300 unsigned char dst_prefixlen, src_prefixlen;
301 union in_addr_union dst = {}, gw = {}, src = {}, prefsrc = {};
302 Route *route = NULL;
303 int r;
304
305 assert(rtnl);
306 assert(message);
307 assert(m);
308
309 if (sd_netlink_message_is_error(message)) {
310 r = sd_netlink_message_get_errno(message);
311 if (r < 0)
312 log_warning_errno(r, "rtnl: failed to receive route: %m");
313
314 return 0;
315 }
316
317 r = sd_netlink_message_get_type(message, &type);
318 if (r < 0) {
319 log_warning_errno(r, "rtnl: could not get message type: %m");
320 return 0;
321 } else if (type != RTM_NEWROUTE && type != RTM_DELROUTE) {
322 log_warning("rtnl: received unexpected message type when processing route");
323 return 0;
324 }
325
326 r = sd_netlink_message_read_u32(message, RTA_OIF, &ifindex);
327 if (r == -ENODATA) {
328 log_debug("rtnl: received route without ifindex, ignoring");
329 return 0;
330 } else if (r < 0) {
331 log_warning_errno(r, "rtnl: could not get ifindex from route, ignoring: %m");
332 return 0;
333 } else if (ifindex <= 0) {
334 log_warning("rtnl: received route message with invalid ifindex, ignoring: %d", ifindex);
335 return 0;
336 } else {
337 r = link_get(m, ifindex, &link);
338 if (r < 0 || !link) {
339 /* when enumerating we might be out of sync, but we will
340 * get the route again, so just ignore it */
341 if (!m->enumerating)
342 log_warning("rtnl: received route for nonexistent link (%d), ignoring", ifindex);
343 return 0;
344 }
345 }
346
347 r = sd_rtnl_message_route_get_family(message, &family);
348 if (r < 0 || !IN_SET(family, AF_INET, AF_INET6)) {
349 log_link_warning(link, "rtnl: received address with invalid family, ignoring.");
350 return 0;
351 }
352
353 r = sd_rtnl_message_route_get_protocol(message, &protocol);
354 if (r < 0) {
355 log_warning_errno(r, "rtnl: could not get route protocol: %m");
356 return 0;
357 }
358
359 switch (family) {
360 case AF_INET:
361 r = sd_netlink_message_read_in_addr(message, RTA_DST, &dst.in);
362 if (r < 0 && r != -ENODATA) {
363 log_link_warning_errno(link, r, "rtnl: received route without valid destination, ignoring: %m");
364 return 0;
365 }
366
367 r = sd_netlink_message_read_in_addr(message, RTA_GATEWAY, &gw.in);
368 if (r < 0 && r != -ENODATA) {
369 log_link_warning_errno(link, r, "rtnl: received route with invalid gateway, ignoring: %m");
370 return 0;
371 }
372
373 r = sd_netlink_message_read_in_addr(message, RTA_SRC, &src.in);
374 if (r < 0 && r != -ENODATA) {
375 log_link_warning_errno(link, r, "rtnl: received route with invalid source, ignoring: %m");
376 return 0;
377 }
378
379 r = sd_netlink_message_read_in_addr(message, RTA_PREFSRC, &prefsrc.in);
380 if (r < 0 && r != -ENODATA) {
381 log_link_warning_errno(link, r, "rtnl: received route with invalid preferred source, ignoring: %m");
382 return 0;
383 }
384
385 break;
386
387 case AF_INET6:
388 r = sd_netlink_message_read_in6_addr(message, RTA_DST, &dst.in6);
389 if (r < 0 && r != -ENODATA) {
390 log_link_warning_errno(link, r, "rtnl: received route without valid destination, ignoring: %m");
391 return 0;
392 }
393
394 r = sd_netlink_message_read_in6_addr(message, RTA_GATEWAY, &gw.in6);
395 if (r < 0 && r != -ENODATA) {
396 log_link_warning_errno(link, r, "rtnl: received route with invalid gateway, ignoring: %m");
397 return 0;
398 }
399
400 r = sd_netlink_message_read_in6_addr(message, RTA_SRC, &src.in6);
401 if (r < 0 && r != -ENODATA) {
402 log_link_warning_errno(link, r, "rtnl: received route with invalid source, ignoring: %m");
403 return 0;
404 }
405
406 r = sd_netlink_message_read_in6_addr(message, RTA_PREFSRC, &prefsrc.in6);
407 if (r < 0 && r != -ENODATA) {
408 log_link_warning_errno(link, r, "rtnl: received route with invalid preferred source, ignoring: %m");
409 return 0;
410 }
411
412 break;
413
414 default:
415 log_link_debug(link, "rtnl: ignoring unsupported address family: %d", family);
416 return 0;
417 }
418
419 r = sd_rtnl_message_route_get_dst_prefixlen(message, &dst_prefixlen);
420 if (r < 0) {
421 log_link_warning_errno(link, r, "rtnl: received route with invalid destination prefixlen, ignoring: %m");
422 return 0;
423 }
424
425 r = sd_rtnl_message_route_get_src_prefixlen(message, &src_prefixlen);
426 if (r < 0) {
427 log_link_warning_errno(link, r, "rtnl: received route with invalid source prefixlen, ignoring: %m");
428 return 0;
429 }
430
431 r = sd_rtnl_message_route_get_scope(message, &scope);
432 if (r < 0) {
433 log_link_warning_errno(link, r, "rtnl: received route with invalid scope, ignoring: %m");
434 return 0;
435 }
436
437 r = sd_rtnl_message_route_get_tos(message, &tos);
438 if (r < 0) {
439 log_link_warning_errno(link, r, "rtnl: received route with invalid tos, ignoring: %m");
440 return 0;
441 }
442
443 r = sd_rtnl_message_route_get_table(message, &table);
444 if (r < 0) {
445 log_link_warning_errno(link, r, "rtnl: received route with invalid table, ignoring: %m");
446 return 0;
447 }
448
449 r = sd_netlink_message_read_u32(message, RTA_PRIORITY, &priority);
450 if (r < 0 && r != -ENODATA) {
451 log_link_warning_errno(link, r, "rtnl: received route with invalid priority, ignoring: %m");
452 return 0;
453 }
454
455 route_get(link, family, &dst, dst_prefixlen, tos, priority, table, &route);
456
457 switch (type) {
458 case RTM_NEWROUTE:
459 if (!route) {
460 /* A route appeared that we did not request */
461 r = route_add_foreign(link, family, &dst, dst_prefixlen, tos, priority, table, &route);
462 if (r < 0)
463 return 0;
464 }
465
466 route_update(route, &src, src_prefixlen, &gw, &prefsrc, scope, protocol);
467
468 break;
469
470 case RTM_DELROUTE:
471 route_free(route);
472 break;
473
474 default:
475 assert_not_reached("Received invalid RTNL message type");
476 }
477
478 return 1;
479 }
480
481 int manager_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message, void *userdata) {
482 Manager *m = userdata;
483 Link *link = NULL;
484 uint16_t type;
485 unsigned char flags;
486 int family;
487 unsigned char prefixlen;
488 unsigned char scope;
489 union in_addr_union in_addr;
490 struct ifa_cacheinfo cinfo;
491 Address *address = NULL;
492 char buf[INET6_ADDRSTRLEN], valid_buf[FORMAT_TIMESPAN_MAX];
493 const char *valid_str = NULL;
494 int r, ifindex;
495
496 assert(rtnl);
497 assert(message);
498 assert(m);
499
500 if (sd_netlink_message_is_error(message)) {
501 r = sd_netlink_message_get_errno(message);
502 if (r < 0)
503 log_warning_errno(r, "rtnl: failed to receive address: %m");
504
505 return 0;
506 }
507
508 r = sd_netlink_message_get_type(message, &type);
509 if (r < 0) {
510 log_warning_errno(r, "rtnl: could not get message type: %m");
511 return 0;
512 } else if (type != RTM_NEWADDR && type != RTM_DELADDR) {
513 log_warning("rtnl: received unexpected message type when processing address");
514 return 0;
515 }
516
517 r = sd_rtnl_message_addr_get_ifindex(message, &ifindex);
518 if (r < 0) {
519 log_warning_errno(r, "rtnl: could not get ifindex from address: %m");
520 return 0;
521 } else if (ifindex <= 0) {
522 log_warning("rtnl: received address message with invalid ifindex: %d", ifindex);
523 return 0;
524 } else {
525 r = link_get(m, ifindex, &link);
526 if (r < 0 || !link) {
527 /* when enumerating we might be out of sync, but we will
528 * get the address again, so just ignore it */
529 if (!m->enumerating)
530 log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex);
531 return 0;
532 }
533 }
534
535 r = sd_rtnl_message_addr_get_family(message, &family);
536 if (r < 0 || !IN_SET(family, AF_INET, AF_INET6)) {
537 log_link_warning(link, "rtnl: received address with invalid family, ignoring.");
538 return 0;
539 }
540
541 r = sd_rtnl_message_addr_get_prefixlen(message, &prefixlen);
542 if (r < 0) {
543 log_link_warning_errno(link, r, "rtnl: received address with invalid prefixlen, ignoring: %m");
544 return 0;
545 }
546
547 r = sd_rtnl_message_addr_get_scope(message, &scope);
548 if (r < 0) {
549 log_link_warning_errno(link, r, "rtnl: received address with invalid scope, ignoring: %m");
550 return 0;
551 }
552
553 r = sd_rtnl_message_addr_get_flags(message, &flags);
554 if (r < 0) {
555 log_link_warning_errno(link, r, "rtnl: received address with invalid flags, ignoring: %m");
556 return 0;
557 }
558
559 switch (family) {
560 case AF_INET:
561 r = sd_netlink_message_read_in_addr(message, IFA_LOCAL, &in_addr.in);
562 if (r < 0) {
563 log_link_warning_errno(link, r, "rtnl: received address without valid address, ignoring: %m");
564 return 0;
565 }
566
567 break;
568
569 case AF_INET6:
570 r = sd_netlink_message_read_in6_addr(message, IFA_ADDRESS, &in_addr.in6);
571 if (r < 0) {
572 log_link_warning_errno(link, r, "rtnl: received address without valid address, ignoring: %m");
573 return 0;
574 }
575
576 break;
577
578 default:
579 log_link_debug(link, "rtnl: ignoring unsupported address family: %d", family);
580 }
581
582 if (!inet_ntop(family, &in_addr, buf, INET6_ADDRSTRLEN)) {
583 log_link_warning(link, "Could not print address");
584 return 0;
585 }
586
587 r = sd_netlink_message_read_cache_info(message, IFA_CACHEINFO, &cinfo);
588 if (r >= 0) {
589 if (cinfo.ifa_valid != CACHE_INFO_INFINITY_LIFE_TIME)
590 valid_str = format_timespan(valid_buf, FORMAT_TIMESPAN_MAX,
591 cinfo.ifa_valid * USEC_PER_SEC,
592 USEC_PER_SEC);
593 }
594
595 address_get(link, family, &in_addr, prefixlen, &address);
596
597 switch (type) {
598 case RTM_NEWADDR:
599 if (address)
600 log_link_debug(link, "Updating address: %s/%u (valid %s%s)", buf, prefixlen,
601 valid_str ? "for " : "forever", valid_str ?: "");
602 else {
603 /* An address appeared that we did not request */
604 r = address_add_foreign(link, family, &in_addr, prefixlen, &address);
605 if (r < 0) {
606 log_link_warning_errno(link, r, "Failed to add address %s/%u: %m", buf, prefixlen);
607 return 0;
608 } else
609 log_link_debug(link, "Adding address: %s/%u (valid %s%s)", buf, prefixlen,
610 valid_str ? "for " : "forever", valid_str ?: "");
611 }
612
613 address_update(address, flags, scope, &cinfo);
614
615 break;
616
617 case RTM_DELADDR:
618
619 if (address) {
620 log_link_debug(link, "Removing address: %s/%u (valid %s%s)", buf, prefixlen,
621 valid_str ? "for " : "forever", valid_str ?: "");
622 address_drop(address);
623 } else
624 log_link_warning(link, "Removing non-existent address: %s/%u (valid %s%s)", buf, prefixlen,
625 valid_str ? "for " : "forever", valid_str ?: "");
626
627 break;
628 default:
629 assert_not_reached("Received invalid RTNL message type");
630 }
631
632 return 1;
633 }
634
635 static int manager_rtnl_process_link(sd_netlink *rtnl, sd_netlink_message *message, void *userdata) {
636 Manager *m = userdata;
637 Link *link = NULL;
638 NetDev *netdev = NULL;
639 uint16_t type;
640 const char *name;
641 int r, ifindex;
642
643 assert(rtnl);
644 assert(message);
645 assert(m);
646
647 if (sd_netlink_message_is_error(message)) {
648 r = sd_netlink_message_get_errno(message);
649 if (r < 0)
650 log_warning_errno(r, "rtnl: Could not receive link: %m");
651
652 return 0;
653 }
654
655 r = sd_netlink_message_get_type(message, &type);
656 if (r < 0) {
657 log_warning_errno(r, "rtnl: Could not get message type: %m");
658 return 0;
659 } else if (type != RTM_NEWLINK && type != RTM_DELLINK) {
660 log_warning("rtnl: Received unexpected message type when processing link");
661 return 0;
662 }
663
664 r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
665 if (r < 0) {
666 log_warning_errno(r, "rtnl: Could not get ifindex from link: %m");
667 return 0;
668 } else if (ifindex <= 0) {
669 log_warning("rtnl: received link message with invalid ifindex: %d", ifindex);
670 return 0;
671 }
672
673 r = sd_netlink_message_read_string(message, IFLA_IFNAME, &name);
674 if (r < 0) {
675 log_warning_errno(r, "rtnl: Received link message without ifname: %m");
676 return 0;
677 }
678
679 (void) link_get(m, ifindex, &link);
680 (void) netdev_get(m, name, &netdev);
681
682 switch (type) {
683 case RTM_NEWLINK:
684 if (!link) {
685 /* link is new, so add it */
686 r = link_add(m, message, &link);
687 if (r < 0) {
688 log_warning_errno(r, "Could not add new link: %m");
689 return 0;
690 }
691 }
692
693 if (netdev) {
694 /* netdev exists, so make sure the ifindex matches */
695 r = netdev_set_ifindex(netdev, message);
696 if (r < 0) {
697 log_warning_errno(r, "Could not set ifindex on netdev: %m");
698 return 0;
699 }
700 }
701
702 r = link_update(link, message);
703 if (r < 0)
704 return 0;
705
706 break;
707
708 case RTM_DELLINK:
709 link_drop(link);
710 netdev_drop(netdev);
711
712 break;
713
714 default:
715 assert_not_reached("Received invalid RTNL message type.");
716 }
717
718 return 1;
719 }
720
721 static int systemd_netlink_fd(void) {
722 int n, fd, rtnl_fd = -EINVAL;
723
724 n = sd_listen_fds(true);
725 if (n <= 0)
726 return -EINVAL;
727
728 for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd ++) {
729 if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1) > 0) {
730 if (rtnl_fd >= 0)
731 return -EINVAL;
732
733 rtnl_fd = fd;
734 }
735 }
736
737 return rtnl_fd;
738 }
739
740 static int manager_connect_rtnl(Manager *m) {
741 int fd, r;
742
743 assert(m);
744
745 fd = systemd_netlink_fd();
746 if (fd < 0)
747 r = sd_netlink_open(&m->rtnl);
748 else
749 r = sd_netlink_open_fd(&m->rtnl, fd);
750 if (r < 0)
751 return r;
752
753 r = sd_netlink_inc_rcvbuf(m->rtnl, RCVBUF_SIZE);
754 if (r < 0)
755 return r;
756
757 r = sd_netlink_attach_event(m->rtnl, m->event, 0);
758 if (r < 0)
759 return r;
760
761 r = sd_netlink_add_match(m->rtnl, RTM_NEWLINK, &manager_rtnl_process_link, m);
762 if (r < 0)
763 return r;
764
765 r = sd_netlink_add_match(m->rtnl, RTM_DELLINK, &manager_rtnl_process_link, m);
766 if (r < 0)
767 return r;
768
769 r = sd_netlink_add_match(m->rtnl, RTM_NEWADDR, &manager_rtnl_process_address, m);
770 if (r < 0)
771 return r;
772
773 r = sd_netlink_add_match(m->rtnl, RTM_DELADDR, &manager_rtnl_process_address, m);
774 if (r < 0)
775 return r;
776
777 r = sd_netlink_add_match(m->rtnl, RTM_NEWROUTE, &manager_rtnl_process_route, m);
778 if (r < 0)
779 return r;
780
781 r = sd_netlink_add_match(m->rtnl, RTM_DELROUTE, &manager_rtnl_process_route, m);
782 if (r < 0)
783 return r;
784
785 return 0;
786 }
787
788 static int ordered_set_put_in_addr_data(OrderedSet *s, const struct in_addr_data *address) {
789 char *p;
790 int r;
791
792 assert(s);
793 assert(address);
794
795 r = in_addr_to_string(address->family, &address->address, &p);
796 if (r < 0)
797 return r;
798
799 r = ordered_set_consume(s, p);
800 if (r == -EEXIST)
801 return 0;
802
803 return r;
804 }
805
806 static int ordered_set_put_in_addr_datav(OrderedSet *s, const struct in_addr_data *addresses, unsigned n) {
807 int r, c = 0;
808 unsigned i;
809
810 assert(s);
811 assert(addresses || n == 0);
812
813 for (i = 0; i < n; i++) {
814 r = ordered_set_put_in_addr_data(s, addresses+i);
815 if (r < 0)
816 return r;
817
818 c += r;
819 }
820
821 return c;
822 }
823
824 static int ordered_set_put_in4_addr(OrderedSet *s, const struct in_addr *address) {
825 char *p;
826 int r;
827
828 assert(s);
829 assert(address);
830
831 r = in_addr_to_string(AF_INET, (const union in_addr_union*) address, &p);
832 if (r < 0)
833 return r;
834
835 r = ordered_set_consume(s, p);
836 if (r == -EEXIST)
837 return 0;
838
839 return r;
840 }
841
842 static int ordered_set_put_in4_addrv(OrderedSet *s, const struct in_addr *addresses, unsigned n) {
843 int r, c = 0;
844 unsigned i;
845
846 assert(s);
847 assert(n == 0 || addresses);
848
849 for (i = 0; i < n; i++) {
850 r = ordered_set_put_in4_addr(s, addresses+i);
851 if (r < 0)
852 return r;
853
854 c += r;
855 }
856
857 return c;
858 }
859
860 static void print_string_set(FILE *f, const char *field, OrderedSet *s) {
861 bool space = false;
862 Iterator i;
863 char *p;
864
865 if (ordered_set_isempty(s))
866 return;
867
868 fputs_unlocked(field, f);
869
870 ORDERED_SET_FOREACH(p, s, i)
871 fputs_with_space(f, p, NULL, &space);
872
873 fputc_unlocked('\n', f);
874 }
875
876 static int manager_save(Manager *m) {
877 _cleanup_ordered_set_free_free_ OrderedSet *dns = NULL, *ntp = NULL, *search_domains = NULL, *route_domains = NULL;
878 Link *link;
879 Iterator i;
880 _cleanup_free_ char *temp_path = NULL;
881 _cleanup_fclose_ FILE *f = NULL;
882 LinkOperationalState operstate = LINK_OPERSTATE_OFF;
883 const char *operstate_str;
884 int r;
885
886 assert(m);
887 assert(m->state_file);
888
889 /* We add all NTP and DNS server to a set, to filter out duplicates */
890 dns = ordered_set_new(&string_hash_ops);
891 if (!dns)
892 return -ENOMEM;
893
894 ntp = ordered_set_new(&string_hash_ops);
895 if (!ntp)
896 return -ENOMEM;
897
898 search_domains = ordered_set_new(&dns_name_hash_ops);
899 if (!search_domains)
900 return -ENOMEM;
901
902 route_domains = ordered_set_new(&dns_name_hash_ops);
903 if (!route_domains)
904 return -ENOMEM;
905
906 HASHMAP_FOREACH(link, m->links, i) {
907 if (link->flags & IFF_LOOPBACK)
908 continue;
909
910 if (link->operstate > operstate)
911 operstate = link->operstate;
912
913 if (!link->network)
914 continue;
915
916 /* First add the static configured entries */
917 r = ordered_set_put_in_addr_datav(dns, link->network->dns, link->network->n_dns);
918 if (r < 0)
919 return r;
920
921 r = ordered_set_put_strdupv(ntp, link->network->ntp);
922 if (r < 0)
923 return r;
924
925 r = ordered_set_put_strdupv(search_domains, link->network->search_domains);
926 if (r < 0)
927 return r;
928
929 r = ordered_set_put_strdupv(route_domains, link->network->route_domains);
930 if (r < 0)
931 return r;
932
933 if (!link->dhcp_lease)
934 continue;
935
936 /* Secondly, add the entries acquired via DHCP */
937 if (link->network->dhcp_use_dns) {
938 const struct in_addr *addresses;
939
940 r = sd_dhcp_lease_get_dns(link->dhcp_lease, &addresses);
941 if (r > 0) {
942 r = ordered_set_put_in4_addrv(dns, addresses, r);
943 if (r < 0)
944 return r;
945 } else if (r < 0 && r != -ENODATA)
946 return r;
947 }
948
949 if (link->network->dhcp_use_ntp) {
950 const struct in_addr *addresses;
951
952 r = sd_dhcp_lease_get_ntp(link->dhcp_lease, &addresses);
953 if (r > 0) {
954 r = ordered_set_put_in4_addrv(ntp, addresses, r);
955 if (r < 0)
956 return r;
957 } else if (r < 0 && r != -ENODATA)
958 return r;
959 }
960
961 if (link->network->dhcp_use_domains != DHCP_USE_DOMAINS_NO) {
962 const char *domainname;
963 char **domains = NULL;
964
965 OrderedSet *target_domains = (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_YES) ? search_domains : route_domains;
966 r = sd_dhcp_lease_get_domainname(link->dhcp_lease, &domainname);
967 if (r >= 0) {
968 r = ordered_set_put_strdup(target_domains, domainname);
969 if (r < 0)
970 return r;
971 } else if (r != -ENODATA)
972 return r;
973
974 r = sd_dhcp_lease_get_search_domains(link->dhcp_lease, &domains);
975 if (r >= 0) {
976 r = ordered_set_put_strdupv(target_domains, domains);
977 if (r < 0)
978 return r;
979 } else if (r != -ENODATA)
980 return r;
981 }
982 }
983
984 operstate_str = link_operstate_to_string(operstate);
985 assert(operstate_str);
986
987 r = fopen_temporary(m->state_file, &f, &temp_path);
988 if (r < 0)
989 return r;
990
991 (void) fchmod(fileno(f), 0644);
992
993 fprintf(f,
994 "# This is private data. Do not parse.\n"
995 "OPER_STATE=%s\n", operstate_str);
996
997 print_string_set(f, "DNS=", dns);
998 print_string_set(f, "NTP=", ntp);
999 print_string_set(f, "DOMAINS=", search_domains);
1000 print_string_set(f, "ROUTE_DOMAINS=", route_domains);
1001
1002 r = fflush_and_check(f);
1003 if (r < 0)
1004 goto fail;
1005
1006 if (rename(temp_path, m->state_file) < 0) {
1007 r = -errno;
1008 goto fail;
1009 }
1010
1011 if (m->operational_state != operstate) {
1012 m->operational_state = operstate;
1013 r = manager_send_changed(m, "OperationalState", NULL);
1014 if (r < 0)
1015 log_error_errno(r, "Could not emit changed OperationalState: %m");
1016 }
1017
1018 m->dirty = false;
1019
1020 return 0;
1021
1022 fail:
1023 (void) unlink(m->state_file);
1024 (void) unlink(temp_path);
1025
1026 return log_error_errno(r, "Failed to save network state to %s: %m", m->state_file);
1027 }
1028
1029 static int manager_dirty_handler(sd_event_source *s, void *userdata) {
1030 Manager *m = userdata;
1031 Link *link;
1032 Iterator i;
1033 int r;
1034
1035 assert(m);
1036
1037 if (m->dirty)
1038 manager_save(m);
1039
1040 SET_FOREACH(link, m->dirty_links, i) {
1041 r = link_save(link);
1042 if (r >= 0)
1043 link_clean(link);
1044 }
1045
1046 return 1;
1047 }
1048
1049 int manager_new(Manager **ret, sd_event *event) {
1050 _cleanup_manager_free_ Manager *m = NULL;
1051 int r;
1052
1053 m = new0(Manager, 1);
1054 if (!m)
1055 return -ENOMEM;
1056
1057 m->state_file = strdup("/run/systemd/netif/state");
1058 if (!m->state_file)
1059 return -ENOMEM;
1060
1061 m->event = sd_event_ref(event);
1062
1063 r = sd_event_add_post(m->event, NULL, manager_dirty_handler, m);
1064 if (r < 0)
1065 return r;
1066
1067 r = manager_connect_rtnl(m);
1068 if (r < 0)
1069 return r;
1070
1071 r = manager_connect_udev(m);
1072 if (r < 0)
1073 return r;
1074
1075 m->netdevs = hashmap_new(&string_hash_ops);
1076 if (!m->netdevs)
1077 return -ENOMEM;
1078
1079 LIST_HEAD_INIT(m->networks);
1080
1081 r = setup_default_address_pool(m);
1082 if (r < 0)
1083 return r;
1084
1085 m->duid.type = DUID_TYPE_EN;
1086
1087 *ret = m;
1088 m = NULL;
1089
1090 return 0;
1091 }
1092
1093 void manager_free(Manager *m) {
1094 Network *network;
1095 NetDev *netdev;
1096 Link *link;
1097 AddressPool *pool;
1098
1099 if (!m)
1100 return;
1101
1102 free(m->state_file);
1103
1104 while ((link = hashmap_first(m->links)))
1105 link_unref(link);
1106 hashmap_free(m->links);
1107
1108 while ((network = m->networks))
1109 network_free(network);
1110
1111 hashmap_free(m->networks_by_name);
1112
1113 while ((netdev = hashmap_first(m->netdevs)))
1114 netdev_unref(netdev);
1115 hashmap_free(m->netdevs);
1116
1117 while ((pool = m->address_pools))
1118 address_pool_free(pool);
1119
1120 sd_netlink_unref(m->rtnl);
1121 sd_event_unref(m->event);
1122
1123 sd_event_source_unref(m->udev_event_source);
1124 udev_monitor_unref(m->udev_monitor);
1125 udev_unref(m->udev);
1126
1127 sd_bus_unref(m->bus);
1128 sd_bus_slot_unref(m->prepare_for_sleep_slot);
1129 sd_event_source_unref(m->bus_retry_event_source);
1130
1131 free(m->dynamic_timezone);
1132 free(m->dynamic_hostname);
1133
1134 free(m);
1135 }
1136
1137 int manager_start(Manager *m) {
1138 Link *link;
1139 Iterator i;
1140
1141 assert(m);
1142
1143 /* The dirty handler will deal with future serialization, but the first one
1144 must be done explicitly. */
1145
1146 manager_save(m);
1147
1148 HASHMAP_FOREACH(link, m->links, i)
1149 link_save(link);
1150
1151 return 0;
1152 }
1153
1154 int manager_load_config(Manager *m) {
1155 int r;
1156
1157 /* update timestamp */
1158 paths_check_timestamp(network_dirs, &m->network_dirs_ts_usec, true);
1159
1160 r = netdev_load(m);
1161 if (r < 0)
1162 return r;
1163
1164 r = network_load(m);
1165 if (r < 0)
1166 return r;
1167
1168 return 0;
1169 }
1170
1171 bool manager_should_reload(Manager *m) {
1172 return paths_check_timestamp(network_dirs, &m->network_dirs_ts_usec, false);
1173 }
1174
1175 int manager_rtnl_enumerate_links(Manager *m) {
1176 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL, *reply = NULL;
1177 sd_netlink_message *link;
1178 int r;
1179
1180 assert(m);
1181 assert(m->rtnl);
1182
1183 r = sd_rtnl_message_new_link(m->rtnl, &req, RTM_GETLINK, 0);
1184 if (r < 0)
1185 return r;
1186
1187 r = sd_netlink_message_request_dump(req, true);
1188 if (r < 0)
1189 return r;
1190
1191 r = sd_netlink_call(m->rtnl, req, 0, &reply);
1192 if (r < 0)
1193 return r;
1194
1195 for (link = reply; link; link = sd_netlink_message_next(link)) {
1196 int k;
1197
1198 m->enumerating = true;
1199
1200 k = manager_rtnl_process_link(m->rtnl, link, m);
1201 if (k < 0)
1202 r = k;
1203
1204 m->enumerating = false;
1205 }
1206
1207 return r;
1208 }
1209
1210 int manager_rtnl_enumerate_addresses(Manager *m) {
1211 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL, *reply = NULL;
1212 sd_netlink_message *addr;
1213 int r;
1214
1215 assert(m);
1216 assert(m->rtnl);
1217
1218 r = sd_rtnl_message_new_addr(m->rtnl, &req, RTM_GETADDR, 0, 0);
1219 if (r < 0)
1220 return r;
1221
1222 r = sd_netlink_message_request_dump(req, true);
1223 if (r < 0)
1224 return r;
1225
1226 r = sd_netlink_call(m->rtnl, req, 0, &reply);
1227 if (r < 0)
1228 return r;
1229
1230 for (addr = reply; addr; addr = sd_netlink_message_next(addr)) {
1231 int k;
1232
1233 m->enumerating = true;
1234
1235 k = manager_rtnl_process_address(m->rtnl, addr, m);
1236 if (k < 0)
1237 r = k;
1238
1239 m->enumerating = false;
1240 }
1241
1242 return r;
1243 }
1244
1245 int manager_rtnl_enumerate_routes(Manager *m) {
1246 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL, *reply = NULL;
1247 sd_netlink_message *route;
1248 int r;
1249
1250 assert(m);
1251 assert(m->rtnl);
1252
1253 r = sd_rtnl_message_new_route(m->rtnl, &req, RTM_GETROUTE, 0, 0);
1254 if (r < 0)
1255 return r;
1256
1257 r = sd_netlink_message_request_dump(req, true);
1258 if (r < 0)
1259 return r;
1260
1261 r = sd_netlink_call(m->rtnl, req, 0, &reply);
1262 if (r < 0)
1263 return r;
1264
1265 for (route = reply; route; route = sd_netlink_message_next(route)) {
1266 int k;
1267
1268 m->enumerating = true;
1269
1270 k = manager_rtnl_process_route(m->rtnl, route, m);
1271 if (k < 0)
1272 r = k;
1273
1274 m->enumerating = false;
1275 }
1276
1277 return r;
1278 }
1279
1280 int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found) {
1281 AddressPool *p;
1282 int r;
1283
1284 assert(m);
1285 assert(prefixlen > 0);
1286 assert(found);
1287
1288 LIST_FOREACH(address_pools, p, m->address_pools) {
1289 if (p->family != family)
1290 continue;
1291
1292 r = address_pool_acquire(p, prefixlen, found);
1293 if (r != 0)
1294 return r;
1295 }
1296
1297 return 0;
1298 }
1299
1300 Link* manager_find_uplink(Manager *m, Link *exclude) {
1301 _cleanup_free_ struct local_address *gateways = NULL;
1302 int n, i;
1303
1304 assert(m);
1305
1306 /* Looks for a suitable "uplink", via black magic: an
1307 * interface that is up and where the default route with the
1308 * highest priority points to. */
1309
1310 n = local_gateways(m->rtnl, 0, AF_UNSPEC, &gateways);
1311 if (n < 0) {
1312 log_warning_errno(n, "Failed to determine list of default gateways: %m");
1313 return NULL;
1314 }
1315
1316 for (i = 0; i < n; i++) {
1317 Link *link;
1318
1319 link = hashmap_get(m->links, INT_TO_PTR(gateways[i].ifindex));
1320 if (!link) {
1321 log_debug("Weird, found a gateway for a link we don't know. Ignoring.");
1322 continue;
1323 }
1324
1325 if (link == exclude)
1326 continue;
1327
1328 if (link->operstate < LINK_OPERSTATE_ROUTABLE)
1329 continue;
1330
1331 return link;
1332 }
1333
1334 return NULL;
1335 }
1336
1337 void manager_dirty(Manager *manager) {
1338 assert(manager);
1339
1340 /* the serialized state in /run is no longer up-to-date */
1341 manager->dirty = true;
1342 }
1343
1344 static int set_hostname_handler(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
1345 Manager *manager = userdata;
1346 const sd_bus_error *e;
1347
1348 assert(m);
1349 assert(manager);
1350
1351 e = sd_bus_message_get_error(m);
1352 if (e)
1353 log_warning_errno(sd_bus_error_get_errno(e), "Could not set hostname: %s", e->message);
1354
1355 return 1;
1356 }
1357
1358 int manager_set_hostname(Manager *m, const char *hostname) {
1359 int r;
1360
1361 log_debug("Setting transient hostname: '%s'", strna(hostname));
1362 if (free_and_strdup(&m->dynamic_hostname, hostname) < 0)
1363 return log_oom();
1364
1365 if (!m->bus) {
1366 /* TODO: replace by assert when we can rely on kdbus */
1367 log_info("Not connected to system bus, ignoring transient hostname.");
1368 return 0;
1369 }
1370
1371 r = sd_bus_call_method_async(
1372 m->bus,
1373 NULL,
1374 "org.freedesktop.hostname1",
1375 "/org/freedesktop/hostname1",
1376 "org.freedesktop.hostname1",
1377 "SetHostname",
1378 set_hostname_handler,
1379 m,
1380 "sb",
1381 hostname,
1382 false);
1383
1384 if (r < 0)
1385 return log_error_errno(r, "Could not set transient hostname: %m");
1386
1387 return 0;
1388 }
1389
1390 static int set_timezone_handler(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
1391 Manager *manager = userdata;
1392 const sd_bus_error *e;
1393
1394 assert(m);
1395 assert(manager);
1396
1397 e = sd_bus_message_get_error(m);
1398 if (e)
1399 log_warning_errno(sd_bus_error_get_errno(e), "Could not set timezone: %s", e->message);
1400
1401 return 1;
1402 }
1403
1404 int manager_set_timezone(Manager *m, const char *tz) {
1405 int r;
1406
1407 assert(m);
1408 assert(tz);
1409
1410 log_debug("Setting system timezone: '%s'", tz);
1411 if (free_and_strdup(&m->dynamic_timezone, tz) < 0)
1412 return log_oom();
1413
1414 if (!m->bus) {
1415 log_info("Not connected to system bus, ignoring timezone.");
1416 return 0;
1417 }
1418
1419 r = sd_bus_call_method_async(
1420 m->bus,
1421 NULL,
1422 "org.freedesktop.timedate1",
1423 "/org/freedesktop/timedate1",
1424 "org.freedesktop.timedate1",
1425 "SetTimezone",
1426 set_timezone_handler,
1427 m,
1428 "sb",
1429 tz,
1430 false);
1431 if (r < 0)
1432 return log_error_errno(r, "Could not set timezone: %m");
1433
1434 return 0;
1435 }