Re: [PATCH net] ipv6: Add lwtunnel encap size of all siblings in nexthop calculation

From: Alexander Lobakin
Date: Tue Feb 14 2023 - 12:40:58 EST


From: Lu Wei <luwei32@xxxxxxxxxx>
Date: Tue, 14 Feb 2023 17:29:33 +0800

> In function rt6_nlmsg_size(), the length of nexthop is calculated
> by multipling the nexthop length of fib6_info and the number of
> siblings. However if the fib6_info has no lwtunnel but the siblings
> have lwtunnels, the nexthop length is less than it should be, and
> it will trigger a warning in inet6_rt_notify() as follows:

[...]

> diff --git a/net/ipv6/route.c b/net/ipv6/route.c
> index e74e0361fd92..a6983a13dd20 100644
> --- a/net/ipv6/route.c
> +++ b/net/ipv6/route.c
> @@ -5540,16 +5540,17 @@ static size_t rt6_nlmsg_size(struct fib6_info *f6i)
> nexthop_for_each_fib6_nh(f6i->nh, rt6_nh_nlmsg_size,
> &nexthop_len);
> } else {
> + struct fib6_info *sibling, *next_sibling;
> struct fib6_nh *nh = f6i->fib6_nh;
>
> nexthop_len = 0;
> if (f6i->fib6_nsiblings) {
> - nexthop_len = nla_total_size(0) /* RTA_MULTIPATH */
> - + NLA_ALIGN(sizeof(struct rtnexthop))
> - + nla_total_size(16) /* RTA_GATEWAY */
> - + lwtunnel_get_encap_size(nh->fib_nh_lws);
> + rt6_nh_nlmsg_size(nh, &nexthop_len);
>
> - nexthop_len *= f6i->fib6_nsiblings;
> + list_for_each_entry_safe(sibling, next_sibling,
> + &f6i->fib6_siblings, fib6_siblings) {
> + rt6_nh_nlmsg_size(sibling->fib6_nh, &nexthop_len);
> + }

Just a random nitpick that you shouldn't put braces {} around oneliners :D

> }
> nexthop_len += lwtunnel_get_encap_size(nh->fib_nh_lws);
> }
Thanks,
Olek