]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/network/networkd-manager.c
tests: reflect that we can now handle devices with very long sysfs paths
[thirdparty/systemd.git] / src / network / networkd-manager.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2
3 #include <netinet/in.h>
4 #include <sys/socket.h>
5 #include <unistd.h>
6 #include <linux/if.h>
7 #include <linux/fib_rules.h>
8 #include <linux/nexthop.h>
9 #include <linux/nl80211.h>
10
11 #include "sd-daemon.h"
12 #include "sd-netlink.h"
13
14 #include "alloc-util.h"
15 #include "bus-error.h"
16 #include "bus-log-control-api.h"
17 #include "bus-polkit.h"
18 #include "bus-util.h"
19 #include "conf-parser.h"
20 #include "def.h"
21 #include "dns-domain.h"
22 #include "fd-util.h"
23 #include "fileio.h"
24 #include "firewall-util.h"
25 #include "fs-util.h"
26 #include "local-addresses.h"
27 #include "netlink-util.h"
28 #include "network-internal.h"
29 #include "networkd-address-pool.h"
30 #include "networkd-address.h"
31 #include "networkd-dhcp-server-bus.h"
32 #include "networkd-dhcp6.h"
33 #include "networkd-link-bus.h"
34 #include "networkd-manager-bus.h"
35 #include "networkd-manager.h"
36 #include "networkd-neighbor.h"
37 #include "networkd-network-bus.h"
38 #include "networkd-nexthop.h"
39 #include "networkd-queue.h"
40 #include "networkd-route.h"
41 #include "networkd-routing-policy-rule.h"
42 #include "networkd-speed-meter.h"
43 #include "networkd-state-file.h"
44 #include "networkd-wifi.h"
45 #include "networkd-wiphy.h"
46 #include "ordered-set.h"
47 #include "path-lookup.h"
48 #include "path-util.h"
49 #include "qdisc.h"
50 #include "selinux-util.h"
51 #include "set.h"
52 #include "signal-util.h"
53 #include "stat-util.h"
54 #include "strv.h"
55 #include "sysctl-util.h"
56 #include "tclass.h"
57 #include "tmpfile-util.h"
58 #include "udev-util.h"
59
60 /* use 128 MB for receive socket kernel queue. */
61 #define RCVBUF_SIZE (128*1024*1024)
62
63 static int manager_reset_all(Manager *m) {
64 Link *link;
65 int r;
66
67 assert(m);
68
69 HASHMAP_FOREACH(link, m->links_by_index) {
70 r = link_reconfigure_after_sleep(link);
71 if (r < 0) {
72 log_link_warning_errno(link, r, "Failed to reconfigure interface: %m");
73 link_enter_failed(link);
74 }
75 }
76
77 return 0;
78 }
79
80 static int match_prepare_for_sleep(sd_bus_message *message, void *userdata, sd_bus_error *ret_error) {
81 Manager *m = userdata;
82 int b, r;
83
84 assert(message);
85 assert(m);
86
87 r = sd_bus_message_read(message, "b", &b);
88 if (r < 0) {
89 bus_log_parse_error(r);
90 return 0;
91 }
92
93 if (b)
94 return 0;
95
96 log_debug("Coming back from suspend, resetting all connections...");
97
98 (void) manager_reset_all(m);
99
100 return 0;
101 }
102
103 static int on_connected(sd_bus_message *message, void *userdata, sd_bus_error *ret_error) {
104 Manager *m = userdata;
105
106 assert(message);
107 assert(m);
108
109 /* Did we get a timezone or transient hostname from DHCP while D-Bus wasn't up yet? */
110 if (m->dynamic_hostname)
111 (void) manager_set_hostname(m, m->dynamic_hostname);
112 if (m->dynamic_timezone)
113 (void) manager_set_timezone(m, m->dynamic_timezone);
114 if (m->product_uuid_requested)
115 (void) manager_request_product_uuid(m);
116
117 return 0;
118 }
119
120 static int manager_connect_bus(Manager *m) {
121 int r;
122
123 assert(m);
124 assert(!m->bus);
125
126 r = bus_open_system_watch_bind_with_description(&m->bus, "bus-api-network");
127 if (r < 0)
128 return log_error_errno(r, "Failed to connect to bus: %m");
129
130 r = bus_add_implementation(m->bus, &manager_object, m);
131 if (r < 0)
132 return r;
133
134 r = bus_log_control_api_register(m->bus);
135 if (r < 0)
136 return r;
137
138 r = sd_bus_request_name_async(m->bus, NULL, "org.freedesktop.network1", 0, NULL, NULL);
139 if (r < 0)
140 return log_error_errno(r, "Failed to request name: %m");
141
142 r = sd_bus_attach_event(m->bus, m->event, 0);
143 if (r < 0)
144 return log_error_errno(r, "Failed to attach bus to event loop: %m");
145
146 r = sd_bus_match_signal_async(
147 m->bus,
148 NULL,
149 "org.freedesktop.DBus.Local",
150 NULL,
151 "org.freedesktop.DBus.Local",
152 "Connected",
153 on_connected, NULL, m);
154 if (r < 0)
155 return log_error_errno(r, "Failed to request match on Connected signal: %m");
156
157 r = sd_bus_match_signal_async(
158 m->bus,
159 NULL,
160 "org.freedesktop.login1",
161 "/org/freedesktop/login1",
162 "org.freedesktop.login1.Manager",
163 "PrepareForSleep",
164 match_prepare_for_sleep, NULL, m);
165 if (r < 0)
166 log_warning_errno(r, "Failed to request match for PrepareForSleep, ignoring: %m");
167
168 return 0;
169 }
170
171 static int manager_connect_udev(Manager *m) {
172 int r;
173
174 /* udev does not initialize devices inside containers, so we rely on them being already
175 * initialized before entering the container. */
176 if (!udev_available())
177 return 0;
178
179 r = sd_device_monitor_new(&m->device_monitor);
180 if (r < 0)
181 return log_error_errno(r, "Failed to initialize device monitor: %m");
182
183 r = sd_device_monitor_set_receive_buffer_size(m->device_monitor, RCVBUF_SIZE);
184 if (r < 0)
185 log_warning_errno(r, "Failed to increase buffer size for device monitor, ignoring: %m");
186
187 r = sd_device_monitor_filter_add_match_subsystem_devtype(m->device_monitor, "net", NULL);
188 if (r < 0)
189 return log_error_errno(r, "Could not add device monitor filter: %m");
190
191 r = sd_device_monitor_attach_event(m->device_monitor, m->event);
192 if (r < 0)
193 return log_error_errno(r, "Failed to attach event to device monitor: %m");
194
195 r = sd_device_monitor_start(m->device_monitor, manager_udev_process_link, m);
196 if (r < 0)
197 return log_error_errno(r, "Failed to start device monitor: %m");
198
199 return 0;
200 }
201
202 static int systemd_netlink_fd(void) {
203 int n, fd, rtnl_fd = -EINVAL;
204
205 n = sd_listen_fds(true);
206 if (n <= 0)
207 return -EINVAL;
208
209 for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd ++)
210 if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1) > 0) {
211 if (rtnl_fd >= 0)
212 return -EINVAL;
213
214 rtnl_fd = fd;
215 }
216
217 return rtnl_fd;
218 }
219
220 static int manager_connect_genl(Manager *m) {
221 int r;
222
223 assert(m);
224
225 r = sd_genl_socket_open(&m->genl);
226 if (r < 0)
227 return r;
228
229 r = sd_netlink_inc_rcvbuf(m->genl, RCVBUF_SIZE);
230 if (r < 0)
231 log_warning_errno(r, "Failed to increase receive buffer size for general netlink socket, ignoring: %m");
232
233 r = sd_netlink_attach_event(m->genl, m->event, 0);
234 if (r < 0)
235 return r;
236
237 r = genl_add_match(m->genl, NULL, NL80211_GENL_NAME, NL80211_MULTICAST_GROUP_CONFIG, 0,
238 &manager_genl_process_nl80211_config, NULL, m, "network-genl_process_nl80211_config");
239 if (r < 0 && r != -EOPNOTSUPP)
240 return r;
241
242 r = genl_add_match(m->genl, NULL, NL80211_GENL_NAME, NL80211_MULTICAST_GROUP_MLME, 0,
243 &manager_genl_process_nl80211_mlme, NULL, m, "network-genl_process_nl80211_mlme");
244 if (r < 0 && r != -EOPNOTSUPP)
245 return r;
246
247 return 0;
248 }
249
250 static int manager_setup_rtnl_filter(Manager *manager) {
251 struct sock_filter filter[] = {
252 /* Check the packet length. */
253 BPF_STMT(BPF_LD + BPF_W + BPF_LEN, 0), /* A <- packet length */
254 BPF_JUMP(BPF_JMP + BPF_JGE + BPF_K, sizeof(struct nlmsghdr), 1, 0), /* A (packet length) >= sizeof(struct nlmsghdr) ? */
255 BPF_STMT(BPF_RET + BPF_K, 0), /* reject */
256 /* Always accept multipart message. */
257 BPF_STMT(BPF_LD + BPF_H + BPF_ABS, offsetof(struct nlmsghdr, nlmsg_flags)), /* A <- message flags */
258 BPF_JUMP(BPF_JMP + BPF_JSET + BPF_K, htobe16(NLM_F_MULTI), 0, 1), /* message flags has NLM_F_MULTI ? */
259 BPF_STMT(BPF_RET + BPF_K, UINT32_MAX), /* accept */
260 /* Accept all message types except for RTM_NEWNEIGH or RTM_DELNEIGH. */
261 BPF_STMT(BPF_LD + BPF_H + BPF_ABS, offsetof(struct nlmsghdr, nlmsg_type)), /* A <- message type */
262 BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, htobe16(RTM_NEWNEIGH), 2, 0), /* message type == RTM_NEWNEIGH ? */
263 BPF_JUMP(BPF_JMP + BPF_JEQ + BPF_K, htobe16(RTM_DELNEIGH), 1, 0), /* message type == RTM_DELNEIGH ? */
264 BPF_STMT(BPF_RET + BPF_K, UINT32_MAX), /* accept */
265 /* Check the packet length. */
266 BPF_STMT(BPF_LD + BPF_W + BPF_LEN, 0), /* A <- packet length */
267 BPF_JUMP(BPF_JMP + BPF_JGE + BPF_K, sizeof(struct nlmsghdr) + sizeof(struct ndmsg), 1, 0),
268 /* packet length >= sizeof(struct nlmsghdr) + sizeof(struct ndmsg) ? */
269 BPF_STMT(BPF_RET + BPF_K, 0), /* reject */
270 /* Reject the message when the neighbor state does not have NUD_PERMANENT flag. */
271 BPF_STMT(BPF_LD + BPF_H + BPF_ABS, sizeof(struct nlmsghdr) + offsetof(struct ndmsg, ndm_state)),
272 /* A <- neighbor state */
273 BPF_JUMP(BPF_JMP + BPF_JSET + BPF_K, htobe16(NUD_PERMANENT), 1, 0), /* neighbor state has NUD_PERMANENT ? */
274 BPF_STMT(BPF_RET + BPF_K, 0), /* reject */
275 BPF_STMT(BPF_RET + BPF_K, UINT32_MAX), /* accept */
276 };
277
278 assert(manager);
279 assert(manager->rtnl);
280
281 return sd_netlink_attach_filter(manager->rtnl, ELEMENTSOF(filter), filter);
282 }
283
284 static int manager_connect_rtnl(Manager *m) {
285 int fd, r;
286
287 assert(m);
288
289 fd = systemd_netlink_fd();
290 if (fd < 0)
291 r = sd_netlink_open(&m->rtnl);
292 else
293 r = sd_netlink_open_fd(&m->rtnl, fd);
294 if (r < 0)
295 return r;
296
297 /* Bump receiver buffer, but only if we are not called via socket activation, as in that
298 * case systemd sets the receive buffer size for us, and the value in the .socket unit
299 * should take full effect. */
300 if (fd < 0) {
301 r = sd_netlink_inc_rcvbuf(m->rtnl, RCVBUF_SIZE);
302 if (r < 0)
303 log_warning_errno(r, "Failed to increase receive buffer size for rtnl socket, ignoring: %m");
304 }
305
306 r = sd_netlink_attach_event(m->rtnl, m->event, 0);
307 if (r < 0)
308 return r;
309
310 r = netlink_add_match(m->rtnl, NULL, RTM_NEWLINK, &manager_rtnl_process_link, NULL, m, "network-rtnl_process_link");
311 if (r < 0)
312 return r;
313
314 r = netlink_add_match(m->rtnl, NULL, RTM_DELLINK, &manager_rtnl_process_link, NULL, m, "network-rtnl_process_link");
315 if (r < 0)
316 return r;
317
318 r = netlink_add_match(m->rtnl, NULL, RTM_NEWQDISC, &manager_rtnl_process_qdisc, NULL, m, "network-rtnl_process_qdisc");
319 if (r < 0)
320 return r;
321
322 r = netlink_add_match(m->rtnl, NULL, RTM_DELQDISC, &manager_rtnl_process_qdisc, NULL, m, "network-rtnl_process_qdisc");
323 if (r < 0)
324 return r;
325
326 r = netlink_add_match(m->rtnl, NULL, RTM_NEWTCLASS, &manager_rtnl_process_tclass, NULL, m, "network-rtnl_process_tclass");
327 if (r < 0)
328 return r;
329
330 r = netlink_add_match(m->rtnl, NULL, RTM_DELTCLASS, &manager_rtnl_process_tclass, NULL, m, "network-rtnl_process_tclass");
331 if (r < 0)
332 return r;
333
334 r = netlink_add_match(m->rtnl, NULL, RTM_NEWADDR, &manager_rtnl_process_address, NULL, m, "network-rtnl_process_address");
335 if (r < 0)
336 return r;
337
338 r = netlink_add_match(m->rtnl, NULL, RTM_DELADDR, &manager_rtnl_process_address, NULL, m, "network-rtnl_process_address");
339 if (r < 0)
340 return r;
341
342 r = netlink_add_match(m->rtnl, NULL, RTM_NEWNEIGH, &manager_rtnl_process_neighbor, NULL, m, "network-rtnl_process_neighbor");
343 if (r < 0)
344 return r;
345
346 r = netlink_add_match(m->rtnl, NULL, RTM_DELNEIGH, &manager_rtnl_process_neighbor, NULL, m, "network-rtnl_process_neighbor");
347 if (r < 0)
348 return r;
349
350 r = netlink_add_match(m->rtnl, NULL, RTM_NEWROUTE, &manager_rtnl_process_route, NULL, m, "network-rtnl_process_route");
351 if (r < 0)
352 return r;
353
354 r = netlink_add_match(m->rtnl, NULL, RTM_DELROUTE, &manager_rtnl_process_route, NULL, m, "network-rtnl_process_route");
355 if (r < 0)
356 return r;
357
358 r = netlink_add_match(m->rtnl, NULL, RTM_NEWRULE, &manager_rtnl_process_rule, NULL, m, "network-rtnl_process_rule");
359 if (r < 0)
360 return r;
361
362 r = netlink_add_match(m->rtnl, NULL, RTM_DELRULE, &manager_rtnl_process_rule, NULL, m, "network-rtnl_process_rule");
363 if (r < 0)
364 return r;
365
366 r = netlink_add_match(m->rtnl, NULL, RTM_NEWNEXTHOP, &manager_rtnl_process_nexthop, NULL, m, "network-rtnl_process_nexthop");
367 if (r < 0)
368 return r;
369
370 r = netlink_add_match(m->rtnl, NULL, RTM_DELNEXTHOP, &manager_rtnl_process_nexthop, NULL, m, "network-rtnl_process_nexthop");
371 if (r < 0)
372 return r;
373
374 return manager_setup_rtnl_filter(m);
375 }
376
377 static int manager_dirty_handler(sd_event_source *s, void *userdata) {
378 Manager *m = userdata;
379 Link *link;
380 int r;
381
382 assert(m);
383
384 if (m->dirty) {
385 r = manager_save(m);
386 if (r < 0)
387 log_warning_errno(r, "Failed to update state file %s, ignoring: %m", m->state_file);
388 }
389
390 SET_FOREACH(link, m->dirty_links) {
391 r = link_save_and_clean(link);
392 if (r < 0)
393 log_link_warning_errno(link, r, "Failed to update link state file %s, ignoring: %m", link->state_file);
394 }
395
396 return 1;
397 }
398
399 static int signal_terminate_callback(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
400 Manager *m = userdata;
401
402 assert(m);
403 m->restarting = false;
404
405 log_debug("Terminate operation initiated.");
406
407 return sd_event_exit(sd_event_source_get_event(s), 0);
408 }
409
410 static int signal_restart_callback(sd_event_source *s, const struct signalfd_siginfo *si, void *userdata) {
411 Manager *m = userdata;
412
413 assert(m);
414 m->restarting = true;
415
416 log_debug("Restart operation initiated.");
417
418 return sd_event_exit(sd_event_source_get_event(s), 0);
419 }
420
421 static int manager_set_keep_configuration(Manager *m) {
422 int r;
423
424 assert(m);
425
426 if (in_initrd()) {
427 log_debug("Running in initrd, keep DHCPv4 addresses on stopping networkd by default.");
428 m->keep_configuration = KEEP_CONFIGURATION_DHCP_ON_STOP;
429 return 0;
430 }
431
432 r = path_is_network_fs("/");
433 if (r < 0)
434 return log_error_errno(r, "Failed to detect if root is network filesystem: %m");
435 if (r == 0) {
436 m->keep_configuration = _KEEP_CONFIGURATION_INVALID;
437 return 0;
438 }
439
440 log_debug("Running on network filesystem, enabling KeepConfiguration= by default.");
441 m->keep_configuration = KEEP_CONFIGURATION_YES;
442 return 0;
443 }
444
445 int manager_setup(Manager *m) {
446 int r;
447
448 assert(m);
449
450 r = sd_event_default(&m->event);
451 if (r < 0)
452 return r;
453
454 assert_se(sigprocmask_many(SIG_SETMASK, NULL, SIGINT, SIGTERM, SIGUSR2, -1) >= 0);
455
456 (void) sd_event_set_watchdog(m->event, true);
457 (void) sd_event_add_signal(m->event, NULL, SIGTERM, signal_terminate_callback, m);
458 (void) sd_event_add_signal(m->event, NULL, SIGINT, signal_terminate_callback, m);
459 (void) sd_event_add_signal(m->event, NULL, SIGUSR2, signal_restart_callback, m);
460
461 r = sd_event_add_post(m->event, NULL, manager_dirty_handler, m);
462 if (r < 0)
463 return r;
464
465 r = sd_event_add_post(m->event, NULL, manager_process_requests, m);
466 if (r < 0)
467 return r;
468
469 r = manager_connect_rtnl(m);
470 if (r < 0)
471 return r;
472
473 r = manager_connect_genl(m);
474 if (r < 0)
475 return r;
476
477 if (m->test_mode)
478 return 0;
479
480 r = manager_connect_bus(m);
481 if (r < 0)
482 return r;
483
484 r = manager_connect_udev(m);
485 if (r < 0)
486 return r;
487
488 r = sd_resolve_default(&m->resolve);
489 if (r < 0)
490 return r;
491
492 r = sd_resolve_attach_event(m->resolve, m->event, 0);
493 if (r < 0)
494 return r;
495
496 r = address_pool_setup_default(m);
497 if (r < 0)
498 return r;
499
500 r = manager_set_keep_configuration(m);
501 if (r < 0)
502 return r;
503
504 m->state_file = strdup("/run/systemd/netif/state");
505 if (!m->state_file)
506 return -ENOMEM;
507
508 return 0;
509 }
510
511 int manager_new(Manager **ret, bool test_mode) {
512 _cleanup_(manager_freep) Manager *m = NULL;
513
514 m = new(Manager, 1);
515 if (!m)
516 return -ENOMEM;
517
518 *m = (Manager) {
519 .keep_configuration = _KEEP_CONFIGURATION_INVALID,
520 .test_mode = test_mode,
521 .speed_meter_interval_usec = SPEED_METER_DEFAULT_TIME_INTERVAL,
522 .online_state = _LINK_ONLINE_STATE_INVALID,
523 .manage_foreign_routes = true,
524 .manage_foreign_rules = true,
525 .ethtool_fd = -1,
526 .dhcp_duid.type = DUID_TYPE_EN,
527 .dhcp6_duid.type = DUID_TYPE_EN,
528 .duid_product_uuid.type = DUID_TYPE_UUID,
529 };
530
531 *ret = TAKE_PTR(m);
532 return 0;
533 }
534
535 Manager* manager_free(Manager *m) {
536 Link *link;
537
538 if (!m)
539 return NULL;
540
541 free(m->state_file);
542
543 HASHMAP_FOREACH(link, m->links_by_index)
544 (void) link_stop_engines(link, true);
545
546 m->request_queue = ordered_set_free(m->request_queue);
547
548 m->dirty_links = set_free_with_destructor(m->dirty_links, link_unref);
549 m->links_by_name = hashmap_free(m->links_by_name);
550 m->links_by_hw_addr = hashmap_free(m->links_by_hw_addr);
551 m->links_by_dhcp_pd_subnet_prefix = hashmap_free(m->links_by_dhcp_pd_subnet_prefix);
552 m->links_by_index = hashmap_free_with_destructor(m->links_by_index, link_unref);
553
554 m->dhcp_pd_subnet_ids = set_free(m->dhcp_pd_subnet_ids);
555 m->networks = ordered_hashmap_free_with_destructor(m->networks, network_unref);
556
557 m->netdevs = hashmap_free_with_destructor(m->netdevs, netdev_unref);
558
559 m->wiphy_by_name = hashmap_free(m->wiphy_by_name);
560 m->wiphy_by_index = hashmap_free_with_destructor(m->wiphy_by_index, wiphy_free);
561
562 ordered_set_free_free(m->address_pools);
563
564 hashmap_free(m->route_table_names_by_number);
565 hashmap_free(m->route_table_numbers_by_name);
566
567 set_free(m->rules);
568
569 sd_netlink_unref(m->rtnl);
570 sd_netlink_unref(m->genl);
571 sd_resolve_unref(m->resolve);
572
573 /* reject (e.g. unreachable) type routes are managed by Manager, but may be referenced by a
574 * link. E.g., DHCP6 with prefix delegation creates unreachable routes, and they are referenced
575 * by the upstream link. And the links may be referenced by netlink slots. Hence, two
576 * set_free() must be called after the above sd_netlink_unref(). */
577 m->routes = set_free(m->routes);
578 m->routes_foreign = set_free(m->routes_foreign);
579
580 m->nexthops = set_free(m->nexthops);
581 m->nexthops_by_id = hashmap_free(m->nexthops_by_id);
582
583 sd_event_source_unref(m->speed_meter_event_source);
584 sd_event_unref(m->event);
585
586 sd_device_monitor_unref(m->device_monitor);
587
588 bus_verify_polkit_async_registry_free(m->polkit_registry);
589 sd_bus_flush_close_unref(m->bus);
590
591 free(m->dynamic_timezone);
592 free(m->dynamic_hostname);
593
594 safe_close(m->ethtool_fd);
595
596 m->fw_ctx = fw_ctx_free(m->fw_ctx);
597
598 return mfree(m);
599 }
600
601 int manager_start(Manager *m) {
602 Link *link;
603 int r;
604
605 assert(m);
606
607 r = manager_start_speed_meter(m);
608 if (r < 0)
609 return log_error_errno(r, "Failed to initialize speed meter: %m");
610
611 /* The dirty handler will deal with future serialization, but the first one
612 must be done explicitly. */
613
614 r = manager_save(m);
615 if (r < 0)
616 log_warning_errno(r, "Failed to update state file %s, ignoring: %m", m->state_file);
617
618 HASHMAP_FOREACH(link, m->links_by_index) {
619 r = link_save(link);
620 if (r < 0)
621 log_link_warning_errno(link, r, "Failed to update link state file %s, ignoring: %m", link->state_file);
622 }
623
624 return 0;
625 }
626
627 int manager_load_config(Manager *m) {
628 int r;
629
630 /* update timestamp */
631 paths_check_timestamp(NETWORK_DIRS, &m->network_dirs_ts_usec, true);
632
633 r = netdev_load(m, false);
634 if (r < 0)
635 return r;
636
637 r = network_load(m, &m->networks);
638 if (r < 0)
639 return r;
640
641 return manager_build_dhcp_pd_subnet_ids(m);
642 }
643
644 bool manager_should_reload(Manager *m) {
645 return paths_check_timestamp(NETWORK_DIRS, &m->network_dirs_ts_usec, false);
646 }
647
648 static int manager_enumerate_internal(
649 Manager *m,
650 sd_netlink *nl,
651 sd_netlink_message *req,
652 int (*process)(sd_netlink *, sd_netlink_message *, Manager *)) {
653
654 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *reply = NULL;
655 int k, r;
656
657 assert(m);
658 assert(nl);
659 assert(req);
660 assert(process);
661
662 r = sd_netlink_message_request_dump(req, true);
663 if (r < 0)
664 return r;
665
666 r = sd_netlink_call(nl, req, 0, &reply);
667 if (r < 0)
668 return r;
669
670 for (sd_netlink_message *reply_one = reply; reply_one; reply_one = sd_netlink_message_next(reply_one)) {
671 m->enumerating = true;
672
673 k = process(nl, reply_one, m);
674 if (k < 0 && r >= 0)
675 r = k;
676
677 m->enumerating = false;
678 }
679
680 return r;
681 }
682
683 static int manager_enumerate_links(Manager *m) {
684 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
685 int r;
686
687 assert(m);
688 assert(m->rtnl);
689
690 r = sd_rtnl_message_new_link(m->rtnl, &req, RTM_GETLINK, 0);
691 if (r < 0)
692 return r;
693
694 return manager_enumerate_internal(m, m->rtnl, req, manager_rtnl_process_link);
695 }
696
697 static int manager_enumerate_qdisc(Manager *m) {
698 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
699 int r;
700
701 assert(m);
702 assert(m->rtnl);
703
704 r = sd_rtnl_message_new_traffic_control(m->rtnl, &req, RTM_GETQDISC, 0, 0, 0);
705 if (r < 0)
706 return r;
707
708 return manager_enumerate_internal(m, m->rtnl, req, manager_rtnl_process_qdisc);
709 }
710
711 static int manager_enumerate_tclass(Manager *m) {
712 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
713 int r;
714
715 assert(m);
716 assert(m->rtnl);
717
718 r = sd_rtnl_message_new_traffic_control(m->rtnl, &req, RTM_GETTCLASS, 0, 0, 0);
719 if (r < 0)
720 return r;
721
722 return manager_enumerate_internal(m, m->rtnl, req, manager_rtnl_process_tclass);
723 }
724
725 static int manager_enumerate_addresses(Manager *m) {
726 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
727 int r;
728
729 assert(m);
730 assert(m->rtnl);
731
732 r = sd_rtnl_message_new_addr(m->rtnl, &req, RTM_GETADDR, 0, 0);
733 if (r < 0)
734 return r;
735
736 return manager_enumerate_internal(m, m->rtnl, req, manager_rtnl_process_address);
737 }
738
739 static int manager_enumerate_neighbors(Manager *m) {
740 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
741 int r;
742
743 assert(m);
744 assert(m->rtnl);
745
746 r = sd_rtnl_message_new_neigh(m->rtnl, &req, RTM_GETNEIGH, 0, AF_UNSPEC);
747 if (r < 0)
748 return r;
749
750 return manager_enumerate_internal(m, m->rtnl, req, manager_rtnl_process_neighbor);
751 }
752
753 static int manager_enumerate_routes(Manager *m) {
754 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
755 int r;
756
757 assert(m);
758 assert(m->rtnl);
759
760 if (!m->manage_foreign_routes)
761 return 0;
762
763 r = sd_rtnl_message_new_route(m->rtnl, &req, RTM_GETROUTE, 0, 0);
764 if (r < 0)
765 return r;
766
767 return manager_enumerate_internal(m, m->rtnl, req, manager_rtnl_process_route);
768 }
769
770 static int manager_enumerate_rules(Manager *m) {
771 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
772 int r;
773
774 assert(m);
775 assert(m->rtnl);
776
777 if (!m->manage_foreign_rules)
778 return 0;
779
780 r = sd_rtnl_message_new_routing_policy_rule(m->rtnl, &req, RTM_GETRULE, 0);
781 if (r < 0)
782 return r;
783
784 return manager_enumerate_internal(m, m->rtnl, req, manager_rtnl_process_rule);
785 }
786
787 static int manager_enumerate_nexthop(Manager *m) {
788 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
789 int r;
790
791 assert(m);
792 assert(m->rtnl);
793
794 r = sd_rtnl_message_new_nexthop(m->rtnl, &req, RTM_GETNEXTHOP, 0, 0);
795 if (r < 0)
796 return r;
797
798 return manager_enumerate_internal(m, m->rtnl, req, manager_rtnl_process_nexthop);
799 }
800
801 static int manager_enumerate_nl80211_wiphy(Manager *m) {
802 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
803 int r;
804
805 assert(m);
806 assert(m->genl);
807
808 r = sd_genl_message_new(m->genl, NL80211_GENL_NAME, NL80211_CMD_GET_WIPHY, &req);
809 if (r < 0)
810 return r;
811
812 return manager_enumerate_internal(m, m->genl, req, manager_genl_process_nl80211_wiphy);
813 }
814
815 static int manager_enumerate_nl80211_config(Manager *m) {
816 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
817 int r;
818
819 assert(m);
820 assert(m->genl);
821
822 r = sd_genl_message_new(m->genl, NL80211_GENL_NAME, NL80211_CMD_GET_INTERFACE, &req);
823 if (r < 0)
824 return r;
825
826 return manager_enumerate_internal(m, m->genl, req, manager_genl_process_nl80211_config);
827 }
828
829 static int manager_enumerate_nl80211_mlme(Manager *m) {
830 Link *link;
831 int r;
832
833 assert(m);
834 assert(m->genl);
835
836 HASHMAP_FOREACH(link, m->links_by_index) {
837 _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
838
839 if (link->wlan_iftype != NL80211_IFTYPE_STATION)
840 continue;
841
842 r = sd_genl_message_new(m->genl, NL80211_GENL_NAME, NL80211_CMD_GET_STATION, &req);
843 if (r < 0)
844 return r;
845
846 r = sd_netlink_message_append_u32(req, NL80211_ATTR_IFINDEX, link->ifindex);
847 if (r < 0)
848 return r;
849
850 r = manager_enumerate_internal(m, m->genl, req, manager_genl_process_nl80211_mlme);
851 if (r < 0)
852 return r;
853 }
854
855 return 0;
856 }
857
858 int manager_enumerate(Manager *m) {
859 int r;
860
861 r = manager_enumerate_links(m);
862 if (r < 0)
863 return log_error_errno(r, "Could not enumerate links: %m");
864
865 r = manager_enumerate_qdisc(m);
866 if (r < 0)
867 return log_error_errno(r, "Could not enumerate QDisc: %m");
868
869 r = manager_enumerate_tclass(m);
870 if (r < 0)
871 return log_error_errno(r, "Could not enumerate TClass: %m");
872
873 r = manager_enumerate_addresses(m);
874 if (r < 0)
875 return log_error_errno(r, "Could not enumerate addresses: %m");
876
877 r = manager_enumerate_neighbors(m);
878 if (r < 0)
879 return log_error_errno(r, "Could not enumerate neighbors: %m");
880
881 /* NextHop support is added in kernel v5.3 (65ee00a9409f751188a8cdc0988167858eb4a536),
882 * and older kernels return -EOPNOTSUPP, or -EINVAL if SELinux is enabled. */
883 r = manager_enumerate_nexthop(m);
884 if (r == -EOPNOTSUPP || (r == -EINVAL && mac_selinux_enforcing()))
885 log_debug_errno(r, "Could not enumerate nexthops, ignoring: %m");
886 else if (r < 0)
887 return log_error_errno(r, "Could not enumerate nexthops: %m");
888
889 r = manager_enumerate_routes(m);
890 if (r < 0)
891 return log_error_errno(r, "Could not enumerate routes: %m");
892
893 /* If kernel is built with CONFIG_FIB_RULES=n, it returns -EOPNOTSUPP. */
894 r = manager_enumerate_rules(m);
895 if (r == -EOPNOTSUPP)
896 log_debug_errno(r, "Could not enumerate routing policy rules, ignoring: %m");
897 else if (r < 0)
898 return log_error_errno(r, "Could not enumerate routing policy rules: %m");
899
900 r = manager_enumerate_nl80211_wiphy(m);
901 if (r == -EOPNOTSUPP)
902 log_debug_errno(r, "Could not enumerate wireless LAN phy, ignoring: %m");
903 else if (r < 0)
904 return log_error_errno(r, "Could not enumerate wireless LAN phy: %m");
905
906 r = manager_enumerate_nl80211_config(m);
907 if (r == -EOPNOTSUPP)
908 log_debug_errno(r, "Could not enumerate wireless LAN interfaces, ignoring: %m");
909 else if (r < 0)
910 return log_error_errno(r, "Could not enumerate wireless LAN interfaces: %m");
911
912 r = manager_enumerate_nl80211_mlme(m);
913 if (r == -EOPNOTSUPP)
914 log_debug_errno(r, "Could not enumerate wireless LAN stations, ignoring: %m");
915 else if (r < 0)
916 return log_error_errno(r, "Could not enumerate wireless LAN stations: %m");
917
918 return 0;
919 }
920
921 static int set_hostname_handler(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
922 const sd_bus_error *e;
923 int r;
924
925 assert(m);
926
927 e = sd_bus_message_get_error(m);
928 if (e) {
929 r = sd_bus_error_get_errno(e);
930 log_warning_errno(r, "Could not set hostname: %s", bus_error_message(e, r));
931 }
932
933 return 1;
934 }
935
936 int manager_set_hostname(Manager *m, const char *hostname) {
937 int r;
938
939 log_debug("Setting transient hostname: '%s'", strna(hostname));
940
941 r = free_and_strdup_warn(&m->dynamic_hostname, hostname);
942 if (r < 0)
943 return r;
944
945 if (sd_bus_is_ready(m->bus) <= 0) {
946 log_debug("Not connected to system bus, setting system hostname later.");
947 return 0;
948 }
949
950 r = sd_bus_call_method_async(
951 m->bus,
952 NULL,
953 "org.freedesktop.hostname1",
954 "/org/freedesktop/hostname1",
955 "org.freedesktop.hostname1",
956 "SetHostname",
957 set_hostname_handler,
958 m,
959 "sb",
960 hostname,
961 false);
962 if (r < 0)
963 return log_error_errno(r, "Could not set transient hostname: %m");
964
965 return 0;
966 }
967
968 static int set_timezone_handler(sd_bus_message *m, void *userdata, sd_bus_error *ret_error) {
969 const sd_bus_error *e;
970 int r;
971
972 assert(m);
973
974 e = sd_bus_message_get_error(m);
975 if (e) {
976 r = sd_bus_error_get_errno(e);
977 log_warning_errno(r, "Could not set timezone: %s", bus_error_message(e, r));
978 }
979
980 return 1;
981 }
982
983 int manager_set_timezone(Manager *m, const char *tz) {
984 int r;
985
986 assert(m);
987 assert(tz);
988
989 log_debug("Setting system timezone: '%s'", tz);
990 r = free_and_strdup_warn(&m->dynamic_timezone, tz);
991 if (r < 0)
992 return r;
993
994 if (sd_bus_is_ready(m->bus) <= 0) {
995 log_debug("Not connected to system bus, setting system timezone later.");
996 return 0;
997 }
998
999 r = sd_bus_call_method_async(
1000 m->bus,
1001 NULL,
1002 "org.freedesktop.timedate1",
1003 "/org/freedesktop/timedate1",
1004 "org.freedesktop.timedate1",
1005 "SetTimezone",
1006 set_timezone_handler,
1007 m,
1008 "sb",
1009 tz,
1010 false);
1011 if (r < 0)
1012 return log_error_errno(r, "Could not set timezone: %m");
1013
1014 return 0;
1015 }