#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.79 1999-12-22 06:27:21 itojun Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.89 2000-10-03 02:54:58 itojun Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
#include <sys/socket.h>
#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#include <netinet/ip_var.h>
-#include <netinet/udp.h>
-#include <netinet/udp_var.h>
-#include <netinet/tcp.h>
-
-#ifdef HAVE_MALLOC_H
-#include <malloc.h>
-#endif
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "interface.h"
#include "extract.h" /* must come after interface.h */
+#include "ip.h"
+
/* Compatibility */
#ifndef IPPROTO_ND
#define IPPROTO_ND 77
for (; length > 0; cp += len, length -= len) {
int tt = *cp;
- len = (tt == IPOPT_NOP || tt == IPOPT_EOL) ? 1 : cp[1];
+ if (tt == IPOPT_NOP || tt == IPOPT_EOL)
+ len = 1;
+ else {
+ if (&cp[1] >= snapend) {
+ printf("[|ip]");
+ return;
+ }
+ len = cp[1];
+ }
if (len <= 0) {
printf("[|ip op len %d]", len);
return;
(void)printf("truncated-ip %d", length);
return;
}
- hlen = ip->ip_hl * 4;
+ hlen = IP_HL(ip) * 4;
+ if (hlen < sizeof (struct ip)) {
+ (void)printf("bad-hlen %d", hlen);
+ return;
+ }
len = ntohs(ip->ip_len);
if (length < len)
pim_print(cp, len);
break;
+#ifndef IPPROTO_VRRP
+#define IPPROTO_VRRP 112
+#endif
+ case IPPROTO_VRRP:
+ vrrp_print(cp, len, ip->ip_ttl);
+ break;
+
default:
#if 0
(void)printf("%s > %s:", ipaddr_string(&ip->ip_src),
(void)printf("%sid %d", sep, (int)ntohs(ip->ip_id));
sep = ", ";
}
+ (void)printf("%slen %d", sep, (int)ntohs(ip->ip_len));
+ sep = ", ";
if ((u_char *)ip + hlen <= snapend) {
sum = in_cksum((const u_short *)ip, hlen, 0);
if (sum != 0) {
printf(")");
}
}
+
+void
+ipN_print(register const u_char *bp, register u_int length)
+{
+ struct ip *ip, hdr;
+
+ ip = (struct ip *)bp;
+ if (length < 4) {
+ (void)printf("truncated-ip %d", length);
+ return;
+ }
+ memcpy (&hdr, (char *)ip, 4);
+ switch (IP_V(&hdr)) {
+ case 4:
+ ip_print (bp, length);
+ return;
+#ifdef INET6
+ case 6:
+ ip6_print (bp, length);
+ return;
+#endif
+ default:
+ (void)printf("unknown ip %d", IP_V(&hdr));
+ return;
+ }
+}