From: Patrik Flykt Date: Fri, 12 May 2017 13:48:33 +0000 (+0300) Subject: networkd-link.c: Add Router Advertisement starting and stopping X-Git-Tag: v234~191^2~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7465dd22ad4326e97401ce0850c7d7febb47e7e2;p=thirdparty%2Fsystemd.git networkd-link.c: Add Router Advertisement starting and stopping Start and stop Router Advertisement sending once the link has acquired a link-local IPv6 address. --- diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 37bebcf1916..98a5e3109ef 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -32,6 +32,7 @@ #include "networkd-lldp-tx.h" #include "networkd-manager.h" #include "networkd-ndisc.h" +#include "networkd-radv.h" #include "set.h" #include "socket-util.h" #include "stdio-util.h" @@ -119,6 +120,15 @@ static bool link_ipv6_enabled(Link *link) { return link_ipv6ll_enabled(link) || network_has_static_ipv6_addresses(link->network); } +static bool link_radv_enabled(Link *link) { + assert(link); + + if (!link_ipv6ll_enabled(link)) + return false; + + return link->network->router_prefix_delegation; +} + static bool link_lldp_rx_enabled(Link *link) { assert(link); @@ -521,6 +531,7 @@ static void link_free(Link *link) { sd_ipv4ll_unref(link->ipv4ll); sd_dhcp6_client_unref(link->dhcp6_client); sd_ndisc_unref(link->ndisc); + sd_radv_unref(link->radv); if (link->manager) hashmap_remove(link->manager->links, INT_TO_PTR(link->ifindex)); @@ -640,6 +651,12 @@ static int link_stop_clients(Link *link) { r = log_link_warning_errno(link, k, "Could not stop IPv6 Router Discovery: %m"); } + if (link->radv) { + k = sd_radv_stop(link->radv); + if (k < 0) + r = log_link_warning_errno(link, k, "Could not stop IPv6 Router Advertisement: %m"); + } + link_lldp_emit_stop(link); return r; } @@ -1554,6 +1571,17 @@ static int link_acquire_ipv6_conf(Link *link) { return log_link_warning_errno(link, r, "Could not start IPv6 Router Discovery: %m"); } + if (link_radv_enabled(link)) { + assert(link->radv); + assert(in_addr_is_link_local(AF_INET6, (const union in_addr_union*)&link->ipv6ll_address) > 0); + + log_link_debug(link, "Starting IPv6 Router Advertisements"); + + r = sd_radv_start(link->radv); + if (r < 0 && r != -EBUSY) + return log_link_warning_errno(link, r, "Could not start IPv6 Router Advertisement: %m"); + } + return 0; } @@ -2562,6 +2590,12 @@ static int link_configure(Link *link) { return r; } + if (link_radv_enabled(link)) { + r = radv_configure(link); + if (r < 0) + return r; + } + if (link_lldp_rx_enabled(link)) { r = sd_lldp_new(&link->lldp); if (r < 0) @@ -3098,6 +3132,12 @@ int link_update(Link *link, sd_netlink_message *m) { return r; } } + + if (link->radv) { + r = sd_radv_set_mtu(link->radv, link->mtu); + if (r < 0) + return log_link_warning_errno(link, r, "Could not set MTU for Router Advertisement: %m"); + } } /* The kernel may broadcast NEWLINK messages without the MAC address @@ -3166,6 +3206,12 @@ int link_update(Link *link, sd_netlink_message *m) { if (r < 0) return log_link_warning_errno(link, r, "Could not update DHCPv6 DUID: %m"); } + + if (link->radv) { + r = sd_radv_set_mac(link->radv, &link->mac); + if (r < 0) + return log_link_warning_errno(link, r, "Could not update MAC for Router Advertisement: %m"); + } } }