#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.115 2002-10-04 08:30:18 hannes Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.117 2002-12-11 07:14:02 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
struct protoent *proto;
ip = (const struct ip *)bp;
-#ifdef LBL_ALIGN
- /*
- * If the IP header is not aligned, copy into abuf.
- */
- if ((long)ip & 3) {
- static u_char *abuf = NULL;
- static int didwarn = 0;
-
- if (abuf == NULL) {
- abuf = (u_char *)malloc(snaplen);
- if (abuf == NULL)
- error("ip_print: malloc");
- }
- memcpy((char *)abuf, (char *)ip, min(length, snaplen));
- snapend += abuf - (u_char *)ip;
- packetp = abuf;
- ip = (struct ip *)abuf;
- /* We really want libpcap to give us aligned packets */
- if (!didwarn) {
- warning("compensating for unaligned libpcap packets");
- ++didwarn;
- }
- }
-#endif
if ((u_char *)(ip + 1) > snapend) {
printf("[|ip]");
return;
return;
}
- len = ntohs(ip->ip_len);
+ len = EXTRACT_16BITS(&ip->ip_len);
if (length < len)
(void)printf("truncated-ip - %d bytes missing! ",
len - length);
printf("IP ");
- off = ntohs(ip->ip_off);
+ off = EXTRACT_16BITS(&ip->ip_off);
if (vflag) {
(void)printf("(tos 0x%x", (int)ip->ip_tos);
}
if (ip->ip_ttl >= 1)
- (void)printf(", ttl %d", (int)ip->ip_ttl);
+ (void)printf(", ttl %u", ip->ip_ttl);
if ((off & 0x3fff) == 0)
- (void)printf(", id %d", (int)ntohs(ip->ip_id));
- (void)printf(", len %d) ", (int)ntohs(ip->ip_len));
+ (void)printf(", id %u", EXTRACT_16BITS(&ip->ip_id));
+ (void)printf(", len %u) ", EXTRACT_16BITS(&ip->ip_len));
}
/*
#ifndef IP_DF
#define IP_DF 0x4000
#endif /* IP_DF */
- (void)printf(" (frag %d:%u@%d%s)", ntohs(ip->ip_id), len,
+ (void)printf(" (frag %u:%u@%u%s)", EXTRACT_16BITS(&ip->ip_id), len,
(off & 0x1fff) * 8,
(off & IP_MF)? "+" : "");
if ((u_char *)ip + hlen <= snapend) {
sum = in_cksum((const u_short *)ip, hlen, 0);
if (sum != 0) {
- ip_sum = ntohs(ip->ip_sum);
+ ip_sum = EXTRACT_16BITS(&ip->ip_sum);
(void)printf("%sbad cksum %x (->%x)!", sep,
ip_sum,
in_cksum_shouldbe(ip_sum, sum));