diff options
Diffstat (limited to 'net/ipv4/netfilter/arptable_filter.c')
-rw-r--r-- | net/ipv4/netfilter/arptable_filter.c | 95 |
1 files changed, 21 insertions, 74 deletions
diff --git a/net/ipv4/netfilter/arptable_filter.c b/net/ipv4/netfilter/arptable_filter.c index 97337601827..bfe26f32b93 100644 --- a/net/ipv4/netfilter/arptable_filter.c +++ b/net/ipv4/netfilter/arptable_filter.c | |||
@@ -6,6 +6,7 @@ | |||
6 | */ | 6 | */ |
7 | 7 | ||
8 | #include <linux/module.h> | 8 | #include <linux/module.h> |
9 | #include <linux/netfilter/x_tables.h> | ||
9 | #include <linux/netfilter_arp/arp_tables.h> | 10 | #include <linux/netfilter_arp/arp_tables.h> |
10 | 11 | ||
11 | MODULE_LICENSE("GPL"); | 12 | MODULE_LICENSE("GPL"); |
@@ -15,93 +16,37 @@ MODULE_DESCRIPTION("arptables filter table"); | |||
15 | #define FILTER_VALID_HOOKS ((1 << NF_ARP_IN) | (1 << NF_ARP_OUT) | \ | 16 | #define FILTER_VALID_HOOKS ((1 << NF_ARP_IN) | (1 << NF_ARP_OUT) | \ |
16 | (1 << NF_ARP_FORWARD)) | 17 | (1 << NF_ARP_FORWARD)) |
17 | 18 | ||
18 | static const struct | ||
19 | { | ||
20 | struct arpt_replace repl; | ||
21 | struct arpt_standard entries[3]; | ||
22 | struct arpt_error term; | ||
23 | } initial_table __net_initdata = { | ||
24 | .repl = { | ||
25 | .name = "filter", | ||
26 | .valid_hooks = FILTER_VALID_HOOKS, | ||
27 | .num_entries = 4, | ||
28 | .size = sizeof(struct arpt_standard) * 3 + sizeof(struct arpt_error), | ||
29 | .hook_entry = { | ||
30 | [NF_ARP_IN] = 0, | ||
31 | [NF_ARP_OUT] = sizeof(struct arpt_standard), | ||
32 | [NF_ARP_FORWARD] = 2 * sizeof(struct arpt_standard), | ||
33 | }, | ||
34 | .underflow = { | ||
35 | [NF_ARP_IN] = 0, | ||
36 | [NF_ARP_OUT] = sizeof(struct arpt_standard), | ||
37 | [NF_ARP_FORWARD] = 2 * sizeof(struct arpt_standard), | ||
38 | }, | ||
39 | }, | ||
40 | .entries = { | ||
41 | ARPT_STANDARD_INIT(NF_ACCEPT), /* ARP_IN */ | ||
42 | ARPT_STANDARD_INIT(NF_ACCEPT), /* ARP_OUT */ | ||
43 | ARPT_STANDARD_INIT(NF_ACCEPT), /* ARP_FORWARD */ | ||
44 | }, | ||
45 | .term = ARPT_ERROR_INIT, | ||
46 | }; | ||
47 | |||
48 | static const struct xt_table packet_filter = { | 19 | static const struct xt_table packet_filter = { |
49 | .name = "filter", | 20 | .name = "filter", |
50 | .valid_hooks = FILTER_VALID_HOOKS, | 21 | .valid_hooks = FILTER_VALID_HOOKS, |
51 | .me = THIS_MODULE, | 22 | .me = THIS_MODULE, |
52 | .af = NFPROTO_ARP, | 23 | .af = NFPROTO_ARP, |
24 | .priority = NF_IP_PRI_FILTER, | ||
53 | }; | 25 | }; |
54 | 26 | ||
55 | /* The work comes in here from netfilter.c */ | 27 | /* The work comes in here from netfilter.c */ |
56 | static unsigned int arpt_in_hook(unsigned int hook, | 28 | static unsigned int |
57 | struct sk_buff *skb, | 29 | arptable_filter_hook(unsigned int hook, struct sk_buff *skb, |
58 | const struct net_device *in, | 30 | const struct net_device *in, const struct net_device *out, |
59 | const struct net_device *out, | 31 | int (*okfn)(struct sk_buff *)) |
60 | int (*okfn)(struct sk_buff *)) | ||
61 | { | 32 | { |
62 | return arpt_do_table(skb, hook, in, out, | 33 | const struct net *net = dev_net((in != NULL) ? in : out); |
63 | dev_net(in)->ipv4.arptable_filter); | ||
64 | } | ||
65 | 34 | ||
66 | static unsigned int arpt_out_hook(unsigned int hook, | 35 | return arpt_do_table(skb, hook, in, out, net->ipv4.arptable_filter); |
67 | struct sk_buff *skb, | ||
68 | const struct net_device *in, | ||
69 | const struct net_device *out, | ||
70 | int (*okfn)(struct sk_buff *)) | ||
71 | { | ||
72 | return arpt_do_table(skb, hook, in, out, | ||
73 | dev_net(out)->ipv4.arptable_filter); | ||
74 | } | 36 | } |
75 | 37 | ||
76 | static struct nf_hook_ops arpt_ops[] __read_mostly = { | 38 | static struct nf_hook_ops *arpfilter_ops __read_mostly; |
77 | { | ||
78 | .hook = arpt_in_hook, | ||
79 | .owner = THIS_MODULE, | ||
80 | .pf = NFPROTO_ARP, | ||
81 | .hooknum = NF_ARP_IN, | ||
82 | .priority = NF_IP_PRI_FILTER, | ||
83 | }, | ||
84 | { | ||
85 | .hook = arpt_out_hook, | ||
86 | .owner = THIS_MODULE, | ||
87 | .pf = NFPROTO_ARP, | ||
88 | .hooknum = NF_ARP_OUT, | ||
89 | .priority = NF_IP_PRI_FILTER, | ||
90 | }, | ||
91 | { | ||
92 | .hook = arpt_in_hook, | ||
93 | .owner = THIS_MODULE, | ||
94 | .pf = NFPROTO_ARP, | ||
95 | .hooknum = NF_ARP_FORWARD, | ||
96 | .priority = NF_IP_PRI_FILTER, | ||
97 | }, | ||
98 | }; | ||
99 | 39 | ||
100 | static int __net_init arptable_filter_net_init(struct net *net) | 40 | static int __net_init arptable_filter_net_init(struct net *net) |
101 | { | 41 | { |
102 | /* Register table */ | 42 | struct arpt_replace *repl; |
43 | |||
44 | repl = arpt_alloc_initial_table(&packet_filter); | ||
45 | if (repl == NULL) | ||
46 | return -ENOMEM; | ||
103 | net->ipv4.arptable_filter = | 47 | net->ipv4.arptable_filter = |
104 | arpt_register_table(net, &packet_filter, &initial_table.repl); | 48 | arpt_register_table(net, &packet_filter, repl); |
49 | kfree(repl); | ||
105 | if (IS_ERR(net->ipv4.arptable_filter)) | 50 | if (IS_ERR(net->ipv4.arptable_filter)) |
106 | return PTR_ERR(net->ipv4.arptable_filter); | 51 | return PTR_ERR(net->ipv4.arptable_filter); |
107 | return 0; | 52 | return 0; |
@@ -125,9 +70,11 @@ static int __init arptable_filter_init(void) | |||
125 | if (ret < 0) | 70 | if (ret < 0) |
126 | return ret; | 71 | return ret; |
127 | 72 | ||
128 | ret = nf_register_hooks(arpt_ops, ARRAY_SIZE(arpt_ops)); | 73 | arpfilter_ops = xt_hook_link(&packet_filter, arptable_filter_hook); |
129 | if (ret < 0) | 74 | if (IS_ERR(arpfilter_ops)) { |
75 | ret = PTR_ERR(arpfilter_ops); | ||
130 | goto cleanup_table; | 76 | goto cleanup_table; |
77 | } | ||
131 | return ret; | 78 | return ret; |
132 | 79 | ||
133 | cleanup_table: | 80 | cleanup_table: |
@@ -137,7 +84,7 @@ cleanup_table: | |||
137 | 84 | ||
138 | static void __exit arptable_filter_fini(void) | 85 | static void __exit arptable_filter_fini(void) |
139 | { | 86 | { |
140 | nf_unregister_hooks(arpt_ops, ARRAY_SIZE(arpt_ops)); | 87 | xt_hook_unlink(&packet_filter, arpfilter_ops); |
141 | unregister_pernet_subsys(&arptable_filter_net_ops); | 88 | unregister_pernet_subsys(&arptable_filter_net_ops); |
142 | } | 89 | } |
143 | 90 | ||