1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2013 Tom Gundersen <teg@jklm.no>
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
21 #include <sys/socket.h>
23 #include <linux/fib_rules.h>
24 #include <stdio_ext.h>
26 #include "sd-daemon.h"
27 #include "sd-netlink.h"
29 #include "alloc-util.h"
31 #include "conf-parser.h"
33 #include "dns-domain.h"
36 #include "libudev-private.h"
37 #include "local-addresses.h"
38 #include "netlink-util.h"
39 #include "networkd-manager.h"
40 #include "ordered-set.h"
41 #include "path-util.h"
43 #include "udev-util.h"
46 /* use 8 MB for receive socket kernel queue. */
47 #define RCVBUF_SIZE (8*1024*1024)
49 const char* const network_dirs
[] = {
50 "/etc/systemd/network",
51 "/run/systemd/network",
52 "/usr/lib/systemd/network",
54 "/lib/systemd/network",
58 static int setup_default_address_pool(Manager
*m
) {
64 /* Add in the well-known private address ranges. */
66 r
= address_pool_new_from_string(m
, &p
, AF_INET6
, "fc00::", 7);
70 r
= address_pool_new_from_string(m
, &p
, AF_INET
, "192.168.0.0", 16);
74 r
= address_pool_new_from_string(m
, &p
, AF_INET
, "172.16.0.0", 12);
78 r
= address_pool_new_from_string(m
, &p
, AF_INET
, "10.0.0.0", 8);
85 static int manager_reset_all(Manager
*m
) {
92 HASHMAP_FOREACH(link
, m
->links
, i
) {
93 r
= link_carrier_reset(link
);
95 log_link_warning_errno(link
, r
, "Could not reset carrier: %m");
101 static int match_prepare_for_sleep(sd_bus_message
*message
, void *userdata
, sd_bus_error
*ret_error
) {
102 Manager
*m
= userdata
;
108 r
= sd_bus_message_read(message
, "b", &b
);
110 log_debug_errno(r
, "Failed to parse PrepareForSleep signal: %m");
117 log_debug("Coming back from suspend, resetting all connections...");
119 (void) manager_reset_all(m
);
124 static int on_connected(sd_bus_message
*message
, void *userdata
, sd_bus_error
*ret_error
) {
125 Manager
*m
= userdata
;
130 /* Did we get a timezone or transient hostname from DHCP while D-Bus wasn't up yet? */
131 if (m
->dynamic_hostname
)
132 (void) manager_set_hostname(m
, m
->dynamic_hostname
);
133 if (m
->dynamic_timezone
)
134 (void) manager_set_timezone(m
, m
->dynamic_timezone
);
139 int manager_connect_bus(Manager
*m
) {
147 r
= bus_open_system_watch_bind(&m
->bus
);
149 return log_error_errno(r
, "Failed to connect to bus: %m");
151 r
= sd_bus_add_object_vtable(m
->bus
, NULL
, "/org/freedesktop/network1", "org.freedesktop.network1.Manager", manager_vtable
, m
);
153 return log_error_errno(r
, "Failed to add manager object vtable: %m");
155 r
= sd_bus_add_fallback_vtable(m
->bus
, NULL
, "/org/freedesktop/network1/link", "org.freedesktop.network1.Link", link_vtable
, link_object_find
, m
);
157 return log_error_errno(r
, "Failed to add link object vtable: %m");
159 r
= sd_bus_add_node_enumerator(m
->bus
, NULL
, "/org/freedesktop/network1/link", link_node_enumerator
, m
);
161 return log_error_errno(r
, "Failed to add link enumerator: %m");
163 r
= sd_bus_add_fallback_vtable(m
->bus
, NULL
, "/org/freedesktop/network1/network", "org.freedesktop.network1.Network", network_vtable
, network_object_find
, m
);
165 return log_error_errno(r
, "Failed to add network object vtable: %m");
167 r
= sd_bus_add_node_enumerator(m
->bus
, NULL
, "/org/freedesktop/network1/network", network_node_enumerator
, m
);
169 return log_error_errno(r
, "Failed to add network enumerator: %m");
171 r
= sd_bus_request_name_async(m
->bus
, NULL
, "org.freedesktop.network1", 0, NULL
, NULL
);
173 return log_error_errno(r
, "Failed to request name: %m");
175 r
= sd_bus_attach_event(m
->bus
, m
->event
, 0);
177 return log_error_errno(r
, "Failed to attach bus to event loop: %m");
179 r
= sd_bus_match_signal_async(
182 "org.freedesktop.DBus.Local",
184 "org.freedesktop.DBus.Local",
186 on_connected
, NULL
, m
);
188 return log_error_errno(r
, "Failed to request match on Connected signal: %m");
190 r
= sd_bus_match_signal_async(
192 &m
->prepare_for_sleep_slot
,
193 "org.freedesktop.login1",
194 "/org/freedesktop/login1",
195 "org.freedesktop.login1.Manager",
197 match_prepare_for_sleep
, NULL
, m
);
199 log_warning_errno(r
, "Failed to request match for PrepareForSleep, ignoring: %m");
204 static int manager_udev_process_link(Manager
*m
, struct udev_device
*device
) {
211 if (!streq_ptr(udev_device_get_action(device
), "add"))
214 ifindex
= udev_device_get_ifindex(device
);
216 log_debug("Ignoring udev ADD event for device with invalid ifindex");
220 r
= link_get(m
, ifindex
, &link
);
226 r
= link_initialized(link
, device
);
233 static int manager_dispatch_link_udev(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
234 Manager
*m
= userdata
;
235 struct udev_monitor
*monitor
= m
->udev_monitor
;
236 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
238 device
= udev_monitor_receive_device(monitor
);
242 (void) manager_udev_process_link(m
, device
);
247 static int manager_connect_udev(Manager
*m
) {
250 /* udev does not initialize devices inside containers,
251 * so we rely on them being already initialized before
252 * entering the container */
253 if (detect_container() > 0)
256 m
->udev
= udev_new();
260 m
->udev_monitor
= udev_monitor_new_from_netlink(m
->udev
, "udev");
261 if (!m
->udev_monitor
)
264 r
= udev_monitor_filter_add_match_subsystem_devtype(m
->udev_monitor
, "net", NULL
);
266 return log_error_errno(r
, "Could not add udev monitor filter: %m");
268 r
= udev_monitor_enable_receiving(m
->udev_monitor
);
270 log_error("Could not enable udev monitor");
274 r
= sd_event_add_io(m
->event
,
275 &m
->udev_event_source
,
276 udev_monitor_get_fd(m
->udev_monitor
),
277 EPOLLIN
, manager_dispatch_link_udev
,
282 r
= sd_event_source_set_description(m
->udev_event_source
, "networkd-udev");
289 int manager_rtnl_process_route(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
290 Manager
*m
= userdata
;
293 uint32_t ifindex
, priority
= 0;
294 unsigned char protocol
, scope
, tos
, table
, rt_type
;
296 unsigned char dst_prefixlen
, src_prefixlen
;
297 union in_addr_union dst
= {}, gw
= {}, src
= {}, prefsrc
= {};
305 if (sd_netlink_message_is_error(message
)) {
306 r
= sd_netlink_message_get_errno(message
);
308 log_warning_errno(r
, "rtnl: failed to receive route, ignoring: %m");
313 r
= sd_netlink_message_get_type(message
, &type
);
315 log_warning_errno(r
, "rtnl: could not get message type, ignoring: %m");
317 } else if (!IN_SET(type
, RTM_NEWROUTE
, RTM_DELROUTE
)) {
318 log_warning("rtnl: received unexpected message type when processing route, ignoring");
322 r
= sd_netlink_message_read_u32(message
, RTA_OIF
, &ifindex
);
324 log_debug("rtnl: received route without ifindex, ignoring");
327 log_warning_errno(r
, "rtnl: could not get ifindex from route, ignoring: %m");
329 } else if (ifindex
<= 0) {
330 log_warning("rtnl: received route message with invalid ifindex, ignoring: %d", ifindex
);
333 r
= link_get(m
, ifindex
, &link
);
334 if (r
< 0 || !link
) {
335 /* when enumerating we might be out of sync, but we will
336 * get the route again, so just ignore it */
338 log_warning("rtnl: received route for nonexistent link (%d), ignoring", ifindex
);
343 r
= sd_rtnl_message_route_get_family(message
, &family
);
344 if (r
< 0 || !IN_SET(family
, AF_INET
, AF_INET6
)) {
345 log_link_warning(link
, "rtnl: received address with invalid family, ignoring");
349 r
= sd_rtnl_message_route_get_protocol(message
, &protocol
);
351 log_warning_errno(r
, "rtnl: could not get route protocol: %m");
357 r
= sd_netlink_message_read_in_addr(message
, RTA_DST
, &dst
.in
);
358 if (r
< 0 && r
!= -ENODATA
) {
359 log_link_warning_errno(link
, r
, "rtnl: received route without valid destination, ignoring: %m");
363 r
= sd_netlink_message_read_in_addr(message
, RTA_GATEWAY
, &gw
.in
);
364 if (r
< 0 && r
!= -ENODATA
) {
365 log_link_warning_errno(link
, r
, "rtnl: received route with invalid gateway, ignoring: %m");
369 r
= sd_netlink_message_read_in_addr(message
, RTA_SRC
, &src
.in
);
370 if (r
< 0 && r
!= -ENODATA
) {
371 log_link_warning_errno(link
, r
, "rtnl: received route with invalid source, ignoring: %m");
375 r
= sd_netlink_message_read_in_addr(message
, RTA_PREFSRC
, &prefsrc
.in
);
376 if (r
< 0 && r
!= -ENODATA
) {
377 log_link_warning_errno(link
, r
, "rtnl: received route with invalid preferred source, ignoring: %m");
384 r
= sd_netlink_message_read_in6_addr(message
, RTA_DST
, &dst
.in6
);
385 if (r
< 0 && r
!= -ENODATA
) {
386 log_link_warning_errno(link
, r
, "rtnl: received route without valid destination, ignoring: %m");
390 r
= sd_netlink_message_read_in6_addr(message
, RTA_GATEWAY
, &gw
.in6
);
391 if (r
< 0 && r
!= -ENODATA
) {
392 log_link_warning_errno(link
, r
, "rtnl: received route with invalid gateway, ignoring: %m");
396 r
= sd_netlink_message_read_in6_addr(message
, RTA_SRC
, &src
.in6
);
397 if (r
< 0 && r
!= -ENODATA
) {
398 log_link_warning_errno(link
, r
, "rtnl: received route with invalid source, ignoring: %m");
402 r
= sd_netlink_message_read_in6_addr(message
, RTA_PREFSRC
, &prefsrc
.in6
);
403 if (r
< 0 && r
!= -ENODATA
) {
404 log_link_warning_errno(link
, r
, "rtnl: received route with invalid preferred source, ignoring: %m");
411 assert_not_reached("Received unsupported address family");
415 r
= sd_rtnl_message_route_get_dst_prefixlen(message
, &dst_prefixlen
);
417 log_link_warning_errno(link
, r
, "rtnl: received route with invalid destination prefixlen, ignoring: %m");
421 r
= sd_rtnl_message_route_get_src_prefixlen(message
, &src_prefixlen
);
423 log_link_warning_errno(link
, r
, "rtnl: received route with invalid source prefixlen, ignoring: %m");
427 r
= sd_rtnl_message_route_get_scope(message
, &scope
);
429 log_link_warning_errno(link
, r
, "rtnl: received route with invalid scope, ignoring: %m");
433 r
= sd_rtnl_message_route_get_tos(message
, &tos
);
435 log_link_warning_errno(link
, r
, "rtnl: received route with invalid tos, ignoring: %m");
439 r
= sd_rtnl_message_route_get_type(message
, &rt_type
);
441 log_link_warning_errno(link
, r
, "rtnl: received route with invalid type, ignoring: %m");
445 r
= sd_rtnl_message_route_get_table(message
, &table
);
447 log_link_warning_errno(link
, r
, "rtnl: received route with invalid table, ignoring: %m");
451 r
= sd_netlink_message_read_u32(message
, RTA_PRIORITY
, &priority
);
452 if (r
< 0 && r
!= -ENODATA
) {
453 log_link_warning_errno(link
, r
, "rtnl: received route with invalid priority, ignoring: %m");
457 (void) route_get(link
, family
, &dst
, dst_prefixlen
, tos
, priority
, table
, &route
);
462 /* A route appeared that we did not request */
463 r
= route_add_foreign(link
, family
, &dst
, dst_prefixlen
, tos
, priority
, table
, &route
);
465 log_link_warning_errno(link
, r
, "Failed to add route, ignoring: %m");
470 route_update(route
, &src
, src_prefixlen
, &gw
, &prefsrc
, scope
, protocol
, rt_type
);
479 assert_not_reached("Received invalid RTNL message type");
485 int manager_rtnl_process_address(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
486 Manager
*m
= userdata
;
491 unsigned char prefixlen
;
493 union in_addr_union in_addr
;
494 struct ifa_cacheinfo cinfo
;
495 Address
*address
= NULL
;
496 char buf
[INET6_ADDRSTRLEN
], valid_buf
[FORMAT_TIMESPAN_MAX
];
497 const char *valid_str
= NULL
;
504 if (sd_netlink_message_is_error(message
)) {
505 r
= sd_netlink_message_get_errno(message
);
507 log_warning_errno(r
, "rtnl: failed to receive address, ignoring: %m");
512 r
= sd_netlink_message_get_type(message
, &type
);
514 log_warning_errno(r
, "rtnl: could not get message type, ignoring: %m");
516 } else if (!IN_SET(type
, RTM_NEWADDR
, RTM_DELADDR
)) {
517 log_warning("rtnl: received unexpected message type when processing address, ignoring");
521 r
= sd_rtnl_message_addr_get_ifindex(message
, &ifindex
);
523 log_warning_errno(r
, "rtnl: could not get ifindex from address, ignoring: %m");
525 } else if (ifindex
<= 0) {
526 log_warning("rtnl: received address message with invalid ifindex, ignoring: %d", ifindex
);
529 r
= link_get(m
, ifindex
, &link
);
530 if (r
< 0 || !link
) {
531 /* when enumerating we might be out of sync, but we will
532 * get the address again, so just ignore it */
534 log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex
);
539 r
= sd_rtnl_message_addr_get_family(message
, &family
);
540 if (r
< 0 || !IN_SET(family
, AF_INET
, AF_INET6
)) {
541 log_link_warning(link
, "rtnl: received address with invalid family, ignoring");
545 r
= sd_rtnl_message_addr_get_prefixlen(message
, &prefixlen
);
547 log_link_warning_errno(link
, r
, "rtnl: received address with invalid prefixlen, ignoring: %m");
551 r
= sd_rtnl_message_addr_get_scope(message
, &scope
);
553 log_link_warning_errno(link
, r
, "rtnl: received address with invalid scope, ignoring: %m");
557 r
= sd_rtnl_message_addr_get_flags(message
, &flags
);
559 log_link_warning_errno(link
, r
, "rtnl: received address with invalid flags, ignoring: %m");
565 r
= sd_netlink_message_read_in_addr(message
, IFA_LOCAL
, &in_addr
.in
);
567 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
574 r
= sd_netlink_message_read_in6_addr(message
, IFA_ADDRESS
, &in_addr
.in6
);
576 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
583 assert_not_reached("Received unsupported address family");
586 if (!inet_ntop(family
, &in_addr
, buf
, INET6_ADDRSTRLEN
)) {
587 log_link_warning(link
, "Could not print address, ignoring");
591 r
= sd_netlink_message_read_cache_info(message
, IFA_CACHEINFO
, &cinfo
);
592 if (r
< 0 && r
!= -ENODATA
) {
593 log_link_warning_errno(link
, r
, "rtnl: cannot get IFA_CACHEINFO attribute, ignoring: %m");
596 if (cinfo
.ifa_valid
!= CACHE_INFO_INFINITY_LIFE_TIME
)
597 valid_str
= format_timespan(valid_buf
, FORMAT_TIMESPAN_MAX
,
598 cinfo
.ifa_valid
* USEC_PER_SEC
,
602 (void) address_get(link
, family
, &in_addr
, prefixlen
, &address
);
607 log_link_debug(link
, "Updating address: %s/%u (valid %s%s)", buf
, prefixlen
,
608 valid_str
? "for " : "forever", strempty(valid_str
));
610 /* An address appeared that we did not request */
611 r
= address_add_foreign(link
, family
, &in_addr
, prefixlen
, &address
);
613 log_link_warning_errno(link
, r
, "Failed to add address %s/%u, ignoring: %m", buf
, prefixlen
);
616 log_link_debug(link
, "Adding address: %s/%u (valid %s%s)", buf
, prefixlen
,
617 valid_str
? "for " : "forever", strempty(valid_str
));
620 r
= address_update(address
, flags
, scope
, &cinfo
);
622 log_link_warning_errno(link
, r
, "Failed to update address %s/%u, ignoring: %m", buf
, prefixlen
);
631 log_link_debug(link
, "Removing address: %s/%u (valid %s%s)", buf
, prefixlen
,
632 valid_str
? "for " : "forever", strempty(valid_str
));
633 (void) address_drop(address
);
635 log_link_warning(link
, "Removing non-existent address: %s/%u (valid %s%s), ignoring", buf
, prefixlen
,
636 valid_str
? "for " : "forever", strempty(valid_str
));
640 assert_not_reached("Received invalid RTNL message type");
646 static int manager_rtnl_process_link(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
647 Manager
*m
= userdata
;
649 NetDev
*netdev
= NULL
;
658 if (sd_netlink_message_is_error(message
)) {
659 r
= sd_netlink_message_get_errno(message
);
661 log_warning_errno(r
, "rtnl: Could not receive link, ignoring: %m");
666 r
= sd_netlink_message_get_type(message
, &type
);
668 log_warning_errno(r
, "rtnl: Could not get message type, ignoring: %m");
670 } else if (!IN_SET(type
, RTM_NEWLINK
, RTM_DELLINK
)) {
671 log_warning("rtnl: Received unexpected message type when processing link, ignoring");
675 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
677 log_warning_errno(r
, "rtnl: Could not get ifindex from link, ignoring: %m");
679 } else if (ifindex
<= 0) {
680 log_warning("rtnl: received link message with invalid ifindex %d, ignoring", ifindex
);
684 r
= sd_netlink_message_read_string(message
, IFLA_IFNAME
, &name
);
686 log_warning_errno(r
, "rtnl: Received link message without ifname, ignoring: %m");
690 (void) link_get(m
, ifindex
, &link
);
691 (void) netdev_get(m
, name
, &netdev
);
696 /* link is new, so add it */
697 r
= link_add(m
, message
, &link
);
699 log_warning_errno(r
, "Could not add new link, ignoring: %m");
705 /* netdev exists, so make sure the ifindex matches */
706 r
= netdev_set_ifindex(netdev
, message
);
708 log_warning_errno(r
, "Could not set ifindex on netdev, ignoring: %m");
713 r
= link_update(link
, message
);
715 log_warning_errno(r
, "Could not update link, ignoring: %m");
728 assert_not_reached("Received invalid RTNL message type.");
734 int manager_rtnl_process_rule(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
735 uint8_t tos
= 0, to_prefixlen
= 0, from_prefixlen
= 0;
736 union in_addr_union to
= {}, from
= {};
737 RoutingPolicyRule
*rule
= NULL
;
738 uint32_t fwmark
= 0, table
= 0;
739 char *iif
= NULL
, *oif
= NULL
;
740 Manager
*m
= userdata
;
749 if (sd_netlink_message_is_error(message
)) {
750 r
= sd_netlink_message_get_errno(message
);
752 log_warning_errno(r
, "rtnl: failed to receive rule, ignoring: %m");
757 r
= sd_netlink_message_get_type(message
, &type
);
759 log_warning_errno(r
, "rtnl: could not get message type, ignoring: %m");
761 } else if (!IN_SET(type
, RTM_NEWRULE
, RTM_DELRULE
)) {
762 log_warning("rtnl: received unexpected message type '%u' when processing rule, ignoring", type
);
766 r
= sd_rtnl_message_get_family(message
, &family
);
768 log_warning_errno(r
, "rtnl: could not get rule family, ignoring: %m");
770 } else if (!IN_SET(family
, AF_INET
, AF_INET6
)) {
771 log_debug("rtnl: received address with invalid family %u, ignoring", family
);
777 r
= sd_netlink_message_read_in_addr(message
, FRA_SRC
, &from
.in
);
778 if (r
< 0 && r
!= -ENODATA
) {
779 log_warning_errno(r
, "rtnl: could not get FRA_SRC attribute, ignoring: %m");
782 r
= sd_rtnl_message_routing_policy_rule_get_rtm_src_prefixlen(message
, &from_prefixlen
);
784 log_warning_errno(r
, "rtnl: failed to retrive rule from prefix length, ignoring: %m");
789 r
= sd_netlink_message_read_in_addr(message
, FRA_DST
, &to
.in
);
790 if (r
< 0 && r
!= -ENODATA
) {
791 log_warning_errno(r
, "rtnl: could not get FRA_DST attribute, ignoring: %m");
794 r
= sd_rtnl_message_routing_policy_rule_get_rtm_dst_prefixlen(message
, &to_prefixlen
);
796 log_warning_errno(r
, "rtnl: failed to retrive rule to prefix length, ignoring: %m");
804 r
= sd_netlink_message_read_in6_addr(message
, FRA_SRC
, &from
.in6
);
805 if (r
< 0 && r
!= -ENODATA
) {
806 log_warning_errno(r
, "rtnl: could not get FRA_SRC attribute, ignoring: %m");
809 r
= sd_rtnl_message_routing_policy_rule_get_rtm_src_prefixlen(message
, &from_prefixlen
);
811 log_warning_errno(r
, "rtnl: failed to retrive rule from prefix length, ignoring: %m");
816 r
= sd_netlink_message_read_in6_addr(message
, FRA_DST
, &to
.in6
);
817 if (r
< 0 && r
!= -ENODATA
) {
818 log_warning_errno(r
, "rtnl: could not get FRA_DST attribute, ignoring: %m");
821 r
= sd_rtnl_message_routing_policy_rule_get_rtm_dst_prefixlen(message
, &to_prefixlen
);
823 log_warning_errno(r
, "rtnl: failed to retrive rule to prefix length, ignoring: %m");
831 assert_not_reached("Received unsupported address family");
834 if (from_prefixlen
== 0 && to_prefixlen
== 0)
837 r
= sd_netlink_message_read_u32(message
, FRA_FWMARK
, &fwmark
);
838 if (r
< 0 && r
!= -ENODATA
) {
839 log_warning_errno(r
, "rtnl: could not get FRA_FWMARK attribute, ignoring: %m");
843 r
= sd_netlink_message_read_u32(message
, FRA_TABLE
, &table
);
844 if (r
< 0 && r
!= -ENODATA
) {
845 log_warning_errno(r
, "rtnl: could not get FRA_TABLE attribute, ignoring: %m");
849 r
= sd_rtnl_message_routing_policy_rule_get_tos(message
, &tos
);
850 if (r
< 0 && r
!= -ENODATA
) {
851 log_warning_errno(r
, "rtnl: could not get ip rule TOS, ignoring: %m");
855 r
= sd_netlink_message_read_string(message
, FRA_IIFNAME
, (const char **) &iif
);
856 if (r
< 0 && r
!= -ENODATA
) {
857 log_warning_errno(r
, "rtnl: could not get FRA_IIFNAME attribute, ignoring: %m");
861 r
= sd_netlink_message_read_string(message
, FRA_OIFNAME
, (const char **) &oif
);
862 if (r
< 0 && r
!= -ENODATA
) {
863 log_warning_errno(r
, "rtnl: could not get FRA_OIFNAME attribute, ignoring: %m");
867 (void) routing_policy_rule_get(m
, family
, &from
, from_prefixlen
, &to
, to_prefixlen
, tos
, fwmark
, table
, iif
, oif
, &rule
);
872 r
= routing_policy_rule_add_foreign(m
, family
, &from
, from_prefixlen
, &to
, to_prefixlen
, tos
, fwmark
, table
, iif
, oif
, &rule
);
874 log_warning_errno(r
, "Could not add rule, ignoring: %m");
880 routing_policy_rule_free(rule
);
885 assert_not_reached("Received invalid RTNL message type");
891 static int systemd_netlink_fd(void) {
892 int n
, fd
, rtnl_fd
= -EINVAL
;
894 n
= sd_listen_fds(true);
898 for (fd
= SD_LISTEN_FDS_START
; fd
< SD_LISTEN_FDS_START
+ n
; fd
++) {
899 if (sd_is_socket(fd
, AF_NETLINK
, SOCK_RAW
, -1) > 0) {
910 static int manager_connect_genl(Manager
*m
) {
915 r
= sd_genl_socket_open(&m
->genl
);
919 r
= sd_netlink_inc_rcvbuf(m
->genl
, RCVBUF_SIZE
);
923 r
= sd_netlink_attach_event(m
->genl
, m
->event
, 0);
930 static int manager_connect_rtnl(Manager
*m
) {
935 fd
= systemd_netlink_fd();
937 r
= sd_netlink_open(&m
->rtnl
);
939 r
= sd_netlink_open_fd(&m
->rtnl
, fd
);
943 r
= sd_netlink_inc_rcvbuf(m
->rtnl
, RCVBUF_SIZE
);
947 r
= sd_netlink_attach_event(m
->rtnl
, m
->event
, 0);
951 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWLINK
, &manager_rtnl_process_link
, m
);
955 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELLINK
, &manager_rtnl_process_link
, m
);
959 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWADDR
, &manager_rtnl_process_address
, m
);
963 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELADDR
, &manager_rtnl_process_address
, m
);
967 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWROUTE
, &manager_rtnl_process_route
, m
);
971 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELROUTE
, &manager_rtnl_process_route
, m
);
975 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWRULE
, &manager_rtnl_process_rule
, m
);
979 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELRULE
, &manager_rtnl_process_rule
, m
);
986 static int ordered_set_put_in_addr_data(OrderedSet
*s
, const struct in_addr_data
*address
) {
993 r
= in_addr_to_string(address
->family
, &address
->address
, &p
);
997 r
= ordered_set_consume(s
, p
);
1004 static int ordered_set_put_in_addr_datav(OrderedSet
*s
, const struct in_addr_data
*addresses
, unsigned n
) {
1009 assert(addresses
|| n
== 0);
1011 for (i
= 0; i
< n
; i
++) {
1012 r
= ordered_set_put_in_addr_data(s
, addresses
+i
);
1022 static int ordered_set_put_in4_addr(OrderedSet
*s
, const struct in_addr
*address
) {
1029 r
= in_addr_to_string(AF_INET
, (const union in_addr_union
*) address
, &p
);
1033 r
= ordered_set_consume(s
, p
);
1040 static int ordered_set_put_in4_addrv(OrderedSet
*s
, const struct in_addr
*addresses
, unsigned n
) {
1045 assert(n
== 0 || addresses
);
1047 for (i
= 0; i
< n
; i
++) {
1048 r
= ordered_set_put_in4_addr(s
, addresses
+i
);
1058 static void print_string_set(FILE *f
, const char *field
, OrderedSet
*s
) {
1063 if (ordered_set_isempty(s
))
1068 ORDERED_SET_FOREACH(p
, s
, i
)
1069 fputs_with_space(f
, p
, NULL
, &space
);
1074 static int manager_save(Manager
*m
) {
1075 _cleanup_ordered_set_free_free_ OrderedSet
*dns
= NULL
, *ntp
= NULL
, *search_domains
= NULL
, *route_domains
= NULL
;
1078 _cleanup_free_
char *temp_path
= NULL
;
1079 _cleanup_fclose_
FILE *f
= NULL
;
1080 LinkOperationalState operstate
= LINK_OPERSTATE_OFF
;
1081 const char *operstate_str
;
1085 assert(m
->state_file
);
1087 /* We add all NTP and DNS server to a set, to filter out duplicates */
1088 dns
= ordered_set_new(&string_hash_ops
);
1092 ntp
= ordered_set_new(&string_hash_ops
);
1096 search_domains
= ordered_set_new(&dns_name_hash_ops
);
1097 if (!search_domains
)
1100 route_domains
= ordered_set_new(&dns_name_hash_ops
);
1104 HASHMAP_FOREACH(link
, m
->links
, i
) {
1105 if (link
->flags
& IFF_LOOPBACK
)
1108 if (link
->operstate
> operstate
)
1109 operstate
= link
->operstate
;
1114 /* First add the static configured entries */
1115 r
= ordered_set_put_in_addr_datav(dns
, link
->network
->dns
, link
->network
->n_dns
);
1119 r
= ordered_set_put_strdupv(ntp
, link
->network
->ntp
);
1123 r
= ordered_set_put_strdupv(search_domains
, link
->network
->search_domains
);
1127 r
= ordered_set_put_strdupv(route_domains
, link
->network
->route_domains
);
1131 if (!link
->dhcp_lease
)
1134 /* Secondly, add the entries acquired via DHCP */
1135 if (link
->network
->dhcp_use_dns
) {
1136 const struct in_addr
*addresses
;
1138 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
1140 r
= ordered_set_put_in4_addrv(dns
, addresses
, r
);
1143 } else if (r
< 0 && r
!= -ENODATA
)
1147 if (link
->network
->dhcp_use_ntp
) {
1148 const struct in_addr
*addresses
;
1150 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
1152 r
= ordered_set_put_in4_addrv(ntp
, addresses
, r
);
1155 } else if (r
< 0 && r
!= -ENODATA
)
1159 if (link
->network
->dhcp_use_domains
!= DHCP_USE_DOMAINS_NO
) {
1160 const char *domainname
;
1161 char **domains
= NULL
;
1163 OrderedSet
*target_domains
= (link
->network
->dhcp_use_domains
== DHCP_USE_DOMAINS_YES
) ? search_domains
: route_domains
;
1164 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
1166 r
= ordered_set_put_strdup(target_domains
, domainname
);
1169 } else if (r
!= -ENODATA
)
1172 r
= sd_dhcp_lease_get_search_domains(link
->dhcp_lease
, &domains
);
1174 r
= ordered_set_put_strdupv(target_domains
, domains
);
1177 } else if (r
!= -ENODATA
)
1182 operstate_str
= link_operstate_to_string(operstate
);
1183 assert(operstate_str
);
1185 r
= fopen_temporary(m
->state_file
, &f
, &temp_path
);
1189 (void) __fsetlocking(f
, FSETLOCKING_BYCALLER
);
1190 (void) fchmod(fileno(f
), 0644);
1193 "# This is private data. Do not parse.\n"
1194 "OPER_STATE=%s\n", operstate_str
);
1196 print_string_set(f
, "DNS=", dns
);
1197 print_string_set(f
, "NTP=", ntp
);
1198 print_string_set(f
, "DOMAINS=", search_domains
);
1199 print_string_set(f
, "ROUTE_DOMAINS=", route_domains
);
1201 r
= routing_policy_serialize_rules(m
->rules
, f
);
1205 r
= fflush_and_check(f
);
1209 if (rename(temp_path
, m
->state_file
) < 0) {
1214 if (m
->operational_state
!= operstate
) {
1215 m
->operational_state
= operstate
;
1216 r
= manager_send_changed(m
, "OperationalState", NULL
);
1218 log_error_errno(r
, "Could not emit changed OperationalState: %m");
1226 (void) unlink(m
->state_file
);
1227 (void) unlink(temp_path
);
1229 return log_error_errno(r
, "Failed to save network state to %s: %m", m
->state_file
);
1232 static int manager_dirty_handler(sd_event_source
*s
, void *userdata
) {
1233 Manager
*m
= userdata
;
1243 SET_FOREACH(link
, m
->dirty_links
, i
) {
1244 r
= link_save(link
);
1252 Link
*manager_dhcp6_prefix_get(Manager
*m
, struct in6_addr
*addr
) {
1253 assert_return(m
, NULL
);
1254 assert_return(m
->dhcp6_prefixes
, NULL
);
1255 assert_return(addr
, NULL
);
1257 return hashmap_get(m
->dhcp6_prefixes
, addr
);
1260 static int dhcp6_route_add_callback(sd_netlink
*nl
, sd_netlink_message
*m
,
1264 union in_addr_union prefix
;
1265 _cleanup_free_
char *buf
= NULL
;
1267 r
= sd_netlink_message_get_errno(m
);
1269 log_link_debug_errno(l
, r
, "Received error adding DHCPv6 Prefix Delegation route: %m");
1273 r
= sd_netlink_message_read_in6_addr(m
, RTA_DST
, &prefix
.in6
);
1275 log_link_debug_errno(l
, r
, "Could not read IPv6 address from DHCPv6 Prefix Delegation while adding route: %m");
1279 (void) in_addr_to_string(AF_INET6
, &prefix
, &buf
);
1280 log_link_debug(l
, "Added DHCPv6 Prefix Deleagtion route %s/64",
1286 int manager_dhcp6_prefix_add(Manager
*m
, struct in6_addr
*addr
, Link
*link
) {
1290 assert_return(m
, -EINVAL
);
1291 assert_return(m
->dhcp6_prefixes
, -ENODATA
);
1292 assert_return(addr
, -EINVAL
);
1294 r
= route_add(link
, AF_INET6
, (union in_addr_union
*) addr
, 64,
1299 r
= route_configure(route
, link
, dhcp6_route_add_callback
);
1303 return hashmap_put(m
->dhcp6_prefixes
, addr
, link
);
1306 static int dhcp6_route_remove_callback(sd_netlink
*nl
, sd_netlink_message
*m
,
1310 union in_addr_union prefix
;
1311 _cleanup_free_
char *buf
= NULL
;
1313 r
= sd_netlink_message_get_errno(m
);
1315 log_link_debug_errno(l
, r
, "Received error on DHCPv6 Prefix Delegation route removal: %m");
1319 r
= sd_netlink_message_read_in6_addr(m
, RTA_DST
, &prefix
.in6
);
1321 log_link_debug_errno(l
, r
, "Could not read IPv6 address from DHCPv6 Prefix Delegation while removing route: %m");
1325 (void) in_addr_to_string(AF_INET6
, &prefix
, &buf
);
1326 log_link_debug(l
, "Removed DHCPv6 Prefix Delegation route %s/64",
1332 int manager_dhcp6_prefix_remove(Manager
*m
, struct in6_addr
*addr
) {
1337 assert_return(m
, -EINVAL
);
1338 assert_return(m
->dhcp6_prefixes
, -ENODATA
);
1339 assert_return(addr
, -EINVAL
);
1341 l
= hashmap_remove(m
->dhcp6_prefixes
, addr
);
1345 (void) sd_radv_remove_prefix(l
->radv
, addr
, 64);
1346 r
= route_get(l
, AF_INET6
, (union in_addr_union
*) addr
, 64,
1349 (void) route_remove(route
, l
, dhcp6_route_remove_callback
);
1354 int manager_dhcp6_prefix_remove_all(Manager
*m
, Link
*link
) {
1357 struct in6_addr
*addr
;
1359 assert_return(m
, -EINVAL
);
1360 assert_return(link
, -EINVAL
);
1362 HASHMAP_FOREACH_KEY(l
, addr
, m
->dhcp6_prefixes
, i
) {
1366 (void) manager_dhcp6_prefix_remove(m
, addr
);
1372 static void dhcp6_prefixes_hash_func(const void *p
, struct siphash
*state
) {
1373 const struct in6_addr
*addr
= p
;
1377 siphash24_compress(addr
, sizeof(*addr
), state
);
1380 static int dhcp6_prefixes_compare_func(const void *_a
, const void *_b
) {
1381 const struct in6_addr
*a
= _a
, *b
= _b
;
1383 return memcmp(&a
, &b
, sizeof(*a
));
1386 static const struct hash_ops dhcp6_prefixes_hash_ops
= {
1387 .hash
= dhcp6_prefixes_hash_func
,
1388 .compare
= dhcp6_prefixes_compare_func
,
1391 int manager_new(Manager
**ret
, sd_event
*event
) {
1392 _cleanup_manager_free_ Manager
*m
= NULL
;
1395 m
= new0(Manager
, 1);
1399 m
->state_file
= strdup("/run/systemd/netif/state");
1403 m
->event
= sd_event_ref(event
);
1405 r
= sd_event_add_post(m
->event
, NULL
, manager_dirty_handler
, m
);
1409 r
= manager_connect_rtnl(m
);
1413 r
= manager_connect_genl(m
);
1417 r
= manager_connect_udev(m
);
1421 m
->netdevs
= hashmap_new(&string_hash_ops
);
1425 LIST_HEAD_INIT(m
->networks
);
1427 r
= sd_resolve_default(&m
->resolve
);
1431 r
= sd_resolve_attach_event(m
->resolve
, m
->event
, 0);
1435 r
= setup_default_address_pool(m
);
1439 m
->dhcp6_prefixes
= hashmap_new(&dhcp6_prefixes_hash_ops
);
1440 if (!m
->dhcp6_prefixes
)
1443 m
->duid
.type
= DUID_TYPE_EN
;
1445 (void) routing_policy_load_rules(m
->state_file
, &m
->rules_saved
);
1453 void manager_free(Manager
*m
) {
1462 free(m
->state_file
);
1464 while ((network
= m
->networks
))
1465 network_free(network
);
1467 while ((link
= hashmap_first(m
->dhcp6_prefixes
)))
1469 hashmap_free(m
->dhcp6_prefixes
);
1471 while ((link
= hashmap_first(m
->links
)))
1473 hashmap_free(m
->links
);
1475 hashmap_free(m
->networks_by_name
);
1477 while ((netdev
= hashmap_first(m
->netdevs
)))
1478 netdev_unref(netdev
);
1479 hashmap_free(m
->netdevs
);
1481 while ((pool
= m
->address_pools
))
1482 address_pool_free(pool
);
1485 set_free(m
->rules_foreign
);
1487 set_free_with_destructor(m
->rules_saved
, routing_policy_rule_free
);
1489 sd_netlink_unref(m
->rtnl
);
1490 sd_event_unref(m
->event
);
1492 sd_resolve_unref(m
->resolve
);
1494 sd_event_source_unref(m
->udev_event_source
);
1495 udev_monitor_unref(m
->udev_monitor
);
1496 udev_unref(m
->udev
);
1498 sd_bus_unref(m
->bus
);
1499 sd_bus_slot_unref(m
->prepare_for_sleep_slot
);
1500 sd_bus_slot_unref(m
->connected_slot
);
1501 sd_event_source_unref(m
->bus_retry_event_source
);
1503 free(m
->dynamic_timezone
);
1504 free(m
->dynamic_hostname
);
1509 int manager_start(Manager
*m
) {
1515 /* The dirty handler will deal with future serialization, but the first one
1516 must be done explicitly. */
1520 HASHMAP_FOREACH(link
, m
->links
, i
)
1526 int manager_load_config(Manager
*m
) {
1529 /* update timestamp */
1530 paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, true);
1536 r
= network_load(m
);
1543 bool manager_should_reload(Manager
*m
) {
1544 return paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, false);
1547 int manager_rtnl_enumerate_links(Manager
*m
) {
1548 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1549 sd_netlink_message
*link
;
1555 r
= sd_rtnl_message_new_link(m
->rtnl
, &req
, RTM_GETLINK
, 0);
1559 r
= sd_netlink_message_request_dump(req
, true);
1563 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1567 for (link
= reply
; link
; link
= sd_netlink_message_next(link
)) {
1570 m
->enumerating
= true;
1572 k
= manager_rtnl_process_link(m
->rtnl
, link
, m
);
1576 m
->enumerating
= false;
1582 int manager_rtnl_enumerate_addresses(Manager
*m
) {
1583 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1584 sd_netlink_message
*addr
;
1590 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, 0, 0);
1594 r
= sd_netlink_message_request_dump(req
, true);
1598 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1602 for (addr
= reply
; addr
; addr
= sd_netlink_message_next(addr
)) {
1605 m
->enumerating
= true;
1607 k
= manager_rtnl_process_address(m
->rtnl
, addr
, m
);
1611 m
->enumerating
= false;
1617 int manager_rtnl_enumerate_routes(Manager
*m
) {
1618 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1619 sd_netlink_message
*route
;
1625 r
= sd_rtnl_message_new_route(m
->rtnl
, &req
, RTM_GETROUTE
, 0, 0);
1629 r
= sd_netlink_message_request_dump(req
, true);
1633 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1637 for (route
= reply
; route
; route
= sd_netlink_message_next(route
)) {
1640 m
->enumerating
= true;
1642 k
= manager_rtnl_process_route(m
->rtnl
, route
, m
);
1646 m
->enumerating
= false;
1652 int manager_rtnl_enumerate_rules(Manager
*m
) {
1653 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1654 sd_netlink_message
*rule
;
1660 r
= sd_rtnl_message_new_routing_policy_rule(m
->rtnl
, &req
, RTM_GETRULE
, 0);
1664 r
= sd_netlink_message_request_dump(req
, true);
1668 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1670 if (r
== -EOPNOTSUPP
) {
1671 log_debug("FIB Rules are not supported by the kernel. Ignoring.");
1678 for (rule
= reply
; rule
; rule
= sd_netlink_message_next(rule
)) {
1681 m
->enumerating
= true;
1683 k
= manager_rtnl_process_rule(m
->rtnl
, rule
, m
);
1687 m
->enumerating
= false;
1693 int manager_address_pool_acquire(Manager
*m
, int family
, unsigned prefixlen
, union in_addr_union
*found
) {
1698 assert(prefixlen
> 0);
1701 LIST_FOREACH(address_pools
, p
, m
->address_pools
) {
1702 if (p
->family
!= family
)
1705 r
= address_pool_acquire(p
, prefixlen
, found
);
1713 Link
* manager_find_uplink(Manager
*m
, Link
*exclude
) {
1714 _cleanup_free_
struct local_address
*gateways
= NULL
;
1719 /* Looks for a suitable "uplink", via black magic: an
1720 * interface that is up and where the default route with the
1721 * highest priority points to. */
1723 n
= local_gateways(m
->rtnl
, 0, AF_UNSPEC
, &gateways
);
1725 log_warning_errno(n
, "Failed to determine list of default gateways: %m");
1729 for (i
= 0; i
< n
; i
++) {
1732 link
= hashmap_get(m
->links
, INT_TO_PTR(gateways
[i
].ifindex
));
1734 log_debug("Weird, found a gateway for a link we don't know. Ignoring.");
1738 if (link
== exclude
)
1741 if (link
->operstate
< LINK_OPERSTATE_ROUTABLE
)
1750 void manager_dirty(Manager
*manager
) {
1753 /* the serialized state in /run is no longer up-to-date */
1754 manager
->dirty
= true;
1757 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1758 Manager
*manager
= userdata
;
1759 const sd_bus_error
*e
;
1764 e
= sd_bus_message_get_error(m
);
1766 log_warning_errno(sd_bus_error_get_errno(e
), "Could not set hostname: %s", e
->message
);
1771 int manager_set_hostname(Manager
*m
, const char *hostname
) {
1774 log_debug("Setting transient hostname: '%s'", strna(hostname
));
1776 if (free_and_strdup(&m
->dynamic_hostname
, hostname
) < 0)
1779 if (!m
->bus
|| sd_bus_is_ready(m
->bus
) <= 0) {
1780 log_info("Not connected to system bus, not setting hostname.");
1784 r
= sd_bus_call_method_async(
1787 "org.freedesktop.hostname1",
1788 "/org/freedesktop/hostname1",
1789 "org.freedesktop.hostname1",
1791 set_hostname_handler
,
1798 return log_error_errno(r
, "Could not set transient hostname: %m");
1803 static int set_timezone_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1804 Manager
*manager
= userdata
;
1805 const sd_bus_error
*e
;
1810 e
= sd_bus_message_get_error(m
);
1812 log_warning_errno(sd_bus_error_get_errno(e
), "Could not set timezone: %s", e
->message
);
1817 int manager_set_timezone(Manager
*m
, const char *tz
) {
1823 log_debug("Setting system timezone: '%s'", tz
);
1824 if (free_and_strdup(&m
->dynamic_timezone
, tz
) < 0)
1827 if (!m
->bus
|| sd_bus_is_ready(m
->bus
) <= 0) {
1828 log_info("Not connected to system bus, not setting hostname.");
1832 r
= sd_bus_call_method_async(
1835 "org.freedesktop.timedate1",
1836 "/org/freedesktop/timedate1",
1837 "org.freedesktop.timedate1",
1839 set_timezone_handler
,
1845 return log_error_errno(r
, "Could not set timezone: %m");