diff options
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | src/network/networkd-dhcp6.c | 85 | ||||
-rw-r--r-- | src/network/networkd-link.h | 2 | ||||
-rw-r--r-- | src/network/networkd-ndisc.c | 94 |
4 files changed, 104 insertions, 78 deletions
diff --git a/Makefile.am b/Makefile.am index f309eac10f..fa25485b73 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5232,6 +5232,7 @@ libnetworkd_core_la_SOURCES = \ src/network/networkd-ipv4ll.c \ src/network/networkd-dhcp4.c \ src/network/networkd-dhcp6.c \ + src/network/networkd-ndisc.c \ src/network/networkd-network.h \ src/network/networkd-network.c \ src/network/networkd-network-bus.c \ diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index 42a6f382b0..fa02aa0a3d 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -179,34 +179,29 @@ static void dhcp6_handler(sd_dhcp6_client *client, int event, void *userdata) { link_check_ready(link); } -static int dhcp6_configure(Link *link, int event) { +int dhcp6_configure(Link *link, bool inf_req) { int r; bool information_request; assert_return(link, -EINVAL); - assert_return(IN_SET(event, SD_NDISC_EVENT_ROUTER_ADVERTISMENT_TIMEOUT, - SD_NDISC_EVENT_ROUTER_ADVERTISMENT_OTHER, - SD_NDISC_EVENT_ROUTER_ADVERTISMENT_MANAGED), -EINVAL); link->dhcp6_configured = false; if (link->dhcp6_client) { - r = sd_dhcp6_client_get_information_request(link->dhcp6_client, - &information_request); + r = sd_dhcp6_client_get_information_request(link->dhcp6_client, &information_request); if (r < 0) { log_link_warning_errno(link, r, "Could not get DHCPv6 Information request setting: %m"); goto error; } - if (information_request && event != SD_NDISC_EVENT_ROUTER_ADVERTISMENT_OTHER) { + if (information_request && !inf_req) { r = sd_dhcp6_client_stop(link->dhcp6_client); if (r < 0) { log_link_warning_errno(link, r, "Could not stop DHCPv6 while setting Managed mode: %m"); goto error; } - r = sd_dhcp6_client_set_information_request(link->dhcp6_client, - false); + r = sd_dhcp6_client_set_information_request(link->dhcp6_client, false); if (r < 0) { log_link_warning_errno(link, r, "Could not unset DHCPv6 Information request: %m"); goto error; @@ -249,9 +244,8 @@ static int dhcp6_configure(Link *link, int event) { if (r < 0) goto error; - if (event == SD_NDISC_EVENT_ROUTER_ADVERTISMENT_OTHER) { - r = sd_dhcp6_client_set_information_request(link->dhcp6_client, - true); + if (inf_req) { + r = sd_dhcp6_client_set_information_request(link->dhcp6_client, true); if (r < 0) goto error; } @@ -267,7 +261,7 @@ static int dhcp6_configure(Link *link, int event) { return r; } -static int dhcp6_prefix_expired(Link *link) { +int dhcp6_prefix_expired(Link *link) { int r; sd_dhcp6_lease *lease; struct in6_addr *expired_prefix, ip6_addr; @@ -305,68 +299,3 @@ static int dhcp6_prefix_expired(Link *link) { return 0; } - -static void ndisc_router_handler(sd_ndisc *nd, int event, void *userdata) { - Link *link = userdata; - - assert(link); - assert(link->network); - assert(link->manager); - - if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) - return; - - switch(event) { - case SD_NDISC_EVENT_ROUTER_ADVERTISMENT_NONE: - return; - - case SD_NDISC_EVENT_ROUTER_ADVERTISMENT_TIMEOUT: - case SD_NDISC_EVENT_ROUTER_ADVERTISMENT_OTHER: - case SD_NDISC_EVENT_ROUTER_ADVERTISMENT_MANAGED: - dhcp6_configure(link, event); - - break; - - case SD_NDISC_EVENT_ROUTER_ADVERTISMENT_PREFIX_EXPIRED: - if (!link->rtnl_extended_attrs) - dhcp6_prefix_expired(link); - - break; - - default: - if (event < 0) - log_link_warning_errno(link, event, "IPv6 Neighborhood Discover error: %m"); - else - log_link_warning(link, "IPv6 Neighborhood Discovery unknown event: %d", event); - - break; - } - -} - -int ndisc_configure(Link *link) { - int r; - - assert_return(link, -EINVAL); - - r = sd_ndisc_new(&link->ndisc_router_discovery); - if (r < 0) - return r; - - r = sd_ndisc_attach_event(link->ndisc_router_discovery, NULL, 0); - if (r < 0) - return r; - - r = sd_ndisc_set_mac(link->ndisc_router_discovery, &link->mac); - if (r < 0) - return r; - - r = sd_ndisc_set_index(link->ndisc_router_discovery, link->ifindex); - if (r < 0) - return r; - - r = sd_ndisc_set_callback(link->ndisc_router_discovery, - ndisc_router_handler, link); - - return r; -} diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index f13d904c8e..6bc88157cf 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -145,6 +145,8 @@ int link_set_timezone(Link *link, const char *timezone); int ipv4ll_configure(Link *link); int dhcp4_configure(Link *link); +int dhcp6_configure(Link *link, bool information_request); +int dhcp6_prefix_expired(Link *link); int ndisc_configure(Link *link); bool link_lldp_enabled(Link *link); diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c new file mode 100644 index 0000000000..1721cb36b6 --- /dev/null +++ b/src/network/networkd-ndisc.c @@ -0,0 +1,94 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +/*** + This file is part of systemd. + + Copyright (C) 2014 Intel Corporation. All rights reserved. + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see <http://www.gnu.org/licenses/>. +***/ + +#include <netinet/ether.h> +#include <linux/if.h> + +#include "networkd-link.h" + +#include "sd-ndisc.h" + +static void ndisc_router_handler(sd_ndisc *nd, int event, void *userdata) { + Link *link = userdata; + + assert(link); + assert(link->network); + assert(link->manager); + + if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) + return; + + switch(event) { + case SD_NDISC_EVENT_ROUTER_ADVERTISMENT_NONE: + return; + + case SD_NDISC_EVENT_ROUTER_ADVERTISMENT_OTHER: + dhcp6_configure(link, true); + + break; + case SD_NDISC_EVENT_ROUTER_ADVERTISMENT_TIMEOUT: + case SD_NDISC_EVENT_ROUTER_ADVERTISMENT_MANAGED: + dhcp6_configure(link, false); + + break; + + case SD_NDISC_EVENT_ROUTER_ADVERTISMENT_PREFIX_EXPIRED: + if (!link->rtnl_extended_attrs) + dhcp6_prefix_expired(link); + + break; + + default: + if (event < 0) + log_link_warning_errno(link, event, "IPv6 Neighbor Discover error: %m"); + else + log_link_warning(link, "IPv6 Neighbor Discovery unknown event: %d", event); + + break; + } +} + +int ndisc_configure(Link *link) { + int r; + + assert_return(link, -EINVAL); + + r = sd_ndisc_new(&link->ndisc_router_discovery); + if (r < 0) + return r; + + r = sd_ndisc_attach_event(link->ndisc_router_discovery, NULL, 0); + if (r < 0) + return r; + + r = sd_ndisc_set_mac(link->ndisc_router_discovery, &link->mac); + if (r < 0) + return r; + + r = sd_ndisc_set_index(link->ndisc_router_discovery, link->ifindex); + if (r < 0) + return r; + + r = sd_ndisc_set_callback(link->ndisc_router_discovery, + ndisc_router_handler, link); + + return r; +} |