Messages in this thread Patch in this message | | | From | Lena Wang (王娜) <> | Subject | [PATCH] Net:cache didn't flush when ipv6 rule changed | Date | Mon, 26 Feb 2024 13:11:01 +0000 |
| |
From a415abaf4fc90a27dd86357ea8be62d32956f7d8 Mon Sep 17 00:00:00 2001 From: shiming cheng <shiming.cheng@mediatek.com> Date: Mon, 26 Feb 2024 20:17:58 +0800 Subject: [PATCH] Net:cache didn't flush when ipv6 rule changed
When changed from old rule&route configure to new one as below, ipv6 cache dst_entry did not change to new route table as no cache flush callback function, then forward to wrong out interface. When fib6_check dst_entry, the fib6_node version[fn_sernm] is always the same with socket dst_cookie, old cache dst_entry is always used and no chance to update.
So we need to update fib6_node version when rule changed and flush cache to avoid dispatching a wrong interface.
Signed-off-by: shiming cheng <shiming.cheng@mediatek.com> --- net/ipv6/fib6_rules.c | 10 ++++++++++ 1 files changed, 10 insertions(+)
diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c index 7523c4baef35..bec2cf4436e1 100644 --- a/net/ipv6/fib6_rules.c +++ b/net/ipv6/fib6_rules.c @@ -449,6 +449,15 @@ 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) +{ + struct net *net = ops->fro_net; + if (!net) + return; + rt_genid_bump_ipv6(net); + return; +} + static const struct fib_rules_ops __net_initconst fib6_rules_ops_template = { .family = AF_INET6, .rule_size = sizeof(struct fib6_rule), @@ -461,6 +470,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, -- 2.18.0 | |