netfilter: xtables: move extension arguments into compound structure (2/6)
[linux-3.10.git] / net / bridge / netfilter / ebtables.c
index 7d8ead5..5ce37b2 100644 (file)
@@ -74,11 +74,11 @@ static inline int ebt_do_watcher (struct ebt_entry_watcher *w,
 }
 
 static inline int ebt_do_match (struct ebt_entry_match *m,
-   const struct sk_buff *skb, const struct net_device *in,
-   const struct net_device *out, bool *hotdrop)
+   const struct sk_buff *skb, struct xt_match_param *par)
 {
-       return m->u.match->match(skb, in, out, m->u.match,
-              m->data, 0, 0, hotdrop);
+       par->match     = m->u.match;
+       par->matchinfo = m->data;
+       return m->u.match->match(skb, par);
 }
 
 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,
        char *base;
        struct ebt_table_info *private;
        bool hotdrop = false;
+       struct xt_match_param mtpar;
+
+       mtpar.in      = in;
+       mtpar.out     = out;
+       mtpar.hotdrop = &hotdrop;
 
        read_lock_bh(&table->lock);
        private = table->private;
@@ -175,8 +180,7 @@ unsigned int ebt_do_table (unsigned int hook, struct sk_buff *skb,
                if (ebt_basic_match(point, eth_hdr(skb), in, out))
                        goto letscontinue;
 
-               if (EBT_MATCH_ITERATE(point, ebt_do_match, skb,
-                   in, out, &hotdrop) != 0)
+               if (EBT_MATCH_ITERATE(point, ebt_do_match, skb, &mtpar) != 0)
                        goto letscontinue;
                if (hotdrop) {
                        read_unlock_bh(&table->lock);
@@ -320,9 +324,10 @@ find_table_lock(const char *name, int *error, struct mutex *mutex)
 }
 
 static inline int
-ebt_check_match(struct ebt_entry_match *m, struct ebt_entry *e,
-   const char *name, unsigned int hookmask, unsigned int *cnt)
+ebt_check_match(struct ebt_entry_match *m, struct xt_mtchk_param *par,
+               unsigned int *cnt)
 {
+       const struct ebt_entry *e = par->entryinfo;
        struct xt_match *match;
        size_t left = ((char *)e + e->watchers_offset) - (char *)m;
        int ret;
@@ -339,16 +344,13 @@ ebt_check_match(struct ebt_entry_match *m, struct ebt_entry *e,
                return -ENOENT;
        m->u.match = match;
 
-       ret = xt_check_match(match, NFPROTO_BRIDGE, m->match_size,
-             name, hookmask, e->ethproto, e->invflags & EBT_IPROTO);
+       par->match     = match;
+       par->matchinfo = m->data;
+       ret = xt_check_match(par, NFPROTO_BRIDGE, m->match_size,
+             e->ethproto, e->invflags & EBT_IPROTO);
        if (ret < 0) {
                module_put(match->me);
                return ret;
-       } else if (match->checkentry != NULL &&
-           !match->checkentry(name, e, NULL, m->data, hookmask)) {
-               module_put(match->me);
-               BUGPRINT("match->check failed\n");
-               return -EINVAL;
        }
 
        (*cnt)++;
@@ -377,15 +379,11 @@ ebt_check_watcher(struct ebt_entry_watcher *w, struct ebt_entry *e,
        w->u.watcher = watcher;
 
        ret = xt_check_target(watcher, NFPROTO_BRIDGE, w->watcher_size,
-             name, hookmask, e->ethproto, e->invflags & EBT_IPROTO);
+             name, hookmask, e->ethproto, e->invflags & EBT_IPROTO,
+             e, w->data);
        if (ret < 0) {
                module_put(watcher->me);
                return ret;
-       } else if (watcher->checkentry != NULL &&
-           !watcher->checkentry(name, e, NULL, w->data, hookmask)) {
-               module_put(watcher->me);
-               BUGPRINT("watcher->check failed\n");
-               return -EINVAL;
        }
 
        (*cnt)++;
@@ -611,6 +609,7 @@ ebt_check_entry(struct ebt_entry *e, struct ebt_table_info *newinfo,
        unsigned int i, j, hook = 0, hookmask = 0;
        size_t gap;
        int ret;
+       struct xt_mtchk_param par;
 
        /* don't mess with the struct ebt_entries */
        if (e->bitmask == 0)
@@ -651,7 +650,11 @@ ebt_check_entry(struct ebt_entry *e, struct ebt_table_info *newinfo,
                        hookmask = cl_s[i - 1].hookmask;
        }
        i = 0;
-       ret = EBT_MATCH_ITERATE(e, ebt_check_match, e, name, hookmask, &i);
+
+       par.table     = name;
+       par.entryinfo = e;
+       par.hook_mask = hookmask;
+       ret = EBT_MATCH_ITERATE(e, ebt_check_match, &par, &i);
        if (ret != 0)
                goto cleanup_matches;
        j = 0;
@@ -692,15 +695,11 @@ ebt_check_entry(struct ebt_entry *e, struct ebt_table_info *newinfo,
        }
 
        ret = xt_check_target(target, NFPROTO_BRIDGE, t->target_size,
-             name, hookmask, e->ethproto, e->invflags & EBT_IPROTO);
+             name, hookmask, e->ethproto, e->invflags & EBT_IPROTO,
+             e, t->data);
        if (ret < 0) {
                module_put(target->me);
                goto cleanup_watchers;
-       } else if (t->u.target->checkentry &&
-           !t->u.target->checkentry(name, e, NULL, t->data, hookmask)) {
-               module_put(t->u.target->me);
-               ret = -EINVAL;
-               goto cleanup_watchers;
        }
        (*cnt)++;
        return 0;