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"
32 #include "libudev-private.h"
33 #include "local-addresses.h"
34 #include "netlink-util.h"
36 #include "path-util.h"
38 #include "udev-util.h"
41 /* use 8 MB for receive socket kernel queue. */
42 #define RCVBUF_SIZE (8*1024*1024)
44 const char* const network_dirs
[] = {
45 "/etc/systemd/network",
46 "/run/systemd/network",
47 "/usr/lib/systemd/network",
49 "/lib/systemd/network",
53 static int setup_default_address_pool(Manager
*m
) {
59 /* Add in the well-known private address ranges. */
61 r
= address_pool_new_from_string(m
, &p
, AF_INET6
, "fc00::", 7);
65 r
= address_pool_new_from_string(m
, &p
, AF_INET
, "192.168.0.0", 16);
69 r
= address_pool_new_from_string(m
, &p
, AF_INET
, "172.16.0.0", 12);
73 r
= address_pool_new_from_string(m
, &p
, AF_INET
, "10.0.0.0", 8);
80 static int on_bus_retry(sd_event_source
*s
, usec_t usec
, void *userdata
) {
81 Manager
*m
= userdata
;
86 m
->bus_retry_event_source
= sd_event_source_unref(m
->bus_retry_event_source
);
88 manager_connect_bus(m
);
93 static int manager_reset_all(Manager
*m
) {
100 HASHMAP_FOREACH(link
, m
->links
, i
) {
101 r
= link_carrier_reset(link
);
103 log_link_warning_errno(link
, r
, "Could not reset carrier: %m");
109 static int match_prepare_for_sleep(sd_bus_message
*message
, void *userdata
, sd_bus_error
*ret_error
) {
110 Manager
*m
= userdata
;
115 r
= sd_bus_message_read(message
, "b", &b
);
117 log_debug_errno(r
, "Failed to parse PrepareForSleep signal: %m");
124 log_debug("Coming back from suspend, resetting all connections...");
126 manager_reset_all(m
);
131 int manager_connect_bus(Manager
*m
) {
136 r
= sd_bus_default_system(&m
->bus
);
138 /* We failed to connect? Yuck, we must be in early
139 * boot. Let's try in 5s again. As soon as we have
140 * kdbus we can stop doing this... */
142 log_debug_errno(r
, "Failed to connect to bus, trying again in 5s: %m");
144 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
);
146 return log_error_errno(r
, "Failed to install bus reconnect time event: %m");
154 r
= sd_bus_add_match(m
->bus
, &m
->prepare_for_sleep_slot
,
156 "sender='org.freedesktop.login1',"
157 "interface='org.freedesktop.login1.Manager',"
158 "member='PrepareForSleep',"
159 "path='/org/freedesktop/login1'",
160 match_prepare_for_sleep
,
163 return log_error_errno(r
, "Failed to add match for PrepareForSleep: %m");
165 r
= sd_bus_add_object_vtable(m
->bus
, NULL
, "/org/freedesktop/network1", "org.freedesktop.network1.Manager", manager_vtable
, m
);
167 return log_error_errno(r
, "Failed to add manager object vtable: %m");
169 r
= sd_bus_add_fallback_vtable(m
->bus
, NULL
, "/org/freedesktop/network1/link", "org.freedesktop.network1.Link", link_vtable
, link_object_find
, m
);
171 return log_error_errno(r
, "Failed to add link object vtable: %m");
173 r
= sd_bus_add_node_enumerator(m
->bus
, NULL
, "/org/freedesktop/network1/link", link_node_enumerator
, m
);
175 return log_error_errno(r
, "Failed to add link enumerator: %m");
177 r
= sd_bus_add_fallback_vtable(m
->bus
, NULL
, "/org/freedesktop/network1/network", "org.freedesktop.network1.Network", network_vtable
, network_object_find
, m
);
179 return log_error_errno(r
, "Failed to add network object vtable: %m");
181 r
= sd_bus_add_node_enumerator(m
->bus
, NULL
, "/org/freedesktop/network1/network", network_node_enumerator
, m
);
183 return log_error_errno(r
, "Failed to add network enumerator: %m");
185 r
= sd_bus_request_name(m
->bus
, "org.freedesktop.network1", 0);
187 return log_error_errno(r
, "Failed to register name: %m");
189 r
= sd_bus_attach_event(m
->bus
, m
->event
, 0);
191 return log_error_errno(r
, "Failed to attach bus to event loop: %m");
196 static int manager_udev_process_link(Manager
*m
, struct udev_device
*device
) {
203 if (!streq_ptr(udev_device_get_action(device
), "add"))
206 ifindex
= udev_device_get_ifindex(device
);
208 log_debug("Ignoring udev ADD event for device with invalid ifindex");
212 r
= link_get(m
, ifindex
, &link
);
218 r
= link_initialized(link
, device
);
225 static int manager_dispatch_link_udev(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
226 Manager
*m
= userdata
;
227 struct udev_monitor
*monitor
= m
->udev_monitor
;
228 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
230 device
= udev_monitor_receive_device(monitor
);
234 manager_udev_process_link(m
, device
);
238 static int manager_connect_udev(Manager
*m
) {
241 /* udev does not initialize devices inside containers,
242 * so we rely on them being already initialized before
243 * entering the container */
244 if (detect_container() > 0)
247 m
->udev
= udev_new();
251 m
->udev_monitor
= udev_monitor_new_from_netlink(m
->udev
, "udev");
252 if (!m
->udev_monitor
)
255 r
= udev_monitor_filter_add_match_subsystem_devtype(m
->udev_monitor
, "net", NULL
);
257 return log_error_errno(r
, "Could not add udev monitor filter: %m");
259 r
= udev_monitor_enable_receiving(m
->udev_monitor
);
261 log_error("Could not enable udev monitor");
265 r
= sd_event_add_io(m
->event
,
266 &m
->udev_event_source
,
267 udev_monitor_get_fd(m
->udev_monitor
),
268 EPOLLIN
, manager_dispatch_link_udev
,
273 r
= sd_event_source_set_description(m
->udev_event_source
, "networkd-udev");
280 int manager_rtnl_process_address(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
281 Manager
*m
= userdata
;
286 unsigned char prefixlen
;
288 union in_addr_union in_addr
;
289 struct ifa_cacheinfo cinfo
;
290 Address
*address
= NULL
;
291 char buf
[INET6_ADDRSTRLEN
], valid_buf
[FORMAT_TIMESPAN_MAX
];
292 const char *valid_str
= NULL
;
299 if (sd_netlink_message_is_error(message
)) {
300 r
= sd_netlink_message_get_errno(message
);
302 log_warning_errno(r
, "rtnl: failed to receive address: %m");
307 r
= sd_netlink_message_get_type(message
, &type
);
309 log_warning_errno(r
, "rtnl: could not get message type: %m");
311 } else if (type
!= RTM_NEWADDR
&& type
!= RTM_DELADDR
) {
312 log_warning("rtnl: received unexpected message type when processing address");
316 r
= sd_rtnl_message_addr_get_ifindex(message
, &ifindex
);
318 log_warning_errno(r
, "rtnl: could not get ifindex from address: %m");
320 } else if (ifindex
<= 0) {
321 log_warning("rtnl: received address message with invalid ifindex: %d", ifindex
);
324 r
= link_get(m
, ifindex
, &link
);
325 if (r
< 0 || !link
) {
326 /* when enumerating we might be out of sync, but we will
327 * get the address again, so just ignore it */
329 log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex
);
334 r
= sd_rtnl_message_addr_get_family(message
, &family
);
335 if (r
< 0 || !IN_SET(family
, AF_INET
, AF_INET6
)) {
336 log_link_warning(link
, "rtnl: received address with invalid family, ignoring.");
340 r
= sd_rtnl_message_addr_get_prefixlen(message
, &prefixlen
);
342 log_link_warning_errno(link
, r
, "rtnl: received address with invalid prefixlen, ignoring: %m");
346 r
= sd_rtnl_message_addr_get_scope(message
, &scope
);
348 log_link_warning_errno(link
, r
, "rtnl: received address with invalid scope, ignoring: %m");
352 r
= sd_rtnl_message_addr_get_flags(message
, &flags
);
354 log_link_warning_errno(link
, r
, "rtnl: received address with invalid flags, ignoring: %m");
360 r
= sd_netlink_message_read_in_addr(message
, IFA_LOCAL
, &in_addr
.in
);
362 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
369 r
= sd_netlink_message_read_in6_addr(message
, IFA_ADDRESS
, &in_addr
.in6
);
371 log_link_warning_errno(link
, r
, "rtnl: received address without valid address, ignoring: %m");
378 assert_not_reached("invalid address family");
381 if (!inet_ntop(family
, &in_addr
, buf
, INET6_ADDRSTRLEN
)) {
382 log_link_warning(link
, "Could not print address");
386 r
= sd_netlink_message_read_cache_info(message
, IFA_CACHEINFO
, &cinfo
);
388 if (cinfo
.ifa_valid
== CACHE_INFO_INFINITY_LIFE_TIME
)
391 valid_str
= format_timespan(valid_buf
, FORMAT_TIMESPAN_MAX
,
392 cinfo
.ifa_valid
* USEC_PER_SEC
,
396 address_get(link
, family
, &in_addr
, prefixlen
, &address
);
401 log_link_debug(link
, "Updating address: %s/%u (valid for %s)", buf
, prefixlen
, valid_str
);
403 /* An address appeared that we did not request */
404 r
= address_add_foreign(link
, family
, &in_addr
, prefixlen
, &address
);
406 log_link_warning_errno(link
, r
, "Failed to add address %s/%u: %m", buf
, prefixlen
);
409 log_link_debug(link
, "Adding address: %s/%u (valid for %s)", buf
, prefixlen
, valid_str
);
412 address_update(address
, flags
, scope
, &cinfo
);
419 log_link_debug(link
, "Removing address: %s/%u (valid for %s)", buf
, prefixlen
, valid_str
);
420 address_drop(address
);
422 log_link_warning(link
, "Removing non-existent address: %s/%u (valid for %s)", buf
, prefixlen
, valid_str
);
426 assert_not_reached("Received invalid RTNL message type");
432 static int manager_rtnl_process_link(sd_netlink
*rtnl
, sd_netlink_message
*message
, void *userdata
) {
433 Manager
*m
= userdata
;
435 NetDev
*netdev
= NULL
;
444 if (sd_netlink_message_is_error(message
)) {
445 r
= sd_netlink_message_get_errno(message
);
447 log_warning_errno(r
, "rtnl: Could not receive link: %m");
452 r
= sd_netlink_message_get_type(message
, &type
);
454 log_warning_errno(r
, "rtnl: Could not get message type: %m");
456 } else if (type
!= RTM_NEWLINK
&& type
!= RTM_DELLINK
) {
457 log_warning("rtnl: Received unexpected message type when processing link");
461 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
463 log_warning_errno(r
, "rtnl: Could not get ifindex from link: %m");
465 } else if (ifindex
<= 0) {
466 log_warning("rtnl: received link message with invalid ifindex: %d", ifindex
);
469 link_get(m
, ifindex
, &link
);
471 r
= sd_netlink_message_read_string(message
, IFLA_IFNAME
, &name
);
473 log_warning_errno(r
, "rtnl: Received link message without ifname: %m");
476 netdev_get(m
, name
, &netdev
);
481 /* link is new, so add it */
482 r
= link_add(m
, message
, &link
);
484 log_warning_errno(r
, "Could not add new link: %m");
490 /* netdev exists, so make sure the ifindex matches */
491 r
= netdev_set_ifindex(netdev
, message
);
493 log_warning_errno(r
, "Could not set ifindex on netdev: %m");
498 r
= link_update(link
, message
);
511 assert_not_reached("Received invalid RTNL message type.");
517 static int systemd_netlink_fd(void) {
518 int n
, fd
, rtnl_fd
= -EINVAL
;
520 n
= sd_listen_fds(true);
524 for (fd
= SD_LISTEN_FDS_START
; fd
< SD_LISTEN_FDS_START
+ n
; fd
++) {
525 if (sd_is_socket(fd
, AF_NETLINK
, SOCK_RAW
, -1) > 0) {
536 static int manager_connect_rtnl(Manager
*m
) {
541 fd
= systemd_netlink_fd();
543 r
= sd_netlink_open(&m
->rtnl
);
545 r
= sd_netlink_open_fd(&m
->rtnl
, fd
);
549 r
= sd_netlink_inc_rcvbuf(m
->rtnl
, RCVBUF_SIZE
);
553 r
= sd_netlink_attach_event(m
->rtnl
, m
->event
, 0);
557 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWLINK
, &manager_rtnl_process_link
, m
);
561 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELLINK
, &manager_rtnl_process_link
, m
);
565 r
= sd_netlink_add_match(m
->rtnl
, RTM_NEWADDR
, &manager_rtnl_process_address
, m
);
569 r
= sd_netlink_add_match(m
->rtnl
, RTM_DELADDR
, &manager_rtnl_process_address
, m
);
576 static int set_put_in_addr(Set
*s
, const struct in_addr
*address
) {
582 r
= in_addr_to_string(AF_INET
, (const union in_addr_union
*) address
, &p
);
586 r
= set_consume(s
, p
);
593 static int set_put_in_addrv(Set
*s
, const struct in_addr
*addresses
, int n
) {
597 assert(n
<= 0 || addresses
);
599 for (i
= 0; i
< n
; i
++) {
600 r
= set_put_in_addr(s
, addresses
+i
);
610 static void print_string_set(FILE *f
, const char *field
, Set
*s
) {
620 SET_FOREACH(p
, s
, i
) {
629 static int manager_save(Manager
*m
) {
630 _cleanup_set_free_free_ Set
*dns
= NULL
, *ntp
= NULL
, *domains
= NULL
;
633 _cleanup_free_
char *temp_path
= NULL
;
634 _cleanup_fclose_
FILE *f
= NULL
;
635 LinkOperationalState operstate
= LINK_OPERSTATE_OFF
;
636 const char *operstate_str
;
640 assert(m
->state_file
);
642 /* We add all NTP and DNS server to a set, to filter out duplicates */
643 dns
= set_new(&string_hash_ops
);
647 ntp
= set_new(&string_hash_ops
);
651 domains
= set_new(&string_hash_ops
);
655 HASHMAP_FOREACH(link
, m
->links
, i
) {
656 if (link
->flags
& IFF_LOOPBACK
)
659 if (link
->operstate
> operstate
)
660 operstate
= link
->operstate
;
665 /* First add the static configured entries */
666 r
= set_put_strdupv(dns
, link
->network
->dns
);
670 r
= set_put_strdupv(ntp
, link
->network
->ntp
);
674 r
= set_put_strdupv(domains
, link
->network
->domains
);
678 if (!link
->dhcp_lease
)
681 /* Secondly, add the entries acquired via DHCP */
682 if (link
->network
->dhcp_dns
) {
683 const struct in_addr
*addresses
;
685 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
687 r
= set_put_in_addrv(dns
, addresses
, r
);
690 } else if (r
< 0 && r
!= -ENODATA
)
694 if (link
->network
->dhcp_ntp
) {
695 const struct in_addr
*addresses
;
697 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
699 r
= set_put_in_addrv(ntp
, addresses
, r
);
702 } else if (r
< 0 && r
!= -ENODATA
)
706 if (link
->network
->dhcp_domains
) {
707 const char *domainname
;
709 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
711 r
= set_put_strdup(domains
, domainname
);
714 } else if (r
!= -ENODATA
)
719 operstate_str
= link_operstate_to_string(operstate
);
720 assert(operstate_str
);
722 r
= fopen_temporary(m
->state_file
, &f
, &temp_path
);
726 fchmod(fileno(f
), 0644);
729 "# This is private data. Do not parse.\n"
730 "OPER_STATE=%s\n", operstate_str
);
732 print_string_set(f
, "DNS=", dns
);
733 print_string_set(f
, "NTP=", ntp
);
734 print_string_set(f
, "DOMAINS=", domains
);
736 r
= fflush_and_check(f
);
740 if (rename(temp_path
, m
->state_file
) < 0) {
745 if (m
->operational_state
!= operstate
) {
746 m
->operational_state
= operstate
;
747 r
= manager_send_changed(m
, "OperationalState", NULL
);
749 log_error_errno(r
, "Could not emit changed OperationalState: %m");
757 (void) unlink(m
->state_file
);
758 (void) unlink(temp_path
);
760 return log_error_errno(r
, "Failed to save network state to %s: %m", m
->state_file
);
763 static int manager_dirty_handler(sd_event_source
*s
, void *userdata
) {
764 Manager
*m
= userdata
;
774 SET_FOREACH(link
, m
->dirty_links
, i
) {
783 int manager_new(Manager
**ret
) {
784 _cleanup_manager_free_ Manager
*m
= NULL
;
787 m
= new0(Manager
, 1);
791 m
->state_file
= strdup("/run/systemd/netif/state");
795 r
= sd_event_default(&m
->event
);
799 sd_event_set_watchdog(m
->event
, true);
801 sd_event_add_signal(m
->event
, NULL
, SIGTERM
, NULL
, NULL
);
802 sd_event_add_signal(m
->event
, NULL
, SIGINT
, NULL
, NULL
);
804 r
= sd_event_add_post(m
->event
, NULL
, manager_dirty_handler
, m
);
808 r
= manager_connect_rtnl(m
);
812 r
= manager_connect_udev(m
);
816 m
->netdevs
= hashmap_new(&string_hash_ops
);
820 LIST_HEAD_INIT(m
->networks
);
822 r
= setup_default_address_pool(m
);
832 void manager_free(Manager
*m
) {
843 while ((link
= hashmap_first(m
->links
)))
845 hashmap_free(m
->links
);
847 while ((network
= m
->networks
))
848 network_free(network
);
850 hashmap_free(m
->networks_by_name
);
852 while ((netdev
= hashmap_first(m
->netdevs
)))
853 netdev_unref(netdev
);
854 hashmap_free(m
->netdevs
);
856 while ((pool
= m
->address_pools
))
857 address_pool_free(pool
);
859 sd_netlink_unref(m
->rtnl
);
860 sd_event_unref(m
->event
);
862 sd_event_source_unref(m
->udev_event_source
);
863 udev_monitor_unref(m
->udev_monitor
);
866 sd_bus_unref(m
->bus
);
867 sd_bus_slot_unref(m
->prepare_for_sleep_slot
);
868 sd_event_source_unref(m
->bus_retry_event_source
);
873 static bool manager_check_idle(void *userdata
) {
874 Manager
*m
= userdata
;
880 HASHMAP_FOREACH(link
, m
->links
, i
) {
881 /* we are not woken on udev activity, so let's just wait for the
882 * pending udev event */
883 if (link
->state
== LINK_STATE_PENDING
)
889 /* we are not woken on netork activity, so let's stay around */
890 if (link_lldp_enabled(link
) ||
891 link_ipv4ll_enabled(link
) ||
892 link_dhcp4_server_enabled(link
) ||
893 link_dhcp4_enabled(link
) ||
894 link_dhcp6_enabled(link
))
901 int manager_run(Manager
*m
) {
907 /* The dirty handler will deal with future serialization, but the first one
908 must be done explicitly. */
912 HASHMAP_FOREACH(link
, m
->links
, i
)
916 return bus_event_loop_with_idle(
919 "org.freedesktop.network1",
924 /* failed to connect to the bus, so we lose exit-on-idle logic,
925 this should not happen except if dbus is not around at all */
926 return sd_event_loop(m
->event
);
929 int manager_load_config(Manager
*m
) {
932 /* update timestamp */
933 paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, true);
946 bool manager_should_reload(Manager
*m
) {
947 return paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, false);
950 int manager_rtnl_enumerate_links(Manager
*m
) {
951 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
, *reply
= NULL
;
952 sd_netlink_message
*link
;
958 r
= sd_rtnl_message_new_link(m
->rtnl
, &req
, RTM_GETLINK
, 0);
962 r
= sd_netlink_message_request_dump(req
, true);
966 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
970 for (link
= reply
; link
; link
= sd_netlink_message_next(link
)) {
973 m
->enumerating
= true;
975 k
= manager_rtnl_process_link(m
->rtnl
, link
, m
);
979 m
->enumerating
= false;
985 int manager_rtnl_enumerate_addresses(Manager
*m
) {
986 _cleanup_netlink_message_unref_ sd_netlink_message
*req
= NULL
, *reply
= NULL
;
987 sd_netlink_message
*addr
;
993 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, 0, 0);
997 r
= sd_netlink_message_request_dump(req
, true);
1001 r
= sd_netlink_call(m
->rtnl
, req
, 0, &reply
);
1005 for (addr
= reply
; addr
; addr
= sd_netlink_message_next(addr
)) {
1008 m
->enumerating
= true;
1010 k
= manager_rtnl_process_address(m
->rtnl
, addr
, m
);
1014 m
->enumerating
= false;
1020 int manager_address_pool_acquire(Manager
*m
, int family
, unsigned prefixlen
, union in_addr_union
*found
) {
1025 assert(prefixlen
> 0);
1028 LIST_FOREACH(address_pools
, p
, m
->address_pools
) {
1029 if (p
->family
!= family
)
1032 r
= address_pool_acquire(p
, prefixlen
, found
);
1040 Link
* manager_find_uplink(Manager
*m
, Link
*exclude
) {
1041 _cleanup_free_
struct local_address
*gateways
= NULL
;
1046 /* Looks for a suitable "uplink", via black magic: an
1047 * interface that is up and where the default route with the
1048 * highest priority points to. */
1050 n
= local_gateways(m
->rtnl
, 0, AF_UNSPEC
, &gateways
);
1052 log_warning_errno(n
, "Failed to determine list of default gateways: %m");
1056 for (i
= 0; i
< n
; i
++) {
1059 link
= hashmap_get(m
->links
, INT_TO_PTR(gateways
[i
].ifindex
));
1061 log_debug("Weird, found a gateway for a link we don't know. Ignoring.");
1065 if (link
== exclude
)
1068 if (link
->operstate
< LINK_OPERSTATE_ROUTABLE
)
1077 void manager_dirty(Manager
*manager
) {
1080 /* the serialized state in /run is no longer up-to-date */
1081 manager
->dirty
= true;