1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2013 Tom Gundersen <teg@jklm.no>
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22 #include <sys/socket.h>
25 #include "sd-daemon.h"
26 #include "sd-netlink.h"
29 #include "conf-parser.h"
31 #include "libudev-private.h"
32 #include "local-addresses.h"
33 #include "netlink-util.h"
35 #include "path-util.h"
37 #include "udev-util.h"
40 /* use 8 MB for receive socket kernel queue. */
41 #define RCVBUF_SIZE (8*1024*1024)
43 const char* const network_dirs
[] = {
44 "/etc/systemd/network",
45 "/run/systemd/network",
46 "/usr/lib/systemd/network",
48 "/lib/systemd/network",
52 static int setup_default_address_pool(Manager
*m
) {
58 /* Add in the well-known private address ranges. */
60 r
= address_pool_new_from_string(m
, &p
, AF_INET6
, "fc00::", 7);
64 r
= address_pool_new_from_string(m
, &p
, AF_INET
, "192.168.0.0", 16);
68 r
= address_pool_new_from_string(m
, &p
, AF_INET
, "172.16.0.0", 12);
72 r
= address_pool_new_from_string(m
, &p
, AF_INET
, "10.0.0.0", 8);
79 static int on_bus_retry(sd_event_source
*s
, usec_t usec
, void *userdata
) {
80 Manager
*m
= userdata
;
85 m
->bus_retry_event_source
= sd_event_source_unref(m
->bus_retry_event_source
);
87 manager_connect_bus(m
);
92 static int manager_reset_all(Manager
*m
) {
99 HASHMAP_FOREACH(link
, m
->links
, i
) {
100 r
= link_carrier_reset(link
);
102 log_link_warning_errno(link
, r
, "Could not reset carrier: %m");
108 static int match_prepare_for_sleep(sd_bus_message
*message
, void *userdata
, sd_bus_error
*ret_error
) {
109 Manager
*m
= userdata
;
114 r
= sd_bus_message_read(message
, "b", &b
);
116 log_debug_errno(r
, "Failed to parse PrepareForSleep signal: %m");
123 log_debug("Coming back from suspend, resetting all connections...");
125 manager_reset_all(m
);
130 int manager_connect_bus(Manager
*m
) {
135 r
= sd_bus_default_system(&m
->bus
);
137 /* We failed to connect? Yuck, we must be in early
138 * boot. Let's try in 5s again. As soon as we have
139 * kdbus we can stop doing this... */
141 log_debug_errno(r
, "Failed to connect to bus, trying again in 5s: %m");
143 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
);
145 return log_error_errno(r
, "Failed to install bus reconnect time event: %m");
153 r
= sd_bus_add_match(m
->bus
, &m
->prepare_for_sleep_slot
,
155 "sender='org.freedesktop.login1',"
156 "interface='org.freedesktop.login1.Manager',"
157 "member='PrepareForSleep',"
158 "path='/org/freedesktop/login1'",
159 match_prepare_for_sleep
,
162 return log_error_errno(r
, "Failed to add match for PrepareForSleep: %m");
164 r
= sd_bus_add_object_vtable(m
->bus
, NULL
, "/org/freedesktop/network1", "org.freedesktop.network1.Manager", manager_vtable
, m
);
166 return log_error_errno(r
, "Failed to add manager object vtable: %m");
168 r
= sd_bus_add_fallback_vtable(m
->bus
, NULL
, "/org/freedesktop/network1/link", "org.freedesktop.network1.Link", link_vtable
, link_object_find
, m
);
170 return log_error_errno(r
, "Failed to add link object vtable: %m");
172 r
= sd_bus_add_node_enumerator(m
->bus
, NULL
, "/org/freedesktop/network1/link", link_node_enumerator
, m
);
174 return log_error_errno(r
, "Failed to add link enumerator: %m");
176 r
= sd_bus_add_fallback_vtable(m
->bus
, NULL
, "/org/freedesktop/network1/network", "org.freedesktop.network1.Network", network_vtable
, network_object_find
, m
);
178 return log_error_errno(r
, "Failed to add network object vtable: %m");
180 r
= sd_bus_add_node_enumerator(m
->bus
, NULL
, "/org/freedesktop/network1/network", network_node_enumerator
, m
);
182 return log_error_errno(r
, "Failed to add network enumerator: %m");
184 r
= sd_bus_request_name(m
->bus
, "org.freedesktop.network1", 0);
186 return log_error_errno(r
, "Failed to register name: %m");
188 r
= sd_bus_attach_event(m
->bus
, m
->event
, 0);
190 return log_error_errno(r
, "Failed to attach bus to event loop: %m");
195 static int manager_udev_process_link(Manager
*m
, struct udev_device
*device
) {
202 if (!streq_ptr(udev_device_get_action(device
), "add"))
205 ifindex
= udev_device_get_ifindex(device
);
207 log_debug("Ignoring udev ADD event for device with invalid ifindex");
211 r
= link_get(m
, ifindex
, &link
);
217 r
= link_initialized(link
, device
);
224 static int manager_dispatch_link_udev(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
225 Manager
*m
= userdata
;
226 struct udev_monitor
*monitor
= m
->udev_monitor
;
227 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
229 device
= udev_monitor_receive_device(monitor
);
233 manager_udev_process_link(m
, device
);
237 static int manager_connect_udev(Manager
*m
) {
240 /* udev does not initialize devices inside containers,
241 * so we rely on them being already initialized before
242 * entering the container */
243 if (detect_container() > 0)
246 m
->udev
= udev_new();
250 m
->udev_monitor
= udev_monitor_new_from_netlink(m
->udev
, "udev");
251 if (!m
->udev_monitor
)
254 r
= udev_monitor_filter_add_match_subsystem_devtype(m
->udev_monitor
, "net", NULL
);
256 return log_error_errno(r
, "Could not add udev monitor filter: %m");
258 r
= udev_monitor_enable_receiving(m
->udev_monitor
);
260 log_error("Could not enable udev monitor");
264 r
= sd_event_add_io(m
->event
,
265 &m
->udev_event_source
,
266 udev_monitor_get_fd(m
->udev_monitor
),
267 EPOLLIN
, manager_dispatch_link_udev
,
272 r
= sd_event_source_set_description(m
->udev_event_source
, "networkd-udev");
279 int manager_rtnl_process_address(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
280 Manager
*m
= userdata
;
285 unsigned char prefixlen
;
287 union in_addr_union in_addr
;
288 struct ifa_cacheinfo cinfo
;
289 Address
*address
= NULL
;
290 char buf
[INET6_ADDRSTRLEN
], valid_buf
[FORMAT_TIMESPAN_MAX
];
291 const char *valid_str
= NULL
;
298 if (sd_netlink_message_is_error(message
)) {
299 r
= sd_netlink_message_get_errno(message
);
301 log_warning_errno(r
, "rtnl: failed to receive address: %m");
306 r
= sd_netlink_message_get_type(message
, &type
);
308 log_warning_errno(r
, "rtnl: could not get message type: %m");
310 } else if (type
!= RTM_NEWADDR
&& type
!= RTM_DELADDR
) {
311 log_warning("rtnl: received unexpected message type when processing address");
315 r
= sd_rtnl_message_addr_get_ifindex(message
, &ifindex
);
317 log_warning_errno(r
, "rtnl: could not get ifindex from address: %m");
319 } else if (ifindex
<= 0) {
320 log_warning("rtnl: received address message with invalid ifindex: %d", ifindex
);
323 r
= link_get(m
, ifindex
, &link
);
324 if (r
< 0 || !link
) {
325 /* when enumerating we might be out of sync, but we will
326 * get the address again, so just ignore it */
328 log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex
);
333 r
= sd_rtnl_message_addr_get_family(message
, &family
);
334 if (r
< 0 || !IN_SET(family
, AF_INET
, AF_INET6
)) {
335 log_link_warning(link
, "rtnl: received address with invalid family, ignoring.");
339 r
= sd_rtnl_message_addr_get_prefixlen(message
, &prefixlen
);
341 log_link_warning_errno(link
, r
, "rtnl: received address with invalid prefixlen, ignoring: %m");
345 r
= sd_rtnl_message_addr_get_scope(message
, &scope
);
347 log_link_warning_errno(link
, r
, "rtnl: received address with invalid scope, ignoring: %m");
351 r
= sd_rtnl_message_addr_get_flags(message
, &flags
);
353 log_link_warning_errno(link
, r
, "rtnl: received address with invalid flags, ignoring: %m");
359 r
= sd_netlink_message_read_in_addr(message
, IFA_LOCAL
, &in_addr
.in
);
361 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
368 r
= sd_netlink_message_read_in6_addr(message
, IFA_ADDRESS
, &in_addr
.in6
);
370 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
377 assert_not_reached("invalid address family");
380 if (!inet_ntop(family
, &in_addr
, buf
, INET6_ADDRSTRLEN
)) {
381 log_link_warning(link
, "Could not print address");
385 r
= sd_netlink_message_read_cache_info(message
, IFA_CACHEINFO
, &cinfo
);
387 if (cinfo
.ifa_valid
== CACHE_INFO_INFINITY_LIFE_TIME
)
390 valid_str
= format_timespan(valid_buf
, FORMAT_TIMESPAN_MAX
,
391 cinfo
.ifa_valid
* USEC_PER_SEC
,
395 address_get(link
, family
, &in_addr
, prefixlen
, &address
);
400 log_link_debug(link
, "Updating address: %s/%u (valid for %s)", buf
, prefixlen
, valid_str
);
402 /* An address appeared that we did not request */
403 r
= address_add_foreign(link
, family
, &in_addr
, prefixlen
, &address
);
405 log_link_warning_errno(link
, r
, "Failed to add address %s/%u: %m", buf
, prefixlen
);
408 log_link_debug(link
, "Adding address: %s/%u (valid for %s)", buf
, prefixlen
, valid_str
);
411 address_update(address
, flags
, scope
, &cinfo
);
418 log_link_debug(link
, "Removing address: %s/%u (valid for %s)", buf
, prefixlen
, valid_str
);
419 address_drop(address
);
421 log_link_warning(link
, "Removing non-existent address: %s/%u (valid for %s)", buf
, prefixlen
, valid_str
);
425 assert_not_reached("Received invalid RTNL message type");
431 static int manager_rtnl_process_link(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
432 Manager
*m
= userdata
;
434 NetDev
*netdev
= NULL
;
443 if (sd_netlink_message_is_error(message
)) {
444 r
= sd_netlink_message_get_errno(message
);
446 log_warning_errno(r
, "rtnl: Could not receive link: %m");
451 r
= sd_netlink_message_get_type(message
, &type
);
453 log_warning_errno(r
, "rtnl: Could not get message type: %m");
455 } else if (type
!= RTM_NEWLINK
&& type
!= RTM_DELLINK
) {
456 log_warning("rtnl: Received unexpected message type when processing link");
460 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
462 log_warning_errno(r
, "rtnl: Could not get ifindex from link: %m");
464 } else if (ifindex
<= 0) {
465 log_warning("rtnl: received link message with invalid ifindex: %d", ifindex
);
468 link_get(m
, ifindex
, &link
);
470 r
= sd_netlink_message_read_string(message
, IFLA_IFNAME
, &name
);
472 log_warning_errno(r
, "rtnl: Received link message without ifname: %m");
475 netdev_get(m
, name
, &netdev
);
480 /* link is new, so add it */
481 r
= link_add(m
, message
, &link
);
483 log_warning_errno(r
, "Could not add new link: %m");
489 /* netdev exists, so make sure the ifindex matches */
490 r
= netdev_set_ifindex(netdev
, message
);
492 log_warning_errno(r
, "Could not set ifindex on netdev: %m");
497 r
= link_update(link
, message
);
510 assert_not_reached("Received invalid RTNL message type.");
516 static int systemd_netlink_fd(void) {
517 int n
, fd
, rtnl_fd
= -EINVAL
;
519 n
= sd_listen_fds(true);
523 for (fd
= SD_LISTEN_FDS_START
; fd
< SD_LISTEN_FDS_START
+ n
; fd
++) {
524 if (sd_is_socket(fd
, AF_NETLINK
, SOCK_RAW
, -1) > 0) {
535 static int manager_connect_rtnl(Manager
*m
) {
540 fd
= systemd_netlink_fd();
542 r
= sd_netlink_open(&m
->rtnl
);
544 r
= sd_netlink_open_fd(&m
->rtnl
, fd
);
548 r
= sd_netlink_inc_rcvbuf(m
->rtnl
, RCVBUF_SIZE
);
552 r
= sd_netlink_attach_event(m
->rtnl
, m
->event
, 0);
556 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWLINK
, &manager_rtnl_process_link
, m
);
560 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELLINK
, &manager_rtnl_process_link
, m
);
564 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWADDR
, &manager_rtnl_process_address
, m
);
568 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELADDR
, &manager_rtnl_process_address
, m
);
575 static int set_put_in_addr(Set
*s
, const struct in_addr
*address
) {
581 r
= in_addr_to_string(AF_INET
, (const union in_addr_union
*) address
, &p
);
585 r
= set_consume(s
, p
);
592 static int set_put_in_addrv(Set
*s
, const struct in_addr
*addresses
, int n
) {
596 assert(n
<= 0 || addresses
);
598 for (i
= 0; i
< n
; i
++) {
599 r
= set_put_in_addr(s
, addresses
+i
);
609 static void print_string_set(FILE *f
, const char *field
, Set
*s
) {
619 SET_FOREACH(p
, s
, i
) {
628 static int manager_save(Manager
*m
) {
629 _cleanup_set_free_free_ Set
*dns
= NULL
, *ntp
= NULL
, *domains
= NULL
;
632 _cleanup_free_
char *temp_path
= NULL
;
633 _cleanup_fclose_
FILE *f
= NULL
;
634 LinkOperationalState operstate
= LINK_OPERSTATE_OFF
;
635 const char *operstate_str
;
639 assert(m
->state_file
);
641 /* We add all NTP and DNS server to a set, to filter out duplicates */
642 dns
= set_new(&string_hash_ops
);
646 ntp
= set_new(&string_hash_ops
);
650 domains
= set_new(&string_hash_ops
);
654 HASHMAP_FOREACH(link
, m
->links
, i
) {
655 if (link
->flags
& IFF_LOOPBACK
)
658 if (link
->operstate
> operstate
)
659 operstate
= link
->operstate
;
664 /* First add the static configured entries */
665 r
= set_put_strdupv(dns
, link
->network
->dns
);
669 r
= set_put_strdupv(ntp
, link
->network
->ntp
);
673 r
= set_put_strdupv(domains
, link
->network
->domains
);
677 if (!link
->dhcp_lease
)
680 /* Secondly, add the entries acquired via DHCP */
681 if (link
->network
->dhcp_dns
) {
682 const struct in_addr
*addresses
;
684 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
686 r
= set_put_in_addrv(dns
, addresses
, r
);
689 } else if (r
< 0 && r
!= -ENODATA
)
693 if (link
->network
->dhcp_ntp
) {
694 const struct in_addr
*addresses
;
696 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
698 r
= set_put_in_addrv(ntp
, addresses
, r
);
701 } else if (r
< 0 && r
!= -ENODATA
)
705 if (link
->network
->dhcp_domains
) {
706 const char *domainname
;
708 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
710 r
= set_put_strdup(domains
, domainname
);
713 } else if (r
!= -ENODATA
)
718 operstate_str
= link_operstate_to_string(operstate
);
719 assert(operstate_str
);
721 r
= fopen_temporary(m
->state_file
, &f
, &temp_path
);
725 fchmod(fileno(f
), 0644);
728 "# This is private data. Do not parse.\n"
729 "OPER_STATE=%s\n", operstate_str
);
731 print_string_set(f
, "DNS=", dns
);
732 print_string_set(f
, "NTP=", ntp
);
733 print_string_set(f
, "DOMAINS=", domains
);
735 r
= fflush_and_check(f
);
739 if (rename(temp_path
, m
->state_file
) < 0) {
744 if (m
->operational_state
!= operstate
) {
745 m
->operational_state
= operstate
;
746 r
= manager_send_changed(m
, "OperationalState", NULL
);
748 log_error_errno(r
, "Could not emit changed OperationalState: %m");
756 (void) unlink(m
->state_file
);
757 (void) unlink(temp_path
);
759 return log_error_errno(r
, "Failed to save network state to %s: %m", m
->state_file
);
762 static int manager_dirty_handler(sd_event_source
*s
, void *userdata
) {
763 Manager
*m
= userdata
;
773 SET_FOREACH(link
, m
->dirty_links
, i
) {
782 int manager_new(Manager
**ret
) {
783 _cleanup_manager_free_ Manager
*m
= NULL
;
786 m
= new0(Manager
, 1);
790 m
->state_file
= strdup("/run/systemd/netif/state");
794 r
= sd_event_default(&m
->event
);
798 sd_event_set_watchdog(m
->event
, true);
800 sd_event_add_signal(m
->event
, NULL
, SIGTERM
, NULL
, NULL
);
801 sd_event_add_signal(m
->event
, NULL
, SIGINT
, NULL
, NULL
);
803 r
= sd_event_add_post(m
->event
, NULL
, manager_dirty_handler
, m
);
807 r
= manager_connect_rtnl(m
);
811 r
= manager_connect_udev(m
);
815 m
->netdevs
= hashmap_new(&string_hash_ops
);
819 LIST_HEAD_INIT(m
->networks
);
821 r
= setup_default_address_pool(m
);
831 void manager_free(Manager
*m
) {
842 while ((link
= hashmap_first(m
->links
)))
844 hashmap_free(m
->links
);
846 while ((network
= m
->networks
))
847 network_free(network
);
849 hashmap_free(m
->networks_by_name
);
851 while ((netdev
= hashmap_first(m
->netdevs
)))
852 netdev_unref(netdev
);
853 hashmap_free(m
->netdevs
);
855 while ((pool
= m
->address_pools
))
856 address_pool_free(pool
);
858 sd_netlink_unref(m
->rtnl
);
859 sd_event_unref(m
->event
);
861 sd_event_source_unref(m
->udev_event_source
);
862 udev_monitor_unref(m
->udev_monitor
);
865 sd_bus_unref(m
->bus
);
866 sd_bus_slot_unref(m
->prepare_for_sleep_slot
);
867 sd_event_source_unref(m
->bus_retry_event_source
);
872 static bool manager_check_idle(void *userdata
) {
873 Manager
*m
= userdata
;
879 HASHMAP_FOREACH(link
, m
->links
, i
) {
880 /* we are not woken on udev activity, so let's just wait for the
881 * pending udev event */
882 if (link
->state
== LINK_STATE_PENDING
)
888 /* we are not woken on netork activity, so let's stay around */
889 if (link_lldp_enabled(link
) ||
890 link_ipv4ll_enabled(link
) ||
891 link_dhcp4_server_enabled(link
) ||
892 link_dhcp4_enabled(link
) ||
893 link_dhcp6_enabled(link
))
900 int manager_run(Manager
*m
) {
906 /* The dirty handler will deal with future serialization, but the first one
907 must be done explicitly. */
911 HASHMAP_FOREACH(link
, m
->links
, i
)
915 return bus_event_loop_with_idle(
918 "org.freedesktop.network1",
923 /* failed to connect to the bus, so we lose exit-on-idle logic,
924 this should not happen except if dbus is not around at all */
925 return sd_event_loop(m
->event
);
928 int manager_load_config(Manager
*m
) {
931 /* update timestamp */
932 paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, true);
945 bool manager_should_reload(Manager
*m
) {
946 return paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, false);
949 int manager_rtnl_enumerate_links(Manager
*m
) {
950 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
, *reply
= NULL
;
951 sd_netlink_message
*link
;
957 r
= sd_rtnl_message_new_link(m
->rtnl
, &req
, RTM_GETLINK
, 0);
961 r
= sd_netlink_message_request_dump(req
, true);
965 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
969 for (link
= reply
; link
; link
= sd_netlink_message_next(link
)) {
972 m
->enumerating
= true;
974 k
= manager_rtnl_process_link(m
->rtnl
, link
, m
);
978 m
->enumerating
= false;
984 int manager_rtnl_enumerate_addresses(Manager
*m
) {
985 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
, *reply
= NULL
;
986 sd_netlink_message
*addr
;
992 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, 0, 0);
996 r
= sd_netlink_message_request_dump(req
, true);
1000 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1004 for (addr
= reply
; addr
; addr
= sd_netlink_message_next(addr
)) {
1007 m
->enumerating
= true;
1009 k
= manager_rtnl_process_address(m
->rtnl
, addr
, m
);
1013 m
->enumerating
= false;
1019 int manager_address_pool_acquire(Manager
*m
, int family
, unsigned prefixlen
, union in_addr_union
*found
) {
1024 assert(prefixlen
> 0);
1027 LIST_FOREACH(address_pools
, p
, m
->address_pools
) {
1028 if (p
->family
!= family
)
1031 r
= address_pool_acquire(p
, prefixlen
, found
);
1039 Link
* manager_find_uplink(Manager
*m
, Link
*exclude
) {
1040 _cleanup_free_
struct local_address
*gateways
= NULL
;
1045 /* Looks for a suitable "uplink", via black magic: an
1046 * interface that is up and where the default route with the
1047 * highest priority points to. */
1049 n
= local_gateways(m
->rtnl
, 0, AF_UNSPEC
, &gateways
);
1051 log_warning_errno(n
, "Failed to determine list of default gateways: %m");
1055 for (i
= 0; i
< n
; i
++) {
1058 link
= hashmap_get(m
->links
, INT_TO_PTR(gateways
[i
].ifindex
));
1060 log_debug("Weird, found a gateway for a link we don't know. Ignoring.");
1064 if (link
== exclude
)
1067 if (link
->operstate
< LINK_OPERSTATE_ROUTABLE
)
1076 void manager_dirty(Manager
*manager
) {
1079 /* the serialized state in /run is no longer up-to-date */
1080 manager
->dirty
= true;