[IPVS]: Replace local version of skb_make_writable
[pandora-kernel.git] / net / ipv4 / ipvs / ip_vs_proto_udp.c
index 54aa760..c70aa40 100644 (file)
 #include <linux/in.h>
 #include <linux/ip.h>
 #include <linux/kernel.h>
+#include <linux/netfilter.h>
 #include <linux/netfilter_ipv4.h>
 #include <linux/udp.h>
 
 #include <net/ip_vs.h>
-
+#include <net/ip.h>
 
 static struct ip_vs_conn *
 udp_conn_in_get(const struct sk_buff *skb, struct ip_vs_protocol *pp,
@@ -56,7 +57,7 @@ udp_conn_out_get(const struct sk_buff *skb, struct ip_vs_protocol *pp,
        struct ip_vs_conn *cp;
        __be16 _ports[2], *pptr;
 
-       pptr = skb_header_pointer(skb, skb->nh.iph->ihl*4,
+       pptr = skb_header_pointer(skb, ip_hdrlen(skb),
                                  sizeof(_ports), _ports);
        if (pptr == NULL)
                return NULL;
@@ -82,15 +83,15 @@ udp_conn_schedule(struct sk_buff *skb, struct ip_vs_protocol *pp,
        struct ip_vs_service *svc;
        struct udphdr _udph, *uh;
 
-       uh = skb_header_pointer(skb, skb->nh.iph->ihl*4,
+       uh = skb_header_pointer(skb, ip_hdrlen(skb),
                                sizeof(_udph), &_udph);
        if (uh == NULL) {
                *verdict = NF_DROP;
                return 0;
        }
 
-       if ((svc = ip_vs_service_get(skb->nfmark, skb->nh.iph->protocol,
-                                    skb->nh.iph->daddr, uh->dest))) {
+       if ((svc = ip_vs_service_get(skb->mark, ip_hdr(skb)->protocol,
+                                    ip_hdr(skb)->daddr, uh->dest))) {
                if (ip_vs_todrop()) {
                        /*
                         * It seems that we are very loaded.
@@ -121,11 +122,11 @@ udp_fast_csum_update(struct udphdr *uhdr, __be32 oldip, __be32 newip,
                     __be16 oldport, __be16 newport)
 {
        uhdr->check =
-               ip_vs_check_diff(~oldip, newip,
-                                ip_vs_check_diff(oldport ^ htonl(0xFFFF),
-                                                 newport, uhdr->check));
+               csum_fold(ip_vs_check_diff4(oldip, newip,
+                                ip_vs_check_diff2(oldport, newport,
+                                       ~csum_unfold(uhdr->check))));
        if (!uhdr->check)
-               uhdr->check = htonl(0xFFFF);
+               uhdr->check = CSUM_MANGLED_0;
 }
 
 static int
@@ -133,10 +134,10 @@ udp_snat_handler(struct sk_buff **pskb,
                 struct ip_vs_protocol *pp, struct ip_vs_conn *cp)
 {
        struct udphdr *udph;
-       unsigned int udphoff = (*pskb)->nh.iph->ihl * 4;
+       const unsigned int udphoff = ip_hdrlen(*pskb);
 
        /* csum_check requires unshared skb */
-       if (!ip_vs_make_skb_writable(pskb, udphoff+sizeof(*udph)))
+       if (!skb_make_writable(*pskb, udphoff+sizeof(*udph)))
                return 0;
 
        if (unlikely(cp->app != NULL)) {
@@ -151,7 +152,7 @@ udp_snat_handler(struct sk_buff **pskb,
                        return 0;
        }
 
-       udph = (void *)(*pskb)->nh.iph + udphoff;
+       udph = (void *)ip_hdr(*pskb) + udphoff;
        udph->source = cp->vport;
 
        /*
@@ -173,7 +174,7 @@ udp_snat_handler(struct sk_buff **pskb,
                                                cp->protocol,
                                                (*pskb)->csum);
                if (udph->check == 0)
-                       udph->check = htonl(0xFFFF);
+                       udph->check = CSUM_MANGLED_0;
                IP_VS_DBG(11, "O-pkt: %s O-csum=%d (+%zd)\n",
                          pp->name, udph->check,
                          (char*)&(udph->check) - (char*)udph);
@@ -187,10 +188,10 @@ udp_dnat_handler(struct sk_buff **pskb,
                 struct ip_vs_protocol *pp, struct ip_vs_conn *cp)
 {
        struct udphdr *udph;
-       unsigned int udphoff = (*pskb)->nh.iph->ihl * 4;
+       unsigned int udphoff = ip_hdrlen(*pskb);
 
        /* csum_check requires unshared skb */
-       if (!ip_vs_make_skb_writable(pskb, udphoff+sizeof(*udph)))
+       if (!skb_make_writable(*pskb, udphoff+sizeof(*udph)))
                return 0;
 
        if (unlikely(cp->app != NULL)) {
@@ -206,7 +207,7 @@ udp_dnat_handler(struct sk_buff **pskb,
                        return 0;
        }
 
-       udph = (void *)(*pskb)->nh.iph + udphoff;
+       udph = (void *)ip_hdr(*pskb) + udphoff;
        udph->dest = cp->dport;
 
        /*
@@ -228,7 +229,7 @@ udp_dnat_handler(struct sk_buff **pskb,
                                                cp->protocol,
                                                (*pskb)->csum);
                if (udph->check == 0)
-                       udph->check = 0xFFFF;
+                       udph->check = CSUM_MANGLED_0;
                (*pskb)->ip_summed = CHECKSUM_UNNECESSARY;
        }
        return 1;
@@ -239,7 +240,7 @@ static int
 udp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp)
 {
        struct udphdr _udph, *uh;
-       unsigned int udphoff = skb->nh.iph->ihl*4;
+       const unsigned int udphoff = ip_hdrlen(skb);
 
        uh = skb_header_pointer(skb, udphoff, sizeof(_udph), &_udph);
        if (uh == NULL)
@@ -251,10 +252,10 @@ udp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp)
                        skb->csum = skb_checksum(skb, udphoff,
                                                 skb->len - udphoff, 0);
                case CHECKSUM_COMPLETE:
-                       if (csum_tcpudp_magic(skb->nh.iph->saddr,
-                                             skb->nh.iph->daddr,
+                       if (csum_tcpudp_magic(ip_hdr(skb)->saddr,
+                                             ip_hdr(skb)->daddr,
                                              skb->len - udphoff,
-                                             skb->nh.iph->protocol,
+                                             ip_hdr(skb)->protocol,
                                              skb->csum)) {
                                IP_VS_DBG_RL_PKT(0, pp, skb, 0,
                                                 "Failed checksum for");
@@ -282,16 +283,18 @@ udp_csum_check(struct sk_buff *skb, struct ip_vs_protocol *pp)
 static struct list_head udp_apps[UDP_APP_TAB_SIZE];
 static DEFINE_SPINLOCK(udp_app_lock);
 
-static inline __u16 udp_app_hashkey(__u16 port)
+static inline __u16 udp_app_hashkey(__be16 port)
 {
-       return ((port >> UDP_APP_TAB_BITS) ^ port) & UDP_APP_TAB_MASK;
+       return (((__force u16)port >> UDP_APP_TAB_BITS) ^ (__force u16)port)
+               & UDP_APP_TAB_MASK;
 }
 
 
 static int udp_register_app(struct ip_vs_app *inc)
 {
        struct ip_vs_app *i;
-       __u16 hash, port = inc->port;
+       __u16 hash;
+       __be16 port = inc->port;
        int ret = 0;
 
        hash = udp_app_hashkey(port);