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 "conf-parser.h"
26 #include "path-util.h"
28 #include "networkd-netdev.h"
29 #include "networkd-link.h"
30 #include "network-internal.h"
31 #include "libudev-private.h"
32 #include "udev-util.h"
33 #include "rtnl-util.h"
38 #include "sd-daemon.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 int manager_connect_bus(Manager
*m
);
81 static int on_bus_retry(sd_event_source
*s
, usec_t usec
, void *userdata
) {
82 Manager
*m
= userdata
;
87 m
->bus_retry_event_source
= sd_event_source_unref(m
->bus_retry_event_source
);
89 manager_connect_bus(m
);
94 static int manager_reset_all(Manager
*m
) {
101 HASHMAP_FOREACH(link
, m
->links
, i
) {
102 r
= link_carrier_reset(link
);
104 log_link_warning_errno(link
, r
, "could not reset carrier: %m");
110 static int match_prepare_for_sleep(sd_bus
*bus
, sd_bus_message
*message
, void *userdata
, sd_bus_error
*ret_error
) {
111 Manager
*m
= userdata
;
117 r
= sd_bus_message_read(message
, "b", &b
);
119 log_debug_errno(r
, "Failed to parse PrepareForSleep signal: %m");
126 log_debug("Coming back from suspend, resetting all connections...");
128 manager_reset_all(m
);
133 int manager_connect_bus(Manager
*m
) {
138 r
= sd_bus_default_system(&m
->bus
);
140 /* We failed to connect? Yuck, we must be in early
141 * boot. Let's try in 5s again. As soon as we have
142 * kdbus we can stop doing this... */
144 log_debug_errno(r
, "Failed to connect to bus, trying again in 5s: %m");
146 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
);
148 return log_error_errno(r
, "Failed to install bus reconnect time event: %m");
154 r
= sd_bus_attach_event(m
->bus
, m
->event
, 0);
158 r
= sd_bus_add_match(m
->bus
, &m
->prepare_for_sleep_slot
,
160 "sender='org.freedesktop.login1',"
161 "interface='org.freedesktop.login1.Manager',"
162 "member='PrepareForSleep',"
163 "path='/org/freedesktop/login1'",
164 match_prepare_for_sleep
,
167 return log_error_errno(r
, "Failed to add match for PrepareForSleep: %m");
172 static int systemd_netlink_fd(void) {
173 int n
, fd
, rtnl_fd
= -EINVAL
;
175 n
= sd_listen_fds(true);
179 for (fd
= SD_LISTEN_FDS_START
; fd
< SD_LISTEN_FDS_START
+ n
; fd
++) {
180 if (sd_is_socket(fd
, AF_NETLINK
, SOCK_RAW
, -1) > 0) {
191 int manager_new(Manager
**ret
) {
192 _cleanup_manager_free_ Manager
*m
= NULL
;
195 m
= new0(Manager
, 1);
199 m
->state_file
= strdup("/run/systemd/netif/state");
203 r
= sd_event_default(&m
->event
);
207 sd_event_set_watchdog(m
->event
, true);
209 sd_event_add_signal(m
->event
, NULL
, SIGTERM
, NULL
, NULL
);
210 sd_event_add_signal(m
->event
, NULL
, SIGINT
, NULL
, NULL
);
212 fd
= systemd_netlink_fd();
214 r
= sd_rtnl_open(&m
->rtnl
, 3, RTNLGRP_LINK
, RTNLGRP_IPV4_IFADDR
, RTNLGRP_IPV6_IFADDR
);
216 r
= sd_rtnl_new_from_netlink(&m
->rtnl
, fd
);
220 r
= manager_connect_bus(m
);
224 /* udev does not initialize devices inside containers,
225 * so we rely on them being already initialized before
226 * entering the container */
227 if (detect_container(NULL
) <= 0) {
228 m
->udev
= udev_new();
232 m
->udev_monitor
= udev_monitor_new_from_netlink(m
->udev
, "udev");
233 if (!m
->udev_monitor
)
237 m
->netdevs
= hashmap_new(&string_hash_ops
);
241 LIST_HEAD_INIT(m
->networks
);
243 r
= setup_default_address_pool(m
);
253 void manager_free(Manager
*m
) {
264 udev_monitor_unref(m
->udev_monitor
);
266 sd_bus_unref(m
->bus
);
267 sd_bus_slot_unref(m
->prepare_for_sleep_slot
);
268 sd_event_source_unref(m
->udev_event_source
);
269 sd_event_source_unref(m
->bus_retry_event_source
);
270 sd_event_unref(m
->event
);
272 while ((link
= hashmap_first(m
->links
)))
274 hashmap_free(m
->links
);
276 while ((network
= m
->networks
))
277 network_free(network
);
279 while ((netdev
= hashmap_first(m
->netdevs
)))
280 netdev_unref(netdev
);
281 hashmap_free(m
->netdevs
);
283 while ((pool
= m
->address_pools
))
284 address_pool_free(pool
);
286 sd_rtnl_unref(m
->rtnl
);
291 int manager_load_config(Manager
*m
) {
294 /* update timestamp */
295 paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, true);
308 bool manager_should_reload(Manager
*m
) {
309 return paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, false);
312 static int manager_udev_process_link(Manager
*m
, struct udev_device
*device
) {
319 if (!streq_ptr(udev_device_get_action(device
), "add"))
322 ifindex
= udev_device_get_ifindex(device
);
324 log_debug("ignoring udev ADD event for device with invalid ifindex");
328 r
= link_get(m
, ifindex
, &link
);
334 r
= link_initialized(link
, device
);
341 static int manager_rtnl_process_link(sd_rtnl
*rtnl
, sd_rtnl_message
*message
, void *userdata
) {
342 Manager
*m
= userdata
;
344 NetDev
*netdev
= NULL
;
353 if (sd_rtnl_message_is_error(message
)) {
354 r
= sd_rtnl_message_get_errno(message
);
356 log_warning_errno(r
, "rtnl: could not receive link: %m");
361 r
= sd_rtnl_message_get_type(message
, &type
);
363 log_warning_errno(r
, "rtnl: could not get message type: %m");
367 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
369 log_warning_errno(r
, "rtnl: could not get ifindex: %m");
371 } else if (ifindex
<= 0) {
372 log_warning("rtnl: received link message with invalid ifindex: %d", ifindex
);
375 link_get(m
, ifindex
, &link
);
377 r
= sd_rtnl_message_read_string(message
, IFLA_IFNAME
, &name
);
379 log_warning_errno(r
, "rtnl: received link message without ifname: %m");
382 netdev_get(m
, name
, &netdev
);
387 /* link is new, so add it */
388 r
= link_add(m
, message
, &link
);
390 log_warning_errno(r
, "could not add new link: %m");
396 /* netdev exists, so make sure the ifindex matches */
397 r
= netdev_set_ifindex(netdev
, message
);
399 log_warning_errno(r
, "could not set ifindex on netdev: %m");
404 r
= link_update(link
, message
);
417 assert_not_reached("Received invalid RTNL message type.");
423 int manager_rtnl_enumerate_links(Manager
*m
) {
424 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
, *reply
= NULL
;
425 sd_rtnl_message
*link
;
431 r
= sd_rtnl_message_new_link(m
->rtnl
, &req
, RTM_GETLINK
, 0);
435 r
= sd_rtnl_message_request_dump(req
, true);
439 r
= sd_rtnl_call(m
->rtnl
, req
, 0, &reply
);
443 for (link
= reply
; link
; link
= sd_rtnl_message_next(link
)) {
446 k
= manager_rtnl_process_link(m
->rtnl
, link
, m
);
454 int manager_rtnl_enumerate_addresses(Manager
*m
) {
455 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
, *reply
= NULL
;
456 sd_rtnl_message
*addr
;
462 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, 0, 0);
466 r
= sd_rtnl_message_request_dump(req
, true);
470 r
= sd_rtnl_call(m
->rtnl
, req
, 0, &reply
);
474 for (addr
= reply
; addr
; addr
= sd_rtnl_message_next(addr
)) {
477 k
= link_rtnl_process_address(m
->rtnl
, addr
, m
);
485 static int manager_dispatch_link_udev(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
486 Manager
*m
= userdata
;
487 struct udev_monitor
*monitor
= m
->udev_monitor
;
488 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
490 device
= udev_monitor_receive_device(monitor
);
494 manager_udev_process_link(m
, device
);
498 int manager_udev_listen(Manager
*m
) {
501 if (detect_container(NULL
) > 0)
504 assert(m
->udev_monitor
);
506 r
= udev_monitor_filter_add_match_subsystem_devtype(m
->udev_monitor
, "net", NULL
);
508 return log_error_errno(r
, "Could not add udev monitor filter: %m");
510 r
= udev_monitor_enable_receiving(m
->udev_monitor
);
512 log_error("Could not enable udev monitor");
516 r
= sd_event_add_io(m
->event
,
517 &m
->udev_event_source
,
518 udev_monitor_get_fd(m
->udev_monitor
),
519 EPOLLIN
, manager_dispatch_link_udev
,
524 r
= sd_event_source_set_description(m
->udev_event_source
, "networkd-udev");
531 int manager_rtnl_listen(Manager
*m
) {
536 r
= sd_rtnl_attach_event(m
->rtnl
, m
->event
, 0);
540 r
= sd_rtnl_add_match(m
->rtnl
, RTM_NEWLINK
, &manager_rtnl_process_link
, m
);
544 r
= sd_rtnl_add_match(m
->rtnl
, RTM_DELLINK
, &manager_rtnl_process_link
, m
);
548 r
= sd_rtnl_add_match(m
->rtnl
, RTM_NEWADDR
, &link_rtnl_process_address
, m
);
552 r
= sd_rtnl_add_match(m
->rtnl
, RTM_DELADDR
, &link_rtnl_process_address
, m
);
559 int manager_bus_listen(Manager
*m
) {
564 if (!m
->bus
) /* TODO: drop when we can rely on kdbus */
567 r
= sd_bus_attach_event(m
->bus
, m
->event
, 0);
574 static int set_put_in_addr(Set
*s
, const struct in_addr
*address
) {
580 r
= in_addr_to_string(AF_INET
, (const union in_addr_union
*) address
, &p
);
584 r
= set_consume(s
, p
);
591 static int set_put_in_addrv(Set
*s
, const struct in_addr
*addresses
, int n
) {
595 assert(n
<= 0 || addresses
);
597 for (i
= 0; i
< n
; i
++) {
598 r
= set_put_in_addr(s
, addresses
+i
);
608 static void print_string_set(FILE *f
, const char *field
, Set
*s
) {
618 SET_FOREACH(p
, s
, i
) {
627 int manager_save(Manager
*m
) {
628 _cleanup_set_free_free_ Set
*dns
= NULL
, *ntp
= NULL
, *domains
= NULL
;
631 _cleanup_free_
char *temp_path
= NULL
;
632 _cleanup_fclose_
FILE *f
= NULL
;
633 LinkOperationalState operstate
= LINK_OPERSTATE_OFF
;
634 const char *operstate_str
;
638 assert(m
->state_file
);
640 /* We add all NTP and DNS server to a set, to filter out duplicates */
641 dns
= set_new(&string_hash_ops
);
645 ntp
= set_new(&string_hash_ops
);
649 domains
= set_new(&string_hash_ops
);
653 HASHMAP_FOREACH(link
, m
->links
, i
) {
654 if (link
->flags
& IFF_LOOPBACK
)
657 if (link
->operstate
> operstate
)
658 operstate
= link
->operstate
;
663 /* First add the static configured entries */
664 r
= set_put_strdupv(dns
, link
->network
->dns
);
668 r
= set_put_strdupv(ntp
, link
->network
->ntp
);
672 r
= set_put_strdupv(domains
, link
->network
->domains
);
676 if (!link
->dhcp_lease
)
679 /* Secondly, add the entries acquired via DHCP */
680 if (link
->network
->dhcp_dns
) {
681 const struct in_addr
*addresses
;
683 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
685 r
= set_put_in_addrv(dns
, addresses
, r
);
688 } else if (r
< 0 && r
!= -ENOENT
)
692 if (link
->network
->dhcp_ntp
) {
693 const struct in_addr
*addresses
;
695 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
697 r
= set_put_in_addrv(ntp
, addresses
, r
);
700 } else if (r
< 0 && r
!= -ENOENT
)
704 if (link
->network
->dhcp_domains
) {
705 const char *domainname
;
707 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
709 r
= set_put_strdup(domains
, domainname
);
712 } else if (r
!= -ENOENT
)
717 operstate_str
= link_operstate_to_string(operstate
);
718 assert(operstate_str
);
720 r
= fopen_temporary(m
->state_file
, &f
, &temp_path
);
724 fchmod(fileno(f
), 0644);
727 "# This is private data. Do not parse.\n"
728 "OPER_STATE=%s\n", operstate_str
);
730 print_string_set(f
, "DNS=", dns
);
731 print_string_set(f
, "NTP=", ntp
);
732 print_string_set(f
, "DOMAINS=", domains
);
734 r
= fflush_and_check(f
);
738 if (rename(temp_path
, m
->state_file
) < 0) {
746 log_error_errno(r
, "Failed to save network state to %s: %m", m
->state_file
);
747 unlink(m
->state_file
);
752 int manager_address_pool_acquire(Manager
*m
, int family
, unsigned prefixlen
, union in_addr_union
*found
) {
757 assert(prefixlen
> 0);
760 LIST_FOREACH(address_pools
, p
, m
->address_pools
) {
761 if (p
->family
!= family
)
764 r
= address_pool_acquire(p
, prefixlen
, found
);
772 const char *address_family_boolean_to_string(AddressFamilyBoolean b
) {
773 if (b
== ADDRESS_FAMILY_YES
||
774 b
== ADDRESS_FAMILY_NO
)
775 return yes_no(b
== ADDRESS_FAMILY_YES
);
777 if (b
== ADDRESS_FAMILY_IPV4
)
779 if (b
== ADDRESS_FAMILY_IPV6
)
785 AddressFamilyBoolean
address_family_boolean_from_string(const char *s
) {
788 /* Make this a true superset of a boolean */
790 r
= parse_boolean(s
);
792 return ADDRESS_FAMILY_YES
;
794 return ADDRESS_FAMILY_NO
;
796 if (streq(s
, "ipv4"))
797 return ADDRESS_FAMILY_IPV4
;
798 if (streq(s
, "ipv6"))
799 return ADDRESS_FAMILY_IPV6
;
801 return _ADDRESS_FAMILY_BOOLEAN_INVALID
;
804 DEFINE_CONFIG_PARSE_ENUM(config_parse_address_family_boolean
, address_family_boolean
, AddressFamilyBoolean
, "Failed to parse option");