[NETFILTER]: Introduce NF_INET_ hook values
[safe/jmp/linux-2.6] / net / ipv4 / netfilter / nf_nat_sip.c
index 940cdfc..b8c0720 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,
+       /* Get actual SDP length */
+       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,
@@ -235,19 +229,19 @@ static void ip_nat_sdp_expect(struct nf_conn *ct,
        range.min_ip = range.max_ip
                = ct->master->tuplehash[!exp->dir].tuple.dst.u3.ip;
        /* hook doesn't matter, but it has to do source manip */
-       nf_nat_setup_info(ct, &range, NF_IP_POST_ROUTING);
+       nf_nat_setup_info(ct, &range, NF_INET_POST_ROUTING);
 
        /* For DST manip, map port here to where it's expected. */
        range.flags = (IP_NAT_RANGE_MAP_IPS | IP_NAT_RANGE_PROTO_SPECIFIED);
        range.min = range.max = exp->saved_proto;
        range.min_ip = range.max_ip = exp->saved_ip;
        /* hook doesn't matter, but it has to do destination manip */
-       nf_nat_setup_info(ct, &range, NF_IP_PRE_ROUTING);
+       nf_nat_setup_info(ct, &range, NF_INET_PRE_ROUTING);
 }
 
 /* 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,8 +251,6 @@ 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 */
        if (ct->tuplehash[dir].tuple.src.u3.ip ==
            ct->tuplehash[!dir].tuple.dst.u3.ip)
@@ -285,7 +277,7 @@ static unsigned int ip_nat_sdp(struct sk_buff **pskb,
        if (port == 0)
                return NF_DROP;
 
-       if (!mangle_sdp(pskb, ctinfo, ct, newip, port, dptr)) {
+       if (!mangle_sdp(skb, ctinfo, ct, newip, port, dptr)) {
                nf_ct_unexpect_related(exp);
                return NF_DROP;
        }
@@ -301,8 +293,8 @@ static void __exit nf_nat_sip_fini(void)
 
 static int __init nf_nat_sip_init(void)
 {
-       BUG_ON(rcu_dereference(nf_nat_sip_hook));
-       BUG_ON(rcu_dereference(nf_nat_sdp_hook));
+       BUG_ON(nf_nat_sip_hook != NULL);
+       BUG_ON(nf_nat_sdp_hook != NULL);
        rcu_assign_pointer(nf_nat_sip_hook, ip_nat_sip);
        rcu_assign_pointer(nf_nat_sdp_hook, ip_nat_sdp);
        return 0;