aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/include/asm/setup.h
Commit message (Expand)AuthorAge
* support multiple .discard.* sections to avoid section type conflictsJeremy Fitzhardinge2010-07-28
* x86: Move pci init function to x86_initThomas Gleixner2010-02-19
* x86: Add Moorestown early detectionThomas Gleixner2009-08-31
* x86: Add timer_init to x86_init_opsThomas Gleixner2009-08-31
* x86: Move xen_post_allocator_init into xen_pagetable_setup_doneThomas Gleixner2009-08-31
* x86: Move traps_init to x86_init_opsThomas Gleixner2009-08-31
* x86: Move irq_init to x86_init_opsThomas Gleixner2009-08-31
* x86: Move pre_intr_init to x86_init_opsThomas Gleixner2009-08-31
* x86: Move get/find_smp_config to x86_init_opsThomas Gleixner2009-08-31
* x86: Move oem_bus_info to x86_init_opsThomas Gleixner2009-08-27
* x86: Move mpc_oem_pci_bus to x86_init_opsThomas Gleixner2009-08-27
* x86: Move smp_read_mpc_oem to x86_init_ops.Thomas Gleixner2009-08-27
* x86: Move mpc_apic_id to x86_init_opsThomas Gleixner2009-08-27
* x86: Move ioapic_ids_setup to x86_init_opsThomas Gleixner2009-08-27
* x86: Sanitize smp_record and move it to x86_init_opsThomas Gleixner2009-08-27
* x86: Move memory_setup to x86_init_opsThomas Gleixner2009-08-27
* x86: Add request_standard_resources to x86_initThomas Gleixner2009-08-27
* x86: Add x86_init infrastructureThomas Gleixner2009-08-27
* x86: move x86_quirk_pre_intr_init() to irqinit_32.cPekka Enberg2009-04-10
* Revert "x86: don't compile vsmp_64 for 32bit"Ravikiran G Thirumalai2009-03-25
* x86/brk: make the brk reservation symbols inaccessible from CJeremy Fitzhardinge2009-03-17
* x86: allow extend_brk users to reserve brk spaceJeremy Fitzhardinge2009-03-14
* x86-32: use brk segment for allocating initial kernel pagetableJeremy Fitzhardinge2009-03-14
* x86: add brk allocation for very, very early allocationsJeremy Fitzhardinge2009-03-14
* x86: don't compile vsmp_64 for 32bitYinghai Lu2009-02-26
* x86: remove update_apic from x86_quirksYinghai Lu2009-02-26
* x86: refactor x86_quirks supportIngo Molnar2009-02-22
* x86, apic: rename 'genapic' to 'apic'Ingo Molnar2009-02-17
* Merge branch 'core/header-fixes' into x86/headersIngo Molnar2009-02-13
|\
| * headers_check fix: x86, setup.hJaswinder Singh Rajput2009-02-02
| |
| \
*-. \ Merge branches 'x86/asm', 'x86/cleanups', 'x86/cpudetect', 'x86/debug', 'x86/...Ingo Molnar2009-01-28
|\ \ \ | | |/ | |/|
| | * x86: headers cleanup - setup.hCyrill Gorcunov2009-01-14
| |/
* / x86: misc clean up after the percpu updateTejun Heo2009-01-16
|/
* x86: rename mpc_config_oemtable to mpc_oemtableJaswinder Singh Rajput2009-01-04
* x86: rename mpc_config_processor to mpc_cpuJaswinder Singh Rajput2009-01-04
* x86: rename mpc_config_bus to mpc_busJaswinder Singh Rajput2009-01-04
*-. Merge branches 'x86/apic', 'x86/cleanups', 'x86/cpufeature', 'x86/crashdump',...Ingo Molnar2008-12-23
|\ \
| | * x86: fix wakeup_cpu with numaq/es7000, v2, fixYinghai Lu2008-11-17
| | * x86: fix wakeup_cpu with numaq/es7000, v2Yinghai Lu2008-11-17
| |/ |/|
| * x86: corruption check: move the corruption checks into their own fileArjan van de Ven2008-10-27
|/
* x86: Fix ASM_X86__ header guardsH. Peter Anvin2008-10-23
* x86, um: ... and asm-x86 moveAl Viro2008-10-23
fb9cbb1082d
50b9f1d509eb

