From 2877f5b6133ecd5a0574b61880855776ec518278 Mon Sep 17 00:00:00 2001 From: fenner Date: Tue, 3 Apr 2001 07:50:46 +0000 Subject: Merge tcpdump 3.6.2 --- contrib/tcpdump/print-ip.c | 235 ++++++++++++--------------------------------- 1 file changed, 59 insertions(+), 176 deletions(-) (limited to 'contrib/tcpdump/print-ip.c') diff --git a/contrib/tcpdump/print-ip.c b/contrib/tcpdump/print-ip.c index fe06efd..8e88d6e 100644 --- a/contrib/tcpdump/print-ip.c +++ b/contrib/tcpdump/print-ip.c @@ -23,7 +23,7 @@ #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.92 2001/01/02 23:00:01 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -35,16 +35,7 @@ static const char rcsid[] = #include #include -#include -#include -#include -#include -#include -#include - -#ifdef HAVE_MALLOC_H -#include -#endif + #include #include #include @@ -54,172 +45,13 @@ static const char rcsid[] = #include "interface.h" #include "extract.h" /* must come after interface.h */ +#include "ip.h" + /* Compatibility */ #ifndef IPPROTO_ND #define IPPROTO_ND 77 #endif -#ifndef IN_CLASSD -#define IN_CLASSD(i) (((int32_t)(i) & 0xf0000000) == 0xe0000000) -#endif - -/* (following from ipmulti/mrouted/prune.h) */ - -/* - * The packet format for a traceroute request. - */ -struct tr_query { - u_int tr_src; /* traceroute source */ - u_int tr_dst; /* traceroute destination */ - u_int tr_raddr; /* traceroute response address */ - u_int tr_rttlqid; /* response ttl and qid */ -}; - -#define TR_GETTTL(x) (int)(((x) >> 24) & 0xff) -#define TR_GETQID(x) ((x) & 0x00ffffff) - -/* - * Traceroute response format. A traceroute response has a tr_query at the - * beginning, followed by one tr_resp for each hop taken. - */ -struct tr_resp { - u_int tr_qarr; /* query arrival time */ - u_int tr_inaddr; /* incoming interface address */ - u_int tr_outaddr; /* outgoing interface address */ - u_int tr_rmtaddr; /* parent address in source tree */ - u_int tr_vifin; /* input packet count on interface */ - u_int tr_vifout; /* output packet count on interface */ - u_int tr_pktcnt; /* total incoming packets for src-grp */ - u_char tr_rproto; /* routing proto deployed on router */ - u_char tr_fttl; /* ttl required to forward on outvif */ - u_char tr_smask; /* subnet mask for src addr */ - u_char tr_rflags; /* forwarding error codes */ -}; - -/* defs within mtrace */ -#define TR_QUERY 1 -#define TR_RESP 2 - -/* fields for tr_rflags (forwarding error codes) */ -#define TR_NO_ERR 0 -#define TR_WRONG_IF 1 -#define TR_PRUNED 2 -#define TR_OPRUNED 3 -#define TR_SCOPED 4 -#define TR_NO_RTE 5 -#define TR_NO_FWD 7 -#define TR_NO_SPACE 0x81 -#define TR_OLD_ROUTER 0x82 - -/* fields for tr_rproto (routing protocol) */ -#define TR_PROTO_DVMRP 1 -#define TR_PROTO_MOSPF 2 -#define TR_PROTO_PIM 3 -#define TR_PROTO_CBT 4 - -static void print_mtrace(register const u_char *bp, register u_int len) -{ - register struct tr_query *tr = (struct tr_query *)(bp + 8); - - printf("mtrace %lu: %s to %s reply-to %s", - (u_long)TR_GETQID(ntohl(tr->tr_rttlqid)), - ipaddr_string(&tr->tr_src), ipaddr_string(&tr->tr_dst), - ipaddr_string(&tr->tr_raddr)); - if (IN_CLASSD(ntohl(tr->tr_raddr))) - printf(" with-ttl %d", TR_GETTTL(ntohl(tr->tr_rttlqid))); -} - -static void print_mresp(register const u_char *bp, register u_int len) -{ - register struct tr_query *tr = (struct tr_query *)(bp + 8); - - printf("mresp %lu: %s to %s reply-to %s", - (u_long)TR_GETQID(ntohl(tr->tr_rttlqid)), - ipaddr_string(&tr->tr_src), ipaddr_string(&tr->tr_dst), - ipaddr_string(&tr->tr_raddr)); - if (IN_CLASSD(ntohl(tr->tr_raddr))) - printf(" with-ttl %d", TR_GETTTL(ntohl(tr->tr_rttlqid))); -} - -static void -igmp_print(register const u_char *bp, register u_int len, - register const u_char *bp2) -{ - register const struct ip *ip; - - ip = (const struct ip *)bp2; - (void)printf("%s > %s: ", - ipaddr_string(&ip->ip_src), - ipaddr_string(&ip->ip_dst)); - - if (qflag) { - (void)printf("igmp"); - return; - } - - TCHECK2(bp[0], 8); - switch (bp[0]) { - case 0x11: - (void)printf("igmp %s query", bp[1] ? "v2" : "v1"); - if (bp[1] && bp[1] != 100) - (void)printf(" [intvl %d]", bp[1]); - (void)printf("igmp query"); - if (EXTRACT_32BITS(&bp[4])) - (void)printf(" [gaddr %s]", ipaddr_string(&bp[4])); - if (len != 8) - (void)printf(" [len %d]", len); - break; - case 0x12: - case 0x16: - (void)printf("igmp %s report %s", - (bp[0] & 0x0f) == 6 ? "v2" : "v1", - ipaddr_string(&bp[4])); - if (len != 8) - (void)printf(" [len %d]", len); - if (bp[1]) - (void)printf(" [b1=0x%x]", bp[1]); - break; - case 0x17: - (void)printf("igmp leave %s", ipaddr_string(&bp[4])); - if (len != 8) - (void)printf(" [len %d]", len); - if (bp[1]) - (void)printf(" [b1=0x%x]", bp[1]); - break; - case 0x13: - (void)printf("igmp dvmrp"); - if (len < 8) - (void)printf(" [len %d]", len); - else - dvmrp_print(bp, len); - break; - case 0x14: - (void)printf("igmp pimv1"); - pimv1_print(bp, len); - break; - case 0x1e: - print_mresp(bp, len); - break; - case 0x1f: - print_mtrace(bp, len); - break; - default: - (void)printf("igmp-%d", bp[0] & 0xf); - if (bp[1]) - (void)printf(" [b1=0x%02x]", bp[1]); - break; - } - - if (vflag && TTEST2(bp[0], len)) { - /* Check the IGMP checksum */ - if (in_cksum((const u_short*)bp, len, 0)) - printf(" bad igmp cksum %x!", EXTRACT_16BITS(&bp[2])); - } - return; -trunc: - fputs("[|igmp]", stdout); -} - /* * print the recorded route in an IP RR, LSRR or SSRR option. */ @@ -312,7 +144,15 @@ ip_optprint(register const u_char *cp, u_int length) 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; @@ -455,7 +295,11 @@ ip_print(register const u_char *bp, register u_int length) (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) @@ -521,11 +365,11 @@ again: } case IPPROTO_TCP: - tcp_print(cp, len, (const u_char *)ip); + tcp_print(cp, len, (const u_char *)ip, (off &~ 0x6000)); break; case IPPROTO_UDP: - udp_print(cp, len, (const u_char *)ip); + udp_print(cp, len, (const u_char *)ip, (off &~ 0x6000)); break; case IPPROTO_ICMP: @@ -639,6 +483,17 @@ again: pim_print(cp, len); break; +#ifndef IPPROTO_VRRP +#define IPPROTO_VRRP 112 +#endif + case IPPROTO_VRRP: + if (vflag) + (void)printf("vrrp %s > %s: ", + ipaddr_string(&ip->ip_src), + ipaddr_string(&ip->ip_dst)); + vrrp_print(cp, len, ip->ip_ttl); + break; + default: #if 0 (void)printf("%s > %s:", ipaddr_string(&ip->ip_src), @@ -708,6 +563,8 @@ again: (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) { @@ -723,3 +580,29 @@ again: 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; + } +} -- cgit v1.1