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
;
743 if (sd_netlink_message_is_error(message
)) {
744 r
= sd_netlink_message_get_errno(message
);
746 log_warning_errno(r
, "rtnl: failed to receive rule: %m");
751 r
= sd_netlink_message_get_type(message
, &type
);
753 log_warning_errno(r
, "rtnl: could not get message type: %m");
755 } else if (!IN_SET(type
, RTM_NEWRULE
, RTM_DELRULE
)) {
756 log_warning("rtnl: received unexpected message type '%u' when processing rule.", type
);
760 r
= sd_rtnl_message_get_family(message
, &family
);
762 log_warning_errno(r
, "rtnl: could not get rule family: %m");
764 } else if (!IN_SET(family
, AF_INET
, AF_INET6
)) {
765 log_debug("rtnl: received address with invalid family %u, ignoring.", family
);
771 r
= sd_netlink_message_read_in_addr(message
, FRA_SRC
, &from
.in
);
773 r
= sd_rtnl_message_routing_policy_rule_get_rtm_src_prefixlen(message
, &from_prefixlen
);
775 log_warning_errno(r
, "rtnl: failed to retrive rule from prefix length: %m");
778 r
= sd_netlink_message_read_in_addr(message
, FRA_DST
, &to
.in
);
780 r
= sd_rtnl_message_routing_policy_rule_get_rtm_dst_prefixlen(message
, &to_prefixlen
);
782 log_warning_errno(r
, "rtnl: failed to retrive rule to prefix length: %m");
788 r
= sd_netlink_message_read_in6_addr(message
, FRA_SRC
, &from
.in6
);
790 r
= sd_rtnl_message_routing_policy_rule_get_rtm_src_prefixlen(message
, &from_prefixlen
);
792 log_warning_errno(r
, "rtnl: failed to retrive rule from prefix length: %m");
795 r
= sd_netlink_message_read_in6_addr(message
, FRA_DST
, &to
.in6
);
797 r
= sd_rtnl_message_routing_policy_rule_get_rtm_dst_prefixlen(message
, &to_prefixlen
);
799 log_warning_errno(r
, "rtnl: failed to retrive rule to prefix length: %m");
805 assert_not_reached("Received unsupported address family");
808 if (from_prefixlen
== 0 && to_prefixlen
== 0)
811 (void) sd_netlink_message_read_u32(message
, FRA_FWMARK
, &fwmark
);
812 (void) sd_netlink_message_read_u32(message
, FRA_TABLE
, &table
);
813 (void) sd_rtnl_message_routing_policy_rule_get_tos(message
, &tos
);
815 (void) routing_policy_rule_get(m
, family
, &from
, from_prefixlen
, &to
, to_prefixlen
, tos
, fwmark
, table
, &rule
);
820 r
= routing_policy_rule_add_foreign(m
, family
, &from
, from_prefixlen
, &to
, to_prefixlen
, tos
, fwmark
, table
, &rule
);
822 log_warning_errno(r
, "Could not add rule: %m");
828 routing_policy_rule_free(rule
);
833 assert_not_reached("Received invalid RTNL message type");
839 static int systemd_netlink_fd(void) {
840 int n
, fd
, rtnl_fd
= -EINVAL
;
842 n
= sd_listen_fds(true);
846 for (fd
= SD_LISTEN_FDS_START
; fd
< SD_LISTEN_FDS_START
+ n
; fd
++) {
847 if (sd_is_socket(fd
, AF_NETLINK
, SOCK_RAW
, -1) > 0) {
858 static int manager_connect_rtnl(Manager
*m
) {
863 fd
= systemd_netlink_fd();
865 r
= sd_netlink_open(&m
->rtnl
);
867 r
= sd_netlink_open_fd(&m
->rtnl
, fd
);
871 r
= sd_netlink_inc_rcvbuf(m
->rtnl
, RCVBUF_SIZE
);
875 r
= sd_netlink_attach_event(m
->rtnl
, m
->event
, 0);
879 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWLINK
, &manager_rtnl_process_link
, m
);
883 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELLINK
, &manager_rtnl_process_link
, m
);
887 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWADDR
, &manager_rtnl_process_address
, m
);
891 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELADDR
, &manager_rtnl_process_address
, m
);
895 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWROUTE
, &manager_rtnl_process_route
, m
);
899 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELROUTE
, &manager_rtnl_process_route
, m
);
903 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWRULE
, &manager_rtnl_process_rule
, m
);
907 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELRULE
, &manager_rtnl_process_rule
, m
);
914 static int ordered_set_put_in_addr_data(OrderedSet
*s
, const struct in_addr_data
*address
) {
921 r
= in_addr_to_string(address
->family
, &address
->address
, &p
);
925 r
= ordered_set_consume(s
, p
);
932 static int ordered_set_put_in_addr_datav(OrderedSet
*s
, const struct in_addr_data
*addresses
, unsigned n
) {
937 assert(addresses
|| n
== 0);
939 for (i
= 0; i
< n
; i
++) {
940 r
= ordered_set_put_in_addr_data(s
, addresses
+i
);
950 static int ordered_set_put_in4_addr(OrderedSet
*s
, const struct in_addr
*address
) {
957 r
= in_addr_to_string(AF_INET
, (const union in_addr_union
*) address
, &p
);
961 r
= ordered_set_consume(s
, p
);
968 static int ordered_set_put_in4_addrv(OrderedSet
*s
, const struct in_addr
*addresses
, unsigned n
) {
973 assert(n
== 0 || addresses
);
975 for (i
= 0; i
< n
; i
++) {
976 r
= ordered_set_put_in4_addr(s
, addresses
+i
);
986 static void print_string_set(FILE *f
, const char *field
, OrderedSet
*s
) {
991 if (ordered_set_isempty(s
))
994 fputs_unlocked(field
, f
);
996 ORDERED_SET_FOREACH(p
, s
, i
)
997 fputs_with_space(f
, p
, NULL
, &space
);
999 fputc_unlocked('\n', f
);
1002 static int manager_save(Manager
*m
) {
1003 _cleanup_ordered_set_free_free_ OrderedSet
*dns
= NULL
, *ntp
= NULL
, *search_domains
= NULL
, *route_domains
= NULL
;
1004 RoutingPolicyRule
*rule
= NULL
;
1008 _cleanup_free_
char *temp_path
= NULL
;
1009 _cleanup_fclose_
FILE *f
= NULL
;
1010 LinkOperationalState operstate
= LINK_OPERSTATE_OFF
;
1011 const char *operstate_str
;
1015 assert(m
->state_file
);
1017 /* We add all NTP and DNS server to a set, to filter out duplicates */
1018 dns
= ordered_set_new(&string_hash_ops
);
1022 ntp
= ordered_set_new(&string_hash_ops
);
1026 search_domains
= ordered_set_new(&dns_name_hash_ops
);
1027 if (!search_domains
)
1030 route_domains
= ordered_set_new(&dns_name_hash_ops
);
1034 HASHMAP_FOREACH(link
, m
->links
, i
) {
1035 if (link
->flags
& IFF_LOOPBACK
)
1038 if (link
->operstate
> operstate
)
1039 operstate
= link
->operstate
;
1044 /* First add the static configured entries */
1045 r
= ordered_set_put_in_addr_datav(dns
, link
->network
->dns
, link
->network
->n_dns
);
1049 r
= ordered_set_put_strdupv(ntp
, link
->network
->ntp
);
1053 r
= ordered_set_put_strdupv(search_domains
, link
->network
->search_domains
);
1057 r
= ordered_set_put_strdupv(route_domains
, link
->network
->route_domains
);
1061 if (!link
->dhcp_lease
)
1064 /* Secondly, add the entries acquired via DHCP */
1065 if (link
->network
->dhcp_use_dns
) {
1066 const struct in_addr
*addresses
;
1068 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
1070 r
= ordered_set_put_in4_addrv(dns
, addresses
, r
);
1073 } else if (r
< 0 && r
!= -ENODATA
)
1077 if (link
->network
->dhcp_use_ntp
) {
1078 const struct in_addr
*addresses
;
1080 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
1082 r
= ordered_set_put_in4_addrv(ntp
, addresses
, r
);
1085 } else if (r
< 0 && r
!= -ENODATA
)
1089 if (link
->network
->dhcp_use_domains
!= DHCP_USE_DOMAINS_NO
) {
1090 const char *domainname
;
1091 char **domains
= NULL
;
1093 OrderedSet
*target_domains
= (link
->network
->dhcp_use_domains
== DHCP_USE_DOMAINS_YES
) ? search_domains
: route_domains
;
1094 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
1096 r
= ordered_set_put_strdup(target_domains
, domainname
);
1099 } else if (r
!= -ENODATA
)
1102 r
= sd_dhcp_lease_get_search_domains(link
->dhcp_lease
, &domains
);
1104 r
= ordered_set_put_strdupv(target_domains
, domains
);
1107 } else if (r
!= -ENODATA
)
1112 operstate_str
= link_operstate_to_string(operstate
);
1113 assert(operstate_str
);
1115 r
= fopen_temporary(m
->state_file
, &f
, &temp_path
);
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 SET_FOREACH(rule
, m
->rules
, i
) {
1131 _cleanup_free_
char *from_str
= NULL
, *to_str
= NULL
;
1134 if (!in_addr_is_null(rule
->family
, &rule
->from
)) {
1135 r
= in_addr_to_string(rule
->family
, &rule
->from
, &from_str
);
1140 if (!in_addr_is_null(rule
->family
, &rule
->to
)) {
1141 r
= in_addr_to_string(rule
->family
, &rule
->to
, &to_str
);
1146 fprintf(f
, "from=%s%s/%hhu to=%s%s/%hhu tos=%hhu fwmark=%"PRIu32
"/%"PRIu32
" table=%"PRIu32
,
1147 space
? " " : "", from_str
, rule
->from_prefixlen
,
1148 space
? " " : "", to_str
, rule
->to_prefixlen
,
1150 rule
->fwmark
, rule
->fwmask
,
1156 r
= fflush_and_check(f
);
1160 if (rename(temp_path
, m
->state_file
) < 0) {
1165 if (m
->operational_state
!= operstate
) {
1166 m
->operational_state
= operstate
;
1167 r
= manager_send_changed(m
, "OperationalState", NULL
);
1169 log_error_errno(r
, "Could not emit changed OperationalState: %m");
1177 (void) unlink(m
->state_file
);
1178 (void) unlink(temp_path
);
1180 return log_error_errno(r
, "Failed to save network state to %s: %m", m
->state_file
);
1183 static int manager_dirty_handler(sd_event_source
*s
, void *userdata
) {
1184 Manager
*m
= userdata
;
1194 SET_FOREACH(link
, m
->dirty_links
, i
) {
1195 r
= link_save(link
);
1203 int manager_new(Manager
**ret
, sd_event
*event
) {
1204 _cleanup_manager_free_ Manager
*m
= NULL
;
1207 m
= new0(Manager
, 1);
1211 m
->state_file
= strdup("/run/systemd/netif/state");
1215 m
->event
= sd_event_ref(event
);
1217 r
= sd_event_add_post(m
->event
, NULL
, manager_dirty_handler
, m
);
1221 r
= manager_connect_rtnl(m
);
1225 r
= manager_connect_udev(m
);
1229 m
->netdevs
= hashmap_new(&string_hash_ops
);
1233 LIST_HEAD_INIT(m
->networks
);
1235 r
= setup_default_address_pool(m
);
1239 m
->duid
.type
= DUID_TYPE_EN
;
1241 (void) routing_policy_rule_load(m
);
1249 void manager_free(Manager
*m
) {
1250 RoutingPolicyRule
*rule
;
1259 free(m
->state_file
);
1261 while ((network
= m
->networks
))
1262 network_free(network
);
1264 while ((link
= hashmap_first(m
->links
)))
1266 hashmap_free(m
->links
);
1268 hashmap_free(m
->networks_by_name
);
1270 while ((netdev
= hashmap_first(m
->netdevs
)))
1271 netdev_unref(netdev
);
1272 hashmap_free(m
->netdevs
);
1274 while ((pool
= m
->address_pools
))
1275 address_pool_free(pool
);
1278 set_free(m
->rules_foreign
);
1280 while ((rule
= set_steal_first(m
->rules_saved
)))
1283 set_free(m
->rules_saved
);
1285 sd_netlink_unref(m
->rtnl
);
1286 sd_event_unref(m
->event
);
1288 sd_event_source_unref(m
->udev_event_source
);
1289 udev_monitor_unref(m
->udev_monitor
);
1290 udev_unref(m
->udev
);
1292 sd_bus_unref(m
->bus
);
1293 sd_bus_slot_unref(m
->prepare_for_sleep_slot
);
1294 sd_event_source_unref(m
->bus_retry_event_source
);
1296 free(m
->dynamic_timezone
);
1297 free(m
->dynamic_hostname
);
1302 int manager_start(Manager
*m
) {
1308 /* The dirty handler will deal with future serialization, but the first one
1309 must be done explicitly. */
1313 HASHMAP_FOREACH(link
, m
->links
, i
)
1319 int manager_load_config(Manager
*m
) {
1322 /* update timestamp */
1323 paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, true);
1329 r
= network_load(m
);
1336 bool manager_should_reload(Manager
*m
) {
1337 return paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, false);
1340 int manager_rtnl_enumerate_links(Manager
*m
) {
1341 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1342 sd_netlink_message
*link
;
1348 r
= sd_rtnl_message_new_link(m
->rtnl
, &req
, RTM_GETLINK
, 0);
1352 r
= sd_netlink_message_request_dump(req
, true);
1356 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1360 for (link
= reply
; link
; link
= sd_netlink_message_next(link
)) {
1363 m
->enumerating
= true;
1365 k
= manager_rtnl_process_link(m
->rtnl
, link
, m
);
1369 m
->enumerating
= false;
1375 int manager_rtnl_enumerate_addresses(Manager
*m
) {
1376 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1377 sd_netlink_message
*addr
;
1383 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, 0, 0);
1387 r
= sd_netlink_message_request_dump(req
, true);
1391 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1395 for (addr
= reply
; addr
; addr
= sd_netlink_message_next(addr
)) {
1398 m
->enumerating
= true;
1400 k
= manager_rtnl_process_address(m
->rtnl
, addr
, m
);
1404 m
->enumerating
= false;
1410 int manager_rtnl_enumerate_routes(Manager
*m
) {
1411 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1412 sd_netlink_message
*route
;
1418 r
= sd_rtnl_message_new_route(m
->rtnl
, &req
, RTM_GETROUTE
, 0, 0);
1422 r
= sd_netlink_message_request_dump(req
, true);
1426 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1430 for (route
= reply
; route
; route
= sd_netlink_message_next(route
)) {
1433 m
->enumerating
= true;
1435 k
= manager_rtnl_process_route(m
->rtnl
, route
, m
);
1439 m
->enumerating
= false;
1445 int manager_rtnl_enumerate_rules(Manager
*m
) {
1446 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1447 sd_netlink_message
*rule
;
1453 r
= sd_rtnl_message_new_routing_policy_rule(m
->rtnl
, &req
, RTM_GETRULE
, 0);
1457 r
= sd_netlink_message_request_dump(req
, true);
1461 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1463 if (r
== -EOPNOTSUPP
) {
1464 log_debug("FIB Rules are not supported by the kernel. Ignoring.");
1471 for (rule
= reply
; rule
; rule
= sd_netlink_message_next(rule
)) {
1474 m
->enumerating
= true;
1476 k
= manager_rtnl_process_rule(m
->rtnl
, rule
, m
);
1480 m
->enumerating
= false;
1486 int manager_address_pool_acquire(Manager
*m
, int family
, unsigned prefixlen
, union in_addr_union
*found
) {
1491 assert(prefixlen
> 0);
1494 LIST_FOREACH(address_pools
, p
, m
->address_pools
) {
1495 if (p
->family
!= family
)
1498 r
= address_pool_acquire(p
, prefixlen
, found
);
1506 Link
* manager_find_uplink(Manager
*m
, Link
*exclude
) {
1507 _cleanup_free_
struct local_address
*gateways
= NULL
;
1512 /* Looks for a suitable "uplink", via black magic: an
1513 * interface that is up and where the default route with the
1514 * highest priority points to. */
1516 n
= local_gateways(m
->rtnl
, 0, AF_UNSPEC
, &gateways
);
1518 log_warning_errno(n
, "Failed to determine list of default gateways: %m");
1522 for (i
= 0; i
< n
; i
++) {
1525 link
= hashmap_get(m
->links
, INT_TO_PTR(gateways
[i
].ifindex
));
1527 log_debug("Weird, found a gateway for a link we don't know. Ignoring.");
1531 if (link
== exclude
)
1534 if (link
->operstate
< LINK_OPERSTATE_ROUTABLE
)
1543 void manager_dirty(Manager
*manager
) {
1546 /* the serialized state in /run is no longer up-to-date */
1547 manager
->dirty
= true;
1550 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1551 Manager
*manager
= userdata
;
1552 const sd_bus_error
*e
;
1557 e
= sd_bus_message_get_error(m
);
1559 log_warning_errno(sd_bus_error_get_errno(e
), "Could not set hostname: %s", e
->message
);
1564 int manager_set_hostname(Manager
*m
, const char *hostname
) {
1567 log_debug("Setting transient hostname: '%s'", strna(hostname
));
1568 if (free_and_strdup(&m
->dynamic_hostname
, hostname
) < 0)
1572 /* TODO: replace by assert when we can rely on kdbus */
1573 log_info("Not connected to system bus, ignoring transient hostname.");
1577 r
= sd_bus_call_method_async(
1580 "org.freedesktop.hostname1",
1581 "/org/freedesktop/hostname1",
1582 "org.freedesktop.hostname1",
1584 set_hostname_handler
,
1591 return log_error_errno(r
, "Could not set transient hostname: %m");
1596 static int set_timezone_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1597 Manager
*manager
= userdata
;
1598 const sd_bus_error
*e
;
1603 e
= sd_bus_message_get_error(m
);
1605 log_warning_errno(sd_bus_error_get_errno(e
), "Could not set timezone: %s", e
->message
);
1610 int manager_set_timezone(Manager
*m
, const char *tz
) {
1616 log_debug("Setting system timezone: '%s'", tz
);
1617 if (free_and_strdup(&m
->dynamic_timezone
, tz
) < 0)
1621 log_info("Not connected to system bus, ignoring timezone.");
1625 r
= sd_bus_call_method_async(
1628 "org.freedesktop.timedate1",
1629 "/org/freedesktop/timedate1",
1630 "org.freedesktop.timedate1",
1632 set_timezone_handler
,
1638 return log_error_errno(r
, "Could not set timezone: %m");