Commit 84453a90 authored by Felix Fietkau's avatar Felix Fietkau Committed by Pablo Neira Ayuso

netfilter: nf_flow_table: track flow tables in nf_flow_table directly

Avoids having nf_flow_table depend on nftables (useful for future
iptables backport work)
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 17857d92
...@@ -21,6 +21,7 @@ struct nf_flowtable_type { ...@@ -21,6 +21,7 @@ struct nf_flowtable_type {
}; };
struct nf_flowtable { struct nf_flowtable {
struct list_head list;
struct rhashtable rhashtable; struct rhashtable rhashtable;
const struct nf_flowtable_type *type; const struct nf_flowtable_type *type;
struct delayed_work gc_work; struct delayed_work gc_work;
......
...@@ -1109,9 +1109,6 @@ struct nft_flowtable { ...@@ -1109,9 +1109,6 @@ struct nft_flowtable {
struct nft_flowtable *nf_tables_flowtable_lookup(const struct nft_table *table, struct nft_flowtable *nf_tables_flowtable_lookup(const struct nft_table *table,
const struct nlattr *nla, const struct nlattr *nla,
u8 genmask); u8 genmask);
void nft_flow_table_iterate(struct net *net,
void (*iter)(struct nf_flowtable *flowtable, void *data),
void *data);
void nft_register_flowtable_type(struct nf_flowtable_type *type); void nft_register_flowtable_type(struct nf_flowtable_type *type);
void nft_unregister_flowtable_type(struct nf_flowtable_type *type); void nft_unregister_flowtable_type(struct nf_flowtable_type *type);
......
...@@ -18,6 +18,9 @@ struct flow_offload_entry { ...@@ -18,6 +18,9 @@ struct flow_offload_entry {
struct rcu_head rcu_head; struct rcu_head rcu_head;
}; };
static DEFINE_MUTEX(flowtable_lock);
static LIST_HEAD(flowtables);
static void static void
flow_offload_fill_dir(struct flow_offload *flow, struct nf_conn *ct, flow_offload_fill_dir(struct flow_offload *flow, struct nf_conn *ct,
struct nf_flow_route *route, struct nf_flow_route *route,
...@@ -410,6 +413,10 @@ int nf_flow_table_init(struct nf_flowtable *flowtable) ...@@ -410,6 +413,10 @@ int nf_flow_table_init(struct nf_flowtable *flowtable)
queue_delayed_work(system_power_efficient_wq, queue_delayed_work(system_power_efficient_wq,
&flowtable->gc_work, HZ); &flowtable->gc_work, HZ);
mutex_lock(&flowtable_lock);
list_add(&flowtable->list, &flowtables);
mutex_unlock(&flowtable_lock);
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(nf_flow_table_init); EXPORT_SYMBOL_GPL(nf_flow_table_init);
...@@ -425,20 +432,28 @@ static void nf_flow_table_do_cleanup(struct flow_offload *flow, void *data) ...@@ -425,20 +432,28 @@ static void nf_flow_table_do_cleanup(struct flow_offload *flow, void *data)
} }
static void nf_flow_table_iterate_cleanup(struct nf_flowtable *flowtable, static void nf_flow_table_iterate_cleanup(struct nf_flowtable *flowtable,
void *data) struct net_device *dev)
{ {
nf_flow_table_iterate(flowtable, nf_flow_table_do_cleanup, data); nf_flow_table_iterate(flowtable, nf_flow_table_do_cleanup, dev);
flush_delayed_work(&flowtable->gc_work); flush_delayed_work(&flowtable->gc_work);
} }
void nf_flow_table_cleanup(struct net *net, struct net_device *dev) void nf_flow_table_cleanup(struct net *net, struct net_device *dev)
{ {
nft_flow_table_iterate(net, nf_flow_table_iterate_cleanup, dev); struct nf_flowtable *flowtable;
mutex_lock(&flowtable_lock);
list_for_each_entry(flowtable, &flowtables, list)
nf_flow_table_iterate_cleanup(flowtable, dev);
mutex_unlock(&flowtable_lock);
} }
EXPORT_SYMBOL_GPL(nf_flow_table_cleanup); EXPORT_SYMBOL_GPL(nf_flow_table_cleanup);
void nf_flow_table_free(struct nf_flowtable *flow_table) void nf_flow_table_free(struct nf_flowtable *flow_table)
{ {
mutex_lock(&flowtable_lock);
list_del(&flow_table->list);
mutex_unlock(&flowtable_lock);
cancel_delayed_work_sync(&flow_table->gc_work); cancel_delayed_work_sync(&flow_table->gc_work);
nf_flow_table_iterate(flow_table, nf_flow_table_do_cleanup, NULL); nf_flow_table_iterate(flow_table, nf_flow_table_do_cleanup, NULL);
WARN_ON(!nf_flow_offload_gc_step(flow_table)); WARN_ON(!nf_flow_offload_gc_step(flow_table));
......
...@@ -5060,23 +5060,6 @@ static const struct nf_flowtable_type *nft_flowtable_type_get(u8 family) ...@@ -5060,23 +5060,6 @@ static const struct nf_flowtable_type *nft_flowtable_type_get(u8 family)
return ERR_PTR(-ENOENT); return ERR_PTR(-ENOENT);
} }
void nft_flow_table_iterate(struct net *net,
void (*iter)(struct nf_flowtable *flowtable, void *data),
void *data)
{
struct nft_flowtable *flowtable;
const struct nft_table *table;
nfnl_lock(NFNL_SUBSYS_NFTABLES);
list_for_each_entry(table, &net->nft.tables, list) {
list_for_each_entry(flowtable, &table->flowtables, list) {
iter(&flowtable->data, data);
}
}
nfnl_unlock(NFNL_SUBSYS_NFTABLES);
}
EXPORT_SYMBOL_GPL(nft_flow_table_iterate);
static void nft_unregister_flowtable_net_hooks(struct net *net, static void nft_unregister_flowtable_net_hooks(struct net *net,
struct nft_flowtable *flowtable) struct nft_flowtable *flowtable)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment