From: wenxu <we...@ucloud.cn>

When the net_device unregister, the netdevice_notifier will release
the related netdev basedchain and rules in this chains. So it is also
need to clear the offload things

Signed-off-by: wenxu <we...@ucloud.cn>
---
 net/netfilter/nf_tables_api.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
index fe3b7b0..345df36 100644
--- a/net/netfilter/nf_tables_api.c
+++ b/net/netfilter/nf_tables_api.c
@@ -7495,16 +7495,25 @@ int nft_data_dump(struct sk_buff *skb, int attr, const 
struct nft_data *data,
 int __nft_release_basechain(struct nft_ctx *ctx)
 {
        struct nft_rule *rule, *nr;
+       bool offloaded = false;
 
        if (WARN_ON(!nft_is_base_chain(ctx->chain)))
                return 0;
 
+       if (ctx->chain->flags & NFT_CHAIN_HW_OFFLOAD)
+               offloaded = true;
+
        nf_tables_unregister_hook(ctx->net, ctx->chain->table, ctx->chain);
        list_for_each_entry_safe(rule, nr, &ctx->chain->rules, list) {
+               if (offloaded)
+                       nft_flow_offload_rule(ctx->chain, rule,
+                                             NULL, FLOW_CLS_DESTROY);
                list_del(&rule->list);
                ctx->chain->use--;
                nf_tables_rule_release(ctx, rule);
        }
+       if (offloaded)
+               nft_flow_offload_chain(ctx->chain, FLOW_BLOCK_UNBIND);
        nft_chain_del(ctx->chain);
        ctx->table->use--;
        nf_tables_chain_destroy(ctx);
-- 
1.8.3.1

Reply via email to