[TG3]: Add tagged status support.
[linux-2.6/verdex.git] / net / bridge / netfilter / ebtables.c
blob18ebc664769b1b2442f348060e60147d52176370
1 /*
2 * ebtables
4 * Author:
5 * Bart De Schuymer <bdschuym@pandora.be>
7 * ebtables.c,v 2.0, July, 2002
9 * This code is stongly inspired on the iptables code which is
10 * Copyright (C) 1999 Paul `Rusty' Russell & Michael J. Neuling
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version
15 * 2 of the License, or (at your option) any later version.
18 /* used for print_string */
19 #include <linux/sched.h>
20 #include <linux/tty.h>
22 #include <linux/kmod.h>
23 #include <linux/module.h>
24 #include <linux/vmalloc.h>
25 #include <linux/netfilter_bridge/ebtables.h>
26 #include <linux/spinlock.h>
27 #include <asm/uaccess.h>
28 #include <linux/smp.h>
29 #include <net/sock.h>
30 /* needed for logical [in,out]-dev filtering */
31 #include "../br_private.h"
33 /* list_named_find */
34 #define ASSERT_READ_LOCK(x)
35 #define ASSERT_WRITE_LOCK(x)
36 #include <linux/netfilter_ipv4/listhelp.h>
38 #if 0
39 /* use this for remote debugging
40 * Copyright (C) 1998 by Ori Pomerantz
41 * Print the string to the appropriate tty, the one
42 * the current task uses
44 static void print_string(char *str)
46 struct tty_struct *my_tty;
48 /* The tty for the current task */
49 my_tty = current->signal->tty;
50 if (my_tty != NULL) {
51 my_tty->driver->write(my_tty, 0, str, strlen(str));
52 my_tty->driver->write(my_tty, 0, "\015\012", 2);
56 #define BUGPRINT(args) print_string(args);
57 #else
58 #define BUGPRINT(format, args...) printk("kernel msg: ebtables bug: please "\
59 "report to author: "format, ## args)
60 /* #define BUGPRINT(format, args...) */
61 #endif
62 #define MEMPRINT(format, args...) printk("kernel msg: ebtables "\
63 ": out of memory: "format, ## args)
64 /* #define MEMPRINT(format, args...) */
69 * Each cpu has its own set of counters, so there is no need for write_lock in
70 * the softirq
71 * For reading or updating the counters, the user context needs to
72 * get a write_lock
75 /* The size of each set of counters is altered to get cache alignment */
76 #define SMP_ALIGN(x) (((x) + SMP_CACHE_BYTES-1) & ~(SMP_CACHE_BYTES-1))
77 #define COUNTER_OFFSET(n) (SMP_ALIGN(n * sizeof(struct ebt_counter)))
78 #define COUNTER_BASE(c, n, cpu) ((struct ebt_counter *)(((char *)c) + \
79 COUNTER_OFFSET(n) * cpu))
83 static DECLARE_MUTEX(ebt_mutex);
84 static LIST_HEAD(ebt_tables);
85 static LIST_HEAD(ebt_targets);
86 static LIST_HEAD(ebt_matches);
87 static LIST_HEAD(ebt_watchers);
89 static struct ebt_target ebt_standard_target =
90 { {NULL, NULL}, EBT_STANDARD_TARGET, NULL, NULL, NULL, NULL};
92 static inline int ebt_do_watcher (struct ebt_entry_watcher *w,
93 const struct sk_buff *skb, unsigned int hooknr, const struct net_device *in,
94 const struct net_device *out)
96 w->u.watcher->watcher(skb, hooknr, in, out, w->data,
97 w->watcher_size);
98 /* watchers don't give a verdict */
99 return 0;
102 static inline int ebt_do_match (struct ebt_entry_match *m,
103 const struct sk_buff *skb, const struct net_device *in,
104 const struct net_device *out)
106 return m->u.match->match(skb, in, out, m->data,
107 m->match_size);
110 static inline int ebt_dev_check(char *entry, const struct net_device *device)
112 int i = 0;
113 char *devname = device->name;
115 if (*entry == '\0')
116 return 0;
117 if (!device)
118 return 1;
119 /* 1 is the wildcard token */
120 while (entry[i] != '\0' && entry[i] != 1 && entry[i] == devname[i])
121 i++;
122 return (devname[i] != entry[i] && entry[i] != 1);
125 #define FWINV2(bool,invflg) ((bool) ^ !!(e->invflags & invflg))
126 /* process standard matches */
127 static inline int ebt_basic_match(struct ebt_entry *e, struct ethhdr *h,
128 const struct net_device *in, const struct net_device *out)
130 int verdict, i;
132 if (e->bitmask & EBT_802_3) {
133 if (FWINV2(ntohs(h->h_proto) >= 1536, EBT_IPROTO))
134 return 1;
135 } else if (!(e->bitmask & EBT_NOPROTO) &&
136 FWINV2(e->ethproto != h->h_proto, EBT_IPROTO))
137 return 1;
139 if (FWINV2(ebt_dev_check(e->in, in), EBT_IIN))
140 return 1;
141 if (FWINV2(ebt_dev_check(e->out, out), EBT_IOUT))
142 return 1;
143 if ((!in || !in->br_port) ? 0 : FWINV2(ebt_dev_check(
144 e->logical_in, in->br_port->br->dev), EBT_ILOGICALIN))
145 return 1;
146 if ((!out || !out->br_port) ? 0 : FWINV2(ebt_dev_check(
147 e->logical_out, out->br_port->br->dev), EBT_ILOGICALOUT))
148 return 1;
150 if (e->bitmask & EBT_SOURCEMAC) {
151 verdict = 0;
152 for (i = 0; i < 6; i++)
153 verdict |= (h->h_source[i] ^ e->sourcemac[i]) &
154 e->sourcemsk[i];
155 if (FWINV2(verdict != 0, EBT_ISOURCE) )
156 return 1;
158 if (e->bitmask & EBT_DESTMAC) {
159 verdict = 0;
160 for (i = 0; i < 6; i++)
161 verdict |= (h->h_dest[i] ^ e->destmac[i]) &
162 e->destmsk[i];
163 if (FWINV2(verdict != 0, EBT_IDEST) )
164 return 1;
166 return 0;
169 /* Do some firewalling */
170 unsigned int ebt_do_table (unsigned int hook, struct sk_buff **pskb,
171 const struct net_device *in, const struct net_device *out,
172 struct ebt_table *table)
174 int i, nentries;
175 struct ebt_entry *point;
176 struct ebt_counter *counter_base, *cb_base;
177 struct ebt_entry_target *t;
178 int verdict, sp = 0;
179 struct ebt_chainstack *cs;
180 struct ebt_entries *chaininfo;
181 char *base;
182 struct ebt_table_info *private;
184 read_lock_bh(&table->lock);
185 private = table->private;
186 cb_base = COUNTER_BASE(private->counters, private->nentries,
187 smp_processor_id());
188 if (private->chainstack)
189 cs = private->chainstack[smp_processor_id()];
190 else
191 cs = NULL;
192 chaininfo = private->hook_entry[hook];
193 nentries = private->hook_entry[hook]->nentries;
194 point = (struct ebt_entry *)(private->hook_entry[hook]->data);
195 counter_base = cb_base + private->hook_entry[hook]->counter_offset;
196 /* base for chain jumps */
197 base = private->entries;
198 i = 0;
199 while (i < nentries) {
200 if (ebt_basic_match(point, eth_hdr(*pskb), in, out))
201 goto letscontinue;
203 if (EBT_MATCH_ITERATE(point, ebt_do_match, *pskb, in, out) != 0)
204 goto letscontinue;
206 /* increase counter */
207 (*(counter_base + i)).pcnt++;
208 (*(counter_base + i)).bcnt+=(**pskb).len;
210 /* these should only watch: not modify, nor tell us
211 what to do with the packet */
212 EBT_WATCHER_ITERATE(point, ebt_do_watcher, *pskb, hook, in,
213 out);
215 t = (struct ebt_entry_target *)
216 (((char *)point) + point->target_offset);
217 /* standard target */
218 if (!t->u.target->target)
219 verdict = ((struct ebt_standard_target *)t)->verdict;
220 else
221 verdict = t->u.target->target(pskb, hook,
222 in, out, t->data, t->target_size);
223 if (verdict == EBT_ACCEPT) {
224 read_unlock_bh(&table->lock);
225 return NF_ACCEPT;
227 if (verdict == EBT_DROP) {
228 read_unlock_bh(&table->lock);
229 return NF_DROP;
231 if (verdict == EBT_RETURN) {
232 letsreturn:
233 #ifdef CONFIG_NETFILTER_DEBUG
234 if (sp == 0) {
235 BUGPRINT("RETURN on base chain");
236 /* act like this is EBT_CONTINUE */
237 goto letscontinue;
239 #endif
240 sp--;
241 /* put all the local variables right */
242 i = cs[sp].n;
243 chaininfo = cs[sp].chaininfo;
244 nentries = chaininfo->nentries;
245 point = cs[sp].e;
246 counter_base = cb_base +
247 chaininfo->counter_offset;
248 continue;
250 if (verdict == EBT_CONTINUE)
251 goto letscontinue;
252 #ifdef CONFIG_NETFILTER_DEBUG
253 if (verdict < 0) {
254 BUGPRINT("bogus standard verdict\n");
255 read_unlock_bh(&table->lock);
256 return NF_DROP;
258 #endif
259 /* jump to a udc */
260 cs[sp].n = i + 1;
261 cs[sp].chaininfo = chaininfo;
262 cs[sp].e = (struct ebt_entry *)
263 (((char *)point) + point->next_offset);
264 i = 0;
265 chaininfo = (struct ebt_entries *) (base + verdict);
266 #ifdef CONFIG_NETFILTER_DEBUG
267 if (chaininfo->distinguisher) {
268 BUGPRINT("jump to non-chain\n");
269 read_unlock_bh(&table->lock);
270 return NF_DROP;
272 #endif
273 nentries = chaininfo->nentries;
274 point = (struct ebt_entry *)chaininfo->data;
275 counter_base = cb_base + chaininfo->counter_offset;
276 sp++;
277 continue;
278 letscontinue:
279 point = (struct ebt_entry *)
280 (((char *)point) + point->next_offset);
281 i++;
284 /* I actually like this :) */
285 if (chaininfo->policy == EBT_RETURN)
286 goto letsreturn;
287 if (chaininfo->policy == EBT_ACCEPT) {
288 read_unlock_bh(&table->lock);
289 return NF_ACCEPT;
291 read_unlock_bh(&table->lock);
292 return NF_DROP;
295 /* If it succeeds, returns element and locks mutex */
296 static inline void *
297 find_inlist_lock_noload(struct list_head *head, const char *name, int *error,
298 struct semaphore *mutex)
300 void *ret;
302 *error = down_interruptible(mutex);
303 if (*error != 0)
304 return NULL;
306 ret = list_named_find(head, name);
307 if (!ret) {
308 *error = -ENOENT;
309 up(mutex);
311 return ret;
314 #ifndef CONFIG_KMOD
315 #define find_inlist_lock(h,n,p,e,m) find_inlist_lock_noload((h),(n),(e),(m))
316 #else
317 static void *
318 find_inlist_lock(struct list_head *head, const char *name, const char *prefix,
319 int *error, struct semaphore *mutex)
321 void *ret;
323 ret = find_inlist_lock_noload(head, name, error, mutex);
324 if (!ret) {
325 request_module("%s%s", prefix, name);
326 ret = find_inlist_lock_noload(head, name, error, mutex);
328 return ret;
330 #endif
332 static inline struct ebt_table *
333 find_table_lock(const char *name, int *error, struct semaphore *mutex)
335 return find_inlist_lock(&ebt_tables, name, "ebtable_", error, mutex);
338 static inline struct ebt_match *
339 find_match_lock(const char *name, int *error, struct semaphore *mutex)
341 return find_inlist_lock(&ebt_matches, name, "ebt_", error, mutex);
344 static inline struct ebt_watcher *
345 find_watcher_lock(const char *name, int *error, struct semaphore *mutex)
347 return find_inlist_lock(&ebt_watchers, name, "ebt_", error, mutex);
350 static inline struct ebt_target *
351 find_target_lock(const char *name, int *error, struct semaphore *mutex)
353 return find_inlist_lock(&ebt_targets, name, "ebt_", error, mutex);
356 static inline int
357 ebt_check_match(struct ebt_entry_match *m, struct ebt_entry *e,
358 const char *name, unsigned int hookmask, unsigned int *cnt)
360 struct ebt_match *match;
361 int ret;
363 if (((char *)m) + m->match_size + sizeof(struct ebt_entry_match) >
364 ((char *)e) + e->watchers_offset)
365 return -EINVAL;
366 match = find_match_lock(m->u.name, &ret, &ebt_mutex);
367 if (!match)
368 return ret;
369 m->u.match = match;
370 if (!try_module_get(match->me)) {
371 up(&ebt_mutex);
372 return -ENOENT;
374 up(&ebt_mutex);
375 if (match->check &&
376 match->check(name, hookmask, e, m->data, m->match_size) != 0) {
377 BUGPRINT("match->check failed\n");
378 module_put(match->me);
379 return -EINVAL;
381 (*cnt)++;
382 return 0;
385 static inline int
386 ebt_check_watcher(struct ebt_entry_watcher *w, struct ebt_entry *e,
387 const char *name, unsigned int hookmask, unsigned int *cnt)
389 struct ebt_watcher *watcher;
390 int ret;
392 if (((char *)w) + w->watcher_size + sizeof(struct ebt_entry_watcher) >
393 ((char *)e) + e->target_offset)
394 return -EINVAL;
395 watcher = find_watcher_lock(w->u.name, &ret, &ebt_mutex);
396 if (!watcher)
397 return ret;
398 w->u.watcher = watcher;
399 if (!try_module_get(watcher->me)) {
400 up(&ebt_mutex);
401 return -ENOENT;
403 up(&ebt_mutex);
404 if (watcher->check &&
405 watcher->check(name, hookmask, e, w->data, w->watcher_size) != 0) {
406 BUGPRINT("watcher->check failed\n");
407 module_put(watcher->me);
408 return -EINVAL;
410 (*cnt)++;
411 return 0;
415 * this one is very careful, as it is the first function
416 * to parse the userspace data
418 static inline int
419 ebt_check_entry_size_and_hooks(struct ebt_entry *e,
420 struct ebt_table_info *newinfo, char *base, char *limit,
421 struct ebt_entries **hook_entries, unsigned int *n, unsigned int *cnt,
422 unsigned int *totalcnt, unsigned int *udc_cnt, unsigned int valid_hooks)
424 int i;
426 for (i = 0; i < NF_BR_NUMHOOKS; i++) {
427 if ((valid_hooks & (1 << i)) == 0)
428 continue;
429 if ( (char *)hook_entries[i] - base ==
430 (char *)e - newinfo->entries)
431 break;
433 /* beginning of a new chain
434 if i == NF_BR_NUMHOOKS it must be a user defined chain */
435 if (i != NF_BR_NUMHOOKS || !(e->bitmask & EBT_ENTRY_OR_ENTRIES)) {
436 if ((e->bitmask & EBT_ENTRY_OR_ENTRIES) != 0) {
437 /* we make userspace set this right,
438 so there is no misunderstanding */
439 BUGPRINT("EBT_ENTRY_OR_ENTRIES shouldn't be set "
440 "in distinguisher\n");
441 return -EINVAL;
443 /* this checks if the previous chain has as many entries
444 as it said it has */
445 if (*n != *cnt) {
446 BUGPRINT("nentries does not equal the nr of entries "
447 "in the chain\n");
448 return -EINVAL;
450 /* before we look at the struct, be sure it is not too big */
451 if ((char *)hook_entries[i] + sizeof(struct ebt_entries)
452 > limit) {
453 BUGPRINT("entries_size too small\n");
454 return -EINVAL;
456 if (((struct ebt_entries *)e)->policy != EBT_DROP &&
457 ((struct ebt_entries *)e)->policy != EBT_ACCEPT) {
458 /* only RETURN from udc */
459 if (i != NF_BR_NUMHOOKS ||
460 ((struct ebt_entries *)e)->policy != EBT_RETURN) {
461 BUGPRINT("bad policy\n");
462 return -EINVAL;
465 if (i == NF_BR_NUMHOOKS) /* it's a user defined chain */
466 (*udc_cnt)++;
467 else
468 newinfo->hook_entry[i] = (struct ebt_entries *)e;
469 if (((struct ebt_entries *)e)->counter_offset != *totalcnt) {
470 BUGPRINT("counter_offset != totalcnt");
471 return -EINVAL;
473 *n = ((struct ebt_entries *)e)->nentries;
474 *cnt = 0;
475 return 0;
477 /* a plain old entry, heh */
478 if (sizeof(struct ebt_entry) > e->watchers_offset ||
479 e->watchers_offset > e->target_offset ||
480 e->target_offset >= e->next_offset) {
481 BUGPRINT("entry offsets not in right order\n");
482 return -EINVAL;
484 /* this is not checked anywhere else */
485 if (e->next_offset - e->target_offset < sizeof(struct ebt_entry_target)) {
486 BUGPRINT("target size too small\n");
487 return -EINVAL;
490 (*cnt)++;
491 (*totalcnt)++;
492 return 0;
495 struct ebt_cl_stack
497 struct ebt_chainstack cs;
498 int from;
499 unsigned int hookmask;
503 * we need these positions to check that the jumps to a different part of the
504 * entries is a jump to the beginning of a new chain.
506 static inline int
507 ebt_get_udc_positions(struct ebt_entry *e, struct ebt_table_info *newinfo,
508 struct ebt_entries **hook_entries, unsigned int *n, unsigned int valid_hooks,
509 struct ebt_cl_stack *udc)
511 int i;
513 /* we're only interested in chain starts */
514 if (e->bitmask & EBT_ENTRY_OR_ENTRIES)
515 return 0;
516 for (i = 0; i < NF_BR_NUMHOOKS; i++) {
517 if ((valid_hooks & (1 << i)) == 0)
518 continue;
519 if (newinfo->hook_entry[i] == (struct ebt_entries *)e)
520 break;
522 /* only care about udc */
523 if (i != NF_BR_NUMHOOKS)
524 return 0;
526 udc[*n].cs.chaininfo = (struct ebt_entries *)e;
527 /* these initialisations are depended on later in check_chainloops() */
528 udc[*n].cs.n = 0;
529 udc[*n].hookmask = 0;
531 (*n)++;
532 return 0;
535 static inline int
536 ebt_cleanup_match(struct ebt_entry_match *m, unsigned int *i)
538 if (i && (*i)-- == 0)
539 return 1;
540 if (m->u.match->destroy)
541 m->u.match->destroy(m->data, m->match_size);
542 module_put(m->u.match->me);
544 return 0;
547 static inline int
548 ebt_cleanup_watcher(struct ebt_entry_watcher *w, unsigned int *i)
550 if (i && (*i)-- == 0)
551 return 1;
552 if (w->u.watcher->destroy)
553 w->u.watcher->destroy(w->data, w->watcher_size);
554 module_put(w->u.watcher->me);
556 return 0;
559 static inline int
560 ebt_cleanup_entry(struct ebt_entry *e, unsigned int *cnt)
562 struct ebt_entry_target *t;
564 if ((e->bitmask & EBT_ENTRY_OR_ENTRIES) == 0)
565 return 0;
566 /* we're done */
567 if (cnt && (*cnt)-- == 0)
568 return 1;
569 EBT_WATCHER_ITERATE(e, ebt_cleanup_watcher, NULL);
570 EBT_MATCH_ITERATE(e, ebt_cleanup_match, NULL);
571 t = (struct ebt_entry_target *)(((char *)e) + e->target_offset);
572 if (t->u.target->destroy)
573 t->u.target->destroy(t->data, t->target_size);
574 module_put(t->u.target->me);
576 return 0;
579 static inline int
580 ebt_check_entry(struct ebt_entry *e, struct ebt_table_info *newinfo,
581 const char *name, unsigned int *cnt, unsigned int valid_hooks,
582 struct ebt_cl_stack *cl_s, unsigned int udc_cnt)
584 struct ebt_entry_target *t;
585 struct ebt_target *target;
586 unsigned int i, j, hook = 0, hookmask = 0;
587 int ret;
589 /* don't mess with the struct ebt_entries */
590 if ((e->bitmask & EBT_ENTRY_OR_ENTRIES) == 0)
591 return 0;
593 if (e->bitmask & ~EBT_F_MASK) {
594 BUGPRINT("Unknown flag for bitmask\n");
595 return -EINVAL;
597 if (e->invflags & ~EBT_INV_MASK) {
598 BUGPRINT("Unknown flag for inv bitmask\n");
599 return -EINVAL;
601 if ( (e->bitmask & EBT_NOPROTO) && (e->bitmask & EBT_802_3) ) {
602 BUGPRINT("NOPROTO & 802_3 not allowed\n");
603 return -EINVAL;
605 /* what hook do we belong to? */
606 for (i = 0; i < NF_BR_NUMHOOKS; i++) {
607 if ((valid_hooks & (1 << i)) == 0)
608 continue;
609 if ((char *)newinfo->hook_entry[i] < (char *)e)
610 hook = i;
611 else
612 break;
614 /* (1 << NF_BR_NUMHOOKS) tells the check functions the rule is on
615 a base chain */
616 if (i < NF_BR_NUMHOOKS)
617 hookmask = (1 << hook) | (1 << NF_BR_NUMHOOKS);
618 else {
619 for (i = 0; i < udc_cnt; i++)
620 if ((char *)(cl_s[i].cs.chaininfo) > (char *)e)
621 break;
622 if (i == 0)
623 hookmask = (1 << hook) | (1 << NF_BR_NUMHOOKS);
624 else
625 hookmask = cl_s[i - 1].hookmask;
627 i = 0;
628 ret = EBT_MATCH_ITERATE(e, ebt_check_match, e, name, hookmask, &i);
629 if (ret != 0)
630 goto cleanup_matches;
631 j = 0;
632 ret = EBT_WATCHER_ITERATE(e, ebt_check_watcher, e, name, hookmask, &j);
633 if (ret != 0)
634 goto cleanup_watchers;
635 t = (struct ebt_entry_target *)(((char *)e) + e->target_offset);
636 target = find_target_lock(t->u.name, &ret, &ebt_mutex);
637 if (!target)
638 goto cleanup_watchers;
639 if (!try_module_get(target->me)) {
640 up(&ebt_mutex);
641 ret = -ENOENT;
642 goto cleanup_watchers;
644 up(&ebt_mutex);
646 t->u.target = target;
647 if (t->u.target == &ebt_standard_target) {
648 if (e->target_offset + sizeof(struct ebt_standard_target) >
649 e->next_offset) {
650 BUGPRINT("Standard target size too big\n");
651 ret = -EFAULT;
652 goto cleanup_watchers;
654 if (((struct ebt_standard_target *)t)->verdict <
655 -NUM_STANDARD_TARGETS) {
656 BUGPRINT("Invalid standard target\n");
657 ret = -EFAULT;
658 goto cleanup_watchers;
660 } else if ((e->target_offset + t->target_size +
661 sizeof(struct ebt_entry_target) > e->next_offset) ||
662 (t->u.target->check &&
663 t->u.target->check(name, hookmask, e, t->data, t->target_size) != 0)){
664 module_put(t->u.target->me);
665 ret = -EFAULT;
666 goto cleanup_watchers;
668 (*cnt)++;
669 return 0;
670 cleanup_watchers:
671 EBT_WATCHER_ITERATE(e, ebt_cleanup_watcher, &j);
672 cleanup_matches:
673 EBT_MATCH_ITERATE(e, ebt_cleanup_match, &i);
674 return ret;
678 * checks for loops and sets the hook mask for udc
679 * the hook mask for udc tells us from which base chains the udc can be
680 * accessed. This mask is a parameter to the check() functions of the extensions
682 static int check_chainloops(struct ebt_entries *chain, struct ebt_cl_stack *cl_s,
683 unsigned int udc_cnt, unsigned int hooknr, char *base)
685 int i, chain_nr = -1, pos = 0, nentries = chain->nentries, verdict;
686 struct ebt_entry *e = (struct ebt_entry *)chain->data;
687 struct ebt_entry_target *t;
689 while (pos < nentries || chain_nr != -1) {
690 /* end of udc, go back one 'recursion' step */
691 if (pos == nentries) {
692 /* put back values of the time when this chain was called */
693 e = cl_s[chain_nr].cs.e;
694 if (cl_s[chain_nr].from != -1)
695 nentries =
696 cl_s[cl_s[chain_nr].from].cs.chaininfo->nentries;
697 else
698 nentries = chain->nentries;
699 pos = cl_s[chain_nr].cs.n;
700 /* make sure we won't see a loop that isn't one */
701 cl_s[chain_nr].cs.n = 0;
702 chain_nr = cl_s[chain_nr].from;
703 if (pos == nentries)
704 continue;
706 t = (struct ebt_entry_target *)
707 (((char *)e) + e->target_offset);
708 if (strcmp(t->u.name, EBT_STANDARD_TARGET))
709 goto letscontinue;
710 if (e->target_offset + sizeof(struct ebt_standard_target) >
711 e->next_offset) {
712 BUGPRINT("Standard target size too big\n");
713 return -1;
715 verdict = ((struct ebt_standard_target *)t)->verdict;
716 if (verdict >= 0) { /* jump to another chain */
717 struct ebt_entries *hlp2 =
718 (struct ebt_entries *)(base + verdict);
719 for (i = 0; i < udc_cnt; i++)
720 if (hlp2 == cl_s[i].cs.chaininfo)
721 break;
722 /* bad destination or loop */
723 if (i == udc_cnt) {
724 BUGPRINT("bad destination\n");
725 return -1;
727 if (cl_s[i].cs.n) {
728 BUGPRINT("loop\n");
729 return -1;
731 /* this can't be 0, so the above test is correct */
732 cl_s[i].cs.n = pos + 1;
733 pos = 0;
734 cl_s[i].cs.e = ((void *)e + e->next_offset);
735 e = (struct ebt_entry *)(hlp2->data);
736 nentries = hlp2->nentries;
737 cl_s[i].from = chain_nr;
738 chain_nr = i;
739 /* this udc is accessible from the base chain for hooknr */
740 cl_s[i].hookmask |= (1 << hooknr);
741 continue;
743 letscontinue:
744 e = (void *)e + e->next_offset;
745 pos++;
747 return 0;
750 /* do the parsing of the table/chains/entries/matches/watchers/targets, heh */
751 static int translate_table(struct ebt_replace *repl,
752 struct ebt_table_info *newinfo)
754 unsigned int i, j, k, udc_cnt;
755 int ret;
756 struct ebt_cl_stack *cl_s = NULL; /* used in the checking for chain loops */
758 i = 0;
759 while (i < NF_BR_NUMHOOKS && !(repl->valid_hooks & (1 << i)))
760 i++;
761 if (i == NF_BR_NUMHOOKS) {
762 BUGPRINT("No valid hooks specified\n");
763 return -EINVAL;
765 if (repl->hook_entry[i] != (struct ebt_entries *)repl->entries) {
766 BUGPRINT("Chains don't start at beginning\n");
767 return -EINVAL;
769 /* make sure chains are ordered after each other in same order
770 as their corresponding hooks */
771 for (j = i + 1; j < NF_BR_NUMHOOKS; j++) {
772 if (!(repl->valid_hooks & (1 << j)))
773 continue;
774 if ( repl->hook_entry[j] <= repl->hook_entry[i] ) {
775 BUGPRINT("Hook order must be followed\n");
776 return -EINVAL;
778 i = j;
781 for (i = 0; i < NF_BR_NUMHOOKS; i++)
782 newinfo->hook_entry[i] = NULL;
784 newinfo->entries_size = repl->entries_size;
785 newinfo->nentries = repl->nentries;
787 /* do some early checkings and initialize some things */
788 i = 0; /* holds the expected nr. of entries for the chain */
789 j = 0; /* holds the up to now counted entries for the chain */
790 k = 0; /* holds the total nr. of entries, should equal
791 newinfo->nentries afterwards */
792 udc_cnt = 0; /* will hold the nr. of user defined chains (udc) */
793 ret = EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
794 ebt_check_entry_size_and_hooks, newinfo, repl->entries,
795 repl->entries + repl->entries_size, repl->hook_entry, &i, &j, &k,
796 &udc_cnt, repl->valid_hooks);
798 if (ret != 0)
799 return ret;
801 if (i != j) {
802 BUGPRINT("nentries does not equal the nr of entries in the "
803 "(last) chain\n");
804 return -EINVAL;
806 if (k != newinfo->nentries) {
807 BUGPRINT("Total nentries is wrong\n");
808 return -EINVAL;
811 /* check if all valid hooks have a chain */
812 for (i = 0; i < NF_BR_NUMHOOKS; i++) {
813 if (newinfo->hook_entry[i] == NULL &&
814 (repl->valid_hooks & (1 << i))) {
815 BUGPRINT("Valid hook without chain\n");
816 return -EINVAL;
820 /* get the location of the udc, put them in an array
821 while we're at it, allocate the chainstack */
822 if (udc_cnt) {
823 /* this will get free'd in do_replace()/ebt_register_table()
824 if an error occurs */
825 newinfo->chainstack = (struct ebt_chainstack **)
826 vmalloc(num_possible_cpus() * sizeof(struct ebt_chainstack));
827 if (!newinfo->chainstack)
828 return -ENOMEM;
829 for (i = 0; i < num_possible_cpus(); i++) {
830 newinfo->chainstack[i] =
831 vmalloc(udc_cnt * sizeof(struct ebt_chainstack));
832 if (!newinfo->chainstack[i]) {
833 while (i)
834 vfree(newinfo->chainstack[--i]);
835 vfree(newinfo->chainstack);
836 newinfo->chainstack = NULL;
837 return -ENOMEM;
841 cl_s = (struct ebt_cl_stack *)
842 vmalloc(udc_cnt * sizeof(struct ebt_cl_stack));
843 if (!cl_s)
844 return -ENOMEM;
845 i = 0; /* the i'th udc */
846 EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
847 ebt_get_udc_positions, newinfo, repl->hook_entry, &i,
848 repl->valid_hooks, cl_s);
849 /* sanity check */
850 if (i != udc_cnt) {
851 BUGPRINT("i != udc_cnt\n");
852 vfree(cl_s);
853 return -EFAULT;
857 /* Check for loops */
858 for (i = 0; i < NF_BR_NUMHOOKS; i++)
859 if (repl->valid_hooks & (1 << i))
860 if (check_chainloops(newinfo->hook_entry[i],
861 cl_s, udc_cnt, i, newinfo->entries)) {
862 if (cl_s)
863 vfree(cl_s);
864 return -EINVAL;
867 /* we now know the following (along with E=mc²):
868 - the nr of entries in each chain is right
869 - the size of the allocated space is right
870 - all valid hooks have a corresponding chain
871 - there are no loops
872 - wrong data can still be on the level of a single entry
873 - could be there are jumps to places that are not the
874 beginning of a chain. This can only occur in chains that
875 are not accessible from any base chains, so we don't care. */
877 /* used to know what we need to clean up if something goes wrong */
878 i = 0;
879 ret = EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
880 ebt_check_entry, newinfo, repl->name, &i, repl->valid_hooks,
881 cl_s, udc_cnt);
882 if (ret != 0) {
883 EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
884 ebt_cleanup_entry, &i);
886 if (cl_s)
887 vfree(cl_s);
888 return ret;
891 /* called under write_lock */
892 static void get_counters(struct ebt_counter *oldcounters,
893 struct ebt_counter *counters, unsigned int nentries)
895 int i, cpu;
896 struct ebt_counter *counter_base;
898 /* counters of cpu 0 */
899 memcpy(counters, oldcounters,
900 sizeof(struct ebt_counter) * nentries);
901 /* add other counters to those of cpu 0 */
902 for (cpu = 1; cpu < num_possible_cpus(); cpu++) {
903 counter_base = COUNTER_BASE(oldcounters, nentries, cpu);
904 for (i = 0; i < nentries; i++) {
905 counters[i].pcnt += counter_base[i].pcnt;
906 counters[i].bcnt += counter_base[i].bcnt;
911 /* replace the table */
912 static int do_replace(void __user *user, unsigned int len)
914 int ret, i, countersize;
915 struct ebt_table_info *newinfo;
916 struct ebt_replace tmp;
917 struct ebt_table *t;
918 struct ebt_counter *counterstmp = NULL;
919 /* used to be able to unlock earlier */
920 struct ebt_table_info *table;
922 if (copy_from_user(&tmp, user, sizeof(tmp)) != 0)
923 return -EFAULT;
925 if (len != sizeof(tmp) + tmp.entries_size) {
926 BUGPRINT("Wrong len argument\n");
927 return -EINVAL;
930 if (tmp.entries_size == 0) {
931 BUGPRINT("Entries_size never zero\n");
932 return -EINVAL;
934 countersize = COUNTER_OFFSET(tmp.nentries) * num_possible_cpus();
935 newinfo = (struct ebt_table_info *)
936 vmalloc(sizeof(struct ebt_table_info) + countersize);
937 if (!newinfo)
938 return -ENOMEM;
940 if (countersize)
941 memset(newinfo->counters, 0, countersize);
943 newinfo->entries = (char *)vmalloc(tmp.entries_size);
944 if (!newinfo->entries) {
945 ret = -ENOMEM;
946 goto free_newinfo;
948 if (copy_from_user(
949 newinfo->entries, tmp.entries, tmp.entries_size) != 0) {
950 BUGPRINT("Couldn't copy entries from userspace\n");
951 ret = -EFAULT;
952 goto free_entries;
955 /* the user wants counters back
956 the check on the size is done later, when we have the lock */
957 if (tmp.num_counters) {
958 counterstmp = (struct ebt_counter *)
959 vmalloc(tmp.num_counters * sizeof(struct ebt_counter));
960 if (!counterstmp) {
961 ret = -ENOMEM;
962 goto free_entries;
965 else
966 counterstmp = NULL;
968 /* this can get initialized by translate_table() */
969 newinfo->chainstack = NULL;
970 ret = translate_table(&tmp, newinfo);
972 if (ret != 0)
973 goto free_counterstmp;
975 t = find_table_lock(tmp.name, &ret, &ebt_mutex);
976 if (!t) {
977 ret = -ENOENT;
978 goto free_iterate;
981 /* the table doesn't like it */
982 if (t->check && (ret = t->check(newinfo, tmp.valid_hooks)))
983 goto free_unlock;
985 if (tmp.num_counters && tmp.num_counters != t->private->nentries) {
986 BUGPRINT("Wrong nr. of counters requested\n");
987 ret = -EINVAL;
988 goto free_unlock;
991 /* we have the mutex lock, so no danger in reading this pointer */
992 table = t->private;
993 /* make sure the table can only be rmmod'ed if it contains no rules */
994 if (!table->nentries && newinfo->nentries && !try_module_get(t->me)) {
995 ret = -ENOENT;
996 goto free_unlock;
997 } else if (table->nentries && !newinfo->nentries)
998 module_put(t->me);
999 /* we need an atomic snapshot of the counters */
1000 write_lock_bh(&t->lock);
1001 if (tmp.num_counters)
1002 get_counters(t->private->counters, counterstmp,
1003 t->private->nentries);
1005 t->private = newinfo;
1006 write_unlock_bh(&t->lock);
1007 up(&ebt_mutex);
1008 /* so, a user can change the chains while having messed up her counter
1009 allocation. Only reason why this is done is because this way the lock
1010 is held only once, while this doesn't bring the kernel into a
1011 dangerous state. */
1012 if (tmp.num_counters &&
1013 copy_to_user(tmp.counters, counterstmp,
1014 tmp.num_counters * sizeof(struct ebt_counter))) {
1015 BUGPRINT("Couldn't copy counters to userspace\n");
1016 ret = -EFAULT;
1018 else
1019 ret = 0;
1021 /* decrease module count and free resources */
1022 EBT_ENTRY_ITERATE(table->entries, table->entries_size,
1023 ebt_cleanup_entry, NULL);
1025 vfree(table->entries);
1026 if (table->chainstack) {
1027 for (i = 0; i < num_possible_cpus(); i++)
1028 vfree(table->chainstack[i]);
1029 vfree(table->chainstack);
1031 vfree(table);
1033 if (counterstmp)
1034 vfree(counterstmp);
1035 return ret;
1037 free_unlock:
1038 up(&ebt_mutex);
1039 free_iterate:
1040 EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
1041 ebt_cleanup_entry, NULL);
1042 free_counterstmp:
1043 if (counterstmp)
1044 vfree(counterstmp);
1045 /* can be initialized in translate_table() */
1046 if (newinfo->chainstack) {
1047 for (i = 0; i < num_possible_cpus(); i++)
1048 vfree(newinfo->chainstack[i]);
1049 vfree(newinfo->chainstack);
1051 free_entries:
1052 if (newinfo->entries)
1053 vfree(newinfo->entries);
1054 free_newinfo:
1055 if (newinfo)
1056 vfree(newinfo);
1057 return ret;
1060 int ebt_register_target(struct ebt_target *target)
1062 int ret;
1064 ret = down_interruptible(&ebt_mutex);
1065 if (ret != 0)
1066 return ret;
1067 if (!list_named_insert(&ebt_targets, target)) {
1068 up(&ebt_mutex);
1069 return -EEXIST;
1071 up(&ebt_mutex);
1073 return 0;
1076 void ebt_unregister_target(struct ebt_target *target)
1078 down(&ebt_mutex);
1079 LIST_DELETE(&ebt_targets, target);
1080 up(&ebt_mutex);
1083 int ebt_register_match(struct ebt_match *match)
1085 int ret;
1087 ret = down_interruptible(&ebt_mutex);
1088 if (ret != 0)
1089 return ret;
1090 if (!list_named_insert(&ebt_matches, match)) {
1091 up(&ebt_mutex);
1092 return -EEXIST;
1094 up(&ebt_mutex);
1096 return 0;
1099 void ebt_unregister_match(struct ebt_match *match)
1101 down(&ebt_mutex);
1102 LIST_DELETE(&ebt_matches, match);
1103 up(&ebt_mutex);
1106 int ebt_register_watcher(struct ebt_watcher *watcher)
1108 int ret;
1110 ret = down_interruptible(&ebt_mutex);
1111 if (ret != 0)
1112 return ret;
1113 if (!list_named_insert(&ebt_watchers, watcher)) {
1114 up(&ebt_mutex);
1115 return -EEXIST;
1117 up(&ebt_mutex);
1119 return 0;
1122 void ebt_unregister_watcher(struct ebt_watcher *watcher)
1124 down(&ebt_mutex);
1125 LIST_DELETE(&ebt_watchers, watcher);
1126 up(&ebt_mutex);
1129 int ebt_register_table(struct ebt_table *table)
1131 struct ebt_table_info *newinfo;
1132 int ret, i, countersize;
1134 if (!table || !table->table ||!table->table->entries ||
1135 table->table->entries_size == 0 ||
1136 table->table->counters || table->private) {
1137 BUGPRINT("Bad table data for ebt_register_table!!!\n");
1138 return -EINVAL;
1141 countersize = COUNTER_OFFSET(table->table->nentries) * num_possible_cpus();
1142 newinfo = (struct ebt_table_info *)
1143 vmalloc(sizeof(struct ebt_table_info) + countersize);
1144 ret = -ENOMEM;
1145 if (!newinfo)
1146 return -ENOMEM;
1148 newinfo->entries = (char *)vmalloc(table->table->entries_size);
1149 if (!(newinfo->entries))
1150 goto free_newinfo;
1152 memcpy(newinfo->entries, table->table->entries,
1153 table->table->entries_size);
1155 if (countersize)
1156 memset(newinfo->counters, 0, countersize);
1158 /* fill in newinfo and parse the entries */
1159 newinfo->chainstack = NULL;
1160 ret = translate_table(table->table, newinfo);
1161 if (ret != 0) {
1162 BUGPRINT("Translate_table failed\n");
1163 goto free_chainstack;
1166 if (table->check && table->check(newinfo, table->valid_hooks)) {
1167 BUGPRINT("The table doesn't like its own initial data, lol\n");
1168 return -EINVAL;
1171 table->private = newinfo;
1172 rwlock_init(&table->lock);
1173 ret = down_interruptible(&ebt_mutex);
1174 if (ret != 0)
1175 goto free_chainstack;
1177 if (list_named_find(&ebt_tables, table->name)) {
1178 ret = -EEXIST;
1179 BUGPRINT("Table name already exists\n");
1180 goto free_unlock;
1183 /* Hold a reference count if the chains aren't empty */
1184 if (newinfo->nentries && !try_module_get(table->me)) {
1185 ret = -ENOENT;
1186 goto free_unlock;
1188 list_prepend(&ebt_tables, table);
1189 up(&ebt_mutex);
1190 return 0;
1191 free_unlock:
1192 up(&ebt_mutex);
1193 free_chainstack:
1194 if (newinfo->chainstack) {
1195 for (i = 0; i < num_possible_cpus(); i++)
1196 vfree(newinfo->chainstack[i]);
1197 vfree(newinfo->chainstack);
1199 vfree(newinfo->entries);
1200 free_newinfo:
1201 vfree(newinfo);
1202 return ret;
1205 void ebt_unregister_table(struct ebt_table *table)
1207 int i;
1209 if (!table) {
1210 BUGPRINT("Request to unregister NULL table!!!\n");
1211 return;
1213 down(&ebt_mutex);
1214 LIST_DELETE(&ebt_tables, table);
1215 up(&ebt_mutex);
1216 if (table->private->entries)
1217 vfree(table->private->entries);
1218 if (table->private->chainstack) {
1219 for (i = 0; i < num_possible_cpus(); i++)
1220 vfree(table->private->chainstack[i]);
1221 vfree(table->private->chainstack);
1223 vfree(table->private);
1226 /* userspace just supplied us with counters */
1227 static int update_counters(void __user *user, unsigned int len)
1229 int i, ret;
1230 struct ebt_counter *tmp;
1231 struct ebt_replace hlp;
1232 struct ebt_table *t;
1234 if (copy_from_user(&hlp, user, sizeof(hlp)))
1235 return -EFAULT;
1237 if (len != sizeof(hlp) + hlp.num_counters * sizeof(struct ebt_counter))
1238 return -EINVAL;
1239 if (hlp.num_counters == 0)
1240 return -EINVAL;
1242 if ( !(tmp = (struct ebt_counter *)
1243 vmalloc(hlp.num_counters * sizeof(struct ebt_counter))) ){
1244 MEMPRINT("Update_counters && nomemory\n");
1245 return -ENOMEM;
1248 t = find_table_lock(hlp.name, &ret, &ebt_mutex);
1249 if (!t)
1250 goto free_tmp;
1252 if (hlp.num_counters != t->private->nentries) {
1253 BUGPRINT("Wrong nr of counters\n");
1254 ret = -EINVAL;
1255 goto unlock_mutex;
1258 if ( copy_from_user(tmp, hlp.counters,
1259 hlp.num_counters * sizeof(struct ebt_counter)) ) {
1260 BUGPRINT("Updata_counters && !cfu\n");
1261 ret = -EFAULT;
1262 goto unlock_mutex;
1265 /* we want an atomic add of the counters */
1266 write_lock_bh(&t->lock);
1268 /* we add to the counters of the first cpu */
1269 for (i = 0; i < hlp.num_counters; i++) {
1270 t->private->counters[i].pcnt += tmp[i].pcnt;
1271 t->private->counters[i].bcnt += tmp[i].bcnt;
1274 write_unlock_bh(&t->lock);
1275 ret = 0;
1276 unlock_mutex:
1277 up(&ebt_mutex);
1278 free_tmp:
1279 vfree(tmp);
1280 return ret;
1283 static inline int ebt_make_matchname(struct ebt_entry_match *m,
1284 char *base, char *ubase)
1286 char *hlp = ubase - base + (char *)m;
1287 if (copy_to_user(hlp, m->u.match->name, EBT_FUNCTION_MAXNAMELEN))
1288 return -EFAULT;
1289 return 0;
1292 static inline int ebt_make_watchername(struct ebt_entry_watcher *w,
1293 char *base, char *ubase)
1295 char *hlp = ubase - base + (char *)w;
1296 if (copy_to_user(hlp , w->u.watcher->name, EBT_FUNCTION_MAXNAMELEN))
1297 return -EFAULT;
1298 return 0;
1301 static inline int ebt_make_names(struct ebt_entry *e, char *base, char *ubase)
1303 int ret;
1304 char *hlp;
1305 struct ebt_entry_target *t;
1307 if ((e->bitmask & EBT_ENTRY_OR_ENTRIES) == 0)
1308 return 0;
1310 hlp = ubase - base + (char *)e + e->target_offset;
1311 t = (struct ebt_entry_target *)(((char *)e) + e->target_offset);
1313 ret = EBT_MATCH_ITERATE(e, ebt_make_matchname, base, ubase);
1314 if (ret != 0)
1315 return ret;
1316 ret = EBT_WATCHER_ITERATE(e, ebt_make_watchername, base, ubase);
1317 if (ret != 0)
1318 return ret;
1319 if (copy_to_user(hlp, t->u.target->name, EBT_FUNCTION_MAXNAMELEN))
1320 return -EFAULT;
1321 return 0;
1324 /* called with ebt_mutex down */
1325 static int copy_everything_to_user(struct ebt_table *t, void __user *user,
1326 int *len, int cmd)
1328 struct ebt_replace tmp;
1329 struct ebt_counter *counterstmp, *oldcounters;
1330 unsigned int entries_size, nentries;
1331 char *entries;
1333 if (cmd == EBT_SO_GET_ENTRIES) {
1334 entries_size = t->private->entries_size;
1335 nentries = t->private->nentries;
1336 entries = t->private->entries;
1337 oldcounters = t->private->counters;
1338 } else {
1339 entries_size = t->table->entries_size;
1340 nentries = t->table->nentries;
1341 entries = t->table->entries;
1342 oldcounters = t->table->counters;
1345 if (copy_from_user(&tmp, user, sizeof(tmp))) {
1346 BUGPRINT("Cfu didn't work\n");
1347 return -EFAULT;
1350 if (*len != sizeof(struct ebt_replace) + entries_size +
1351 (tmp.num_counters? nentries * sizeof(struct ebt_counter): 0)) {
1352 BUGPRINT("Wrong size\n");
1353 return -EINVAL;
1356 if (tmp.nentries != nentries) {
1357 BUGPRINT("Nentries wrong\n");
1358 return -EINVAL;
1361 if (tmp.entries_size != entries_size) {
1362 BUGPRINT("Wrong size\n");
1363 return -EINVAL;
1366 /* userspace might not need the counters */
1367 if (tmp.num_counters) {
1368 if (tmp.num_counters != nentries) {
1369 BUGPRINT("Num_counters wrong\n");
1370 return -EINVAL;
1372 counterstmp = (struct ebt_counter *)
1373 vmalloc(nentries * sizeof(struct ebt_counter));
1374 if (!counterstmp) {
1375 MEMPRINT("Couldn't copy counters, out of memory\n");
1376 return -ENOMEM;
1378 write_lock_bh(&t->lock);
1379 get_counters(oldcounters, counterstmp, nentries);
1380 write_unlock_bh(&t->lock);
1382 if (copy_to_user(tmp.counters, counterstmp,
1383 nentries * sizeof(struct ebt_counter))) {
1384 BUGPRINT("Couldn't copy counters to userspace\n");
1385 vfree(counterstmp);
1386 return -EFAULT;
1388 vfree(counterstmp);
1391 if (copy_to_user(tmp.entries, entries, entries_size)) {
1392 BUGPRINT("Couldn't copy entries to userspace\n");
1393 return -EFAULT;
1395 /* set the match/watcher/target names right */
1396 return EBT_ENTRY_ITERATE(entries, entries_size,
1397 ebt_make_names, entries, tmp.entries);
1400 static int do_ebt_set_ctl(struct sock *sk,
1401 int cmd, void __user *user, unsigned int len)
1403 int ret;
1405 switch(cmd) {
1406 case EBT_SO_SET_ENTRIES:
1407 ret = do_replace(user, len);
1408 break;
1409 case EBT_SO_SET_COUNTERS:
1410 ret = update_counters(user, len);
1411 break;
1412 default:
1413 ret = -EINVAL;
1415 return ret;
1418 static int do_ebt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
1420 int ret;
1421 struct ebt_replace tmp;
1422 struct ebt_table *t;
1424 if (copy_from_user(&tmp, user, sizeof(tmp)))
1425 return -EFAULT;
1427 t = find_table_lock(tmp.name, &ret, &ebt_mutex);
1428 if (!t)
1429 return ret;
1431 switch(cmd) {
1432 case EBT_SO_GET_INFO:
1433 case EBT_SO_GET_INIT_INFO:
1434 if (*len != sizeof(struct ebt_replace)){
1435 ret = -EINVAL;
1436 up(&ebt_mutex);
1437 break;
1439 if (cmd == EBT_SO_GET_INFO) {
1440 tmp.nentries = t->private->nentries;
1441 tmp.entries_size = t->private->entries_size;
1442 tmp.valid_hooks = t->valid_hooks;
1443 } else {
1444 tmp.nentries = t->table->nentries;
1445 tmp.entries_size = t->table->entries_size;
1446 tmp.valid_hooks = t->table->valid_hooks;
1448 up(&ebt_mutex);
1449 if (copy_to_user(user, &tmp, *len) != 0){
1450 BUGPRINT("c2u Didn't work\n");
1451 ret = -EFAULT;
1452 break;
1454 ret = 0;
1455 break;
1457 case EBT_SO_GET_ENTRIES:
1458 case EBT_SO_GET_INIT_ENTRIES:
1459 ret = copy_everything_to_user(t, user, len, cmd);
1460 up(&ebt_mutex);
1461 break;
1463 default:
1464 up(&ebt_mutex);
1465 ret = -EINVAL;
1468 return ret;
1471 static struct nf_sockopt_ops ebt_sockopts =
1472 { { NULL, NULL }, PF_INET, EBT_BASE_CTL, EBT_SO_SET_MAX + 1, do_ebt_set_ctl,
1473 EBT_BASE_CTL, EBT_SO_GET_MAX + 1, do_ebt_get_ctl, 0, NULL
1476 static int __init init(void)
1478 int ret;
1480 down(&ebt_mutex);
1481 list_named_insert(&ebt_targets, &ebt_standard_target);
1482 up(&ebt_mutex);
1483 if ((ret = nf_register_sockopt(&ebt_sockopts)) < 0)
1484 return ret;
1486 printk(KERN_NOTICE "Ebtables v2.0 registered\n");
1487 return 0;
1490 static void __exit fini(void)
1492 nf_unregister_sockopt(&ebt_sockopts);
1493 printk(KERN_NOTICE "Ebtables v2.0 unregistered\n");
1496 EXPORT_SYMBOL(ebt_register_table);
1497 EXPORT_SYMBOL(ebt_unregister_table);
1498 EXPORT_SYMBOL(ebt_register_match);
1499 EXPORT_SYMBOL(ebt_unregister_match);
1500 EXPORT_SYMBOL(ebt_register_watcher);
1501 EXPORT_SYMBOL(ebt_unregister_watcher);
1502 EXPORT_SYMBOL(ebt_register_target);
1503 EXPORT_SYMBOL(ebt_unregister_target);
1504 EXPORT_SYMBOL(ebt_do_table);
1505 module_init(init);
1506 module_exit(fini);
1507 MODULE_LICENSE("GPL");