1d93a9cbad60

9fb9cbb1082d

50b9f1d509eb
5e8fbe2ac8a3
601e68e100b6
50b9f1d509eb
1d93a9cbad60
50b9f1d509eb


601e68e100b6
50b9f1d509eb

1d93a9cbad60
9fb9cbb1082d
50b9f1d509eb

601e68e100b6
50b9f1d509eb

1d93a9cbad60
9fb9cbb1082d
50b9f1d509eb

601e68e100b6
50b9f1d509eb

1d93a9cbad60
9fb9cbb1082d
50b9f1d509eb

601e68e100b6
50b9f1d509eb

1d93a9cbad60
9fb9cbb1082d
50b9f1d509eb

601e68e100b6
1d93a9cbad60
9fb9cbb1082d
50b9f1d509eb


9fb9cbb1082d
50b9f1d509eb


1d93a9cbad60
9fb9cbb1082d
1d93a9cbad60
e79ec50b9587
9fb9cbb1082d

ccb79bdce71f
64eb12f9972d



ee999d8b9573
6556874dc377
ee999d8b9573
64eb12f9972d








76108cea065c
64eb12f9972d







76108cea065c
64eb12f9972d







76108cea065c
64eb12f9972d







76108cea065c
64eb12f9972d




b41649989c96







5e8fbe2ac8a3
b41649989c96




























64eb12f9972d
f7108a20dee4
64eb12f9972d
f7108a20dee4
64eb12f9972d



















d61f89e9417e
64eb12f9972d





b41649989c96


64eb12f9972d


92f3b2b1bc96
64eb12f9972d



92f3b2b1bc96
64eb12f9972d



92f3b2b1bc96
64eb12f9972d



92f3b2b1bc96
64eb12f9972d


b41649989c96


64eb12f9972d

















9b4fce7a3508
b9f78f9fca62
92f3b2b1bc96
fe0b9294c9f9
92f3b2b1bc96
ccb79bdce71f
b9f78f9fca62
ccb79bdce71f
b9f78f9fca62

6be3d8598e88
b9f78f9fca62
92f3b2b1bc96
b9f78f9fca62

da0dd231436b













64eb12f9972d
da0dd231436b
a47362a22645
da0dd231436b













64eb12f9972d
da0dd231436b
a47362a22645
da0dd231436b














64eb12f9972d



ee999d8b9573
64eb12f9972d




da0dd231436b
64eb12f9972d


da0dd231436b
64eb12f9972d



92f3b2b1bc96
64eb12f9972d





1da177e4c3f4

d3c5ee6d545b
1da177e4c3f4
64eb12f9972d

1da177e4c3f4

d3c5ee6d545b
1da177e4c3f4
64eb12f9972d
1da177e4c3f4

