config: cap ra_reachabletime to RFC maximum instead of logging error
authorPaul Donald <[email protected]>
Fri, 10 Oct 2025 11:45:48 +0000 (13:45 +0200)
committerÁlvaro Fernández Rojas <[email protected]>
Mon, 13 Oct 2025 07:53:23 +0000 (09:53 +0200)
Signed-off-by: Paul Donald <[email protected]>
Link: https://github.com/openwrt/odhcpd/pull/225
Signed-off-by: Álvaro Fernández Rojas <[email protected]>
src/config.c
src/router.h

index 7f112816aecabb982bee5133d5305d9b2451859b..0441b12fa62a1780ea2ca4f7a7d41d4b02a192f8 100644 (file)
@@ -1359,11 +1359,13 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr
        if ((c = tb[IFACE_ATTR_RA_REACHABLETIME])) {
                uint32_t ra_reachabletime = blobmsg_get_u32(c);
 
-               if (ra_reachabletime <= 3600000)
-                       iface->ra_reachabletime = ra_reachabletime;
-               else
-                       syslog(LOG_ERR, "Invalid %s value configured for interface '%s'",
-                                       iface_attrs[IFACE_ATTR_RA_REACHABLETIME].name, iface->name);
+               /* RFC4861 §6.2.1 : AdvReachableTime : 
+                * MUST be no greater than 3,600,000 msec
+                */
+               iface->ra_reachabletime = ra_reachabletime <= AdvReachableTime ? ra_reachabletime : AdvReachableTime;
+               if(ra_reachabletime > AdvReachableTime)
+                       syslog(LOG_WARNING, "Clamped invalid %s value configured for interface '%s' to %d",
+                                       iface_attrs[IFACE_ATTR_RA_REACHABLETIME].name, iface->name, iface->ra_reachabletime);
        }
 
        if ((c = tb[IFACE_ATTR_RA_RETRANSTIME])) {
index 6609f4355546f6a019daf64f0eac8c580cffbd86..2cd5469bb8a89e51bc92044db4741ab2e062385b 100644 (file)
@@ -66,6 +66,10 @@ struct icmpv6_opt {
        define is used to cap values to a sane ceiling, i.e. ND_VALID_LIMIT.
 */
 #define RouterLifetime                                 5400
+/* RFC4861 §6.2.1 : AdvReachableTime : 
+ * MUST be no greater than 3,600,000 msec
+ */
+#define AdvReachableTime                               3600000
 
 #define ND_RA_FLAG_PROXY               0x4
 #define ND_RA_PREF_HIGH                        (1 << 3)