net: ipv4: Fix rtnexthop len when RTA_FLOW is present
Multipath RTA_FLOW is embedded in nexthop. Dump it in fib_add_nexthop()
to get the length of rtnexthop correct.
Fixes: b0f6019363 ("ipv4: Refactor nexthop attributes in fib_dump_info")
Signed-off-by: Xiao Liang <shaw.leon@gmail.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
325fd36ae7
commit
597aa16c78
@@ -1661,7 +1661,7 @@ EXPORT_SYMBOL_GPL(fib_nexthop_info);
|
||||
|
||||
#if IS_ENABLED(CONFIG_IP_ROUTE_MULTIPATH) || IS_ENABLED(CONFIG_IPV6)
|
||||
int fib_add_nexthop(struct sk_buff *skb, const struct fib_nh_common *nhc,
|
||||
int nh_weight, u8 rt_family)
|
||||
int nh_weight, u8 rt_family, u32 nh_tclassid)
|
||||
{
|
||||
const struct net_device *dev = nhc->nhc_dev;
|
||||
struct rtnexthop *rtnh;
|
||||
@@ -1679,6 +1679,9 @@ int fib_add_nexthop(struct sk_buff *skb, const struct fib_nh_common *nhc,
|
||||
|
||||
rtnh->rtnh_flags = flags;
|
||||
|
||||
if (nh_tclassid && nla_put_u32(skb, RTA_FLOW, nh_tclassid))
|
||||
goto nla_put_failure;
|
||||
|
||||
/* length of rtnetlink header + attributes */
|
||||
rtnh->rtnh_len = nlmsg_get_pos(skb) - (void *)rtnh;
|
||||
|
||||
@@ -1706,14 +1709,13 @@ static int fib_add_multipath(struct sk_buff *skb, struct fib_info *fi)
|
||||
}
|
||||
|
||||
for_nexthops(fi) {
|
||||
if (fib_add_nexthop(skb, &nh->nh_common, nh->fib_nh_weight,
|
||||
AF_INET) < 0)
|
||||
goto nla_put_failure;
|
||||
u32 nh_tclassid = 0;
|
||||
#ifdef CONFIG_IP_ROUTE_CLASSID
|
||||
if (nh->nh_tclassid &&
|
||||
nla_put_u32(skb, RTA_FLOW, nh->nh_tclassid))
|
||||
goto nla_put_failure;
|
||||
nh_tclassid = nh->nh_tclassid;
|
||||
#endif
|
||||
if (fib_add_nexthop(skb, &nh->nh_common, nh->fib_nh_weight,
|
||||
AF_INET, nh_tclassid) < 0)
|
||||
goto nla_put_failure;
|
||||
} endfor_nexthops(fi);
|
||||
|
||||
mp_end:
|
||||
|
||||
Reference in New Issue
Block a user