d3c5ee6d545b

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385


                                                                    
  

                                                              
  


                                                                            



                         
                     

                                         
                                       


                                             
                                                          
                                                               
                              
                               
 
           
                                                                            
 
                                                               
                                 


                                      
                                     
 
                                                                     

                                          
                                                        
                    



                                                          
                                                
                         
                                                                   
                                                                    
                                                                   
                                                                    
                 

                                                             
                                     

         

                                                       

                                     

         
                                                
                                       
                                                                
                                      
                             


                                                                      
                                                               

                                                          
                             
 

                                                                      
                                                               

                                                          
                             
 

                                                                   
                                                            

                                                       
                             
 

                                                                   
                                                            

                                                       
                             
 

                                                        
                                       
                             
 


                                                                               
 


                                                            
                                     
         
                    
            

 
           



                                                                        
                                    
                                                                  
                                         








                                                                     
                                     







                                                                                 
                                     







                                                                                 
                                     







                                                                              
                                     




                                                                              







                                                            
                                                   




























                                                                            
           
                                                                         
 
                                                                 



















                                                                    
                                                     





                                                               


                                                            


                                                     
                                                                 



                                                                 
                                                                 



                                                                 
                                                                 



                                                                 
                                                                 


                                                                 


                                           

















                                                                       
                                                                
 
                                                            
                                                                       
                                                               
                             
         
                    

 
                                                                   
 
                                              

 













                                                              
                                                                  
 
                                                        













                                                       
                                                                      
 
                                                














                                                                



                                                           
                                           




                                                               
                    


                                                                            
      



                                          
                                             





                                                                  

  
                                         
 

                                                    

 
                                          
 
                                                                              

 

                               
/*
 *	xt_conntrack - Netfilter module to match connection tracking
 *	information. (Superset of Rusty's minimalistic state match.)
 *
 *	(C) 2001  Marc Boucher (marc@mbsi.ca).
 *	Copyright © CC Computer Consultants GmbH, 2007 - 2008
 *
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License version 2 as
 *	published by the Free Software Foundation.
 */

#include <linux/module.h>
#include <linux/skbuff.h>
#include <net/ipv6.h>
#include <linux/netfilter/x_tables.h>
#include <linux/netfilter/xt_conntrack.h>
#include <net/netfilter/nf_conntrack.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Marc Boucher <marc@mbsi.ca>");
MODULE_AUTHOR("Jan Engelhardt <jengelh@computergmbh.de>");
MODULE_DESCRIPTION("Xtables: connection tracking state match");
MODULE_ALIAS("ipt_conntrack");
MODULE_ALIAS("ip6t_conntrack");

static bool
conntrack_mt_v0(const struct sk_buff *skb, const struct xt_match_param *par)
{
	const struct xt_conntrack_info *sinfo = par->matchinfo;
	const struct nf_conn *ct;
	enum ip_conntrack_info ctinfo;
	unsigned int statebit;

	ct = nf_ct_get(skb, &ctinfo);

#define FWINV(bool, invflg) ((bool) ^ !!(sinfo->invflags & (invflg)))

	if (ct == &nf_conntrack_untracked)
		statebit = XT_CONNTRACK_STATE_UNTRACKED;
	else if (ct)
		statebit = XT_CONNTRACK_STATE_BIT(ctinfo);
	else
		statebit = XT_CONNTRACK_STATE_INVALID;

	if (sinfo->flags & XT_CONNTRACK_STATE) {
		if (ct) {
			if (test_bit(IPS_SRC_NAT_BIT, &ct->status))
				statebit |= XT_CONNTRACK_STATE_SNAT;
			if (test_bit(IPS_DST_NAT_BIT, &ct->status))
				statebit |= XT_CONNTRACK_STATE_DNAT;
		}
		if (FWINV((statebit & sinfo->statemask) == 0,
			  XT_CONNTRACK_STATE))
			return false;
	}

	if (ct == NULL) {
		if (sinfo->flags & ~XT_CONNTRACK_STATE)
			return false;
		return true;
	}

	if (sinfo->flags & XT_CONNTRACK_PROTO &&
	    FWINV(nf_ct_protonum(ct) !=
		  sinfo->tuple[IP_CT_DIR_ORIGINAL].dst.protonum,
		  XT_CONNTRACK_PROTO))
		return false;

	if (sinfo->flags & XT_CONNTRACK_ORIGSRC &&
	    FWINV((ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip &
		   sinfo->sipmsk[IP_CT_DIR_ORIGINAL].s_addr) !=
		  sinfo->tuple[IP_CT_DIR_ORIGINAL].src.ip,
		  XT_CONNTRACK_ORIGSRC))
		return false;

	if (sinfo->flags & XT_CONNTRACK_ORIGDST &&
	    FWINV((ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip &
		   sinfo->dipmsk[IP_CT_DIR_ORIGINAL].s_addr) !=
		  sinfo->tuple[IP_CT_DIR_ORIGINAL].dst.ip,
		  XT_CONNTRACK_ORIGDST))
		return false;

	if (sinfo->flags & XT_CONNTRACK_REPLSRC &&
	    FWINV((ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3.ip &
		   sinfo->sipmsk[IP_CT_DIR_REPLY].s_addr) !=
		  sinfo->tuple[IP_CT_DIR_REPLY].src.ip,
		  XT_CONNTRACK_REPLSRC))
		return false;

	if (sinfo->flags & XT_CONNTRACK_REPLDST &&
	    FWINV((ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip &
		   sinfo->dipmsk[IP_CT_DIR_REPLY].s_addr) !=
		  sinfo->tuple[IP_CT_DIR_REPLY].dst.ip,
		  XT_CONNTRACK_REPLDST))
		return false;

	if (sinfo->flags & XT_CONNTRACK_STATUS &&
	    FWINV((ct->status & sinfo->statusmask) == 0,
		  XT_CONNTRACK_STATUS))
		return false;

	if(sinfo->flags & XT_CONNTRACK_EXPIRES) {
		unsigned long expires = timer_pending(&ct->timeout) ?
					(ct->timeout.expires - jiffies)/HZ : 0;

		if (FWINV(!(expires >= sinfo->expires_min &&
			    expires <= sinfo->expires_max),
			  XT_CONNTRACK_EXPIRES))
			return false;
	}
	return true;
#undef FWINV
}

static bool
conntrack_addrcmp(const union nf_inet_addr *kaddr,
                  const union nf_inet_addr *uaddr,
                  const union nf_inet_addr *umask, unsigned int l3proto)
{
	if (l3proto == NFPROTO_IPV4)
		return ((kaddr->ip ^ uaddr->ip) & umask->ip) == 0;
	else if (l3proto == NFPROTO_IPV6)
		return ipv6_masked_addr_cmp(&kaddr->in6, &umask->in6,
		       &uaddr->in6) == 0;
	else
		return false;
}

static inline bool
conntrack_mt_origsrc(const struct nf_conn *ct,
                     const struct xt_conntrack_mtinfo1 *info,
		     u_int8_t family)
{
	return conntrack_addrcmp(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3,
	       &info->origsrc_addr, &info->origsrc_mask, family);
}

static inline bool
conntrack_mt_origdst(const struct nf_conn *ct,
                     const struct xt_conntrack_mtinfo1 *info,
		     u_int8_t family)
{
	return conntrack_addrcmp(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3,
	       &info->origdst_addr, &info->origdst_mask, family);
}

static inline bool
conntrack_mt_replsrc(const struct nf_conn *ct,
                     const struct xt_conntrack_mtinfo1 *info,
		     u_int8_t family)
{
	return conntrack_addrcmp(&ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3,
	       &info->replsrc_addr, &info->replsrc_mask, family);
}

static inline bool
conntrack_mt_repldst(const struct nf_conn *ct,
                     const struct xt_conntrack_mtinfo1 *info,
		     u_int8_t family)
{
	return conntrack_addrcmp(&ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3,
	       &info->repldst_addr, &info->repldst_mask, family);
}

static inline bool
ct_proto_port_check(const struct xt_conntrack_mtinfo1 *info,
                    const struct nf_conn *ct)
{
	const struct nf_conntrack_tuple *tuple;

	tuple = &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple;
	if ((info->match_flags & XT_CONNTRACK_PROTO) &&
	    (nf_ct_protonum(ct) == info->l4proto) ^
	    !(info->invert_flags & XT_CONNTRACK_PROTO))
		return false;

	/* Shortcut to match all recognized protocols by using ->src.all. */
	if ((info->match_flags & XT_CONNTRACK_ORIGSRC_PORT) &&
	    (tuple->src.u.all == info->origsrc_port) ^
	    !(info->invert_flags & XT_CONNTRACK_ORIGSRC_PORT))
		return false;

	if ((info->match_flags & XT_CONNTRACK_ORIGDST_PORT) &&
	    (tuple->dst.u.all == info->origdst_port) ^
	    !(info->invert_flags & XT_CONNTRACK_ORIGDST_PORT))
		return false;

	tuple = &ct->tuplehash[IP_CT_DIR_REPLY].tuple;

	if ((info->match_flags & XT_CONNTRACK_REPLSRC_PORT) &&
	    (tuple->src.u.all == info->replsrc_port) ^
	    !(info->invert_flags & XT_CONNTRACK_REPLSRC_PORT))
		return false;

	if ((info->match_flags & XT_CONNTRACK_REPLDST_PORT) &&
	    (tuple->dst.u.all == info->repldst_port) ^
	    !(info->invert_flags & XT_CONNTRACK_REPLDST_PORT))
		return false;

	return true;
}

