diff options
59 files changed, 286 insertions, 487 deletions
diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h index 85aa42785a5e..bcd40ec83257 100644 --- a/include/linux/netfilter/x_tables.h +++ b/include/linux/netfilter/x_tables.h | |||
@@ -173,6 +173,26 @@ struct xt_counters_info | |||
173 | 173 | ||
174 | #include <linux/netdevice.h> | 174 | #include <linux/netdevice.h> |
175 | 175 | ||
176 | /** | ||
177 | * struct xt_match_param - parameters for match extensions' match functions | ||
178 | * | ||
179 | * @in: input netdevice | ||
180 | * @out: output netdevice | ||
181 | * @match: struct xt_match through which this function was invoked | ||
182 | * @matchinfo: per-match data | ||
183 | * @fragoff: packet is a fragment, this is the data offset | ||
184 | * @thoff: position of transport header relative to skb->data | ||
185 | * @hotdrop: drop packet if we had inspection problems | ||
186 | */ | ||
187 | struct xt_match_param { | ||
188 | const struct net_device *in, *out; | ||
189 | const struct xt_match *match; | ||
190 | const void *matchinfo; | ||
191 | int fragoff; | ||
192 | unsigned int thoff; | ||
193 | bool *hotdrop; | ||
194 | }; | ||
195 | |||
176 | struct xt_match | 196 | struct xt_match |
177 | { | 197 | { |
178 | struct list_head list; | 198 | struct list_head list; |
@@ -185,13 +205,7 @@ struct xt_match | |||
185 | non-linear skb, using skb_header_pointer and | 205 | non-linear skb, using skb_header_pointer and |
186 | skb_ip_make_writable. */ | 206 | skb_ip_make_writable. */ |
187 | bool (*match)(const struct sk_buff *skb, | 207 | bool (*match)(const struct sk_buff *skb, |
188 | const struct net_device *in, | 208 | const struct xt_match_param *); |
189 | const struct net_device *out, | ||
190 | const struct xt_match *match, | ||
191 | const void *matchinfo, | ||
192 | int offset, | ||
193 | unsigned int protoff, | ||
194 | bool *hotdrop); | ||
195 | 209 | ||
196 | /* Called when user tries to insert an entry of this type. */ | 210 | /* Called when user tries to insert an entry of this type. */ |
197 | /* Should return true or false. */ | 211 | /* Should return true or false. */ |
diff --git a/net/bridge/netfilter/ebt_802_3.c b/net/bridge/netfilter/ebt_802_3.c index 6fc2a59e09a1..c9e1bc149513 100644 --- a/net/bridge/netfilter/ebt_802_3.c +++ b/net/bridge/netfilter/ebt_802_3.c | |||
@@ -13,11 +13,9 @@ | |||
13 | #include <linux/netfilter_bridge/ebt_802_3.h> | 13 | #include <linux/netfilter_bridge/ebt_802_3.h> |
14 | 14 | ||
15 | static bool | 15 | static bool |
16 | ebt_802_3_mt(const struct sk_buff *skb, const struct net_device *in, | 16 | ebt_802_3_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
17 | const struct net_device *out, const struct xt_match *match, | ||
18 | const void *data, int offset, unsigned int protoff, bool *hotdrop) | ||
19 | { | 17 | { |
20 | const struct ebt_802_3_info *info = data; | 18 | const struct ebt_802_3_info *info = par->matchinfo; |
21 | const struct ebt_802_3_hdr *hdr = ebt_802_3_hdr(skb); | 19 | const struct ebt_802_3_hdr *hdr = ebt_802_3_hdr(skb); |
22 | __be16 type = hdr->llc.ui.ctrl & IS_UI ? hdr->llc.ui.type : hdr->llc.ni.type; | 20 | __be16 type = hdr->llc.ui.ctrl & IS_UI ? hdr->llc.ui.type : hdr->llc.ni.type; |
23 | 21 | ||
diff --git a/net/bridge/netfilter/ebt_among.c b/net/bridge/netfilter/ebt_among.c index 084559e1840f..0ad0db3e815d 100644 --- a/net/bridge/netfilter/ebt_among.c +++ b/net/bridge/netfilter/ebt_among.c | |||
@@ -128,11 +128,9 @@ static int get_ip_src(const struct sk_buff *skb, __be32 *addr) | |||
128 | } | 128 | } |
129 | 129 | ||
130 | static bool | 130 | static bool |
131 | ebt_among_mt(const struct sk_buff *skb, const struct net_device *in, | 131 | ebt_among_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
132 | const struct net_device *out, const struct xt_match *match, | ||
133 | const void *data, int offset, unsigned int protoff, bool *hotdrop) | ||
134 | { | 132 | { |
135 | const struct ebt_among_info *info = data; | 133 | const struct ebt_among_info *info = par->matchinfo; |
136 | const char *dmac, *smac; | 134 | const char *dmac, *smac; |
137 | const struct ebt_mac_wormhash *wh_dst, *wh_src; | 135 | const struct ebt_mac_wormhash *wh_dst, *wh_src; |
138 | __be32 dip = 0, sip = 0; | 136 | __be32 dip = 0, sip = 0; |
diff --git a/net/bridge/netfilter/ebt_arp.c b/net/bridge/netfilter/ebt_arp.c index a073dffe7a11..1ff8fa3a9e7b 100644 --- a/net/bridge/netfilter/ebt_arp.c +++ b/net/bridge/netfilter/ebt_arp.c | |||
@@ -16,11 +16,9 @@ | |||
16 | #include <linux/netfilter_bridge/ebt_arp.h> | 16 | #include <linux/netfilter_bridge/ebt_arp.h> |
17 | 17 | ||
18 | static bool | 18 | static bool |
19 | ebt_arp_mt(const struct sk_buff *skb, const struct net_device *in, | 19 | ebt_arp_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
20 | const struct net_device *out, const struct xt_match *match, | ||
21 | const void *data, int offset, unsigned int protoff, bool *hotdrop) | ||
22 | { | 20 | { |
23 | const struct ebt_arp_info *info = data; | 21 | const struct ebt_arp_info *info = par->matchinfo; |
24 | const struct arphdr *ah; | 22 | const struct arphdr *ah; |
25 | struct arphdr _arph; | 23 | struct arphdr _arph; |
26 | 24 | ||
diff --git a/net/bridge/netfilter/ebt_ip.c b/net/bridge/netfilter/ebt_ip.c index b42c7ce799b3..c70ea39840b7 100644 --- a/net/bridge/netfilter/ebt_ip.c +++ b/net/bridge/netfilter/ebt_ip.c | |||
@@ -25,11 +25,9 @@ struct tcpudphdr { | |||
25 | }; | 25 | }; |
26 | 26 | ||
27 | static bool | 27 | static bool |
28 | ebt_ip_mt(const struct sk_buff *skb, const struct net_device *in, | 28 | ebt_ip_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
29 | const struct net_device *out, const struct xt_match *match, | ||
30 | const void *data, int offset, unsigned int protoff, bool *hotdrop) | ||
31 | { | 29 | { |
32 | const struct ebt_ip_info *info = data; | 30 | const struct ebt_ip_info *info = par->matchinfo; |
33 | const struct iphdr *ih; | 31 | const struct iphdr *ih; |
34 | struct iphdr _iph; | 32 | struct iphdr _iph; |
35 | const struct tcpudphdr *pptr; | 33 | const struct tcpudphdr *pptr; |
diff --git a/net/bridge/netfilter/ebt_ip6.c b/net/bridge/netfilter/ebt_ip6.c index 7bd983129674..5acee02de723 100644 --- a/net/bridge/netfilter/ebt_ip6.c +++ b/net/bridge/netfilter/ebt_ip6.c | |||
@@ -28,11 +28,9 @@ struct tcpudphdr { | |||
28 | }; | 28 | }; |
29 | 29 | ||
30 | static bool | 30 | static bool |
31 | ebt_ip6_mt(const struct sk_buff *skb, const struct net_device *in, | 31 | ebt_ip6_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
32 | const struct net_device *out, const struct xt_match *match, | ||
33 | const void *data, int offset, unsigned int protoff, bool *hotdrop) | ||
34 | { | 32 | { |
35 | const struct ebt_ip6_info *info = data; | 33 | const struct ebt_ip6_info *info = par->matchinfo; |
36 | const struct ipv6hdr *ih6; | 34 | const struct ipv6hdr *ih6; |
37 | struct ipv6hdr _ip6h; | 35 | struct ipv6hdr _ip6h; |
38 | const struct tcpudphdr *pptr; | 36 | const struct tcpudphdr *pptr; |
diff --git a/net/bridge/netfilter/ebt_limit.c b/net/bridge/netfilter/ebt_limit.c index 58aaaa149068..9a3ec8cadaa4 100644 --- a/net/bridge/netfilter/ebt_limit.c +++ b/net/bridge/netfilter/ebt_limit.c | |||
@@ -31,11 +31,9 @@ static DEFINE_SPINLOCK(limit_lock); | |||
31 | #define CREDITS_PER_JIFFY POW2_BELOW32(MAX_CPJ) | 31 | #define CREDITS_PER_JIFFY POW2_BELOW32(MAX_CPJ) |
32 | 32 | ||
33 | static bool | 33 | static bool |
34 | ebt_limit_mt(const struct sk_buff *skb, const struct net_device *in, | 34 | ebt_limit_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
35 | const struct net_device *out, const struct xt_match *match, | ||
36 | const void *data, int offset, unsigned int protoff, bool *hotdrop) | ||
37 | { | 35 | { |
38 | struct ebt_limit_info *info = (void *)data; | 36 | struct ebt_limit_info *info = (void *)par->matchinfo; |
39 | unsigned long now = jiffies; | 37 | unsigned long now = jiffies; |
40 | 38 | ||
41 | spin_lock_bh(&limit_lock); | 39 | spin_lock_bh(&limit_lock); |
diff --git a/net/bridge/netfilter/ebt_mark_m.c b/net/bridge/netfilter/ebt_mark_m.c index aa6781c7f98b..5b22ef96127c 100644 --- a/net/bridge/netfilter/ebt_mark_m.c +++ b/net/bridge/netfilter/ebt_mark_m.c | |||
@@ -13,11 +13,9 @@ | |||
13 | #include <linux/netfilter_bridge/ebt_mark_m.h> | 13 | #include <linux/netfilter_bridge/ebt_mark_m.h> |
14 | 14 | ||
15 | static bool | 15 | static bool |
16 | ebt_mark_mt(const struct sk_buff *skb, const struct net_device *in, | 16 | ebt_mark_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
17 | const struct net_device *out, const struct xt_match *match, | ||
18 | const void *data, int offset, unsigned int protoff, bool *hotdrop) | ||
19 | { | 17 | { |
20 | const struct ebt_mark_m_info *info = data; | 18 | const struct ebt_mark_m_info *info = par->matchinfo; |
21 | 19 | ||
22 | if (info->bitmask & EBT_MARK_OR) | 20 | if (info->bitmask & EBT_MARK_OR) |
23 | return !!(skb->mark & info->mask) ^ info->invert; | 21 | return !!(skb->mark & info->mask) ^ info->invert; |
diff --git a/net/bridge/netfilter/ebt_pkttype.c b/net/bridge/netfilter/ebt_pkttype.c index 1c04ce5a52c7..b756f88fb10f 100644 --- a/net/bridge/netfilter/ebt_pkttype.c +++ b/net/bridge/netfilter/ebt_pkttype.c | |||
@@ -13,12 +13,9 @@ | |||
13 | #include <linux/netfilter_bridge/ebt_pkttype.h> | 13 | #include <linux/netfilter_bridge/ebt_pkttype.h> |
14 | 14 | ||
15 | static bool | 15 | static bool |
16 | ebt_pkttype_mt(const struct sk_buff *skb, const struct net_device *in, | 16 | ebt_pkttype_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
17 | const struct net_device *out, const struct xt_match *match, | ||
18 | const void *data, int offset, unsigned int protoff, | ||
19 | bool *hotdrop) | ||
20 | { | 17 | { |
21 | const struct ebt_pkttype_info *info = data; | 18 | const struct ebt_pkttype_info *info = par->matchinfo; |
22 | 19 | ||
23 | return (skb->pkt_type == info->pkt_type) ^ info->invert; | 20 | return (skb->pkt_type == info->pkt_type) ^ info->invert; |
24 | } | 21 | } |
diff --git a/net/bridge/netfilter/ebt_stp.c b/net/bridge/netfilter/ebt_stp.c index 28bb48b67a80..06d777c62c32 100644 --- a/net/bridge/netfilter/ebt_stp.c +++ b/net/bridge/netfilter/ebt_stp.c | |||
@@ -120,11 +120,9 @@ static bool ebt_filter_config(const struct ebt_stp_info *info, | |||
120 | } | 120 | } |
121 | 121 | ||
122 | static bool | 122 | static bool |
123 | ebt_stp_mt(const struct sk_buff *skb, const struct net_device *in, | 123 | ebt_stp_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
124 | const struct net_device *out, const struct xt_match *match, | ||
125 | const void *data, int offset, unsigned int protoff, bool *hotdrop) | ||
126 | { | 124 | { |
127 | const struct ebt_stp_info *info = data; | 125 | const struct ebt_stp_info *info = par->matchinfo; |
128 | const struct stp_header *sp; | 126 | const struct stp_header *sp; |
129 | struct stp_header _stph; | 127 | struct stp_header _stph; |
130 | const uint8_t header[6] = {0x42, 0x42, 0x03, 0x00, 0x00, 0x00}; | 128 | const uint8_t header[6] = {0x42, 0x42, 0x03, 0x00, 0x00, 0x00}; |
diff --git a/net/bridge/netfilter/ebt_vlan.c b/net/bridge/netfilter/ebt_vlan.c index 5addef6d62f0..b05b4a818341 100644 --- a/net/bridge/netfilter/ebt_vlan.c +++ b/net/bridge/netfilter/ebt_vlan.c | |||
@@ -41,11 +41,9 @@ MODULE_LICENSE("GPL"); | |||
41 | #define EXIT_ON_MISMATCH(_MATCH_,_MASK_) {if (!((info->_MATCH_ == _MATCH_)^!!(info->invflags & _MASK_))) return false; } | 41 | #define EXIT_ON_MISMATCH(_MATCH_,_MASK_) {if (!((info->_MATCH_ == _MATCH_)^!!(info->invflags & _MASK_))) return false; } |
42 | 42 | ||
43 | static bool | 43 | static bool |
44 | ebt_vlan_mt(const struct sk_buff *skb, const struct net_device *in, | 44 | ebt_vlan_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
45 | const struct net_device *out, const struct xt_match *match, | ||
46 | const void *data, int offset, unsigned int protoff, bool *hotdrop) | ||
47 | { | 45 | { |
48 | const struct ebt_vlan_info *info = data; | 46 | const struct ebt_vlan_info *info = par->matchinfo; |
49 | const struct vlan_hdr *fp; | 47 | const struct vlan_hdr *fp; |
50 | struct vlan_hdr _frame; | 48 | struct vlan_hdr _frame; |
51 | 49 | ||
diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c index 7ee72b71d3cb..f8e1822f38d4 100644 --- a/net/bridge/netfilter/ebtables.c +++ b/net/bridge/netfilter/ebtables.c | |||
@@ -74,11 +74,11 @@ static inline int ebt_do_watcher (struct ebt_entry_watcher *w, | |||
74 | } | 74 | } |
75 | 75 | ||
76 | static inline int ebt_do_match (struct ebt_entry_match *m, | 76 | static inline int ebt_do_match (struct ebt_entry_match *m, |
77 | const struct sk_buff *skb, const struct net_device *in, | 77 | const struct sk_buff *skb, struct xt_match_param *par) |
78 | const struct net_device *out, bool *hotdrop) | ||
79 | { | 78 | { |
80 | return m->u.match->match(skb, in, out, m->u.match, | 79 | par->match = m->u.match; |
81 | m->data, 0, 0, hotdrop); | 80 | par->matchinfo = m->data; |
81 | return m->u.match->match(skb, par); | ||
82 | } | 82 | } |
83 | 83 | ||
84 | static inline int ebt_dev_check(char *entry, const struct net_device *device) | 84 | static inline int ebt_dev_check(char *entry, const struct net_device *device) |
@@ -155,6 +155,11 @@ unsigned int ebt_do_table (unsigned int hook, struct sk_buff *skb, | |||
155 | char *base; | 155 | char *base; |
156 | struct ebt_table_info *private; | 156 | struct ebt_table_info *private; |
157 | bool hotdrop = false; | 157 | bool hotdrop = false; |
158 | struct xt_match_param mtpar; | ||
159 | |||
160 | mtpar.in = in; | ||
161 | mtpar.out = out; | ||
162 | mtpar.hotdrop = &hotdrop; | ||
158 | 163 | ||
159 | read_lock_bh(&table->lock); | 164 | read_lock_bh(&table->lock); |
160 | private = table->private; | 165 | private = table->private; |
@@ -175,8 +180,7 @@ unsigned int ebt_do_table (unsigned int hook, struct sk_buff *skb, | |||
175 | if (ebt_basic_match(point, eth_hdr(skb), in, out)) | 180 | if (ebt_basic_match(point, eth_hdr(skb), in, out)) |
176 | goto letscontinue; | 181 | goto letscontinue; |
177 | 182 | ||
178 | if (EBT_MATCH_ITERATE(point, ebt_do_match, skb, | 183 | if (EBT_MATCH_ITERATE(point, ebt_do_match, skb, &mtpar) != 0) |
179 | in, out, &hotdrop) != 0) | ||
180 | goto letscontinue; | 184 | goto letscontinue; |
181 | if (hotdrop) { | 185 | if (hotdrop) { |
182 | read_unlock_bh(&table->lock); | 186 | read_unlock_bh(&table->lock); |
diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index b4c74a7a807c..99fdb59454fd 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c | |||
@@ -186,16 +186,14 @@ ipt_error(struct sk_buff *skb, | |||
186 | 186 | ||
187 | /* Performance critical - called for every packet */ | 187 | /* Performance critical - called for every packet */ |
188 | static inline bool | 188 | static inline bool |
189 | do_match(struct ipt_entry_match *m, | 189 | do_match(struct ipt_entry_match *m, const struct sk_buff *skb, |
190 | const struct sk_buff *skb, | 190 | struct xt_match_param *par) |
191 | const struct net_device *in, | ||
192 | const struct net_device *out, | ||
193 | int offset, | ||
194 | bool *hotdrop) | ||
195 | { | 191 | { |
192 | par->match = m->u.kernel.match; | ||
193 | par->matchinfo = m->data; | ||
194 | |||
196 | /* Stop iteration if it doesn't match */ | 195 | /* Stop iteration if it doesn't match */ |
197 | if (!m->u.kernel.match->match(skb, in, out, m->u.kernel.match, m->data, | 196 | if (!m->u.kernel.match->match(skb, par)) |
198 | offset, ip_hdrlen(skb), hotdrop)) | ||
199 | return true; | 197 | return true; |
200 | else | 198 | else |
201 | return false; | 199 | return false; |
@@ -326,7 +324,6 @@ ipt_do_table(struct sk_buff *skb, | |||
326 | struct xt_table *table) | 324 | struct xt_table *table) |
327 | { | 325 | { |
328 | static const char nulldevname[IFNAMSIZ] __attribute__((aligned(sizeof(long)))); | 326 | static const char nulldevname[IFNAMSIZ] __attribute__((aligned(sizeof(long)))); |
329 | u_int16_t offset; | ||
330 | const struct iphdr *ip; | 327 | const struct iphdr *ip; |
331 | u_int16_t datalen; | 328 | u_int16_t datalen; |
332 | bool hotdrop = false; | 329 | bool hotdrop = false; |
@@ -336,6 +333,7 @@ ipt_do_table(struct sk_buff *skb, | |||
336 | void *table_base; | 333 | void *table_base; |
337 | struct ipt_entry *e, *back; | 334 | struct ipt_entry *e, *back; |
338 | struct xt_table_info *private; | 335 | struct xt_table_info *private; |
336 | struct xt_match_param mtpar; | ||
339 | 337 | ||
340 | /* Initialization */ | 338 | /* Initialization */ |
341 | ip = ip_hdr(skb); | 339 | ip = ip_hdr(skb); |
@@ -348,7 +346,11 @@ ipt_do_table(struct sk_buff *skb, | |||
348 | * things we don't know, ie. tcp syn flag or ports). If the | 346 | * things we don't know, ie. tcp syn flag or ports). If the |
349 | * rule is also a fragment-specific rule, non-fragments won't | 347 | * rule is also a fragment-specific rule, non-fragments won't |
350 | * match it. */ | 348 | * match it. */ |
351 | offset = ntohs(ip->frag_off) & IP_OFFSET; | 349 | mtpar.fragoff = ntohs(ip->frag_off) & IP_OFFSET; |
350 | mtpar.thoff = ip_hdrlen(skb); | ||
351 | mtpar.hotdrop = &hotdrop; | ||
352 | mtpar.in = in; | ||
353 | mtpar.out = out; | ||
352 | 354 | ||
353 | read_lock_bh(&table->lock); | 355 | read_lock_bh(&table->lock); |
354 | IP_NF_ASSERT(table->valid_hooks & (1 << hook)); | 356 | IP_NF_ASSERT(table->valid_hooks & (1 << hook)); |
@@ -362,12 +364,11 @@ ipt_do_table(struct sk_buff *skb, | |||
362 | do { | 364 | do { |
363 | IP_NF_ASSERT(e); | 365 | IP_NF_ASSERT(e); |
364 | IP_NF_ASSERT(back); | 366 | IP_NF_ASSERT(back); |
365 | if (ip_packet_match(ip, indev, outdev, &e->ip, offset)) { | 367 | if (ip_packet_match(ip, indev, outdev, |
368 | &e->ip, mtpar.fragoff)) { | ||
366 | struct ipt_entry_target *t; | 369 | struct ipt_entry_target *t; |
367 | 370 | ||
368 | if (IPT_MATCH_ITERATE(e, do_match, | 371 | if (IPT_MATCH_ITERATE(e, do_match, skb, &mtpar) != 0) |
369 | skb, in, out, | ||
370 | offset, &hotdrop) != 0) | ||
371 | goto no_match; | 372 | goto no_match; |
372 | 373 | ||
373 | ADD_COUNTER(e->counters, ntohs(ip->tot_len), 1); | 374 | ADD_COUNTER(e->counters, ntohs(ip->tot_len), 1); |
@@ -2116,30 +2117,23 @@ icmp_type_code_match(u_int8_t test_type, u_int8_t min_code, u_int8_t max_code, | |||
2116 | } | 2117 | } |
2117 | 2118 | ||
2118 | static bool | 2119 | static bool |
2119 | icmp_match(const struct sk_buff *skb, | 2120 | icmp_match(const struct sk_buff *skb, const struct xt_match_param *par) |
2120 | const struct net_device *in, | ||
2121 | const struct net_device *out, | ||
2122 | const struct xt_match *match, | ||
2123 | const void *matchinfo, | ||
2124 | int offset, | ||
2125 | unsigned int protoff, | ||
2126 | bool *hotdrop) | ||
2127 | { | 2121 | { |
2128 | const struct icmphdr *ic; | 2122 | const struct icmphdr *ic; |
2129 | struct icmphdr _icmph; | 2123 | struct icmphdr _icmph; |
2130 | const struct ipt_icmp *icmpinfo = matchinfo; | 2124 | const struct ipt_icmp *icmpinfo = par->matchinfo; |
2131 | 2125 | ||
2132 | /* Must not be a fragment. */ | 2126 | /* Must not be a fragment. */ |
2133 | if (offset) | 2127 | if (par->fragoff != 0) |
2134 | return false; | 2128 | return false; |
2135 | 2129 | ||
2136 | ic = skb_header_pointer(skb, protoff, sizeof(_icmph), &_icmph); | 2130 | ic = skb_header_pointer(skb, par->thoff, sizeof(_icmph), &_icmph); |
2137 | if (ic == NULL) { | 2131 | if (ic == NULL) { |
2138 | /* We've been asked to examine this packet, and we | 2132 | /* We've been asked to examine this packet, and we |
2139 | * can't. Hence, no choice but to drop. | 2133 | * can't. Hence, no choice but to drop. |
2140 | */ | 2134 | */ |
2141 | duprintf("Dropping evil ICMP tinygram.\n"); | 2135 | duprintf("Dropping evil ICMP tinygram.\n"); |
2142 | *hotdrop = true; | 2136 | *par->hotdrop = true; |
2143 | return false; | 2137 | return false; |
2144 | } | 2138 | } |
2145 | 2139 | ||
diff --git a/net/ipv4/netfilter/ipt_addrtype.c b/net/ipv4/netfilter/ipt_addrtype.c index 2c9d88a6c838..e60995e4c20c 100644 --- a/net/ipv4/netfilter/ipt_addrtype.c +++ b/net/ipv4/netfilter/ipt_addrtype.c | |||
@@ -30,12 +30,9 @@ static inline bool match_type(const struct net_device *dev, __be32 addr, | |||
30 | } | 30 | } |
31 | 31 | ||
32 | static bool | 32 | static bool |
33 | addrtype_mt_v0(const struct sk_buff *skb, const struct net_device *in, | 33 | addrtype_mt_v0(const struct sk_buff *skb, const struct xt_match_param *par) |
34 | const struct net_device *out, const struct xt_match *match, | ||
35 | const void *matchinfo, int offset, unsigned int protoff, | ||
36 | bool *hotdrop) | ||
37 | { | 34 | { |
38 | const struct ipt_addrtype_info *info = matchinfo; | 35 | const struct ipt_addrtype_info *info = par->matchinfo; |
39 | const struct iphdr *iph = ip_hdr(skb); | 36 | const struct iphdr *iph = ip_hdr(skb); |
40 | bool ret = true; | 37 | bool ret = true; |
41 | 38 | ||
@@ -50,20 +47,17 @@ addrtype_mt_v0(const struct sk_buff *skb, const struct net_device *in, | |||
50 | } | 47 | } |
51 | 48 | ||
52 | static bool | 49 | static bool |
53 | addrtype_mt_v1(const struct sk_buff *skb, const struct net_device *in, | 50 | addrtype_mt_v1(const struct sk_buff *skb, const struct xt_match_param *par) |
54 | const struct net_device *out, const struct xt_match *match, | ||
55 | const void *matchinfo, int offset, unsigned int protoff, | ||
56 | bool *hotdrop) | ||
57 | { | 51 | { |
58 | const struct ipt_addrtype_info_v1 *info = matchinfo; | 52 | const struct ipt_addrtype_info_v1 *info = par->matchinfo; |
59 | const struct iphdr *iph = ip_hdr(skb); | 53 | const struct iphdr *iph = ip_hdr(skb); |
60 | const struct net_device *dev = NULL; | 54 | const struct net_device *dev = NULL; |
61 | bool ret = true; | 55 | bool ret = true; |
62 | 56 | ||
63 | if (info->flags & IPT_ADDRTYPE_LIMIT_IFACE_IN) | 57 | if (info->flags & IPT_ADDRTYPE_LIMIT_IFACE_IN) |
64 | dev = in; | 58 | dev = par->in; |
65 | else if (info->flags & IPT_ADDRTYPE_LIMIT_IFACE_OUT) | 59 | else if (info->flags & IPT_ADDRTYPE_LIMIT_IFACE_OUT) |
66 | dev = out; | 60 | dev = par->out; |
67 | 61 | ||
68 | if (info->source) | 62 | if (info->source) |
69 | ret &= match_type(dev, iph->saddr, info->source) ^ | 63 | ret &= match_type(dev, iph->saddr, info->source) ^ |
diff --git a/net/ipv4/netfilter/ipt_ah.c b/net/ipv4/netfilter/ipt_ah.c index e2e993edd665..2fce19ef4f3f 100644 --- a/net/ipv4/netfilter/ipt_ah.c +++ b/net/ipv4/netfilter/ipt_ah.c | |||
@@ -36,27 +36,23 @@ spi_match(u_int32_t min, u_int32_t max, u_int32_t spi, bool invert) | |||
36 | return r; | 36 | return r; |
37 | } | 37 | } |
38 | 38 | ||
39 | static bool | 39 | static bool ah_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
40 | ah_mt(const struct sk_buff *skb, const struct net_device *in, | ||
41 | const struct net_device *out, const struct xt_match *match, | ||
42 | const void *matchinfo, int offset, unsigned int protoff, bool *hotdrop) | ||
43 | { | 40 | { |
44 | struct ip_auth_hdr _ahdr; | 41 | struct ip_auth_hdr _ahdr; |
45 | const struct ip_auth_hdr *ah; | 42 | const struct ip_auth_hdr *ah; |
46 | const struct ipt_ah *ahinfo = matchinfo; | 43 | const struct ipt_ah *ahinfo = par->matchinfo; |
47 | 44 | ||
48 | /* Must not be a fragment. */ | 45 | /* Must not be a fragment. */ |
49 | if (offset) | 46 | if (par->fragoff != 0) |
50 | return false; | 47 | return false; |
51 | 48 | ||
52 | ah = skb_header_pointer(skb, protoff, | 49 | ah = skb_header_pointer(skb, par->thoff, sizeof(_ahdr), &_ahdr); |
53 | sizeof(_ahdr), &_ahdr); | ||
54 | if (ah == NULL) { | 50 | if (ah == NULL) { |
55 | /* We've been asked to examine this packet, and we | 51 | /* We've been asked to examine this packet, and we |
56 | * can't. Hence, no choice but to drop. | 52 | * can't. Hence, no choice but to drop. |
57 | */ | 53 | */ |
58 | duprintf("Dropping evil AH tinygram.\n"); | 54 | duprintf("Dropping evil AH tinygram.\n"); |
59 | *hotdrop = true; | 55 | *par->hotdrop = true; |
60 | return 0; | 56 | return 0; |
61 | } | 57 | } |
62 | 58 | ||
diff --git a/net/ipv4/netfilter/ipt_ecn.c b/net/ipv4/netfilter/ipt_ecn.c index 2c45b4be7c3c..069154631508 100644 --- a/net/ipv4/netfilter/ipt_ecn.c +++ b/net/ipv4/netfilter/ipt_ecn.c | |||
@@ -67,12 +67,9 @@ static inline bool match_tcp(const struct sk_buff *skb, | |||
67 | return true; | 67 | return true; |
68 | } | 68 | } |
69 | 69 | ||
70 | static bool | 70 | static bool ecn_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
71 | ecn_mt(const struct sk_buff *skb, const struct net_device *in, | ||
72 | const struct net_device *out, const struct xt_match *match, | ||
73 | const void *matchinfo, int offset, unsigned int protoff, bool *hotdrop) | ||
74 | { | 71 | { |
75 | const struct ipt_ecn_info *info = matchinfo; | 72 | const struct ipt_ecn_info *info = par->matchinfo; |
76 | 73 | ||
77 | if (info->operation & IPT_ECN_OP_MATCH_IP) | 74 | if (info->operation & IPT_ECN_OP_MATCH_IP) |
78 | if (!match_ip(skb, info)) | 75 | if (!match_ip(skb, info)) |
@@ -81,7 +78,7 @@ ecn_mt(const struct sk_buff *skb, const struct net_device *in, | |||
81 | if (info->operation & (IPT_ECN_OP_MATCH_ECE|IPT_ECN_OP_MATCH_CWR)) { | 78 | if (info->operation & (IPT_ECN_OP_MATCH_ECE|IPT_ECN_OP_MATCH_CWR)) { |
82 | if (ip_hdr(skb)->protocol != IPPROTO_TCP) | 79 | if (ip_hdr(skb)->protocol != IPPROTO_TCP) |
83 | return false; | 80 | return false; |
84 | if (!match_tcp(skb, info, hotdrop)) | 81 | if (!match_tcp(skb, info, par->hotdrop)) |
85 | return false; | 82 | return false; |
86 | } | 83 | } |
87 | 84 | ||
diff --git a/net/ipv4/netfilter/ipt_ttl.c b/net/ipv4/netfilter/ipt_ttl.c index d4c3fdc2a79f..297f1cbf4ff5 100644 --- a/net/ipv4/netfilter/ipt_ttl.c +++ b/net/ipv4/netfilter/ipt_ttl.c | |||
@@ -18,12 +18,9 @@ MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>"); | |||
18 | MODULE_DESCRIPTION("Xtables: IPv4 TTL field match"); | 18 | MODULE_DESCRIPTION("Xtables: IPv4 TTL field match"); |
19 | MODULE_LICENSE("GPL"); | 19 | MODULE_LICENSE("GPL"); |
20 | 20 | ||
21 | static bool | 21 | static bool ttl_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
22 | ttl_mt(const struct sk_buff *skb, const struct net_device *in, | ||
23 | const struct net_device *out, const struct xt_match *match, | ||
24 | const void *matchinfo, int offset, unsigned int protoff, bool *hotdrop) | ||
25 | { | 22 | { |
26 | const struct ipt_ttl_info *info = matchinfo; | 23 | const struct ipt_ttl_info *info = par->matchinfo; |
27 | const u8 ttl = ip_hdr(skb)->ttl; | 24 | const u8 ttl = ip_hdr(skb)->ttl; |
28 | 25 | ||
29 | switch (info->mode) { | 26 | switch (info->mode) { |
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index 12c41b8d365b..cf2c5370a4e8 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c | |||
@@ -215,17 +215,14 @@ ip6t_error(struct sk_buff *skb, | |||
215 | 215 | ||
216 | /* Performance critical - called for every packet */ | 216 | /* Performance critical - called for every packet */ |
217 | static inline bool | 217 | static inline bool |
218 | do_match(struct ip6t_entry_match *m, | 218 | do_match(struct ip6t_entry_match *m, const struct sk_buff *skb, |
219 | const struct sk_buff *skb, | 219 | struct xt_match_param *par) |
220 | const struct net_device *in, | ||
221 | const struct net_device *out, | ||
222 | int offset, | ||
223 | unsigned int protoff, | ||
224 | bool *hotdrop) | ||
225 | { | 220 | { |
221 | par->match = m->u.kernel.match; | ||
222 | par->matchinfo = m->data; | ||
223 | |||
226 | /* Stop iteration if it doesn't match */ | 224 | /* Stop iteration if it doesn't match */ |
227 | if (!m->u.kernel.match->match(skb, in, out, m->u.kernel.match, m->data, | 225 | if (!m->u.kernel.match->match(skb, par)) |
228 | offset, protoff, hotdrop)) | ||
229 | return true; | 226 | return true; |
230 | else | 227 | else |
231 | return false; | 228 | return false; |
@@ -355,8 +352,6 @@ ip6t_do_table(struct sk_buff *skb, | |||
355 | struct xt_table *table) | 352 | struct xt_table *table) |
356 | { | 353 | { |
357 | static const char nulldevname[IFNAMSIZ] __attribute__((aligned(sizeof(long)))); | 354 | static const char nulldevname[IFNAMSIZ] __attribute__((aligned(sizeof(long)))); |
358 | int offset = 0; | ||
359 | unsigned int protoff = 0; | ||
360 | bool hotdrop = false; | 355 | bool hotdrop = false; |
361 | /* Initializing verdict to NF_DROP keeps gcc happy. */ | 356 | /* Initializing verdict to NF_DROP keeps gcc happy. */ |
362 | unsigned int verdict = NF_DROP; | 357 | unsigned int verdict = NF_DROP; |
@@ -364,6 +359,7 @@ ip6t_do_table(struct sk_buff *skb, | |||
364 | void *table_base; | 359 | void *table_base; |
365 | struct ip6t_entry *e, *back; | 360 | struct ip6t_entry *e, *back; |
366 | struct xt_table_info *private; | 361 | struct xt_table_info *private; |
362 | struct xt_match_param mtpar; | ||
367 | 363 | ||
368 | /* Initialization */ | 364 | /* Initialization */ |
369 | indev = in ? in->name : nulldevname; | 365 | indev = in ? in->name : nulldevname; |
@@ -374,6 +370,9 @@ ip6t_do_table(struct sk_buff *skb, | |||
374 | * things we don't know, ie. tcp syn flag or ports). If the | 370 | * things we don't know, ie. tcp syn flag or ports). If the |
375 | * rule is also a fragment-specific rule, non-fragments won't | 371 | * rule is also a fragment-specific rule, non-fragments won't |
376 | * match it. */ | 372 | * match it. */ |
373 | mtpar.hotdrop = &hotdrop; | ||
374 | mtpar.in = in; | ||
375 | mtpar.out = out; | ||
377 | 376 | ||
378 | read_lock_bh(&table->lock); | 377 | read_lock_bh(&table->lock); |
379 | IP_NF_ASSERT(table->valid_hooks & (1 << hook)); | 378 | IP_NF_ASSERT(table->valid_hooks & (1 << hook)); |
@@ -388,12 +387,10 @@ ip6t_do_table(struct sk_buff *skb, | |||
388 | IP_NF_ASSERT(e); | 387 | IP_NF_ASSERT(e); |
389 | IP_NF_ASSERT(back); | 388 | IP_NF_ASSERT(back); |
390 | if (ip6_packet_match(skb, indev, outdev, &e->ipv6, | 389 | if (ip6_packet_match(skb, indev, outdev, &e->ipv6, |
391 | &protoff, &offset, &hotdrop)) { | 390 | &mtpar.thoff, &mtpar.fragoff, &hotdrop)) { |
392 | struct ip6t_entry_target *t; | 391 | struct ip6t_entry_target *t; |
393 | 392 | ||
394 | if (IP6T_MATCH_ITERATE(e, do_match, | 393 | if (IP6T_MATCH_ITERATE(e, do_match, skb, &mtpar) != 0) |
395 | skb, in, out, | ||
396 | offset, protoff, &hotdrop) != 0) | ||
397 | goto no_match; | 394 | goto no_match; |
398 | 395 | ||
399 | ADD_COUNTER(e->counters, | 396 | ADD_COUNTER(e->counters, |
@@ -2141,30 +2138,23 @@ icmp6_type_code_match(u_int8_t test_type, u_int8_t min_code, u_int8_t max_code, | |||
2141 | } | 2138 | } |
2142 | 2139 | ||
2143 | static bool | 2140 | static bool |
2144 | icmp6_match(const struct sk_buff *skb, | 2141 | icmp6_match(const struct sk_buff *skb, const struct xt_match_param *par) |
2145 | const struct net_device *in, | ||
2146 | const struct net_device *out, | ||
2147 | const struct xt_match *match, | ||
2148 | const void *matchinfo, | ||
2149 | int offset, | ||
2150 | unsigned int protoff, | ||
2151 | bool *hotdrop) | ||
2152 | { | 2142 | { |
2153 | const struct icmp6hdr *ic; | 2143 | const struct icmp6hdr *ic; |
2154 | struct icmp6hdr _icmph; | 2144 | struct icmp6hdr _icmph; |
2155 | const struct ip6t_icmp *icmpinfo = matchinfo; | 2145 | const struct ip6t_icmp *icmpinfo = par->matchinfo; |
2156 | 2146 | ||
2157 | /* Must not be a fragment. */ | 2147 | /* Must not be a fragment. */ |
2158 | if (offset) | 2148 | if (par->fragoff != 0) |
2159 | return false; | 2149 | return false; |
2160 | 2150 | ||
2161 | ic = skb_header_pointer(skb, protoff, sizeof(_icmph), &_icmph); | 2151 | ic = skb_header_pointer(skb, par->thoff, sizeof(_icmph), &_icmph); |
2162 | if (ic == NULL) { | 2152 | if (ic == NULL) { |
2163 | /* We've been asked to examine this packet, and we | 2153 | /* We've been asked to examine this packet, and we |
2164 | * can't. Hence, no choice but to drop. | 2154 | * can't. Hence, no choice but to drop. |
2165 | */ | 2155 | */ |
2166 | duprintf("Dropping evil ICMP tinygram.\n"); | 2156 | duprintf("Dropping evil ICMP tinygram.\n"); |
2167 | *hotdrop = true; | 2157 | *par->hotdrop = true; |
2168 | return false; | 2158 | return false; |
2169 | } | 2159 | } |
2170 | 2160 | ||
diff --git a/net/ipv6/netfilter/ip6t_ah.c b/net/ipv6/netfilter/ip6t_ah.c index 061f89beeb67..a04f2b8396e9 100644 --- a/net/ipv6/netfilter/ip6t_ah.c +++ b/net/ipv6/netfilter/ip6t_ah.c | |||
@@ -36,14 +36,11 @@ spi_match(u_int32_t min, u_int32_t max, u_int32_t spi, bool invert) | |||
36 | return r; | 36 | return r; |
37 | } | 37 | } |
38 | 38 | ||
39 | static bool | 39 | static bool ah_mt6(const struct sk_buff *skb, const struct xt_match_param *par) |
40 | ah_mt6(const struct sk_buff *skb, const struct net_device *in, | ||
41 | const struct net_device *out, const struct xt_match *match, | ||
42 | const void *matchinfo, int offset, unsigned int protoff, bool *hotdrop) | ||
43 | { | 40 | { |
44 | struct ip_auth_hdr _ah; | 41 | struct ip_auth_hdr _ah; |
45 | const struct ip_auth_hdr *ah; | 42 | const struct ip_auth_hdr *ah; |
46 | const struct ip6t_ah *ahinfo = matchinfo; | 43 | const struct ip6t_ah *ahinfo = par->matchinfo; |
47 | unsigned int ptr; | 44 | unsigned int ptr; |
48 | unsigned int hdrlen = 0; | 45 | unsigned int hdrlen = 0; |
49 | int err; | 46 | int err; |
@@ -51,13 +48,13 @@ ah_mt6(const struct sk_buff *skb, const struct net_device *in, | |||
51 | err = ipv6_find_hdr(skb, &ptr, NEXTHDR_AUTH, NULL); | 48 | err = ipv6_find_hdr(skb, &ptr, NEXTHDR_AUTH, NULL); |
52 | if (err < 0) { | 49 | if (err < 0) { |
53 | if (err != -ENOENT) | 50 | if (err != -ENOENT) |
54 | *hotdrop = true; | 51 | *par->hotdrop = true; |
55 | return false; | 52 | return false; |
56 | } | 53 | } |
57 | 54 | ||
58 | ah = skb_header_pointer(skb, ptr, sizeof(_ah), &_ah); | 55 | ah = skb_header_pointer(skb, ptr, sizeof(_ah), &_ah); |
59 | if (ah == NULL) { | 56 | if (ah == NULL) { |
60 | *hotdrop = true; | 57 | *par->hotdrop = true; |
61 | return false; | 58 | return false; |
62 | } | 59 | } |
63 | 60 | ||
diff --git a/net/ipv6/netfilter/ip6t_eui64.c b/net/ipv6/netfilter/ip6t_eui64.c index ba38df1116f0..db610bacbcce 100644 --- a/net/ipv6/netfilter/ip6t_eui64.c +++ b/net/ipv6/netfilter/ip6t_eui64.c | |||
@@ -20,18 +20,15 @@ MODULE_LICENSE("GPL"); | |||
20 | MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>"); | 20 | MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>"); |
21 | 21 | ||
22 | static bool | 22 | static bool |
23 | eui64_mt6(const struct sk_buff *skb, const struct net_device *in, | 23 | eui64_mt6(const struct sk_buff *skb, const struct xt_match_param *par) |
24 | const struct net_device *out, const struct xt_match *match, | ||
25 | const void *matchinfo, int offset, unsigned int protoff, | ||
26 | bool *hotdrop) | ||
27 | { | 24 | { |
28 | unsigned char eui64[8]; | 25 | unsigned char eui64[8]; |
29 | int i = 0; | 26 | int i = 0; |
30 | 27 | ||
31 | if (!(skb_mac_header(skb) >= skb->head && | 28 | if (!(skb_mac_header(skb) >= skb->head && |
32 | skb_mac_header(skb) + ETH_HLEN <= skb->data) && | 29 | skb_mac_header(skb) + ETH_HLEN <= skb->data) && |
33 | offset != 0) { | 30 | par->fragoff != 0) { |
34 | *hotdrop = true; | 31 | *par->hotdrop = true; |
35 | return false; | 32 | return false; |
36 | } | 33 | } |
37 | 34 | ||
diff --git a/net/ipv6/netfilter/ip6t_frag.c b/net/ipv6/netfilter/ip6t_frag.c index 972f699af22c..6951d0dacf45 100644 --- a/net/ipv6/netfilter/ip6t_frag.c +++ b/net/ipv6/netfilter/ip6t_frag.c | |||
@@ -35,27 +35,24 @@ id_match(u_int32_t min, u_int32_t max, u_int32_t id, bool invert) | |||
35 | } | 35 | } |
36 | 36 | ||
37 | static bool | 37 | static bool |
38 | frag_mt6(const struct sk_buff *skb, const struct net_device *in, | 38 | frag_mt6(const struct sk_buff *skb, const struct xt_match_param *par) |
39 | const struct net_device *out, const struct xt_match *match, | ||
40 | const void *matchinfo, int offset, unsigned int protoff, | ||
41 | bool *hotdrop) | ||
42 | { | 39 | { |
43 | struct frag_hdr _frag; | 40 | struct frag_hdr _frag; |
44 | const struct frag_hdr *fh; | 41 | const struct frag_hdr *fh; |
45 | const struct ip6t_frag *fraginfo = matchinfo; | 42 | const struct ip6t_frag *fraginfo = par->matchinfo; |
46 | unsigned int ptr; | 43 | unsigned int ptr; |
47 | int err; | 44 | int err; |
48 | 45 | ||
49 | err = ipv6_find_hdr(skb, &ptr, NEXTHDR_FRAGMENT, NULL); | 46 | err = ipv6_find_hdr(skb, &ptr, NEXTHDR_FRAGMENT, NULL); |
50 | if (err < 0) { | 47 | if (err < 0) { |
51 | if (err != -ENOENT) | 48 | if (err != -ENOENT) |
52 | *hotdrop = true; | 49 | *par->hotdrop = true; |
53 | return false; | 50 | return false; |
54 | } | 51 | } |
55 | 52 | ||
56 | fh = skb_header_pointer(skb, ptr, sizeof(_frag), &_frag); | 53 | fh = skb_header_pointer(skb, ptr, sizeof(_frag), &_frag); |
57 | if (fh == NULL) { | 54 | if (fh == NULL) { |
58 | *hotdrop = true; | 55 | *par->hotdrop = true; |
59 | return false; | 56 | return false; |
60 | } | 57 | } |
61 | 58 | ||
diff --git a/net/ipv6/netfilter/ip6t_hbh.c b/net/ipv6/netfilter/ip6t_hbh.c index d5edb51a595a..d3351978819a 100644 --- a/net/ipv6/netfilter/ip6t_hbh.c +++ b/net/ipv6/netfilter/ip6t_hbh.c | |||
@@ -42,14 +42,11 @@ MODULE_ALIAS("ip6t_dst"); | |||
42 | */ | 42 | */ |
43 | 43 | ||
44 | static bool | 44 | static bool |
45 | hbh_mt6(const struct sk_buff *skb, const struct net_device *in, | 45 | hbh_mt6(const struct sk_buff *skb, const struct xt_match_param *par) |
46 | const struct net_device *out, const struct xt_match *match, | ||
47 | const void *matchinfo, int offset, unsigned int protoff, | ||
48 | bool *hotdrop) | ||
49 | { | 46 | { |
50 | struct ipv6_opt_hdr _optsh; | 47 | struct ipv6_opt_hdr _optsh; |
51 | const struct ipv6_opt_hdr *oh; | 48 | const struct ipv6_opt_hdr *oh; |
52 | const struct ip6t_opts *optinfo = matchinfo; | 49 | const struct ip6t_opts *optinfo = par->matchinfo; |
53 | unsigned int temp; | 50 | unsigned int temp; |
54 | unsigned int ptr; | 51 | unsigned int ptr; |
55 | unsigned int hdrlen = 0; | 52 | unsigned int hdrlen = 0; |
@@ -61,16 +58,16 @@ hbh_mt6(const struct sk_buff *skb, const struct net_device *in, | |||
61 | unsigned int optlen; | 58 | unsigned int optlen; |
62 | int err; | 59 | int err; |
63 | 60 | ||
64 | err = ipv6_find_hdr(skb, &ptr, match->data, NULL); | 61 | err = ipv6_find_hdr(skb, &ptr, par->match->data, NULL); |
65 | if (err < 0) { | 62 | if (err < 0) { |
66 | if (err != -ENOENT) | 63 | if (err != -ENOENT) |
67 | *hotdrop = true; | 64 | *par->hotdrop = true; |
68 | return false; | 65 | return false; |
69 | } | 66 | } |
70 | 67 | ||
71 | oh = skb_header_pointer(skb, ptr, sizeof(_optsh), &_optsh); | 68 | oh = skb_header_pointer(skb, ptr, sizeof(_optsh), &_optsh); |
72 | if (oh == NULL) { | 69 | if (oh == NULL) { |
73 | *hotdrop = true; | 70 | *par->hotdrop = true; |
74 | return false; | 71 | return false; |
75 | } | 72 | } |
76 | 73 | ||
diff --git a/net/ipv6/netfilter/ip6t_hl.c b/net/ipv6/netfilter/ip6t_hl.c index 25c1eb92fac3..c964dca1132d 100644 --- a/net/ipv6/netfilter/ip6t_hl.c +++ b/net/ipv6/netfilter/ip6t_hl.c | |||
@@ -19,12 +19,9 @@ MODULE_AUTHOR("Maciej Soltysiak <solt@dns.toxicfilms.tv>"); | |||
19 | MODULE_DESCRIPTION("Xtables: IPv6 Hop Limit field match"); | 19 | MODULE_DESCRIPTION("Xtables: IPv6 Hop Limit field match"); |
20 | MODULE_LICENSE("GPL"); | 20 | MODULE_LICENSE("GPL"); |
21 | 21 | ||
22 | static bool | 22 | static bool hl_mt6(const struct sk_buff *skb, const struct xt_match_param *par) |
23 | hl_mt6(const struct sk_buff *skb, const struct net_device *in, | ||
24 | const struct net_device *out, const struct xt_match *match, | ||
25 | const void *matchinfo, int offset, unsigned int protoff, bool *hotdrop) | ||
26 | { | 23 | { |
27 | const struct ip6t_hl_info *info = matchinfo; | 24 | const struct ip6t_hl_info *info = par->matchinfo; |
28 | const struct ipv6hdr *ip6h = ipv6_hdr(skb); | 25 | const struct ipv6hdr *ip6h = ipv6_hdr(skb); |
29 | 26 | ||
30 | switch (info->mode) { | 27 | switch (info->mode) { |
diff --git a/net/ipv6/netfilter/ip6t_ipv6header.c b/net/ipv6/netfilter/ip6t_ipv6header.c index ef0661aacea7..6aaca511d473 100644 --- a/net/ipv6/netfilter/ip6t_ipv6header.c +++ b/net/ipv6/netfilter/ip6t_ipv6header.c | |||
@@ -27,12 +27,9 @@ MODULE_DESCRIPTION("Xtables: IPv6 header types match"); | |||
27 | MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>"); | 27 | MODULE_AUTHOR("Andras Kis-Szabo <kisza@sch.bme.hu>"); |
28 | 28 | ||
29 | static bool | 29 | static bool |
30 | ipv6header_mt6(const struct sk_buff *skb, const struct net_device *in, | 30 | ipv6header_mt6(const struct sk_buff *skb, const struct xt_match_param *par) |
31 | const struct net_device *out, const struct xt_match *match, | ||
32 | const void *matchinfo, int offset, unsigned int protoff, | ||
33 | bool *hotdrop) | ||
34 | { | 31 | { |
35 | const struct ip6t_ipv6header_info *info = matchinfo; | 32 | const struct ip6t_ipv6header_info *info = par->matchinfo; |
36 | unsigned int temp; | 33 | unsigned int temp; |
37 | int len; | 34 | int len; |
38 | u8 nexthdr; | 35 | u8 nexthdr; |
diff --git a/net/ipv6/netfilter/ip6t_mh.c b/net/ipv6/netfilter/ip6t_mh.c index dd876274ff6e..2803258b6d07 100644 --- a/net/ipv6/netfilter/ip6t_mh.c +++ b/net/ipv6/netfilter/ip6t_mh.c | |||
@@ -37,32 +37,29 @@ type_match(u_int8_t min, u_int8_t max, u_int8_t type, bool invert) | |||
37 | return (type >= min && type <= max) ^ invert; | 37 | return (type >= min && type <= max) ^ invert; |
38 | } | 38 | } |
39 | 39 | ||
40 | static bool | 40 | static bool mh_mt6(const struct sk_buff *skb, const struct xt_match_param *par) |
41 | mh_mt6(const struct sk_buff *skb, const struct net_device *in, | ||
42 | const struct net_device *out, const struct xt_match *match, | ||
43 | const void *matchinfo, int offset, unsigned int protoff, bool *hotdrop) | ||
44 | { | 41 | { |
45 | struct ip6_mh _mh; | 42 | struct ip6_mh _mh; |
46 | const struct ip6_mh *mh; | 43 | const struct ip6_mh *mh; |
47 | const struct ip6t_mh *mhinfo = matchinfo; | 44 | const struct ip6t_mh *mhinfo = par->matchinfo; |
48 | 45 | ||
49 | /* Must not be a fragment. */ | 46 | /* Must not be a fragment. */ |
50 | if (offset) | 47 | if (par->fragoff != 0) |
51 | return false; | 48 | return false; |
52 | 49 | ||
53 | mh = skb_header_pointer(skb, protoff, sizeof(_mh), &_mh); | 50 | mh = skb_header_pointer(skb, par->thoff, sizeof(_mh), &_mh); |
54 | if (mh == NULL) { | 51 | if (mh == NULL) { |
55 | /* We've been asked to examine this packet, and we | 52 | /* We've been asked to examine this packet, and we |
56 | can't. Hence, no choice but to drop. */ | 53 | can't. Hence, no choice but to drop. */ |
57 | duprintf("Dropping evil MH tinygram.\n"); | 54 | duprintf("Dropping evil MH tinygram.\n"); |
58 | *hotdrop = true; | 55 | *par->hotdrop = true; |
59 | return false; | 56 | return false; |
60 | } | 57 | } |
61 | 58 | ||
62 | if (mh->ip6mh_proto != IPPROTO_NONE) { | 59 | if (mh->ip6mh_proto != IPPROTO_NONE) { |
63 | duprintf("Dropping invalid MH Payload Proto: %u\n", | 60 | duprintf("Dropping invalid MH Payload Proto: %u\n", |
64 | mh->ip6mh_proto); | 61 | mh->ip6mh_proto); |
65 | *hotdrop = true; | 62 | *par->hotdrop = true; |
66 | return false; | 63 | return false; |
67 | } | 64 | } |
68 | 65 | ||
diff --git a/net/ipv6/netfilter/ip6t_rt.c b/net/ipv6/netfilter/ip6t_rt.c index 7c544ae591d8..9cf4b8a37af7 100644 --- a/net/ipv6/netfilter/ip6t_rt.c +++ b/net/ipv6/netfilter/ip6t_rt.c | |||
@@ -36,14 +36,11 @@ segsleft_match(u_int32_t min, u_int32_t max, u_int32_t id, bool invert) | |||
36 | return r; | 36 | return r; |
37 | } | 37 | } |
38 | 38 | ||
39 | static bool | 39 | static bool rt_mt6(const struct sk_buff *skb, const struct xt_match_param *par) |
40 | rt_mt6(const struct sk_buff *skb, const struct net_device *in, | ||
41 | const struct net_device *out, const struct xt_match *match, | ||
42 | const void *matchinfo, int offset, unsigned int protoff, bool *hotdrop) | ||
43 | { | 40 | { |
44 | struct ipv6_rt_hdr _route; | 41 | struct ipv6_rt_hdr _route; |
45 | const struct ipv6_rt_hdr *rh; | 42 | const struct ipv6_rt_hdr *rh; |
46 | const struct ip6t_rt *rtinfo = matchinfo; | 43 | const struct ip6t_rt *rtinfo = par->matchinfo; |
47 | unsigned int temp; | 44 | unsigned int temp; |
48 | unsigned int ptr; | 45 | unsigned int ptr; |
49 | unsigned int hdrlen = 0; | 46 | unsigned int hdrlen = 0; |
@@ -55,13 +52,13 @@ rt_mt6(const struct sk_buff *skb, const struct net_device *in, | |||
55 | err = ipv6_find_hdr(skb, &ptr, NEXTHDR_ROUTING, NULL); | 52 | err = ipv6_find_hdr(skb, &ptr, NEXTHDR_ROUTING, NULL); |
56 | if (err < 0) { | 53 | if (err < 0) { |
57 | if (err != -ENOENT) | 54 | if (err != -ENOENT) |
58 | *hotdrop = true; | 55 | *par->hotdrop = true; |
59 | return false; | 56 | return false; |
60 | } | 57 | } |
61 | 58 | ||
62 | rh = skb_header_pointer(skb, ptr, sizeof(_route), &_route); | 59 | rh = skb_header_pointer(skb, ptr, sizeof(_route), &_route); |
63 | if (rh == NULL) { | 60 | if (rh == NULL) { |
64 | *hotdrop = true; | 61 | *par->hotdrop = true; |
65 | return false; | 62 | return false; |
66 | } | 63 | } |
67 | 64 | ||
diff --git a/net/netfilter/xt_comment.c b/net/netfilter/xt_comment.c index fa211b2ab874..bd7aa57af428 100644 --- a/net/netfilter/xt_comment.c +++ b/net/netfilter/xt_comment.c | |||
@@ -16,10 +16,7 @@ MODULE_ALIAS("ipt_comment"); | |||
16 | MODULE_ALIAS("ip6t_comment"); | 16 | MODULE_ALIAS("ip6t_comment"); |
17 | 17 | ||
18 | static bool | 18 | static bool |
19 | comment_mt(const struct sk_buff *skb, const struct net_device *in, | 19 | comment_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
20 | const struct net_device *out, const struct xt_match *match, | ||
21 | const void *matchinfo, int offset, unsigned int protooff, | ||
22 | bool *hotdrop) | ||
23 | { | 20 | { |
24 | /* We always match */ | 21 | /* We always match */ |
25 | return true; | 22 | return true; |
diff --git a/net/netfilter/xt_connbytes.c b/net/netfilter/xt_connbytes.c index d2cd22a49c96..30c19b5fe908 100644 --- a/net/netfilter/xt_connbytes.c +++ b/net/netfilter/xt_connbytes.c | |||
@@ -17,12 +17,9 @@ MODULE_ALIAS("ipt_connbytes"); | |||
17 | MODULE_ALIAS("ip6t_connbytes"); | 17 | MODULE_ALIAS("ip6t_connbytes"); |
18 | 18 | ||
19 | static bool | 19 | static bool |
20 | connbytes_mt(const struct sk_buff *skb, const struct net_device *in, | 20 | connbytes_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
21 | const struct net_device *out, const struct xt_match *match, | ||
22 | const void *matchinfo, int offset, unsigned int protoff, | ||
23 | bool *hotdrop) | ||
24 | { | 21 | { |
25 | const struct xt_connbytes_info *sinfo = matchinfo; | 22 | const struct xt_connbytes_info *sinfo = par->matchinfo; |
26 | const struct nf_conn *ct; | 23 | const struct nf_conn *ct; |
27 | enum ip_conntrack_info ctinfo; | 24 | enum ip_conntrack_info ctinfo; |
28 | u_int64_t what = 0; /* initialize to make gcc happy */ | 25 | u_int64_t what = 0; /* initialize to make gcc happy */ |
diff --git a/net/netfilter/xt_connlimit.c b/net/netfilter/xt_connlimit.c index bd00830ff697..8b8f70e76646 100644 --- a/net/netfilter/xt_connlimit.c +++ b/net/netfilter/xt_connlimit.c | |||
@@ -178,12 +178,9 @@ static int count_them(struct xt_connlimit_data *data, | |||
178 | } | 178 | } |
179 | 179 | ||
180 | static bool | 180 | static bool |
181 | connlimit_mt(const struct sk_buff *skb, const struct net_device *in, | 181 | connlimit_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
182 | const struct net_device *out, const struct xt_match *match, | ||
183 | const void *matchinfo, int offset, unsigned int protoff, | ||
184 | bool *hotdrop) | ||
185 | { | 182 | { |
186 | const struct xt_connlimit_info *info = matchinfo; | 183 | const struct xt_connlimit_info *info = par->matchinfo; |
187 | union nf_inet_addr addr; | 184 | union nf_inet_addr addr; |
188 | struct nf_conntrack_tuple tuple; | 185 | struct nf_conntrack_tuple tuple; |
189 | const struct nf_conntrack_tuple *tuple_ptr = &tuple; | 186 | const struct nf_conntrack_tuple *tuple_ptr = &tuple; |
@@ -195,10 +192,10 @@ connlimit_mt(const struct sk_buff *skb, const struct net_device *in, | |||
195 | if (ct != NULL) | 192 | if (ct != NULL) |
196 | tuple_ptr = &ct->tuplehash[0].tuple; | 193 | tuple_ptr = &ct->tuplehash[0].tuple; |
197 | else if (!nf_ct_get_tuplepr(skb, skb_network_offset(skb), | 194 | else if (!nf_ct_get_tuplepr(skb, skb_network_offset(skb), |
198 | match->family, &tuple)) | 195 | par->match->family, &tuple)) |
199 | goto hotdrop; | 196 | goto hotdrop; |
200 | 197 | ||
201 | if (match->family == NFPROTO_IPV6) { | 198 | if (par->match->family == NFPROTO_IPV6) { |
202 | const struct ipv6hdr *iph = ipv6_hdr(skb); | 199 | const struct ipv6hdr *iph = ipv6_hdr(skb); |
203 | memcpy(&addr.ip6, &iph->saddr, sizeof(iph->saddr)); | 200 | memcpy(&addr.ip6, &iph->saddr, sizeof(iph->saddr)); |
204 | } else { | 201 | } else { |
@@ -208,19 +205,19 @@ connlimit_mt(const struct sk_buff *skb, const struct net_device *in, | |||
208 | 205 | ||
209 | spin_lock_bh(&info->data->lock); | 206 | spin_lock_bh(&info->data->lock); |
210 | connections = count_them(info->data, tuple_ptr, &addr, | 207 | connections = count_them(info->data, tuple_ptr, &addr, |
211 | &info->mask, match); | 208 | &info->mask, par->match); |
212 | spin_unlock_bh(&info->data->lock); | 209 | spin_unlock_bh(&info->data->lock); |
213 | 210 | ||
214 | if (connections < 0) { | 211 | if (connections < 0) { |
215 | /* kmalloc failed, drop it entirely */ | 212 | /* kmalloc failed, drop it entirely */ |
216 | *hotdrop = true; | 213 | *par->hotdrop = true; |
217 | return false; | 214 | return false; |
218 | } | 215 | } |
219 | 216 | ||
220 | return (connections > info->limit) ^ info->inverse; | 217 | return (connections > info->limit) ^ info->inverse; |
221 | 218 | ||
222 | hotdrop: | 219 | hotdrop: |
223 | *hotdrop = true; | 220 | *par->hotdrop = true; |
224 | return false; | 221 | return false; |
225 | } | 222 | } |
226 | 223 | ||
diff --git a/net/netfilter/xt_connmark.c b/net/netfilter/xt_connmark.c index 0577b8ff4e1e..df4f4a865a5e 100644 --- a/net/netfilter/xt_connmark.c +++ b/net/netfilter/xt_connmark.c | |||
@@ -34,12 +34,9 @@ MODULE_ALIAS("ipt_connmark"); | |||
34 | MODULE_ALIAS("ip6t_connmark"); | 34 | MODULE_ALIAS("ip6t_connmark"); |
35 | 35 | ||
36 | static bool | 36 | static bool |
37 | connmark_mt(const struct sk_buff *skb, const struct net_device *in, | 37 | connmark_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
38 | const struct net_device *out, const struct xt_match *match, | ||
39 | const void *matchinfo, int offset, unsigned int protoff, | ||
40 | bool *hotdrop) | ||
41 | { | 38 | { |
42 | const struct xt_connmark_mtinfo1 *info = matchinfo; | 39 | const struct xt_connmark_mtinfo1 *info = par->matchinfo; |
43 | enum ip_conntrack_info ctinfo; | 40 | enum ip_conntrack_info ctinfo; |
44 | const struct nf_conn *ct; | 41 | const struct nf_conn *ct; |
45 | 42 | ||
@@ -51,12 +48,9 @@ connmark_mt(const struct sk_buff *skb, const struct net_device *in, | |||
51 | } | 48 | } |
52 | 49 | ||
53 | static bool | 50 | static bool |
54 | connmark_mt_v0(const struct sk_buff *skb, const struct net_device *in, | 51 | connmark_mt_v0(const struct sk_buff *skb, const struct xt_match_param *par) |
55 | const struct net_device *out, const struct xt_match *match, | ||
56 | const void *matchinfo, int offset, unsigned int protoff, | ||
57 | bool *hotdrop) | ||
58 | { | 52 | { |
59 | const struct xt_connmark_info *info = matchinfo; | 53 | const struct xt_connmark_info *info = par->matchinfo; |
60 | const struct nf_conn *ct; | 54 | const struct nf_conn *ct; |
61 | enum ip_conntrack_info ctinfo; | 55 | enum ip_conntrack_info ctinfo; |
62 | 56 | ||
diff --git a/net/netfilter/xt_conntrack.c b/net/netfilter/xt_conntrack.c index 392b457f9c22..13a7e4eacdfd 100644 --- a/net/netfilter/xt_conntrack.c +++ b/net/netfilter/xt_conntrack.c | |||
@@ -25,12 +25,9 @@ MODULE_ALIAS("ipt_conntrack"); | |||
25 | MODULE_ALIAS("ip6t_conntrack"); | 25 | MODULE_ALIAS("ip6t_conntrack"); |
26 | 26 | ||
27 | static bool | 27 | static bool |
28 | conntrack_mt_v0(const struct sk_buff *skb, const struct net_device *in, | 28 | conntrack_mt_v0(const struct sk_buff *skb, const struct xt_match_param *par) |
29 | const struct net_device *out, const struct xt_match *match, | ||
30 | const void *matchinfo, int offset, unsigned int protoff, | ||
31 | bool *hotdrop) | ||
32 | { | 29 | { |
33 | const struct xt_conntrack_info *sinfo = matchinfo; | 30 | const struct xt_conntrack_info *sinfo = par->matchinfo; |
34 | const struct nf_conn *ct; | 31 | const struct nf_conn *ct; |
35 | enum ip_conntrack_info ctinfo; | 32 | enum ip_conntrack_info ctinfo; |
36 | unsigned int statebit; | 33 | unsigned int statebit; |
@@ -205,12 +202,9 @@ ct_proto_port_check(const struct xt_conntrack_mtinfo1 *info, | |||
205 | } | 202 | } |
206 | 203 | ||
207 | static bool | 204 | static bool |
208 | conntrack_mt(const struct sk_buff *skb, const struct net_device *in, | 205 | conntrack_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
209 | const struct net_device *out, const struct xt_match *match, | ||
210 | const void *matchinfo, int offset, unsigned int protoff, | ||
211 | bool *hotdrop) | ||
212 | { | 206 | { |
213 | const struct xt_conntrack_mtinfo1 *info = matchinfo; | 207 | const struct xt_conntrack_mtinfo1 *info = par->matchinfo; |
214 | enum ip_conntrack_info ctinfo; | 208 | enum ip_conntrack_info ctinfo; |
215 | const struct nf_conn *ct; | 209 | const struct nf_conn *ct; |
216 | unsigned int statebit; | 210 | unsigned int statebit; |
@@ -244,22 +238,22 @@ conntrack_mt(const struct sk_buff *skb, const struct net_device *in, | |||
244 | return false; | 238 | return false; |
245 | 239 | ||
246 | if (info->match_flags & XT_CONNTRACK_ORIGSRC) | 240 | if (info->match_flags & XT_CONNTRACK_ORIGSRC) |
247 | if (conntrack_mt_origsrc(ct, info, match->family) ^ | 241 | if (conntrack_mt_origsrc(ct, info, par->match->family) ^ |
248 | !(info->invert_flags & XT_CONNTRACK_ORIGSRC)) | 242 | !(info->invert_flags & XT_CONNTRACK_ORIGSRC)) |
249 | return false; | 243 | return false; |
250 | 244 | ||
251 | if (info->match_flags & XT_CONNTRACK_ORIGDST) | 245 | if (info->match_flags & XT_CONNTRACK_ORIGDST) |
252 | if (conntrack_mt_origdst(ct, info, match->family) ^ | 246 | if (conntrack_mt_origdst(ct, info, par->match->family) ^ |
253 | !(info->invert_flags & XT_CONNTRACK_ORIGDST)) | 247 | !(info->invert_flags & XT_CONNTRACK_ORIGDST)) |
254 | return false; | 248 | return false; |
255 | 249 | ||
256 | if (info->match_flags & XT_CONNTRACK_REPLSRC) | 250 | if (info->match_flags & XT_CONNTRACK_REPLSRC) |
257 | if (conntrack_mt_replsrc(ct, info, match->family) ^ | 251 | if (conntrack_mt_replsrc(ct, info, par->match->family) ^ |
258 | !(info->invert_flags & XT_CONNTRACK_REPLSRC)) | 252 | !(info->invert_flags & XT_CONNTRACK_REPLSRC)) |
259 | return false; | 253 | return false; |
260 | 254 | ||
261 | if (info->match_flags & XT_CONNTRACK_REPLDST) | 255 | if (info->match_flags & XT_CONNTRACK_REPLDST) |
262 | if (conntrack_mt_repldst(ct, info, match->family) ^ | 256 | if (conntrack_mt_repldst(ct, info, par->match->family) ^ |
263 | !(info->invert_flags & XT_CONNTRACK_REPLDST)) | 257 | !(info->invert_flags & XT_CONNTRACK_REPLDST)) |
264 | return false; | 258 | return false; |
265 | 259 | ||
diff --git a/net/netfilter/xt_dccp.c b/net/netfilter/xt_dccp.c index 87971f47132d..7aa30bb91050 100644 --- a/net/netfilter/xt_dccp.c +++ b/net/netfilter/xt_dccp.c | |||
@@ -93,20 +93,18 @@ match_option(u_int8_t option, const struct sk_buff *skb, unsigned int protoff, | |||
93 | } | 93 | } |
94 | 94 | ||
95 | static bool | 95 | static bool |
96 | dccp_mt(const struct sk_buff *skb, const struct net_device *in, | 96 | dccp_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
97 | const struct net_device *out, const struct xt_match *match, | ||
98 | const void *matchinfo, int offset, unsigned int protoff, bool *hotdrop) | ||
99 | { | 97 | { |
100 | const struct xt_dccp_info *info = matchinfo; | 98 | const struct xt_dccp_info *info = par->matchinfo; |
101 | const struct dccp_hdr *dh; | 99 | const struct dccp_hdr *dh; |
102 | struct dccp_hdr _dh; | 100 | struct dccp_hdr _dh; |
103 | 101 | ||
104 | if (offset) | 102 | if (par->fragoff != 0) |
105 | return false; | 103 | return false; |
106 | 104 | ||
107 | dh = skb_header_pointer(skb, protoff, sizeof(_dh), &_dh); | 105 | dh = skb_header_pointer(skb, par->thoff, sizeof(_dh), &_dh); |
108 | if (dh == NULL) { | 106 | if (dh == NULL) { |
109 | *hotdrop = true; | 107 | *par->hotdrop = true; |
110 | return false; | 108 | return false; |
111 | } | 109 | } |
112 | 110 | ||
@@ -118,8 +116,8 @@ dccp_mt(const struct sk_buff *skb, const struct net_device *in, | |||
118 | XT_DCCP_DEST_PORTS, info->flags, info->invflags) | 116 | XT_DCCP_DEST_PORTS, info->flags, info->invflags) |
119 | && DCCHECK(match_types(dh, info->typemask), | 117 | && DCCHECK(match_types(dh, info->typemask), |
120 | XT_DCCP_TYPE, info->flags, info->invflags) | 118 | XT_DCCP_TYPE, info->flags, info->invflags) |
121 | && DCCHECK(match_option(info->option, skb, protoff, dh, | 119 | && DCCHECK(match_option(info->option, skb, par->thoff, dh, |
122 | hotdrop), | 120 | par->hotdrop), |
123 | XT_DCCP_OPTION, info->flags, info->invflags); | 121 | XT_DCCP_OPTION, info->flags, info->invflags); |
124 | } | 122 | } |
125 | 123 | ||
diff --git a/net/netfilter/xt_dscp.c b/net/netfilter/xt_dscp.c index 7f03aa13a955..57d612061358 100644 --- a/net/netfilter/xt_dscp.c +++ b/net/netfilter/xt_dscp.c | |||
@@ -26,23 +26,18 @@ MODULE_ALIAS("ipt_tos"); | |||
26 | MODULE_ALIAS("ip6t_tos"); | 26 | MODULE_ALIAS("ip6t_tos"); |
27 | 27 | ||
28 | static bool | 28 | static bool |
29 | dscp_mt(const struct sk_buff *skb, const struct net_device *in, | 29 | dscp_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
30 | const struct net_device *out, const struct xt_match *match, | ||
31 | const void *matchinfo, int offset, unsigned int protoff, bool *hotdrop) | ||
32 | { | 30 | { |
33 | const struct xt_dscp_info *info = matchinfo; | 31 | const struct xt_dscp_info *info = par->matchinfo; |
34 | u_int8_t dscp = ipv4_get_dsfield(ip_hdr(skb)) >> XT_DSCP_SHIFT; | 32 | u_int8_t dscp = ipv4_get_dsfield(ip_hdr(skb)) >> XT_DSCP_SHIFT; |
35 | 33 | ||
36 | return (dscp == info->dscp) ^ !!info->invert; | 34 | return (dscp == info->dscp) ^ !!info->invert; |
37 | } | 35 | } |
38 | 36 | ||
39 | static bool | 37 | static bool |
40 | dscp_mt6(const struct sk_buff *skb, const struct net_device *in, | 38 | dscp_mt6(const struct sk_buff *skb, const struct xt_match_param *par) |
41 | const struct net_device *out, const struct xt_match *match, | ||
42 | const void *matchinfo, int offset, unsigned int protoff, | ||
43 | bool *hotdrop) | ||
44 | { | 39 | { |
45 | const struct xt_dscp_info *info = matchinfo; | 40 | const struct xt_dscp_info *info = par->matchinfo; |
46 | u_int8_t dscp = ipv6_get_dsfield(ipv6_hdr(skb)) >> XT_DSCP_SHIFT; | 41 | u_int8_t dscp = ipv6_get_dsfield(ipv6_hdr(skb)) >> XT_DSCP_SHIFT; |
47 | 42 | ||
48 | return (dscp == info->dscp) ^ !!info->invert; | 43 | return (dscp == info->dscp) ^ !!info->invert; |
@@ -63,24 +58,19 @@ dscp_mt_check(const char *tablename, const void *info, | |||
63 | return true; | 58 | return true; |
64 | } | 59 | } |
65 | 60 | ||
66 | static bool tos_mt_v0(const struct sk_buff *skb, const struct net_device *in, | 61 | static bool |
67 | const struct net_device *out, | 62 | tos_mt_v0(const struct sk_buff *skb, const struct xt_match_param *par) |
68 | const struct xt_match *match, const void *matchinfo, | ||
69 | int offset, unsigned int protoff, bool *hotdrop) | ||
70 | { | 63 | { |
71 | const struct ipt_tos_info *info = matchinfo; | 64 | const struct ipt_tos_info *info = par->matchinfo; |
72 | 65 | ||
73 | return (ip_hdr(skb)->tos == info->tos) ^ info->invert; | 66 | return (ip_hdr(skb)->tos == info->tos) ^ info->invert; |
74 | } | 67 | } |
75 | 68 | ||
76 | static bool tos_mt(const struct sk_buff *skb, const struct net_device *in, | 69 | static bool tos_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
77 | const struct net_device *out, const struct xt_match *match, | ||
78 | const void *matchinfo, int offset, unsigned int protoff, | ||
79 | bool *hotdrop) | ||
80 | { | 70 | { |
81 | const struct xt_tos_match_info *info = matchinfo; | 71 | const struct xt_tos_match_info *info = par->matchinfo; |
82 | 72 | ||
83 | if (match->family == NFPROTO_IPV4) | 73 | if (par->match->family == NFPROTO_IPV4) |
84 | return ((ip_hdr(skb)->tos & info->tos_mask) == | 74 | return ((ip_hdr(skb)->tos & info->tos_mask) == |
85 | info->tos_value) ^ !!info->invert; | 75 | info->tos_value) ^ !!info->invert; |
86 | else | 76 | else |
diff --git a/net/netfilter/xt_esp.c b/net/netfilter/xt_esp.c index 045c4deecafc..6d59f2e7c1c1 100644 --- a/net/netfilter/xt_esp.c +++ b/net/netfilter/xt_esp.c | |||
@@ -42,26 +42,23 @@ spi_match(u_int32_t min, u_int32_t max, u_int32_t spi, bool invert) | |||
42 | return r; | 42 | return r; |
43 | } | 43 | } |
44 | 44 | ||
45 | static bool | 45 | static bool esp_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
46 | esp_mt(const struct sk_buff *skb, const struct net_device *in, | ||
47 | const struct net_device *out, const struct xt_match *match, | ||
48 | const void *matchinfo, int offset, unsigned int protoff, bool *hotdrop) | ||
49 | { | 46 | { |
50 | const struct ip_esp_hdr *eh; | 47 | const struct ip_esp_hdr *eh; |
51 | struct ip_esp_hdr _esp; | 48 | struct ip_esp_hdr _esp; |
52 | const struct xt_esp *espinfo = matchinfo; | 49 | const struct xt_esp *espinfo = par->matchinfo; |
53 | 50 | ||
54 | /* Must not be a fragment. */ | 51 | /* Must not be a fragment. */ |
55 | if (offset) | 52 | if (par->fragoff != 0) |
56 | return false; | 53 | return false; |
57 | 54 | ||
58 | eh = skb_header_pointer(skb, protoff, sizeof(_esp), &_esp); | 55 | eh = skb_header_pointer(skb, par->thoff, sizeof(_esp), &_esp); |
59 | if (eh == NULL) { | 56 | if (eh == NULL) { |
60 | /* We've been asked to examine this packet, and we | 57 | /* We've been asked to examine this packet, and we |
61 | * can't. Hence, no choice but to drop. | 58 | * can't. Hence, no choice but to drop. |
62 | */ | 59 | */ |
63 | duprintf("Dropping evil ESP tinygram.\n"); | 60 | duprintf("Dropping evil ESP tinygram.\n"); |
64 | *hotdrop = true; | 61 | *par->hotdrop = true; |
65 | return false; | 62 | return false; |
66 | } | 63 | } |
67 | 64 | ||
diff --git a/net/netfilter/xt_hashlimit.c b/net/netfilter/xt_hashlimit.c index 7bae369603d7..22a60a728cf1 100644 --- a/net/netfilter/xt_hashlimit.c +++ b/net/netfilter/xt_hashlimit.c | |||
@@ -563,19 +563,16 @@ hashlimit_init_dst(const struct xt_hashlimit_htable *hinfo, | |||
563 | } | 563 | } |
564 | 564 | ||
565 | static bool | 565 | static bool |
566 | hashlimit_mt_v0(const struct sk_buff *skb, const struct net_device *in, | 566 | hashlimit_mt_v0(const struct sk_buff *skb, const struct xt_match_param *par) |
567 | const struct net_device *out, const struct xt_match *match, | ||
568 | const void *matchinfo, int offset, unsigned int protoff, | ||
569 | bool *hotdrop) | ||
570 | { | 567 | { |
571 | const struct xt_hashlimit_info *r = | 568 | const struct xt_hashlimit_info *r = |
572 | ((const struct xt_hashlimit_info *)matchinfo)->u.master; | 569 | ((const struct xt_hashlimit_info *)par->matchinfo)->u.master; |
573 | struct xt_hashlimit_htable *hinfo = r->hinfo; | 570 | struct xt_hashlimit_htable *hinfo = r->hinfo; |
574 | unsigned long now = jiffies; | 571 | unsigned long now = jiffies; |
575 | struct dsthash_ent *dh; | 572 | struct dsthash_ent *dh; |
576 | struct dsthash_dst dst; | 573 | struct dsthash_dst dst; |
577 | 574 | ||
578 | if (hashlimit_init_dst(hinfo, &dst, skb, protoff) < 0) | 575 | if (hashlimit_init_dst(hinfo, &dst, skb, par->thoff) < 0) |
579 | goto hotdrop; | 576 | goto hotdrop; |
580 | 577 | ||
581 | spin_lock_bh(&hinfo->lock); | 578 | spin_lock_bh(&hinfo->lock); |
@@ -613,23 +610,20 @@ hashlimit_mt_v0(const struct sk_buff *skb, const struct net_device *in, | |||
613 | return false; | 610 | return false; |
614 | 611 | ||
615 | hotdrop: | 612 | hotdrop: |
616 | *hotdrop = true; | 613 | *par->hotdrop = true; |
617 | return false; | 614 | return false; |
618 | } | 615 | } |
619 | 616 | ||
620 | static bool | 617 | static bool |
621 | hashlimit_mt(const struct sk_buff *skb, const struct net_device *in, | 618 | hashlimit_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
622 | const struct net_device *out, const struct xt_match *match, | ||
623 | const void *matchinfo, int offset, unsigned int protoff, | ||
624 | bool *hotdrop) | ||
625 | { | 619 | { |
626 | const struct xt_hashlimit_mtinfo1 *info = matchinfo; | 620 | const struct xt_hashlimit_mtinfo1 *info = par->matchinfo; |
627 | struct xt_hashlimit_htable *hinfo = info->hinfo; | 621 | struct xt_hashlimit_htable *hinfo = info->hinfo; |
628 | unsigned long now = jiffies; | 622 | unsigned long now = jiffies; |
629 | struct dsthash_ent *dh; | 623 | struct dsthash_ent *dh; |
630 | struct dsthash_dst dst; | 624 | struct dsthash_dst dst; |
631 | 625 | ||
632 | if (hashlimit_init_dst(hinfo, &dst, skb, protoff) < 0) | 626 | if (hashlimit_init_dst(hinfo, &dst, skb, par->thoff) < 0) |
633 | goto hotdrop; | 627 | goto hotdrop; |
634 | 628 | ||
635 | spin_lock_bh(&hinfo->lock); | 629 | spin_lock_bh(&hinfo->lock); |
@@ -666,7 +660,7 @@ hashlimit_mt(const struct sk_buff *skb, const struct net_device *in, | |||
666 | return info->cfg.mode & XT_HASHLIMIT_INVERT; | 660 | return info->cfg.mode & XT_HASHLIMIT_INVERT; |
667 | 661 | ||
668 | hotdrop: | 662 | hotdrop: |
669 | *hotdrop = true; | 663 | *par->hotdrop = true; |
670 | return false; | 664 | return false; |
671 | } | 665 | } |
672 | 666 | ||
diff --git a/net/netfilter/xt_helper.c b/net/netfilter/xt_helper.c index 134d94324eb9..73bdc3ba13fc 100644 --- a/net/netfilter/xt_helper.c +++ b/net/netfilter/xt_helper.c | |||
@@ -24,12 +24,9 @@ MODULE_ALIAS("ip6t_helper"); | |||
24 | 24 | ||
25 | 25 | ||
26 | static bool | 26 | static bool |
27 | helper_mt(const struct sk_buff *skb, const struct net_device *in, | 27 | helper_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
28 | const struct net_device *out, const struct xt_match *match, | ||
29 | const void *matchinfo, int offset, unsigned int protoff, | ||
30 | bool *hotdrop) | ||
31 | { | 28 | { |
32 | const struct xt_helper_info *info = matchinfo; | 29 | const struct xt_helper_info *info = par->matchinfo; |
33 | const struct nf_conn *ct; | 30 | const struct nf_conn *ct; |
34 | const struct nf_conn_help *master_help; | 31 | const struct nf_conn_help *master_help; |
35 | const struct nf_conntrack_helper *helper; | 32 | const struct nf_conntrack_helper *helper; |
diff --git a/net/netfilter/xt_iprange.c b/net/netfilter/xt_iprange.c index a7498cc48dca..6f62c36948d9 100644 --- a/net/netfilter/xt_iprange.c +++ b/net/netfilter/xt_iprange.c | |||
@@ -17,12 +17,9 @@ | |||
17 | #include <linux/netfilter_ipv4/ipt_iprange.h> | 17 | #include <linux/netfilter_ipv4/ipt_iprange.h> |
18 | 18 | ||
19 | static bool | 19 | static bool |
20 | iprange_mt_v0(const struct sk_buff *skb, const struct net_device *in, | 20 | iprange_mt_v0(const struct sk_buff *skb, const struct xt_match_param *par) |
21 | const struct net_device *out, const struct xt_match *match, | ||
22 | const void *matchinfo, int offset, unsigned int protoff, | ||
23 | bool *hotdrop) | ||
24 | { | 21 | { |
25 | const struct ipt_iprange_info *info = matchinfo; | 22 | const struct ipt_iprange_info *info = par->matchinfo; |
26 | const struct iphdr *iph = ip_hdr(skb); | 23 | const struct iphdr *iph = ip_hdr(skb); |
27 | 24 | ||
28 | if (info->flags & IPRANGE_SRC) { | 25 | if (info->flags & IPRANGE_SRC) { |
@@ -55,12 +52,9 @@ iprange_mt_v0(const struct sk_buff *skb, const struct net_device *in, | |||
55 | } | 52 | } |
56 | 53 | ||
57 | static bool | 54 | static bool |
58 | iprange_mt4(const struct sk_buff *skb, const struct net_device *in, | 55 | iprange_mt4(const struct sk_buff *skb, const struct xt_match_param *par) |
59 | const struct net_device *out, const struct xt_match *match, | ||
60 | const void *matchinfo, int offset, unsigned int protoff, | ||
61 | bool *hotdrop) | ||
62 | { | 56 | { |
63 | const struct xt_iprange_mtinfo *info = matchinfo; | 57 | const struct xt_iprange_mtinfo *info = par->matchinfo; |
64 | const struct iphdr *iph = ip_hdr(skb); | 58 | const struct iphdr *iph = ip_hdr(skb); |
65 | bool m; | 59 | bool m; |
66 | 60 | ||
@@ -111,12 +105,9 @@ iprange_ipv6_sub(const struct in6_addr *a, const struct in6_addr *b) | |||
111 | } | 105 | } |
112 | 106 | ||
113 | static bool | 107 | static bool |
114 | iprange_mt6(const struct sk_buff *skb, const struct net_device *in, | 108 | iprange_mt6(const struct sk_buff *skb, const struct xt_match_param *par) |
115 | const struct net_device *out, const struct xt_match *match, | ||
116 | const void *matchinfo, int offset, unsigned int protoff, | ||
117 | bool *hotdrop) | ||
118 | { | 109 | { |
119 | const struct xt_iprange_mtinfo *info = matchinfo; | 110 | const struct xt_iprange_mtinfo *info = par->matchinfo; |
120 | const struct ipv6hdr *iph = ipv6_hdr(skb); | 111 | const struct ipv6hdr *iph = ipv6_hdr(skb); |
121 | bool m; | 112 | bool m; |
122 | 113 | ||
diff --git a/net/netfilter/xt_length.c b/net/netfilter/xt_length.c index b8612d1914b7..c4871ca6c86d 100644 --- a/net/netfilter/xt_length.c +++ b/net/netfilter/xt_length.c | |||
@@ -21,24 +21,18 @@ MODULE_ALIAS("ipt_length"); | |||
21 | MODULE_ALIAS("ip6t_length"); | 21 | MODULE_ALIAS("ip6t_length"); |
22 | 22 | ||
23 | static bool | 23 | static bool |
24 | length_mt(const struct sk_buff *skb, const struct net_device *in, | 24 | length_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
25 | const struct net_device *out, const struct xt_match *match, | ||
26 | const void *matchinfo, int offset, unsigned int protoff, | ||
27 | bool *hotdrop) | ||
28 | { | 25 | { |
29 | const struct xt_length_info *info = matchinfo; | 26 | const struct xt_length_info *info = par->matchinfo; |
30 | u_int16_t pktlen = ntohs(ip_hdr(skb)->tot_len); | 27 | u_int16_t pktlen = ntohs(ip_hdr(skb)->tot_len); |
31 | 28 | ||
32 | return (pktlen >= info->min && pktlen <= info->max) ^ info->invert; | 29 | return (pktlen >= info->min && pktlen <= info->max) ^ info->invert; |
33 | } | 30 | } |
34 | 31 | ||
35 | static bool | 32 | static bool |
36 | length_mt6(const struct sk_buff *skb, const struct net_device *in, | 33 | length_mt6(const struct sk_buff *skb, const struct xt_match_param *par) |
37 | const struct net_device *out, const struct xt_match *match, | ||
38 | const void *matchinfo, int offset, unsigned int protoff, | ||
39 | bool *hotdrop) | ||
40 | { | 34 | { |
41 | const struct xt_length_info *info = matchinfo; | 35 | const struct xt_length_info *info = par->matchinfo; |
42 | const u_int16_t pktlen = ntohs(ipv6_hdr(skb)->payload_len) + | 36 | const u_int16_t pktlen = ntohs(ipv6_hdr(skb)->payload_len) + |
43 | sizeof(struct ipv6hdr); | 37 | sizeof(struct ipv6hdr); |
44 | 38 | ||
diff --git a/net/netfilter/xt_limit.c b/net/netfilter/xt_limit.c index 00247bd1095e..c475eac5dbec 100644 --- a/net/netfilter/xt_limit.c +++ b/net/netfilter/xt_limit.c | |||
@@ -58,13 +58,10 @@ static DEFINE_SPINLOCK(limit_lock); | |||
58 | #define CREDITS_PER_JIFFY POW2_BELOW32(MAX_CPJ) | 58 | #define CREDITS_PER_JIFFY POW2_BELOW32(MAX_CPJ) |
59 | 59 | ||
60 | static bool | 60 | static bool |
61 | limit_mt(const struct sk_buff *skb, const struct net_device *in, | 61 | limit_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
62 | const struct net_device *out, const struct xt_match *match, | ||
63 | const void *matchinfo, int offset, unsigned int protoff, | ||
64 | bool *hotdrop) | ||
65 | { | 62 | { |
66 | struct xt_rateinfo *r = | 63 | struct xt_rateinfo *r = |
67 | ((const struct xt_rateinfo *)matchinfo)->master; | 64 | ((const struct xt_rateinfo *)par->matchinfo)->master; |
68 | unsigned long now = jiffies; | 65 | unsigned long now = jiffies; |
69 | 66 | ||
70 | spin_lock_bh(&limit_lock); | 67 | spin_lock_bh(&limit_lock); |
diff --git a/net/netfilter/xt_mac.c b/net/netfilter/xt_mac.c index 60db240098ac..269f9d8aef5f 100644 --- a/net/netfilter/xt_mac.c +++ b/net/netfilter/xt_mac.c | |||
@@ -24,12 +24,9 @@ MODULE_DESCRIPTION("Xtables: MAC address match"); | |||
24 | MODULE_ALIAS("ipt_mac"); | 24 | MODULE_ALIAS("ipt_mac"); |
25 | MODULE_ALIAS("ip6t_mac"); | 25 | MODULE_ALIAS("ip6t_mac"); |
26 | 26 | ||
27 | static bool | 27 | static bool mac_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
28 | mac_mt(const struct sk_buff *skb, const struct net_device *in, | ||
29 | const struct net_device *out, const struct xt_match *match, | ||
30 | const void *matchinfo, int offset, unsigned int protoff, bool *hotdrop) | ||
31 | { | 28 | { |
32 | const struct xt_mac_info *info = matchinfo; | 29 | const struct xt_mac_info *info = par->matchinfo; |
33 | 30 | ||
34 | /* Is mac pointer valid? */ | 31 | /* Is mac pointer valid? */ |
35 | return skb_mac_header(skb) >= skb->head && | 32 | return skb_mac_header(skb) >= skb->head && |
diff --git a/net/netfilter/xt_mark.c b/net/netfilter/xt_mark.c index 96dd2b63b6b6..885476146531 100644 --- a/net/netfilter/xt_mark.c +++ b/net/netfilter/xt_mark.c | |||
@@ -23,22 +23,17 @@ MODULE_ALIAS("ipt_mark"); | |||
23 | MODULE_ALIAS("ip6t_mark"); | 23 | MODULE_ALIAS("ip6t_mark"); |
24 | 24 | ||
25 | static bool | 25 | static bool |
26 | mark_mt_v0(const struct sk_buff *skb, const struct net_device *in, | 26 | mark_mt_v0(const struct sk_buff *skb, const struct xt_match_param *par) |
27 | const struct net_device *out, const struct xt_match *match, | ||
28 | const void *matchinfo, int offset, unsigned int protoff, | ||
29 | bool *hotdrop) | ||
30 | { | 27 | { |
31 | const struct xt_mark_info *info = matchinfo; | 28 | const struct xt_mark_info *info = par->matchinfo; |
32 | 29 | ||
33 | return ((skb->mark & info->mask) == info->mark) ^ info->invert; | 30 | return ((skb->mark & info->mask) == info->mark) ^ info->invert; |
34 | } | 31 | } |
35 | 32 | ||
36 | static bool | 33 | static bool |
37 | mark_mt(const struct sk_buff *skb, const struct net_device *in, | 34 | mark_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
38 | const struct net_device *out, const struct xt_match *match, | ||
39 | const void *matchinfo, int offset, unsigned int protoff, bool *hotdrop) | ||
40 | { | 35 | { |
41 | const struct xt_mark_mtinfo1 *info = matchinfo; | 36 | const struct xt_mark_mtinfo1 *info = par->matchinfo; |
42 | 37 | ||
43 | return ((skb->mark & info->mask) == info->mark) ^ info->invert; | 38 | return ((skb->mark & info->mask) == info->mark) ^ info->invert; |
44 | } | 39 | } |
diff --git a/net/netfilter/xt_multiport.c b/net/netfilter/xt_multiport.c index f6fe008ab8c3..7087e291528d 100644 --- a/net/netfilter/xt_multiport.c +++ b/net/netfilter/xt_multiport.c | |||
@@ -95,25 +95,22 @@ ports_match_v1(const struct xt_multiport_v1 *minfo, | |||
95 | } | 95 | } |
96 | 96 | ||
97 | static bool | 97 | static bool |
98 | multiport_mt_v0(const struct sk_buff *skb, const struct net_device *in, | 98 | multiport_mt_v0(const struct sk_buff *skb, const struct xt_match_param *par) |
99 | const struct net_device *out, const struct xt_match *match, | ||
100 | const void *matchinfo, int offset, unsigned int protoff, | ||
101 | bool *hotdrop) | ||
102 | { | 99 | { |
103 | const __be16 *pptr; | 100 | const __be16 *pptr; |
104 | __be16 _ports[2]; | 101 | __be16 _ports[2]; |
105 | const struct xt_multiport *multiinfo = matchinfo; | 102 | const struct xt_multiport *multiinfo = par->matchinfo; |
106 | 103 | ||
107 | if (offset) | 104 | if (par->fragoff != 0) |
108 | return false; | 105 | return false; |
109 | 106 | ||
110 | pptr = skb_header_pointer(skb, protoff, sizeof(_ports), _ports); | 107 | pptr = skb_header_pointer(skb, par->thoff, sizeof(_ports), _ports); |
111 | if (pptr == NULL) { | 108 | if (pptr == NULL) { |
112 | /* We've been asked to examine this packet, and we | 109 | /* We've been asked to examine this packet, and we |
113 | * can't. Hence, no choice but to drop. | 110 | * can't. Hence, no choice but to drop. |
114 | */ | 111 | */ |
115 | duprintf("xt_multiport: Dropping evil offset=0 tinygram.\n"); | 112 | duprintf("xt_multiport: Dropping evil offset=0 tinygram.\n"); |
116 | *hotdrop = true; | 113 | *par->hotdrop = true; |
117 | return false; | 114 | return false; |
118 | } | 115 | } |
119 | 116 | ||
@@ -122,25 +119,22 @@ multiport_mt_v0(const struct sk_buff *skb, const struct net_device *in, | |||
122 | } | 119 | } |
123 | 120 | ||
124 | static bool | 121 | static bool |
125 | multiport_mt(const struct sk_buff *skb, const struct net_device *in, | 122 | multiport_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
126 | const struct net_device *out, const struct xt_match *match, | ||
127 | const void *matchinfo, int offset, unsigned int protoff, | ||
128 | bool *hotdrop) | ||
129 | { | 123 | { |
130 | const __be16 *pptr; | 124 | const __be16 *pptr; |
131 | __be16 _ports[2]; | 125 | __be16 _ports[2]; |
132 | const struct xt_multiport_v1 *multiinfo = matchinfo; | 126 | const struct xt_multiport_v1 *multiinfo = par->matchinfo; |
133 | 127 | ||
134 | if (offset) | 128 | if (par->fragoff != 0) |
135 | return false; | 129 | return false; |
136 | 130 | ||
137 | pptr = skb_header_pointer(skb, protoff, sizeof(_ports), _ports); | 131 | pptr = skb_header_pointer(skb, par->thoff, sizeof(_ports), _ports); |
138 | if (pptr == NULL) { | 132 | if (pptr == NULL) { |
139 | /* We've been asked to examine this packet, and we | 133 | /* We've been asked to examine this packet, and we |
140 | * can't. Hence, no choice but to drop. | 134 | * can't. Hence, no choice but to drop. |
141 | */ | 135 | */ |
142 | duprintf("xt_multiport: Dropping evil offset=0 tinygram.\n"); | 136 | duprintf("xt_multiport: Dropping evil offset=0 tinygram.\n"); |
143 | *hotdrop = true; | 137 | *par->hotdrop = true; |
144 | return false; | 138 | return false; |
145 | } | 139 | } |
146 | 140 | ||
diff --git a/net/netfilter/xt_owner.c b/net/netfilter/xt_owner.c index d1c3b7ae9b49..493b5eb8d148 100644 --- a/net/netfilter/xt_owner.c +++ b/net/netfilter/xt_owner.c | |||
@@ -21,12 +21,9 @@ | |||
21 | #include <linux/netfilter_ipv6/ip6t_owner.h> | 21 | #include <linux/netfilter_ipv6/ip6t_owner.h> |
22 | 22 | ||
23 | static bool | 23 | static bool |
24 | owner_mt_v0(const struct sk_buff *skb, const struct net_device *in, | 24 | owner_mt_v0(const struct sk_buff *skb, const struct xt_match_param *par) |
25 | const struct net_device *out, const struct xt_match *match, | ||
26 | const void *matchinfo, int offset, unsigned int protoff, | ||
27 | bool *hotdrop) | ||
28 | { | 25 | { |
29 | const struct ipt_owner_info *info = matchinfo; | 26 | const struct ipt_owner_info *info = par->matchinfo; |
30 | const struct file *filp; | 27 | const struct file *filp; |
31 | 28 | ||
32 | if (skb->sk == NULL || skb->sk->sk_socket == NULL) | 29 | if (skb->sk == NULL || skb->sk->sk_socket == NULL) |
@@ -50,12 +47,9 @@ owner_mt_v0(const struct sk_buff *skb, const struct net_device *in, | |||
50 | } | 47 | } |
51 | 48 | ||
52 | static bool | 49 | static bool |
53 | owner_mt6_v0(const struct sk_buff *skb, const struct net_device *in, | 50 | owner_mt6_v0(const struct sk_buff *skb, const struct xt_match_param *par) |
54 | const struct net_device *out, const struct xt_match *match, | ||
55 | const void *matchinfo, int offset, unsigned int protoff, | ||
56 | bool *hotdrop) | ||
57 | { | 51 | { |
58 | const struct ip6t_owner_info *info = matchinfo; | 52 | const struct ip6t_owner_info *info = par->matchinfo; |
59 | const struct file *filp; | 53 | const struct file *filp; |
60 | 54 | ||
61 | if (skb->sk == NULL || skb->sk->sk_socket == NULL) | 55 | if (skb->sk == NULL || skb->sk->sk_socket == NULL) |
@@ -79,12 +73,9 @@ owner_mt6_v0(const struct sk_buff *skb, const struct net_device *in, | |||
79 | } | 73 | } |
80 | 74 | ||
81 | static bool | 75 | static bool |
82 | owner_mt(const struct sk_buff *skb, const struct net_device *in, | 76 | owner_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
83 | const struct net_device *out, const struct xt_match *match, | ||
84 | const void *matchinfo, int offset, unsigned int protoff, | ||
85 | bool *hotdrop) | ||
86 | { | 77 | { |
87 | const struct xt_owner_match_info *info = matchinfo; | 78 | const struct xt_owner_match_info *info = par->matchinfo; |
88 | const struct file *filp; | 79 | const struct file *filp; |
89 | 80 | ||
90 | if (skb->sk == NULL || skb->sk->sk_socket == NULL) | 81 | if (skb->sk == NULL || skb->sk->sk_socket == NULL) |
diff --git a/net/netfilter/xt_physdev.c b/net/netfilter/xt_physdev.c index 72a0bdd53fa8..e980e179d4f1 100644 --- a/net/netfilter/xt_physdev.c +++ b/net/netfilter/xt_physdev.c | |||
@@ -21,14 +21,11 @@ MODULE_ALIAS("ipt_physdev"); | |||
21 | MODULE_ALIAS("ip6t_physdev"); | 21 | MODULE_ALIAS("ip6t_physdev"); |
22 | 22 | ||
23 | static bool | 23 | static bool |
24 | physdev_mt(const struct sk_buff *skb, const struct net_device *in, | 24 | physdev_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
25 | const struct net_device *out, const struct xt_match *match, | ||
26 | const void *matchinfo, int offset, unsigned int protoff, | ||
27 | bool *hotdrop) | ||
28 | { | 25 | { |
29 | int i; | 26 | int i; |
30 | static const char nulldevname[IFNAMSIZ]; | 27 | static const char nulldevname[IFNAMSIZ]; |
31 | const struct xt_physdev_info *info = matchinfo; | 28 | const struct xt_physdev_info *info = par->matchinfo; |
32 | bool ret; | 29 | bool ret; |
33 | const char *indev, *outdev; | 30 | const char *indev, *outdev; |
34 | const struct nf_bridge_info *nf_bridge; | 31 | const struct nf_bridge_info *nf_bridge; |
diff --git a/net/netfilter/xt_pkttype.c b/net/netfilter/xt_pkttype.c index 81e86d319a8f..37753a377603 100644 --- a/net/netfilter/xt_pkttype.c +++ b/net/netfilter/xt_pkttype.c | |||
@@ -23,20 +23,17 @@ MODULE_ALIAS("ipt_pkttype"); | |||
23 | MODULE_ALIAS("ip6t_pkttype"); | 23 | MODULE_ALIAS("ip6t_pkttype"); |
24 | 24 | ||
25 | static bool | 25 | static bool |
26 | pkttype_mt(const struct sk_buff *skb, const struct net_device *in, | 26 | pkttype_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
27 | const struct net_device *out, const struct xt_match *match, | ||
28 | const void *matchinfo, int offset, unsigned int protoff, | ||
29 | bool *hotdrop) | ||
30 | { | 27 | { |
31 | const struct xt_pkttype_info *info = matchinfo; | 28 | const struct xt_pkttype_info *info = par->matchinfo; |
32 | u_int8_t type; | 29 | u_int8_t type; |
33 | 30 | ||
34 | if (skb->pkt_type != PACKET_LOOPBACK) | 31 | if (skb->pkt_type != PACKET_LOOPBACK) |
35 | type = skb->pkt_type; | 32 | type = skb->pkt_type; |
36 | else if (match->family == NFPROTO_IPV4 && | 33 | else if (par->match->family == NFPROTO_IPV4 && |
37 | ipv4_is_multicast(ip_hdr(skb)->daddr)) | 34 | ipv4_is_multicast(ip_hdr(skb)->daddr)) |
38 | type = PACKET_MULTICAST; | 35 | type = PACKET_MULTICAST; |
39 | else if (match->family == NFPROTO_IPV6 && | 36 | else if (par->match->family == NFPROTO_IPV6 && |
40 | ipv6_hdr(skb)->daddr.s6_addr[0] == 0xFF) | 37 | ipv6_hdr(skb)->daddr.s6_addr[0] == 0xFF) |
41 | type = PACKET_MULTICAST; | 38 | type = PACKET_MULTICAST; |
42 | else | 39 | else |
diff --git a/net/netfilter/xt_policy.c b/net/netfilter/xt_policy.c index f1d514e9d0a2..b0a00fb0511b 100644 --- a/net/netfilter/xt_policy.c +++ b/net/netfilter/xt_policy.c | |||
@@ -110,18 +110,15 @@ match_policy_out(const struct sk_buff *skb, const struct xt_policy_info *info, | |||
110 | } | 110 | } |
111 | 111 | ||
112 | static bool | 112 | static bool |
113 | policy_mt(const struct sk_buff *skb, const struct net_device *in, | 113 | policy_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
114 | const struct net_device *out, const struct xt_match *match, | ||
115 | const void *matchinfo, int offset, unsigned int protoff, | ||
116 | bool *hotdrop) | ||
117 | { | 114 | { |
118 | const struct xt_policy_info *info = matchinfo; | 115 | const struct xt_policy_info *info = par->matchinfo; |
119 | int ret; | 116 | int ret; |
120 | 117 | ||
121 | if (info->flags & XT_POLICY_MATCH_IN) | 118 | if (info->flags & XT_POLICY_MATCH_IN) |
122 | ret = match_policy_in(skb, info, match->family); | 119 | ret = match_policy_in(skb, info, par->match->family); |
123 | else | 120 | else |
124 | ret = match_policy_out(skb, info, match->family); | 121 | ret = match_policy_out(skb, info, par->match->family); |
125 | 122 | ||
126 | if (ret < 0) | 123 | if (ret < 0) |
127 | ret = info->flags & XT_POLICY_MATCH_NONE ? true : false; | 124 | ret = info->flags & XT_POLICY_MATCH_NONE ? true : false; |
diff --git a/net/netfilter/xt_quota.c b/net/netfilter/xt_quota.c index a3c8798f0cc7..3ab92666c149 100644 --- a/net/netfilter/xt_quota.c +++ b/net/netfilter/xt_quota.c | |||
@@ -18,13 +18,10 @@ MODULE_ALIAS("ip6t_quota"); | |||
18 | static DEFINE_SPINLOCK(quota_lock); | 18 | static DEFINE_SPINLOCK(quota_lock); |
19 | 19 | ||
20 | static bool | 20 | static bool |
21 | quota_mt(const struct sk_buff *skb, const struct net_device *in, | 21 | quota_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
22 | const struct net_device *out, const struct xt_match *match, | ||
23 | const void *matchinfo, int offset, unsigned int protoff, | ||
24 | bool *hotdrop) | ||
25 | { | 22 | { |
26 | struct xt_quota_info *q = | 23 | struct xt_quota_info *q = |
27 | ((const struct xt_quota_info *)matchinfo)->master; | 24 | ((const struct xt_quota_info *)par->matchinfo)->master; |
28 | bool ret = q->flags & XT_QUOTA_INVERT; | 25 | bool ret = q->flags & XT_QUOTA_INVERT; |
29 | 26 | ||
30 | spin_lock_bh("a_lock); | 27 | spin_lock_bh("a_lock); |
diff --git a/net/netfilter/xt_rateest.c b/net/netfilter/xt_rateest.c index 4dcfd7353dba..e9f64ef45655 100644 --- a/net/netfilter/xt_rateest.c +++ b/net/netfilter/xt_rateest.c | |||
@@ -14,16 +14,10 @@ | |||
14 | #include <net/netfilter/xt_rateest.h> | 14 | #include <net/netfilter/xt_rateest.h> |
15 | 15 | ||
16 | 16 | ||
17 | static bool xt_rateest_mt(const struct sk_buff *skb, | 17 | static bool |
18 | const struct net_device *in, | 18 | xt_rateest_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
19 | const struct net_device *out, | ||
20 | const struct xt_match *match, | ||
21 | const void *matchinfo, | ||
22 | int offset, | ||
23 | unsigned int protoff, | ||
24 | bool *hotdrop) | ||
25 | { | 19 | { |
26 | const struct xt_rateest_match_info *info = matchinfo; | 20 | const struct xt_rateest_match_info *info = par->matchinfo; |
27 | struct gnet_stats_rate_est *r; | 21 | struct gnet_stats_rate_est *r; |
28 | u_int32_t bps1, bps2, pps1, pps2; | 22 | u_int32_t bps1, bps2, pps1, pps2; |
29 | bool ret = true; | 23 | bool ret = true; |
diff --git a/net/netfilter/xt_realm.c b/net/netfilter/xt_realm.c index ef65756d4894..b25942110ed7 100644 --- a/net/netfilter/xt_realm.c +++ b/net/netfilter/xt_realm.c | |||
@@ -22,12 +22,9 @@ MODULE_DESCRIPTION("Xtables: Routing realm match"); | |||
22 | MODULE_ALIAS("ipt_realm"); | 22 | MODULE_ALIAS("ipt_realm"); |
23 | 23 | ||
24 | static bool | 24 | static bool |
25 | realm_mt(const struct sk_buff *skb, const struct net_device *in, | 25 | realm_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
26 | const struct net_device *out, const struct xt_match *match, | ||
27 | const void *matchinfo, int offset, unsigned int protoff, | ||
28 | bool *hotdrop) | ||
29 | { | 26 | { |
30 | const struct xt_realm_info *info = matchinfo; | 27 | const struct xt_realm_info *info = par->matchinfo; |
31 | const struct dst_entry *dst = skb->dst; | 28 | const struct dst_entry *dst = skb->dst; |
32 | 29 | ||
33 | return (info->id == (dst->tclassid & info->mask)) ^ info->invert; | 30 | return (info->id == (dst->tclassid & info->mask)) ^ info->invert; |
diff --git a/net/netfilter/xt_recent.c b/net/netfilter/xt_recent.c index 4a916e2624d3..baeb90a56231 100644 --- a/net/netfilter/xt_recent.c +++ b/net/netfilter/xt_recent.c | |||
@@ -204,19 +204,16 @@ static void recent_table_flush(struct recent_table *t) | |||
204 | } | 204 | } |
205 | 205 | ||
206 | static bool | 206 | static bool |
207 | recent_mt(const struct sk_buff *skb, const struct net_device *in, | 207 | recent_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
208 | const struct net_device *out, const struct xt_match *match, | ||
209 | const void *matchinfo, int offset, unsigned int protoff, | ||
210 | bool *hotdrop) | ||
211 | { | 208 | { |
212 | const struct xt_recent_mtinfo *info = matchinfo; | 209 | const struct xt_recent_mtinfo *info = par->matchinfo; |
213 | struct recent_table *t; | 210 | struct recent_table *t; |
214 | struct recent_entry *e; | 211 | struct recent_entry *e; |
215 | union nf_inet_addr addr = {}; | 212 | union nf_inet_addr addr = {}; |
216 | u_int8_t ttl; | 213 | u_int8_t ttl; |
217 | bool ret = info->invert; | 214 | bool ret = info->invert; |
218 | 215 | ||
219 | if (match->family == NFPROTO_IPV4) { | 216 | if (par->match->family == NFPROTO_IPV4) { |
220 | const struct iphdr *iph = ip_hdr(skb); | 217 | const struct iphdr *iph = ip_hdr(skb); |
221 | 218 | ||
222 | if (info->side == XT_RECENT_DEST) | 219 | if (info->side == XT_RECENT_DEST) |
@@ -237,19 +234,19 @@ recent_mt(const struct sk_buff *skb, const struct net_device *in, | |||
237 | } | 234 | } |
238 | 235 | ||
239 | /* use TTL as seen before forwarding */ | 236 | /* use TTL as seen before forwarding */ |
240 | if (out && !skb->sk) | 237 | if (par->out != NULL && skb->sk == NULL) |
241 | ttl++; | 238 | ttl++; |
242 | 239 | ||
243 | spin_lock_bh(&recent_lock); | 240 | spin_lock_bh(&recent_lock); |
244 | t = recent_table_lookup(info->name); | 241 | t = recent_table_lookup(info->name); |
245 | e = recent_entry_lookup(t, &addr, match->family, | 242 | e = recent_entry_lookup(t, &addr, par->match->family, |
246 | (info->check_set & XT_RECENT_TTL) ? ttl : 0); | 243 | (info->check_set & XT_RECENT_TTL) ? ttl : 0); |
247 | if (e == NULL) { | 244 | if (e == NULL) { |
248 | if (!(info->check_set & XT_RECENT_SET)) | 245 | if (!(info->check_set & XT_RECENT_SET)) |
249 | goto out; | 246 | goto out; |
250 | e = recent_entry_init(t, &addr, match->family, ttl); | 247 | e = recent_entry_init(t, &addr, par->match->family, ttl); |
251 | if (e == NULL) | 248 | if (e == NULL) |
252 | *hotdrop = true; | 249 | *par->hotdrop = true; |
253 | ret = !ret; | 250 | ret = !ret; |
254 | goto out; | 251 | goto out; |
255 | } | 252 | } |
diff --git a/net/netfilter/xt_sctp.c b/net/netfilter/xt_sctp.c index ab67aca4d8fe..b0014ab65da7 100644 --- a/net/netfilter/xt_sctp.c +++ b/net/netfilter/xt_sctp.c | |||
@@ -117,23 +117,21 @@ match_packet(const struct sk_buff *skb, | |||
117 | } | 117 | } |
118 | 118 | ||
119 | static bool | 119 | static bool |
120 | sctp_mt(const struct sk_buff *skb, const struct net_device *in, | 120 | sctp_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
121 | const struct net_device *out, const struct xt_match *match, | ||
122 | const void *matchinfo, int offset, unsigned int protoff, bool *hotdrop) | ||
123 | { | 121 | { |
124 | const struct xt_sctp_info *info = matchinfo; | 122 | const struct xt_sctp_info *info = par->matchinfo; |
125 | const sctp_sctphdr_t *sh; | 123 | const sctp_sctphdr_t *sh; |
126 | sctp_sctphdr_t _sh; | 124 | sctp_sctphdr_t _sh; |
127 | 125 | ||
128 | if (offset) { | 126 | if (par->fragoff != 0) { |
129 | duprintf("Dropping non-first fragment.. FIXME\n"); | 127 | duprintf("Dropping non-first fragment.. FIXME\n"); |
130 | return false; | 128 | return false; |
131 | } | 129 | } |
132 | 130 | ||
133 | sh = skb_header_pointer(skb, protoff, sizeof(_sh), &_sh); | 131 | sh = skb_header_pointer(skb, par->thoff, sizeof(_sh), &_sh); |
134 | if (sh == NULL) { | 132 | if (sh == NULL) { |
135 | duprintf("Dropping evil TCP offset=0 tinygram.\n"); | 133 | duprintf("Dropping evil TCP offset=0 tinygram.\n"); |
136 | *hotdrop = true; | 134 | *par->hotdrop = true; |
137 | return false; | 135 | return false; |
138 | } | 136 | } |
139 | duprintf("spt: %d\tdpt: %d\n", ntohs(sh->source), ntohs(sh->dest)); | 137 | duprintf("spt: %d\tdpt: %d\n", ntohs(sh->source), ntohs(sh->dest)); |
@@ -144,8 +142,8 @@ sctp_mt(const struct sk_buff *skb, const struct net_device *in, | |||
144 | && SCCHECK(ntohs(sh->dest) >= info->dpts[0] | 142 | && SCCHECK(ntohs(sh->dest) >= info->dpts[0] |
145 | && ntohs(sh->dest) <= info->dpts[1], | 143 | && ntohs(sh->dest) <= info->dpts[1], |
146 | XT_SCTP_DEST_PORTS, info->flags, info->invflags) | 144 | XT_SCTP_DEST_PORTS, info->flags, info->invflags) |
147 | && SCCHECK(match_packet(skb, protoff + sizeof (sctp_sctphdr_t), | 145 | && SCCHECK(match_packet(skb, par->thoff + sizeof(sctp_sctphdr_t), |
148 | info, hotdrop), | 146 | info, par->hotdrop), |
149 | XT_SCTP_CHUNK_TYPES, info->flags, info->invflags); | 147 | XT_SCTP_CHUNK_TYPES, info->flags, info->invflags); |
150 | } | 148 | } |
151 | 149 | ||
diff --git a/net/netfilter/xt_socket.c b/net/netfilter/xt_socket.c index ac9db17c7b9c..02a8fed21082 100644 --- a/net/netfilter/xt_socket.c +++ b/net/netfilter/xt_socket.c | |||
@@ -86,14 +86,7 @@ extract_icmp_fields(const struct sk_buff *skb, | |||
86 | 86 | ||
87 | 87 | ||
88 | static bool | 88 | static bool |
89 | socket_mt(const struct sk_buff *skb, | 89 | socket_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
90 | const struct net_device *in, | ||
91 | const struct net_device *out, | ||
92 | const struct xt_match *match, | ||
93 | const void *matchinfo, | ||
94 | int offset, | ||
95 | unsigned int protoff, | ||
96 | bool *hotdrop) | ||
97 | { | 90 | { |
98 | const struct iphdr *iph = ip_hdr(skb); | 91 | const struct iphdr *iph = ip_hdr(skb); |
99 | struct udphdr _hdr, *hp = NULL; | 92 | struct udphdr _hdr, *hp = NULL; |
@@ -146,7 +139,7 @@ socket_mt(const struct sk_buff *skb, | |||
146 | #endif | 139 | #endif |
147 | 140 | ||
148 | sk = nf_tproxy_get_sock_v4(dev_net(skb->dev), protocol, | 141 | sk = nf_tproxy_get_sock_v4(dev_net(skb->dev), protocol, |
149 | saddr, daddr, sport, dport, in, false); | 142 | saddr, daddr, sport, dport, par->in, false); |
150 | if (sk != NULL) { | 143 | if (sk != NULL) { |
151 | bool wildcard = (inet_sk(sk)->rcv_saddr == 0); | 144 | bool wildcard = (inet_sk(sk)->rcv_saddr == 0); |
152 | 145 | ||
diff --git a/net/netfilter/xt_state.c b/net/netfilter/xt_state.c index f92f8bcc1e38..29f5a8a1b024 100644 --- a/net/netfilter/xt_state.c +++ b/net/netfilter/xt_state.c | |||
@@ -21,12 +21,9 @@ MODULE_ALIAS("ipt_state"); | |||
21 | MODULE_ALIAS("ip6t_state"); | 21 | MODULE_ALIAS("ip6t_state"); |
22 | 22 | ||
23 | static bool | 23 | static bool |
24 | state_mt(const struct sk_buff *skb, const struct net_device *in, | 24 | state_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
25 | const struct net_device *out, const struct xt_match *match, | ||
26 | const void *matchinfo, int offset, unsigned int protoff, | ||
27 | bool *hotdrop) | ||
28 | { | 25 | { |
29 | const struct xt_state_info *sinfo = matchinfo; | 26 | const struct xt_state_info *sinfo = par->matchinfo; |
30 | enum ip_conntrack_info ctinfo; | 27 | enum ip_conntrack_info ctinfo; |
31 | unsigned int statebit; | 28 | unsigned int statebit; |
32 | 29 | ||
diff --git a/net/netfilter/xt_statistic.c b/net/netfilter/xt_statistic.c index f41a92322e6e..dcadc491db21 100644 --- a/net/netfilter/xt_statistic.c +++ b/net/netfilter/xt_statistic.c | |||
@@ -25,12 +25,9 @@ MODULE_ALIAS("ip6t_statistic"); | |||
25 | static DEFINE_SPINLOCK(nth_lock); | 25 | static DEFINE_SPINLOCK(nth_lock); |
26 | 26 | ||
27 | static bool | 27 | static bool |
28 | statistic_mt(const struct sk_buff *skb, const struct net_device *in, | 28 | statistic_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
29 | const struct net_device *out, const struct xt_match *match, | ||
30 | const void *matchinfo, int offset, unsigned int protoff, | ||
31 | bool *hotdrop) | ||
32 | { | 29 | { |
33 | struct xt_statistic_info *info = (struct xt_statistic_info *)matchinfo; | 30 | struct xt_statistic_info *info = (void *)par->matchinfo; |
34 | bool ret = info->flags & XT_STATISTIC_INVERT; | 31 | bool ret = info->flags & XT_STATISTIC_INVERT; |
35 | 32 | ||
36 | switch (info->mode) { | 33 | switch (info->mode) { |
diff --git a/net/netfilter/xt_string.c b/net/netfilter/xt_string.c index 18d8884e7370..33f2d29ca4f7 100644 --- a/net/netfilter/xt_string.c +++ b/net/netfilter/xt_string.c | |||
@@ -22,18 +22,15 @@ MODULE_ALIAS("ipt_string"); | |||
22 | MODULE_ALIAS("ip6t_string"); | 22 | MODULE_ALIAS("ip6t_string"); |
23 | 23 | ||
24 | static bool | 24 | static bool |
25 | string_mt(const struct sk_buff *skb, const struct net_device *in, | 25 | string_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
26 | const struct net_device *out, const struct xt_match *match, | ||
27 | const void *matchinfo, int offset, unsigned int protoff, | ||
28 | bool *hotdrop) | ||
29 | { | 26 | { |
30 | const struct xt_string_info *conf = matchinfo; | 27 | const struct xt_string_info *conf = par->matchinfo; |
31 | struct ts_state state; | 28 | struct ts_state state; |
32 | int invert; | 29 | int invert; |
33 | 30 | ||
34 | memset(&state, 0, sizeof(struct ts_state)); | 31 | memset(&state, 0, sizeof(struct ts_state)); |
35 | 32 | ||
36 | invert = (match->revision == 0 ? conf->u.v0.invert : | 33 | invert = (par->match->revision == 0 ? conf->u.v0.invert : |
37 | conf->u.v1.flags & XT_STRING_FLAG_INVERT); | 34 | conf->u.v1.flags & XT_STRING_FLAG_INVERT); |
38 | 35 | ||
39 | return (skb_find_text((struct sk_buff *)skb, conf->from_offset, | 36 | return (skb_find_text((struct sk_buff *)skb, conf->from_offset, |
diff --git a/net/netfilter/xt_tcpmss.c b/net/netfilter/xt_tcpmss.c index 4791c7cbe5a9..4809b34b10f8 100644 --- a/net/netfilter/xt_tcpmss.c +++ b/net/netfilter/xt_tcpmss.c | |||
@@ -25,12 +25,9 @@ MODULE_ALIAS("ipt_tcpmss"); | |||
25 | MODULE_ALIAS("ip6t_tcpmss"); | 25 | MODULE_ALIAS("ip6t_tcpmss"); |
26 | 26 | ||
27 | static bool | 27 | static bool |
28 | tcpmss_mt(const struct sk_buff *skb, const struct net_device *in, | 28 | tcpmss_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
29 | const struct net_device *out, const struct xt_match *match, | ||
30 | const void *matchinfo, int offset, unsigned int protoff, | ||
31 | bool *hotdrop) | ||
32 | { | 29 | { |
33 | const struct xt_tcpmss_match_info *info = matchinfo; | 30 | const struct xt_tcpmss_match_info *info = par->matchinfo; |
34 | const struct tcphdr *th; | 31 | const struct tcphdr *th; |
35 | struct tcphdr _tcph; | 32 | struct tcphdr _tcph; |
36 | /* tcp.doff is only 4 bits, ie. max 15 * 4 bytes */ | 33 | /* tcp.doff is only 4 bits, ie. max 15 * 4 bytes */ |
@@ -39,7 +36,7 @@ tcpmss_mt(const struct sk_buff *skb, const struct net_device *in, | |||
39 | unsigned int i, optlen; | 36 | unsigned int i, optlen; |
40 | 37 | ||
41 | /* If we don't have the whole header, drop packet. */ | 38 | /* If we don't have the whole header, drop packet. */ |
42 | th = skb_header_pointer(skb, protoff, sizeof(_tcph), &_tcph); | 39 | th = skb_header_pointer(skb, par->thoff, sizeof(_tcph), &_tcph); |
43 | if (th == NULL) | 40 | if (th == NULL) |
44 | goto dropit; | 41 | goto dropit; |
45 | 42 | ||
@@ -52,7 +49,7 @@ tcpmss_mt(const struct sk_buff *skb, const struct net_device *in, | |||
52 | goto out; | 49 | goto out; |
53 | 50 | ||
54 | /* Truncated options. */ | 51 | /* Truncated options. */ |
55 | op = skb_header_pointer(skb, protoff + sizeof(*th), optlen, _opt); | 52 | op = skb_header_pointer(skb, par->thoff + sizeof(*th), optlen, _opt); |
56 | if (op == NULL) | 53 | if (op == NULL) |
57 | goto dropit; | 54 | goto dropit; |
58 | 55 | ||
@@ -76,7 +73,7 @@ out: | |||
76 | return info->invert; | 73 | return info->invert; |
77 | 74 | ||
78 | dropit: | 75 | dropit: |
79 | *hotdrop = true; | 76 | *par->hotdrop = true; |
80 | return false; | 77 | return false; |
81 | } | 78 | } |
82 | 79 | ||
diff --git a/net/netfilter/xt_tcpudp.c b/net/netfilter/xt_tcpudp.c index 5a6268cbb9f8..66cf71b1d59c 100644 --- a/net/netfilter/xt_tcpudp.c +++ b/net/netfilter/xt_tcpudp.c | |||
@@ -68,25 +68,22 @@ tcp_find_option(u_int8_t option, | |||
68 | return invert; | 68 | return invert; |
69 | } | 69 | } |
70 | 70 | ||
71 | static bool | 71 | static bool tcp_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
72 | tcp_mt(const struct sk_buff *skb, const struct net_device *in, | ||
73 | const struct net_device *out, const struct xt_match *match, | ||
74 | const void *matchinfo, int offset, unsigned int protoff, bool *hotdrop) | ||
75 | { | 72 | { |
76 | const struct tcphdr *th; | 73 | const struct tcphdr *th; |
77 | struct tcphdr _tcph; | 74 | struct tcphdr _tcph; |
78 | const struct xt_tcp *tcpinfo = matchinfo; | 75 | const struct xt_tcp *tcpinfo = par->matchinfo; |
79 | 76 | ||
80 | if (offset) { | 77 | if (par->fragoff != 0) { |
81 | /* To quote Alan: | 78 | /* To quote Alan: |
82 | 79 | ||
83 | Don't allow a fragment of TCP 8 bytes in. Nobody normal | 80 | Don't allow a fragment of TCP 8 bytes in. Nobody normal |
84 | causes this. Its a cracker trying to break in by doing a | 81 | causes this. Its a cracker trying to break in by doing a |
85 | flag overwrite to pass the direction checks. | 82 | flag overwrite to pass the direction checks. |
86 | */ | 83 | */ |
87 | if (offset == 1) { | 84 | if (par->fragoff == 1) { |
88 | duprintf("Dropping evil TCP offset=1 frag.\n"); | 85 | duprintf("Dropping evil TCP offset=1 frag.\n"); |
89 | *hotdrop = true; | 86 | *par->hotdrop = true; |
90 | } | 87 | } |
91 | /* Must not be a fragment. */ | 88 | /* Must not be a fragment. */ |
92 | return false; | 89 | return false; |
@@ -94,12 +91,12 @@ tcp_mt(const struct sk_buff *skb, const struct net_device *in, | |||
94 | 91 | ||
95 | #define FWINVTCP(bool, invflg) ((bool) ^ !!(tcpinfo->invflags & (invflg))) | 92 | #define FWINVTCP(bool, invflg) ((bool) ^ !!(tcpinfo->invflags & (invflg))) |
96 | 93 | ||
97 | th = skb_header_pointer(skb, protoff, sizeof(_tcph), &_tcph); | 94 | th = skb_header_pointer(skb, par->thoff, sizeof(_tcph), &_tcph); |
98 | if (th == NULL) { | 95 | if (th == NULL) { |
99 | /* We've been asked to examine this packet, and we | 96 | /* We've been asked to examine this packet, and we |
100 | can't. Hence, no choice but to drop. */ | 97 | can't. Hence, no choice but to drop. */ |
101 | duprintf("Dropping evil TCP offset=0 tinygram.\n"); | 98 | duprintf("Dropping evil TCP offset=0 tinygram.\n"); |
102 | *hotdrop = true; | 99 | *par->hotdrop = true; |
103 | return false; | 100 | return false; |
104 | } | 101 | } |
105 | 102 | ||
@@ -117,13 +114,13 @@ tcp_mt(const struct sk_buff *skb, const struct net_device *in, | |||
117 | return false; | 114 | return false; |
118 | if (tcpinfo->option) { | 115 | if (tcpinfo->option) { |
119 | if (th->doff * 4 < sizeof(_tcph)) { | 116 | if (th->doff * 4 < sizeof(_tcph)) { |
120 | *hotdrop = true; | 117 | *par->hotdrop = true; |
121 | return false; | 118 | return false; |
122 | } | 119 | } |
123 | if (!tcp_find_option(tcpinfo->option, skb, protoff, | 120 | if (!tcp_find_option(tcpinfo->option, skb, par->thoff, |
124 | th->doff*4 - sizeof(_tcph), | 121 | th->doff*4 - sizeof(_tcph), |
125 | tcpinfo->invflags & XT_TCP_INV_OPTION, | 122 | tcpinfo->invflags & XT_TCP_INV_OPTION, |
126 | hotdrop)) | 123 | par->hotdrop)) |
127 | return false; | 124 | return false; |
128 | } | 125 | } |
129 | return true; | 126 | return true; |
@@ -141,25 +138,22 @@ tcp_mt_check(const char *tablename, const void *info, | |||
141 | return !(tcpinfo->invflags & ~XT_TCP_INV_MASK); | 138 | return !(tcpinfo->invflags & ~XT_TCP_INV_MASK); |
142 | } | 139 | } |
143 | 140 | ||
144 | static bool | 141 | static bool udp_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
145 | udp_mt(const struct sk_buff *skb, const struct net_device *in, | ||
146 | const struct net_device *out, const struct xt_match *match, | ||
147 | const void *matchinfo, int offset, unsigned int protoff, bool *hotdrop) | ||
148 | { | 142 | { |
149 | const struct udphdr *uh; | 143 | const struct udphdr *uh; |
150 | struct udphdr _udph; | 144 | struct udphdr _udph; |
151 | const struct xt_udp *udpinfo = matchinfo; | 145 | const struct xt_udp *udpinfo = par->matchinfo; |
152 | 146 | ||
153 | /* Must not be a fragment. */ | 147 | /* Must not be a fragment. */ |
154 | if (offset) | 148 | if (par->fragoff != 0) |
155 | return false; | 149 | return false; |
156 | 150 | ||
157 | uh = skb_header_pointer(skb, protoff, sizeof(_udph), &_udph); | 151 | uh = skb_header_pointer(skb, par->thoff, sizeof(_udph), &_udph); |
158 | if (uh == NULL) { | 152 | if (uh == NULL) { |
159 | /* We've been asked to examine this packet, and we | 153 | /* We've been asked to examine this packet, and we |
160 | can't. Hence, no choice but to drop. */ | 154 | can't. Hence, no choice but to drop. */ |
161 | duprintf("Dropping evil UDP tinygram.\n"); | 155 | duprintf("Dropping evil UDP tinygram.\n"); |
162 | *hotdrop = true; | 156 | *par->hotdrop = true; |
163 | return false; | 157 | return false; |
164 | } | 158 | } |
165 | 159 | ||
diff --git a/net/netfilter/xt_time.c b/net/netfilter/xt_time.c index 32d4c769caa4..28599d3979c4 100644 --- a/net/netfilter/xt_time.c +++ b/net/netfilter/xt_time.c | |||
@@ -153,11 +153,9 @@ static void localtime_3(struct xtm *r, time_t time) | |||
153 | } | 153 | } |
154 | 154 | ||
155 | static bool | 155 | static bool |
156 | time_mt(const struct sk_buff *skb, const struct net_device *in, | 156 | time_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
157 | const struct net_device *out, const struct xt_match *match, | ||
158 | const void *matchinfo, int offset, unsigned int protoff, bool *hotdrop) | ||
159 | { | 157 | { |
160 | const struct xt_time_info *info = matchinfo; | 158 | const struct xt_time_info *info = par->matchinfo; |
161 | unsigned int packet_time; | 159 | unsigned int packet_time; |
162 | struct xtm current_time; | 160 | struct xtm current_time; |
163 | s64 stamp; | 161 | s64 stamp; |
diff --git a/net/netfilter/xt_u32.c b/net/netfilter/xt_u32.c index a6b971dc5d38..24a527624500 100644 --- a/net/netfilter/xt_u32.c +++ b/net/netfilter/xt_u32.c | |||
@@ -87,12 +87,9 @@ static bool u32_match_it(const struct xt_u32 *data, | |||
87 | return true; | 87 | return true; |
88 | } | 88 | } |
89 | 89 | ||
90 | static bool | 90 | static bool u32_mt(const struct sk_buff *skb, const struct xt_match_param *par) |
91 | u32_mt(const struct sk_buff *skb, const struct net_device *in, | ||
92 | const struct net_device *out, const struct xt_match *match, | ||
93 | const void *matchinfo, int offset, unsigned int protoff, bool *hotdrop) | ||
94 | { | 91 | { |
95 | const struct xt_u32 *data = matchinfo; | 92 | const struct xt_u32 *data = par->matchinfo; |
96 | bool ret; | 93 | bool ret; |
97 | 94 | ||
98 | ret = u32_match_it(data, skb); | 95 | ret = u32_match_it(data, skb); |