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 static int systemd_netlink_fd(void) {
80 int n
, fd
, rtnl_fd
= -EINVAL
;
82 n
= sd_listen_fds(true);
86 for (fd
= SD_LISTEN_FDS_START
; fd
< SD_LISTEN_FDS_START
+ n
; fd
++) {
87 if (sd_is_socket(fd
, AF_NETLINK
, SOCK_RAW
, -1) > 0) {
98 int manager_new(Manager
**ret
) {
99 _cleanup_manager_free_ Manager
*m
= NULL
;
102 m
= new0(Manager
, 1);
106 m
->state_file
= strdup("/run/systemd/netif/state");
110 r
= sd_event_default(&m
->event
);
114 sd_event_set_watchdog(m
->event
, true);
116 sd_event_add_signal(m
->event
, NULL
, SIGTERM
, NULL
, NULL
);
117 sd_event_add_signal(m
->event
, NULL
, SIGINT
, NULL
, NULL
);
119 fd
= systemd_netlink_fd();
121 r
= sd_rtnl_open(&m
->rtnl
, 3, RTNLGRP_LINK
, RTNLGRP_IPV4_IFADDR
, RTNLGRP_IPV6_IFADDR
);
123 r
= sd_rtnl_new_from_netlink(&m
->rtnl
, fd
);
127 r
= sd_rtnl_inc_rcvbuf(m
->rtnl
, RCVBUF_SIZE
);
131 r
= sd_bus_default_system(&m
->bus
);
132 if (r
< 0 && r
!= -ENOENT
) /* TODO: drop when we can rely on kdbus */
135 /* udev does not initialize devices inside containers,
136 * so we rely on them being already initialized before
137 * entering the container */
138 if (detect_container(NULL
) <= 0) {
139 m
->udev
= udev_new();
143 m
->udev_monitor
= udev_monitor_new_from_netlink(m
->udev
, "udev");
144 if (!m
->udev_monitor
)
148 m
->netdevs
= hashmap_new(&string_hash_ops
);
152 LIST_HEAD_INIT(m
->networks
);
154 r
= setup_default_address_pool(m
);
164 void manager_free(Manager
*m
) {
175 udev_monitor_unref(m
->udev_monitor
);
177 sd_bus_unref(m
->bus
);
178 sd_event_source_unref(m
->udev_event_source
);
179 sd_event_unref(m
->event
);
181 while ((link
= hashmap_first(m
->links
)))
183 hashmap_free(m
->links
);
185 while ((network
= m
->networks
))
186 network_free(network
);
188 while ((netdev
= hashmap_first(m
->netdevs
)))
189 netdev_unref(netdev
);
190 hashmap_free(m
->netdevs
);
192 while ((pool
= m
->address_pools
))
193 address_pool_free(pool
);
195 sd_rtnl_unref(m
->rtnl
);
200 int manager_load_config(Manager
*m
) {
203 /* update timestamp */
204 paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, true);
217 bool manager_should_reload(Manager
*m
) {
218 return paths_check_timestamp(network_dirs
, &m
->network_dirs_ts_usec
, false);
221 static int manager_udev_process_link(Manager
*m
, struct udev_device
*device
) {
228 if (!streq_ptr(udev_device_get_action(device
), "add"))
231 ifindex
= udev_device_get_ifindex(device
);
233 log_debug("ignoring udev ADD event for device with invalid ifindex");
237 r
= link_get(m
, ifindex
, &link
);
243 r
= link_initialized(link
, device
);
250 static int manager_rtnl_process_link(sd_rtnl
*rtnl
, sd_rtnl_message
*message
, void *userdata
) {
251 Manager
*m
= userdata
;
253 NetDev
*netdev
= NULL
;
262 if (sd_rtnl_message_is_error(message
)) {
263 r
= sd_rtnl_message_get_errno(message
);
265 log_warning_errno(r
, "rtnl: could not receive link: %m");
270 r
= sd_rtnl_message_get_type(message
, &type
);
272 log_warning_errno(r
, "rtnl: could not get message type: %m");
276 r
= sd_rtnl_message_link_get_ifindex(message
, &ifindex
);
278 log_warning_errno(r
, "rtnl: could not get ifindex: %m");
280 } else if (ifindex
<= 0) {
281 log_warning("rtnl: received link message with invalid ifindex: %d", ifindex
);
284 link_get(m
, ifindex
, &link
);
286 r
= sd_rtnl_message_read_string(message
, IFLA_IFNAME
, &name
);
288 log_warning_errno(r
, "rtnl: received link message without ifname: %m");
291 netdev_get(m
, name
, &netdev
);
296 /* link is new, so add it */
297 r
= link_add(m
, message
, &link
);
299 log_warning_errno(r
, "could not add new link: %m");
305 /* netdev exists, so make sure the ifindex matches */
306 r
= netdev_set_ifindex(netdev
, message
);
308 log_warning_errno(r
, "could not set ifindex on netdev: %m");
313 r
= link_update(link
, message
);
326 assert_not_reached("Received invalid RTNL message type.");
332 int manager_rtnl_enumerate_links(Manager
*m
) {
333 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
, *reply
= NULL
;
334 sd_rtnl_message
*link
;
340 r
= sd_rtnl_message_new_link(m
->rtnl
, &req
, RTM_GETLINK
, 0);
344 r
= sd_rtnl_message_request_dump(req
, true);
348 r
= sd_rtnl_call(m
->rtnl
, req
, 0, &reply
);
352 for (link
= reply
; link
; link
= sd_rtnl_message_next(link
)) {
355 k
= manager_rtnl_process_link(m
->rtnl
, link
, m
);
363 int manager_rtnl_enumerate_addresses(Manager
*m
) {
364 _cleanup_rtnl_message_unref_ sd_rtnl_message
*req
= NULL
, *reply
= NULL
;
365 sd_rtnl_message
*addr
;
371 r
= sd_rtnl_message_new_addr(m
->rtnl
, &req
, RTM_GETADDR
, 0, 0);
375 r
= sd_rtnl_message_request_dump(req
, true);
379 r
= sd_rtnl_call(m
->rtnl
, req
, 0, &reply
);
383 for (addr
= reply
; addr
; addr
= sd_rtnl_message_next(addr
)) {
386 k
= link_rtnl_process_address(m
->rtnl
, addr
, m
);
394 static int manager_dispatch_link_udev(sd_event_source
*source
, int fd
, uint32_t revents
, void *userdata
) {
395 Manager
*m
= userdata
;
396 struct udev_monitor
*monitor
= m
->udev_monitor
;
397 _cleanup_udev_device_unref_
struct udev_device
*device
= NULL
;
399 device
= udev_monitor_receive_device(monitor
);
403 manager_udev_process_link(m
, device
);
407 int manager_udev_listen(Manager
*m
) {
410 if (detect_container(NULL
) > 0)
413 assert(m
->udev_monitor
);
415 r
= udev_monitor_filter_add_match_subsystem_devtype(m
->udev_monitor
, "net", NULL
);
417 return log_error_errno(r
, "Could not add udev monitor filter: %m");
419 r
= udev_monitor_enable_receiving(m
->udev_monitor
);
421 log_error("Could not enable udev monitor");
425 r
= sd_event_add_io(m
->event
,
426 &m
->udev_event_source
,
427 udev_monitor_get_fd(m
->udev_monitor
),
428 EPOLLIN
, manager_dispatch_link_udev
,
433 r
= sd_event_source_set_description(m
->udev_event_source
, "networkd-udev");
440 int manager_rtnl_listen(Manager
*m
) {
445 r
= sd_rtnl_attach_event(m
->rtnl
, m
->event
, 0);
449 r
= sd_rtnl_add_match(m
->rtnl
, RTM_NEWLINK
, &manager_rtnl_process_link
, m
);
453 r
= sd_rtnl_add_match(m
->rtnl
, RTM_DELLINK
, &manager_rtnl_process_link
, m
);
457 r
= sd_rtnl_add_match(m
->rtnl
, RTM_NEWADDR
, &link_rtnl_process_address
, m
);
461 r
= sd_rtnl_add_match(m
->rtnl
, RTM_DELADDR
, &link_rtnl_process_address
, m
);
468 int manager_bus_listen(Manager
*m
) {
473 if (!m
->bus
) /* TODO: drop when we can rely on kdbus */
476 r
= sd_bus_attach_event(m
->bus
, m
->event
, 0);
483 static int set_put_in_addr(Set
*s
, const struct in_addr
*address
) {
489 r
= in_addr_to_string(AF_INET
, (const union in_addr_union
*) address
, &p
);
493 r
= set_consume(s
, p
);
500 static int set_put_in_addrv(Set
*s
, const struct in_addr
*addresses
, int n
) {
504 assert(n
<= 0 || addresses
);
506 for (i
= 0; i
< n
; i
++) {
507 r
= set_put_in_addr(s
, addresses
+i
);
517 static void print_string_set(FILE *f
, const char *field
, Set
*s
) {
527 SET_FOREACH(p
, s
, i
) {
536 int manager_save(Manager
*m
) {
537 _cleanup_set_free_free_ Set
*dns
= NULL
, *ntp
= NULL
, *domains
= NULL
;
540 _cleanup_free_
char *temp_path
= NULL
;
541 _cleanup_fclose_
FILE *f
= NULL
;
542 LinkOperationalState operstate
= LINK_OPERSTATE_OFF
;
543 const char *operstate_str
;
547 assert(m
->state_file
);
549 /* We add all NTP and DNS server to a set, to filter out duplicates */
550 dns
= set_new(&string_hash_ops
);
554 ntp
= set_new(&string_hash_ops
);
558 domains
= set_new(&string_hash_ops
);
562 HASHMAP_FOREACH(link
, m
->links
, i
) {
563 if (link
->flags
& IFF_LOOPBACK
)
566 if (link
->operstate
> operstate
)
567 operstate
= link
->operstate
;
572 /* First add the static configured entries */
573 r
= set_put_strdupv(dns
, link
->network
->dns
);
577 r
= set_put_strdupv(ntp
, link
->network
->ntp
);
581 r
= set_put_strdupv(domains
, link
->network
->domains
);
585 if (!link
->dhcp_lease
)
588 /* Secondly, add the entries acquired via DHCP */
589 if (link
->network
->dhcp_dns
) {
590 const struct in_addr
*addresses
;
592 r
= sd_dhcp_lease_get_dns(link
->dhcp_lease
, &addresses
);
594 r
= set_put_in_addrv(dns
, addresses
, r
);
597 } else if (r
< 0 && r
!= -ENOENT
)
601 if (link
->network
->dhcp_ntp
) {
602 const struct in_addr
*addresses
;
604 r
= sd_dhcp_lease_get_ntp(link
->dhcp_lease
, &addresses
);
606 r
= set_put_in_addrv(ntp
, addresses
, r
);
609 } else if (r
< 0 && r
!= -ENOENT
)
613 if (link
->network
->dhcp_domains
) {
614 const char *domainname
;
616 r
= sd_dhcp_lease_get_domainname(link
->dhcp_lease
, &domainname
);
618 r
= set_put_strdup(domains
, domainname
);
621 } else if (r
!= -ENOENT
)
626 operstate_str
= link_operstate_to_string(operstate
);
627 assert(operstate_str
);
629 r
= fopen_temporary(m
->state_file
, &f
, &temp_path
);
633 fchmod(fileno(f
), 0644);
636 "# This is private data. Do not parse.\n"
637 "OPER_STATE=%s\n", operstate_str
);
639 print_string_set(f
, "DNS=", dns
);
640 print_string_set(f
, "NTP=", ntp
);
641 print_string_set(f
, "DOMAINS=", domains
);
643 r
= fflush_and_check(f
);
647 if (rename(temp_path
, m
->state_file
) < 0) {
655 log_error_errno(r
, "Failed to save network state to %s: %m", m
->state_file
);
656 unlink(m
->state_file
);
661 int manager_address_pool_acquire(Manager
*m
, int family
, unsigned prefixlen
, union in_addr_union
*found
) {
666 assert(prefixlen
> 0);
669 LIST_FOREACH(address_pools
, p
, m
->address_pools
) {
670 if (p
->family
!= family
)
673 r
= address_pool_acquire(p
, prefixlen
, found
);
681 const char *address_family_boolean_to_string(AddressFamilyBoolean b
) {
682 if (b
== ADDRESS_FAMILY_YES
||
683 b
== ADDRESS_FAMILY_NO
)
684 return yes_no(b
== ADDRESS_FAMILY_YES
);
686 if (b
== ADDRESS_FAMILY_IPV4
)
688 if (b
== ADDRESS_FAMILY_IPV6
)
694 AddressFamilyBoolean
address_family_boolean_from_string(const char *s
) {
697 /* Make this a true superset of a boolean */
699 r
= parse_boolean(s
);
701 return ADDRESS_FAMILY_YES
;
703 return ADDRESS_FAMILY_NO
;
705 if (streq(s
, "ipv4"))
706 return ADDRESS_FAMILY_IPV4
;
707 if (streq(s
, "ipv6"))
708 return ADDRESS_FAMILY_IPV6
;
710 return _ADDRESS_FAMILY_BOOLEAN_INVALID
;
713 DEFINE_CONFIG_PARSE_ENUM(config_parse_address_family_boolean
, address_family_boolean
, AddressFamilyBoolean
, "Failed to parse option");