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 on_bus_retry(sd_event_source
*s
, usec_t usec
, void *userdata
) {
86 Manager
*m
= userdata
;
91 m
->bus_retry_event_source
= sd_event_source_unref(m
->bus_retry_event_source
);
93 manager_connect_bus(m
);
98 static int manager_reset_all(Manager
*m
) {
105 HASHMAP_FOREACH(link
, m
->links
, i
) {
106 r
= link_carrier_reset(link
);
108 log_link_warning_errno(link
, r
, "Could not reset carrier: %m");
114 static int match_prepare_for_sleep(sd_bus_message
*message
, void *userdata
, sd_bus_error
*ret_error
) {
115 Manager
*m
= userdata
;
120 r
= sd_bus_message_read(message
, "b", &b
);
122 log_debug_errno(r
, "Failed to parse PrepareForSleep signal: %m");
129 log_debug("Coming back from suspend, resetting all connections...");
131 (void) manager_reset_all(m
);
136 int manager_connect_bus(Manager
*m
) {
141 r
= sd_bus_default_system(&m
->bus
);
143 /* We failed to connect? Yuck, we must be in early
144 * boot. Let's try in 5s again. */
146 log_debug_errno(r
, "Failed to connect to bus, trying again in 5s: %m");
148 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
);
150 return log_error_errno(r
, "Failed to install bus reconnect time event: %m");
155 r
= sd_bus_add_match(m
->bus
, &m
->prepare_for_sleep_slot
,
157 "sender='org.freedesktop.login1',"
158 "interface='org.freedesktop.login1.Manager',"
159 "member='PrepareForSleep',"
160 "path='/org/freedesktop/login1'",
161 match_prepare_for_sleep
,
164 return log_error_errno(r
, "Failed to add match for PrepareForSleep: %m");
166 r
= sd_bus_add_object_vtable(m
->bus
, NULL
, "/org/freedesktop/network1", "org.freedesktop.network1.Manager", manager_vtable
, m
);
168 return log_error_errno(r
, "Failed to add manager object vtable: %m");
170 r
= sd_bus_add_fallback_vtable(m
->bus
, NULL
, "/org/freedesktop/network1/link", "org.freedesktop.network1.Link", link_vtable
, link_object_find
, m
);
172 return log_error_errno(r
, "Failed to add link object vtable: %m");
174 r
= sd_bus_add_node_enumerator(m
->bus
, NULL
, "/org/freedesktop/network1/link", link_node_enumerator
, m
);
176 return log_error_errno(r
, "Failed to add link enumerator: %m");
178 r
= sd_bus_add_fallback_vtable(m
->bus
, NULL
, "/org/freedesktop/network1/network", "org.freedesktop.network1.Network", network_vtable
, network_object_find
, m
);
180 return log_error_errno(r
, "Failed to add network object vtable: %m");
182 r
= sd_bus_add_node_enumerator(m
->bus
, NULL
, "/org/freedesktop/network1/network", network_node_enumerator
, m
);
184 return log_error_errno(r
, "Failed to add network enumerator: %m");
186 r
= sd_bus_request_name(m
->bus
, "org.freedesktop.network1", 0);
188 return log_error_errno(r
, "Failed to register name: %m");
190 r
= sd_bus_attach_event(m
->bus
, m
->event
, 0);
192 return log_error_errno(r
, "Failed to attach bus to event loop: %m");
194 /* Did we get a timezone or transient hostname from DHCP while D-Bus wasn't up yet? */
195 if (m
->dynamic_hostname
) {
196 r
= manager_set_hostname(m
, m
->dynamic_hostname
);
200 if (m
->dynamic_timezone
) {
201 r
= manager_set_timezone(m
, m
->dynamic_timezone
);
209 static int manager_udev_process_link(Manager
*m
, struct udev_device
*device
) {
216 if (!streq_ptr(udev_device_get_action(device
), "add"))
219 ifindex
= udev_device_get_ifindex(device
);
221 log_debug("Ignoring udev ADD event for device with invalid ifindex");
225 r
= link_get(m
, ifindex
, &link
);
231 r
= link_initialized(link
, device
);
238 static int manager_dispatch_link_udev(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
239 Manager
*m
= userdata
;
240 struct udev_monitor
*monitor
= m
->udev_monitor
;
241 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
243 device
= udev_monitor_receive_device(monitor
);
247 (void) manager_udev_process_link(m
, device
);
252 static int manager_connect_udev(Manager
*m
) {
255 /* udev does not initialize devices inside containers,
256 * so we rely on them being already initialized before
257 * entering the container */
258 if (detect_container() > 0)
261 m
->udev
= udev_new();
265 m
->udev_monitor
= udev_monitor_new_from_netlink(m
->udev
, "udev");
266 if (!m
->udev_monitor
)
269 r
= udev_monitor_filter_add_match_subsystem_devtype(m
->udev_monitor
, "net", NULL
);
271 return log_error_errno(r
, "Could not add udev monitor filter: %m");
273 r
= udev_monitor_enable_receiving(m
->udev_monitor
);
275 log_error("Could not enable udev monitor");
279 r
= sd_event_add_io(m
->event
,
280 &m
->udev_event_source
,
281 udev_monitor_get_fd(m
->udev_monitor
),
282 EPOLLIN
, manager_dispatch_link_udev
,
287 r
= sd_event_source_set_description(m
->udev_event_source
, "networkd-udev");
294 int manager_rtnl_process_route(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
295 Manager
*m
= userdata
;
298 uint32_t ifindex
, priority
= 0;
299 unsigned char protocol
, scope
, tos
, table
, rt_type
;
301 unsigned char dst_prefixlen
, src_prefixlen
;
302 union in_addr_union dst
= {}, gw
= {}, src
= {}, prefsrc
= {};
310 if (sd_netlink_message_is_error(message
)) {
311 r
= sd_netlink_message_get_errno(message
);
313 log_warning_errno(r
, "rtnl: failed to receive route, ignoring: %m");
318 r
= sd_netlink_message_get_type(message
, &type
);
320 log_warning_errno(r
, "rtnl: could not get message type, ignoring: %m");
322 } else if (!IN_SET(type
, RTM_NEWROUTE
, RTM_DELROUTE
)) {
323 log_warning("rtnl: received unexpected message type when processing route, ignoring");
327 r
= sd_netlink_message_read_u32(message
, RTA_OIF
, &ifindex
);
329 log_debug("rtnl: received route without ifindex, ignoring");
332 log_warning_errno(r
, "rtnl: could not get ifindex from route, ignoring: %m");
334 } else if (ifindex
<= 0) {
335 log_warning("rtnl: received route message with invalid ifindex, ignoring: %d", ifindex
);
338 r
= link_get(m
, ifindex
, &link
);
339 if (r
< 0 || !link
) {
340 /* when enumerating we might be out of sync, but we will
341 * get the route again, so just ignore it */
343 log_warning("rtnl: received route for nonexistent link (%d), ignoring", ifindex
);
348 r
= sd_rtnl_message_route_get_family(message
, &family
);
349 if (r
< 0 || !IN_SET(family
, AF_INET
, AF_INET6
)) {
350 log_link_warning(link
, "rtnl: received address with invalid family, ignoring");
354 r
= sd_rtnl_message_route_get_protocol(message
, &protocol
);
356 log_warning_errno(r
, "rtnl: could not get route protocol: %m");
362 r
= sd_netlink_message_read_in_addr(message
, RTA_DST
, &dst
.in
);
363 if (r
< 0 && r
!= -ENODATA
) {
364 log_link_warning_errno(link
, r
, "rtnl: received route without valid destination, ignoring: %m");
368 r
= sd_netlink_message_read_in_addr(message
, RTA_GATEWAY
, &gw
.in
);
369 if (r
< 0 && r
!= -ENODATA
) {
370 log_link_warning_errno(link
, r
, "rtnl: received route with invalid gateway, ignoring: %m");
374 r
= sd_netlink_message_read_in_addr(message
, RTA_SRC
, &src
.in
);
375 if (r
< 0 && r
!= -ENODATA
) {
376 log_link_warning_errno(link
, r
, "rtnl: received route with invalid source, ignoring: %m");
380 r
= sd_netlink_message_read_in_addr(message
, RTA_PREFSRC
, &prefsrc
.in
);
381 if (r
< 0 && r
!= -ENODATA
) {
382 log_link_warning_errno(link
, r
, "rtnl: received route with invalid preferred source, ignoring: %m");
389 r
= sd_netlink_message_read_in6_addr(message
, RTA_DST
, &dst
.in6
);
390 if (r
< 0 && r
!= -ENODATA
) {
391 log_link_warning_errno(link
, r
, "rtnl: received route without valid destination, ignoring: %m");
395 r
= sd_netlink_message_read_in6_addr(message
, RTA_GATEWAY
, &gw
.in6
);
396 if (r
< 0 && r
!= -ENODATA
) {
397 log_link_warning_errno(link
, r
, "rtnl: received route with invalid gateway, ignoring: %m");
401 r
= sd_netlink_message_read_in6_addr(message
, RTA_SRC
, &src
.in6
);
402 if (r
< 0 && r
!= -ENODATA
) {
403 log_link_warning_errno(link
, r
, "rtnl: received route with invalid source, ignoring: %m");
407 r
= sd_netlink_message_read_in6_addr(message
, RTA_PREFSRC
, &prefsrc
.in6
);
408 if (r
< 0 && r
!= -ENODATA
) {
409 log_link_warning_errno(link
, r
, "rtnl: received route with invalid preferred source, ignoring: %m");
416 assert_not_reached("Received unsupported address family");
420 r
= sd_rtnl_message_route_get_dst_prefixlen(message
, &dst_prefixlen
);
422 log_link_warning_errno(link
, r
, "rtnl: received route with invalid destination prefixlen, ignoring: %m");
426 r
= sd_rtnl_message_route_get_src_prefixlen(message
, &src_prefixlen
);
428 log_link_warning_errno(link
, r
, "rtnl: received route with invalid source prefixlen, ignoring: %m");
432 r
= sd_rtnl_message_route_get_scope(message
, &scope
);
434 log_link_warning_errno(link
, r
, "rtnl: received route with invalid scope, ignoring: %m");
438 r
= sd_rtnl_message_route_get_tos(message
, &tos
);
440 log_link_warning_errno(link
, r
, "rtnl: received route with invalid tos, ignoring: %m");
444 r
= sd_rtnl_message_route_get_type(message
, &rt_type
);
446 log_link_warning_errno(link
, r
, "rtnl: received route with invalid type, ignoring: %m");
450 r
= sd_rtnl_message_route_get_table(message
, &table
);
452 log_link_warning_errno(link
, r
, "rtnl: received route with invalid table, ignoring: %m");
456 r
= sd_netlink_message_read_u32(message
, RTA_PRIORITY
, &priority
);
457 if (r
< 0 && r
!= -ENODATA
) {
458 log_link_warning_errno(link
, r
, "rtnl: received route with invalid priority, ignoring: %m");
462 (void) route_get(link
, family
, &dst
, dst_prefixlen
, tos
, priority
, table
, &route
);
467 /* A route appeared that we did not request */
468 r
= route_add_foreign(link
, family
, &dst
, dst_prefixlen
, tos
, priority
, table
, &route
);
470 log_link_warning_errno(link
, r
, "Failed to add route, ignoring: %m");
475 route_update(route
, &src
, src_prefixlen
, &gw
, &prefsrc
, scope
, protocol
, rt_type
);
484 assert_not_reached("Received invalid RTNL message type");
490 int manager_rtnl_process_address(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
491 Manager
*m
= userdata
;
496 unsigned char prefixlen
;
498 union in_addr_union in_addr
;
499 struct ifa_cacheinfo cinfo
;
500 Address
*address
= NULL
;
501 char buf
[INET6_ADDRSTRLEN
], valid_buf
[FORMAT_TIMESPAN_MAX
];
502 const char *valid_str
= NULL
;
509 if (sd_netlink_message_is_error(message
)) {
510 r
= sd_netlink_message_get_errno(message
);
512 log_warning_errno(r
, "rtnl: failed to receive address, ignoring: %m");
517 r
= sd_netlink_message_get_type(message
, &type
);
519 log_warning_errno(r
, "rtnl: could not get message type, ignoring: %m");
521 } else if (!IN_SET(type
, RTM_NEWADDR
, RTM_DELADDR
)) {
522 log_warning("rtnl: received unexpected message type when processing address, ignoring");
526 r
= sd_rtnl_message_addr_get_ifindex(message
, &ifindex
);
528 log_warning_errno(r
, "rtnl: could not get ifindex from address, ignoring: %m");
530 } else if (ifindex
<= 0) {
531 log_warning("rtnl: received address message with invalid ifindex, ignoring: %d", ifindex
);
534 r
= link_get(m
, ifindex
, &link
);
535 if (r
< 0 || !link
) {
536 /* when enumerating we might be out of sync, but we will
537 * get the address again, so just ignore it */
539 log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex
);
544 r
= sd_rtnl_message_addr_get_family(message
, &family
);
545 if (r
< 0 || !IN_SET(family
, AF_INET
, AF_INET6
)) {
546 log_link_warning(link
, "rtnl: received address with invalid family, ignoring");
550 r
= sd_rtnl_message_addr_get_prefixlen(message
, &prefixlen
);
552 log_link_warning_errno(link
, r
, "rtnl: received address with invalid prefixlen, ignoring: %m");
556 r
= sd_rtnl_message_addr_get_scope(message
, &scope
);
558 log_link_warning_errno(link
, r
, "rtnl: received address with invalid scope, ignoring: %m");
562 r
= sd_rtnl_message_addr_get_flags(message
, &flags
);
564 log_link_warning_errno(link
, r
, "rtnl: received address with invalid flags, ignoring: %m");
570 r
= sd_netlink_message_read_in_addr(message
, IFA_LOCAL
, &in_addr
.in
);
572 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
579 r
= sd_netlink_message_read_in6_addr(message
, IFA_ADDRESS
, &in_addr
.in6
);
581 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
588 assert_not_reached("Received unsupported address family");
591 if (!inet_ntop(family
, &in_addr
, buf
, INET6_ADDRSTRLEN
)) {
592 log_link_warning(link
, "Could not print address, ignoring");
596 r
= sd_netlink_message_read_cache_info(message
, IFA_CACHEINFO
, &cinfo
);
597 if (r
< 0 && r
!= -ENODATA
) {
598 log_link_warning_errno(link
, r
, "rtnl: cannot get IFA_CACHEINFO attribute, ignoring: %m");
601 if (cinfo
.ifa_valid
!= CACHE_INFO_INFINITY_LIFE_TIME
)
602 valid_str
= format_timespan(valid_buf
, FORMAT_TIMESPAN_MAX
,
603 cinfo
.ifa_valid
* USEC_PER_SEC
,
607 (void) address_get(link
, family
, &in_addr
, prefixlen
, &address
);
612 log_link_debug(link
, "Updating address: %s/%u (valid %s%s)", buf
, prefixlen
,
613 valid_str
? "for " : "forever", strempty(valid_str
));
615 /* An address appeared that we did not request */
616 r
= address_add_foreign(link
, family
, &in_addr
, prefixlen
, &address
);
618 log_link_warning_errno(link
, r
, "Failed to add address %s/%u, ignoring: %m", buf
, prefixlen
);
621 log_link_debug(link
, "Adding address: %s/%u (valid %s%s)", buf
, prefixlen
,
622 valid_str
? "for " : "forever", strempty(valid_str
));
625 r
= address_update(address
, flags
, scope
, &cinfo
);
627 log_link_warning_errno(link
, r
, "Failed to update address %s/%u, ignoring: %m", buf
, prefixlen
);
636 log_link_debug(link
, "Removing address: %s/%u (valid %s%s)", buf
, prefixlen
,
637 valid_str
? "for " : "forever", strempty(valid_str
));
638 (void) address_drop(address
);
640 log_link_warning(link
, "Removing non-existent address: %s/%u (valid %s%s), ignoring", buf
, prefixlen
,
641 valid_str
? "for " : "forever", strempty(valid_str
));
645 assert_not_reached("Received invalid RTNL message type");
651 static int manager_rtnl_process_link(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
652 Manager
*m
= userdata
;
654 NetDev
*netdev
= NULL
;
663 if (sd_netlink_message_is_error(message
)) {
664 r
= sd_netlink_message_get_errno(message
);
666 log_warning_errno(r
, "rtnl: Could not receive link, ignoring: %m");
671 r
= sd_netlink_message_get_type(message
, &type
);
673 log_warning_errno(r
, "rtnl: Could not get message type, ignoring: %m");
675 } else if (!IN_SET(type
, RTM_NEWLINK
, RTM_DELLINK
)) {
676 log_warning("rtnl: Received unexpected message type when processing link, ignoring");
680 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
682 log_warning_errno(r
, "rtnl: Could not get ifindex from link, ignoring: %m");
684 } else if (ifindex
<= 0) {
685 log_warning("rtnl: received link message with invalid ifindex %d, ignoring", ifindex
);
689 r
= sd_netlink_message_read_string(message
, IFLA_IFNAME
, &name
);
691 log_warning_errno(r
, "rtnl: Received link message without ifname, ignoring: %m");
695 (void) link_get(m
, ifindex
, &link
);
696 (void) netdev_get(m
, name
, &netdev
);
701 /* link is new, so add it */
702 r
= link_add(m
, message
, &link
);
704 log_warning_errno(r
, "Could not add new link, ignoring: %m");
710 /* netdev exists, so make sure the ifindex matches */
711 r
= netdev_set_ifindex(netdev
, message
);
713 log_warning_errno(r
, "Could not set ifindex on netdev, ignoring: %m");
718 r
= link_update(link
, message
);
720 log_warning_errno(r
, "Could not update link, ignoring: %m");
733 assert_not_reached("Received invalid RTNL message type.");
739 int manager_rtnl_process_rule(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
740 uint8_t tos
= 0, to_prefixlen
= 0, from_prefixlen
= 0;
741 union in_addr_union to
= {}, from
= {};
742 RoutingPolicyRule
*rule
= NULL
;
743 uint32_t fwmark
= 0, table
= 0;
744 char *iif
= NULL
, *oif
= NULL
;
745 Manager
*m
= userdata
;
754 if (sd_netlink_message_is_error(message
)) {
755 r
= sd_netlink_message_get_errno(message
);
757 log_warning_errno(r
, "rtnl: failed to receive rule, ignoring: %m");
762 r
= sd_netlink_message_get_type(message
, &type
);
764 log_warning_errno(r
, "rtnl: could not get message type, ignoring: %m");
766 } else if (!IN_SET(type
, RTM_NEWRULE
, RTM_DELRULE
)) {
767 log_warning("rtnl: received unexpected message type '%u' when processing rule, ignoring", type
);
771 r
= sd_rtnl_message_get_family(message
, &family
);
773 log_warning_errno(r
, "rtnl: could not get rule family, ignoring: %m");
775 } else if (!IN_SET(family
, AF_INET
, AF_INET6
)) {
776 log_debug("rtnl: received address with invalid family %u, ignoring", family
);
782 r
= sd_netlink_message_read_in_addr(message
, FRA_SRC
, &from
.in
);
783 if (r
< 0 && r
!= -ENODATA
) {
784 log_warning_errno(r
, "rtnl: could not get FRA_SRC attribute, ignoring: %m");
787 r
= sd_rtnl_message_routing_policy_rule_get_rtm_src_prefixlen(message
, &from_prefixlen
);
789 log_warning_errno(r
, "rtnl: failed to retrive rule from prefix length, ignoring: %m");
794 r
= sd_netlink_message_read_in_addr(message
, FRA_DST
, &to
.in
);
795 if (r
< 0 && r
!= -ENODATA
) {
796 log_warning_errno(r
, "rtnl: could not get FRA_DST attribute, ignoring: %m");
799 r
= sd_rtnl_message_routing_policy_rule_get_rtm_dst_prefixlen(message
, &to_prefixlen
);
801 log_warning_errno(r
, "rtnl: failed to retrive rule to prefix length, ignoring: %m");
809 r
= sd_netlink_message_read_in6_addr(message
, FRA_SRC
, &from
.in6
);
810 if (r
< 0 && r
!= -ENODATA
) {
811 log_warning_errno(r
, "rtnl: could not get FRA_SRC attribute, ignoring: %m");
814 r
= sd_rtnl_message_routing_policy_rule_get_rtm_src_prefixlen(message
, &from_prefixlen
);
816 log_warning_errno(r
, "rtnl: failed to retrive rule from prefix length, ignoring: %m");
821 r
= sd_netlink_message_read_in6_addr(message
, FRA_DST
, &to
.in6
);
822 if (r
< 0 && r
!= -ENODATA
) {
823 log_warning_errno(r
, "rtnl: could not get FRA_DST attribute, ignoring: %m");
826 r
= sd_rtnl_message_routing_policy_rule_get_rtm_dst_prefixlen(message
, &to_prefixlen
);
828 log_warning_errno(r
, "rtnl: failed to retrive rule to prefix length, ignoring: %m");
836 assert_not_reached("Received unsupported address family");
839 if (from_prefixlen
== 0 && to_prefixlen
== 0)
842 r
= sd_netlink_message_read_u32(message
, FRA_FWMARK
, &fwmark
);
843 if (r
< 0 && r
!= -ENODATA
) {
844 log_warning_errno(r
, "rtnl: could not get FRA_FWMARK attribute, ignoring: %m");
848 r
= sd_netlink_message_read_u32(message
, FRA_TABLE
, &table
);
849 if (r
< 0 && r
!= -ENODATA
) {
850 log_warning_errno(r
, "rtnl: could not get FRA_TABLE attribute, ignoring: %m");
854 r
= sd_rtnl_message_routing_policy_rule_get_tos(message
, &tos
);
855 if (r
< 0 && r
!= -ENODATA
) {
856 log_warning_errno(r
, "rtnl: could not get ip rule TOS, ignoring: %m");
860 r
= sd_netlink_message_read_string(message
, FRA_IIFNAME
, (const char **) &iif
);
861 if (r
< 0 && r
!= -ENODATA
) {
862 log_warning_errno(r
, "rtnl: could not get FRA_IIFNAME attribute, ignoring: %m");
866 r
= sd_netlink_message_read_string(message
, FRA_OIFNAME
, (const char **) &oif
);
867 if (r
< 0 && r
!= -ENODATA
) {
868 log_warning_errno(r
, "rtnl: could not get FRA_OIFNAME attribute, ignoring: %m");
872 (void) routing_policy_rule_get(m
, family
, &from
, from_prefixlen
, &to
, to_prefixlen
, tos
, fwmark
, table
, iif
, oif
, &rule
);
877 r
= routing_policy_rule_add_foreign(m
, family
, &from
, from_prefixlen
, &to
, to_prefixlen
, tos
, fwmark
, table
, iif
, oif
, &rule
);
879 log_warning_errno(r
, "Could not add rule, ignoring: %m");
885 routing_policy_rule_free(rule
);
890 assert_not_reached("Received invalid RTNL message type");
896 static int systemd_netlink_fd(void) {
897 int n
, fd
, rtnl_fd
= -EINVAL
;
899 n
= sd_listen_fds(true);
903 for (fd
= SD_LISTEN_FDS_START
; fd
< SD_LISTEN_FDS_START
+ n
; fd
++) {
904 if (sd_is_socket(fd
, AF_NETLINK
, SOCK_RAW
, -1) > 0) {
915 static int manager_connect_rtnl(Manager
*m
) {
920 fd
= systemd_netlink_fd();
922 r
= sd_netlink_open(&m
->rtnl
);
924 r
= sd_netlink_open_fd(&m
->rtnl
, fd
);
928 r
= sd_netlink_inc_rcvbuf(m
->rtnl
, RCVBUF_SIZE
);
932 r
= sd_netlink_attach_event(m
->rtnl
, m
->event
, 0);
936 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWLINK
, &manager_rtnl_process_link
, m
);
940 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELLINK
, &manager_rtnl_process_link
, m
);
944 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWADDR
, &manager_rtnl_process_address
, m
);
948 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELADDR
, &manager_rtnl_process_address
, m
);
952 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWROUTE
, &manager_rtnl_process_route
, m
);
956 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELROUTE
, &manager_rtnl_process_route
, m
);
960 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWRULE
, &manager_rtnl_process_rule
, m
);
964 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELRULE
, &manager_rtnl_process_rule
, m
);
971 static int ordered_set_put_in_addr_data(OrderedSet
*s
, const struct in_addr_data
*address
) {
978 r
= in_addr_to_string(address
->family
, &address
->address
, &p
);
982 r
= ordered_set_consume(s
, p
);
989 static int ordered_set_put_in_addr_datav(OrderedSet
*s
, const struct in_addr_data
*addresses
, unsigned n
) {
994 assert(addresses
|| n
== 0);
996 for (i
= 0; i
< n
; i
++) {
997 r
= ordered_set_put_in_addr_data(s
, addresses
+i
);
1007 static int ordered_set_put_in4_addr(OrderedSet
*s
, const struct in_addr
*address
) {
1014 r
= in_addr_to_string(AF_INET
, (const union in_addr_union
*) address
, &p
);
1018 r
= ordered_set_consume(s
, p
);
1025 static int ordered_set_put_in4_addrv(OrderedSet
*s
, const struct in_addr
*addresses
, unsigned n
) {
1030 assert(n
== 0 || addresses
);
1032 for (i
= 0; i
< n
; i
++) {
1033 r
= ordered_set_put_in4_addr(s
, addresses
+i
);
1043 static void print_string_set(FILE *f
, const char *field
, OrderedSet
*s
) {
1048 if (ordered_set_isempty(s
))
1053 ORDERED_SET_FOREACH(p
, s
, i
)
1054 fputs_with_space(f
, p
, NULL
, &space
);
1059 static int manager_save(Manager
*m
) {
1060 _cleanup_ordered_set_free_free_ OrderedSet
*dns
= NULL
, *ntp
= NULL
, *search_domains
= NULL
, *route_domains
= NULL
;
1063 _cleanup_free_
char *temp_path
= NULL
;
1064 _cleanup_fclose_
FILE *f
= NULL
;
1065 LinkOperationalState operstate
= LINK_OPERSTATE_OFF
;
1066 const char *operstate_str
;
1070 assert(m
->state_file
);
1072 /* We add all NTP and DNS server to a set, to filter out duplicates */
1073 dns
= ordered_set_new(&string_hash_ops
);
1077 ntp
= ordered_set_new(&string_hash_ops
);
1081 search_domains
= ordered_set_new(&dns_name_hash_ops
);
1082 if (!search_domains
)
1085 route_domains
= ordered_set_new(&dns_name_hash_ops
);
1089 HASHMAP_FOREACH(link
, m
->links
, i
) {
1090 if (link
->flags
& IFF_LOOPBACK
)
1093 if (link
->operstate
> operstate
)
1094 operstate
= link
->operstate
;
1099 /* First add the static configured entries */
1100 r
= ordered_set_put_in_addr_datav(dns
, link
->network
->dns
, link
->network
->n_dns
);
1104 r
= ordered_set_put_strdupv(ntp
, link
->network
->ntp
);
1108 r
= ordered_set_put_strdupv(search_domains
, link
->network
->search_domains
);
1112 r
= ordered_set_put_strdupv(route_domains
, link
->network
->route_domains
);
1116 if (!link
->dhcp_lease
)
1119 /* Secondly, add the entries acquired via DHCP */
1120 if (link
->network
->dhcp_use_dns
) {
1121 const struct in_addr
*addresses
;
1123 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
1125 r
= ordered_set_put_in4_addrv(dns
, addresses
, r
);
1128 } else if (r
< 0 && r
!= -ENODATA
)
1132 if (link
->network
->dhcp_use_ntp
) {
1133 const struct in_addr
*addresses
;
1135 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
1137 r
= ordered_set_put_in4_addrv(ntp
, addresses
, r
);
1140 } else if (r
< 0 && r
!= -ENODATA
)
1144 if (link
->network
->dhcp_use_domains
!= DHCP_USE_DOMAINS_NO
) {
1145 const char *domainname
;
1146 char **domains
= NULL
;
1148 OrderedSet
*target_domains
= (link
->network
->dhcp_use_domains
== DHCP_USE_DOMAINS_YES
) ? search_domains
: route_domains
;
1149 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
1151 r
= ordered_set_put_strdup(target_domains
, domainname
);
1154 } else if (r
!= -ENODATA
)
1157 r
= sd_dhcp_lease_get_search_domains(link
->dhcp_lease
, &domains
);
1159 r
= ordered_set_put_strdupv(target_domains
, domains
);
1162 } else if (r
!= -ENODATA
)
1167 operstate_str
= link_operstate_to_string(operstate
);
1168 assert(operstate_str
);
1170 r
= fopen_temporary(m
->state_file
, &f
, &temp_path
);
1174 (void) __fsetlocking(f
, FSETLOCKING_BYCALLER
);
1175 (void) fchmod(fileno(f
), 0644);
1178 "# This is private data. Do not parse.\n"
1179 "OPER_STATE=%s\n", operstate_str
);
1181 print_string_set(f
, "DNS=", dns
);
1182 print_string_set(f
, "NTP=", ntp
);
1183 print_string_set(f
, "DOMAINS=", search_domains
);
1184 print_string_set(f
, "ROUTE_DOMAINS=", route_domains
);
1186 r
= routing_policy_serialize_rules(m
->rules
, f
);
1190 r
= fflush_and_check(f
);
1194 if (rename(temp_path
, m
->state_file
) < 0) {
1199 if (m
->operational_state
!= operstate
) {
1200 m
->operational_state
= operstate
;
1201 r
= manager_send_changed(m
, "OperationalState", NULL
);
1203 log_error_errno(r
, "Could not emit changed OperationalState: %m");
1211 (void) unlink(m
->state_file
);
1212 (void) unlink(temp_path
);
1214 return log_error_errno(r
, "Failed to save network state to %s: %m", m
->state_file
);
1217 static int manager_dirty_handler(sd_event_source
*s
, void *userdata
) {
1218 Manager
*m
= userdata
;
1228 SET_FOREACH(link
, m
->dirty_links
, i
) {
1229 r
= link_save(link
);
1237 int manager_new(Manager
**ret
, sd_event
*event
) {
1238 _cleanup_manager_free_ Manager
*m
= NULL
;
1241 m
= new0(Manager
, 1);
1245 m
->state_file
= strdup("/run/systemd/netif/state");
1249 m
->event
= sd_event_ref(event
);
1251 r
= sd_event_add_post(m
->event
, NULL
, manager_dirty_handler
, m
);
1255 r
= manager_connect_rtnl(m
);
1259 r
= manager_connect_udev(m
);
1263 m
->netdevs
= hashmap_new(&string_hash_ops
);
1267 LIST_HEAD_INIT(m
->networks
);
1269 r
= setup_default_address_pool(m
);
1273 m
->duid
.type
= DUID_TYPE_EN
;
1275 (void) routing_policy_load_rules(m
->state_file
, &m
->rules_saved
);
1283 void manager_free(Manager
*m
) {
1292 free(m
->state_file
);
1294 while ((network
= m
->networks
))
1295 network_free(network
);
1297 while ((link
= hashmap_first(m
->links
)))
1299 hashmap_free(m
->links
);
1301 hashmap_free(m
->networks_by_name
);
1303 while ((netdev
= hashmap_first(m
->netdevs
)))
1304 netdev_unref(netdev
);
1305 hashmap_free(m
->netdevs
);
1307 while ((pool
= m
->address_pools
))
1308 address_pool_free(pool
);
1311 set_free(m
->rules_foreign
);
1313 set_free_with_destructor(m
->rules_saved
, routing_policy_rule_free
);
1315 sd_netlink_unref(m
->rtnl
);
1316 sd_event_unref(m
->event
);
1318 sd_event_source_unref(m
->udev_event_source
);
1319 udev_monitor_unref(m
->udev_monitor
);
1320 udev_unref(m
->udev
);
1322 sd_bus_unref(m
->bus
);
1323 sd_bus_slot_unref(m
->prepare_for_sleep_slot
);
1324 sd_event_source_unref(m
->bus_retry_event_source
);
1326 free(m
->dynamic_timezone
);
1327 free(m
->dynamic_hostname
);
1332 int manager_start(Manager
*m
) {
1338 /* The dirty handler will deal with future serialization, but the first one
1339 must be done explicitly. */
1343 HASHMAP_FOREACH(link
, m
->links
, i
)
1349 int manager_load_config(Manager
*m
) {
1352 /* update timestamp */
1353 paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, true);
1359 r
= network_load(m
);
1366 bool manager_should_reload(Manager
*m
) {
1367 return paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, false);
1370 int manager_rtnl_enumerate_links(Manager
*m
) {
1371 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1372 sd_netlink_message
*link
;
1378 r
= sd_rtnl_message_new_link(m
->rtnl
, &req
, RTM_GETLINK
, 0);
1382 r
= sd_netlink_message_request_dump(req
, true);
1386 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1390 for (link
= reply
; link
; link
= sd_netlink_message_next(link
)) {
1393 m
->enumerating
= true;
1395 k
= manager_rtnl_process_link(m
->rtnl
, link
, m
);
1399 m
->enumerating
= false;
1405 int manager_rtnl_enumerate_addresses(Manager
*m
) {
1406 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1407 sd_netlink_message
*addr
;
1413 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, 0, 0);
1417 r
= sd_netlink_message_request_dump(req
, true);
1421 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1425 for (addr
= reply
; addr
; addr
= sd_netlink_message_next(addr
)) {
1428 m
->enumerating
= true;
1430 k
= manager_rtnl_process_address(m
->rtnl
, addr
, m
);
1434 m
->enumerating
= false;
1440 int manager_rtnl_enumerate_routes(Manager
*m
) {
1441 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1442 sd_netlink_message
*route
;
1448 r
= sd_rtnl_message_new_route(m
->rtnl
, &req
, RTM_GETROUTE
, 0, 0);
1452 r
= sd_netlink_message_request_dump(req
, true);
1456 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1460 for (route
= reply
; route
; route
= sd_netlink_message_next(route
)) {
1463 m
->enumerating
= true;
1465 k
= manager_rtnl_process_route(m
->rtnl
, route
, m
);
1469 m
->enumerating
= false;
1475 int manager_rtnl_enumerate_rules(Manager
*m
) {
1476 _cleanup_(sd_netlink_message_unrefp
) sd_netlink_message
*req
= NULL
, *reply
= NULL
;
1477 sd_netlink_message
*rule
;
1483 r
= sd_rtnl_message_new_routing_policy_rule(m
->rtnl
, &req
, RTM_GETRULE
, 0);
1487 r
= sd_netlink_message_request_dump(req
, true);
1491 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1493 if (r
== -EOPNOTSUPP
) {
1494 log_debug("FIB Rules are not supported by the kernel. Ignoring.");
1501 for (rule
= reply
; rule
; rule
= sd_netlink_message_next(rule
)) {
1504 m
->enumerating
= true;
1506 k
= manager_rtnl_process_rule(m
->rtnl
, rule
, m
);
1510 m
->enumerating
= false;
1516 int manager_address_pool_acquire(Manager
*m
, int family
, unsigned prefixlen
, union in_addr_union
*found
) {
1521 assert(prefixlen
> 0);
1524 LIST_FOREACH(address_pools
, p
, m
->address_pools
) {
1525 if (p
->family
!= family
)
1528 r
= address_pool_acquire(p
, prefixlen
, found
);
1536 Link
* manager_find_uplink(Manager
*m
, Link
*exclude
) {
1537 _cleanup_free_
struct local_address
*gateways
= NULL
;
1542 /* Looks for a suitable "uplink", via black magic: an
1543 * interface that is up and where the default route with the
1544 * highest priority points to. */
1546 n
= local_gateways(m
->rtnl
, 0, AF_UNSPEC
, &gateways
);
1548 log_warning_errno(n
, "Failed to determine list of default gateways: %m");
1552 for (i
= 0; i
< n
; i
++) {
1555 link
= hashmap_get(m
->links
, INT_TO_PTR(gateways
[i
].ifindex
));
1557 log_debug("Weird, found a gateway for a link we don't know. Ignoring.");
1561 if (link
== exclude
)
1564 if (link
->operstate
< LINK_OPERSTATE_ROUTABLE
)
1573 void manager_dirty(Manager
*manager
) {
1576 /* the serialized state in /run is no longer up-to-date */
1577 manager
->dirty
= true;
1580 static int set_hostname_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1581 Manager
*manager
= userdata
;
1582 const sd_bus_error
*e
;
1587 e
= sd_bus_message_get_error(m
);
1589 log_warning_errno(sd_bus_error_get_errno(e
), "Could not set hostname: %s", e
->message
);
1594 int manager_set_hostname(Manager
*m
, const char *hostname
) {
1597 log_debug("Setting transient hostname: '%s'", strna(hostname
));
1598 if (free_and_strdup(&m
->dynamic_hostname
, hostname
) < 0)
1602 /* TODO: replace by assert when we can rely on kdbus */
1603 log_info("Not connected to system bus, ignoring transient hostname.");
1607 r
= sd_bus_call_method_async(
1610 "org.freedesktop.hostname1",
1611 "/org/freedesktop/hostname1",
1612 "org.freedesktop.hostname1",
1614 set_hostname_handler
,
1621 return log_error_errno(r
, "Could not set transient hostname: %m");
1626 static int set_timezone_handler(sd_bus_message
*m
, void *userdata
, sd_bus_error
*ret_error
) {
1627 Manager
*manager
= userdata
;
1628 const sd_bus_error
*e
;
1633 e
= sd_bus_message_get_error(m
);
1635 log_warning_errno(sd_bus_error_get_errno(e
), "Could not set timezone: %s", e
->message
);
1640 int manager_set_timezone(Manager
*m
, const char *tz
) {
1646 log_debug("Setting system timezone: '%s'", tz
);
1647 if (free_and_strdup(&m
->dynamic_timezone
, tz
) < 0)
1651 log_info("Not connected to system bus, ignoring timezone.");
1655 r
= sd_bus_call_method_async(
1658 "org.freedesktop.timedate1",
1659 "/org/freedesktop/timedate1",
1660 "org.freedesktop.timedate1",
1662 set_timezone_handler
,
1668 return log_error_errno(r
, "Could not set timezone: %m");