diff --git a/net/netfilter/xt_FLOWOFFLOAD.c b/net/netfilter/xt_FLOWOFFLOAD.c index 10e6c5acb89c3944b42690c244f04b2de90c1929..e00f9f34b12ca6547182d119b6ddfeec03ca557a 100644 --- a/net/netfilter/xt_FLOWOFFLOAD.c +++ b/net/netfilter/xt_FLOWOFFLOAD.c @@ -14,6 +14,7 @@ #include <net/netfilter/nf_conntrack_extend.h> #include <net/netfilter/nf_conntrack_helper.h> #include <net/netfilter/nf_flow_table.h> +#include <linux/proc_fs.h> static struct nf_flowtable nf_flowtable; static HLIST_HEAD(hooks); @@ -392,10 +393,40 @@ static struct notifier_block flow_offload_netdev_notifier = { .notifier_call = flow_offload_netdev_event, }; +static struct proc_dir_entry *procfs_subdir_entry; + +static ssize_t procfs_callback(struct file *f, const char __user *u, + size_t count, loff_t *p) +{ + nf_flow_table_cleanup(NULL, NULL); + return count; +} + +#define PROC_SUBDIR "nf-flow-table-control" +#define PROC_ACTION "clear" + +static void register_flow_table_ctrl(void) +{ + static struct file_operations ops = { + .owner = THIS_MODULE, + .write = procfs_callback + }; + + procfs_subdir_entry = proc_mkdir(PROC_SUBDIR, NULL); + proc_create(PROC_ACTION, 0220, procfs_subdir_entry, &ops); +} + +static void unregister_flow_table_ctrl(void) +{ + remove_proc_entry(PROC_ACTION, procfs_subdir_entry); + remove_proc_entry(PROC_SUBDIR, NULL); +} + static int __init xt_flowoffload_tg_init(void) { int ret; + register_flow_table_ctrl(); register_netdevice_notifier(&flow_offload_netdev_notifier); INIT_DELAYED_WORK(&hook_work, xt_flowoffload_hook_work); @@ -415,6 +446,7 @@ static void __exit xt_flowoffload_tg_exit(void) { xt_unregister_target(&offload_tg_reg); xt_flowoffload_table_cleanup(&nf_flowtable); + unregister_flow_table_ctrl(); unregister_netdevice_notifier(&flow_offload_netdev_notifier); }