Skip to content

Commit

Permalink
ipv6: Refactor rt6_device_match
Browse files Browse the repository at this point in the history
Move the device and gateway checks in the fib6_next loop to a helper
that can be called per fib6_nh entry.

Signed-off-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David Ahern authored and David S. Miller committed Apr 11, 2019
1 parent d83009d commit 0c59d00
Showing 1 changed file with 25 additions and 13 deletions.
38 changes: 25 additions & 13 deletions net/ipv6/route.c
Original file line number Diff line number Diff line change
Expand Up @@ -466,32 +466,44 @@ struct fib6_info *fib6_multipath_select(const struct net *net,
* Route lookup. rcu_read_lock() should be held.
*/

static bool __rt6_device_match(struct net *net, const struct fib6_nh *nh,
const struct in6_addr *saddr, int oif, int flags)
{
const struct net_device *dev;

if (nh->fib_nh_flags & RTNH_F_DEAD)
return false;

dev = nh->fib_nh_dev;
if (oif) {
if (dev->ifindex == oif)
return true;
} else {
if (ipv6_chk_addr(net, saddr, dev,
flags & RT6_LOOKUP_F_IFACE))
return true;
}

return false;
}

static inline struct fib6_info *rt6_device_match(struct net *net,
struct fib6_info *rt,
const struct in6_addr *saddr,
int oif,
int flags)
{
const struct fib6_nh *nh;
struct fib6_info *sprt;

if (!oif && ipv6_addr_any(saddr) &&
!(rt->fib6_nh.fib_nh_flags & RTNH_F_DEAD))
return rt;

for (sprt = rt; sprt; sprt = rcu_dereference(sprt->fib6_next)) {
const struct net_device *dev = sprt->fib6_nh.fib_nh_dev;

if (sprt->fib6_nh.fib_nh_flags & RTNH_F_DEAD)
continue;

if (oif) {
if (dev->ifindex == oif)
return sprt;
} else {
if (ipv6_chk_addr(net, saddr, dev,
flags & RT6_LOOKUP_F_IFACE))
return sprt;
}
nh = &sprt->fib6_nh;
if (__rt6_device_match(net, nh, saddr, oif, flags))
return sprt;
}

if (oif && flags & RT6_LOOKUP_F_IFACE)
Expand Down

0 comments on commit 0c59d00

Please sign in to comment.