]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/bridge/netfilter/ebt_arp.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/vapier...
[karo-tx-linux.git] / net / bridge / netfilter / ebt_arp.c
index cb33672380d029c41584d0c92c5c351451658542..e727697c58476ede5ce5ce00d8d3549aa4ef2971 100644 (file)
 #include <linux/netfilter_bridge/ebtables.h>
 #include <linux/netfilter_bridge/ebt_arp.h>
 
-static int ebt_filter_arp(const struct sk_buff *skb, const struct net_device *in,
-   const struct net_device *out, const void *data, unsigned int datalen)
+static bool
+ebt_arp_mt(const struct sk_buff *skb, const struct xt_match_param *par)
 {
-       const struct ebt_arp_info *info = data;
+       const struct ebt_arp_info *info = par->matchinfo;
        const struct arphdr *ah;
        struct arphdr _arph;
 
        ah = skb_header_pointer(skb, 0, sizeof(_arph), &_arph);
        if (ah == NULL)
-               return EBT_NOMATCH;
+               return false;
        if (info->bitmask & EBT_ARP_OPCODE && FWINV(info->opcode !=
           ah->ar_op, EBT_ARP_OPCODE))
-               return EBT_NOMATCH;
+               return false;
        if (info->bitmask & EBT_ARP_HTYPE && FWINV(info->htype !=
           ah->ar_hrd, EBT_ARP_HTYPE))
-               return EBT_NOMATCH;
+               return false;
        if (info->bitmask & EBT_ARP_PTYPE && FWINV(info->ptype !=
           ah->ar_pro, EBT_ARP_PTYPE))
-               return EBT_NOMATCH;
+               return false;
 
        if (info->bitmask & (EBT_ARP_SRC_IP | EBT_ARP_DST_IP | EBT_ARP_GRAT)) {
                const __be32 *sap, *dap;
                __be32 saddr, daddr;
 
                if (ah->ar_pln != sizeof(__be32) || ah->ar_pro != htons(ETH_P_IP))
-                       return EBT_NOMATCH;
+                       return false;
                sap = skb_header_pointer(skb, sizeof(struct arphdr) +
                                        ah->ar_hln, sizeof(saddr),
                                        &saddr);
                if (sap == NULL)
-                       return EBT_NOMATCH;
+                       return false;
                dap = skb_header_pointer(skb, sizeof(struct arphdr) +
                                        2*ah->ar_hln+sizeof(saddr),
                                        sizeof(daddr), &daddr);
                if (dap == NULL)
-                       return EBT_NOMATCH;
+                       return false;
                if (info->bitmask & EBT_ARP_SRC_IP &&
                    FWINV(info->saddr != (*sap & info->smsk), EBT_ARP_SRC_IP))
-                       return EBT_NOMATCH;
+                       return false;
                if (info->bitmask & EBT_ARP_DST_IP &&
                    FWINV(info->daddr != (*dap & info->dmsk), EBT_ARP_DST_IP))
-                       return EBT_NOMATCH;
+                       return false;
                if (info->bitmask & EBT_ARP_GRAT &&
                    FWINV(*dap != *sap, EBT_ARP_GRAT))
-                       return EBT_NOMATCH;
+                       return false;
        }
 
        if (info->bitmask & (EBT_ARP_SRC_MAC | EBT_ARP_DST_MAC)) {
@@ -68,18 +68,18 @@ static int ebt_filter_arp(const struct sk_buff *skb, const struct net_device *in
                uint8_t verdict, i;
 
                if (ah->ar_hln != ETH_ALEN || ah->ar_hrd != htons(ARPHRD_ETHER))
-                       return EBT_NOMATCH;
+                       return false;
                if (info->bitmask & EBT_ARP_SRC_MAC) {
                        mp = skb_header_pointer(skb, sizeof(struct arphdr),
                                                sizeof(_mac), &_mac);
                        if (mp == NULL)
-                               return EBT_NOMATCH;
+                               return false;
                        verdict = 0;
                        for (i = 0; i < 6; i++)
                                verdict |= (mp[i] ^ info->smaddr[i]) &
                                       info->smmsk[i];
                        if (FWINV(verdict != 0, EBT_ARP_SRC_MAC))
-                               return EBT_NOMATCH;
+                               return false;
                }
 
                if (info->bitmask & EBT_ARP_DST_MAC) {
@@ -87,23 +87,23 @@ static int ebt_filter_arp(const struct sk_buff *skb, const struct net_device *in
                                                ah->ar_hln + ah->ar_pln,
                                                sizeof(_mac), &_mac);
                        if (mp == NULL)
-                               return EBT_NOMATCH;
+                               return false;
                        verdict = 0;
                        for (i = 0; i < 6; i++)
                                verdict |= (mp[i] ^ info->dmaddr[i]) &
                                        info->dmmsk[i];
                        if (FWINV(verdict != 0, EBT_ARP_DST_MAC))
-                               return EBT_NOMATCH;
+                               return false;
                }
        }
 
-       return EBT_MATCH;
+       return true;
 }
 
-static bool ebt_arp_check(const char *tablename, unsigned int hookmask,
-   const struct ebt_entry *e, void *data, unsigned int datalen)
+static bool ebt_arp_mt_check(const struct xt_mtchk_param *par)
 {
-       const struct ebt_arp_info *info = data;
+       const struct ebt_arp_info *info = par->matchinfo;
+       const struct ebt_entry *e = par->entryinfo;
 
        if ((e->ethproto != htons(ETH_P_ARP) &&
           e->ethproto != htons(ETH_P_RARP)) ||
@@ -114,22 +114,24 @@ static bool ebt_arp_check(const char *tablename, unsigned int hookmask,
        return true;
 }
 
-static struct ebt_match filter_arp __read_mostly = {
-       .name           = EBT_ARP_MATCH,
-       .match          = ebt_filter_arp,
-       .check          = ebt_arp_check,
-       .matchsize      = XT_ALIGN(sizeof(struct ebt_arp_info)),
+static struct xt_match ebt_arp_mt_reg __read_mostly = {
+       .name           = "arp",
+       .revision       = 0,
+       .family         = NFPROTO_BRIDGE,
+       .match          = ebt_arp_mt,
+       .checkentry     = ebt_arp_mt_check,
+       .matchsize      = sizeof(struct ebt_arp_info),
        .me             = THIS_MODULE,
 };
 
 static int __init ebt_arp_init(void)
 {
-       return ebt_register_match(&filter_arp);
+       return xt_register_match(&ebt_arp_mt_reg);
 }
 
 static void __exit ebt_arp_fini(void)
 {
-       ebt_unregister_match(&filter_arp);
+       xt_unregister_match(&ebt_arp_mt_reg);
 }
 
 module_init(ebt_arp_init);