1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2013 Tom Gundersen <teg@jklm.no>
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
21 #include <sys/socket.h>
23 #include <linux/fib_rules.h>
24 #include <stdio_ext.h>
26 #include "sd-daemon.h"
27 #include "sd-netlink.h"
29 #include "alloc-util.h"
31 #include "conf-parser.h"
33 #include "dns-domain.h"
36 #include "libudev-private.h"
37 #include "local-addresses.h"
38 #include "netlink-util.h"
39 #include "networkd-manager.h"
40 #include "ordered-set.h"
41 #include "path-util.h"
43 #include "udev-util.h"
46 /* use 8 MB for receive socket kernel queue. */
47 #define RCVBUF_SIZE (8*1024*1024)
49 const char* const network_dirs
[] = {
50 "/etc/systemd/network",
51 "/run/systemd/network",
52 "/usr/lib/systemd/network",
54 "/lib/systemd/network",
58 static int setup_default_address_pool(Manager
*m
) {
64 /* Add in the well-known private address ranges. */
66 r
= address_pool_new_from_string(m
, &p
, AF_INET6
, "fc00::", 7);
70 r
= address_pool_new_from_string(m
, &p
, AF_INET
, "192.168.0.0", 16);
74 r
= address_pool_new_from_string(m
, &p
, AF_INET
, "172.16.0.0", 12);
78 r
= address_pool_new_from_string(m
, &p
, AF_INET
, "10.0.0.0", 8);
85 static int on_bus_retry(sd_event_source
*s
, usec_t usec
, void *userdata
) {
86 Manager
*m
= userdata
;
91 m
->bus_retry_event_source
= sd_event_source_unref(m
->bus_retry_event_source
);
93 manager_connect_bus(m
);
98 static int manager_reset_all(Manager
*m
) {
105 HASHMAP_FOREACH(link
, m
->links
, i
) {
106 r
= link_carrier_reset(link
);
108 log_link_warning_errno(link
, r
, "Could not reset carrier: %m");
114 static int match_prepare_for_sleep(sd_bus_message
*message
, void *userdata
, sd_bus_error
*ret_error
) {
115 Manager
*m
= userdata
;
120 r
= sd_bus_message_read(message
, "b", &b
);
122 log_debug_errno(r
, "Failed to parse PrepareForSleep signal: %m");
129 log_debug("Coming back from suspend, resetting all connections...");
131 manager_reset_all(m
);
136 int manager_connect_bus(Manager
*m
) {
141 r
= sd_bus_default_system(&m
->bus
);
143 /* We failed to connect? Yuck, we must be in early
144 * boot. Let's try in 5s again. */
146 log_debug_errno(r
, "Failed to connect to bus, trying again in 5s: %m");
148 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
);
150 return log_error_errno(r
, "Failed to install bus reconnect time event: %m");
155 r
= sd_bus_add_match(m
->bus
, &m
->prepare_for_sleep_slot
,
157 "sender='org.freedesktop.login1',"
158 "interface='org.freedesktop.login1.Manager',"
159 "member='PrepareForSleep',"
160 "path='/org/freedesktop/login1'",
161 match_prepare_for_sleep
,
164 return log_error_errno(r
, "Failed to add match for PrepareForSleep: %m");
166 r
= sd_bus_add_object_vtable(m
->bus
, NULL
, "/org/freedesktop/network1", "org.freedesktop.network1.Manager", manager_vtable
, m
);
168 return log_error_errno(r
, "Failed to add manager object vtable: %m");
170 r
= sd_bus_add_fallback_vtable(m
->bus
, NULL
, "/org/freedesktop/network1/link", "org.freedesktop.network1.Link", link_vtable
, link_object_find
, m
);
172 return log_error_errno(r
, "Failed to add link object vtable: %m");
174 r
= sd_bus_add_node_enumerator(m
->bus
, NULL
, "/org/freedesktop/network1/link", link_node_enumerator
, m
);
176 return log_error_errno(r
, "Failed to add link enumerator: %m");
178 r
= sd_bus_add_fallback_vtable(m
->bus
, NULL
, "/org/freedesktop/network1/network", "org.freedesktop.network1.Network", network_vtable
, network_object_find
, m
);
180 return log_error_errno(r
, "Failed to add network object vtable: %m");
182 r
= sd_bus_add_node_enumerator(m
->bus
, NULL
, "/org/freedesktop/network1/network", network_node_enumerator
, m
);
184 return log_error_errno(r
, "Failed to add network enumerator: %m");
186 r
= sd_bus_request_name(m
->bus
, "org.freedesktop.network1", 0);
188 return log_error_errno(r
, "Failed to register name: %m");
190 r
= sd_bus_attach_event(m
->bus
, m
->event
, 0);
192 return log_error_errno(r
, "Failed to attach bus to event loop: %m");
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
);
200 if (m
->dynamic_timezone
) {
201 r
= manager_set_timezone(m
, m
->dynamic_timezone
);
209 static int manager_udev_process_link(Manager
*m
, struct udev_device
*device
) {
216 if (!streq_ptr(udev_device_get_action(device
), "add"))
219 ifindex
= udev_device_get_ifindex(device
);
221 log_debug("Ignoring udev ADD event for device with invalid ifindex");
225 r
= link_get(m
, ifindex
, &link
);
231 r
= link_initialized(link
, device
);
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
;
243 device
= udev_monitor_receive_device(monitor
);
247 manager_udev_process_link(m
, device
);
251 static int manager_connect_udev(Manager
*m
) {
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)
260 m
->udev
= udev_new();
264 m
->udev_monitor
= udev_monitor_new_from_netlink(m
->udev
, "udev");
265 if (!m
->udev_monitor
)
268 r
= udev_monitor_filter_add_match_subsystem_devtype(m
->udev_monitor
, "net", NULL
);
270 return log_error_errno(r
, "Could not add udev monitor filter: %m");
272 r
= udev_monitor_enable_receiving(m
->udev_monitor
);
274 log_error("Could not enable udev monitor");
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
,
286 r
= sd_event_source_set_description(m
->udev_event_source
, "networkd-udev");
293 int manager_rtnl_process_route(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
294 Manager
*m
= userdata
;
297 uint32_t ifindex
, priority
= 0;
298 unsigned char protocol
, scope
, tos
, table
, rt_type
;
300 unsigned char dst_prefixlen
, src_prefixlen
;
301 union in_addr_union dst
= {}, gw
= {}, src
= {}, prefsrc
= {};
309 if (sd_netlink_message_is_error(message
)) {
310 r
= sd_netlink_message_get_errno(message
);
312 log_warning_errno(r
, "rtnl: failed to receive route: %m");
317 r
= sd_netlink_message_get_type(message
, &type
);
319 log_warning_errno(r
, "rtnl: could not get message type: %m");
321 } else if (!IN_SET(type
, RTM_NEWROUTE
, RTM_DELROUTE
)) {
322 log_warning("rtnl: received unexpected message type when processing route");
326 r
= sd_netlink_message_read_u32(message
, RTA_OIF
, &ifindex
);
328 log_debug("rtnl: received route without ifindex, ignoring");
331 log_warning_errno(r
, "rtnl: could not get ifindex from route, ignoring: %m");
333 } else if (ifindex
<= 0) {
334 log_warning("rtnl: received route message with invalid ifindex, ignoring: %d", ifindex
);
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 */
342 log_warning("rtnl: received route for nonexistent link (%d), ignoring", ifindex
);
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.");
353 r
= sd_rtnl_message_route_get_protocol(message
, &protocol
);
355 log_warning_errno(r
, "rtnl: could not get route protocol: %m");
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");
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");
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");
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");
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");
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");
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");
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");
415 assert_not_reached("Received unsupported address family");
419 r
= sd_rtnl_message_route_get_dst_prefixlen(message
, &dst_prefixlen
);
421 log_link_warning_errno(link
, r
, "rtnl: received route with invalid destination prefixlen, ignoring: %m");
425 r
= sd_rtnl_message_route_get_src_prefixlen(message
, &src_prefixlen
);
427 log_link_warning_errno(link
, r
, "rtnl: received route with invalid source prefixlen, ignoring: %m");
431 r
= sd_rtnl_message_route_get_scope(message
, &scope
);
433 log_link_warning_errno(link
, r
, "rtnl: received route with invalid scope, ignoring: %m");
437 r
= sd_rtnl_message_route_get_tos(message
, &tos
);
439 log_link_warning_errno(link
, r
, "rtnl: received route with invalid tos, ignoring: %m");
443 r
= sd_rtnl_message_route_get_type(message
, &rt_type
);
445 log_link_warning_errno(link
, r
, "rtnl: received route with invalid type, ignoring: %m");
449 r
= sd_rtnl_message_route_get_table(message
, &table
);
451 log_link_warning_errno(link
, r
, "rtnl: received route with invalid table, ignoring: %m");
455 r
= sd_netlink_message_read_u32(message
, RTA_PRIORITY
, &priority
);
456 if (r
< 0 && r
!= -ENODATA
) {
457 log_link_warning_errno(link
, r
, "rtnl: received route with invalid priority, ignoring: %m");
461 route_get(link
, family
, &dst
, dst_prefixlen
, tos
, priority
, table
, &route
);
466 /* A route appeared that we did not request */
467 r
= route_add_foreign(link
, family
, &dst
, dst_prefixlen
, tos
, priority
, table
, &route
);
472 route_update(route
, &src
, src_prefixlen
, &gw
, &prefsrc
, scope
, protocol
, rt_type
);
481 assert_not_reached("Received invalid RTNL message type");
487 int manager_rtnl_process_address(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
488 Manager
*m
= userdata
;
493 unsigned char prefixlen
;
495 union in_addr_union in_addr
;
496 struct ifa_cacheinfo cinfo
;
497 Address
*address
= NULL
;
498 char buf
[INET6_ADDRSTRLEN
], valid_buf
[FORMAT_TIMESPAN_MAX
];
499 const char *valid_str
= NULL
;
506 if (sd_netlink_message_is_error(message
)) {
507 r
= sd_netlink_message_get_errno(message
);
509 log_warning_errno(r
, "rtnl: failed to receive address: %m");
514 r
= sd_netlink_message_get_type(message
, &type
);
516 log_warning_errno(r
, "rtnl: could not get message type: %m");
518 } else if (!IN_SET(type
, RTM_NEWADDR
, RTM_DELADDR
)) {
519 log_warning("rtnl: received unexpected message type when processing address");
523 r
= sd_rtnl_message_addr_get_ifindex(message
, &ifindex
);
525 log_warning_errno(r
, "rtnl: could not get ifindex from address: %m");
527 } else if (ifindex
<= 0) {
528 log_warning("rtnl: received address message with invalid ifindex: %d", ifindex
);
531 r
= link_get(m
, ifindex
, &link
);
532 if (r
< 0 || !link
) {
533 /* when enumerating we might be out of sync, but we will
534 * get the address again, so just ignore it */
536 log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex
);
541 r
= sd_rtnl_message_addr_get_family(message
, &family
);
542 if (r
< 0 || !IN_SET(family
, AF_INET
, AF_INET6
)) {
543 log_link_warning(link
, "rtnl: received address with invalid family, ignoring.");
547 r
= sd_rtnl_message_addr_get_prefixlen(message
, &prefixlen
);
549 log_link_warning_errno(link
, r
, "rtnl: received address with invalid prefixlen, ignoring: %m");
553 r
= sd_rtnl_message_addr_get_scope(message
, &scope
);
555 log_link_warning_errno(link
, r
, "rtnl: received address with invalid scope, ignoring: %m");
559 r
= sd_rtnl_message_addr_get_flags(message
, &flags
);
561 log_link_warning_errno(link
, r
, "rtnl: received address with invalid flags, ignoring: %m");
567 r
= sd_netlink_message_read_in_addr(message
, IFA_LOCAL
, &in_addr
.in
);
569 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
576 r
= sd_netlink_message_read_in6_addr(message
, IFA_ADDRESS
, &in_addr
.in6
);
578 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
585 log_link_debug(link
, "rtnl: ignoring unsupported address family: %d", family
);
588 if (!inet_ntop(family
, &in_addr
, buf
, INET6_ADDRSTRLEN
)) {
589 log_link_warning(link
, "Could not print address");
593 r
= sd_netlink_message_read_cache_info(message
, IFA_CACHEINFO
, &cinfo
);
595 if (cinfo
.ifa_valid
!= CACHE_INFO_INFINITY_LIFE_TIME
)
596 valid_str
= format_timespan(valid_buf
, FORMAT_TIMESPAN_MAX
,
597 cinfo
.ifa_valid
* USEC_PER_SEC
,
601 address_get(link
, family
, &in_addr
, prefixlen
, &address
);
606 log_link_debug(link
, "Updating address: %s/%u (valid %s%s)", buf
, prefixlen
,
607 valid_str
? "for " : "forever", strempty(valid_str
));
609 /* An address appeared that we did not request */
610 r
= address_add_foreign(link
, family
, &in_addr
, prefixlen
, &address
);
612 log_link_warning_errno(link
, r
, "Failed to add address %s/%u: %m", buf
, prefixlen
);
615 log_link_debug(link
, "Adding address: %s/%u (valid %s%s)", buf
, prefixlen
,
616 valid_str
? "for " : "forever", strempty(valid_str
));
619 address_update(address
, flags
, scope
, &cinfo
);
626 log_link_debug(link
, "Removing address: %s/%u (valid %s%s)", buf
, prefixlen
,
627 valid_str
? "for " : "forever", strempty(valid_str
));
628 address_drop(address
);
630 log_link_warning(link
, "Removing non-existent address: %s/%u (valid %s%s)", buf
, prefixlen
,
631 valid_str
? "for " : "forever", strempty(valid_str
));
635 assert_not_reached("Received invalid RTNL message type");
641 static int manager_rtnl_process_link(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
642 Manager
*m
= userdata
;
644 NetDev
*netdev
= NULL
;
653 if (sd_netlink_message_is_error(message
)) {
654 r
= sd_netlink_message_get_errno(message
);
656 log_warning_errno(r
, "rtnl: Could not receive link: %m");
661 r
= sd_netlink_message_get_type(message
, &type
);
663 log_warning_errno(r
, "rtnl: Could not get message type: %m");
665 } else if (!IN_SET(type
, RTM_NEWLINK
, RTM_DELLINK
)) {
666 log_warning("rtnl: Received unexpected message type when processing link");
670 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
672 log_warning_errno(r
, "rtnl: Could not get ifindex from link: %m");
674 } else if (ifindex
<= 0) {
675 log_warning("rtnl: received link message with invalid ifindex: %d", ifindex
);
679 r
= sd_netlink_message_read_string(message
, IFLA_IFNAME
, &name
);
681 log_warning_errno(r
, "rtnl: Received link message without ifname: %m");
685 (void) link_get(m
, ifindex
, &link
);
686 (void) netdev_get(m
, name
, &netdev
);
691 /* link is new, so add it */
692 r
= link_add(m
, message
, &link
);
694 log_warning_errno(r
, "Could not add new link: %m");
700 /* netdev exists, so make sure the ifindex matches */
701 r
= netdev_set_ifindex(netdev
, message
);
703 log_warning_errno(r
, "Could not set ifindex on netdev: %m");
708 r
= link_update(link
, message
);
721 assert_not_reached("Received invalid RTNL message type.");
727 int manager_rtnl_process_rule(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
728 uint8_t tos
= 0, to_prefixlen
= 0, from_prefixlen
= 0;
729 union in_addr_union to
= {}, from
= {};
730 RoutingPolicyRule
*rule
= NULL
;
731 uint32_t fwmark
= 0, table
= 0;
732 char *iif
= NULL
, *oif
= NULL
;
733 Manager
*m
= userdata
;
742 if (sd_netlink_message_is_error(message
)) {
743 r
= sd_netlink_message_get_errno(message
);
745 log_warning_errno(r
, "rtnl: failed to receive rule: %m");
750 r
= sd_netlink_message_get_type(message
, &type
);
752 log_warning_errno(r
, "rtnl: could not get message type: %m");
754 } else if (!IN_SET(type
, RTM_NEWRULE
, RTM_DELRULE
)) {
755 log_warning("rtnl: received unexpected message type '%u' when processing rule.", type
);
759 r
= sd_rtnl_message_get_family(message
, &family
);
761 log_warning_errno(r
, "rtnl: could not get rule family: %m");
763 } else if (!IN_SET(family
, AF_INET
, AF_INET6
)) {
764 log_debug("rtnl: received address with invalid family %u, ignoring.", family
);
770 r
= sd_netlink_message_read_in_addr(message
, FRA_SRC
, &from
.in
);
772 r
= sd_rtnl_message_routing_policy_rule_get_rtm_src_prefixlen(message
, &from_prefixlen
);
774 log_warning_errno(r
, "rtnl: failed to retrive rule from prefix length: %m");
777 r
= sd_netlink_message_read_in_addr(message
, FRA_DST
, &to
.in
);
779 r
= sd_rtnl_message_routing_policy_rule_get_rtm_dst_prefixlen(message
, &to_prefixlen
);
781 log_warning_errno(r
, "rtnl: failed to retrive rule to prefix length: %m");
787 r
= sd_netlink_message_read_in6_addr(message
, FRA_SRC
, &from
.in6
);
789 r
= sd_rtnl_message_routing_policy_rule_get_rtm_src_prefixlen(message
, &from_prefixlen
);
791 log_warning_errno(r
, "rtnl: failed to retrive rule from prefix length: %m");
794 r
= sd_netlink_message_read_in6_addr(message
, FRA_DST
, &to
.in6
);
796 r
= sd_rtnl_message_routing_policy_rule_get_rtm_dst_prefixlen(message
, &to_prefixlen
);
798 log_warning_errno(r
, "rtnl: failed to retrive rule to prefix length: %m");
804 assert_not_reached("Received unsupported address family");
807 if (from_prefixlen
== 0 && to_prefixlen
== 0)
810 (void) sd_netlink_message_read_u32(message
, FRA_FWMARK
, &fwmark
);
811 (void) sd_netlink_message_read_u32(message
, FRA_TABLE
, &table
);
812 (void) sd_rtnl_message_routing_policy_rule_get_tos(message
, &tos
);
813 (void) sd_netlink_message_read_string(message
, FRA_IIFNAME
, (const char **) &iif
);
814 (void) sd_netlink_message_read_string(message
, FRA_OIFNAME
, (const char **) &oif
);
816 (void) routing_policy_rule_get(m
, family
, &from
, from_prefixlen
, &to
, to_prefixlen
, tos
, fwmark
, table
, iif
, oif
, &rule
);
821 r
= routing_policy_rule_add_foreign(m
, family
, &from
, from_prefixlen
, &to
, to_prefixlen
, tos
, fwmark
, table
, iif
, oif
, &rule
);
823 log_warning_errno(r
, "Could not add rule: %m");
829 routing_policy_rule_free(rule
);
834 assert_not_reached("Received invalid RTNL message type");
840 static int systemd_netlink_fd(void) {
841 int n
, fd
, rtnl_fd
= -EINVAL
;
843 n
= sd_listen_fds(true);
847 for (fd
= SD_LISTEN_FDS_START
; fd
< SD_LISTEN_FDS_START
+ n
; fd
++) {
848 if (sd_is_socket(fd
, AF_NETLINK
, SOCK_RAW
, -1) > 0) {
859 static int manager_connect_rtnl(Manager
*m
) {
864 fd
= systemd_netlink_fd();
866 r
= sd_netlink_open(&m
->rtnl
);
868 r
= sd_netlink_open_fd(&m
->rtnl
, fd
);
872 r
= sd_netlink_inc_rcvbuf(m
->rtnl
, RCVBUF_SIZE
);
876 r
= sd_netlink_attach_event(m
->rtnl
, m
->event
, 0);
880 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWLINK
, &manager_rtnl_process_link
, m
);
884 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELLINK
, &manager_rtnl_process_link
, m
);
888 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWADDR
, &manager_rtnl_process_address
, m
);
892 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELADDR
, &manager_rtnl_process_address
, m
);
896 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWROUTE
, &manager_rtnl_process_route
, m
);
900 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELROUTE
, &manager_rtnl_process_route
, m
);
904 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWRULE
, &manager_rtnl_process_rule
, m
);
908 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELRULE
, &manager_rtnl_process_rule
, m
);
915 static int ordered_set_put_in_addr_data(OrderedSet
*s
, const struct in_addr_data
*address
) {
922 r
= in_addr_to_string(address
->family
, &address
->address
, &p
);
926 r
= ordered_set_consume(s
, p
);
933 static int ordered_set_put_in_addr_datav(OrderedSet
*s
, const struct in_addr_data
*addresses
, unsigned n
) {
938 assert(addresses
|| n
== 0);
940 for (i
= 0; i
< n
; i
++) {
941 r
= ordered_set_put_in_addr_data(s
, addresses
+i
);
951 static int ordered_set_put_in4_addr(OrderedSet
*s
, const struct in_addr
*address
) {
958 r
= in_addr_to_string(AF_INET
, (const union in_addr_union
*) address
, &p
);
962 r
= ordered_set_consume(s
, p
);
969 static int ordered_set_put_in4_addrv(OrderedSet
*s
, const struct in_addr
*addresses
, unsigned n
) {
974 assert(n
== 0 || addresses
);
976 for (i
= 0; i
< n
; i
++) {
977 r
= ordered_set_put_in4_addr(s
, addresses
+i
);
987 static void print_string_set(FILE *f
, const char *field
, OrderedSet
*s
) {
992 if (ordered_set_isempty(s
))
997 ORDERED_SET_FOREACH(p
, s
, i
)
998 fputs_with_space(f
, p
, NULL
, &space
);
1003 static int manager_save(Manager
*m
) {
1004 _cleanup_ordered_set_free_free_ OrderedSet
*dns
= NULL
, *ntp
= NULL
, *search_domains
= NULL
, *route_domains
= NULL
;
1007 _cleanup_free_
char *temp_path
= NULL
;
1008 _cleanup_fclose_
FILE *f
= NULL
;
1009 LinkOperationalState operstate
= LINK_OPERSTATE_OFF
;
1010 const char *operstate_str
;
1014 assert(m
->state_file
);
1016 /* We add all NTP and DNS server to a set, to filter out duplicates */
1017 dns
= ordered_set_new(&string_hash_ops
);
1021 ntp
= ordered_set_new(&string_hash_ops
);
1025 search_domains
= ordered_set_new(&dns_name_hash_ops
);
1026 if (!search_domains
)
1029 route_domains
= ordered_set_new(&dns_name_hash_ops
);
1033 HASHMAP_FOREACH(link
, m
->links
, i
) {
1034 if (link
->flags
& IFF_LOOPBACK
)
1037 if (link
->operstate
> operstate
)
1038 operstate
= link
->operstate
;
1043 /* First add the static configured entries */
1044 r
= ordered_set_put_in_addr_datav(dns
, link
->network
->dns
, link
->network
->n_dns
);
1048 r
= ordered_set_put_strdupv(ntp
, link
->network
->ntp
);
1052 r
= ordered_set_put_strdupv(search_domains
, link
->network
->search_domains
);
1056 r
= ordered_set_put_strdupv(route_domains
, link
->network
->route_domains
);
1060 if (!link
->dhcp_lease
)
1063 /* Secondly, add the entries acquired via DHCP */
1064 if (link
->network
->dhcp_use_dns
) {
1065 const struct in_addr
*addresses
;
1067 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
1069 r
= ordered_set_put_in4_addrv(dns
, addresses
, r
);
1072 } else if (r
< 0 && r
!= -ENODATA
)
1076 if (link
->network
->dhcp_use_ntp
) {
1077 const struct in_addr
*addresses
;
1079 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
1081 r
= ordered_set_put_in4_addrv(ntp
, addresses
, r
);
1084 } else if (r
< 0 && r
!= -ENODATA
)
1088 if (link
->network
->dhcp_use_domains
!= DHCP_USE_DOMAINS_NO
) {
1089 const char *domainname
;
1090 char **domains
= NULL
;
1092 OrderedSet
*target_domains
= (link
->network
->dhcp_use_domains
== DHCP_USE_DOMAINS_YES
) ? search_domains
: route_domains
;
1093 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
1095 r
= ordered_set_put_strdup(target_domains
, domainname
);
1098 } else if (r
!= -ENODATA
)
1101 r
= sd_dhcp_lease_get_search_domains(link
->dhcp_lease
, &domains
);
1103 r
= ordered_set_put_strdupv(target_domains
, domains
);
1106 } else if (r
!= -ENODATA
)
1111 operstate_str
= link_operstate_to_string(operstate
);
1112 assert(operstate_str
);
1114 r
= fopen_temporary(m
->state_file
, &f
, &temp_path
);
1118 (void) __fsetlocking(f
, FSETLOCKING_BYCALLER
);
1119 (void) fchmod(fileno(f
), 0644);
1122 "# This is private data. Do not parse.\n"
1123 "OPER_STATE=%s\n", operstate_str
);
1125 print_string_set(f
, "DNS=", dns
);
1126 print_string_set(f
, "NTP=", ntp
);
1127 print_string_set(f
, "DOMAINS=", search_domains
);
1128 print_string_set(f
, "ROUTE_DOMAINS=", route_domains
);
1130 r
= routing_policy_serialize_rules(m
->rules
, f
);
1134 r
= fflush_and_check(f
);
1138 if (rename(temp_path
, m
->state_file
) < 0) {
1143 if (m
->operational_state
!= operstate
) {
1144 m
->operational_state
= operstate
;
1145 r
= manager_send_changed(m
, "OperationalState", NULL
);
1147 log_error_errno(r
, "Could not emit changed OperationalState: %m");
1155 (void) unlink(m
->state_file
);
1156 (void) unlink(temp_path
);
1158 return log_error_errno(r
, "Failed to save network state to %s: %m", m
->state_file
);
1161 static int manager_dirty_handler(sd_event_source
*s
, void *userdata
) {
1162 Manager
*m
= userdata
;
1172 SET_FOREACH(link
, m
->dirty_links
, i
) {
1173 r
= link_save(link
);
1181 int manager_new(Manager
**ret
, sd_event
*event
) {
1182 _cleanup_manager_free_ Manager
*m
= NULL
;
1185 m
= new0(Manager
, 1);
1189 m
->state_file
= strdup("/run/systemd/netif/state");
1193 m
->event
= sd_event_ref(event
);
1195 r
= sd_event_add_post(m
->event
, NULL
, manager_dirty_handler
, m
);
1199 r
= manager_connect_rtnl(m
);
1203 r
= manager_connect_udev(m
);
1207 m
->netdevs
= hashmap_new(&string_hash_ops
);
1211 LIST_HEAD_INIT(m
->networks
);
1213 r
= setup_default_address_pool(m
);
1217 m
->duid
.type
= DUID_TYPE_EN
;
1219 (void) routing_policy_load_rules(m
->state_file
, &m
->rules_saved
);
1227 void manager_free(Manager
*m
) {
1236 free(m
->state_file
);
1238 while ((network
= m
->networks
))
1239 network_free(network
);
1241 while ((link
= hashmap_first(m
->links
)))
1243 hashmap_free(m
->links
);
1245 hashmap_free(m
->networks_by_name
);
1247 while ((netdev
= hashmap_first(m
->netdevs
)))
1248 netdev_unref(netdev
);
1249 hashmap_free(m
->netdevs
);
1251 while ((pool
= m
->address_pools
))
1252 address_pool_free(pool
);
1255 set_free(m
->rules_foreign
);
1257 set_free_with_destructor(m
->rules_saved
, routing_policy_rule_free
);
1259 sd_netlink_unref(m
->rtnl
);
1260 sd_event_unref(m
->event
);
1262 sd_event_source_unref(m
->udev_event_source
);
1263 udev_monitor_unref(m
->udev_monitor
);
1264 udev_unref(m
->udev
);
1266 sd_bus_unref(m
->bus
);
1267 sd_bus_slot_unref(m
->prepare_for_sleep_slot
);
1268 sd_event_source_unref(m
->bus_retry_event_source
);
1270 free(m
->dynamic_timezone
);
1271 free(m
->dynamic_hostname
);
1276 int manager_start(Manager
*m
) {
1282 /* The dirty handler will deal with future serialization, but the first one
1283 must be done explicitly. */
1287 HASHMAP_FOREACH(link
, m
->links
, i
)
1293 int manager_load_config(Manager
*m
) {
1296 /* update timestamp */
1297 paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, true);
1303 r
= network_load(m
);
1310 bool manager_should_reload(Manager
*m
) {
1311 return paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, false);
1314 int manager_rtnl_enumerate_links(Manager
*m
) {
1315 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1316 sd_netlink_message
*link
;
1322 r
= sd_rtnl_message_new_link(m
->rtnl
, &req
, RTM_GETLINK
, 0);
1326 r
= sd_netlink_message_request_dump(req
, true);
1330 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1334 for (link
= reply
; link
; link
= sd_netlink_message_next(link
)) {
1337 m
->enumerating
= true;
1339 k
= manager_rtnl_process_link(m
->rtnl
, link
, m
);
1343 m
->enumerating
= false;
1349 int manager_rtnl_enumerate_addresses(Manager
*m
) {
1350 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1351 sd_netlink_message
*addr
;
1357 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, 0, 0);
1361 r
= sd_netlink_message_request_dump(req
, true);
1365 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1369 for (addr
= reply
; addr
; addr
= sd_netlink_message_next(addr
)) {
1372 m
->enumerating
= true;
1374 k
= manager_rtnl_process_address(m
->rtnl
, addr
, m
);
1378 m
->enumerating
= false;
1384 int manager_rtnl_enumerate_routes(Manager
*m
) {
1385 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1386 sd_netlink_message
*route
;
1392 r
= sd_rtnl_message_new_route(m
->rtnl
, &req
, RTM_GETROUTE
, 0, 0);
1396 r
= sd_netlink_message_request_dump(req
, true);
1400 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1404 for (route
= reply
; route
; route
= sd_netlink_message_next(route
)) {
1407 m
->enumerating
= true;
1409 k
= manager_rtnl_process_route(m
->rtnl
, route
, m
);
1413 m
->enumerating
= false;
1419 int manager_rtnl_enumerate_rules(Manager
*m
) {
1420 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1421 sd_netlink_message
*rule
;
1427 r
= sd_rtnl_message_new_routing_policy_rule(m
->rtnl
, &req
, RTM_GETRULE
, 0);
1431 r
= sd_netlink_message_request_dump(req
, true);
1435 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1437 if (r
== -EOPNOTSUPP
) {
1438 log_debug("FIB Rules are not supported by the kernel. Ignoring.");
1445 for (rule
= reply
; rule
; rule
= sd_netlink_message_next(rule
)) {
1448 m
->enumerating
= true;
1450 k
= manager_rtnl_process_rule(m
->rtnl
, rule
, m
);
1454 m
->enumerating
= false;
1460 int manager_address_pool_acquire(Manager
*m
, int family
, unsigned prefixlen
, union in_addr_union
*found
) {
1465 assert(prefixlen
> 0);
1468 LIST_FOREACH(address_pools
, p
, m
->address_pools
) {
1469 if (p
->family
!= family
)
1472 r
= address_pool_acquire(p
, prefixlen
, found
);
1480 Link
* manager_find_uplink(Manager
*m
, Link
*exclude
) {
1481 _cleanup_free_
struct local_address
*gateways
= NULL
;
1486 /* Looks for a suitable "uplink", via black magic: an
1487 * interface that is up and where the default route with the
1488 * highest priority points to. */
1490 n
= local_gateways(m
->rtnl
, 0, AF_UNSPEC
, &gateways
);
1492 log_warning_errno(n
, "Failed to determine list of default gateways: %m");
1496 for (i
= 0; i
< n
; i
++) {
1499 link
= hashmap_get(m
->links
, INT_TO_PTR(gateways
[i
].ifindex
));
1501 log_debug("Weird, found a gateway for a link we don't know. Ignoring.");
1505 if (link
== exclude
)
1508 if (link
->operstate
< LINK_OPERSTATE_ROUTABLE
)
1517 void manager_dirty(Manager
*manager
) {
1520 /* the serialized state in /run is no longer up-to-date */
1521 manager
->dirty
= true;
1524 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1525 Manager
*manager
= userdata
;
1526 const sd_bus_error
*e
;
1531 e
= sd_bus_message_get_error(m
);
1533 log_warning_errno(sd_bus_error_get_errno(e
), "Could not set hostname: %s", e
->message
);
1538 int manager_set_hostname(Manager
*m
, const char *hostname
) {
1541 log_debug("Setting transient hostname: '%s'", strna(hostname
));
1542 if (free_and_strdup(&m
->dynamic_hostname
, hostname
) < 0)
1546 /* TODO: replace by assert when we can rely on kdbus */
1547 log_info("Not connected to system bus, ignoring transient hostname.");
1551 r
= sd_bus_call_method_async(
1554 "org.freedesktop.hostname1",
1555 "/org/freedesktop/hostname1",
1556 "org.freedesktop.hostname1",
1558 set_hostname_handler
,
1565 return log_error_errno(r
, "Could not set transient hostname: %m");
1570 static int set_timezone_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1571 Manager
*manager
= userdata
;
1572 const sd_bus_error
*e
;
1577 e
= sd_bus_message_get_error(m
);
1579 log_warning_errno(sd_bus_error_get_errno(e
), "Could not set timezone: %s", e
->message
);
1584 int manager_set_timezone(Manager
*m
, const char *tz
) {
1590 log_debug("Setting system timezone: '%s'", tz
);
1591 if (free_and_strdup(&m
->dynamic_timezone
, tz
) < 0)
1595 log_info("Not connected to system bus, ignoring timezone.");
1599 r
= sd_bus_call_method_async(
1602 "org.freedesktop.timedate1",
1603 "/org/freedesktop/timedate1",
1604 "org.freedesktop.timedate1",
1606 set_timezone_handler
,
1612 return log_error_errno(r
, "Could not set timezone: %m");