]> err.no Git - linux-2.6/blobdiff - net/ipv4/netfilter/ip_conntrack_netbios_ns.c
Pull pnpacpi into acpica branch
[linux-2.6] / net / ipv4 / netfilter / ip_conntrack_netbios_ns.c
index 2b5cf9c51309b3bf7f05a504a1ab6ea2d21b534a..4e68e16a2612dbd2cd5a12b606a90e45210ad671 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/inetdevice.h>
 #include <linux/in.h>
 #include <linux/ip.h>
-#include <linux/udp.h>
 #include <net/route.h>
 
 #include <linux/netfilter.h>
 #include <linux/netfilter_ipv4/ip_conntrack.h>
 #include <linux/netfilter_ipv4/ip_conntrack_helper.h>
 
+#define NMBD_PORT      137
+
 MODULE_AUTHOR("Patrick McHardy <kaber@trash.net>");
 MODULE_DESCRIPTION("NetBIOS name service broadcast connection tracking helper");
 MODULE_LICENSE("GPL");
 
 static unsigned int timeout = 3;
-module_param(timeout, int, 0600);
+module_param(timeout, uint, 0400);
 MODULE_PARM_DESC(timeout, "timeout for master connection/replies in seconds");
 
 static int help(struct sk_buff **pskb,
@@ -44,7 +45,6 @@ static int help(struct sk_buff **pskb,
 {
        struct ip_conntrack_expect *exp;
        struct iphdr *iph = (*pskb)->nh.iph;
-       struct udphdr _uh, *uh;
        struct rtable *rt = (struct rtable *)(*pskb)->dst;
        struct in_device *in_dev;
        u_int32_t mask = 0;
@@ -58,7 +58,7 @@ static int help(struct sk_buff **pskb,
                goto out;
 
        rcu_read_lock();
-       in_dev = __in_dev_get(rt->u.dst.dev);
+       in_dev = __in_dev_get_rcu(rt->u.dst.dev);
        if (in_dev != NULL) {
                for_primary_ifa(in_dev) {
                        if (ifa->ifa_broadcast == iph->daddr) {
@@ -72,20 +72,15 @@ static int help(struct sk_buff **pskb,
        if (mask == 0)
                goto out;
 
-       uh = skb_header_pointer(*pskb, iph->ihl * 4, sizeof(_uh), &_uh);
-       BUG_ON(uh == NULL);
-
        exp = ip_conntrack_expect_alloc(ct);
        if (exp == NULL)
                goto out;
-       memset(&exp->tuple, 0, sizeof(exp->tuple));
-       exp->tuple.src.ip         = iph->daddr & mask;
-       exp->tuple.dst.ip         = iph->saddr;
-       exp->tuple.dst.u.udp.port = uh->source;
-       exp->tuple.dst.protonum   = IPPROTO_UDP;
 
-       memset(&exp->mask, 0, sizeof(exp->mask));
+       exp->tuple                = ct->tuplehash[IP_CT_DIR_REPLY].tuple;
+       exp->tuple.src.u.udp.port = ntohs(NMBD_PORT);
+
        exp->mask.src.ip          = mask;
+       exp->mask.src.u.udp.port  = 0xFFFF;
        exp->mask.dst.ip          = 0xFFFFFFFF;
        exp->mask.dst.u.udp.port  = 0xFFFF;
        exp->mask.dst.protonum    = 0xFF;
@@ -96,7 +91,7 @@ static int help(struct sk_buff **pskb,
        ip_conntrack_expect_related(exp);
        ip_conntrack_expect_put(exp);
 
-       ip_ct_refresh_acct(ct, ctinfo, NULL, timeout * HZ);
+       ip_ct_refresh(ct, *pskb, timeout * HZ);
 out:
        return NF_ACCEPT;
 }
@@ -104,12 +99,28 @@ out:
 static struct ip_conntrack_helper helper = {
        .name                   = "netbios-ns",
        .tuple = {
-               .src.u.udp.port = __constant_htons(137),
-               .dst.protonum   = IPPROTO_UDP,
+               .src = {
+                       .u = {
+                               .udp = {
+                                       .port   = __constant_htons(NMBD_PORT),
+                               }
+                       }
+               },
+               .dst = {
+                       .protonum       = IPPROTO_UDP,
+               },
        },
        .mask = {
-               .src.u.udp.port = 0xFFFF,
-               .dst.protonum   = 0xFF,
+               .src = {
+                       .u = {
+                               .udp = {
+                                       .port   = 0xFFFF,
+                               }
+                       }
+               },
+               .dst = {
+                       .protonum       = 0xFF,
+               },
        },
        .max_expected           = 1,
        .me                     = THIS_MODULE,