Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/kaber/nf-next-2.6
[safe/jmp/linux-2.6] / net / bridge / netfilter / ebt_stp.c
index 7618206..02f28fd 100644 (file)
@@ -119,11 +119,10 @@ static bool ebt_filter_config(const struct ebt_stp_info *info,
        return true;
 }
 
-static bool ebt_filter_stp(const struct sk_buff *skb,
-   const struct net_device *in,
-   const struct net_device *out, const void *data, unsigned int datalen)
+static bool
+ebt_stp_mt(const struct sk_buff *skb, const struct xt_match_param *par)
 {
-       const struct ebt_stp_info *info = data;
+       const struct ebt_stp_info *info = par->matchinfo;
        const struct stp_header *sp;
        struct stp_header _stph;
        const uint8_t header[6] = {0x42, 0x42, 0x03, 0x00, 0x00, 0x00};
@@ -136,8 +135,8 @@ static bool ebt_filter_stp(const struct sk_buff *skb,
        if (memcmp(sp, header, sizeof(header)))
                return false;
 
-       if (info->bitmask & EBT_STP_TYPE
-           && FWINV(info->type != sp->type, EBT_STP_TYPE))
+       if (info->bitmask & EBT_STP_TYPE &&
+           FWINV(info->type != sp->type, EBT_STP_TYPE))
                return false;
 
        if (sp->type == BPDU_TYPE_CONFIG &&
@@ -154,40 +153,42 @@ static bool ebt_filter_stp(const struct sk_buff *skb,
        return true;
 }
 
-static bool ebt_stp_check(const char *tablename, unsigned int hookmask,
-   const struct ebt_entry *e, void *data, unsigned int datalen)
+static int ebt_stp_mt_check(const struct xt_mtchk_param *par)
 {
-       const struct ebt_stp_info *info = data;
+       const struct ebt_stp_info *info = par->matchinfo;
        const uint8_t bridge_ula[6] = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x00};
        const uint8_t msk[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+       const struct ebt_entry *e = par->entryinfo;
 
        if (info->bitmask & ~EBT_STP_MASK || info->invflags & ~EBT_STP_MASK ||
            !(info->bitmask & EBT_STP_MASK))
-               return false;
+               return -EINVAL;
        /* Make sure the match only receives stp frames */
        if (compare_ether_addr(e->destmac, bridge_ula) ||
            compare_ether_addr(e->destmsk, msk) || !(e->bitmask & EBT_DESTMAC))
-               return false;
+               return -EINVAL;
 
-       return true;
+       return 0;
 }
 
-static struct ebt_match filter_stp __read_mostly = {
-       .name           = EBT_STP_MATCH,
-       .match          = ebt_filter_stp,
-       .check          = ebt_stp_check,
-       .matchsize      = XT_ALIGN(sizeof(struct ebt_stp_info)),
+static struct xt_match ebt_stp_mt_reg __read_mostly = {
+       .name           = "stp",
+       .revision       = 0,
+       .family         = NFPROTO_BRIDGE,
+       .match          = ebt_stp_mt,
+       .checkentry     = ebt_stp_mt_check,
+       .matchsize      = sizeof(struct ebt_stp_info),
        .me             = THIS_MODULE,
 };
 
 static int __init ebt_stp_init(void)
 {
-       return ebt_register_match(&filter_stp);
+       return xt_register_match(&ebt_stp_mt_reg);
 }
 
 static void __exit ebt_stp_fini(void)
 {
-       ebt_unregister_match(&filter_stp);
+       xt_unregister_match(&ebt_stp_mt_reg);
 }
 
 module_init(ebt_stp_init);