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

ipv6: fib6_rule_action_alt needs to return -EAGAIN

fib rule actions should return -EAGAIN for the rules to continue to the
next one. A recent change overwrote err with the lookup always returning
0 (future change will make it more like IPv4) which means the rules
stopped at the first (e.g., local table lookup only). Catch and reset err
to -EAGAIN.

Fixes: effda4dd ("ipv6: Pass fib6_result to fib lookups")
Signed-off-by: default avatarDavid Ahern <dsahern@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7973d9e7
...@@ -157,7 +157,7 @@ static int fib6_rule_action_alt(struct fib_rule *rule, struct flowi *flp, ...@@ -157,7 +157,7 @@ static int fib6_rule_action_alt(struct fib_rule *rule, struct flowi *flp,
struct flowi6 *flp6 = &flp->u.ip6; struct flowi6 *flp6 = &flp->u.ip6;
struct net *net = rule->fr_net; struct net *net = rule->fr_net;
struct fib6_table *table; struct fib6_table *table;
int err = -EAGAIN, *oif; int err, *oif;
u32 tb_id; u32 tb_id;
switch (rule->action) { switch (rule->action) {
...@@ -182,6 +182,8 @@ static int fib6_rule_action_alt(struct fib_rule *rule, struct flowi *flp, ...@@ -182,6 +182,8 @@ static int fib6_rule_action_alt(struct fib_rule *rule, struct flowi *flp,
if (!err && res->f6i != net->ipv6.fib6_null_entry) if (!err && res->f6i != net->ipv6.fib6_null_entry)
err = fib6_rule_saddr(net, rule, flags, flp6, err = fib6_rule_saddr(net, rule, flags, flp6,
res->nh->fib_nh_dev); res->nh->fib_nh_dev);
else
err = -EAGAIN;
return err; return err;
} }
......
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