if (priv->ct_zone_wc)
                nfp_ct_merge_tc_entries(ct_entry, priv->ct_zone_wc, zt);
 
-       NL_SET_ERR_MSG_MOD(extack, "unsupported offload: Conntrack action not supported");
-       return -EOPNOTSUPP;
+       return 0;
 }
 
 int nfp_fl_ct_handle_post_ct(struct nfp_flower_priv *priv,
                nfp_ct_merge_tc_entries(ct_entry, zt, zt);
        }
 
-       NL_SET_ERR_MSG_MOD(extack, "unsupported offload: Conntrack match not supported");
-       return -EOPNOTSUPP;
+       return 0;
+}
+
+int nfp_fl_ct_del_flow(struct nfp_fl_ct_map_entry *ct_map_ent)
+{
+       struct nfp_fl_ct_flow_entry *ct_entry;
+       struct nfp_fl_ct_zone_entry *zt;
+       struct rhashtable *m_table;
+
+       zt = ct_map_ent->ct_entry->zt;
+       ct_entry = ct_map_ent->ct_entry;
+       m_table = &zt->priv->ct_map_table;
+
+       switch (ct_entry->type) {
+       case CT_TYPE_PRE_CT:
+               zt->pre_ct_count--;
+               rhashtable_remove_fast(m_table, &ct_map_ent->hash_node,
+                                      nfp_ct_map_params);
+               nfp_fl_ct_clean_flow_entry(ct_entry);
+               kfree(ct_map_ent);
+               break;
+       case CT_TYPE_POST_CT:
+               zt->post_ct_count--;
+               rhashtable_remove_fast(m_table, &ct_map_ent->hash_node,
+                                      nfp_ct_map_params);
+               nfp_fl_ct_clean_flow_entry(ct_entry);
+               kfree(ct_map_ent);
+               break;
+       default:
+               break;
+       }
+
+       return 0;
 }
 
  * @entry:     Flow entry to cleanup
  */
 void nfp_fl_ct_clean_flow_entry(struct nfp_fl_ct_flow_entry *entry);
+
+/**
+ * nfp_fl_ct_del_flow() - Handle flow_del callbacks for conntrack
+ * @ct_map_ent:        ct map entry for the flow that needs deleting
+ */
+int nfp_fl_ct_del_flow(struct nfp_fl_ct_map_entry *ct_map_ent);
 #endif
 
                       struct flow_cls_offload *flow)
 {
        struct nfp_flower_priv *priv = app->priv;
+       struct nfp_fl_ct_map_entry *ct_map_ent;
        struct netlink_ext_ack *extack = NULL;
        struct nfp_fl_payload *nfp_flow;
        struct nfp_port *port = NULL;
        if (nfp_netdev_is_nfp_repr(netdev))
                port = nfp_port_from_netdev(netdev);
 
+       /* Check ct_map_table */
+       ct_map_ent = rhashtable_lookup_fast(&priv->ct_map_table, &flow->cookie,
+                                           nfp_ct_map_params);
+       if (ct_map_ent) {
+               err = nfp_fl_ct_del_flow(ct_map_ent);
+               return err;
+       }
+
        nfp_flow = nfp_flower_search_fl_table(app, flow->cookie, netdev);
        if (!nfp_flow) {
                NL_SET_ERR_MSG_MOD(extack, "invalid entry: cannot remove flow that does not exist");