static bool
conntrack_mt(const struct sk_buff *skb, const struct xt_match_param *par)
{
	const struct xt_conntrack_mtinfo1 *info = par->matchinfo;
	enum ip_conntrack_info ctinfo;
	const struct nf_conn *ct;
	unsigned int statebit;

	ct = nf_ct_get(skb, &ctinfo);

	if (ct == &nf_conntrack_untracked)
		statebit = XT_CONNTRACK_STATE_UNTRACKED;
	else if (ct != NULL)
		statebit = XT_CONNTRACK_STATE_BIT(ctinfo);
	else
		statebit = XT_CONNTRACK_STATE_INVALID;

	if (info->match_flags & XT_CONNTRACK_STATE) {
		if (ct != NULL) {
			if (test_bit(IPS_SRC_NAT_BIT, &ct->status))
				statebit |= XT_CONNTRACK_STATE_SNAT;
			if (test_bit(IPS_DST_NAT_BIT, &ct->status))
				statebit |= XT_CONNTRACK_STATE_DNAT;
		}
		if (!!(info->state_mask & statebit) ^
		    !(info->invert_flags & XT_CONNTRACK_STATE))
			return false;
	}

	if (ct == NULL)
		return info->match_flags & XT_CONNTRACK_STATE;
	if ((info->match_flags & XT_CONNTRACK_DIRECTION) &&
	    (CTINFO2DIR(ctinfo) == IP_CT_DIR_ORIGINAL) ^
	    !!(info->invert_flags & XT_CONNTRACK_DIRECTION))
		return false;

	if (info->match_flags & XT_CONNTRACK_ORIGSRC)
		if (conntrack_mt_origsrc(ct, info, par->family) ^
		    !(info->invert_flags & XT_CONNTRACK_ORIGSRC))
			return false;

	if (info->match_flags & XT_CONNTRACK_ORIGDST)
		if (conntrack_mt_origdst(ct, info, par->family) ^
		    !(info->invert_flags & XT_CONNTRACK_ORIGDST))
			return false;

	if (info->match_flags & XT_CONNTRACK_REPLSRC)
		if (conntrack_mt_replsrc(ct, info, par->family) ^
		    !(info->invert_flags & XT_CONNTRACK_REPLSRC))
			return false;

	if (info->match_flags & XT_CONNTRACK_REPLDST)
		if (conntrack_mt_repldst(ct, info, par->family) ^
		    !(info->invert_flags & XT_CONNTRACK_REPLDST))
			return false;

	if (!ct_proto_port_check(info, ct))
		return false;

	if ((info->match_flags & XT_CONNTRACK_STATUS) &&
	    (!!(info->status_mask & ct->status) ^
	    !(info->invert_flags & XT_CONNTRACK_STATUS)))
		return false;

	if (info->match_flags & XT_CONNTRACK_EXPIRES) {
		unsigned long expires = 0;

		if (timer_pending(&ct->timeout))
			expires = (ct->timeout.expires - jiffies) / HZ;
		if ((expires >= info->expires_min &&
		    expires <= info->expires_max) ^
		    !(info->invert_flags & XT_CONNTRACK_EXPIRES))
			return false;
	}
	return true;
}

