net: ipv6: Compare lwstate in detecting duplicate nexthops
Subsystems (3)
PATCH 1/1 net: ipv6: Compare lwstate in detecting duplicate nexthops
Lennert reported a failure to add different mpls encaps in a multipath route:
$ ip -6 route add 1234::/16 \
nexthop encap mpls 10 via fe80::1 dev ens3 \
nexthop encap mpls 20 via fe80::1 dev ens3
RTNETLINK answers: File existsThe problem is that the duplicate nexthop detection does not compare lwtunnel configuration. Add it.
--- include/net/ip6_route.h | 8 ++++++++ net/ipv6/ip6_fib.c | 5 +---- net/ipv6/route.c | 8 +------- 3 files changed, 10 insertions(+), 11 deletions(-)
include/net/ip6_route.h +8 -0
@@ -22,6 +22,7 @@ struct route_info {#include <net/flow.h> #include <net/ip6_fib.h> #include <net/sock.h> +#include <net/lwtunnel.h> #include <linux/ip.h> #include <linux/ipv6.h> #include <linux/route.h>
@@ -233,4 +234,11 @@ static inline struct in6_addr *rt6_nexthop(struct rt6_info *rt, return daddr; } +static inline bool rt6_duplicate_nexthop (struct rt6_info *a,struct rt6_info *b) +{ +return a->dst.dev == b->dst.dev && + a->rt6i_idev == b->rt6i_idev && +ipv6_addr_equal (&a->rt6i_gateway, &b->rt6i_gateway) && + !lwtunnel_cmp_encap (a->dst.lwtstate, b->dst.lwtstate); +}#endif
net/ipv6/ip6_fib.c +1 -4
@@ -784,10 +784,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, goto next_iter; } -if (iter->dst.dev == rt->dst.dev && - iter->rt6i_idev == rt->rt6i_idev && -ipv6_addr_equal (&iter->rt6i_gateway, - &rt->rt6i_gateway)) { +if (rt6_duplicate_nexthop (iter, rt)) {if (rt->rt6i_nsiblings) rt->rt6i_nsiblings =0 ;if (!(iter->rt6i_flags &RTF_EXPIRES ))
net/ipv6/route.c +1 -7
@@ -3048,17 +3048,11 @@ static int ip6_route_info_append(struct list_head *rt6_nh_list, struct rt6_info *rt, struct fib6_config *r_cfg) { struct rt6_nh *nh; -struct rt6_info *rtnh;int err = -EEXIST ;list_for_each_entry (nh, rt6_nh_list, next) {/* check if rt6_info already exists */ - rtnh = nh->rt6_info; - -if (rtnh->dst.dev == rt->dst.dev && - rtnh->rt6i_idev == rt->rt6i_idev && -ipv6_addr_equal (&rtnh->rt6i_gateway, - &rt->rt6i_gateway)) +if (rt6_duplicate_nexthop (nh->rt6_info, rt))return err; }
Signature · 1 line
2.11.0 (Apple Git-81)
Quoted 8 lines · David Ahern
Lennert reported a failure to add different mpls encaps in a multipath route:
$ ip -6 route add 1234::/16 \ nexthop encap mpls 10 via fe80::1 dev ens3 \ nexthop encap mpls 20 via fe80::1 dev ens3 RTNETLINK answers: File exists
Quoted 6 lines
The problem is that the duplicate nexthop detection does not compare lwtunnel configuration. Add it.
Fixes 19e42e451506("ipv6: support for fib route lwtunnel encap attributes")Signed-off-by David Ahern <[email protected]>---
Lennert Buytenhek
Tested-byQuoted 11 lines · Roopa Prabhu
Quoted 11 lines
Lennert reported a failure to add different mpls encaps in a multipath route:
$ ip -6 route add 1234::/16 \ nexthop encap mpls 10 via fe80::1 dev ens3 \ nexthop encap mpls 20 via fe80::1 dev ens3 RTNETLINK answers: File existsThe problem is that the duplicate nexthop detection does not compare lwtunnel configuration. Add it.
Quoted 8 lines
Quoted 2 lines
Fixes 19e42e451506("ipv6: support for fib route lwtunnel encap attributes")Signed-off-by David Ahern <[email protected]>Reported-by João Taveira Araújo <[email protected]>Reported-by Lennert Buytenhek <[email protected]>Acked-by Roopa Prabhu <[email protected]>
Seems to work! Thanks!
David Miller
maintainerFrom: David Ahern <[email protected]>
Date: Wed, 5 Jul 2017 14:41:46 -0600
Quoted 8 lines
Lennert reported a failure to add different mpls encaps in a multipath route:
$ ip -6 route add 1234::/16 \ nexthop encap mpls 10 via fe80::1 dev ens3 \ nexthop encap mpls 20 via fe80::1 dev ens3 RTNETLINK answers: File exists
Quoted 5 lines
The problem is that the duplicate nexthop detection does not compare lwtunnel configuration. Add it.
Fixes 19e42e451506("ipv6: support for fib route lwtunnel encap attributes")Signed-off-by David Ahern <[email protected]>
Applied and queued up for -stable, thanks.