netfilter: flowtable: Fix flushing of offloaded flows on free
authorPaul Blakey <paulb@mellanox.com>
Thu, 19 Mar 2020 09:52:25 +0000 (11:52 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Thu, 19 Mar 2020 20:05:30 +0000 (21:05 +0100)
Freeing a flowtable with offloaded flows, the flow are deleted from
hardware but are not deleted from the flow table, leaking them,
and leaving their offload bit on.

Add a second pass of the disabled gc to delete the these flows from
the flow table before freeing it.

Fixes: c29f74e0df7a ("netfilter: nf_flow_table: hardware offload support")
Signed-off-by: Paul Blakey <paulb@mellanox.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/nf_flow_table_core.c

index 8af28e10b4e6268bb95e0eca87941b8bc498ae2b..70ebebaf5bc12a4f589a08b41264d6137377ad62 100644 (file)
@@ -554,6 +554,9 @@ void nf_flow_table_free(struct nf_flowtable *flow_table)
        nf_flow_table_iterate(flow_table, nf_flow_table_do_cleanup, NULL);
        nf_flow_table_iterate(flow_table, nf_flow_offload_gc_step, flow_table);
        nf_flow_table_offload_flush(flow_table);
+       if (nf_flowtable_hw_offload(flow_table))
+               nf_flow_table_iterate(flow_table, nf_flow_offload_gc_step,
+                                     flow_table);
        rhashtable_destroy(&flow_table->rhashtable);
 }
 EXPORT_SYMBOL_GPL(nf_flow_table_free);