mac80211: fix vlan and optimise RX
[safe/jmp/linux-2.6] / net / netfilter / xt_dccp.c
index f07a68d..0989f29 100644 (file)
@@ -22,8 +22,9 @@
 
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
-MODULE_DESCRIPTION("Match for DCCP protocol packets");
+MODULE_DESCRIPTION("Xtables: DCCP protocol packet match");
 MODULE_ALIAS("ipt_dccp");
+MODULE_ALIAS("ip6t_dccp");
 
 #define DCCHECK(cond, option, flag, invflag) (!((flag) & (option)) \
                                  || (!!((invflag) & (option)) ^ (cond)))
@@ -44,10 +45,8 @@ dccp_find_option(u_int8_t option,
        unsigned int optlen = dh->dccph_doff*4 - __dccp_hdr_len(dh);
        unsigned int i;
 
-       if (dh->dccph_doff * 4 < __dccp_hdr_len(dh)) {
-               *hotdrop = true;
-               return false;
-       }
+       if (dh->dccph_doff * 4 < __dccp_hdr_len(dh))
+               goto invalid;
 
        if (!optlen)
                return false;
@@ -56,9 +55,7 @@ dccp_find_option(u_int8_t option,
        op = skb_header_pointer(skb, protoff + optoff, optlen, dccp_optbuf);
        if (op == NULL) {
                /* If we don't have the whole header, drop packet. */
-               spin_unlock_bh(&dccp_buflock);
-               *hotdrop = true;
-               return false;
+               goto partial;
        }
 
        for (i = 0; i < optlen; ) {
@@ -75,6 +72,12 @@ dccp_find_option(u_int8_t option,
 
        spin_unlock_bh(&dccp_buflock);
        return false;
+
+partial:
+       spin_unlock_bh(&dccp_buflock);
+invalid:
+       *hotdrop = true;
+       return false;
 }
 
 
@@ -92,24 +95,18 @@ match_option(u_int8_t option, const struct sk_buff *skb, unsigned int protoff,
 }
 
 static bool
-match(const struct sk_buff *skb,
-      const struct net_device *in,
-      const struct net_device *out,
-      const struct xt_match *match,
-      const void *matchinfo,
-      int offset,
-      unsigned int protoff,
-      bool *hotdrop)
+dccp_mt(const struct sk_buff *skb, const struct xt_match_param *par)
 {
-       const struct xt_dccp_info *info = matchinfo;
-       struct dccp_hdr _dh, *dh;
+       const struct xt_dccp_info *info = par->matchinfo;
+       const struct dccp_hdr *dh;
+       struct dccp_hdr _dh;
 
-       if (offset)
+       if (par->fragoff != 0)
                return false;
 
-       dh = skb_header_pointer(skb, protoff, sizeof(_dh), &_dh);
+       dh = skb_header_pointer(skb, par->thoff, sizeof(_dh), &_dh);
        if (dh == NULL) {
-               *hotdrop = true;
+               *par->hotdrop = true;
                return false;
        }
 
@@ -121,47 +118,42 @@ match(const struct sk_buff *skb,
                        XT_DCCP_DEST_PORTS, info->flags, info->invflags)
                && DCCHECK(match_types(dh, info->typemask),
                           XT_DCCP_TYPE, info->flags, info->invflags)
-               && DCCHECK(match_option(info->option, skb, protoff, dh,
-                                       hotdrop),
+               && DCCHECK(match_option(info->option, skb, par->thoff, dh,
+                                       par->hotdrop),
                           XT_DCCP_OPTION, info->flags, info->invflags);
 }
 
-static bool
-checkentry(const char *tablename,
-          const void *inf,
-          const struct xt_match *match,
-          void *matchinfo,
-          unsigned int hook_mask)
+static bool dccp_mt_check(const struct xt_mtchk_param *par)
 {
-       const struct xt_dccp_info *info = matchinfo;
+       const struct xt_dccp_info *info = par->matchinfo;
 
        return !(info->flags & ~XT_DCCP_VALID_FLAGS)
                && !(info->invflags & ~XT_DCCP_VALID_FLAGS)
                && !(info->invflags & ~info->flags);
 }
 
-static struct xt_match xt_dccp_match[] = {
+static struct xt_match dccp_mt_reg[] __read_mostly = {
        {
                .name           = "dccp",
-               .family         = AF_INET,
-               .checkentry     = checkentry,
-               .match          = match,
+               .family         = NFPROTO_IPV4,
+               .checkentry     = dccp_mt_check,
+               .match          = dccp_mt,
                .matchsize      = sizeof(struct xt_dccp_info),
                .proto          = IPPROTO_DCCP,
                .me             = THIS_MODULE,
        },
        {
                .name           = "dccp",
-               .family         = AF_INET6,
-               .checkentry     = checkentry,
-               .match          = match,
+               .family         = NFPROTO_IPV6,
+               .checkentry     = dccp_mt_check,
+               .match          = dccp_mt,
                .matchsize      = sizeof(struct xt_dccp_info),
                .proto          = IPPROTO_DCCP,
                .me             = THIS_MODULE,
        },
 };
 
-static int __init xt_dccp_init(void)
+static int __init dccp_mt_init(void)
 {
        int ret;
 
@@ -171,7 +163,7 @@ static int __init xt_dccp_init(void)
        dccp_optbuf = kmalloc(256 * 4, GFP_KERNEL);
        if (!dccp_optbuf)
                return -ENOMEM;
-       ret = xt_register_matches(xt_dccp_match, ARRAY_SIZE(xt_dccp_match));
+       ret = xt_register_matches(dccp_mt_reg, ARRAY_SIZE(dccp_mt_reg));
        if (ret)
                goto out_kfree;
        return ret;
@@ -181,11 +173,11 @@ out_kfree:
        return ret;
 }
 
-static void __exit xt_dccp_fini(void)
+static void __exit dccp_mt_exit(void)
 {
-       xt_unregister_matches(xt_dccp_match, ARRAY_SIZE(xt_dccp_match));
+       xt_unregister_matches(dccp_mt_reg, ARRAY_SIZE(dccp_mt_reg));
        kfree(dccp_optbuf);
 }
 
-module_init(xt_dccp_init);
-module_exit(xt_dccp_fini);
+module_init(dccp_mt_init);
+module_exit(dccp_mt_exit);