]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sd-radv: allow to configure reachable time in RA header
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 21 Feb 2024 05:01:15 +0000 (14:01 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 22 Apr 2024 09:40:10 +0000 (18:40 +0900)
src/libsystemd-network/radv-internal.h
src/libsystemd-network/sd-radv.c
src/libsystemd-network/test-ndisc-ra.c
src/systemd/sd-radv.h

index 378781c138dce130e9ac916ddc87c87026644d1e..cc64630d2e72c945e14dca6611376e4cabb4a7e5 100644 (file)
@@ -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 */
 
index f6f30ce3197764f74e521d4135de82d4fa808246..a30a805271bd3fa2934e3370bd696ba2a3ccc0ab 100644 (file)
@@ -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);
 
index 78635ee657670f22b58cc783ced763f6f14ffe40..8be7351a0987c432812a99f58afa204f5f283c64 100644 (file)
@@ -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);
index f25622fceb5d844fc66a7bdfe15700a61d770727..3120dd7f00ac20c6350eb05f51994a7ed6e0109f 100644 (file)
@@ -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);