Message ID | 20240307100157.29699-1-shiming.cheng@mediatek.com (mailing list archive) |
---|---|
State | Accepted |
Commit | c4386ab4f6c600f75fdfd21143f89bac3e625d0d |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net,v5] ipv6: fib6_rules: flush route cache when rule is changed | expand |
On 3/7/24 3:01 AM, Shiming Cheng wrote: > When rule policy is changed, ipv6 socket cache is not refreshed. > The sock's skb still uses a outdated route cache and was sent to > a wrong interface. > > To avoid this error we should update fib node's version when > rule is changed. Then skb's route will be reroute checked as > route cache version is already different with fib node version. > The route cache is refreshed to match the latest rule. > > Fixes: 101367c2f8c4 ("[IPV6]: Policy Routing Rules") > Signed-off-by: Shiming Cheng <shiming.cheng@mediatek.com> > Signed-off-by: Lena Wang <lena.wang@mediatek.com> > --- > v5: > - rebase on the top of latest net/main branch. > v4: > - add "Fixes:" tag. > - update subject as requested. > v3: > - update patch description and name format in commit message. > v2: > - modify flush function same way as ipv4 flush cache. > - use tabs to aligh with existing code. > --- > --- > net/ipv6/fib6_rules.c | 6 ++++++ > 1 file changed, 6 insertions(+) > Reviewed-by: David Ahern <dsahern@kernel.org>
Hello: This patch was applied to netdev/net.git (main) by David S. Miller <davem@davemloft.net>: On Thu, 7 Mar 2024 18:01:57 +0800 you wrote: > When rule policy is changed, ipv6 socket cache is not refreshed. > The sock's skb still uses a outdated route cache and was sent to > a wrong interface. > > To avoid this error we should update fib node's version when > rule is changed. Then skb's route will be reroute checked as > route cache version is already different with fib node version. > The route cache is refreshed to match the latest rule. > > [...] Here is the summary with links: - [net,v5] ipv6: fib6_rules: flush route cache when rule is changed https://git.kernel.org/netdev/net/c/c4386ab4f6c6 You are awesome, thank you!
diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c index 7523c4baef35..52c04f0ac498 100644 --- a/net/ipv6/fib6_rules.c +++ b/net/ipv6/fib6_rules.c @@ -449,6 +449,11 @@ static size_t fib6_rule_nlmsg_payload(struct fib_rule *rule) + nla_total_size(16); /* src */ } +static void fib6_rule_flush_cache(struct fib_rules_ops *ops) +{ + rt_genid_bump_ipv6(ops->fro_net); +} + static const struct fib_rules_ops __net_initconst fib6_rules_ops_template = { .family = AF_INET6, .rule_size = sizeof(struct fib6_rule), @@ -461,6 +466,7 @@ static const struct fib_rules_ops __net_initconst fib6_rules_ops_template = { .compare = fib6_rule_compare, .fill = fib6_rule_fill, .nlmsg_payload = fib6_rule_nlmsg_payload, + .flush_cache = fib6_rule_flush_cache, .nlgroup = RTNLGRP_IPV6_RULE, .owner = THIS_MODULE, .fro_net = &init_net,