vserver 1.9.3
[linux-2.6.git] / net / ipv4 / ipvs / ip_vs_proto.c
index caf24e3..dfd0a7d 100644 (file)
@@ -166,27 +166,33 @@ ip_vs_tcpudp_debug_packet(struct ip_vs_protocol *pp,
                          const char *msg)
 {
        char buf[128];
-       __u16 ports[2];
-       struct iphdr iph;
+       struct iphdr _iph, *ih;
 
-       if (skb_copy_bits(skb, offset, &iph, sizeof(iph)) < 0)
+       ih = skb_header_pointer(skb, offset, sizeof(_iph), &_iph);
+       if (ih == NULL)
                sprintf(buf, "%s TRUNCATED", pp->name);
-       else if (iph.frag_off & __constant_htons(IP_OFFSET))
+       else if (ih->frag_off & __constant_htons(IP_OFFSET))
                sprintf(buf, "%s %u.%u.%u.%u->%u.%u.%u.%u frag",
-                       pp->name, NIPQUAD(iph.saddr),
-                       NIPQUAD(iph.daddr));
-       else if (skb_copy_bits(skb, offset + iph.ihl*4, ports, sizeof(ports)) < 0)
-               sprintf(buf, "%s TRUNCATED %u.%u.%u.%u->%u.%u.%u.%u",
-                       pp->name,
-                       NIPQUAD(iph.saddr),
-                       NIPQUAD(iph.daddr));
-       else
-               sprintf(buf, "%s %u.%u.%u.%u:%u->%u.%u.%u.%u:%u",
-                       pp->name,
-                       NIPQUAD(iph.saddr),
-                       ntohs(ports[0]),
-                       NIPQUAD(iph.daddr),
-                       ntohs(ports[1]));
+                       pp->name, NIPQUAD(ih->saddr),
+                       NIPQUAD(ih->daddr));
+       else {
+               __u16 _ports[2], *pptr
+;
+               pptr = skb_header_pointer(skb, offset + ih->ihl*4,
+                                         sizeof(_ports), _ports);
+               if (pptr == NULL)
+                       sprintf(buf, "%s TRUNCATED %u.%u.%u.%u->%u.%u.%u.%u",
+                               pp->name,
+                               NIPQUAD(ih->saddr),
+                               NIPQUAD(ih->daddr));
+               else
+                       sprintf(buf, "%s %u.%u.%u.%u:%u->%u.%u.%u.%u:%u",
+                               pp->name,
+                               NIPQUAD(ih->saddr),
+                               ntohs(pptr[0]),
+                               NIPQUAD(ih->daddr),
+                               ntohs(pptr[1]));
+       }
 
        printk(KERN_DEBUG "IPVS: %s: %s\n", msg, buf);
 }