From: Yu Watanabe Date: Wed, 21 Feb 2024 05:01:15 +0000 (+0900) Subject: sd-radv: allow to configure reachable time in RA header X-Git-Tag: v256-rc1~78^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bc50700c7ec54eea17245a389e444355b70e573a;p=thirdparty%2Fsystemd.git sd-radv: allow to configure reachable time in RA header --- diff --git a/src/libsystemd-network/radv-internal.h b/src/libsystemd-network/radv-internal.h index 378781c138d..cc64630d2e7 100644 --- a/src/libsystemd-network/radv-internal.h +++ b/src/libsystemd-network/radv-internal.h @@ -107,6 +107,7 @@ struct sd_radv { uint8_t flags; uint8_t preference; uint32_t mtu; + usec_t reachable_usec; usec_t retransmit_usec; usec_t lifetime_usec; /* timespan */ diff --git a/src/libsystemd-network/sd-radv.c b/src/libsystemd-network/sd-radv.c index f6f30ce3197..a30a805271b 100644 --- a/src/libsystemd-network/sd-radv.c +++ b/src/libsystemd-network/sd-radv.c @@ -163,6 +163,7 @@ static int radv_send_router(sd_radv *ra, const struct in6_addr *dst) { struct nd_router_advert adv = { .nd_ra_type = ND_ROUTER_ADVERT, .nd_ra_router_lifetime = usec_to_be16_sec(ra->lifetime_usec), + .nd_ra_reachable = usec_to_be32_msec(ra->reachable_usec), .nd_ra_retransmit = usec_to_be32_msec(ra->retransmit_usec), }; struct { @@ -538,6 +539,13 @@ int sd_radv_set_hop_limit(sd_radv *ra, uint8_t hop_limit) { return 0; } +int sd_radv_set_reachable_time(sd_radv *ra, uint64_t usec) { + assert_return(ra, -EINVAL); + + ra->reachable_usec = usec; + return 0; +} + int sd_radv_set_retransmit(sd_radv *ra, uint64_t usec) { assert_return(ra, -EINVAL); diff --git a/src/libsystemd-network/test-ndisc-ra.c b/src/libsystemd-network/test-ndisc-ra.c index 78635ee6576..8be7351a098 100644 --- a/src/libsystemd-network/test-ndisc-ra.c +++ b/src/libsystemd-network/test-ndisc-ra.c @@ -199,6 +199,11 @@ TEST(radv) { assert_se(sd_radv_set_other_information(ra, true) >= 0); assert_se(sd_radv_set_other_information(ra, false) >= 0); + ASSERT_RETURN_EXPECTED_SE(sd_radv_set_reachable_time(NULL, 10 * USEC_PER_MSEC) < 0); + assert_se(sd_radv_set_reachable_time(ra, 10 * USEC_PER_MSEC) >= 0); + assert_se(sd_radv_set_reachable_time(ra, 0) >= 0); + assert_se(sd_radv_set_reachable_time(ra, USEC_INFINITY) >= 0); + 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); diff --git a/src/systemd/sd-radv.h b/src/systemd/sd-radv.h index f25622fceb5..3120dd7f00a 100644 --- a/src/systemd/sd-radv.h +++ b/src/systemd/sd-radv.h @@ -57,6 +57,7 @@ int sd_radv_set_link_local_address(sd_radv *ra, const struct in6_addr *addr); int sd_radv_set_mac(sd_radv *ra, const struct ether_addr *mac_addr); 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_reachable_time(sd_radv *ra, uint64_t usec); 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 b);