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");
154 r
= sd_bus_add_match(m
->bus
, &m
->prepare_for_sleep_slot
,
156 "sender='org.freedesktop.login1',"
157 "interface='org.freedesktop.login1.Manager',"
158 "member='PrepareForSleep',"
159 "path='/org/freedesktop/login1'",
160 match_prepare_for_sleep
,
163 return log_error_errno(r
, "Failed to add match for PrepareForSleep: %m");
165 r
= sd_bus_add_object_vtable(m
->bus
, NULL
, "/org/freedesktop/network1", "org.freedesktop.network1.Manager", manager_vtable
, m
);
167 return log_error_errno(r
, "Failed to add manager object vtable: %m");
169 r
= sd_bus_add_fallback_vtable(m
->bus
, NULL
, "/org/freedesktop/network1/link", "org.freedesktop.network1.Link", link_vtable
, link_object_find
, m
);
171 return log_error_errno(r
, "Failed to add link object vtable: %m");
173 r
= sd_bus_add_node_enumerator(m
->bus
, NULL
, "/org/freedesktop/network1/link", link_node_enumerator
, m
);
175 return log_error_errno(r
, "Failed to add link enumerator: %m");
177 r
= sd_bus_add_fallback_vtable(m
->bus
, NULL
, "/org/freedesktop/network1/network", "org.freedesktop.network1.Network", network_vtable
, network_object_find
, m
);
179 return log_error_errno(r
, "Failed to add network object vtable: %m");
181 r
= sd_bus_add_node_enumerator(m
->bus
, NULL
, "/org/freedesktop/network1/network", network_node_enumerator
, m
);
183 return log_error_errno(r
, "Failed to add network enumerator: %m");
185 r
= sd_bus_request_name(m
->bus
, "org.freedesktop.network1", 0);
187 return log_error_errno(r
, "Failed to register name: %m");
189 r
= sd_bus_attach_event(m
->bus
, m
->event
, 0);
191 return log_error_errno(r
, "Failed to attach bus to event loop: %m");
193 /* Did we get a timezone or transient hostname from DHCP while D-Bus wasn't up yet? */
194 if (m
->dynamic_hostname
) {
195 r
= manager_set_hostname(m
, m
->dynamic_hostname
);
199 if (m
->dynamic_timezone
) {
200 r
= manager_set_timezone(m
, m
->dynamic_timezone
);
208 static int manager_udev_process_link(Manager
*m
, struct udev_device
*device
) {
215 if (!streq_ptr(udev_device_get_action(device
), "add"))
218 ifindex
= udev_device_get_ifindex(device
);
220 log_debug("Ignoring udev ADD event for device with invalid ifindex");
224 r
= link_get(m
, ifindex
, &link
);
230 r
= link_initialized(link
, device
);
237 static int manager_dispatch_link_udev(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
238 Manager
*m
= userdata
;
239 struct udev_monitor
*monitor
= m
->udev_monitor
;
240 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
242 device
= udev_monitor_receive_device(monitor
);
246 manager_udev_process_link(m
, device
);
250 static int manager_connect_udev(Manager
*m
) {
253 /* udev does not initialize devices inside containers,
254 * so we rely on them being already initialized before
255 * entering the container */
256 if (detect_container() > 0)
259 m
->udev
= udev_new();
263 m
->udev_monitor
= udev_monitor_new_from_netlink(m
->udev
, "udev");
264 if (!m
->udev_monitor
)
267 r
= udev_monitor_filter_add_match_subsystem_devtype(m
->udev_monitor
, "net", NULL
);
269 return log_error_errno(r
, "Could not add udev monitor filter: %m");
271 r
= udev_monitor_enable_receiving(m
->udev_monitor
);
273 log_error("Could not enable udev monitor");
277 r
= sd_event_add_io(m
->event
,
278 &m
->udev_event_source
,
279 udev_monitor_get_fd(m
->udev_monitor
),
280 EPOLLIN
, manager_dispatch_link_udev
,
285 r
= sd_event_source_set_description(m
->udev_event_source
, "networkd-udev");
292 int manager_rtnl_process_route(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
293 Manager
*m
= userdata
;
296 uint32_t ifindex
, priority
= 0;
297 unsigned char protocol
, scope
, tos
, table
, rt_type
;
299 unsigned char dst_prefixlen
, src_prefixlen
;
300 union in_addr_union dst
= {}, gw
= {}, src
= {}, prefsrc
= {};
308 if (sd_netlink_message_is_error(message
)) {
309 r
= sd_netlink_message_get_errno(message
);
311 log_warning_errno(r
, "rtnl: failed to receive route: %m");
316 r
= sd_netlink_message_get_type(message
, &type
);
318 log_warning_errno(r
, "rtnl: could not get message type: %m");
320 } else if (!IN_SET(type
, RTM_NEWROUTE
, RTM_DELROUTE
)) {
321 log_warning("rtnl: received unexpected message type when processing route");
325 r
= sd_netlink_message_read_u32(message
, RTA_OIF
, &ifindex
);
327 log_debug("rtnl: received route without ifindex, ignoring");
330 log_warning_errno(r
, "rtnl: could not get ifindex from route, ignoring: %m");
332 } else if (ifindex
<= 0) {
333 log_warning("rtnl: received route message with invalid ifindex, ignoring: %d", ifindex
);
336 r
= link_get(m
, ifindex
, &link
);
337 if (r
< 0 || !link
) {
338 /* when enumerating we might be out of sync, but we will
339 * get the route again, so just ignore it */
341 log_warning("rtnl: received route for nonexistent link (%d), ignoring", ifindex
);
346 r
= sd_rtnl_message_route_get_family(message
, &family
);
347 if (r
< 0 || !IN_SET(family
, AF_INET
, AF_INET6
)) {
348 log_link_warning(link
, "rtnl: received address with invalid family, ignoring.");
352 r
= sd_rtnl_message_route_get_protocol(message
, &protocol
);
354 log_warning_errno(r
, "rtnl: could not get route protocol: %m");
360 r
= sd_netlink_message_read_in_addr(message
, RTA_DST
, &dst
.in
);
361 if (r
< 0 && r
!= -ENODATA
) {
362 log_link_warning_errno(link
, r
, "rtnl: received route without valid destination, ignoring: %m");
366 r
= sd_netlink_message_read_in_addr(message
, RTA_GATEWAY
, &gw
.in
);
367 if (r
< 0 && r
!= -ENODATA
) {
368 log_link_warning_errno(link
, r
, "rtnl: received route with invalid gateway, ignoring: %m");
372 r
= sd_netlink_message_read_in_addr(message
, RTA_SRC
, &src
.in
);
373 if (r
< 0 && r
!= -ENODATA
) {
374 log_link_warning_errno(link
, r
, "rtnl: received route with invalid source, ignoring: %m");
378 r
= sd_netlink_message_read_in_addr(message
, RTA_PREFSRC
, &prefsrc
.in
);
379 if (r
< 0 && r
!= -ENODATA
) {
380 log_link_warning_errno(link
, r
, "rtnl: received route with invalid preferred source, ignoring: %m");
387 r
= sd_netlink_message_read_in6_addr(message
, RTA_DST
, &dst
.in6
);
388 if (r
< 0 && r
!= -ENODATA
) {
389 log_link_warning_errno(link
, r
, "rtnl: received route without valid destination, ignoring: %m");
393 r
= sd_netlink_message_read_in6_addr(message
, RTA_GATEWAY
, &gw
.in6
);
394 if (r
< 0 && r
!= -ENODATA
) {
395 log_link_warning_errno(link
, r
, "rtnl: received route with invalid gateway, ignoring: %m");
399 r
= sd_netlink_message_read_in6_addr(message
, RTA_SRC
, &src
.in6
);
400 if (r
< 0 && r
!= -ENODATA
) {
401 log_link_warning_errno(link
, r
, "rtnl: received route with invalid source, ignoring: %m");
405 r
= sd_netlink_message_read_in6_addr(message
, RTA_PREFSRC
, &prefsrc
.in6
);
406 if (r
< 0 && r
!= -ENODATA
) {
407 log_link_warning_errno(link
, r
, "rtnl: received route with invalid preferred source, ignoring: %m");
414 assert_not_reached("Received unsupported address family");
418 r
= sd_rtnl_message_route_get_dst_prefixlen(message
, &dst_prefixlen
);
420 log_link_warning_errno(link
, r
, "rtnl: received route with invalid destination prefixlen, ignoring: %m");
424 r
= sd_rtnl_message_route_get_src_prefixlen(message
, &src_prefixlen
);
426 log_link_warning_errno(link
, r
, "rtnl: received route with invalid source prefixlen, ignoring: %m");
430 r
= sd_rtnl_message_route_get_scope(message
, &scope
);
432 log_link_warning_errno(link
, r
, "rtnl: received route with invalid scope, ignoring: %m");
436 r
= sd_rtnl_message_route_get_tos(message
, &tos
);
438 log_link_warning_errno(link
, r
, "rtnl: received route with invalid tos, ignoring: %m");
442 r
= sd_rtnl_message_route_get_type(message
, &rt_type
);
444 log_link_warning_errno(link
, r
, "rtnl: received route with invalid type, ignoring: %m");
448 r
= sd_rtnl_message_route_get_table(message
, &table
);
450 log_link_warning_errno(link
, r
, "rtnl: received route with invalid table, ignoring: %m");
454 r
= sd_netlink_message_read_u32(message
, RTA_PRIORITY
, &priority
);
455 if (r
< 0 && r
!= -ENODATA
) {
456 log_link_warning_errno(link
, r
, "rtnl: received route with invalid priority, ignoring: %m");
460 route_get(link
, family
, &dst
, dst_prefixlen
, tos
, priority
, table
, &route
);
465 /* A route appeared that we did not request */
466 r
= route_add_foreign(link
, family
, &dst
, dst_prefixlen
, tos
, priority
, table
, &route
);
471 route_update(route
, &src
, src_prefixlen
, &gw
, &prefsrc
, scope
, protocol
, rt_type
);
480 assert_not_reached("Received invalid RTNL message type");
486 int manager_rtnl_process_address(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
487 Manager
*m
= userdata
;
492 unsigned char prefixlen
;
494 union in_addr_union in_addr
;
495 struct ifa_cacheinfo cinfo
;
496 Address
*address
= NULL
;
497 char buf
[INET6_ADDRSTRLEN
], valid_buf
[FORMAT_TIMESPAN_MAX
];
498 const char *valid_str
= NULL
;
505 if (sd_netlink_message_is_error(message
)) {
506 r
= sd_netlink_message_get_errno(message
);
508 log_warning_errno(r
, "rtnl: failed to receive address: %m");
513 r
= sd_netlink_message_get_type(message
, &type
);
515 log_warning_errno(r
, "rtnl: could not get message type: %m");
517 } else if (!IN_SET(type
, RTM_NEWADDR
, RTM_DELADDR
)) {
518 log_warning("rtnl: received unexpected message type when processing address");
522 r
= sd_rtnl_message_addr_get_ifindex(message
, &ifindex
);
524 log_warning_errno(r
, "rtnl: could not get ifindex from address: %m");
526 } else if (ifindex
<= 0) {
527 log_warning("rtnl: received address message with invalid ifindex: %d", ifindex
);
530 r
= link_get(m
, ifindex
, &link
);
531 if (r
< 0 || !link
) {
532 /* when enumerating we might be out of sync, but we will
533 * get the address again, so just ignore it */
535 log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex
);
540 r
= sd_rtnl_message_addr_get_family(message
, &family
);
541 if (r
< 0 || !IN_SET(family
, AF_INET
, AF_INET6
)) {
542 log_link_warning(link
, "rtnl: received address with invalid family, ignoring.");
546 r
= sd_rtnl_message_addr_get_prefixlen(message
, &prefixlen
);
548 log_link_warning_errno(link
, r
, "rtnl: received address with invalid prefixlen, ignoring: %m");
552 r
= sd_rtnl_message_addr_get_scope(message
, &scope
);
554 log_link_warning_errno(link
, r
, "rtnl: received address with invalid scope, ignoring: %m");
558 r
= sd_rtnl_message_addr_get_flags(message
, &flags
);
560 log_link_warning_errno(link
, r
, "rtnl: received address with invalid flags, ignoring: %m");
566 r
= sd_netlink_message_read_in_addr(message
, IFA_LOCAL
, &in_addr
.in
);
568 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
575 r
= sd_netlink_message_read_in6_addr(message
, IFA_ADDRESS
, &in_addr
.in6
);
577 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
584 log_link_debug(link
, "rtnl: ignoring unsupported address family: %d", family
);
587 if (!inet_ntop(family
, &in_addr
, buf
, INET6_ADDRSTRLEN
)) {
588 log_link_warning(link
, "Could not print address");
592 r
= sd_netlink_message_read_cache_info(message
, IFA_CACHEINFO
, &cinfo
);
594 if (cinfo
.ifa_valid
!= CACHE_INFO_INFINITY_LIFE_TIME
)
595 valid_str
= format_timespan(valid_buf
, FORMAT_TIMESPAN_MAX
,
596 cinfo
.ifa_valid
* USEC_PER_SEC
,
600 address_get(link
, family
, &in_addr
, prefixlen
, &address
);
605 log_link_debug(link
, "Updating address: %s/%u (valid %s%s)", buf
, prefixlen
,
606 valid_str
? "for " : "forever", strempty(valid_str
));
608 /* An address appeared that we did not request */
609 r
= address_add_foreign(link
, family
, &in_addr
, prefixlen
, &address
);
611 log_link_warning_errno(link
, r
, "Failed to add address %s/%u: %m", buf
, prefixlen
);
614 log_link_debug(link
, "Adding address: %s/%u (valid %s%s)", buf
, prefixlen
,
615 valid_str
? "for " : "forever", strempty(valid_str
));
618 address_update(address
, flags
, scope
, &cinfo
);
625 log_link_debug(link
, "Removing address: %s/%u (valid %s%s)", buf
, prefixlen
,
626 valid_str
? "for " : "forever", strempty(valid_str
));
627 address_drop(address
);
629 log_link_warning(link
, "Removing non-existent address: %s/%u (valid %s%s)", buf
, prefixlen
,
630 valid_str
? "for " : "forever", strempty(valid_str
));
634 assert_not_reached("Received invalid RTNL message type");
640 static int manager_rtnl_process_link(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
641 Manager
*m
= userdata
;
643 NetDev
*netdev
= NULL
;
652 if (sd_netlink_message_is_error(message
)) {
653 r
= sd_netlink_message_get_errno(message
);
655 log_warning_errno(r
, "rtnl: Could not receive link: %m");
660 r
= sd_netlink_message_get_type(message
, &type
);
662 log_warning_errno(r
, "rtnl: Could not get message type: %m");
664 } else if (!IN_SET(type
, RTM_NEWLINK
, RTM_DELLINK
)) {
665 log_warning("rtnl: Received unexpected message type when processing link");
669 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
671 log_warning_errno(r
, "rtnl: Could not get ifindex from link: %m");
673 } else if (ifindex
<= 0) {
674 log_warning("rtnl: received link message with invalid ifindex: %d", ifindex
);
678 r
= sd_netlink_message_read_string(message
, IFLA_IFNAME
, &name
);
680 log_warning_errno(r
, "rtnl: Received link message without ifname: %m");
684 (void) link_get(m
, ifindex
, &link
);
685 (void) netdev_get(m
, name
, &netdev
);
690 /* link is new, so add it */
691 r
= link_add(m
, message
, &link
);
693 log_warning_errno(r
, "Could not add new link: %m");
699 /* netdev exists, so make sure the ifindex matches */
700 r
= netdev_set_ifindex(netdev
, message
);
702 log_warning_errno(r
, "Could not set ifindex on netdev: %m");
707 r
= link_update(link
, message
);
720 assert_not_reached("Received invalid RTNL message type.");
726 int manager_rtnl_process_rule(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
727 uint8_t tos
= 0, to_prefixlen
= 0, from_prefixlen
= 0;
728 RoutingPolicyRule
*rule
= NULL
;
729 union in_addr_union to
, from
;
730 uint32_t fwmark
= 0, table
= 0;
731 Manager
*m
= userdata
;
741 if (sd_netlink_message_is_error(message
)) {
742 r
= sd_netlink_message_get_errno(message
);
744 log_warning_errno(r
, "rtnl: failed to receive rule: %m");
749 r
= sd_netlink_message_get_type(message
, &type
);
751 log_warning_errno(r
, "rtnl: could not get message type: %m");
753 } else if (!IN_SET(type
, RTM_NEWRULE
, RTM_DELRULE
)) {
754 log_warning("rtnl: received unexpected message type '%u' when processing rule.", type
);
758 r
= sd_rtnl_message_get_family(message
, &family
);
760 log_warning_errno(r
, "rtnl: could not get rule family: %m");
762 } else if (!IN_SET(family
, AF_INET
, AF_INET6
)) {
763 log_debug("rtnl: received address with invalid family %u, ignoring.", family
);
769 r
= sd_netlink_message_read_in_addr(message
, FRA_SRC
, &from
.in
);
771 r
= sd_rtnl_message_routing_policy_rule_get_rtm_src_prefixlen(message
, &from_prefixlen
);
773 log_warning_errno(r
, "rtnl: failed to retrive rule from prefix length: %m");
776 r
= sd_netlink_message_read_in_addr(message
, FRA_DST
, &to
.in
);
778 r
= sd_rtnl_message_routing_policy_rule_get_rtm_dst_prefixlen(message
, &to_prefixlen
);
780 log_warning_errno(r
, "rtnl: failed to retrive rule to prefix length: %m");
786 r
= sd_netlink_message_read_in6_addr(message
, FRA_SRC
, &from
.in6
);
788 r
= sd_rtnl_message_routing_policy_rule_get_rtm_src_prefixlen(message
, &from_prefixlen
);
790 log_warning_errno(r
, "rtnl: failed to retrive rule from prefix length: %m");
793 r
= sd_netlink_message_read_in6_addr(message
, FRA_DST
, &to
.in6
);
795 r
= sd_rtnl_message_routing_policy_rule_get_rtm_dst_prefixlen(message
, &to_prefixlen
);
797 log_warning_errno(r
, "rtnl: failed to retrive rule to prefix length: %m");
803 assert_not_reached("Received unsupported address family");
806 if (from_prefixlen
== 0 && to_prefixlen
== 0)
809 (void) sd_netlink_message_read_u32(message
, FRA_FWMARK
, &fwmark
);
810 (void) sd_netlink_message_read_u32(message
, FRA_TABLE
, &table
);
811 (void) sd_rtnl_message_routing_policy_rule_get_tos(message
, &tos
);
812 (void) sd_netlink_message_read_string(message
, FRA_IIFNAME
, (const char **) &iif
);
813 (void) sd_netlink_message_read_string(message
, FRA_OIFNAME
, (const char **) &oif
);
815 (void) routing_policy_rule_get(m
, family
, &from
, from_prefixlen
, &to
, to_prefixlen
, tos
, fwmark
, table
, iif
, oif
, &rule
);
820 r
= routing_policy_rule_add_foreign(m
, family
, &from
, from_prefixlen
, &to
, to_prefixlen
, tos
, fwmark
, table
, iif
, oif
, &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
;
1006 _cleanup_free_
char *temp_path
= NULL
;
1007 _cleanup_fclose_
FILE *f
= NULL
;
1008 LinkOperationalState operstate
= LINK_OPERSTATE_OFF
;
1009 const char *operstate_str
;
1013 assert(m
->state_file
);
1015 /* We add all NTP and DNS server to a set, to filter out duplicates */
1016 dns
= ordered_set_new(&string_hash_ops
);
1020 ntp
= ordered_set_new(&string_hash_ops
);
1024 search_domains
= ordered_set_new(&dns_name_hash_ops
);
1025 if (!search_domains
)
1028 route_domains
= ordered_set_new(&dns_name_hash_ops
);
1032 HASHMAP_FOREACH(link
, m
->links
, i
) {
1033 if (link
->flags
& IFF_LOOPBACK
)
1036 if (link
->operstate
> operstate
)
1037 operstate
= link
->operstate
;
1042 /* First add the static configured entries */
1043 r
= ordered_set_put_in_addr_datav(dns
, link
->network
->dns
, link
->network
->n_dns
);
1047 r
= ordered_set_put_strdupv(ntp
, link
->network
->ntp
);
1051 r
= ordered_set_put_strdupv(search_domains
, link
->network
->search_domains
);
1055 r
= ordered_set_put_strdupv(route_domains
, link
->network
->route_domains
);
1059 if (!link
->dhcp_lease
)
1062 /* Secondly, add the entries acquired via DHCP */
1063 if (link
->network
->dhcp_use_dns
) {
1064 const struct in_addr
*addresses
;
1066 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
1068 r
= ordered_set_put_in4_addrv(dns
, addresses
, r
);
1071 } else if (r
< 0 && r
!= -ENODATA
)
1075 if (link
->network
->dhcp_use_ntp
) {
1076 const struct in_addr
*addresses
;
1078 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
1080 r
= ordered_set_put_in4_addrv(ntp
, addresses
, r
);
1083 } else if (r
< 0 && r
!= -ENODATA
)
1087 if (link
->network
->dhcp_use_domains
!= DHCP_USE_DOMAINS_NO
) {
1088 const char *domainname
;
1089 char **domains
= NULL
;
1091 OrderedSet
*target_domains
= (link
->network
->dhcp_use_domains
== DHCP_USE_DOMAINS_YES
) ? search_domains
: route_domains
;
1092 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
1094 r
= ordered_set_put_strdup(target_domains
, domainname
);
1097 } else if (r
!= -ENODATA
)
1100 r
= sd_dhcp_lease_get_search_domains(link
->dhcp_lease
, &domains
);
1102 r
= ordered_set_put_strdupv(target_domains
, domains
);
1105 } else if (r
!= -ENODATA
)
1110 operstate_str
= link_operstate_to_string(operstate
);
1111 assert(operstate_str
);
1113 r
= fopen_temporary(m
->state_file
, &f
, &temp_path
);
1117 (void) fchmod(fileno(f
), 0644);
1120 "# This is private data. Do not parse.\n"
1121 "OPER_STATE=%s\n", operstate_str
);
1123 print_string_set(f
, "DNS=", dns
);
1124 print_string_set(f
, "NTP=", ntp
);
1125 print_string_set(f
, "DOMAINS=", search_domains
);
1126 print_string_set(f
, "ROUTE_DOMAINS=", route_domains
);
1128 r
= routing_policy_serialize_rules(m
->rules
, f
);
1132 r
= fflush_and_check(f
);
1136 if (rename(temp_path
, m
->state_file
) < 0) {
1141 if (m
->operational_state
!= operstate
) {
1142 m
->operational_state
= operstate
;
1143 r
= manager_send_changed(m
, "OperationalState", NULL
);
1145 log_error_errno(r
, "Could not emit changed OperationalState: %m");
1153 (void) unlink(m
->state_file
);
1154 (void) unlink(temp_path
);
1156 return log_error_errno(r
, "Failed to save network state to %s: %m", m
->state_file
);
1159 static int manager_dirty_handler(sd_event_source
*s
, void *userdata
) {
1160 Manager
*m
= userdata
;
1170 SET_FOREACH(link
, m
->dirty_links
, i
) {
1171 r
= link_save(link
);
1179 int manager_new(Manager
**ret
, sd_event
*event
) {
1180 _cleanup_manager_free_ Manager
*m
= NULL
;
1183 m
= new0(Manager
, 1);
1187 m
->state_file
= strdup("/run/systemd/netif/state");
1191 m
->event
= sd_event_ref(event
);
1193 r
= sd_event_add_post(m
->event
, NULL
, manager_dirty_handler
, m
);
1197 r
= manager_connect_rtnl(m
);
1201 r
= manager_connect_udev(m
);
1205 m
->netdevs
= hashmap_new(&string_hash_ops
);
1209 LIST_HEAD_INIT(m
->networks
);
1211 r
= setup_default_address_pool(m
);
1215 m
->duid
.type
= DUID_TYPE_EN
;
1217 (void) routing_policy_load_rules(m
->state_file
, &m
->rules_saved
);
1225 void manager_free(Manager
*m
) {
1234 free(m
->state_file
);
1236 while ((network
= m
->networks
))
1237 network_free(network
);
1239 while ((link
= hashmap_first(m
->links
)))
1241 hashmap_free(m
->links
);
1243 hashmap_free(m
->networks_by_name
);
1245 while ((netdev
= hashmap_first(m
->netdevs
)))
1246 netdev_unref(netdev
);
1247 hashmap_free(m
->netdevs
);
1249 while ((pool
= m
->address_pools
))
1250 address_pool_free(pool
);
1253 set_free(m
->rules_foreign
);
1255 set_free_with_destructor(m
->rules_saved
, routing_policy_rule_free
);
1257 sd_netlink_unref(m
->rtnl
);
1258 sd_event_unref(m
->event
);
1260 sd_event_source_unref(m
->udev_event_source
);
1261 udev_monitor_unref(m
->udev_monitor
);
1262 udev_unref(m
->udev
);
1264 sd_bus_unref(m
->bus
);
1265 sd_bus_slot_unref(m
->prepare_for_sleep_slot
);
1266 sd_event_source_unref(m
->bus_retry_event_source
);
1268 free(m
->dynamic_timezone
);
1269 free(m
->dynamic_hostname
);
1274 int manager_start(Manager
*m
) {
1280 /* The dirty handler will deal with future serialization, but the first one
1281 must be done explicitly. */
1285 HASHMAP_FOREACH(link
, m
->links
, i
)
1291 int manager_load_config(Manager
*m
) {
1294 /* update timestamp */
1295 paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, true);
1301 r
= network_load(m
);
1308 bool manager_should_reload(Manager
*m
) {
1309 return paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, false);
1312 int manager_rtnl_enumerate_links(Manager
*m
) {
1313 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1314 sd_netlink_message
*link
;
1320 r
= sd_rtnl_message_new_link(m
->rtnl
, &req
, RTM_GETLINK
, 0);
1324 r
= sd_netlink_message_request_dump(req
, true);
1328 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1332 for (link
= reply
; link
; link
= sd_netlink_message_next(link
)) {
1335 m
->enumerating
= true;
1337 k
= manager_rtnl_process_link(m
->rtnl
, link
, m
);
1341 m
->enumerating
= false;
1347 int manager_rtnl_enumerate_addresses(Manager
*m
) {
1348 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1349 sd_netlink_message
*addr
;
1355 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, 0, 0);
1359 r
= sd_netlink_message_request_dump(req
, true);
1363 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1367 for (addr
= reply
; addr
; addr
= sd_netlink_message_next(addr
)) {
1370 m
->enumerating
= true;
1372 k
= manager_rtnl_process_address(m
->rtnl
, addr
, m
);
1376 m
->enumerating
= false;
1382 int manager_rtnl_enumerate_routes(Manager
*m
) {
1383 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1384 sd_netlink_message
*route
;
1390 r
= sd_rtnl_message_new_route(m
->rtnl
, &req
, RTM_GETROUTE
, 0, 0);
1394 r
= sd_netlink_message_request_dump(req
, true);
1398 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1402 for (route
= reply
; route
; route
= sd_netlink_message_next(route
)) {
1405 m
->enumerating
= true;
1407 k
= manager_rtnl_process_route(m
->rtnl
, route
, m
);
1411 m
->enumerating
= false;
1417 int manager_rtnl_enumerate_rules(Manager
*m
) {
1418 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1419 sd_netlink_message
*rule
;
1425 r
= sd_rtnl_message_new_routing_policy_rule(m
->rtnl
, &req
, RTM_GETRULE
, 0);
1429 r
= sd_netlink_message_request_dump(req
, true);
1433 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1435 if (r
== -EOPNOTSUPP
) {
1436 log_debug("FIB Rules are not supported by the kernel. Ignoring.");
1443 for (rule
= reply
; rule
; rule
= sd_netlink_message_next(rule
)) {
1446 m
->enumerating
= true;
1448 k
= manager_rtnl_process_rule(m
->rtnl
, rule
, m
);
1452 m
->enumerating
= false;
1458 int manager_address_pool_acquire(Manager
*m
, int family
, unsigned prefixlen
, union in_addr_union
*found
) {
1463 assert(prefixlen
> 0);
1466 LIST_FOREACH(address_pools
, p
, m
->address_pools
) {
1467 if (p
->family
!= family
)
1470 r
= address_pool_acquire(p
, prefixlen
, found
);
1478 Link
* manager_find_uplink(Manager
*m
, Link
*exclude
) {
1479 _cleanup_free_
struct local_address
*gateways
= NULL
;
1484 /* Looks for a suitable "uplink", via black magic: an
1485 * interface that is up and where the default route with the
1486 * highest priority points to. */
1488 n
= local_gateways(m
->rtnl
, 0, AF_UNSPEC
, &gateways
);
1490 log_warning_errno(n
, "Failed to determine list of default gateways: %m");
1494 for (i
= 0; i
< n
; i
++) {
1497 link
= hashmap_get(m
->links
, INT_TO_PTR(gateways
[i
].ifindex
));
1499 log_debug("Weird, found a gateway for a link we don't know. Ignoring.");
1503 if (link
== exclude
)
1506 if (link
->operstate
< LINK_OPERSTATE_ROUTABLE
)
1515 void manager_dirty(Manager
*manager
) {
1518 /* the serialized state in /run is no longer up-to-date */
1519 manager
->dirty
= true;
1522 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1523 Manager
*manager
= userdata
;
1524 const sd_bus_error
*e
;
1529 e
= sd_bus_message_get_error(m
);
1531 log_warning_errno(sd_bus_error_get_errno(e
), "Could not set hostname: %s", e
->message
);
1536 int manager_set_hostname(Manager
*m
, const char *hostname
) {
1539 log_debug("Setting transient hostname: '%s'", strna(hostname
));
1540 if (free_and_strdup(&m
->dynamic_hostname
, hostname
) < 0)
1544 /* TODO: replace by assert when we can rely on kdbus */
1545 log_info("Not connected to system bus, ignoring transient hostname.");
1549 r
= sd_bus_call_method_async(
1552 "org.freedesktop.hostname1",
1553 "/org/freedesktop/hostname1",
1554 "org.freedesktop.hostname1",
1556 set_hostname_handler
,
1563 return log_error_errno(r
, "Could not set transient hostname: %m");
1568 static int set_timezone_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1569 Manager
*manager
= userdata
;
1570 const sd_bus_error
*e
;
1575 e
= sd_bus_message_get_error(m
);
1577 log_warning_errno(sd_bus_error_get_errno(e
), "Could not set timezone: %s", e
->message
);
1582 int manager_set_timezone(Manager
*m
, const char *tz
) {
1588 log_debug("Setting system timezone: '%s'", tz
);
1589 if (free_and_strdup(&m
->dynamic_timezone
, tz
) < 0)
1593 log_info("Not connected to system bus, ignoring timezone.");
1597 r
= sd_bus_call_method_async(
1600 "org.freedesktop.timedate1",
1601 "/org/freedesktop/timedate1",
1602 "org.freedesktop.timedate1",
1604 set_timezone_handler
,
1610 return log_error_errno(r
, "Could not set timezone: %m");