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"
40 #include "sd-daemon.h"
42 /* use 8 MB for receive socket kernel queue. */
43 #define RCVBUF_SIZE (8*1024*1024)
45 const char* const network_dirs[] = {
46 "/etc/systemd/network",
47 "/run/systemd/network",
48 "/usr/lib/systemd/network",
50 "/lib/systemd/network",
54 static int setup_default_address_pool(Manager *m) {
60 /* Add in the well-known private address ranges. */
62 r = address_pool_new_from_string(m, &p, AF_INET6, "fc00::", 7);
66 r = address_pool_new_from_string(m, &p, AF_INET, "192.168.0.0", 16);
70 r = address_pool_new_from_string(m, &p, AF_INET, "172.16.0.0", 12);
74 r = address_pool_new_from_string(m, &p, AF_INET, "10.0.0.0", 8);
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_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_request_name(m->bus, "org.freedesktop.network1", 0);
179 return log_error_errno(r, "Failed to register name: %m");
181 r = sd_bus_attach_event(m->bus, m->event, 0);
183 return log_error_errno(r, "Failed to attach bus to event loop: %m");
188 static int manager_udev_process_link(Manager *m, struct udev_device *device) {
195 if (!streq_ptr(udev_device_get_action(device), "add"))
198 ifindex = udev_device_get_ifindex(device);
200 log_debug("ignoring udev ADD event for device with invalid ifindex");
204 r = link_get(m, ifindex, &link);
210 r = link_initialized(link, device);
217 static int manager_dispatch_link_udev(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
218 Manager *m = userdata;
219 struct udev_monitor *monitor = m->udev_monitor;
220 _cleanup_udev_device_unref_ struct udev_device *device = NULL;
222 device = udev_monitor_receive_device(monitor);
226 manager_udev_process_link(m, device);
230 static int manager_connect_udev(Manager *m) {
233 /* udev does not initialize devices inside containers,
234 * so we rely on them being already initialized before
235 * entering the container */
236 if (detect_container(NULL) > 0)
239 m->udev = udev_new();
243 m->udev_monitor = udev_monitor_new_from_netlink(m->udev, "udev");
244 if (!m->udev_monitor)
247 r = udev_monitor_filter_add_match_subsystem_devtype(m->udev_monitor, "net", NULL);
249 return log_error_errno(r, "Could not add udev monitor filter: %m");
251 r = udev_monitor_enable_receiving(m->udev_monitor);
253 log_error("Could not enable udev monitor");
257 r = sd_event_add_io(m->event,
258 &m->udev_event_source,
259 udev_monitor_get_fd(m->udev_monitor),
260 EPOLLIN, manager_dispatch_link_udev,
265 r = sd_event_source_set_description(m->udev_event_source, "networkd-udev");
272 static int manager_rtnl_process_link(sd_rtnl *rtnl, sd_rtnl_message *message, void *userdata) {
273 Manager *m = userdata;
275 NetDev *netdev = NULL;
284 if (sd_rtnl_message_is_error(message)) {
285 r = sd_rtnl_message_get_errno(message);
287 log_warning_errno(r, "rtnl: could not receive link: %m");
292 r = sd_rtnl_message_get_type(message, &type);
294 log_warning_errno(r, "rtnl: could not get message type: %m");
298 r = sd_rtnl_message_link_get_ifindex(message, &ifindex);
300 log_warning_errno(r, "rtnl: could not get ifindex: %m");
302 } else if (ifindex <= 0) {
303 log_warning("rtnl: received link message with invalid ifindex: %d", ifindex);
306 link_get(m, ifindex, &link);
308 r = sd_rtnl_message_read_string(message, IFLA_IFNAME, &name);
310 log_warning_errno(r, "rtnl: received link message without ifname: %m");
313 netdev_get(m, name, &netdev);
318 /* link is new, so add it */
319 r = link_add(m, message, &link);
321 log_warning_errno(r, "could not add new link: %m");
327 /* netdev exists, so make sure the ifindex matches */
328 r = netdev_set_ifindex(netdev, message);
330 log_warning_errno(r, "could not set ifindex on netdev: %m");
335 r = link_update(link, message);
348 assert_not_reached("Received invalid RTNL message type.");
354 static int systemd_netlink_fd(void) {
355 int n, fd, rtnl_fd = -EINVAL;
357 n = sd_listen_fds(true);
361 for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd ++) {
362 if (sd_is_socket(fd, AF_NETLINK, SOCK_RAW, -1) > 0) {
373 static int manager_connect_rtnl(Manager *m) {
378 fd = systemd_netlink_fd();
380 r = sd_rtnl_open(&m->rtnl, 3, RTNLGRP_LINK, RTNLGRP_IPV4_IFADDR, RTNLGRP_IPV6_IFADDR);
382 r = sd_rtnl_open_fd(&m->rtnl, fd, 0);
386 r = sd_rtnl_inc_rcvbuf(m->rtnl, RCVBUF_SIZE);
390 r = sd_rtnl_attach_event(m->rtnl, m->event, 0);
394 r = sd_rtnl_add_match(m->rtnl, RTM_NEWLINK, &manager_rtnl_process_link, m);
398 r = sd_rtnl_add_match(m->rtnl, RTM_DELLINK, &manager_rtnl_process_link, m);
402 r = sd_rtnl_add_match(m->rtnl, RTM_NEWADDR, &link_rtnl_process_address, m);
406 r = sd_rtnl_add_match(m->rtnl, RTM_DELADDR, &link_rtnl_process_address, m);
413 int manager_new(Manager **ret) {
414 _cleanup_manager_free_ Manager *m = NULL;
417 m = new0(Manager, 1);
421 m->state_file = strdup("/run/systemd/netif/state");
425 r = sd_event_default(&m->event);
429 sd_event_set_watchdog(m->event, true);
431 sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
432 sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
434 r = manager_connect_rtnl(m);
438 r = manager_connect_udev(m);
442 m->netdevs = hashmap_new(&string_hash_ops);
446 LIST_HEAD_INIT(m->networks);
448 r = setup_default_address_pool(m);
458 void manager_free(Manager *m) {
469 udev_monitor_unref(m->udev_monitor);
471 sd_bus_unref(m->bus);
472 sd_bus_slot_unref(m->prepare_for_sleep_slot);
473 sd_event_source_unref(m->udev_event_source);
474 sd_event_source_unref(m->bus_retry_event_source);
475 sd_event_unref(m->event);
477 while ((link = hashmap_first(m->links)))
479 hashmap_free(m->links);
481 while ((network = m->networks))
482 network_free(network);
484 hashmap_free(m->networks_by_name);
486 while ((netdev = hashmap_first(m->netdevs)))
487 netdev_unref(netdev);
488 hashmap_free(m->netdevs);
490 while ((pool = m->address_pools))
491 address_pool_free(pool);
493 sd_rtnl_unref(m->rtnl);
498 static bool manager_check_idle(void *userdata) {
499 Manager *m = userdata;
505 HASHMAP_FOREACH(link, m->links, i) {
506 /* we are not woken on udev activity, so let's just wait for the
507 * pending udev event */
508 if (link->state == LINK_STATE_PENDING)
514 /* we are not woken on netork activity, so let's stay around */
515 if (link_lldp_enabled(link) ||
516 link_ipv4ll_enabled(link) ||
517 link_dhcp4_server_enabled(link) ||
518 link_dhcp4_enabled(link) ||
519 link_dhcp6_enabled(link))
526 int manager_run(Manager *m) {
529 return bus_event_loop_with_idle(
532 "org.freedesktop.network1",
538 int manager_load_config(Manager *m) {
541 /* update timestamp */
542 paths_check_timestamp(network_dirs, &m->network_dirs_ts_usec, true);
555 bool manager_should_reload(Manager *m) {
556 return paths_check_timestamp(network_dirs, &m->network_dirs_ts_usec, false);
559 int manager_rtnl_enumerate_links(Manager *m) {
560 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL, *reply = NULL;
561 sd_rtnl_message *link;
567 r = sd_rtnl_message_new_link(m->rtnl, &req, RTM_GETLINK, 0);
571 r = sd_rtnl_message_request_dump(req, true);
575 r = sd_rtnl_call(m->rtnl, req, 0, &reply);
579 for (link = reply; link; link = sd_rtnl_message_next(link)) {
582 m->enumerating = true;
584 k = manager_rtnl_process_link(m->rtnl, link, m);
588 m->enumerating = false;
594 int manager_rtnl_enumerate_addresses(Manager *m) {
595 _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL, *reply = NULL;
596 sd_rtnl_message *addr;
602 r = sd_rtnl_message_new_addr(m->rtnl, &req, RTM_GETADDR, 0, 0);
606 r = sd_rtnl_message_request_dump(req, true);
610 r = sd_rtnl_call(m->rtnl, req, 0, &reply);
614 for (addr = reply; addr; addr = sd_rtnl_message_next(addr)) {
617 m->enumerating = true;
619 k = link_rtnl_process_address(m->rtnl, addr, m);
623 m->enumerating = false;
629 static int set_put_in_addr(Set *s, const struct in_addr *address) {
635 r = in_addr_to_string(AF_INET, (const union in_addr_union*) address, &p);
639 r = set_consume(s, p);
646 static int set_put_in_addrv(Set *s, const struct in_addr *addresses, int n) {
650 assert(n <= 0 || addresses);
652 for (i = 0; i < n; i++) {
653 r = set_put_in_addr(s, addresses+i);
663 static void print_string_set(FILE *f, const char *field, Set *s) {
673 SET_FOREACH(p, s, i) {
682 int manager_save(Manager *m) {
683 _cleanup_set_free_free_ Set *dns = NULL, *ntp = NULL, *domains = NULL;
686 _cleanup_free_ char *temp_path = NULL;
687 _cleanup_fclose_ FILE *f = NULL;
688 LinkOperationalState operstate = LINK_OPERSTATE_OFF;
689 const char *operstate_str;
693 assert(m->state_file);
695 /* We add all NTP and DNS server to a set, to filter out duplicates */
696 dns = set_new(&string_hash_ops);
700 ntp = set_new(&string_hash_ops);
704 domains = set_new(&string_hash_ops);
708 HASHMAP_FOREACH(link, m->links, i) {
709 if (link->flags & IFF_LOOPBACK)
712 if (link->operstate > operstate)
713 operstate = link->operstate;
718 /* First add the static configured entries */
719 r = set_put_strdupv(dns, link->network->dns);
723 r = set_put_strdupv(ntp, link->network->ntp);
727 r = set_put_strdupv(domains, link->network->domains);
731 if (!link->dhcp_lease)
734 /* Secondly, add the entries acquired via DHCP */
735 if (link->network->dhcp_dns) {
736 const struct in_addr *addresses;
738 r = sd_dhcp_lease_get_dns(link->dhcp_lease, &addresses);
740 r = set_put_in_addrv(dns, addresses, r);
743 } else if (r < 0 && r != -ENOENT)
747 if (link->network->dhcp_ntp) {
748 const struct in_addr *addresses;
750 r = sd_dhcp_lease_get_ntp(link->dhcp_lease, &addresses);
752 r = set_put_in_addrv(ntp, addresses, r);
755 } else if (r < 0 && r != -ENOENT)
759 if (link->network->dhcp_domains) {
760 const char *domainname;
762 r = sd_dhcp_lease_get_domainname(link->dhcp_lease, &domainname);
764 r = set_put_strdup(domains, domainname);
767 } else if (r != -ENOENT)
772 operstate_str = link_operstate_to_string(operstate);
773 assert(operstate_str);
775 r = fopen_temporary(m->state_file, &f, &temp_path);
779 fchmod(fileno(f), 0644);
782 "# This is private data. Do not parse.\n"
783 "OPER_STATE=%s\n", operstate_str);
785 print_string_set(f, "DNS=", dns);
786 print_string_set(f, "NTP=", ntp);
787 print_string_set(f, "DOMAINS=", domains);
789 r = fflush_and_check(f);
793 if (rename(temp_path, m->state_file) < 0) {
798 if (m->operational_state != operstate) {
799 m->operational_state = operstate;
800 r = manager_send_changed(m, "OperationalState", NULL);
802 log_error_errno(r, "Could not emit changed OperationalState: %m");
808 log_error_errno(r, "Failed to save network state to %s: %m", m->state_file);
809 unlink(m->state_file);
814 int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, union in_addr_union *found) {
819 assert(prefixlen > 0);
822 LIST_FOREACH(address_pools, p, m->address_pools) {
823 if (p->family != family)
826 r = address_pool_acquire(p, prefixlen, found);
834 const char *address_family_boolean_to_string(AddressFamilyBoolean b) {
835 if (b == ADDRESS_FAMILY_YES ||
836 b == ADDRESS_FAMILY_NO)
837 return yes_no(b == ADDRESS_FAMILY_YES);
839 if (b == ADDRESS_FAMILY_IPV4)
841 if (b == ADDRESS_FAMILY_IPV6)
847 AddressFamilyBoolean address_family_boolean_from_string(const char *s) {
850 /* Make this a true superset of a boolean */
852 r = parse_boolean(s);
854 return ADDRESS_FAMILY_YES;
856 return ADDRESS_FAMILY_NO;
858 if (streq(s, "ipv4"))
859 return ADDRESS_FAMILY_IPV4;
860 if (streq(s, "ipv6"))
861 return ADDRESS_FAMILY_IPV6;
863 return _ADDRESS_FAMILY_BOOLEAN_INVALID;
866 DEFINE_CONFIG_PARSE_ENUM(config_parse_address_family_boolean, address_family_boolean, AddressFamilyBoolean, "Failed to parse option");