]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/network/networkd-manager.c
networkctl: move strv_isempty() check into dump_list()
[thirdparty/systemd.git] / src / network / networkd-manager.c
CommitLineData
f579559b
TG
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
091a364c 22#include <sys/socket.h>
bbf7c048 23#include <linux/if.h>
3bef724f 24
fc2f9534 25#include "sd-daemon.h"
07630cea 26#include "sd-netlink.h"
fc2f9534 27
b5efdb8a 28#include "alloc-util.h"
a97dcc12 29#include "bus-util.h"
07630cea 30#include "conf-parser.h"
a97dcc12 31#include "def.h"
3ffd4af2 32#include "fd-util.h"
0d39fa9c 33#include "fileio.h"
07630cea 34#include "libudev-private.h"
4f5f911e 35#include "local-addresses.h"
07630cea 36#include "netlink-util.h"
fc2f9534 37#include "networkd.h"
07630cea
LP
38#include "path-util.h"
39#include "set.h"
40#include "udev-util.h"
41#include "virt.h"
505f8da7 42
be660c37
AR
43/* use 8 MB for receive socket kernel queue. */
44#define RCVBUF_SIZE (8*1024*1024)
45
2ad8416d
ZJS
46const char* const network_dirs[] = {
47 "/etc/systemd/network",
48 "/run/systemd/network",
49 "/usr/lib/systemd/network",
eed0eee8 50#ifdef HAVE_SPLIT_USR
2ad8416d
ZJS
51 "/lib/systemd/network",
52#endif
53 NULL};
54
11bf3cce
LP
55static 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
9c0a72f9
TG
82static 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
95static 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)
2f3cf1f9 105 log_link_warning_errno(link, r, "Could not reset carrier: %m");
9c0a72f9
TG
106 }
107
108 return 0;
109}
110
19070062 111static int match_prepare_for_sleep(sd_bus_message *message, void *userdata, sd_bus_error *ret_error) {
9c0a72f9
TG
112 Manager *m = userdata;
113 int b, r;
114
19070062 115 assert(message);
9c0a72f9
TG
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
133int manager_connect_bus(Manager *m) {
134 int r;
135
136 assert(m);
137
138 r = sd_bus_default_system(&m->bus);
139 if (r == -ENOENT) {
140 /* We failed to connect? Yuck, we must be in early
141 * boot. Let's try in 5s again. As soon as we have
142 * kdbus we can stop doing this... */
143
144 log_debug_errno(r, "Failed to connect to bus, trying again in 5s: %m");
145
146 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);
147 if (r < 0)
148 return log_error_errno(r, "Failed to install bus reconnect time event: %m");
149
150 return 0;
7d6884b6
TA
151 }
152
153 if (r < 0)
9c0a72f9
TG
154 return r;
155
9c0a72f9
TG
156 r = sd_bus_add_match(m->bus, &m->prepare_for_sleep_slot,
157 "type='signal',"
158 "sender='org.freedesktop.login1',"
159 "interface='org.freedesktop.login1.Manager',"
160 "member='PrepareForSleep',"
161 "path='/org/freedesktop/login1'",
162 match_prepare_for_sleep,
163 m);
164 if (r < 0)
165 return log_error_errno(r, "Failed to add match for PrepareForSleep: %m");
166
e331e246
TG
167 r = sd_bus_add_object_vtable(m->bus, NULL, "/org/freedesktop/network1", "org.freedesktop.network1.Manager", manager_vtable, m);
168 if (r < 0)
169 return log_error_errno(r, "Failed to add manager object vtable: %m");
170
171 r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/network1/link", "org.freedesktop.network1.Link", link_vtable, link_object_find, m);
172 if (r < 0)
173 return log_error_errno(r, "Failed to add link object vtable: %m");
174
175 r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/network1/link", link_node_enumerator, m);
176 if (r < 0)
177 return log_error_errno(r, "Failed to add link enumerator: %m");
3175fcde
TG
178
179 r = sd_bus_add_fallback_vtable(m->bus, NULL, "/org/freedesktop/network1/network", "org.freedesktop.network1.Network", network_vtable, network_object_find, m);
180 if (r < 0)
181 return log_error_errno(r, "Failed to add network object vtable: %m");
182
183 r = sd_bus_add_node_enumerator(m->bus, NULL, "/org/freedesktop/network1/network", network_node_enumerator, m);
184 if (r < 0)
185 return log_error_errno(r, "Failed to add network enumerator: %m");
e331e246
TG
186
187 r = sd_bus_request_name(m->bus, "org.freedesktop.network1", 0);
188 if (r < 0)
189 return log_error_errno(r, "Failed to register name: %m");
190
191 r = sd_bus_attach_event(m->bus, m->event, 0);
192 if (r < 0)
193 return log_error_errno(r, "Failed to attach bus to event loop: %m");
194
9c0a72f9
TG
195 return 0;
196}
197
5fae368b
TG
198static int manager_udev_process_link(Manager *m, struct udev_device *device) {
199 Link *link = NULL;
200 int r, ifindex;
5544ee85 201
5fae368b
TG
202 assert(m);
203 assert(device);
5544ee85 204
5fae368b
TG
205 if (!streq_ptr(udev_device_get_action(device), "add"))
206 return 0;
5544ee85 207
5fae368b
TG
208 ifindex = udev_device_get_ifindex(device);
209 if (ifindex <= 0) {
2f3cf1f9 210 log_debug("Ignoring udev ADD event for device with invalid ifindex");
5fae368b 211 return 0;
5544ee85
TG
212 }
213
5fae368b
TG
214 r = link_get(m, ifindex, &link);
215 if (r == -ENODEV)
216 return 0;
217 else if (r < 0)
f579559b
TG
218 return r;
219
5fae368b 220 r = link_initialized(link, device);
44de0efc
LP
221 if (r < 0)
222 return r;
223
5fae368b
TG
224 return 0;
225}
be660c37 226
5fae368b
TG
227static int manager_dispatch_link_udev(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
228 Manager *m = userdata;
229 struct udev_monitor *monitor = m->udev_monitor;
230 _cleanup_udev_device_unref_ struct udev_device *device = NULL;
f579559b 231
5fae368b
TG
232 device = udev_monitor_receive_device(monitor);
233 if (!device)
02b59d57
TG
234 return -ENOMEM;
235
5fae368b 236 manager_udev_process_link(m, device);
f579559b
TG
237 return 0;
238}
239
5fae368b
TG
240static int manager_connect_udev(Manager *m) {
241 int r;
f579559b 242
5fae368b
TG
243 /* udev does not initialize devices inside containers,
244 * so we rely on them being already initialized before
245 * entering the container */
75f86906 246 if (detect_container() > 0)
5fae368b 247 return 0;
f579559b 248
5fae368b
TG
249 m->udev = udev_new();
250 if (!m->udev)
251 return -ENOMEM;
02b59d57 252
5fae368b
TG
253 m->udev_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
254 if (!m->udev_monitor)
255 return -ENOMEM;
02b59d57 256
5fae368b 257 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_monitor, "net", NULL);
02b59d57 258 if (r < 0)
5fae368b 259 return log_error_errno(r, "Could not add udev monitor filter: %m");
02b59d57 260
5fae368b
TG
261 r = udev_monitor_enable_receiving(m->udev_monitor);
262 if (r < 0) {
263 log_error("Could not enable udev monitor");
02b59d57 264 return r;
667fcc6d 265 }
505f8da7 266
5fae368b
TG
267 r = sd_event_add_io(m->event,
268 &m->udev_event_source,
269 udev_monitor_get_fd(m->udev_monitor),
270 EPOLLIN, manager_dispatch_link_udev,
271 m);
272 if (r < 0)
667fcc6d 273 return r;
505f8da7 274
5fae368b 275 r = sd_event_source_set_description(m->udev_event_source, "networkd-udev");
505f8da7
TG
276 if (r < 0)
277 return r;
11a7f229 278
505f8da7
TG
279 return 0;
280}
f579559b 281
1c8e710c
TG
282int manager_rtnl_process_route(sd_netlink *rtnl, sd_netlink_message *message, void *userdata) {
283 Manager *m = userdata;
284 Link *link = NULL;
285 uint16_t type;
286 uint32_t ifindex, priority = 0;
287 unsigned char protocol, scope, tos, table;
288 int family;
289 unsigned char dst_prefixlen, src_prefixlen;
290 union in_addr_union dst = {}, gw = {}, src = {}, prefsrc = {};
291 Route *route = NULL;
292 int r;
293
294 assert(rtnl);
295 assert(message);
296 assert(m);
297
298 if (sd_netlink_message_is_error(message)) {
299 r = sd_netlink_message_get_errno(message);
300 if (r < 0)
301 log_warning_errno(r, "rtnl: failed to receive route: %m");
302
303 return 0;
304 }
305
306 r = sd_netlink_message_get_type(message, &type);
307 if (r < 0) {
308 log_warning_errno(r, "rtnl: could not get message type: %m");
309 return 0;
310 } else if (type != RTM_NEWROUTE && type != RTM_DELROUTE) {
311 log_warning("rtnl: received unexpected message type when processing route");
312 return 0;
313 }
314
315 r = sd_netlink_message_read_u32(message, RTA_OIF, &ifindex);
316 if (r == -ENODATA) {
317 log_debug("rtnl: received route without ifindex, ignoring");
318 return 0;
319 } else if (r < 0) {
320 log_warning_errno(r, "rtnl: could not get ifindex from route, ignoring: %m");
321 return 0;
322 } else if (ifindex <= 0) {
323 log_warning("rtnl: received route message with invalid ifindex, ignoring: %d", ifindex);
324 return 0;
325 } else {
326 r = link_get(m, ifindex, &link);
327 if (r < 0 || !link) {
328 /* when enumerating we might be out of sync, but we will
329 * get the route again, so just ignore it */
330 if (!m->enumerating)
331 log_warning("rtnl: received route for nonexistent link (%d), ignoring", ifindex);
332 return 0;
333 }
334 }
335
336 r = sd_rtnl_message_route_get_family(message, &family);
337 if (r < 0 || !IN_SET(family, AF_INET, AF_INET6)) {
338 log_link_warning(link, "rtnl: received address with invalid family, ignoring.");
339 return 0;
340 }
341
342 r = sd_rtnl_message_route_get_protocol(message, &protocol);
343 if (r < 0) {
344 log_warning_errno(r, "rtnl: could not get route protocol: %m");
345 return 0;
346 }
347
348 switch (family) {
349 case AF_INET:
350 r = sd_netlink_message_read_in_addr(message, RTA_DST, &dst.in);
351 if (r < 0 && r != -ENODATA) {
352 log_link_warning_errno(link, r, "rtnl: received route without valid destination, ignoring: %m");
353 return 0;
354 }
355
356 r = sd_netlink_message_read_in_addr(message, RTA_GATEWAY, &gw.in);
357 if (r < 0 && r != -ENODATA) {
358 log_link_warning_errno(link, r, "rtnl: received route with invalid gateway, ignoring: %m");
359 return 0;
360 }
361
362 r = sd_netlink_message_read_in_addr(message, RTA_SRC, &src.in);
363 if (r < 0 && r != -ENODATA) {
364 log_link_warning_errno(link, r, "rtnl: received route with invalid source, ignoring: %m");
365 return 0;
366 }
367
368 r = sd_netlink_message_read_in_addr(message, RTA_PREFSRC, &prefsrc.in);
369 if (r < 0 && r != -ENODATA) {
370 log_link_warning_errno(link, r, "rtnl: received route with invalid preferred source, ignoring: %m");
371 return 0;
372 }
373
374 break;
375
376 case AF_INET6:
377 r = sd_netlink_message_read_in6_addr(message, RTA_DST, &dst.in6);
378 if (r < 0 && r != -ENODATA) {
379 log_link_warning_errno(link, r, "rtnl: received route without valid destination, ignoring: %m");
380 return 0;
381 }
382
383 r = sd_netlink_message_read_in6_addr(message, RTA_GATEWAY, &gw.in6);
384 if (r < 0 && r != -ENODATA) {
385 log_link_warning_errno(link, r, "rtnl: received route with invalid gateway, ignoring: %m");
386 return 0;
387 }
388
389 r = sd_netlink_message_read_in6_addr(message, RTA_SRC, &src.in6);
390 if (r < 0 && r != -ENODATA) {
391 log_link_warning_errno(link, r, "rtnl: received route with invalid source, ignoring: %m");
392 return 0;
393 }
394
395 r = sd_netlink_message_read_in6_addr(message, RTA_PREFSRC, &prefsrc.in6);
396 if (r < 0 && r != -ENODATA) {
397 log_link_warning_errno(link, r, "rtnl: received route with invalid preferred source, ignoring: %m");
398 return 0;
399 }
400
401 break;
402
403 default:
404 log_link_debug(link, "rtnl: ignoring unsupported address family: %d", family);
405 return 0;
406 }
407
408 r = sd_rtnl_message_route_get_dst_prefixlen(message, &dst_prefixlen);
409 if (r < 0) {
410 log_link_warning_errno(link, r, "rtnl: received route with invalid destination prefixlen, ignoring: %m");
411 return 0;
412 }
413
414 r = sd_rtnl_message_route_get_src_prefixlen(message, &src_prefixlen);
415 if (r < 0) {
416 log_link_warning_errno(link, r, "rtnl: received route with invalid source prefixlen, ignoring: %m");
417 return 0;
418 }
419
420 r = sd_rtnl_message_route_get_scope(message, &scope);
421 if (r < 0) {
422 log_link_warning_errno(link, r, "rtnl: received route with invalid scope, ignoring: %m");
423 return 0;
424 }
425
426 r = sd_rtnl_message_route_get_tos(message, &tos);
427 if (r < 0) {
428 log_link_warning_errno(link, r, "rtnl: received route with invalid tos, ignoring: %m");
429 return 0;
430 }
431
432 r = sd_rtnl_message_route_get_table(message, &table);
433 if (r < 0) {
434 log_link_warning_errno(link, r, "rtnl: received route with invalid table, ignoring: %m");
435 return 0;
436 }
437
438 r = sd_netlink_message_read_u32(message, RTA_PRIORITY, &priority);
439 if (r < 0 && r != -ENODATA) {
440 log_link_warning_errno(link, r, "rtnl: received route with invalid priority, ignoring: %m");
441 return 0;
442 }
443
444 route_get(link, family, &dst, dst_prefixlen, tos, priority, table, &route);
445
446 switch (type) {
447 case RTM_NEWROUTE:
448 if (!route) {
449 /* A route appeared that we did not request */
450 r = route_add_foreign(link, family, &dst, dst_prefixlen, tos, priority, table, &route);
451 if (r < 0)
452 return 0;
453 }
454
455 route_update(route, &src, src_prefixlen, &gw, &prefsrc, scope, protocol);
456
457 break;
458
459 case RTM_DELROUTE:
460
461 if (route)
462 route_drop(route);
463
464 break;
465 default:
466 assert_not_reached("Received invalid RTNL message type");
467 }
468
469 return 1;
470}
471
200a0868
TG
472int manager_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message, void *userdata) {
473 Manager *m = userdata;
474 Link *link = NULL;
475 uint16_t type;
200a0868 476 unsigned char flags;
054f0db4
TG
477 int family;
478 unsigned char prefixlen;
479 unsigned char scope;
480 union in_addr_union in_addr;
481 struct ifa_cacheinfo cinfo;
482 Address *address = NULL;
200a0868
TG
483 char buf[INET6_ADDRSTRLEN], valid_buf[FORMAT_TIMESPAN_MAX];
484 const char *valid_str = NULL;
485 int r, ifindex;
486
487 assert(rtnl);
488 assert(message);
489 assert(m);
490
491 if (sd_netlink_message_is_error(message)) {
492 r = sd_netlink_message_get_errno(message);
493 if (r < 0)
494 log_warning_errno(r, "rtnl: failed to receive address: %m");
495
496 return 0;
497 }
498
499 r = sd_netlink_message_get_type(message, &type);
500 if (r < 0) {
501 log_warning_errno(r, "rtnl: could not get message type: %m");
502 return 0;
503 } else if (type != RTM_NEWADDR && type != RTM_DELADDR) {
504 log_warning("rtnl: received unexpected message type when processing address");
505 return 0;
506 }
507
508 r = sd_rtnl_message_addr_get_ifindex(message, &ifindex);
509 if (r < 0) {
510 log_warning_errno(r, "rtnl: could not get ifindex from address: %m");
511 return 0;
512 } else if (ifindex <= 0) {
513 log_warning("rtnl: received address message with invalid ifindex: %d", ifindex);
514 return 0;
515 } else {
516 r = link_get(m, ifindex, &link);
517 if (r < 0 || !link) {
518 /* when enumerating we might be out of sync, but we will
519 * get the address again, so just ignore it */
520 if (!m->enumerating)
521 log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex);
522 return 0;
523 }
524 }
525
054f0db4
TG
526 r = sd_rtnl_message_addr_get_family(message, &family);
527 if (r < 0 || !IN_SET(family, AF_INET, AF_INET6)) {
200a0868
TG
528 log_link_warning(link, "rtnl: received address with invalid family, ignoring.");
529 return 0;
530 }
531
054f0db4 532 r = sd_rtnl_message_addr_get_prefixlen(message, &prefixlen);
200a0868
TG
533 if (r < 0) {
534 log_link_warning_errno(link, r, "rtnl: received address with invalid prefixlen, ignoring: %m");
535 return 0;
536 }
537
054f0db4 538 r = sd_rtnl_message_addr_get_scope(message, &scope);
200a0868
TG
539 if (r < 0) {
540 log_link_warning_errno(link, r, "rtnl: received address with invalid scope, ignoring: %m");
541 return 0;
542 }
543
544 r = sd_rtnl_message_addr_get_flags(message, &flags);
545 if (r < 0) {
546 log_link_warning_errno(link, r, "rtnl: received address with invalid flags, ignoring: %m");
547 return 0;
548 }
200a0868 549
054f0db4 550 switch (family) {
200a0868 551 case AF_INET:
054f0db4 552 r = sd_netlink_message_read_in_addr(message, IFA_LOCAL, &in_addr.in);
200a0868
TG
553 if (r < 0) {
554 log_link_warning_errno(link, r, "rtnl: received address without valid address, ignoring: %m");
555 return 0;
556 }
557
558 break;
559
560 case AF_INET6:
054f0db4 561 r = sd_netlink_message_read_in6_addr(message, IFA_ADDRESS, &in_addr.in6);
200a0868
TG
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 default:
1c8e710c 570 log_link_debug(link, "rtnl: ignoring unsupported address family: %d", family);
200a0868
TG
571 }
572
054f0db4 573 if (!inet_ntop(family, &in_addr, buf, INET6_ADDRSTRLEN)) {
200a0868
TG
574 log_link_warning(link, "Could not print address");
575 return 0;
576 }
577
054f0db4 578 r = sd_netlink_message_read_cache_info(message, IFA_CACHEINFO, &cinfo);
200a0868 579 if (r >= 0) {
4058d339 580 if (cinfo.ifa_valid != CACHE_INFO_INFINITY_LIFE_TIME)
200a0868 581 valid_str = format_timespan(valid_buf, FORMAT_TIMESPAN_MAX,
054f0db4 582 cinfo.ifa_valid * USEC_PER_SEC,
200a0868
TG
583 USEC_PER_SEC);
584 }
585
054f0db4 586 address_get(link, family, &in_addr, prefixlen, &address);
200a0868
TG
587
588 switch (type) {
589 case RTM_NEWADDR:
36c32f61 590 if (address)
4058d339
TG
591 log_link_debug(link, "Updating address: %s/%u (valid %s%s)", buf, prefixlen,
592 valid_str ? "for " : "forever", valid_str ?: "");
36c32f61 593 else {
adda1ed9
TG
594 /* An address appeared that we did not request */
595 r = address_add_foreign(link, family, &in_addr, prefixlen, &address);
cf1d700d 596 if (r < 0) {
054f0db4 597 log_link_warning_errno(link, r, "Failed to add address %s/%u: %m", buf, prefixlen);
cf1d700d
TG
598 return 0;
599 } else
4058d339
TG
600 log_link_debug(link, "Adding address: %s/%u (valid %s%s)", buf, prefixlen,
601 valid_str ? "for " : "forever", valid_str ?: "");
200a0868
TG
602 }
603
58fda79c 604 address_update(address, flags, scope, &cinfo);
36c32f61 605
200a0868
TG
606 break;
607
608 case RTM_DELADDR:
609
054f0db4 610 if (address) {
4058d339
TG
611 log_link_debug(link, "Removing address: %s/%u (valid %s%s)", buf, prefixlen,
612 valid_str ? "for " : "forever", valid_str ?: "");
91b5f997 613 address_drop(address);
200a0868 614 } else
4058d339
TG
615 log_link_warning(link, "Removing non-existent address: %s/%u (valid %s%s)", buf, prefixlen,
616 valid_str ? "for " : "forever", valid_str ?: "");
200a0868
TG
617
618 break;
619 default:
620 assert_not_reached("Received invalid RTNL message type");
621 }
622
623 return 1;
624}
625
1c4baffc 626static int manager_rtnl_process_link(sd_netlink *rtnl, sd_netlink_message *message, void *userdata) {
505f8da7
TG
627 Manager *m = userdata;
628 Link *link = NULL;
4d473d5d 629 NetDev *netdev = NULL;
f2236469 630 uint16_t type;
ca4e095a 631 const char *name;
505f8da7 632 int r, ifindex;
f579559b 633
505f8da7
TG
634 assert(rtnl);
635 assert(message);
f579559b
TG
636 assert(m);
637
1c4baffc
TG
638 if (sd_netlink_message_is_error(message)) {
639 r = sd_netlink_message_get_errno(message);
45af44d4 640 if (r < 0)
2f3cf1f9 641 log_warning_errno(r, "rtnl: Could not receive link: %m");
45af44d4
TG
642
643 return 0;
644 }
645
1c4baffc 646 r = sd_netlink_message_get_type(message, &type);
f2236469 647 if (r < 0) {
2f3cf1f9 648 log_warning_errno(r, "rtnl: Could not get message type: %m");
f2236469 649 return 0;
cdfee943 650 } else if (type != RTM_NEWLINK && type != RTM_DELLINK) {
2f3cf1f9 651 log_warning("rtnl: Received unexpected message type when processing link");
cdfee943 652 return 0;
f2236469
TG
653 }
654
505f8da7 655 r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
45af44d4 656 if (r < 0) {
2f3cf1f9 657 log_warning_errno(r, "rtnl: Could not get ifindex from link: %m");
45af44d4
TG
658 return 0;
659 } else if (ifindex <= 0) {
660 log_warning("rtnl: received link message with invalid ifindex: %d", ifindex);
505f8da7 661 return 0;
a0db8e46 662 }
f579559b 663
1c4baffc 664 r = sd_netlink_message_read_string(message, IFLA_IFNAME, &name);
45af44d4 665 if (r < 0) {
2f3cf1f9 666 log_warning_errno(r, "rtnl: Received link message without ifname: %m");
4d473d5d 667 return 0;
a0db8e46
ZJS
668 }
669
670 (void) link_get(m, ifindex, &link);
671 (void) netdev_get(m, name, &netdev);
4d473d5d
TG
672
673 switch (type) {
674 case RTM_NEWLINK:
675 if (!link) {
676 /* link is new, so add it */
677 r = link_add(m, message, &link);
678 if (r < 0) {
2f3cf1f9 679 log_warning_errno(r, "Could not add new link: %m");
4d473d5d
TG
680 return 0;
681 }
682 }
683
684 if (netdev) {
685 /* netdev exists, so make sure the ifindex matches */
505f8da7
TG
686 r = netdev_set_ifindex(netdev, message);
687 if (r < 0) {
2f3cf1f9 688 log_warning_errno(r, "Could not set ifindex on netdev: %m");
505f8da7
TG
689 return 0;
690 }
691 }
e1202047 692
f2236469
TG
693 r = link_update(link, message);
694 if (r < 0)
695 return 0;
4d473d5d
TG
696
697 break;
698
699 case RTM_DELLINK:
700 link_drop(link);
701 netdev_drop(netdev);
702
703 break;
704
705 default:
706 assert_not_reached("Received invalid RTNL message type.");
f2236469 707 }
505f8da7
TG
708
709 return 1;
710}
711
5fae368b
TG
712static int systemd_netlink_fd(void) {
713 int n, fd, rtnl_fd = -EINVAL;
714
715 n = sd_listen_fds(true);
716 if (n <= 0)
717 return -EINVAL;
718
719 for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd ++) {
720 if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1) > 0) {
721 if (rtnl_fd >= 0)
722 return -EINVAL;
723
724 rtnl_fd = fd;
725 }
726 }
727
728 return rtnl_fd;
729}
730
731static int manager_connect_rtnl(Manager *m) {
732 int fd, r;
505f8da7
TG
733
734 assert(m);
505f8da7 735
5fae368b
TG
736 fd = systemd_netlink_fd();
737 if (fd < 0)
1c4baffc 738 r = sd_netlink_open(&m->rtnl);
5fae368b 739 else
1c4baffc 740 r = sd_netlink_open_fd(&m->rtnl, fd);
505f8da7
TG
741 if (r < 0)
742 return r;
743
1c4baffc 744 r = sd_netlink_inc_rcvbuf(m->rtnl, RCVBUF_SIZE);
f579559b 745 if (r < 0)
bf5332d2 746 return r;
f579559b 747
1c4baffc 748 r = sd_netlink_attach_event(m->rtnl, m->event, 0);
505f8da7
TG
749 if (r < 0)
750 return r;
f579559b 751
1c4baffc 752 r = sd_netlink_add_match(m->rtnl, RTM_NEWLINK, &manager_rtnl_process_link, m);
5fae368b
TG
753 if (r < 0)
754 return r;
505f8da7 755
1c4baffc 756 r = sd_netlink_add_match(m->rtnl, RTM_DELLINK, &manager_rtnl_process_link, m);
5fae368b
TG
757 if (r < 0)
758 return r;
45af44d4 759
200a0868 760 r = sd_netlink_add_match(m->rtnl, RTM_NEWADDR, &manager_rtnl_process_address, m);
5fae368b
TG
761 if (r < 0)
762 return r;
763
200a0868 764 r = sd_netlink_add_match(m->rtnl, RTM_DELADDR, &manager_rtnl_process_address, m);
5fae368b
TG
765 if (r < 0)
766 return r;
767
1c8e710c
TG
768 r = sd_netlink_add_match(m->rtnl, RTM_NEWROUTE, &manager_rtnl_process_route, m);
769 if (r < 0)
770 return r;
771
772 r = sd_netlink_add_match(m->rtnl, RTM_DELROUTE, &manager_rtnl_process_route, m);
773 if (r < 0)
774 return r;
775
5fae368b 776 return 0;
45af44d4 777}
505f8da7 778
84de38c5
TG
779static int set_put_in_addr(Set *s, const struct in_addr *address) {
780 char *p;
781 int r;
782
783 assert(s);
784
785 r = in_addr_to_string(AF_INET, (const union in_addr_union*) address, &p);
786 if (r < 0)
787 return r;
788
789 r = set_consume(s, p);
790 if (r == -EEXIST)
791 return 0;
792
793 return r;
794}
795
796static int set_put_in_addrv(Set *s, const struct in_addr *addresses, int n) {
797 int r, i, c = 0;
798
799 assert(s);
800 assert(n <= 0 || addresses);
801
802 for (i = 0; i < n; i++) {
803 r = set_put_in_addr(s, addresses+i);
804 if (r < 0)
805 return r;
806
807 c += r;
808 }
809
810 return c;
811}
812
813static void print_string_set(FILE *f, const char *field, Set *s) {
814 bool space = false;
815 Iterator i;
816 char *p;
817
818 if (set_isempty(s))
819 return;
820
821 fputs(field, f);
822
823 SET_FOREACH(p, s, i) {
824 if (space)
825 fputc(' ', f);
826 fputs(p, f);
827 space = true;
828 }
829 fputc('\n', f);
830}
831
832static int manager_save(Manager *m) {
3df9bec5 833 _cleanup_set_free_free_ Set *dns = NULL, *ntp = NULL, *search_domains = NULL, *route_domains = NULL;
84de38c5
TG
834 Link *link;
835 Iterator i;
836 _cleanup_free_ char *temp_path = NULL;
837 _cleanup_fclose_ FILE *f = NULL;
838 LinkOperationalState operstate = LINK_OPERSTATE_OFF;
839 const char *operstate_str;
840 int r;
841
842 assert(m);
843 assert(m->state_file);
844
845 /* We add all NTP and DNS server to a set, to filter out duplicates */
846 dns = set_new(&string_hash_ops);
847 if (!dns)
848 return -ENOMEM;
849
850 ntp = set_new(&string_hash_ops);
851 if (!ntp)
852 return -ENOMEM;
853
3df9bec5
LP
854 search_domains = set_new(&string_hash_ops);
855 if (!search_domains)
856 return -ENOMEM;
857
858 route_domains = set_new(&string_hash_ops);
859 if (!route_domains)
84de38c5
TG
860 return -ENOMEM;
861
862 HASHMAP_FOREACH(link, m->links, i) {
863 if (link->flags & IFF_LOOPBACK)
864 continue;
865
866 if (link->operstate > operstate)
867 operstate = link->operstate;
868
869 if (!link->network)
870 continue;
871
872 /* First add the static configured entries */
873 r = set_put_strdupv(dns, link->network->dns);
874 if (r < 0)
875 return r;
876
877 r = set_put_strdupv(ntp, link->network->ntp);
878 if (r < 0)
879 return r;
880
3df9bec5
LP
881 r = set_put_strdupv(search_domains, link->network->search_domains);
882 if (r < 0)
883 return r;
884
885 r = set_put_strdupv(route_domains, link->network->route_domains);
84de38c5
TG
886 if (r < 0)
887 return r;
888
889 if (!link->dhcp_lease)
890 continue;
891
892 /* Secondly, add the entries acquired via DHCP */
893 if (link->network->dhcp_dns) {
894 const struct in_addr *addresses;
895
896 r = sd_dhcp_lease_get_dns(link->dhcp_lease, &addresses);
897 if (r > 0) {
898 r = set_put_in_addrv(dns, addresses, r);
899 if (r < 0)
900 return r;
901 } else if (r < 0 && r != -ENODATA)
902 return r;
903 }
904
905 if (link->network->dhcp_ntp) {
906 const struct in_addr *addresses;
907
908 r = sd_dhcp_lease_get_ntp(link->dhcp_lease, &addresses);
909 if (r > 0) {
910 r = set_put_in_addrv(ntp, addresses, r);
911 if (r < 0)
912 return r;
913 } else if (r < 0 && r != -ENODATA)
914 return r;
915 }
916
917 if (link->network->dhcp_domains) {
918 const char *domainname;
919
920 r = sd_dhcp_lease_get_domainname(link->dhcp_lease, &domainname);
921 if (r >= 0) {
3df9bec5 922 r = set_put_strdup(search_domains, domainname);
84de38c5
TG
923 if (r < 0)
924 return r;
925 } else if (r != -ENODATA)
926 return r;
927 }
928 }
929
930 operstate_str = link_operstate_to_string(operstate);
931 assert(operstate_str);
932
933 r = fopen_temporary(m->state_file, &f, &temp_path);
934 if (r < 0)
935 return r;
936
937 fchmod(fileno(f), 0644);
938
939 fprintf(f,
940 "# This is private data. Do not parse.\n"
941 "OPER_STATE=%s\n", operstate_str);
942
943 print_string_set(f, "DNS=", dns);
944 print_string_set(f, "NTP=", ntp);
3df9bec5
LP
945 print_string_set(f, "DOMAINS=", search_domains);
946 print_string_set(f, "ROUTE_DOMAINS=", route_domains);
84de38c5
TG
947
948 r = fflush_and_check(f);
949 if (r < 0)
950 goto fail;
951
952 if (rename(temp_path, m->state_file) < 0) {
953 r = -errno;
954 goto fail;
955 }
956
957 if (m->operational_state != operstate) {
958 m->operational_state = operstate;
959 r = manager_send_changed(m, "OperationalState", NULL);
960 if (r < 0)
961 log_error_errno(r, "Could not emit changed OperationalState: %m");
962 }
963
964 m->dirty = false;
965
966 return 0;
967
968fail:
969 (void) unlink(m->state_file);
970 (void) unlink(temp_path);
971
972 return log_error_errno(r, "Failed to save network state to %s: %m", m->state_file);
973}
974
975static int manager_dirty_handler(sd_event_source *s, void *userdata) {
976 Manager *m = userdata;
977 Link *link;
978 Iterator i;
979 int r;
980
981 assert(m);
982
983 if (m->dirty)
984 manager_save(m);
985
986 SET_FOREACH(link, m->dirty_links, i) {
987 r = link_save(link);
988 if (r >= 0)
989 link_clean(link);
990 }
991
992 return 1;
993}
994
5fae368b
TG
995int manager_new(Manager **ret) {
996 _cleanup_manager_free_ Manager *m = NULL;
45af44d4 997 int r;
f579559b 998
5fae368b
TG
999 m = new0(Manager, 1);
1000 if (!m)
1001 return -ENOMEM;
45af44d4 1002
5fae368b
TG
1003 m->state_file = strdup("/run/systemd/netif/state");
1004 if (!m->state_file)
1005 return -ENOMEM;
1006
1007 r = sd_event_default(&m->event);
45af44d4
TG
1008 if (r < 0)
1009 return r;
1010
5fae368b
TG
1011 sd_event_set_watchdog(m->event, true);
1012
1013 sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
1014 sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
1015
84de38c5
TG
1016 r = sd_event_add_post(m->event, NULL, manager_dirty_handler, m);
1017 if (r < 0)
1018 return r;
1019
5fae368b 1020 r = manager_connect_rtnl(m);
45af44d4
TG
1021 if (r < 0)
1022 return r;
1023
5fae368b
TG
1024 r = manager_connect_udev(m);
1025 if (r < 0)
1026 return r;
45af44d4 1027
5fae368b
TG
1028 m->netdevs = hashmap_new(&string_hash_ops);
1029 if (!m->netdevs)
1030 return -ENOMEM;
f579559b 1031
5fae368b 1032 LIST_HEAD_INIT(m->networks);
f579559b 1033
5fae368b
TG
1034 r = setup_default_address_pool(m);
1035 if (r < 0)
1036 return r;
f579559b 1037
5fae368b
TG
1038 *ret = m;
1039 m = NULL;
f579559b 1040
f579559b
TG
1041 return 0;
1042}
1043
5fae368b
TG
1044void manager_free(Manager *m) {
1045 Network *network;
1046 NetDev *netdev;
1047 Link *link;
1048 AddressPool *pool;
f579559b 1049
5fae368b
TG
1050 if (!m)
1051 return;
505f8da7 1052
5fae368b 1053 free(m->state_file);
505f8da7 1054
5fae368b
TG
1055 while ((link = hashmap_first(m->links)))
1056 link_unref(link);
1057 hashmap_free(m->links);
f579559b 1058
5fae368b
TG
1059 while ((network = m->networks))
1060 network_free(network);
1061
dbffab87
TG
1062 hashmap_free(m->networks_by_name);
1063
5fae368b
TG
1064 while ((netdev = hashmap_first(m->netdevs)))
1065 netdev_unref(netdev);
1066 hashmap_free(m->netdevs);
1067
1068 while ((pool = m->address_pools))
1069 address_pool_free(pool);
1070
1c4baffc 1071 sd_netlink_unref(m->rtnl);
2f5b4a77 1072 sd_event_unref(m->event);
5fae368b 1073
7d20d375
TG
1074 sd_event_source_unref(m->udev_event_source);
1075 udev_monitor_unref(m->udev_monitor);
1076 udev_unref(m->udev);
1077
1078 sd_bus_unref(m->bus);
1079 sd_bus_slot_unref(m->prepare_for_sleep_slot);
1080 sd_event_source_unref(m->bus_retry_event_source);
1081
5fae368b
TG
1082 free(m);
1083}
1084
a97dcc12
TG
1085static bool manager_check_idle(void *userdata) {
1086 Manager *m = userdata;
1087 Link *link;
1088 Iterator i;
1089
1090 assert(m);
1091
1092 HASHMAP_FOREACH(link, m->links, i) {
1093 /* we are not woken on udev activity, so let's just wait for the
1094 * pending udev event */
1095 if (link->state == LINK_STATE_PENDING)
1096 return false;
1097
1098 if (!link->network)
1099 continue;
1100
1101 /* we are not woken on netork activity, so let's stay around */
1102 if (link_lldp_enabled(link) ||
1103 link_ipv4ll_enabled(link) ||
1104 link_dhcp4_server_enabled(link) ||
1105 link_dhcp4_enabled(link) ||
f5a8c43f
TG
1106 link_dhcp6_enabled(link) ||
1107 link_ipv6_accept_ra_enabled(link))
a97dcc12
TG
1108 return false;
1109 }
1110
1111 return true;
1112}
1113
1114int manager_run(Manager *m) {
84de38c5
TG
1115 Link *link;
1116 Iterator i;
1117
a97dcc12
TG
1118 assert(m);
1119
84de38c5
TG
1120 /* The dirty handler will deal with future serialization, but the first one
1121 must be done explicitly. */
1122
1123 manager_save(m);
1124
1125 HASHMAP_FOREACH(link, m->links, i)
1126 link_save(link);
1127
f806f64c
TG
1128 if (m->bus)
1129 return bus_event_loop_with_idle(
1130 m->event,
1131 m->bus,
1132 "org.freedesktop.network1",
1133 DEFAULT_EXIT_USEC,
1134 manager_check_idle,
1135 m);
1136 else
1137 /* failed to connect to the bus, so we lose exit-on-idle logic,
1138 this should not happen except if dbus is not around at all */
1139 return sd_event_loop(m->event);
a97dcc12
TG
1140}
1141
5fae368b
TG
1142int manager_load_config(Manager *m) {
1143 int r;
1144
1145 /* update timestamp */
1146 paths_check_timestamp(network_dirs, &m->network_dirs_ts_usec, true);
1147
1148 r = netdev_load(m);
f579559b
TG
1149 if (r < 0)
1150 return r;
1151
5fae368b 1152 r = network_load(m);
9021bb9f
TG
1153 if (r < 0)
1154 return r;
1155
f579559b
TG
1156 return 0;
1157}
f882c247 1158
5fae368b
TG
1159bool manager_should_reload(Manager *m) {
1160 return paths_check_timestamp(network_dirs, &m->network_dirs_ts_usec, false);
1161}
1162
1163int manager_rtnl_enumerate_links(Manager *m) {
4afd3348 1164 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL, *reply = NULL;
1c4baffc 1165 sd_netlink_message *link;
f882c247
TG
1166 int r;
1167
5da8149f 1168 assert(m);
5fae368b 1169 assert(m->rtnl);
5da8149f 1170
5fae368b 1171 r = sd_rtnl_message_new_link(m->rtnl, &req, RTM_GETLINK, 0);
f882c247
TG
1172 if (r < 0)
1173 return r;
1174
1c4baffc 1175 r = sd_netlink_message_request_dump(req, true);
dd3efc09
TG
1176 if (r < 0)
1177 return r;
1178
1c4baffc 1179 r = sd_netlink_call(m->rtnl, req, 0, &reply);
f2236469
TG
1180 if (r < 0)
1181 return r;
1182
1c4baffc 1183 for (link = reply; link; link = sd_netlink_message_next(link)) {
5fae368b 1184 int k;
2e9f08ea 1185
6a24f148
TG
1186 m->enumerating = true;
1187
5fae368b
TG
1188 k = manager_rtnl_process_link(m->rtnl, link, m);
1189 if (k < 0)
1190 r = k;
6a24f148
TG
1191
1192 m->enumerating = false;
5fae368b 1193 }
2e9f08ea 1194
5fae368b 1195 return r;
f882c247 1196}
3bef724f 1197
5fae368b 1198int manager_rtnl_enumerate_addresses(Manager *m) {
4afd3348 1199 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL, *reply = NULL;
1c4baffc 1200 sd_netlink_message *addr;
1346b1f0
TG
1201 int r;
1202
5fae368b
TG
1203 assert(m);
1204 assert(m->rtnl);
bcbca829 1205
5fae368b
TG
1206 r = sd_rtnl_message_new_addr(m->rtnl, &req, RTM_GETADDR, 0, 0);
1207 if (r < 0)
1208 return r;
bcbca829 1209
1c4baffc 1210 r = sd_netlink_message_request_dump(req, true);
1346b1f0
TG
1211 if (r < 0)
1212 return r;
1213
1c4baffc 1214 r = sd_netlink_call(m->rtnl, req, 0, &reply);
5fae368b
TG
1215 if (r < 0)
1216 return r;
1217
1c4baffc 1218 for (addr = reply; addr; addr = sd_netlink_message_next(addr)) {
5fae368b
TG
1219 int k;
1220
6a24f148
TG
1221 m->enumerating = true;
1222
200a0868 1223 k = manager_rtnl_process_address(m->rtnl, addr, m);
5fae368b
TG
1224 if (k < 0)
1225 r = k;
6a24f148
TG
1226
1227 m->enumerating = false;
5fae368b
TG
1228 }
1229
1230 return r;
1346b1f0
TG
1231}
1232
1c8e710c 1233int manager_rtnl_enumerate_routes(Manager *m) {
4afd3348 1234 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL, *reply = NULL;
1c8e710c
TG
1235 sd_netlink_message *route;
1236 int r;
1237
1238 assert(m);
1239 assert(m->rtnl);
1240
1241 r = sd_rtnl_message_new_route(m->rtnl, &req, RTM_GETROUTE, 0, 0);
1242 if (r < 0)
1243 return r;
1244
1245 r = sd_netlink_message_request_dump(req, true);
1246 if (r < 0)
1247 return r;
1248
1249 r = sd_netlink_call(m->rtnl, req, 0, &reply);
1250 if (r < 0)
1251 return r;
1252
1253 for (route = reply; route; route = sd_netlink_message_next(route)) {
1254 int k;
1255
1256 m->enumerating = true;
1257
1258 k = manager_rtnl_process_route(m->rtnl, route, m);
1259 if (k < 0)
1260 r = k;
1261
1262 m->enumerating = false;
1263 }
1264
1265 return r;
1266}
1267
0dd25fb9 1268int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found) {
11bf3cce
LP
1269 AddressPool *p;
1270 int r;
1271
1272 assert(m);
1273 assert(prefixlen > 0);
1274 assert(found);
1275
1276 LIST_FOREACH(address_pools, p, m->address_pools) {
1277 if (p->family != family)
1278 continue;
1279
1280 r = address_pool_acquire(p, prefixlen, found);
1281 if (r != 0)
1282 return r;
1283 }
1284
1285 return 0;
1286}
4f5f911e
LP
1287
1288Link* manager_find_uplink(Manager *m, Link *exclude) {
1289 _cleanup_free_ struct local_address *gateways = NULL;
1290 int n, i;
1291
1292 assert(m);
1293
1294 /* Looks for a suitable "uplink", via black magic: an
1295 * interface that is up and where the default route with the
1296 * highest priority points to. */
1297
1298 n = local_gateways(m->rtnl, 0, AF_UNSPEC, &gateways);
1299 if (n < 0) {
1300 log_warning_errno(n, "Failed to determine list of default gateways: %m");
1301 return NULL;
1302 }
1303
1304 for (i = 0; i < n; i++) {
1305 Link *link;
1306
1307 link = hashmap_get(m->links, INT_TO_PTR(gateways[i].ifindex));
1308 if (!link) {
c2c940bd 1309 log_debug("Weird, found a gateway for a link we don't know. Ignoring.");
4f5f911e
LP
1310 continue;
1311 }
1312
1313 if (link == exclude)
1314 continue;
1315
1316 if (link->operstate < LINK_OPERSTATE_ROUTABLE)
1317 continue;
1318
1319 return link;
1320 }
1321
1322 return NULL;
1323}
84de38c5
TG
1324
1325void manager_dirty(Manager *manager) {
1326 assert(manager);
1327
1328 /* the serialized state in /run is no longer up-to-date */
1329 manager->dirty = true;
1330}