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>
25 #include "sd-daemon.h"
26 #include "sd-netlink.h"
28 #include "alloc-util.h"
30 #include "conf-parser.h"
32 #include "dns-domain.h"
35 #include "libudev-private.h"
36 #include "local-addresses.h"
37 #include "netlink-util.h"
38 #include "networkd-manager.h"
39 #include "ordered-set.h"
40 #include "path-util.h"
42 #include "udev-util.h"
45 /* use 8 MB for receive socket kernel queue. */
46 #define RCVBUF_SIZE (8*1024*1024)
48 const char* const network_dirs
[] = {
49 "/etc/systemd/network",
50 "/run/systemd/network",
51 "/usr/lib/systemd/network",
53 "/lib/systemd/network",
57 static int setup_default_address_pool(Manager
*m
) {
63 /* Add in the well-known private address ranges. */
65 r
= address_pool_new_from_string(m
, &p
, AF_INET6
, "fc00::", 7);
69 r
= address_pool_new_from_string(m
, &p
, AF_INET
, "192.168.0.0", 16);
73 r
= address_pool_new_from_string(m
, &p
, AF_INET
, "172.16.0.0", 12);
77 r
= address_pool_new_from_string(m
, &p
, AF_INET
, "10.0.0.0", 8);
84 static int on_bus_retry(sd_event_source
*s
, usec_t usec
, void *userdata
) {
85 Manager
*m
= userdata
;
90 m
->bus_retry_event_source
= sd_event_source_unref(m
->bus_retry_event_source
);
92 manager_connect_bus(m
);
97 static int manager_reset_all(Manager
*m
) {
104 HASHMAP_FOREACH(link
, m
->links
, i
) {
105 r
= link_carrier_reset(link
);
107 log_link_warning_errno(link
, r
, "Could not reset carrier: %m");
113 static int match_prepare_for_sleep(sd_bus_message
*message
, void *userdata
, sd_bus_error
*ret_error
) {
114 Manager
*m
= userdata
;
119 r
= sd_bus_message_read(message
, "b", &b
);
121 log_debug_errno(r
, "Failed to parse PrepareForSleep signal: %m");
128 log_debug("Coming back from suspend, resetting all connections...");
130 manager_reset_all(m
);
135 int manager_connect_bus(Manager
*m
) {
140 r
= sd_bus_default_system(&m
->bus
);
142 /* We failed to connect? Yuck, we must be in early
143 * boot. Let's try in 5s again. */
145 log_debug_errno(r
, "Failed to connect to bus, trying again in 5s: %m");
147 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
);
149 return log_error_errno(r
, "Failed to install bus reconnect time event: %m");
157 r
= sd_bus_add_match(m
->bus
, &m
->prepare_for_sleep_slot
,
159 "sender='org.freedesktop.login1',"
160 "interface='org.freedesktop.login1.Manager',"
161 "member='PrepareForSleep',"
162 "path='/org/freedesktop/login1'",
163 match_prepare_for_sleep
,
166 return log_error_errno(r
, "Failed to add match for PrepareForSleep: %m");
168 r
= sd_bus_add_object_vtable(m
->bus
, NULL
, "/org/freedesktop/network1", "org.freedesktop.network1.Manager", manager_vtable
, m
);
170 return log_error_errno(r
, "Failed to add manager object vtable: %m");
172 r
= sd_bus_add_fallback_vtable(m
->bus
, NULL
, "/org/freedesktop/network1/link", "org.freedesktop.network1.Link", link_vtable
, link_object_find
, m
);
174 return log_error_errno(r
, "Failed to add link object vtable: %m");
176 r
= sd_bus_add_node_enumerator(m
->bus
, NULL
, "/org/freedesktop/network1/link", link_node_enumerator
, m
);
178 return log_error_errno(r
, "Failed to add link enumerator: %m");
180 r
= sd_bus_add_fallback_vtable(m
->bus
, NULL
, "/org/freedesktop/network1/network", "org.freedesktop.network1.Network", network_vtable
, network_object_find
, m
);
182 return log_error_errno(r
, "Failed to add network object vtable: %m");
184 r
= sd_bus_add_node_enumerator(m
->bus
, NULL
, "/org/freedesktop/network1/network", network_node_enumerator
, m
);
186 return log_error_errno(r
, "Failed to add network enumerator: %m");
188 r
= sd_bus_request_name(m
->bus
, "org.freedesktop.network1", 0);
190 return log_error_errno(r
, "Failed to register name: %m");
192 r
= sd_bus_attach_event(m
->bus
, m
->event
, 0);
194 return log_error_errno(r
, "Failed to attach bus to event loop: %m");
196 /* Did we get a timezone or transient hostname from DHCP while D-Bus wasn't up yet? */
197 if (m
->dynamic_hostname
) {
198 r
= manager_set_hostname(m
, m
->dynamic_hostname
);
202 if (m
->dynamic_timezone
) {
203 r
= manager_set_timezone(m
, m
->dynamic_timezone
);
211 static int manager_udev_process_link(Manager
*m
, struct udev_device
*device
) {
218 if (!streq_ptr(udev_device_get_action(device
), "add"))
221 ifindex
= udev_device_get_ifindex(device
);
223 log_debug("Ignoring udev ADD event for device with invalid ifindex");
227 r
= link_get(m
, ifindex
, &link
);
233 r
= link_initialized(link
, device
);
240 static int manager_dispatch_link_udev(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
241 Manager
*m
= userdata
;
242 struct udev_monitor
*monitor
= m
->udev_monitor
;
243 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
245 device
= udev_monitor_receive_device(monitor
);
249 manager_udev_process_link(m
, device
);
253 static int manager_connect_udev(Manager
*m
) {
256 /* udev does not initialize devices inside containers,
257 * so we rely on them being already initialized before
258 * entering the container */
259 if (detect_container() > 0)
262 m
->udev
= udev_new();
266 m
->udev_monitor
= udev_monitor_new_from_netlink(m
->udev
, "udev");
267 if (!m
->udev_monitor
)
270 r
= udev_monitor_filter_add_match_subsystem_devtype(m
->udev_monitor
, "net", NULL
);
272 return log_error_errno(r
, "Could not add udev monitor filter: %m");
274 r
= udev_monitor_enable_receiving(m
->udev_monitor
);
276 log_error("Could not enable udev monitor");
280 r
= sd_event_add_io(m
->event
,
281 &m
->udev_event_source
,
282 udev_monitor_get_fd(m
->udev_monitor
),
283 EPOLLIN
, manager_dispatch_link_udev
,
288 r
= sd_event_source_set_description(m
->udev_event_source
, "networkd-udev");
295 int manager_rtnl_process_route(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
296 Manager
*m
= userdata
;
299 uint32_t ifindex
, priority
= 0;
300 unsigned char protocol
, scope
, tos
, table
, rt_type
;
302 unsigned char dst_prefixlen
, src_prefixlen
;
303 union in_addr_union dst
= {}, gw
= {}, src
= {}, prefsrc
= {};
311 if (sd_netlink_message_is_error(message
)) {
312 r
= sd_netlink_message_get_errno(message
);
314 log_warning_errno(r
, "rtnl: failed to receive route: %m");
319 r
= sd_netlink_message_get_type(message
, &type
);
321 log_warning_errno(r
, "rtnl: could not get message type: %m");
323 } else if (!IN_SET(type
, RTM_NEWROUTE
, RTM_DELROUTE
)) {
324 log_warning("rtnl: received unexpected message type when processing route");
328 r
= sd_netlink_message_read_u32(message
, RTA_OIF
, &ifindex
);
330 log_debug("rtnl: received route without ifindex, ignoring");
333 log_warning_errno(r
, "rtnl: could not get ifindex from route, ignoring: %m");
335 } else if (ifindex
<= 0) {
336 log_warning("rtnl: received route message with invalid ifindex, ignoring: %d", ifindex
);
339 r
= link_get(m
, ifindex
, &link
);
340 if (r
< 0 || !link
) {
341 /* when enumerating we might be out of sync, but we will
342 * get the route again, so just ignore it */
344 log_warning("rtnl: received route for nonexistent link (%d), ignoring", ifindex
);
349 r
= sd_rtnl_message_route_get_family(message
, &family
);
350 if (r
< 0 || !IN_SET(family
, AF_INET
, AF_INET6
)) {
351 log_link_warning(link
, "rtnl: received address with invalid family, ignoring.");
355 r
= sd_rtnl_message_route_get_protocol(message
, &protocol
);
357 log_warning_errno(r
, "rtnl: could not get route protocol: %m");
363 r
= sd_netlink_message_read_in_addr(message
, RTA_DST
, &dst
.in
);
364 if (r
< 0 && r
!= -ENODATA
) {
365 log_link_warning_errno(link
, r
, "rtnl: received route without valid destination, ignoring: %m");
369 r
= sd_netlink_message_read_in_addr(message
, RTA_GATEWAY
, &gw
.in
);
370 if (r
< 0 && r
!= -ENODATA
) {
371 log_link_warning_errno(link
, r
, "rtnl: received route with invalid gateway, ignoring: %m");
375 r
= sd_netlink_message_read_in_addr(message
, RTA_SRC
, &src
.in
);
376 if (r
< 0 && r
!= -ENODATA
) {
377 log_link_warning_errno(link
, r
, "rtnl: received route with invalid source, ignoring: %m");
381 r
= sd_netlink_message_read_in_addr(message
, RTA_PREFSRC
, &prefsrc
.in
);
382 if (r
< 0 && r
!= -ENODATA
) {
383 log_link_warning_errno(link
, r
, "rtnl: received route with invalid preferred source, ignoring: %m");
390 r
= sd_netlink_message_read_in6_addr(message
, RTA_DST
, &dst
.in6
);
391 if (r
< 0 && r
!= -ENODATA
) {
392 log_link_warning_errno(link
, r
, "rtnl: received route without valid destination, ignoring: %m");
396 r
= sd_netlink_message_read_in6_addr(message
, RTA_GATEWAY
, &gw
.in6
);
397 if (r
< 0 && r
!= -ENODATA
) {
398 log_link_warning_errno(link
, r
, "rtnl: received route with invalid gateway, ignoring: %m");
402 r
= sd_netlink_message_read_in6_addr(message
, RTA_SRC
, &src
.in6
);
403 if (r
< 0 && r
!= -ENODATA
) {
404 log_link_warning_errno(link
, r
, "rtnl: received route with invalid source, ignoring: %m");
408 r
= sd_netlink_message_read_in6_addr(message
, RTA_PREFSRC
, &prefsrc
.in6
);
409 if (r
< 0 && r
!= -ENODATA
) {
410 log_link_warning_errno(link
, r
, "rtnl: received route with invalid preferred source, ignoring: %m");
417 assert_not_reached("Received unsupported address family");
421 r
= sd_rtnl_message_route_get_dst_prefixlen(message
, &dst_prefixlen
);
423 log_link_warning_errno(link
, r
, "rtnl: received route with invalid destination prefixlen, ignoring: %m");
427 r
= sd_rtnl_message_route_get_src_prefixlen(message
, &src_prefixlen
);
429 log_link_warning_errno(link
, r
, "rtnl: received route with invalid source prefixlen, ignoring: %m");
433 r
= sd_rtnl_message_route_get_scope(message
, &scope
);
435 log_link_warning_errno(link
, r
, "rtnl: received route with invalid scope, ignoring: %m");
439 r
= sd_rtnl_message_route_get_tos(message
, &tos
);
441 log_link_warning_errno(link
, r
, "rtnl: received route with invalid tos, ignoring: %m");
445 r
= sd_rtnl_message_route_get_type(message
, &rt_type
);
447 log_link_warning_errno(link
, r
, "rtnl: received route with invalid type, ignoring: %m");
451 r
= sd_rtnl_message_route_get_table(message
, &table
);
453 log_link_warning_errno(link
, r
, "rtnl: received route with invalid table, ignoring: %m");
457 r
= sd_netlink_message_read_u32(message
, RTA_PRIORITY
, &priority
);
458 if (r
< 0 && r
!= -ENODATA
) {
459 log_link_warning_errno(link
, r
, "rtnl: received route with invalid priority, ignoring: %m");
463 route_get(link
, family
, &dst
, dst_prefixlen
, tos
, priority
, table
, &route
);
468 /* A route appeared that we did not request */
469 r
= route_add_foreign(link
, family
, &dst
, dst_prefixlen
, tos
, priority
, table
, &route
);
474 route_update(route
, &src
, src_prefixlen
, &gw
, &prefsrc
, scope
, rt_type
, protocol
);
483 assert_not_reached("Received invalid RTNL message type");
489 int manager_rtnl_process_address(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
490 Manager
*m
= userdata
;
495 unsigned char prefixlen
;
497 union in_addr_union in_addr
;
498 struct ifa_cacheinfo cinfo
;
499 Address
*address
= NULL
;
500 char buf
[INET6_ADDRSTRLEN
], valid_buf
[FORMAT_TIMESPAN_MAX
];
501 const char *valid_str
= NULL
;
508 if (sd_netlink_message_is_error(message
)) {
509 r
= sd_netlink_message_get_errno(message
);
511 log_warning_errno(r
, "rtnl: failed to receive address: %m");
516 r
= sd_netlink_message_get_type(message
, &type
);
518 log_warning_errno(r
, "rtnl: could not get message type: %m");
520 } else if (!IN_SET(type
, RTM_NEWADDR
, RTM_DELADDR
)) {
521 log_warning("rtnl: received unexpected message type when processing address");
525 r
= sd_rtnl_message_addr_get_ifindex(message
, &ifindex
);
527 log_warning_errno(r
, "rtnl: could not get ifindex from address: %m");
529 } else if (ifindex
<= 0) {
530 log_warning("rtnl: received address message with invalid ifindex: %d", ifindex
);
533 r
= link_get(m
, ifindex
, &link
);
534 if (r
< 0 || !link
) {
535 /* when enumerating we might be out of sync, but we will
536 * get the address again, so just ignore it */
538 log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex
);
543 r
= sd_rtnl_message_addr_get_family(message
, &family
);
544 if (r
< 0 || !IN_SET(family
, AF_INET
, AF_INET6
)) {
545 log_link_warning(link
, "rtnl: received address with invalid family, ignoring.");
549 r
= sd_rtnl_message_addr_get_prefixlen(message
, &prefixlen
);
551 log_link_warning_errno(link
, r
, "rtnl: received address with invalid prefixlen, ignoring: %m");
555 r
= sd_rtnl_message_addr_get_scope(message
, &scope
);
557 log_link_warning_errno(link
, r
, "rtnl: received address with invalid scope, ignoring: %m");
561 r
= sd_rtnl_message_addr_get_flags(message
, &flags
);
563 log_link_warning_errno(link
, r
, "rtnl: received address with invalid flags, ignoring: %m");
569 r
= sd_netlink_message_read_in_addr(message
, IFA_LOCAL
, &in_addr
.in
);
571 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
578 r
= sd_netlink_message_read_in6_addr(message
, IFA_ADDRESS
, &in_addr
.in6
);
580 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
587 log_link_debug(link
, "rtnl: ignoring unsupported address family: %d", family
);
590 if (!inet_ntop(family
, &in_addr
, buf
, INET6_ADDRSTRLEN
)) {
591 log_link_warning(link
, "Could not print address");
595 r
= sd_netlink_message_read_cache_info(message
, IFA_CACHEINFO
, &cinfo
);
597 if (cinfo
.ifa_valid
!= CACHE_INFO_INFINITY_LIFE_TIME
)
598 valid_str
= format_timespan(valid_buf
, FORMAT_TIMESPAN_MAX
,
599 cinfo
.ifa_valid
* USEC_PER_SEC
,
603 address_get(link
, family
, &in_addr
, prefixlen
, &address
);
608 log_link_debug(link
, "Updating address: %s/%u (valid %s%s)", buf
, prefixlen
,
609 valid_str
? "for " : "forever", valid_str
?: "");
611 /* An address appeared that we did not request */
612 r
= address_add_foreign(link
, family
, &in_addr
, prefixlen
, &address
);
614 log_link_warning_errno(link
, r
, "Failed to add address %s/%u: %m", buf
, prefixlen
);
617 log_link_debug(link
, "Adding address: %s/%u (valid %s%s)", buf
, prefixlen
,
618 valid_str
? "for " : "forever", valid_str
?: "");
621 address_update(address
, flags
, scope
, &cinfo
);
628 log_link_debug(link
, "Removing address: %s/%u (valid %s%s)", buf
, prefixlen
,
629 valid_str
? "for " : "forever", valid_str
?: "");
630 address_drop(address
);
632 log_link_warning(link
, "Removing non-existent address: %s/%u (valid %s%s)", buf
, prefixlen
,
633 valid_str
? "for " : "forever", valid_str
?: "");
637 assert_not_reached("Received invalid RTNL message type");
643 static int manager_rtnl_process_link(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
644 Manager
*m
= userdata
;
646 NetDev
*netdev
= NULL
;
655 if (sd_netlink_message_is_error(message
)) {
656 r
= sd_netlink_message_get_errno(message
);
658 log_warning_errno(r
, "rtnl: Could not receive link: %m");
663 r
= sd_netlink_message_get_type(message
, &type
);
665 log_warning_errno(r
, "rtnl: Could not get message type: %m");
667 } else if (!IN_SET(type
, RTM_NEWLINK
, RTM_DELLINK
)) {
668 log_warning("rtnl: Received unexpected message type when processing link");
672 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
674 log_warning_errno(r
, "rtnl: Could not get ifindex from link: %m");
676 } else if (ifindex
<= 0) {
677 log_warning("rtnl: received link message with invalid ifindex: %d", ifindex
);
681 r
= sd_netlink_message_read_string(message
, IFLA_IFNAME
, &name
);
683 log_warning_errno(r
, "rtnl: Received link message without ifname: %m");
687 (void) link_get(m
, ifindex
, &link
);
688 (void) netdev_get(m
, name
, &netdev
);
693 /* link is new, so add it */
694 r
= link_add(m
, message
, &link
);
696 log_warning_errno(r
, "Could not add new link: %m");
702 /* netdev exists, so make sure the ifindex matches */
703 r
= netdev_set_ifindex(netdev
, message
);
705 log_warning_errno(r
, "Could not set ifindex on netdev: %m");
710 r
= link_update(link
, message
);
723 assert_not_reached("Received invalid RTNL message type.");
729 int manager_rtnl_process_rule(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
730 uint8_t tos
= 0, to_prefixlen
= 0, from_prefixlen
= 0;
731 RoutingPolicyRule
*rule
= NULL
;
732 union in_addr_union to
, from
;
733 uint32_t fwmark
= 0, table
= 0;
734 Manager
*m
= userdata
;
744 if (sd_netlink_message_is_error(message
)) {
745 r
= sd_netlink_message_get_errno(message
);
747 log_warning_errno(r
, "rtnl: failed to receive rule: %m");
752 r
= sd_netlink_message_get_type(message
, &type
);
754 log_warning_errno(r
, "rtnl: could not get message type: %m");
756 } else if (!IN_SET(type
, RTM_NEWRULE
, RTM_DELRULE
)) {
757 log_warning("rtnl: received unexpected message type '%u' when processing rule.", type
);
761 r
= sd_rtnl_message_get_family(message
, &family
);
763 log_warning_errno(r
, "rtnl: could not get rule family: %m");
765 } else if (!IN_SET(family
, AF_INET
, AF_INET6
)) {
766 log_debug("rtnl: received address with invalid family %u, ignoring.", family
);
772 r
= sd_netlink_message_read_in_addr(message
, FRA_SRC
, &from
.in
);
774 r
= sd_rtnl_message_routing_policy_rule_get_rtm_src_prefixlen(message
, &from_prefixlen
);
776 log_warning_errno(r
, "rtnl: failed to retrive rule from prefix length: %m");
779 r
= sd_netlink_message_read_in_addr(message
, FRA_DST
, &to
.in
);
781 r
= sd_rtnl_message_routing_policy_rule_get_rtm_dst_prefixlen(message
, &to_prefixlen
);
783 log_warning_errno(r
, "rtnl: failed to retrive rule to prefix length: %m");
789 r
= sd_netlink_message_read_in6_addr(message
, FRA_SRC
, &from
.in6
);
791 r
= sd_rtnl_message_routing_policy_rule_get_rtm_src_prefixlen(message
, &from_prefixlen
);
793 log_warning_errno(r
, "rtnl: failed to retrive rule from prefix length: %m");
796 r
= sd_netlink_message_read_in6_addr(message
, FRA_DST
, &to
.in6
);
798 r
= sd_rtnl_message_routing_policy_rule_get_rtm_dst_prefixlen(message
, &to_prefixlen
);
800 log_warning_errno(r
, "rtnl: failed to retrive rule to prefix length: %m");
806 assert_not_reached("Received unsupported address family");
809 if (from_prefixlen
== 0 && to_prefixlen
== 0)
812 (void) sd_netlink_message_read_u32(message
, FRA_FWMARK
, &fwmark
);
813 (void) sd_netlink_message_read_u32(message
, FRA_TABLE
, &table
);
814 (void) sd_rtnl_message_routing_policy_rule_get_tos(message
, &tos
);
815 (void) sd_netlink_message_read_string(message
, FRA_IIFNAME
, (const char **) &iif
);
816 (void) sd_netlink_message_read_string(message
, FRA_OIFNAME
, (const char **) &oif
);
818 (void) routing_policy_rule_get(m
, family
, &from
, from_prefixlen
, &to
, to_prefixlen
, tos
, fwmark
, table
, iif
, oif
, &rule
);
823 r
= routing_policy_rule_add_foreign(m
, family
, &from
, from_prefixlen
, &to
, to_prefixlen
, tos
, fwmark
, table
, iif
, oif
, &rule
);
825 log_warning_errno(r
, "Could not add rule: %m");
831 routing_policy_rule_free(rule
);
836 assert_not_reached("Received invalid RTNL message type");
842 static int systemd_netlink_fd(void) {
843 int n
, fd
, rtnl_fd
= -EINVAL
;
845 n
= sd_listen_fds(true);
849 for (fd
= SD_LISTEN_FDS_START
; fd
< SD_LISTEN_FDS_START
+ n
; fd
++) {
850 if (sd_is_socket(fd
, AF_NETLINK
, SOCK_RAW
, -1) > 0) {
861 static int manager_connect_rtnl(Manager
*m
) {
866 fd
= systemd_netlink_fd();
868 r
= sd_netlink_open(&m
->rtnl
);
870 r
= sd_netlink_open_fd(&m
->rtnl
, fd
);
874 r
= sd_netlink_inc_rcvbuf(m
->rtnl
, RCVBUF_SIZE
);
878 r
= sd_netlink_attach_event(m
->rtnl
, m
->event
, 0);
882 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWLINK
, &manager_rtnl_process_link
, m
);
886 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELLINK
, &manager_rtnl_process_link
, m
);
890 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWADDR
, &manager_rtnl_process_address
, m
);
894 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELADDR
, &manager_rtnl_process_address
, m
);
898 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWROUTE
, &manager_rtnl_process_route
, m
);
902 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELROUTE
, &manager_rtnl_process_route
, m
);
906 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWRULE
, &manager_rtnl_process_rule
, m
);
910 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELRULE
, &manager_rtnl_process_rule
, m
);
917 static int ordered_set_put_in_addr_data(OrderedSet
*s
, const struct in_addr_data
*address
) {
924 r
= in_addr_to_string(address
->family
, &address
->address
, &p
);
928 r
= ordered_set_consume(s
, p
);
935 static int ordered_set_put_in_addr_datav(OrderedSet
*s
, const struct in_addr_data
*addresses
, unsigned n
) {
940 assert(addresses
|| n
== 0);
942 for (i
= 0; i
< n
; i
++) {
943 r
= ordered_set_put_in_addr_data(s
, addresses
+i
);
953 static int ordered_set_put_in4_addr(OrderedSet
*s
, const struct in_addr
*address
) {
960 r
= in_addr_to_string(AF_INET
, (const union in_addr_union
*) address
, &p
);
964 r
= ordered_set_consume(s
, p
);
971 static int ordered_set_put_in4_addrv(OrderedSet
*s
, const struct in_addr
*addresses
, unsigned n
) {
976 assert(n
== 0 || addresses
);
978 for (i
= 0; i
< n
; i
++) {
979 r
= ordered_set_put_in4_addr(s
, addresses
+i
);
989 static void print_string_set(FILE *f
, const char *field
, OrderedSet
*s
) {
994 if (ordered_set_isempty(s
))
997 fputs_unlocked(field
, f
);
999 ORDERED_SET_FOREACH(p
, s
, i
)
1000 fputs_with_space(f
, p
, NULL
, &space
);
1002 fputc_unlocked('\n', f
);
1005 static int manager_save(Manager
*m
) {
1006 _cleanup_ordered_set_free_free_ OrderedSet
*dns
= NULL
, *ntp
= NULL
, *search_domains
= NULL
, *route_domains
= NULL
;
1007 RoutingPolicyRule
*rule
= NULL
;
1011 _cleanup_free_
char *temp_path
= NULL
;
1012 _cleanup_fclose_
FILE *f
= NULL
;
1013 LinkOperationalState operstate
= LINK_OPERSTATE_OFF
;
1014 const char *operstate_str
;
1018 assert(m
->state_file
);
1020 /* We add all NTP and DNS server to a set, to filter out duplicates */
1021 dns
= ordered_set_new(&string_hash_ops
);
1025 ntp
= ordered_set_new(&string_hash_ops
);
1029 search_domains
= ordered_set_new(&dns_name_hash_ops
);
1030 if (!search_domains
)
1033 route_domains
= ordered_set_new(&dns_name_hash_ops
);
1037 HASHMAP_FOREACH(link
, m
->links
, i
) {
1038 if (link
->flags
& IFF_LOOPBACK
)
1041 if (link
->operstate
> operstate
)
1042 operstate
= link
->operstate
;
1047 /* First add the static configured entries */
1048 r
= ordered_set_put_in_addr_datav(dns
, link
->network
->dns
, link
->network
->n_dns
);
1052 r
= ordered_set_put_strdupv(ntp
, link
->network
->ntp
);
1056 r
= ordered_set_put_strdupv(search_domains
, link
->network
->search_domains
);
1060 r
= ordered_set_put_strdupv(route_domains
, link
->network
->route_domains
);
1064 if (!link
->dhcp_lease
)
1067 /* Secondly, add the entries acquired via DHCP */
1068 if (link
->network
->dhcp_use_dns
) {
1069 const struct in_addr
*addresses
;
1071 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
1073 r
= ordered_set_put_in4_addrv(dns
, addresses
, r
);
1076 } else if (r
< 0 && r
!= -ENODATA
)
1080 if (link
->network
->dhcp_use_ntp
) {
1081 const struct in_addr
*addresses
;
1083 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
1085 r
= ordered_set_put_in4_addrv(ntp
, addresses
, r
);
1088 } else if (r
< 0 && r
!= -ENODATA
)
1092 if (link
->network
->dhcp_use_domains
!= DHCP_USE_DOMAINS_NO
) {
1093 const char *domainname
;
1094 char **domains
= NULL
;
1096 OrderedSet
*target_domains
= (link
->network
->dhcp_use_domains
== DHCP_USE_DOMAINS_YES
) ? search_domains
: route_domains
;
1097 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
1099 r
= ordered_set_put_strdup(target_domains
, domainname
);
1102 } else if (r
!= -ENODATA
)
1105 r
= sd_dhcp_lease_get_search_domains(link
->dhcp_lease
, &domains
);
1107 r
= ordered_set_put_strdupv(target_domains
, domains
);
1110 } else if (r
!= -ENODATA
)
1115 operstate_str
= link_operstate_to_string(operstate
);
1116 assert(operstate_str
);
1118 r
= fopen_temporary(m
->state_file
, &f
, &temp_path
);
1122 (void) fchmod(fileno(f
), 0644);
1125 "# This is private data. Do not parse.\n"
1126 "OPER_STATE=%s\n", operstate_str
);
1128 print_string_set(f
, "DNS=", dns
);
1129 print_string_set(f
, "NTP=", ntp
);
1130 print_string_set(f
, "DOMAINS=", search_domains
);
1131 print_string_set(f
, "ROUTE_DOMAINS=", route_domains
);
1133 SET_FOREACH(rule
, m
->rules
, i
) {
1134 _cleanup_free_
char *from_str
= NULL
, *to_str
= NULL
;
1137 if (!in_addr_is_null(rule
->family
, &rule
->from
)) {
1138 r
= in_addr_to_string(rule
->family
, &rule
->from
, &from_str
);
1143 if (!in_addr_is_null(rule
->family
, &rule
->to
)) {
1144 r
= in_addr_to_string(rule
->family
, &rule
->to
, &to_str
);
1149 fprintf(f
, "from=%s%s/%hhu to=%s%s/%hhu tos=%hhu fwmark=%"PRIu32
"/%"PRIu32
" table=%"PRIu32
,
1150 space
? " " : "", from_str
, rule
->from_prefixlen
,
1151 space
? " " : "", to_str
, rule
->to_prefixlen
,
1153 rule
->fwmark
, rule
->fwmask
,
1159 r
= fflush_and_check(f
);
1163 if (rename(temp_path
, m
->state_file
) < 0) {
1168 if (m
->operational_state
!= operstate
) {
1169 m
->operational_state
= operstate
;
1170 r
= manager_send_changed(m
, "OperationalState", NULL
);
1172 log_error_errno(r
, "Could not emit changed OperationalState: %m");
1180 (void) unlink(m
->state_file
);
1181 (void) unlink(temp_path
);
1183 return log_error_errno(r
, "Failed to save network state to %s: %m", m
->state_file
);
1186 static int manager_dirty_handler(sd_event_source
*s
, void *userdata
) {
1187 Manager
*m
= userdata
;
1197 SET_FOREACH(link
, m
->dirty_links
, i
) {
1198 r
= link_save(link
);
1206 int manager_new(Manager
**ret
, sd_event
*event
) {
1207 _cleanup_manager_free_ Manager
*m
= NULL
;
1210 m
= new0(Manager
, 1);
1214 m
->state_file
= strdup("/run/systemd/netif/state");
1218 m
->event
= sd_event_ref(event
);
1220 r
= sd_event_add_post(m
->event
, NULL
, manager_dirty_handler
, m
);
1224 r
= manager_connect_rtnl(m
);
1228 r
= manager_connect_udev(m
);
1232 m
->netdevs
= hashmap_new(&string_hash_ops
);
1236 LIST_HEAD_INIT(m
->networks
);
1238 r
= setup_default_address_pool(m
);
1242 m
->duid
.type
= DUID_TYPE_EN
;
1244 (void) routing_policy_rule_load(m
);
1252 void manager_free(Manager
*m
) {
1253 RoutingPolicyRule
*rule
;
1262 free(m
->state_file
);
1264 while ((network
= m
->networks
))
1265 network_free(network
);
1267 while ((link
= hashmap_first(m
->links
)))
1269 hashmap_free(m
->links
);
1271 hashmap_free(m
->networks_by_name
);
1273 while ((netdev
= hashmap_first(m
->netdevs
)))
1274 netdev_unref(netdev
);
1275 hashmap_free(m
->netdevs
);
1277 while ((pool
= m
->address_pools
))
1278 address_pool_free(pool
);
1281 set_free(m
->rules_foreign
);
1283 while ((rule
= set_steal_first(m
->rules_saved
)))
1286 set_free(m
->rules_saved
);
1288 sd_netlink_unref(m
->rtnl
);
1289 sd_event_unref(m
->event
);
1291 sd_event_source_unref(m
->udev_event_source
);
1292 udev_monitor_unref(m
->udev_monitor
);
1293 udev_unref(m
->udev
);
1295 sd_bus_unref(m
->bus
);
1296 sd_bus_slot_unref(m
->prepare_for_sleep_slot
);
1297 sd_event_source_unref(m
->bus_retry_event_source
);
1299 free(m
->dynamic_timezone
);
1300 free(m
->dynamic_hostname
);
1305 int manager_start(Manager
*m
) {
1311 /* The dirty handler will deal with future serialization, but the first one
1312 must be done explicitly. */
1316 HASHMAP_FOREACH(link
, m
->links
, i
)
1322 int manager_load_config(Manager
*m
) {
1325 /* update timestamp */
1326 paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, true);
1332 r
= network_load(m
);
1339 bool manager_should_reload(Manager
*m
) {
1340 return paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, false);
1343 int manager_rtnl_enumerate_links(Manager
*m
) {
1344 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1345 sd_netlink_message
*link
;
1351 r
= sd_rtnl_message_new_link(m
->rtnl
, &req
, RTM_GETLINK
, 0);
1355 r
= sd_netlink_message_request_dump(req
, true);
1359 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1363 for (link
= reply
; link
; link
= sd_netlink_message_next(link
)) {
1366 m
->enumerating
= true;
1368 k
= manager_rtnl_process_link(m
->rtnl
, link
, m
);
1372 m
->enumerating
= false;
1378 int manager_rtnl_enumerate_addresses(Manager
*m
) {
1379 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1380 sd_netlink_message
*addr
;
1386 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, 0, 0);
1390 r
= sd_netlink_message_request_dump(req
, true);
1394 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1398 for (addr
= reply
; addr
; addr
= sd_netlink_message_next(addr
)) {
1401 m
->enumerating
= true;
1403 k
= manager_rtnl_process_address(m
->rtnl
, addr
, m
);
1407 m
->enumerating
= false;
1413 int manager_rtnl_enumerate_routes(Manager
*m
) {
1414 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1415 sd_netlink_message
*route
;
1421 r
= sd_rtnl_message_new_route(m
->rtnl
, &req
, RTM_GETROUTE
, 0, 0);
1425 r
= sd_netlink_message_request_dump(req
, true);
1429 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1433 for (route
= reply
; route
; route
= sd_netlink_message_next(route
)) {
1436 m
->enumerating
= true;
1438 k
= manager_rtnl_process_route(m
->rtnl
, route
, m
);
1442 m
->enumerating
= false;
1448 int manager_rtnl_enumerate_rules(Manager
*m
) {
1449 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1450 sd_netlink_message
*rule
;
1456 r
= sd_rtnl_message_new_routing_policy_rule(m
->rtnl
, &req
, RTM_GETRULE
, 0);
1460 r
= sd_netlink_message_request_dump(req
, true);
1464 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1466 if (r
== -EOPNOTSUPP
) {
1467 log_debug("FIB Rules are not supported by the kernel. Ignoring.");
1474 for (rule
= reply
; rule
; rule
= sd_netlink_message_next(rule
)) {
1477 m
->enumerating
= true;
1479 k
= manager_rtnl_process_rule(m
->rtnl
, rule
, m
);
1483 m
->enumerating
= false;
1489 int manager_address_pool_acquire(Manager
*m
, int family
, unsigned prefixlen
, union in_addr_union
*found
) {
1494 assert(prefixlen
> 0);
1497 LIST_FOREACH(address_pools
, p
, m
->address_pools
) {
1498 if (p
->family
!= family
)
1501 r
= address_pool_acquire(p
, prefixlen
, found
);
1509 Link
* manager_find_uplink(Manager
*m
, Link
*exclude
) {
1510 _cleanup_free_
struct local_address
*gateways
= NULL
;
1515 /* Looks for a suitable "uplink", via black magic: an
1516 * interface that is up and where the default route with the
1517 * highest priority points to. */
1519 n
= local_gateways(m
->rtnl
, 0, AF_UNSPEC
, &gateways
);
1521 log_warning_errno(n
, "Failed to determine list of default gateways: %m");
1525 for (i
= 0; i
< n
; i
++) {
1528 link
= hashmap_get(m
->links
, INT_TO_PTR(gateways
[i
].ifindex
));
1530 log_debug("Weird, found a gateway for a link we don't know. Ignoring.");
1534 if (link
== exclude
)
1537 if (link
->operstate
< LINK_OPERSTATE_ROUTABLE
)
1546 void manager_dirty(Manager
*manager
) {
1549 /* the serialized state in /run is no longer up-to-date */
1550 manager
->dirty
= true;
1553 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1554 Manager
*manager
= userdata
;
1555 const sd_bus_error
*e
;
1560 e
= sd_bus_message_get_error(m
);
1562 log_warning_errno(sd_bus_error_get_errno(e
), "Could not set hostname: %s", e
->message
);
1567 int manager_set_hostname(Manager
*m
, const char *hostname
) {
1570 log_debug("Setting transient hostname: '%s'", strna(hostname
));
1571 if (free_and_strdup(&m
->dynamic_hostname
, hostname
) < 0)
1575 /* TODO: replace by assert when we can rely on kdbus */
1576 log_info("Not connected to system bus, ignoring transient hostname.");
1580 r
= sd_bus_call_method_async(
1583 "org.freedesktop.hostname1",
1584 "/org/freedesktop/hostname1",
1585 "org.freedesktop.hostname1",
1587 set_hostname_handler
,
1594 return log_error_errno(r
, "Could not set transient hostname: %m");
1599 static int set_timezone_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1600 Manager
*manager
= userdata
;
1601 const sd_bus_error
*e
;
1606 e
= sd_bus_message_get_error(m
);
1608 log_warning_errno(sd_bus_error_get_errno(e
), "Could not set timezone: %s", e
->message
);
1613 int manager_set_timezone(Manager
*m
, const char *tz
) {
1619 log_debug("Setting system timezone: '%s'", tz
);
1620 if (free_and_strdup(&m
->dynamic_timezone
, tz
) < 0)
1624 log_info("Not connected to system bus, ignoring timezone.");
1628 r
= sd_bus_call_method_async(
1631 "org.freedesktop.timedate1",
1632 "/org/freedesktop/timedate1",
1633 "org.freedesktop.timedate1",
1635 set_timezone_handler
,
1641 return log_error_errno(r
, "Could not set timezone: %m");