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);
}