From 03401969d48dcc51ede605c79ec0f9e6bcc8e4c1 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 15 Apr 2024 11:57:07 +0900 Subject: [PATCH] sd-radv: allow to modify RA header elements without stopping sd-radv This also makes too large retransmit time handled gracefully, as even if a too large value is specified, usec_to_be32_msec() in radv_send_router() will handle it gracefully anyway. Note, networkd still refuses such invalid values. Hence, this does not change any effective behavior. --- src/libsystemd-network/sd-radv.c | 29 ++++---------------------- src/libsystemd-network/test-ndisc-ra.c | 2 +- src/systemd/sd-radv.h | 4 ++-- 3 files changed, 7 insertions(+), 28 deletions(-) diff --git a/src/libsystemd-network/sd-radv.c b/src/libsystemd-network/sd-radv.c index 053dd0653b1..0709a55c138 100644 --- a/src/libsystemd-network/sd-radv.c +++ b/src/libsystemd-network/sd-radv.c @@ -537,23 +537,13 @@ int sd_radv_set_mtu(sd_radv *ra, uint32_t mtu) { int sd_radv_set_hop_limit(sd_radv *ra, uint8_t hop_limit) { assert_return(ra, -EINVAL); - if (ra->state != RADV_STATE_IDLE) - return -EBUSY; - ra->hop_limit = hop_limit; - return 0; } int sd_radv_set_retransmit(sd_radv *ra, uint64_t usec) { assert_return(ra, -EINVAL); - if (ra->state != RADV_STATE_IDLE) - return -EBUSY; - - if (usec > RADV_MAX_RETRANSMIT_USEC) - return -EINVAL; - ra->retransmit_usec = usec; return 0; } @@ -561,9 +551,6 @@ int sd_radv_set_retransmit(sd_radv *ra, uint64_t usec) { int sd_radv_set_router_lifetime(sd_radv *ra, uint64_t usec) { assert_return(ra, -EINVAL); - if (ra->state != RADV_STATE_IDLE) - return -EBUSY; - if (!router_lifetime_is_valid(usec)) return -EINVAL; @@ -577,25 +564,17 @@ int sd_radv_set_router_lifetime(sd_radv *ra, uint64_t usec) { return 0; } -int sd_radv_set_managed_information(sd_radv *ra, int managed) { +int sd_radv_set_managed_information(sd_radv *ra, int b) { assert_return(ra, -EINVAL); - if (ra->state != RADV_STATE_IDLE) - return -EBUSY; - - SET_FLAG(ra->flags, ND_RA_FLAG_MANAGED, managed); - + SET_FLAG(ra->flags, ND_RA_FLAG_MANAGED, b); return 0; } -int sd_radv_set_other_information(sd_radv *ra, int other) { +int sd_radv_set_other_information(sd_radv *ra, int b) { assert_return(ra, -EINVAL); - if (ra->state != RADV_STATE_IDLE) - return -EBUSY; - - SET_FLAG(ra->flags, ND_RA_FLAG_OTHER, other); - + SET_FLAG(ra->flags, ND_RA_FLAG_OTHER, b); return 0; } diff --git a/src/libsystemd-network/test-ndisc-ra.c b/src/libsystemd-network/test-ndisc-ra.c index 76f4d7ba3f2..c63d9dfdabf 100644 --- a/src/libsystemd-network/test-ndisc-ra.c +++ b/src/libsystemd-network/test-ndisc-ra.c @@ -208,7 +208,7 @@ TEST(radv) { ASSERT_RETURN_EXPECTED_SE(sd_radv_set_retransmit(NULL, 10 * USEC_PER_MSEC) < 0); assert_se(sd_radv_set_retransmit(ra, 10 * USEC_PER_MSEC) >= 0); assert_se(sd_radv_set_retransmit(ra, 0) >= 0); - assert_se(sd_radv_set_retransmit(ra, usec_add(UINT32_MAX * USEC_PER_MSEC, USEC_PER_MSEC)) < 0); + assert_se(sd_radv_set_retransmit(ra, USEC_INFINITY) >= 0); ASSERT_RETURN_EXPECTED_SE(sd_radv_set_rdnss(NULL, 0, NULL, 0) < 0); assert_se(sd_radv_set_rdnss(ra, 0, NULL, 0) >= 0); diff --git a/src/systemd/sd-radv.h b/src/systemd/sd-radv.h index 6d17dcc7f6d..2538f2ab6fa 100644 --- a/src/systemd/sd-radv.h +++ b/src/systemd/sd-radv.h @@ -58,8 +58,8 @@ int sd_radv_set_mtu(sd_radv *ra, uint32_t mtu); int sd_radv_set_hop_limit(sd_radv *ra, uint8_t hop_limit); int sd_radv_set_retransmit(sd_radv *ra, uint64_t usec); int sd_radv_set_router_lifetime(sd_radv *ra, uint64_t usec); -int sd_radv_set_managed_information(sd_radv *ra, int managed); -int sd_radv_set_other_information(sd_radv *ra, int other); +int sd_radv_set_managed_information(sd_radv *ra, int b); +int sd_radv_set_other_information(sd_radv *ra, int b); int sd_radv_set_preference(sd_radv *ra, unsigned preference); int sd_radv_add_prefix(sd_radv *ra, sd_radv_prefix *p); int sd_radv_add_route_prefix(sd_radv *ra, sd_radv_route_prefix *p);