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 manager_udev_process_link(Manager *m, struct udev_device *device) {
179 if (!streq_ptr(udev_device_get_action(device), "add"))
182 ifindex = udev_device_get_ifindex(device);
184 log_debug("ignoring udev ADD event for device with invalid ifindex");
188 r = link_get(m, ifindex, &link);
194 r = link_initialized(link, device);
201 static int manager_dispatch_link_udev(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
202 Manager *m = userdata;
203 struct udev_monitor *monitor = m->udev_monitor;
204 _cleanup_udev_device_unref_ struct udev_device *device = NULL;
206 device = udev_monitor_receive_device(monitor);
210 manager_udev_process_link(m, device);
214 static int manager_connect_udev(Manager *m) {
217 /* udev does not initialize devices inside containers,
218 * so we rely on them being already initialized before
219 * entering the container */
220 if (detect_container(NULL) > 0)
223 m->udev = udev_new();
227 m->udev_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
228 if (!m->udev_monitor)
231 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_monitor, "net", NULL);
233 return log_error_errno(r, "Could not add udev monitor filter: %m");
235 r = udev_monitor_enable_receiving(m->udev_monitor);
237 log_error("Could not enable udev monitor");
241 r = sd_event_add_io(m->event,
242 &m->udev_event_source,
243 udev_monitor_get_fd(m->udev_monitor),
244 EPOLLIN, manager_dispatch_link_udev,
249 r = sd_event_source_set_description(m->udev_event_source, "networkd-udev");
256 static int manager_rtnl_process_link(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata) {
257 Manager *m = userdata;
259 NetDev *netdev = NULL;
268 if (sd_rtnl_message_is_error(message)) {
269 r = sd_rtnl_message_get_errno(message);
271 log_warning_errno(r, "rtnl: could not receive link: %m");
276 r = sd_rtnl_message_get_type(message, &type);
278 log_warning_errno(r, "rtnl: could not get message type: %m");
282 r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
284 log_warning_errno(r, "rtnl: could not get ifindex: %m");
286 } else if (ifindex <= 0) {
287 log_warning("rtnl: received link message with invalid ifindex: %d", ifindex);
290 link_get(m, ifindex, &link);
292 r = sd_rtnl_message_read_string(message, IFLA_IFNAME, &name);
294 log_warning_errno(r, "rtnl: received link message without ifname: %m");
297 netdev_get(m, name, &netdev);
302 /* link is new, so add it */
303 r = link_add(m, message, &link);
305 log_warning_errno(r, "could not add new link: %m");
311 /* netdev exists, so make sure the ifindex matches */
312 r = netdev_set_ifindex(netdev, message);
314 log_warning_errno(r, "could not set ifindex on netdev: %m");
319 r = link_update(link, message);
332 assert_not_reached("Received invalid RTNL message type.");
338 static int systemd_netlink_fd(void) {
339 int n, fd, rtnl_fd = -EINVAL;
341 n = sd_listen_fds(true);
345 for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd ++) {
346 if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1) > 0) {
357 static int manager_connect_rtnl(Manager *m) {
362 fd = systemd_netlink_fd();
364 r = sd_rtnl_open(&m->rtnl, 3, RTNLGRP_LINK, RTNLGRP_IPV4_IFADDR, RTNLGRP_IPV6_IFADDR);
366 r = sd_rtnl_open_fd(&m->rtnl, fd, 0);
370 r = sd_rtnl_inc_rcvbuf(m->rtnl, RCVBUF_SIZE);
374 r = sd_rtnl_attach_event(m->rtnl, m->event, 0);
378 r = sd_rtnl_add_match(m->rtnl, RTM_NEWLINK, &manager_rtnl_process_link, m);
382 r = sd_rtnl_add_match(m->rtnl, RTM_DELLINK, &manager_rtnl_process_link, m);
386 r = sd_rtnl_add_match(m->rtnl, RTM_NEWADDR, &link_rtnl_process_address, m);
390 r = sd_rtnl_add_match(m->rtnl, RTM_DELADDR, &link_rtnl_process_address, m);
397 int manager_new(Manager **ret) {
398 _cleanup_manager_free_ Manager *m = NULL;
401 m = new0(Manager, 1);
405 m->state_file = strdup("/run/systemd/netif/state");
409 r = sd_event_default(&m->event);
413 sd_event_set_watchdog(m->event, true);
415 sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
416 sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
418 r = manager_connect_rtnl(m);
422 r = manager_connect_bus(m);
426 r = manager_connect_udev(m);
430 m->netdevs = hashmap_new(&string_hash_ops);
434 LIST_HEAD_INIT(m->networks);
436 r = setup_default_address_pool(m);
446 void manager_free(Manager *m) {
457 udev_monitor_unref(m->udev_monitor);
459 sd_bus_unref(m->bus);
460 sd_bus_slot_unref(m->prepare_for_sleep_slot);
461 sd_event_source_unref(m->udev_event_source);
462 sd_event_source_unref(m->bus_retry_event_source);
463 sd_event_unref(m->event);
465 while ((link = hashmap_first(m->links)))
467 hashmap_free(m->links);
469 while ((network = m->networks))
470 network_free(network);
472 while ((netdev = hashmap_first(m->netdevs)))
473 netdev_unref(netdev);
474 hashmap_free(m->netdevs);
476 while ((pool = m->address_pools))
477 address_pool_free(pool);
479 sd_rtnl_unref(m->rtnl);
484 int manager_load_config(Manager *m) {
487 /* update timestamp */
488 paths_check_timestamp(network_dirs, &m->network_dirs_ts_usec, true);
501 bool manager_should_reload(Manager *m) {
502 return paths_check_timestamp(network_dirs, &m->network_dirs_ts_usec, false);
505 int manager_rtnl_enumerate_links(Manager *m) {
506 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL, *reply = NULL;
507 sd_rtnl_message *link;
513 r = sd_rtnl_message_new_link(m->rtnl, &req, RTM_GETLINK, 0);
517 r = sd_rtnl_message_request_dump(req, true);
521 r = sd_rtnl_call(m->rtnl, req, 0, &reply);
525 for (link = reply; link; link = sd_rtnl_message_next(link)) {
528 m->enumerating = true;
530 k = manager_rtnl_process_link(m->rtnl, link, m);
534 m->enumerating = false;
540 int manager_rtnl_enumerate_addresses(Manager *m) {
541 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL, *reply = NULL;
542 sd_rtnl_message *addr;
548 r = sd_rtnl_message_new_addr(m->rtnl, &req, RTM_GETADDR, 0, 0);
552 r = sd_rtnl_message_request_dump(req, true);
556 r = sd_rtnl_call(m->rtnl, req, 0, &reply);
560 for (addr = reply; addr; addr = sd_rtnl_message_next(addr)) {
563 m->enumerating = true;
565 k = link_rtnl_process_address(m->rtnl, addr, m);
569 m->enumerating = false;
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 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 != -ENOENT)
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 != -ENOENT)
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 != -ENOENT)
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) {
747 log_error_errno(r, "Failed to save network state to %s: %m", m->state_file);
748 unlink(m->state_file);
753 int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found) {
758 assert(prefixlen > 0);
761 LIST_FOREACH(address_pools, p, m->address_pools) {
762 if (p->family != family)
765 r = address_pool_acquire(p, prefixlen, found);
773 const char *address_family_boolean_to_string(AddressFamilyBoolean b) {
774 if (b == ADDRESS_FAMILY_YES ||
775 b == ADDRESS_FAMILY_NO)
776 return yes_no(b == ADDRESS_FAMILY_YES);
778 if (b == ADDRESS_FAMILY_IPV4)
780 if (b == ADDRESS_FAMILY_IPV6)
786 AddressFamilyBoolean address_family_boolean_from_string(const char *s) {
789 /* Make this a true superset of a boolean */
791 r = parse_boolean(s);
793 return ADDRESS_FAMILY_YES;
795 return ADDRESS_FAMILY_NO;
797 if (streq(s, "ipv4"))
798 return ADDRESS_FAMILY_IPV4;
799 if (streq(s, "ipv6"))
800 return ADDRESS_FAMILY_IPV6;
802 return _ADDRESS_FAMILY_BOOLEAN_INVALID;
805 DEFINE_CONFIG_PARSE_ENUM(config_parse_address_family_boolean, address_family_boolean, AddressFamilyBoolean, "Failed to parse option");