X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/8633096f7d7d944721fc5924d5baeff80a9718f8..8f94d68a09e1103353cc7d1133d6dfdf7d5a920d:/print-icmp.c diff --git a/print-icmp.c b/print-icmp.c index d1e730e2..848b0a3a 100644 --- a/print-icmp.c +++ b/print-icmp.c @@ -21,22 +21,17 @@ #ifndef lint static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/print-icmp.c,v 1.68 2002-07-30 08:15:44 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/print-icmp.c,v 1.72 2003-05-15 16:58:04 hannes Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif -#include -#include -#include - -#include +#include #include #include -#include /* for MAXHOSTNAMELEN on some platforms */ #include "interface.h" #include "addrtoname.h" @@ -265,7 +260,7 @@ struct id_rdiscovery { }; void -icmp_print(const u_char *bp, u_int plen, const u_char *bp2) +icmp_print(const u_char *bp, u_int plen, const u_char *bp2, int fragmented) { char *cp; const struct icmp *dp; @@ -289,7 +284,7 @@ icmp_print(const u_char *bp, u_int plen, const u_char *bp2) (void)snprintf(buf, sizeof(buf), "echo %s seq %u", dp->icmp_type == ICMP_ECHO ? "request" : "reply", - (unsigned)ntohs(dp->icmp_seq)); + EXTRACT_16BITS(&dp->icmp_seq)); break; case ICMP_UNREACH: @@ -309,7 +304,7 @@ icmp_print(const u_char *bp, u_int plen, const u_char *bp2) oip = &dp->icmp_ip; hlen = IP_HL(oip) * 4; ouh = (struct udphdr *)(((u_char *)oip) + hlen); - dport = ntohs(ouh->uh_dport); + dport = EXTRACT_16BITS(&ouh->uh_dport); switch (oip->ip_p) { case IPPROTO_TCP: @@ -454,26 +449,26 @@ icmp_print(const u_char *bp, u_int plen, const u_char *bp2) case ICMP_MASKREPLY: TCHECK(dp->icmp_mask); (void)snprintf(buf, sizeof(buf), "address mask is 0x%08x", - (unsigned)ntohl(dp->icmp_mask)); + EXTRACT_32BITS(&dp->icmp_mask)); break; case ICMP_TSTAMP: TCHECK(dp->icmp_seq); (void)snprintf(buf, sizeof(buf), "time stamp query id %u seq %u", - (unsigned)ntohs(dp->icmp_id), - (unsigned)ntohs(dp->icmp_seq)); + EXTRACT_16BITS(&dp->icmp_id), + EXTRACT_16BITS(&dp->icmp_seq)); break; case ICMP_TSTAMPREPLY: TCHECK(dp->icmp_ttime); (void)snprintf(buf, sizeof(buf), - "time stamp reply id %u seq %u : org 0x%lx recv 0x%lx xmit 0x%lx", - (unsigned)ntohs(dp->icmp_id), - (unsigned)ntohs(dp->icmp_seq), - (unsigned long)ntohl(dp->icmp_otime), - (unsigned long)ntohl(dp->icmp_rtime), - (unsigned long)ntohl(dp->icmp_ttime)); + "time stamp reply id %u seq %u : org 0x%x recv 0x%x xmit 0x%x", + EXTRACT_16BITS(&dp->icmp_id), + EXTRACT_16BITS(&dp->icmp_seq), + EXTRACT_32BITS(&dp->icmp_otime), + EXTRACT_32BITS(&dp->icmp_rtime), + EXTRACT_32BITS(&dp->icmp_ttime)); break; default: @@ -481,12 +476,12 @@ icmp_print(const u_char *bp, u_int plen, const u_char *bp2) break; } (void)printf("icmp %d: %s", plen, str); - if (vflag) { + if (vflag && !fragmented) { /* don't attempt checksumming if this is a frag */ u_int16_t sum, icmp_sum; if (TTEST2(*bp, plen)) { sum = in_cksum((u_short*)dp, plen, 0); if (sum != 0) { - icmp_sum = ntohs(dp->icmp_cksum); + icmp_sum = EXTRACT_16BITS(&dp->icmp_cksum); (void)printf(" (wrong icmp cksum %x (->%x)!)", icmp_sum, in_cksum_shouldbe(icmp_sum, sum)); @@ -498,7 +493,7 @@ icmp_print(const u_char *bp, u_int plen, const u_char *bp2) (void)printf(" for "); ip = (struct ip *)bp; snaplen = snapend - bp; - ip_print(bp, ntohs(ip->ip_len)); + ip_print(bp, EXTRACT_16BITS(&ip->ip_len)); } return; trunc: