]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/netfilter/xt_pkttype.c
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[karo-tx-linux.git] / net / netfilter / xt_pkttype.c
index 8b8bca988ac68834068745afb9062cdccf271258..d2f5320a80bf6a91f97ff2790ec2f3d5540c87e2 100644 (file)
@@ -9,6 +9,8 @@
 #include <linux/skbuff.h>
 #include <linux/if_ether.h>
 #include <linux/if_packet.h>
+#include <linux/in.h>
+#include <linux/ip.h>
 
 #include <linux/netfilter/xt_pkttype.h>
 #include <linux/netfilter/x_tables.h>
@@ -28,9 +30,17 @@ static int match(const struct sk_buff *skb,
       unsigned int protoff,
       int *hotdrop)
 {
+       u_int8_t type;
        const struct xt_pkttype_info *info = matchinfo;
 
-       return (skb->pkt_type == info->pkttype) ^ info->invert;
+       if (skb->pkt_type == PACKET_LOOPBACK)
+               type = (MULTICAST(skb->nh.iph->daddr)
+                       ? PACKET_MULTICAST
+                       : PACKET_BROADCAST);
+       else
+               type = skb->pkt_type;
+
+       return (type == info->pkttype) ^ info->invert;
 }
 
 static struct xt_match pkttype_match = {
@@ -49,7 +59,7 @@ static struct xt_match pkttype6_match = {
        .me             = THIS_MODULE,
 };
 
-static int __init init(void)
+static int __init xt_pkttype_init(void)
 {
        int ret;
        ret = xt_register_match(&pkttype_match);
@@ -63,11 +73,11 @@ static int __init init(void)
        return ret;
 }
 
-static void __exit fini(void)
+static void __exit xt_pkttype_fini(void)
 {
        xt_unregister_match(&pkttype_match);
        xt_unregister_match(&pkttype6_match);
 }
 
-module_init(init);
-module_exit(fini);
+module_init(xt_pkttype_init);
+module_exit(xt_pkttype_fini);