enum flow_block_command command;
        enum flow_block_binder_type binder_type;
        struct tcf_block *block;
+       struct net *net;
+       struct list_head cb_list;
        struct list_head *driver_block_list;
        struct netlink_ext_ack *extack;
 };
 
 struct flow_block_cb {
+       struct list_head        driver_list;
        struct list_head        list;
+       struct net              *net;
        tc_setup_cb_t           *cb;
        void                    *cb_ident;
        void                    *cb_priv;
                                          void (*release)(void *cb_priv));
 void flow_block_cb_free(struct flow_block_cb *block_cb);
 
+struct flow_block_cb *flow_block_cb_lookup(struct flow_block_offload *offload,
+                                          tc_setup_cb_t *cb, void *cb_ident);
+
+static inline void flow_block_cb_add(struct flow_block_cb *block_cb,
+                                    struct flow_block_offload *offload)
+{
+       list_add_tail(&block_cb->list, &offload->cb_list);
+}
+
+static inline void flow_block_cb_remove(struct flow_block_cb *block_cb,
+                                       struct flow_block_offload *offload)
+{
+       list_move(&block_cb->list, &offload->cb_list);
+}
+
 int flow_block_cb_setup_simple(struct flow_block_offload *f,
                               struct list_head *driver_list, tc_setup_cb_t *cb,
                               void *cb_ident, void *cb_priv, bool ingress_only);
 
        if (!block_cb)
                return ERR_PTR(-ENOMEM);
 
+       block_cb->net = net;
        block_cb->cb = cb;
        block_cb->cb_ident = cb_ident;
        block_cb->cb_priv = cb_priv;
 }
 EXPORT_SYMBOL(flow_block_cb_free);
 
+struct flow_block_cb *flow_block_cb_lookup(struct flow_block_offload *f,
+                                          tc_setup_cb_t *cb, void *cb_ident)
+{
+       struct flow_block_cb *block_cb;
+
+       list_for_each_entry(block_cb, f->driver_block_list, driver_list) {
+               if (block_cb->net == f->net &&
+                   block_cb->cb == cb &&
+                   block_cb->cb_ident == cb_ident)
+                       return block_cb;
+       }
+
+       return NULL;
+}
+EXPORT_SYMBOL(flow_block_cb_lookup);
+
 int flow_block_cb_setup_simple(struct flow_block_offload *f,
                               struct list_head *driver_block_list,
                               tc_setup_cb_t *cb, void *cb_ident, void *cb_priv,
 
        struct tc_block_offload bo = {
                .command        = command,
                .binder_type    = FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS,
+               .net            = dev_net(indr_dev->dev),
                .block          = indr_dev->block,
        };
 
        struct tc_block_offload bo = {
                .command        = command,
                .binder_type    = ei->binder_type,
+               .net            = dev_net(dev),
                .block          = block,
                .extack         = extack,
        };
 {
        struct tc_block_offload bo = {};
 
+       bo.net = dev_net(dev);
        bo.command = command;
        bo.binder_type = ei->binder_type;
        bo.block = block;