forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
netfilter: nf_tables: add "inet" table for IPv4/IPv6
This patch adds a new table family and a new filter chain that you can use to attach IPv4 and IPv6 rules. This should help to simplify rule-set maintainance in dual-stack setups. Signed-off-by: Patrick McHardy <[email protected]> Signed-off-by: Pablo Neira Ayuso <[email protected]>
- Loading branch information
Showing
9 changed files
with
116 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -27,4 +27,6 @@ nft_set_pktinfo_ipv6(struct nft_pktinfo *pkt, | |
return 0; | ||
} | ||
|
||
extern struct nft_af_info nft_af_ipv6; | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
/* | ||
* Copyright (c) 2012-2014 Patrick McHardy <[email protected]> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
|
||
#include <linux/init.h> | ||
#include <linux/module.h> | ||
#include <linux/ip.h> | ||
#include <linux/netfilter_ipv4.h> | ||
#include <linux/netfilter_ipv6.h> | ||
#include <net/netfilter/nf_tables.h> | ||
#include <net/netfilter/nf_tables_ipv4.h> | ||
#include <net/netfilter/nf_tables_ipv6.h> | ||
#include <net/ip.h> | ||
|
||
static void nft_inet_hook_ops_init(struct nf_hook_ops *ops, unsigned int n) | ||
{ | ||
struct nft_af_info *afi; | ||
|
||
if (n == 1) | ||
afi = &nft_af_ipv4; | ||
else | ||
afi = &nft_af_ipv6; | ||
|
||
ops->pf = afi->family; | ||
if (afi->hooks[ops->hooknum]) | ||
ops->hook = afi->hooks[ops->hooknum]; | ||
} | ||
|
||
static struct nft_af_info nft_af_inet __read_mostly = { | ||
.family = NFPROTO_INET, | ||
.nhooks = NF_INET_NUMHOOKS, | ||
.owner = THIS_MODULE, | ||
.nops = 2, | ||
.hook_ops_init = nft_inet_hook_ops_init, | ||
}; | ||
|
||
static int __net_init nf_tables_inet_init_net(struct net *net) | ||
{ | ||
net->nft.inet = kmalloc(sizeof(struct nft_af_info), GFP_KERNEL); | ||
if (net->nft.inet == NULL) | ||
return -ENOMEM; | ||
memcpy(net->nft.inet, &nft_af_inet, sizeof(nft_af_inet)); | ||
|
||
if (nft_register_afinfo(net, net->nft.inet) < 0) | ||
goto err; | ||
|
||
return 0; | ||
|
||
err: | ||
kfree(net->nft.inet); | ||
return -ENOMEM; | ||
} | ||
|
||
static void __net_exit nf_tables_inet_exit_net(struct net *net) | ||
{ | ||
nft_unregister_afinfo(net->nft.inet); | ||
kfree(net->nft.inet); | ||
} | ||
|
||
static struct pernet_operations nf_tables_inet_net_ops = { | ||
.init = nf_tables_inet_init_net, | ||
.exit = nf_tables_inet_exit_net, | ||
}; | ||
|
||
static struct nf_chain_type filter_inet = { | ||
.family = NFPROTO_INET, | ||
.name = "filter", | ||
.type = NFT_CHAIN_T_DEFAULT, | ||
.hook_mask = (1 << NF_INET_LOCAL_IN) | | ||
(1 << NF_INET_LOCAL_OUT) | | ||
(1 << NF_INET_FORWARD) | | ||
(1 << NF_INET_PRE_ROUTING) | | ||
(1 << NF_INET_POST_ROUTING), | ||
}; | ||
|
||
static int __init nf_tables_inet_init(void) | ||
{ | ||
nft_register_chain_type(&filter_inet); | ||
return register_pernet_subsys(&nf_tables_inet_net_ops); | ||
} | ||
|
||
static void __exit nf_tables_inet_exit(void) | ||
{ | ||
unregister_pernet_subsys(&nf_tables_inet_net_ops); | ||
nft_unregister_chain_type(&filter_inet); | ||
} | ||
|
||
module_init(nf_tables_inet_init); | ||
module_exit(nf_tables_inet_exit); | ||
|
||
MODULE_LICENSE("GPL"); | ||
MODULE_AUTHOR("Patrick McHardy <[email protected]>"); | ||
MODULE_ALIAS_NFT_FAMILY(1); |