2 * x_tables core - Backend for {ip,ip6,arp}_tables
4 * Copyright (C) 2006-2006 Harald Welte <laforge@netfilter.org>
6 * Based on existing ip_tables code which is
7 * Copyright (C) 1999 Paul `Rusty' Russell & Michael J. Neuling
8 * Copyright (C) 2000-2005 Netfilter Core Team <coreteam@netfilter.org>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
16 #include <linux/kernel.h>
17 #include <linux/socket.h>
18 #include <linux/net.h>
19 #include <linux/proc_fs.h>
20 #include <linux/seq_file.h>
21 #include <linux/string.h>
22 #include <linux/vmalloc.h>
23 #include <linux/mutex.h>
25 #include <linux/netfilter/x_tables.h>
26 #include <linux/netfilter_arp.h>
29 MODULE_LICENSE("GPL");
30 MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
31 MODULE_DESCRIPTION("[ip,ip6,arp]_tables backend module");
33 #define SMP_ALIGN(x) (((x) + SMP_CACHE_BYTES-1) & ~(SMP_CACHE_BYTES-1))
37 struct list_head match
;
38 struct list_head target
;
39 struct list_head tables
;
40 struct mutex compat_mutex
;
43 static struct xt_af
*xt
;
45 #ifdef DEBUG_IP_FIREWALL_USER
46 #define duprintf(format, args...) printk(format , ## args)
48 #define duprintf(format, args...)
57 static const char *xt_prefix
[NPROTO
] = {
63 /* Registration hooks for targets. */
65 xt_register_target(struct xt_target
*target
)
67 int ret
, af
= target
->family
;
69 ret
= mutex_lock_interruptible(&xt
[af
].mutex
);
72 list_add(&target
->list
, &xt
[af
].target
);
73 mutex_unlock(&xt
[af
].mutex
);
76 EXPORT_SYMBOL(xt_register_target
);
79 xt_unregister_target(struct xt_target
*target
)
81 int af
= target
->family
;
83 mutex_lock(&xt
[af
].mutex
);
84 LIST_DELETE(&xt
[af
].target
, target
);
85 mutex_unlock(&xt
[af
].mutex
);
87 EXPORT_SYMBOL(xt_unregister_target
);
90 xt_register_match(struct xt_match
*match
)
92 int ret
, af
= match
->family
;
94 ret
= mutex_lock_interruptible(&xt
[af
].mutex
);
98 list_add(&match
->list
, &xt
[af
].match
);
99 mutex_unlock(&xt
[af
].mutex
);
103 EXPORT_SYMBOL(xt_register_match
);
106 xt_unregister_match(struct xt_match
*match
)
108 int af
= match
->family
;
110 mutex_lock(&xt
[af
].mutex
);
111 LIST_DELETE(&xt
[af
].match
, match
);
112 mutex_unlock(&xt
[af
].mutex
);
114 EXPORT_SYMBOL(xt_unregister_match
);
118 * These are weird, but module loading must not be done with mutex
119 * held (since they will register), and we have to have a single
120 * function to use try_then_request_module().
123 /* Find match, grabs ref. Returns ERR_PTR() on error. */
124 struct xt_match
*xt_find_match(int af
, const char *name
, u8 revision
)
129 if (mutex_lock_interruptible(&xt
[af
].mutex
) != 0)
130 return ERR_PTR(-EINTR
);
132 list_for_each_entry(m
, &xt
[af
].match
, list
) {
133 if (strcmp(m
->name
, name
) == 0) {
134 if (m
->revision
== revision
) {
135 if (try_module_get(m
->me
)) {
136 mutex_unlock(&xt
[af
].mutex
);
140 err
= -EPROTOTYPE
; /* Found something. */
143 mutex_unlock(&xt
[af
].mutex
);
146 EXPORT_SYMBOL(xt_find_match
);
148 /* Find target, grabs ref. Returns ERR_PTR() on error. */
149 struct xt_target
*xt_find_target(int af
, const char *name
, u8 revision
)
154 if (mutex_lock_interruptible(&xt
[af
].mutex
) != 0)
155 return ERR_PTR(-EINTR
);
157 list_for_each_entry(t
, &xt
[af
].target
, list
) {
158 if (strcmp(t
->name
, name
) == 0) {
159 if (t
->revision
== revision
) {
160 if (try_module_get(t
->me
)) {
161 mutex_unlock(&xt
[af
].mutex
);
165 err
= -EPROTOTYPE
; /* Found something. */
168 mutex_unlock(&xt
[af
].mutex
);
171 EXPORT_SYMBOL(xt_find_target
);
173 struct xt_target
*xt_request_find_target(int af
, const char *name
, u8 revision
)
175 struct xt_target
*target
;
177 target
= try_then_request_module(xt_find_target(af
, name
, revision
),
178 "%st_%s", xt_prefix
[af
], name
);
179 if (IS_ERR(target
) || !target
)
183 EXPORT_SYMBOL_GPL(xt_request_find_target
);
185 static int match_revfn(int af
, const char *name
, u8 revision
, int *bestp
)
190 list_for_each_entry(m
, &xt
[af
].match
, list
) {
191 if (strcmp(m
->name
, name
) == 0) {
192 if (m
->revision
> *bestp
)
193 *bestp
= m
->revision
;
194 if (m
->revision
== revision
)
201 static int target_revfn(int af
, const char *name
, u8 revision
, int *bestp
)
206 list_for_each_entry(t
, &xt
[af
].target
, list
) {
207 if (strcmp(t
->name
, name
) == 0) {
208 if (t
->revision
> *bestp
)
209 *bestp
= t
->revision
;
210 if (t
->revision
== revision
)
217 /* Returns true or false (if no such extension at all) */
218 int xt_find_revision(int af
, const char *name
, u8 revision
, int target
,
221 int have_rev
, best
= -1;
223 if (mutex_lock_interruptible(&xt
[af
].mutex
) != 0) {
228 have_rev
= target_revfn(af
, name
, revision
, &best
);
230 have_rev
= match_revfn(af
, name
, revision
, &best
);
231 mutex_unlock(&xt
[af
].mutex
);
233 /* Nothing at all? Return 0 to try loading module. */
241 *err
= -EPROTONOSUPPORT
;
244 EXPORT_SYMBOL_GPL(xt_find_revision
);
246 int xt_check_match(const struct xt_match
*match
, unsigned short family
,
247 unsigned int size
, const char *table
, unsigned int hook_mask
,
248 unsigned short proto
, int inv_proto
)
250 if (XT_ALIGN(match
->matchsize
) != size
) {
251 printk("%s_tables: %s match: invalid size %Zu != %u\n",
252 xt_prefix
[family
], match
->name
,
253 XT_ALIGN(match
->matchsize
), size
);
256 if (match
->table
&& strcmp(match
->table
, table
)) {
257 printk("%s_tables: %s match: only valid in %s table, not %s\n",
258 xt_prefix
[family
], match
->name
, match
->table
, table
);
261 if (match
->hooks
&& (hook_mask
& ~match
->hooks
) != 0) {
262 printk("%s_tables: %s match: bad hook_mask %u\n",
263 xt_prefix
[family
], match
->name
, hook_mask
);
266 if (match
->proto
&& (match
->proto
!= proto
|| inv_proto
)) {
267 printk("%s_tables: %s match: only valid for protocol %u\n",
268 xt_prefix
[family
], match
->name
, match
->proto
);
273 EXPORT_SYMBOL_GPL(xt_check_match
);
276 int xt_compat_match(void *match
, void **dstptr
, int *size
, int convert
)
279 struct compat_xt_entry_match
*pcompat_m
;
280 struct xt_entry_match
*pm
;
285 m
= ((struct xt_entry_match
*)match
)->u
.kernel
.match
;
286 off
= XT_ALIGN(m
->matchsize
) - COMPAT_XT_ALIGN(m
->matchsize
);
289 pm
= (struct xt_entry_match
*)match
;
290 msize
= pm
->u
.user
.match_size
;
291 if (copy_to_user(*dstptr
, pm
, msize
)) {
296 if (put_user(msize
, (u_int16_t
*)*dstptr
))
301 case COMPAT_FROM_USER
:
302 pcompat_m
= (struct compat_xt_entry_match
*)match
;
303 pm
= (struct xt_entry_match
*)*dstptr
;
304 msize
= pcompat_m
->u
.user
.match_size
;
305 memcpy(pm
, pcompat_m
, msize
);
307 pm
->u
.user
.match_size
= msize
;
311 case COMPAT_CALC_SIZE
:
320 EXPORT_SYMBOL_GPL(xt_compat_match
);
323 int xt_check_target(const struct xt_target
*target
, unsigned short family
,
324 unsigned int size
, const char *table
, unsigned int hook_mask
,
325 unsigned short proto
, int inv_proto
)
327 if (XT_ALIGN(target
->targetsize
) != size
) {
328 printk("%s_tables: %s target: invalid size %Zu != %u\n",
329 xt_prefix
[family
], target
->name
,
330 XT_ALIGN(target
->targetsize
), size
);
333 if (target
->table
&& strcmp(target
->table
, table
)) {
334 printk("%s_tables: %s target: only valid in %s table, not %s\n",
335 xt_prefix
[family
], target
->name
, target
->table
, table
);
338 if (target
->hooks
&& (hook_mask
& ~target
->hooks
) != 0) {
339 printk("%s_tables: %s target: bad hook_mask %u\n",
340 xt_prefix
[family
], target
->name
, hook_mask
);
343 if (target
->proto
&& (target
->proto
!= proto
|| inv_proto
)) {
344 printk("%s_tables: %s target: only valid for protocol %u\n",
345 xt_prefix
[family
], target
->name
, target
->proto
);
350 EXPORT_SYMBOL_GPL(xt_check_target
);
353 int xt_compat_target(void *target
, void **dstptr
, int *size
, int convert
)
356 struct compat_xt_entry_target
*pcompat
;
357 struct xt_entry_target
*pt
;
362 t
= ((struct xt_entry_target
*)target
)->u
.kernel
.target
;
363 off
= XT_ALIGN(t
->targetsize
) - COMPAT_XT_ALIGN(t
->targetsize
);
366 pt
= (struct xt_entry_target
*)target
;
367 tsize
= pt
->u
.user
.target_size
;
368 if (copy_to_user(*dstptr
, pt
, tsize
)) {
373 if (put_user(tsize
, (u_int16_t
*)*dstptr
))
378 case COMPAT_FROM_USER
:
379 pcompat
= (struct compat_xt_entry_target
*)target
;
380 pt
= (struct xt_entry_target
*)*dstptr
;
381 tsize
= pcompat
->u
.user
.target_size
;
382 memcpy(pt
, pcompat
, tsize
);
384 pt
->u
.user
.target_size
= tsize
;
388 case COMPAT_CALC_SIZE
:
397 EXPORT_SYMBOL_GPL(xt_compat_target
);
400 struct xt_table_info
*xt_alloc_table_info(unsigned int size
)
402 struct xt_table_info
*newinfo
;
405 /* Pedantry: prevent them from hitting BUG() in vmalloc.c --RR */
406 if ((SMP_ALIGN(size
) >> PAGE_SHIFT
) + 2 > num_physpages
)
409 newinfo
= kzalloc(sizeof(struct xt_table_info
), GFP_KERNEL
);
413 newinfo
->size
= size
;
415 for_each_possible_cpu(cpu
) {
416 if (size
<= PAGE_SIZE
)
417 newinfo
->entries
[cpu
] = kmalloc_node(size
,
421 newinfo
->entries
[cpu
] = vmalloc_node(size
,
424 if (newinfo
->entries
[cpu
] == NULL
) {
425 xt_free_table_info(newinfo
);
432 EXPORT_SYMBOL(xt_alloc_table_info
);
434 void xt_free_table_info(struct xt_table_info
*info
)
438 for_each_possible_cpu(cpu
) {
439 if (info
->size
<= PAGE_SIZE
)
440 kfree(info
->entries
[cpu
]);
442 vfree(info
->entries
[cpu
]);
446 EXPORT_SYMBOL(xt_free_table_info
);
448 /* Find table by name, grabs mutex & ref. Returns ERR_PTR() on error. */
449 struct xt_table
*xt_find_table_lock(int af
, const char *name
)
453 if (mutex_lock_interruptible(&xt
[af
].mutex
) != 0)
454 return ERR_PTR(-EINTR
);
456 list_for_each_entry(t
, &xt
[af
].tables
, list
)
457 if (strcmp(t
->name
, name
) == 0 && try_module_get(t
->me
))
459 mutex_unlock(&xt
[af
].mutex
);
462 EXPORT_SYMBOL_GPL(xt_find_table_lock
);
464 void xt_table_unlock(struct xt_table
*table
)
466 mutex_unlock(&xt
[table
->af
].mutex
);
468 EXPORT_SYMBOL_GPL(xt_table_unlock
);
471 void xt_compat_lock(int af
)
473 mutex_lock(&xt
[af
].compat_mutex
);
475 EXPORT_SYMBOL_GPL(xt_compat_lock
);
477 void xt_compat_unlock(int af
)
479 mutex_unlock(&xt
[af
].compat_mutex
);
481 EXPORT_SYMBOL_GPL(xt_compat_unlock
);
484 struct xt_table_info
*
485 xt_replace_table(struct xt_table
*table
,
486 unsigned int num_counters
,
487 struct xt_table_info
*newinfo
,
490 struct xt_table_info
*oldinfo
, *private;
492 /* Do the substitution. */
493 write_lock_bh(&table
->lock
);
494 private = table
->private;
495 /* Check inside lock: is the old number correct? */
496 if (num_counters
!= private->number
) {
497 duprintf("num_counters != table->private->number (%u/%u)\n",
498 num_counters
, private->number
);
499 write_unlock_bh(&table
->lock
);
504 table
->private = newinfo
;
505 newinfo
->initial_entries
= oldinfo
->initial_entries
;
506 write_unlock_bh(&table
->lock
);
510 EXPORT_SYMBOL_GPL(xt_replace_table
);
512 int xt_register_table(struct xt_table
*table
,
513 struct xt_table_info
*bootstrap
,
514 struct xt_table_info
*newinfo
)
517 struct xt_table_info
*private;
519 ret
= mutex_lock_interruptible(&xt
[table
->af
].mutex
);
523 /* Don't autoload: we'd eat our tail... */
524 if (list_named_find(&xt
[table
->af
].tables
, table
->name
)) {
529 /* Simplifies replace_table code. */
530 table
->private = bootstrap
;
531 rwlock_init(&table
->lock
);
532 if (!xt_replace_table(table
, 0, newinfo
, &ret
))
535 private = table
->private;
536 duprintf("table->private->number = %u\n", private->number
);
538 /* save number of initial entries */
539 private->initial_entries
= private->number
;
541 list_prepend(&xt
[table
->af
].tables
, table
);
545 mutex_unlock(&xt
[table
->af
].mutex
);
548 EXPORT_SYMBOL_GPL(xt_register_table
);
550 void *xt_unregister_table(struct xt_table
*table
)
552 struct xt_table_info
*private;
554 mutex_lock(&xt
[table
->af
].mutex
);
555 private = table
->private;
556 LIST_DELETE(&xt
[table
->af
].tables
, table
);
557 mutex_unlock(&xt
[table
->af
].mutex
);
561 EXPORT_SYMBOL_GPL(xt_unregister_table
);
563 #ifdef CONFIG_PROC_FS
564 static char *xt_proto_prefix
[NPROTO
] = {
570 static struct list_head
*xt_get_idx(struct list_head
*list
, struct seq_file
*seq
, loff_t pos
)
572 struct list_head
*head
= list
->next
;
574 if (!head
|| list_empty(list
))
577 while (pos
&& (head
= head
->next
)) {
582 return pos
? NULL
: head
;
585 static struct list_head
*type2list(u_int16_t af
, u_int16_t type
)
587 struct list_head
*list
;
591 list
= &xt
[af
].target
;
594 list
= &xt
[af
].match
;
597 list
= &xt
[af
].tables
;
607 static void *xt_tgt_seq_start(struct seq_file
*seq
, loff_t
*pos
)
609 struct proc_dir_entry
*pde
= (struct proc_dir_entry
*) seq
->private;
610 u_int16_t af
= (unsigned long)pde
->data
& 0xffff;
611 u_int16_t type
= (unsigned long)pde
->data
>> 16;
612 struct list_head
*list
;
617 list
= type2list(af
, type
);
621 if (mutex_lock_interruptible(&xt
[af
].mutex
) != 0)
624 return xt_get_idx(list
, seq
, *pos
);
627 static void *xt_tgt_seq_next(struct seq_file
*seq
, void *v
, loff_t
*pos
)
629 struct proc_dir_entry
*pde
= seq
->private;
630 u_int16_t af
= (unsigned long)pde
->data
& 0xffff;
631 u_int16_t type
= (unsigned long)pde
->data
>> 16;
632 struct list_head
*list
;
637 list
= type2list(af
, type
);
642 return xt_get_idx(list
, seq
, *pos
);
645 static void xt_tgt_seq_stop(struct seq_file
*seq
, void *v
)
647 struct proc_dir_entry
*pde
= seq
->private;
648 u_int16_t af
= (unsigned long)pde
->data
& 0xffff;
650 mutex_unlock(&xt
[af
].mutex
);
653 static int xt_name_seq_show(struct seq_file
*seq
, void *v
)
655 char *name
= (char *)v
+ sizeof(struct list_head
);
658 return seq_printf(seq
, "%s\n", name
);
663 static struct seq_operations xt_tgt_seq_ops
= {
664 .start
= xt_tgt_seq_start
,
665 .next
= xt_tgt_seq_next
,
666 .stop
= xt_tgt_seq_stop
,
667 .show
= xt_name_seq_show
,
670 static int xt_tgt_open(struct inode
*inode
, struct file
*file
)
674 ret
= seq_open(file
, &xt_tgt_seq_ops
);
676 struct seq_file
*seq
= file
->private_data
;
677 struct proc_dir_entry
*pde
= PDE(inode
);
685 static struct file_operations xt_file_ops
= {
686 .owner
= THIS_MODULE
,
690 .release
= seq_release
,
693 #define FORMAT_TABLES "_tables_names"
694 #define FORMAT_MATCHES "_tables_matches"
695 #define FORMAT_TARGETS "_tables_targets"
697 #endif /* CONFIG_PROC_FS */
699 int xt_proto_init(int af
)
701 #ifdef CONFIG_PROC_FS
702 char buf
[XT_FUNCTION_MAXNAMELEN
];
703 struct proc_dir_entry
*proc
;
710 #ifdef CONFIG_PROC_FS
711 strlcpy(buf
, xt_proto_prefix
[af
], sizeof(buf
));
712 strlcat(buf
, FORMAT_TABLES
, sizeof(buf
));
713 proc
= proc_net_fops_create(buf
, 0440, &xt_file_ops
);
716 proc
->data
= (void *) ((unsigned long) af
| (TABLE
<< 16));
719 strlcpy(buf
, xt_proto_prefix
[af
], sizeof(buf
));
720 strlcat(buf
, FORMAT_MATCHES
, sizeof(buf
));
721 proc
= proc_net_fops_create(buf
, 0440, &xt_file_ops
);
723 goto out_remove_tables
;
724 proc
->data
= (void *) ((unsigned long) af
| (MATCH
<< 16));
726 strlcpy(buf
, xt_proto_prefix
[af
], sizeof(buf
));
727 strlcat(buf
, FORMAT_TARGETS
, sizeof(buf
));
728 proc
= proc_net_fops_create(buf
, 0440, &xt_file_ops
);
730 goto out_remove_matches
;
731 proc
->data
= (void *) ((unsigned long) af
| (TARGET
<< 16));
736 #ifdef CONFIG_PROC_FS
738 strlcpy(buf
, xt_proto_prefix
[af
], sizeof(buf
));
739 strlcat(buf
, FORMAT_MATCHES
, sizeof(buf
));
740 proc_net_remove(buf
);
743 strlcpy(buf
, xt_proto_prefix
[af
], sizeof(buf
));
744 strlcat(buf
, FORMAT_TABLES
, sizeof(buf
));
745 proc_net_remove(buf
);
750 EXPORT_SYMBOL_GPL(xt_proto_init
);
752 void xt_proto_fini(int af
)
754 #ifdef CONFIG_PROC_FS
755 char buf
[XT_FUNCTION_MAXNAMELEN
];
757 strlcpy(buf
, xt_proto_prefix
[af
], sizeof(buf
));
758 strlcat(buf
, FORMAT_TABLES
, sizeof(buf
));
759 proc_net_remove(buf
);
761 strlcpy(buf
, xt_proto_prefix
[af
], sizeof(buf
));
762 strlcat(buf
, FORMAT_TARGETS
, sizeof(buf
));
763 proc_net_remove(buf
);
765 strlcpy(buf
, xt_proto_prefix
[af
], sizeof(buf
));
766 strlcat(buf
, FORMAT_MATCHES
, sizeof(buf
));
767 proc_net_remove(buf
);
768 #endif /*CONFIG_PROC_FS*/
770 EXPORT_SYMBOL_GPL(xt_proto_fini
);
773 static int __init
xt_init(void)
777 xt
= kmalloc(sizeof(struct xt_af
) * NPROTO
, GFP_KERNEL
);
781 for (i
= 0; i
< NPROTO
; i
++) {
782 mutex_init(&xt
[i
].mutex
);
784 mutex_init(&xt
[i
].compat_mutex
);
786 INIT_LIST_HEAD(&xt
[i
].target
);
787 INIT_LIST_HEAD(&xt
[i
].match
);
788 INIT_LIST_HEAD(&xt
[i
].tables
);
793 static void __exit
xt_fini(void)
798 module_init(xt_init
);
799 module_exit(xt_fini
);