}
if ((c = tb[IFACE_ATTR_RA_MTU])) {
- uint32_t ra_mtu = blobmsg_get_u32(c);
-
- if (ra_mtu >= 1280 || ra_mtu <= 65535)
- iface->ra_mtu = ra_mtu;
- else
- syslog(LOG_ERR, "Invalid %s value configured for interface '%s'",
- iface_attrs[IFACE_ATTR_RA_MTU].name, iface->name);
+ uint32_t original_ra_mtu, ra_mtu;
+ original_ra_mtu = ra_mtu = blobmsg_get_u32(c);
+ if (ra_mtu < RA_MTU_MIN)
+ ra_mtu = RA_MTU_MIN;
+ else if (ra_mtu > RA_MTU_MAX)
+ ra_mtu = RA_MTU_MAX;
+ iface->ra_mtu = ra_mtu;
+
+ if (original_ra_mtu != ra_mtu) {
+ syslog(LOG_WARNING, "Clamped invalid %s value configured for interface '%s' to %d",
+ iface_attrs[IFACE_ATTR_RA_MTU].name, iface->name, iface->ra_mtu);
+ }
}
if ((c = tb[IFACE_ATTR_RA_SLAAC]))
RETRANS_TIMER 1,000 milliseconds
*/
#define RETRANS_TIMER_MAX 60000
+/* RFC2460 §5
+ IPv6 requires that every link in the internet have an MTU of 1280
+ octets or greater.
+*/
+#define RA_MTU_MIN 1280
+#define RA_MTU_MAX 65535
#define ND_RA_FLAG_PROXY 0x4
#define ND_RA_PREF_HIGH (1 << 3)