[NETFILTER]: Replace sk_buff ** with sk_buff *
[deliverable/linux.git] / net / ipv4 / netfilter / nf_nat_sip.c
index fac97cf51ae52c5ec4e934da520bbb538697ac9b..ce9edbcc01e387dc8ca320f28adc40520718dbae 100644 (file)
@@ -26,12 +26,6 @@ MODULE_AUTHOR("Christian Hentschel <chentschel@arnet.com.ar>");
 MODULE_DESCRIPTION("SIP NAT helper");
 MODULE_ALIAS("ip_nat_sip");
 
-#if 0
-#define DEBUGP printk
-#else
-#define DEBUGP(format, args...)
-#endif
-
 struct addr_map {
        struct {
                char            src[sizeof("nnn.nnn.nnn.nnn:nnnnn")];
@@ -66,7 +60,7 @@ static void addr_map_init(struct nf_conn *ct, struct addr_map *map)
        }
 }
 
-static int map_sip_addr(struct sk_buff **pskb, enum ip_conntrack_info ctinfo,
+static int map_sip_addr(struct sk_buff *skb, enum ip_conntrack_info ctinfo,
                        struct nf_conn *ct, const char **dptr, size_t dlen,
                        enum sip_header_pos pos, struct addr_map *map)
 {
@@ -90,15 +84,15 @@ static int map_sip_addr(struct sk_buff **pskb, enum ip_conntrack_info ctinfo,
        } else
                return 1;
 
-       if (!nf_nat_mangle_udp_packet(pskb, ct, ctinfo,
+       if (!nf_nat_mangle_udp_packet(skb, ct, ctinfo,
                                      matchoff, matchlen, addr, addrlen))
                return 0;
-       *dptr = (*pskb)->data + ip_hdrlen(*pskb) + sizeof(struct udphdr);
+       *dptr = skb->data + ip_hdrlen(skb) + sizeof(struct udphdr);
        return 1;
 
 }
 
-static unsigned int ip_nat_sip(struct sk_buff **pskb,
+static unsigned int ip_nat_sip(struct sk_buff *skb,
                               enum ip_conntrack_info ctinfo,
                               struct nf_conn *ct,
                               const char **dptr)
@@ -107,10 +101,10 @@ static unsigned int ip_nat_sip(struct sk_buff **pskb,
        struct addr_map map;
        int dataoff, datalen;
 
-       dataoff = ip_hdrlen(*pskb) + sizeof(struct udphdr);
-       datalen = (*pskb)->len - dataoff;
+       dataoff = ip_hdrlen(skb) + sizeof(struct udphdr);
+       datalen = skb->len - dataoff;
        if (datalen < sizeof("SIP/2.0") - 1)
-               return NF_DROP;
+               return NF_ACCEPT;
 
        addr_map_init(ct, &map);
 
@@ -127,19 +121,19 @@ static unsigned int ip_nat_sip(struct sk_buff **pskb,
                else
                        pos = POS_REQ_URI;
 
-               if (!map_sip_addr(pskb, ctinfo, ct, dptr, datalen, pos, &map))
+               if (!map_sip_addr(skb, ctinfo, ct, dptr, datalen, pos, &map))
                        return NF_DROP;
        }
 
-       if (!map_sip_addr(pskb, ctinfo, ct, dptr, datalen, POS_FROM, &map) ||
-           !map_sip_addr(pskb, ctinfo, ct, dptr, datalen, POS_TO, &map) ||
-           !map_sip_addr(pskb, ctinfo, ct, dptr, datalen, POS_VIA, &map) ||
-           !map_sip_addr(pskb, ctinfo, ct, dptr, datalen, POS_CONTACT, &map))
+       if (!map_sip_addr(skb, ctinfo, ct, dptr, datalen, POS_FROM, &map) ||
+           !map_sip_addr(skb, ctinfo, ct, dptr, datalen, POS_TO, &map) ||
+           !map_sip_addr(skb, ctinfo, ct, dptr, datalen, POS_VIA, &map) ||
+           !map_sip_addr(skb, ctinfo, ct, dptr, datalen, POS_CONTACT, &map))
                return NF_DROP;
        return NF_ACCEPT;
 }
 
-static unsigned int mangle_sip_packet(struct sk_buff **pskb,
+static unsigned int mangle_sip_packet(struct sk_buff *skb,
                                      enum ip_conntrack_info ctinfo,
                                      struct nf_conn *ct,
                                      const char **dptr, size_t dlen,
@@ -151,16 +145,16 @@ static unsigned int mangle_sip_packet(struct sk_buff **pskb,
        if (ct_sip_get_info(ct, *dptr, dlen, &matchoff, &matchlen, pos) <= 0)
                return 0;
 
-       if (!nf_nat_mangle_udp_packet(pskb, ct, ctinfo,
+       if (!nf_nat_mangle_udp_packet(skb, ct, ctinfo,
                                      matchoff, matchlen, buffer, bufflen))
                return 0;
 
        /* We need to reload this. Thanks Patrick. */
-       *dptr = (*pskb)->data + ip_hdrlen(*pskb) + sizeof(struct udphdr);
+       *dptr = skb->data + ip_hdrlen(skb) + sizeof(struct udphdr);
        return 1;
 }
 
-static int mangle_content_len(struct sk_buff **pskb,
+static int mangle_content_len(struct sk_buff *skb,
                              enum ip_conntrack_info ctinfo,
                              struct nf_conn *ct,
                              const char *dptr)
@@ -169,22 +163,22 @@ static int mangle_content_len(struct sk_buff **pskb,
        char buffer[sizeof("65536")];
        int bufflen;
 
-       dataoff = ip_hdrlen(*pskb) + sizeof(struct udphdr);
+       dataoff = ip_hdrlen(skb) + sizeof(struct udphdr);
 
        /* Get actual SDP lenght */
-       if (ct_sip_get_info(ct, dptr, (*pskb)->len - dataoff, &matchoff,
+       if (ct_sip_get_info(ct, dptr, skb->len - dataoff, &matchoff,
                            &matchlen, POS_SDP_HEADER) > 0) {
 
                /* since ct_sip_get_info() give us a pointer passing 'v='
                   we need to add 2 bytes in this count. */
-               int c_len = (*pskb)->len - dataoff - matchoff + 2;
+               int c_len = skb->len - dataoff - matchoff + 2;
 
                /* Now, update SDP length */
-               if (ct_sip_get_info(ct, dptr, (*pskb)->len - dataoff, &matchoff,
+               if (ct_sip_get_info(ct, dptr, skb->len - dataoff, &matchoff,
                                    &matchlen, POS_CONTENT) > 0) {
 
                        bufflen = sprintf(buffer, "%u", c_len);
-                       return nf_nat_mangle_udp_packet(pskb, ct, ctinfo,
+                       return nf_nat_mangle_udp_packet(skb, ct, ctinfo,
                                                        matchoff, matchlen,
                                                        buffer, bufflen);
                }
@@ -192,7 +186,7 @@ static int mangle_content_len(struct sk_buff **pskb,
        return 0;
 }
 
-static unsigned int mangle_sdp(struct sk_buff **pskb,
+static unsigned int mangle_sdp(struct sk_buff *skb,
                               enum ip_conntrack_info ctinfo,
                               struct nf_conn *ct,
                               __be32 newip, u_int16_t port,
@@ -201,25 +195,25 @@ static unsigned int mangle_sdp(struct sk_buff **pskb,
        char buffer[sizeof("nnn.nnn.nnn.nnn")];
        unsigned int dataoff, bufflen;
 
-       dataoff = ip_hdrlen(*pskb) + sizeof(struct udphdr);
+       dataoff = ip_hdrlen(skb) + sizeof(struct udphdr);
 
        /* Mangle owner and contact info. */
        bufflen = sprintf(buffer, "%u.%u.%u.%u", NIPQUAD(newip));
-       if (!mangle_sip_packet(pskb, ctinfo, ct, &dptr, (*pskb)->len - dataoff,
+       if (!mangle_sip_packet(skb, ctinfo, ct, &dptr, skb->len - dataoff,
                               buffer, bufflen, POS_OWNER_IP4))
                return 0;
 
-       if (!mangle_sip_packet(pskb, ctinfo, ct, &dptr, (*pskb)->len - dataoff,
+       if (!mangle_sip_packet(skb, ctinfo, ct, &dptr, skb->len - dataoff,
                               buffer, bufflen, POS_CONNECTION_IP4))
                return 0;
 
        /* Mangle media port. */
        bufflen = sprintf(buffer, "%u", port);
-       if (!mangle_sip_packet(pskb, ctinfo, ct, &dptr, (*pskb)->len - dataoff,
+       if (!mangle_sip_packet(skb, ctinfo, ct, &dptr, skb->len - dataoff,
                               buffer, bufflen, POS_MEDIA))
                return 0;
 
-       return mangle_content_len(pskb, ctinfo, ct, dptr);
+       return mangle_content_len(skb, ctinfo, ct, dptr);
 }
 
 static void ip_nat_sdp_expect(struct nf_conn *ct,
@@ -247,7 +241,7 @@ static void ip_nat_sdp_expect(struct nf_conn *ct,
 
 /* So, this packet has hit the connection tracking matching code.
    Mangle it, and change the expectation to match the new version. */
-static unsigned int ip_nat_sdp(struct sk_buff **pskb,
+static unsigned int ip_nat_sdp(struct sk_buff *skb,
                               enum ip_conntrack_info ctinfo,
                               struct nf_conntrack_expect *exp,
                               const char *dptr)
@@ -257,10 +251,12 @@ static unsigned int ip_nat_sdp(struct sk_buff **pskb,
        __be32 newip;
        u_int16_t port;
 
-       DEBUGP("ip_nat_sdp():\n");
-
        /* Connection will come from reply */
-       newip = ct->tuplehash[!dir].tuple.dst.u3.ip;
+       if (ct->tuplehash[dir].tuple.src.u3.ip ==
+           ct->tuplehash[!dir].tuple.dst.u3.ip)
+               newip = exp->tuple.dst.u3.ip;
+       else
+               newip = ct->tuplehash[!dir].tuple.dst.u3.ip;
 
        exp->saved_ip = exp->tuple.dst.u3.ip;
        exp->tuple.dst.u3.ip = newip;
@@ -274,15 +270,15 @@ static unsigned int ip_nat_sdp(struct sk_buff **pskb,
        /* Try to get same port: if not, try to change it. */
        for (port = ntohs(exp->saved_proto.udp.port); port != 0; port++) {
                exp->tuple.dst.u.udp.port = htons(port);
-               if (nf_conntrack_expect_related(exp) == 0)
+               if (nf_ct_expect_related(exp) == 0)
                        break;
        }
 
        if (port == 0)
                return NF_DROP;
 
-       if (!mangle_sdp(pskb, ctinfo, ct, newip, port, dptr)) {
-               nf_conntrack_unexpect_related(exp);
+       if (!mangle_sdp(skb, ctinfo, ct, newip, port, dptr)) {
+               nf_ct_unexpect_related(exp);
                return NF_DROP;
        }
        return NF_ACCEPT;
This page took 0.029273 seconds and 5 git commands to generate.