[RFC netifd 1/2] interface-ip: mask out host bits in IPv4 route targets
Etienne Champetier
champetier.etienne at gmail.com
Thu Aug 24 06:04:34 PDT 2023
Hi Jo,
Le jeu. 24 août 2023 à 08:55, Jo-Philipp Wich <jo at mein.io> a écrit :
>
> The kernel will reject attempts to install routes with target addresses
> having host bits set with an "Invalid prefix for given prefix length"
> error.
>
> A route configuration like the one below will silently fail to apply:
>
> config route
> option interface lan
> option target 10.40.40.1/24
>
> Attempting to do the same with iproute2 will fail as well:
>
> # ip route add 10.40.40.1/24 dev br-lan
> Error: Invalid prefix for given prefix length.
>
> However, for IPv6 route targets with set host bits are allowed:
>
> # ip -6 route add 3000::1/64 via fe80::1234:5678:9abcd:ef01 dev br-lan
> # ip -6 route list 3000::1/64
> 3000::/64 via fe80::1234:5678:9abc:def1 dev br-lan metric 1024 pref medium
>
> In order to stay consistent here, and to avoid unecessary configuration
> pitfalls, make netifd more lenient and simply mask out excess host bits
> while parsing IPv4 route configuration.
>
> Signed-off-by: Jo-Philipp Wich <jo at mein.io>
> ---
> interface-ip.c | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/interface-ip.c b/interface-ip.c
> index a06a514..fee29a9 100644
> --- a/interface-ip.c
> +++ b/interface-ip.c
> @@ -441,6 +441,10 @@ interface_ip_add_route(struct interface *iface, struct blob_attr *attr, bool v6)
> DPRINTF("Failed to parse route target: %s\n", (char *) blobmsg_data(cur));
> goto error;
> }
> +
> + /* Mask out IPv4 host bits to avoid "Invalid prefix for given prefix length" */
> + if (af == AF_INET && route->mask < 32)
> + route->addr.in.s_addr &= ((1u << route->mask) - 1);
Maybe print a warning / info message if the route was fixed
Etienne
More information about the openwrt-devel
mailing list