netfilter: x_tables: add and use xt_unregister_table_pre_exit
Remove the copypasted variants of _pre_exit and add one single function in the xtables core. ebtables is not compatible with x_tables and therefore unchanged. This is a preparation patch to reduce noise in the followup bug fixes. Reviewed-by: Tristan Madani <tristan@talencesecurity.com> Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>master
parent
b62eb8dcf2
commit
527d693147
|
|
@ -309,6 +309,7 @@ struct xt_table *xt_register_table(struct net *net,
|
|||
struct xt_table_info *bootstrap,
|
||||
struct xt_table_info *newinfo);
|
||||
void *xt_unregister_table(struct xt_table *table);
|
||||
void xt_unregister_table_pre_exit(struct net *net, u8 af, const char *name);
|
||||
|
||||
struct xt_table_info *xt_replace_table(struct xt_table *table,
|
||||
unsigned int num_counters,
|
||||
|
|
|
|||
|
|
@ -53,7 +53,6 @@ int arpt_register_table(struct net *net, const struct xt_table *table,
|
|||
const struct arpt_replace *repl,
|
||||
const struct nf_hook_ops *ops);
|
||||
void arpt_unregister_table(struct net *net, const char *name);
|
||||
void arpt_unregister_table_pre_exit(struct net *net, const char *name);
|
||||
extern unsigned int arpt_do_table(void *priv, struct sk_buff *skb,
|
||||
const struct nf_hook_state *state);
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@ int ipt_register_table(struct net *net, const struct xt_table *table,
|
|||
const struct ipt_replace *repl,
|
||||
const struct nf_hook_ops *ops);
|
||||
|
||||
void ipt_unregister_table_pre_exit(struct net *net, const char *name);
|
||||
void ipt_unregister_table_exit(struct net *net, const char *name);
|
||||
|
||||
/* Standard entry. */
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@ extern void *ip6t_alloc_initial_table(const struct xt_table *);
|
|||
int ip6t_register_table(struct net *net, const struct xt_table *table,
|
||||
const struct ip6t_replace *repl,
|
||||
const struct nf_hook_ops *ops);
|
||||
void ip6t_unregister_table_pre_exit(struct net *net, const char *name);
|
||||
void ip6t_unregister_table_exit(struct net *net, const char *name);
|
||||
extern unsigned int ip6t_do_table(void *priv, struct sk_buff *skb,
|
||||
const struct nf_hook_state *state);
|
||||
|
|
|
|||
|
|
@ -1554,15 +1554,6 @@ int arpt_register_table(struct net *net,
|
|||
return ret;
|
||||
}
|
||||
|
||||
void arpt_unregister_table_pre_exit(struct net *net, const char *name)
|
||||
{
|
||||
struct xt_table *table = xt_find_table(net, NFPROTO_ARP, name);
|
||||
|
||||
if (table)
|
||||
nf_unregister_net_hooks(net, table->ops, hweight32(table->valid_hooks));
|
||||
}
|
||||
EXPORT_SYMBOL(arpt_unregister_table_pre_exit);
|
||||
|
||||
void arpt_unregister_table(struct net *net, const char *name)
|
||||
{
|
||||
struct xt_table *table = xt_find_table(net, NFPROTO_ARP, name);
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ static int arptable_filter_table_init(struct net *net)
|
|||
|
||||
static void __net_exit arptable_filter_net_pre_exit(struct net *net)
|
||||
{
|
||||
arpt_unregister_table_pre_exit(net, "filter");
|
||||
xt_unregister_table_pre_exit(net, NFPROTO_ARP, "filter");
|
||||
}
|
||||
|
||||
static void __net_exit arptable_filter_net_exit(struct net *net)
|
||||
|
|
|
|||
|
|
@ -1756,14 +1756,6 @@ int ipt_register_table(struct net *net, const struct xt_table *table,
|
|||
return ret;
|
||||
}
|
||||
|
||||
void ipt_unregister_table_pre_exit(struct net *net, const char *name)
|
||||
{
|
||||
struct xt_table *table = xt_find_table(net, NFPROTO_IPV4, name);
|
||||
|
||||
if (table)
|
||||
nf_unregister_net_hooks(net, table->ops, hweight32(table->valid_hooks));
|
||||
}
|
||||
|
||||
void ipt_unregister_table_exit(struct net *net, const char *name)
|
||||
{
|
||||
struct xt_table *table = xt_find_table(net, NFPROTO_IPV4, name);
|
||||
|
|
@ -1854,7 +1846,6 @@ static void __exit ip_tables_fini(void)
|
|||
}
|
||||
|
||||
EXPORT_SYMBOL(ipt_register_table);
|
||||
EXPORT_SYMBOL(ipt_unregister_table_pre_exit);
|
||||
EXPORT_SYMBOL(ipt_unregister_table_exit);
|
||||
EXPORT_SYMBOL(ipt_do_table);
|
||||
module_init(ip_tables_init);
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ static int __net_init iptable_filter_net_init(struct net *net)
|
|||
|
||||
static void __net_exit iptable_filter_net_pre_exit(struct net *net)
|
||||
{
|
||||
ipt_unregister_table_pre_exit(net, "filter");
|
||||
xt_unregister_table_pre_exit(net, NFPROTO_IPV4, "filter");
|
||||
}
|
||||
|
||||
static void __net_exit iptable_filter_net_exit(struct net *net)
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ static int iptable_mangle_table_init(struct net *net)
|
|||
|
||||
static void __net_exit iptable_mangle_net_pre_exit(struct net *net)
|
||||
{
|
||||
ipt_unregister_table_pre_exit(net, "mangle");
|
||||
xt_unregister_table_pre_exit(net, NFPROTO_IPV4, "mangle");
|
||||
}
|
||||
|
||||
static void __net_exit iptable_mangle_net_exit(struct net *net)
|
||||
|
|
|
|||
|
|
@ -129,6 +129,7 @@ static int iptable_nat_table_init(struct net *net)
|
|||
static void __net_exit iptable_nat_net_pre_exit(struct net *net)
|
||||
{
|
||||
ipt_nat_unregister_lookups(net);
|
||||
xt_unregister_table_pre_exit(net, NFPROTO_IPV4, "nat");
|
||||
}
|
||||
|
||||
static void __net_exit iptable_nat_net_exit(struct net *net)
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ static int iptable_raw_table_init(struct net *net)
|
|||
|
||||
static void __net_exit iptable_raw_net_pre_exit(struct net *net)
|
||||
{
|
||||
ipt_unregister_table_pre_exit(net, "raw");
|
||||
xt_unregister_table_pre_exit(net, NFPROTO_IPV4, "raw");
|
||||
}
|
||||
|
||||
static void __net_exit iptable_raw_net_exit(struct net *net)
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ static int iptable_security_table_init(struct net *net)
|
|||
|
||||
static void __net_exit iptable_security_net_pre_exit(struct net *net)
|
||||
{
|
||||
ipt_unregister_table_pre_exit(net, "security");
|
||||
xt_unregister_table_pre_exit(net, NFPROTO_IPV4, "security");
|
||||
}
|
||||
|
||||
static void __net_exit iptable_security_net_exit(struct net *net)
|
||||
|
|
|
|||
|
|
@ -1765,14 +1765,6 @@ int ip6t_register_table(struct net *net, const struct xt_table *table,
|
|||
return ret;
|
||||
}
|
||||
|
||||
void ip6t_unregister_table_pre_exit(struct net *net, const char *name)
|
||||
{
|
||||
struct xt_table *table = xt_find_table(net, NFPROTO_IPV6, name);
|
||||
|
||||
if (table)
|
||||
nf_unregister_net_hooks(net, table->ops, hweight32(table->valid_hooks));
|
||||
}
|
||||
|
||||
void ip6t_unregister_table_exit(struct net *net, const char *name)
|
||||
{
|
||||
struct xt_table *table = xt_find_table(net, NFPROTO_IPV6, name);
|
||||
|
|
@ -1864,7 +1856,6 @@ static void __exit ip6_tables_fini(void)
|
|||
}
|
||||
|
||||
EXPORT_SYMBOL(ip6t_register_table);
|
||||
EXPORT_SYMBOL(ip6t_unregister_table_pre_exit);
|
||||
EXPORT_SYMBOL(ip6t_unregister_table_exit);
|
||||
EXPORT_SYMBOL(ip6t_do_table);
|
||||
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ static int __net_init ip6table_filter_net_init(struct net *net)
|
|||
|
||||
static void __net_exit ip6table_filter_net_pre_exit(struct net *net)
|
||||
{
|
||||
ip6t_unregister_table_pre_exit(net, "filter");
|
||||
xt_unregister_table_pre_exit(net, NFPROTO_IPV6, "filter");
|
||||
}
|
||||
|
||||
static void __net_exit ip6table_filter_net_exit(struct net *net)
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ static int ip6table_mangle_table_init(struct net *net)
|
|||
|
||||
static void __net_exit ip6table_mangle_net_pre_exit(struct net *net)
|
||||
{
|
||||
ip6t_unregister_table_pre_exit(net, "mangle");
|
||||
xt_unregister_table_pre_exit(net, NFPROTO_IPV6, "mangle");
|
||||
}
|
||||
|
||||
static void __net_exit ip6table_mangle_net_exit(struct net *net)
|
||||
|
|
|
|||
|
|
@ -131,6 +131,7 @@ static int ip6table_nat_table_init(struct net *net)
|
|||
static void __net_exit ip6table_nat_net_pre_exit(struct net *net)
|
||||
{
|
||||
ip6t_nat_unregister_lookups(net);
|
||||
xt_unregister_table_pre_exit(net, NFPROTO_IPV6, "nat");
|
||||
}
|
||||
|
||||
static void __net_exit ip6table_nat_net_exit(struct net *net)
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ static int ip6table_raw_table_init(struct net *net)
|
|||
|
||||
static void __net_exit ip6table_raw_net_pre_exit(struct net *net)
|
||||
{
|
||||
ip6t_unregister_table_pre_exit(net, "raw");
|
||||
xt_unregister_table_pre_exit(net, NFPROTO_IPV6, "raw");
|
||||
}
|
||||
|
||||
static void __net_exit ip6table_raw_net_exit(struct net *net)
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ static int ip6table_security_table_init(struct net *net)
|
|||
|
||||
static void __net_exit ip6table_security_net_pre_exit(struct net *net)
|
||||
{
|
||||
ip6t_unregister_table_pre_exit(net, "security");
|
||||
xt_unregister_table_pre_exit(net, NFPROTO_IPV6, "security");
|
||||
}
|
||||
|
||||
static void __net_exit ip6table_security_net_exit(struct net *net)
|
||||
|
|
|
|||
|
|
@ -1650,6 +1650,35 @@ void *xt_unregister_table(struct xt_table *table)
|
|||
return private;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xt_unregister_table);
|
||||
|
||||
/**
|
||||
* xt_unregister_table_pre_exit - pre-shutdown unregister of a table
|
||||
* @net: network namespace
|
||||
* @af: address family (e.g., NFPROTO_IPV4, NFPROTO_IPV6)
|
||||
* @name: name of the table to unregister
|
||||
*
|
||||
* Unregisters the specified netfilter table from the given network namespace
|
||||
* and also unregisters the hooks from netfilter core: no new packets will be
|
||||
* processed.
|
||||
*/
|
||||
void xt_unregister_table_pre_exit(struct net *net, u8 af, const char *name)
|
||||
{
|
||||
struct xt_pernet *xt_net = net_generic(net, xt_pernet_id);
|
||||
struct xt_table *t;
|
||||
|
||||
mutex_lock(&xt[af].mutex);
|
||||
list_for_each_entry(t, &xt_net->tables[af], list) {
|
||||
if (strcmp(t->name, name) == 0) {
|
||||
mutex_unlock(&xt[af].mutex);
|
||||
|
||||
if (t->ops) /* nat table registers with nat core, t->ops is NULL. */
|
||||
nf_unregister_net_hooks(net, t->ops, hweight32(t->valid_hooks));
|
||||
return;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&xt[af].mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(xt_unregister_table_pre_exit);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
|
|
|||
Loading…
Reference in New Issue