diff mbox series

[v2,6/9] router: Apply updated values from RFC8319 (updates RFC4861) to RA/ND

Message ID 20240405111025.26478-7-newtwen+github@gmail.com
State Superseded
Headers show
Series odhcpd patchset | expand

Commit Message

Paul Donald April 5, 2024, 11:06 a.m. UTC
From: Paul Donald <newtwen@gmail.com>

https://www.rfc-editor.org/rfc/rfc8319#section-4

Signed-off-by: Paul Donald <newtwen@gmail.com>
Reviewed-by: Daniel Golle <daniel@makrotopia.org>
---
 src/router.c |  6 ++++--
 src/router.h | 21 ++++++++++++++++++++-
 2 files changed, 24 insertions(+), 3 deletions(-)

Comments

Jonas Gorski April 6, 2024, 10:05 a.m. UTC | #1
Hi,

On Fri, 5 Apr 2024 at 13:11, Paul Donald <newtwen+github@gmail.com> wrote:
>
> From: Paul Donald <newtwen@gmail.com>
>
> https://www.rfc-editor.org/rfc/rfc8319#section-4
>
> Signed-off-by: Paul Donald <newtwen@gmail.com>
> Reviewed-by: Daniel Golle <daniel@makrotopia.org>
> ---
>  src/router.c |  6 ++++--
>  src/router.h | 21 ++++++++++++++++++++-
>  2 files changed, 24 insertions(+), 3 deletions(-)
>
> diff --git a/src/router.c b/src/router.c
> index a1a7829..4239aa8 100644
> --- a/src/router.c
> +++ b/src/router.c
> @@ -377,8 +377,10 @@ static uint32_t calc_ra_lifetime(struct interface *iface, uint32_t maxival)
>                 lifetime = iface->ra_lifetime;
>                 if (lifetime > 0 && lifetime < maxival)
>                         lifetime = maxival;
> -               else if (lifetime > 9000)
> -                       lifetime = 9000;
> +               else if (lifetime > AdvDefaultLifetime)
> +                       lifetime = AdvDefaultLifetime;

This clamping should be done in src/config.c, where we get
iface->ra_lifetime from ubus.

> +               else if (lifetime > RouterLifetime)
> +                       lifetime = RouterLifetime;

The only caller of calc_ra_lifetime() already clamps the returned
value to UINT16_MAX ( = 65535), you could as well drop all limiting
here now.

>         }
>
>         return lifetime;
> diff --git a/src/router.h b/src/router.h
> index 0444da8..b91c60a 100644
> --- a/src/router.h
> +++ b/src/router.h
> @@ -32,8 +32,27 @@ struct icmpv6_opt {
>
>  #define MaxInitialRtrAdvInterval       16
>  #define MaxInitialRtAdvs               3
> -#define MaxRtrAdvInterval              1800
> +/* RFC8319 §4
> +   This document updates §4.2 and 6.2.1 of [RFC4861] to change
> +   the following router configuration variables.
> +
> +   In §6.2.1, inside the paragraph that defines
> +   MaxRtrAdvInterval, change 1800 to 65535 seconds.
> +
> +   In §6.2.1, inside the paragraph that defines
> +   AdvDefaultLifetime, change 9000 to 65535 seconds.
> +*/
> +#define MaxRtrAdvInterval              65535

This is a configuration variable, not a constant, naming it like a
defined configuration variable is confusing.

RFC4861 says the default for MaxRtrAdvInterval is 600 seconds (which
we use in src/config.c), not 65535. The maximum allowed value is
increased to 65535 in RFC8319.

Where this limit should be applied is in src/config.c, where we get
the IFACE_ATTR_RA_MAXINTERVAL value (which is currently missing a
range check).

>  #define MinRtrAdvInterval              3
> +#define AdvDefaultLifetime             65535

Likewise, this should be used in src/config.c for a range check of
IFACE_ATTR_RA_LIFETIME.

IFACE_ATTR_RA_MININTERVAL could also use a range check.

> +/* RFC8319 §4
> +   This document updates §4.2 and 6.2.1 of [RFC4861] to change
> +   the following router configuration variables.
> +
> +   In §4.2, inside the paragraph that defines Router Lifetime,
> +   change 9000 to 65535 seconds.
> +*/
> +#define RouterLifetime          65535

This is a limit, not the value to use, so it should be named appropriately.

Best Regards,
Jonas
Paul D April 9, 2024, 3:03 a.m. UTC | #2
On 2024-04-06 12:05, Jonas Gorski wrote:
> Hi,

You're right on all counts. I separated out the value clamping and config values to another patch-set.

Thanks for your sharp eyes.
diff mbox series

Patch

diff --git a/src/router.c b/src/router.c
index a1a7829..4239aa8 100644
--- a/src/router.c
+++ b/src/router.c
@@ -377,8 +377,10 @@  static uint32_t calc_ra_lifetime(struct interface *iface, uint32_t maxival)
 		lifetime = iface->ra_lifetime;
 		if (lifetime > 0 && lifetime < maxival)
 			lifetime = maxival;
-		else if (lifetime > 9000)
-			lifetime = 9000;
+		else if (lifetime > AdvDefaultLifetime)
+			lifetime = AdvDefaultLifetime;
+		else if (lifetime > RouterLifetime)
+			lifetime = RouterLifetime;
 	}
 
 	return lifetime;
diff --git a/src/router.h b/src/router.h
index 0444da8..b91c60a 100644
--- a/src/router.h
+++ b/src/router.h
@@ -32,8 +32,27 @@  struct icmpv6_opt {
 
 #define MaxInitialRtrAdvInterval	16
 #define MaxInitialRtAdvs		3
-#define MaxRtrAdvInterval		1800
+/* RFC8319 §4
+   This document updates §4.2 and 6.2.1 of [RFC4861] to change
+   the following router configuration variables.
+
+   In §6.2.1, inside the paragraph that defines
+   MaxRtrAdvInterval, change 1800 to 65535 seconds.
+
+   In §6.2.1, inside the paragraph that defines
+   AdvDefaultLifetime, change 9000 to 65535 seconds.
+*/
+#define MaxRtrAdvInterval		65535
 #define MinRtrAdvInterval		3
+#define AdvDefaultLifetime 		65535
+/* RFC8319 §4
+   This document updates §4.2 and 6.2.1 of [RFC4861] to change
+   the following router configuration variables.
+
+   In §4.2, inside the paragraph that defines Router Lifetime,
+   change 9000 to 65535 seconds.
+*/
+#define RouterLifetime          65535
 
 #define ND_RA_FLAG_PROXY		0x4
 #define ND_RA_PREF_HIGH			(1 << 3)