netfilter: nf_tables: Prepare for handling NETDEV_REGISTER events
authorPhil Sutter <phil@nwl.cc>
Wed, 21 May 2025 20:44:27 +0000 (22:44 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Fri, 23 May 2025 11:57:13 +0000 (13:57 +0200)
Put NETDEV_UNREGISTER handling code into a switch, no functional change
intended as the function is only called for that event yet.

Signed-off-by: Phil Sutter <phil@nwl.cc>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nf_tables_api.c
net/netfilter/nft_chain_filter.c

index 62bf498d1ec90f97887c14390ffaa273c499e490..95b43499f551987d32b11dc856c3d00c6c29a880 100644 (file)
@@ -9696,14 +9696,19 @@ static void nft_flowtable_event(unsigned long event, struct net_device *dev,
        struct nft_hook *hook;
 
        list_for_each_entry(hook, &flowtable->hook_list, list) {
-               ops = nft_hook_find_ops(hook, dev);
-               if (!ops)
-                       continue;
+               switch (event) {
+               case NETDEV_UNREGISTER:
+                       ops = nft_hook_find_ops(hook, dev);
+                       if (!ops)
+                               continue;
 
-               /* flow_offload_netdev_event() cleans up entries for us. */
-               nft_unregister_flowtable_ops(dev_net(dev), flowtable, ops);
-               list_del_rcu(&ops->list);
-               kfree_rcu(ops, rcu);
+                       /* flow_offload_netdev_event() cleans up entries for us. */
+                       nft_unregister_flowtable_ops(dev_net(dev),
+                                                    flowtable, ops);
+                       list_del_rcu(&ops->list);
+                       kfree_rcu(ops, rcu);
+                       break;
+               }
                break;
        }
 }
index 862eab45851affd670beee401eb59d9d55cc5ef4..2eee78b58123bb03b78235cd8f1cb2fd73ab5208 100644 (file)
@@ -321,19 +321,24 @@ static const struct nft_chain_type nft_chain_filter_netdev = {
 static void nft_netdev_event(unsigned long event, struct net_device *dev,
                             struct nft_base_chain *basechain)
 {
+       struct nft_table *table = basechain->chain.table;
        struct nf_hook_ops *ops;
        struct nft_hook *hook;
 
        list_for_each_entry(hook, &basechain->hook_list, list) {
-               ops = nft_hook_find_ops(hook, dev);
-               if (!ops)
-                       continue;
+               switch (event) {
+               case NETDEV_UNREGISTER:
+                       ops = nft_hook_find_ops(hook, dev);
+                       if (!ops)
+                               continue;
 
-               if (!(basechain->chain.table->flags & NFT_TABLE_F_DORMANT))
-                       nf_unregister_net_hook(dev_net(dev), ops);
+                       if (!(table->flags & NFT_TABLE_F_DORMANT))
+                               nf_unregister_net_hook(dev_net(dev), ops);
 
-               list_del_rcu(&ops->list);
-               kfree_rcu(ops, rcu);
+                       list_del_rcu(&ops->list);
+                       kfree_rcu(ops, rcu);
+                       break;
+               }
                break;
        }
 }