From 290696e512475636824c6540610cbafe81addf9c Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 7 Jul 2020 11:06:08 +0900 Subject: [PATCH 1/3] Revert "network: Don't send RA with zero router lifetime when restarting radv" This reverts commit d469cea3bde53bc39317c8b433c825bb4790cbe5. --- src/libsystemd-network/sd-radv.c | 18 +++++++----------- src/libsystemd-network/test-ndisc-ra.c | 2 +- src/network/networkd-dhcp6.c | 2 +- src/network/networkd-link.c | 2 +- src/systemd/sd-radv.h | 3 +-- 5 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/libsystemd-network/sd-radv.c b/src/libsystemd-network/sd-radv.c index ee7c0ee53f..cc5c0223b5 100644 --- a/src/libsystemd-network/sd-radv.c +++ b/src/libsystemd-network/sd-radv.c @@ -339,12 +339,12 @@ static int radv_timeout(sd_event_source *s, uint64_t usec, void *userdata) { return 0; fail: - sd_radv_stop(ra, true); + sd_radv_stop(ra); return 0; } -_public_ int sd_radv_stop(sd_radv *ra, bool zero_router_lifetime) { +_public_ int sd_radv_stop(sd_radv *ra) { int r; assert_return(ra, -EINVAL); @@ -354,15 +354,11 @@ _public_ int sd_radv_stop(sd_radv *ra, bool zero_router_lifetime) { log_radv("Stopping IPv6 Router Advertisement daemon"); - if (zero_router_lifetime) { - /* RFC 4861, Section 6.2.5, send at least one Router Advertisement - with zero lifetime */ - r = radv_send(ra, NULL, 0); - if (r < 0) - log_radv_errno(r, "Unable to send last Router Advertisement with router lifetime set to zero: %m"); - else - log_radv("Sent last Router Advertisement with router lifetime set to zero"); - } + /* RFC 4861, Section 6.2.5, send at least one Router Advertisement + with zero lifetime */ + r = radv_send(ra, NULL, 0); + if (r < 0) + log_radv_errno(r, "Unable to send last Router Advertisement with router lifetime set to zero: %m"); radv_reset(ra); ra->fd = safe_close(ra->fd); diff --git a/src/libsystemd-network/test-ndisc-ra.c b/src/libsystemd-network/test-ndisc-ra.c index 7c59418ca7..d759ec03a8 100644 --- a/src/libsystemd-network/test-ndisc-ra.c +++ b/src/libsystemd-network/test-ndisc-ra.c @@ -284,7 +284,7 @@ static int radv_recv(sd_event_source *s, int fd, uint32_t revents, void *userdat return 0; } - assert_se(sd_radv_stop(ra, true) >= 0); + assert_se(sd_radv_stop(ra) >= 0); test_stopped = true; return 0; diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index d9df46a23e..ecf8a32691 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -188,7 +188,7 @@ static int dhcp6_pd_prefix_assign(Link *link, struct in6_addr *prefix, if (r < 0) return r; - r = sd_radv_stop(radv, false); + r = sd_radv_stop(radv); if (r < 0) return r; diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index dcbf197ff4..053aa3b4ce 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -840,7 +840,7 @@ int link_stop_clients(Link *link, bool may_keep_dhcp) { } if (link->radv) { - k = sd_radv_stop(link->radv, true); + k = sd_radv_stop(link->radv); if (k < 0) r = log_link_warning_errno(link, k, "Could not stop IPv6 Router Advertisement: %m"); } diff --git a/src/systemd/sd-radv.h b/src/systemd/sd-radv.h index 763d5ddd87..011e40d8a5 100644 --- a/src/systemd/sd-radv.h +++ b/src/systemd/sd-radv.h @@ -22,7 +22,6 @@ #include #include #include -#include #include #include "_sd-common.h" @@ -50,7 +49,7 @@ int sd_radv_detach_event(sd_radv *nd); sd_event *sd_radv_get_event(sd_radv *ra); int sd_radv_start(sd_radv *ra); -int sd_radv_stop(sd_radv *ra, bool zero_router_lifetime); +int sd_radv_stop(sd_radv *ra); int sd_radv_set_ifindex(sd_radv *ra, int interface_index); int sd_radv_set_mac(sd_radv *ra, const struct ether_addr *mac_addr); From 8fc2a5dff43affd73bfc6ffd0e7366091a400867 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 7 Jul 2020 11:18:28 +0900 Subject: [PATCH 2/3] network: fix indentation --- src/network/networkd-dhcp6.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index ecf8a32691..4e49a3c5fc 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -159,8 +159,7 @@ static bool dhcp6_enable_prefix_delegation(Link *dhcp6_link) { return false; } -static int dhcp6_lease_information_acquired(sd_dhcp6_client *client, - Link *link) { +static int dhcp6_lease_information_acquired(sd_dhcp6_client *client, Link *link) { return 0; } From 1d596fdec2fe01fba2ac1976c6e60a13554a31fe Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 7 Jul 2020 11:19:49 +0900 Subject: [PATCH 3/3] network: do not restart radv engine when adding prefix Replaces d469cea3bde53bc39317c8b433c825bb4790cbe5. --- src/network/networkd-dhcp6.c | 28 +++------------------------- src/network/networkd-radv.c | 31 +++++++++++++++++++++++++++++++ src/network/networkd-radv.h | 2 ++ 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index 4e49a3c5fc..ad90c0badc 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -6,7 +6,6 @@ #include #include #include -#include "sd-radv.h" #include "sd-dhcp6-client.h" @@ -18,6 +17,7 @@ #include "networkd-dhcp6.h" #include "networkd-link.h" #include "networkd-manager.h" +#include "networkd-radv.h" #include "siphash24.h" #include "string-table.h" #include "string-util.h" @@ -167,34 +167,12 @@ static int dhcp6_pd_prefix_assign(Link *link, struct in6_addr *prefix, uint8_t prefix_len, uint32_t lifetime_preferred, uint32_t lifetime_valid) { - sd_radv *radv = link->radv; int r; - _cleanup_(sd_radv_prefix_unrefp) sd_radv_prefix *p = NULL; - r = sd_radv_prefix_new(&p); + r = radv_add_prefix(link, prefix, prefix_len, lifetime_preferred, lifetime_valid); if (r < 0) return r; - r = sd_radv_prefix_set_prefix(p, prefix, prefix_len); - if (r < 0) - return r; - - r = sd_radv_prefix_set_preferred_lifetime(p, lifetime_preferred); - if (r < 0) - return r; - - r = sd_radv_prefix_set_valid_lifetime(p, lifetime_valid); - if (r < 0) - return r; - - r = sd_radv_stop(radv); - if (r < 0) - return r; - - r = sd_radv_add_prefix(radv, p, true); - if (r < 0 && r != -EEXIST) - return r; - r = dhcp6_prefix_add(link->manager, prefix, link); if (r < 0) return r; @@ -205,7 +183,7 @@ static int dhcp6_pd_prefix_assign(Link *link, struct in6_addr *prefix, return r; } - return sd_radv_start(radv); + return 0; } static int dhcp6_route_remove_handler(sd_netlink *nl, sd_netlink_message *m, Link *link) { diff --git a/src/network/networkd-radv.c b/src/network/networkd-radv.c index f5f8ec65ed..d52aadecfa 100644 --- a/src/network/networkd-radv.c +++ b/src/network/networkd-radv.c @@ -672,6 +672,37 @@ int radv_configure(Link *link) { return 0; } +int radv_add_prefix(Link *link, struct in6_addr *prefix, uint8_t prefix_len, + uint32_t lifetime_preferred, uint32_t lifetime_valid) { + _cleanup_(sd_radv_prefix_unrefp) sd_radv_prefix *p = NULL; + int r; + + assert(link); + assert(link->radv); + + r = sd_radv_prefix_new(&p); + if (r < 0) + return r; + + r = sd_radv_prefix_set_prefix(p, prefix, prefix_len); + if (r < 0) + return r; + + r = sd_radv_prefix_set_preferred_lifetime(p, lifetime_preferred); + if (r < 0) + return r; + + r = sd_radv_prefix_set_valid_lifetime(p, lifetime_valid); + if (r < 0) + return r; + + r = sd_radv_add_prefix(link->radv, p, true); + if (r < 0 && r != -EEXIST) + return r; + + return 0; +} + int config_parse_radv_dns( const char *unit, const char *filename, diff --git a/src/network/networkd-radv.h b/src/network/networkd-radv.h index b115243ef5..741aa8692f 100644 --- a/src/network/networkd-radv.h +++ b/src/network/networkd-radv.h @@ -52,6 +52,8 @@ DEFINE_NETWORK_SECTION_FUNCTIONS(RoutePrefix, route_prefix_free); int radv_emit_dns(Link *link); int radv_configure(Link *link); +int radv_add_prefix(Link *link, struct in6_addr *prefix, uint8_t prefix_len, + uint32_t lifetime_preferred, uint32_t lifetime_valid); const char* radv_prefix_delegation_to_string(RADVPrefixDelegation i) _const_; RADVPrefixDelegation radv_prefix_delegation_from_string(const char *s) _pure_;