static bool conntrack_mt_check(const struct xt_mtchk_param *par)
{
	if (nf_ct_l3proto_try_module_get(par->family) < 0) {
		printk(KERN_WARNING "can't load conntrack support for "
				    "proto=%u\n", par->family);
		return false;
	}
	return true;
}

static void conntrack_mt_destroy(const struct xt_mtdtor_param *par)
{
	nf_ct_l3proto_module_put(par->family);
}

#ifdef CONFIG_COMPAT
struct compat_xt_conntrack_info
{
	compat_uint_t			statemask;
	compat_uint_t			statusmask;
	struct ip_conntrack_old_tuple	tuple[IP_CT_DIR_MAX];
	struct in_addr			sipmsk[IP_CT_DIR_MAX];
	struct in_addr			dipmsk[IP_CT_DIR_MAX];
	compat_ulong_t			expires_min;
	compat_ulong_t			expires_max;
	u_int8_t			flags;
	u_int8_t			invflags;
};

static void conntrack_mt_compat_from_user_v0(void *dst, void *src)
{
	const struct compat_xt_conntrack_info *cm = src;
	struct xt_conntrack_info m = {
		.statemask	= cm->statemask,
		.statusmask	= cm->statusmask,
		.expires_min	= cm->expires_min,
		.expires_max	= cm->expires_max,
		.flags		= cm->flags,
		.invflags	= cm->invflags,
	};
	memcpy(m.tuple, cm->tuple, sizeof(m.tuple));
	memcpy(m.sipmsk, cm->sipmsk, sizeof(m.sipmsk));
	memcpy(m.dipmsk, cm->dipmsk, sizeof(m.dipmsk));
	memcpy(dst, &m, sizeof(m));
}

static int conntrack_mt_compat_to_user_v0(void __user *dst, void *src)
{
	const struct xt_conntrack_info *m = src;
	struct compat_xt_conntrack_info cm = {
		.statemask	= m->statemask,
		.statusmask	= m->statusmask,
		.expires_min	= m->expires_min,
		.expires_max	= m->expires_max,
		.flags		= m->flags,
		.invflags	= m->invflags,
	};
	memcpy(cm.tuple, m->tuple, sizeof(cm.tuple));
	memcpy(cm.sipmsk, m->sipmsk, sizeof(cm.sipmsk));
	memcpy(cm.dipmsk, m->dipmsk, sizeof(cm.dipmsk));
	return copy_to_user(dst, &cm, sizeof(cm)) ? -EFAULT : 0;
}
#endif

static struct xt_match conntrack_mt_reg[] __read_mostly = {
	{
		.name       = "conntrack",
		.revision   = 0,
		.family     = NFPROTO_IPV4,
		.match      = conntrack_mt_v0,
		.checkentry = conntrack_mt_check,
		.destroy    = conntrack_mt_destroy,
		.matchsize  = sizeof(struct xt_conntrack_info),
		.me         = THIS_MODULE,
#ifdef CONFIG_COMPAT
		.compatsize       = sizeof(struct compat_xt_conntrack_info),
		.compat_from_user = conntrack_mt_compat_from_user_v0,
		.compat_to_user   = conntrack_mt_compat_to_user_v0,
#endif
	},
	{
		.name       = "conntrack",
		.revision   = 1,
		.family     = NFPROTO_UNSPEC,
		.matchsize  = sizeof(struct xt_conntrack_mtinfo1),
		.match      = conntrack_mt,
		.checkentry = conntrack_mt_check,
		.destroy    = conntrack_mt_destroy,
		.me         = THIS_MODULE,
	},
};

static int __init conntrack_mt_init(void)
{
	return xt_register_matches(conntrack_mt_reg,
	       ARRAY_SIZE(conntrack_mt_reg));
}

static void __exit conntrack_mt_exit(void)
{
	xt_unregister_matches(conntrack_mt_reg, ARRAY_SIZE(conntrack_mt_reg));
}

module_init(conntrack_mt_init);
module_exit(conntrack_mt_exit);