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", strempty(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", strempty(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", strempty(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", strempty(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
;
1009 _cleanup_free_
char *temp_path
= NULL
;
1010 _cleanup_fclose_
FILE *f
= NULL
;
1011 LinkOperationalState operstate
= LINK_OPERSTATE_OFF
;
1012 const char *operstate_str
;
1016 assert(m
->state_file
);
1018 /* We add all NTP and DNS server to a set, to filter out duplicates */
1019 dns
= ordered_set_new(&string_hash_ops
);
1023 ntp
= ordered_set_new(&string_hash_ops
);
1027 search_domains
= ordered_set_new(&dns_name_hash_ops
);
1028 if (!search_domains
)
1031 route_domains
= ordered_set_new(&dns_name_hash_ops
);
1035 HASHMAP_FOREACH(link
, m
->links
, i
) {
1036 if (link
->flags
& IFF_LOOPBACK
)
1039 if (link
->operstate
> operstate
)
1040 operstate
= link
->operstate
;
1045 /* First add the static configured entries */
1046 r
= ordered_set_put_in_addr_datav(dns
, link
->network
->dns
, link
->network
->n_dns
);
1050 r
= ordered_set_put_strdupv(ntp
, link
->network
->ntp
);
1054 r
= ordered_set_put_strdupv(search_domains
, link
->network
->search_domains
);
1058 r
= ordered_set_put_strdupv(route_domains
, link
->network
->route_domains
);
1062 if (!link
->dhcp_lease
)
1065 /* Secondly, add the entries acquired via DHCP */
1066 if (link
->network
->dhcp_use_dns
) {
1067 const struct in_addr
*addresses
;
1069 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
1071 r
= ordered_set_put_in4_addrv(dns
, addresses
, r
);
1074 } else if (r
< 0 && r
!= -ENODATA
)
1078 if (link
->network
->dhcp_use_ntp
) {
1079 const struct in_addr
*addresses
;
1081 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
1083 r
= ordered_set_put_in4_addrv(ntp
, addresses
, r
);
1086 } else if (r
< 0 && r
!= -ENODATA
)
1090 if (link
->network
->dhcp_use_domains
!= DHCP_USE_DOMAINS_NO
) {
1091 const char *domainname
;
1092 char **domains
= NULL
;
1094 OrderedSet
*target_domains
= (link
->network
->dhcp_use_domains
== DHCP_USE_DOMAINS_YES
) ? search_domains
: route_domains
;
1095 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
1097 r
= ordered_set_put_strdup(target_domains
, domainname
);
1100 } else if (r
!= -ENODATA
)
1103 r
= sd_dhcp_lease_get_search_domains(link
->dhcp_lease
, &domains
);
1105 r
= ordered_set_put_strdupv(target_domains
, domains
);
1108 } else if (r
!= -ENODATA
)
1113 operstate_str
= link_operstate_to_string(operstate
);
1114 assert(operstate_str
);
1116 r
= fopen_temporary(m
->state_file
, &f
, &temp_path
);
1120 (void) fchmod(fileno(f
), 0644);
1123 "# This is private data. Do not parse.\n"
1124 "OPER_STATE=%s\n", operstate_str
);
1126 print_string_set(f
, "DNS=", dns
);
1127 print_string_set(f
, "NTP=", ntp
);
1128 print_string_set(f
, "DOMAINS=", search_domains
);
1129 print_string_set(f
, "ROUTE_DOMAINS=", route_domains
);
1131 r
= routing_policy_serialize_rules(m
->rules
, f
);
1135 r
= fflush_and_check(f
);
1139 if (rename(temp_path
, m
->state_file
) < 0) {
1144 if (m
->operational_state
!= operstate
) {
1145 m
->operational_state
= operstate
;
1146 r
= manager_send_changed(m
, "OperationalState", NULL
);
1148 log_error_errno(r
, "Could not emit changed OperationalState: %m");
1156 (void) unlink(m
->state_file
);
1157 (void) unlink(temp_path
);
1159 return log_error_errno(r
, "Failed to save network state to %s: %m", m
->state_file
);
1162 static int manager_dirty_handler(sd_event_source
*s
, void *userdata
) {
1163 Manager
*m
= userdata
;
1173 SET_FOREACH(link
, m
->dirty_links
, i
) {
1174 r
= link_save(link
);
1182 int manager_new(Manager
**ret
, sd_event
*event
) {
1183 _cleanup_manager_free_ Manager
*m
= NULL
;
1186 m
= new0(Manager
, 1);
1190 m
->state_file
= strdup("/run/systemd/netif/state");
1194 m
->event
= sd_event_ref(event
);
1196 r
= sd_event_add_post(m
->event
, NULL
, manager_dirty_handler
, m
);
1200 r
= manager_connect_rtnl(m
);
1204 r
= manager_connect_udev(m
);
1208 m
->netdevs
= hashmap_new(&string_hash_ops
);
1212 LIST_HEAD_INIT(m
->networks
);
1214 r
= setup_default_address_pool(m
);
1218 m
->duid
.type
= DUID_TYPE_EN
;
1220 (void) routing_policy_load_rules(m
->state_file
, &m
->rules_saved
);
1228 void manager_free(Manager
*m
) {
1229 RoutingPolicyRule
*rule
;
1238 free(m
->state_file
);
1240 while ((network
= m
->networks
))
1241 network_free(network
);
1243 while ((link
= hashmap_first(m
->links
)))
1245 hashmap_free(m
->links
);
1247 hashmap_free(m
->networks_by_name
);
1249 while ((netdev
= hashmap_first(m
->netdevs
)))
1250 netdev_unref(netdev
);
1251 hashmap_free(m
->netdevs
);
1253 while ((pool
= m
->address_pools
))
1254 address_pool_free(pool
);
1257 set_free(m
->rules_foreign
);
1259 while ((rule
= set_steal_first(m
->rules_saved
)))
1262 set_free(m
->rules_saved
);
1264 sd_netlink_unref(m
->rtnl
);
1265 sd_event_unref(m
->event
);
1267 sd_event_source_unref(m
->udev_event_source
);
1268 udev_monitor_unref(m
->udev_monitor
);
1269 udev_unref(m
->udev
);
1271 sd_bus_unref(m
->bus
);
1272 sd_bus_slot_unref(m
->prepare_for_sleep_slot
);
1273 sd_event_source_unref(m
->bus_retry_event_source
);
1275 free(m
->dynamic_timezone
);
1276 free(m
->dynamic_hostname
);
1281 int manager_start(Manager
*m
) {
1287 /* The dirty handler will deal with future serialization, but the first one
1288 must be done explicitly. */
1292 HASHMAP_FOREACH(link
, m
->links
, i
)
1298 int manager_load_config(Manager
*m
) {
1301 /* update timestamp */
1302 paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, true);
1308 r
= network_load(m
);
1315 bool manager_should_reload(Manager
*m
) {
1316 return paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, false);
1319 int manager_rtnl_enumerate_links(Manager
*m
) {
1320 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1321 sd_netlink_message
*link
;
1327 r
= sd_rtnl_message_new_link(m
->rtnl
, &req
, RTM_GETLINK
, 0);
1331 r
= sd_netlink_message_request_dump(req
, true);
1335 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1339 for (link
= reply
; link
; link
= sd_netlink_message_next(link
)) {
1342 m
->enumerating
= true;
1344 k
= manager_rtnl_process_link(m
->rtnl
, link
, m
);
1348 m
->enumerating
= false;
1354 int manager_rtnl_enumerate_addresses(Manager
*m
) {
1355 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1356 sd_netlink_message
*addr
;
1362 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, 0, 0);
1366 r
= sd_netlink_message_request_dump(req
, true);
1370 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1374 for (addr
= reply
; addr
; addr
= sd_netlink_message_next(addr
)) {
1377 m
->enumerating
= true;
1379 k
= manager_rtnl_process_address(m
->rtnl
, addr
, m
);
1383 m
->enumerating
= false;
1389 int manager_rtnl_enumerate_routes(Manager
*m
) {
1390 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1391 sd_netlink_message
*route
;
1397 r
= sd_rtnl_message_new_route(m
->rtnl
, &req
, RTM_GETROUTE
, 0, 0);
1401 r
= sd_netlink_message_request_dump(req
, true);
1405 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1409 for (route
= reply
; route
; route
= sd_netlink_message_next(route
)) {
1412 m
->enumerating
= true;
1414 k
= manager_rtnl_process_route(m
->rtnl
, route
, m
);
1418 m
->enumerating
= false;
1424 int manager_rtnl_enumerate_rules(Manager
*m
) {
1425 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1426 sd_netlink_message
*rule
;
1432 r
= sd_rtnl_message_new_routing_policy_rule(m
->rtnl
, &req
, RTM_GETRULE
, 0);
1436 r
= sd_netlink_message_request_dump(req
, true);
1440 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1442 if (r
== -EOPNOTSUPP
) {
1443 log_debug("FIB Rules are not supported by the kernel. Ignoring.");
1450 for (rule
= reply
; rule
; rule
= sd_netlink_message_next(rule
)) {
1453 m
->enumerating
= true;
1455 k
= manager_rtnl_process_rule(m
->rtnl
, rule
, m
);
1459 m
->enumerating
= false;
1465 int manager_address_pool_acquire(Manager
*m
, int family
, unsigned prefixlen
, union in_addr_union
*found
) {
1470 assert(prefixlen
> 0);
1473 LIST_FOREACH(address_pools
, p
, m
->address_pools
) {
1474 if (p
->family
!= family
)
1477 r
= address_pool_acquire(p
, prefixlen
, found
);
1485 Link
* manager_find_uplink(Manager
*m
, Link
*exclude
) {
1486 _cleanup_free_
struct local_address
*gateways
= NULL
;
1491 /* Looks for a suitable "uplink", via black magic: an
1492 * interface that is up and where the default route with the
1493 * highest priority points to. */
1495 n
= local_gateways(m
->rtnl
, 0, AF_UNSPEC
, &gateways
);
1497 log_warning_errno(n
, "Failed to determine list of default gateways: %m");
1501 for (i
= 0; i
< n
; i
++) {
1504 link
= hashmap_get(m
->links
, INT_TO_PTR(gateways
[i
].ifindex
));
1506 log_debug("Weird, found a gateway for a link we don't know. Ignoring.");
1510 if (link
== exclude
)
1513 if (link
->operstate
< LINK_OPERSTATE_ROUTABLE
)
1522 void manager_dirty(Manager
*manager
) {
1525 /* the serialized state in /run is no longer up-to-date */
1526 manager
->dirty
= true;
1529 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1530 Manager
*manager
= userdata
;
1531 const sd_bus_error
*e
;
1536 e
= sd_bus_message_get_error(m
);
1538 log_warning_errno(sd_bus_error_get_errno(e
), "Could not set hostname: %s", e
->message
);
1543 int manager_set_hostname(Manager
*m
, const char *hostname
) {
1546 log_debug("Setting transient hostname: '%s'", strna(hostname
));
1547 if (free_and_strdup(&m
->dynamic_hostname
, hostname
) < 0)
1551 /* TODO: replace by assert when we can rely on kdbus */
1552 log_info("Not connected to system bus, ignoring transient hostname.");
1556 r
= sd_bus_call_method_async(
1559 "org.freedesktop.hostname1",
1560 "/org/freedesktop/hostname1",
1561 "org.freedesktop.hostname1",
1563 set_hostname_handler
,
1570 return log_error_errno(r
, "Could not set transient hostname: %m");
1575 static int set_timezone_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1576 Manager
*manager
= userdata
;
1577 const sd_bus_error
*e
;
1582 e
= sd_bus_message_get_error(m
);
1584 log_warning_errno(sd_bus_error_get_errno(e
), "Could not set timezone: %s", e
->message
);
1589 int manager_set_timezone(Manager
*m
, const char *tz
) {
1595 log_debug("Setting system timezone: '%s'", tz
);
1596 if (free_and_strdup(&m
->dynamic_timezone
, tz
) < 0)
1600 log_info("Not connected to system bus, ignoring timezone.");
1604 r
= sd_bus_call_method_async(
1607 "org.freedesktop.timedate1",
1608 "/org/freedesktop/timedate1",
1609 "org.freedesktop.timedate1",
1611 set_timezone_handler
,
1617 return log_error_errno(r
, "Could not set timezone: %m");