mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
net/ipv6: Refactor fib6_rule_action
Move source address lookup from fib6_rule_action to a helper. It will be used in a later patch by a second variant for fib6_rule_action. Signed-off-by: David Ahern <dsahern@gmail.com> Acked-by: David S. Miller <davem@davemloft.net> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
This commit is contained in:
parent
1d053da910
commit
cc065a9eb9
1 changed files with 29 additions and 19 deletions
|
@ -96,6 +96,31 @@ struct dst_entry *fib6_rule_lookup(struct net *net, struct flowi6 *fl6,
|
||||||
return &net->ipv6.ip6_null_entry->dst;
|
return &net->ipv6.ip6_null_entry->dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int fib6_rule_saddr(struct net *net, struct fib_rule *rule, int flags,
|
||||||
|
struct flowi6 *flp6, const struct net_device *dev)
|
||||||
|
{
|
||||||
|
struct fib6_rule *r = (struct fib6_rule *)rule;
|
||||||
|
|
||||||
|
/* If we need to find a source address for this traffic,
|
||||||
|
* we check the result if it meets requirement of the rule.
|
||||||
|
*/
|
||||||
|
if ((rule->flags & FIB_RULE_FIND_SADDR) &&
|
||||||
|
r->src.plen && !(flags & RT6_LOOKUP_F_HAS_SADDR)) {
|
||||||
|
struct in6_addr saddr;
|
||||||
|
|
||||||
|
if (ipv6_dev_get_saddr(net, dev, &flp6->daddr,
|
||||||
|
rt6_flags2srcprefs(flags), &saddr))
|
||||||
|
return -EAGAIN;
|
||||||
|
|
||||||
|
if (!ipv6_prefix_equal(&saddr, &r->src.addr, r->src.plen))
|
||||||
|
return -EAGAIN;
|
||||||
|
|
||||||
|
flp6->saddr = saddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp,
|
static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp,
|
||||||
int flags, struct fib_lookup_arg *arg)
|
int flags, struct fib_lookup_arg *arg)
|
||||||
{
|
{
|
||||||
|
@ -134,27 +159,12 @@ static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp,
|
||||||
|
|
||||||
rt = lookup(net, table, flp6, arg->lookup_data, flags);
|
rt = lookup(net, table, flp6, arg->lookup_data, flags);
|
||||||
if (rt != net->ipv6.ip6_null_entry) {
|
if (rt != net->ipv6.ip6_null_entry) {
|
||||||
struct fib6_rule *r = (struct fib6_rule *)rule;
|
err = fib6_rule_saddr(net, rule, flags, flp6,
|
||||||
|
ip6_dst_idev(&rt->dst)->dev);
|
||||||
|
|
||||||
/*
|
if (err == -EAGAIN)
|
||||||
* If we need to find a source address for this traffic,
|
goto again;
|
||||||
* we check the result if it meets requirement of the rule.
|
|
||||||
*/
|
|
||||||
if ((rule->flags & FIB_RULE_FIND_SADDR) &&
|
|
||||||
r->src.plen && !(flags & RT6_LOOKUP_F_HAS_SADDR)) {
|
|
||||||
struct in6_addr saddr;
|
|
||||||
|
|
||||||
if (ipv6_dev_get_saddr(net,
|
|
||||||
ip6_dst_idev(&rt->dst)->dev,
|
|
||||||
&flp6->daddr,
|
|
||||||
rt6_flags2srcprefs(flags),
|
|
||||||
&saddr))
|
|
||||||
goto again;
|
|
||||||
if (!ipv6_prefix_equal(&saddr, &r->src.addr,
|
|
||||||
r->src.plen))
|
|
||||||
goto again;
|
|
||||||
flp6->saddr = saddr;
|
|
||||||
}
|
|
||||||
err = rt->dst.error;
|
err = rt->dst.error;
|
||||||
if (err != -EAGAIN)
|
if (err != -EAGAIN)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
Loading…
Add table
Reference in a new issue