Commit 0c59d006 authored by David Ahern's avatar David Ahern Committed by David S. Miller

ipv6: Refactor rt6_device_match

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: default avatarDavid Ahern <dsahern@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d83009d4
...@@ -466,12 +466,34 @@ struct fib6_info *fib6_multipath_select(const struct net *net, ...@@ -466,12 +466,34 @@ struct fib6_info *fib6_multipath_select(const struct net *net,
* Route lookup. rcu_read_lock() should be held. * 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, static inline struct fib6_info *rt6_device_match(struct net *net,
struct fib6_info *rt, struct fib6_info *rt,
const struct in6_addr *saddr, const struct in6_addr *saddr,
int oif, int oif,
int flags) int flags)
{ {
const struct fib6_nh *nh;
struct fib6_info *sprt; struct fib6_info *sprt;
if (!oif && ipv6_addr_any(saddr) && if (!oif && ipv6_addr_any(saddr) &&
...@@ -479,19 +501,9 @@ static inline struct fib6_info *rt6_device_match(struct net *net, ...@@ -479,19 +501,9 @@ static inline struct fib6_info *rt6_device_match(struct net *net,
return rt; return rt;
for (sprt = rt; sprt; sprt = rcu_dereference(sprt->fib6_next)) { for (sprt = rt; sprt; sprt = rcu_dereference(sprt->fib6_next)) {
const struct net_device *dev = sprt->fib6_nh.fib_nh_dev; nh = &sprt->fib6_nh;
if (__rt6_device_match(net, nh, saddr, oif, flags))
if (sprt->fib6_nh.fib_nh_flags & RTNH_F_DEAD) return sprt;
continue;
if (oif) {
if (dev->ifindex == oif)
return sprt;
} else {
if (ipv6_chk_addr(net, saddr, dev,
flags & RT6_LOOKUP_F_IFACE))
return sprt;
}
} }
if (oif && flags & RT6_LOOKUP_F_IFACE) if (oif && flags & RT6_LOOKUP_F_IFACE)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment