X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/3d932490b826facb568937a1290910a1265267f5..98fddc3bb425b51e164d187b459c0514ac6f8a9a:/print-ip6opts.c diff --git a/print-ip6opts.c b/print-ip6opts.c index f0349a0f..2121b460 100644 --- a/print-ip6opts.c +++ b/print-ip6opts.c @@ -32,8 +32,8 @@ #endif #ifndef lint -static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/print-ip6opts.c,v 1.12 2002-08-01 08:53:11 risso Exp $"; +static const char rcsid[] _U_ = + "@(#) $Header: /tcpdump/master/tcpdump/print-ip6opts.c,v 1.18 2005-04-20 22:18:50 guy Exp $"; #endif #ifdef INET6 @@ -45,6 +45,7 @@ static const char rcsid[] = #include "interface.h" #include "addrtoname.h" +#include "extract.h" /* items outside of rfc2292bis */ #ifndef IP6OPT_MINLEN @@ -103,7 +104,7 @@ ip6_sopt_print(const u_char *bp, int len) printf(", ui: trunc"); goto trunc; } - printf(", ui: 0x%04x ", ntohs(*(u_int16_t *)&bp[i + 2])); + printf(", ui: 0x%04x ", EXTRACT_16BITS(&bp[i + 2])); break; case IP6SOPT_ALTCOA: if (len - i < IP6SOPT_ALTCOA_MINLEN) { @@ -117,8 +118,7 @@ ip6_sopt_print(const u_char *bp, int len) printf(", auth: trunc"); goto trunc; } - printf(", auth spi: 0x%08x", - (u_int32_t)ntohl(*(u_int32_t *)&bp[i + 2])); + printf(", auth spi: 0x%08x", EXTRACT_32BITS(&bp[i + 2])); break; default: if (len - i < IP6OPT_MINLEN) { @@ -139,8 +139,10 @@ void ip6_opt_print(const u_char *bp, int len) { int i; - int optlen; + int optlen = 0; + if (len == 0) + return; for (i = 0; i < len; i += optlen) { if (bp[i] == IP6OPT_PAD1) optlen = 1; @@ -173,7 +175,7 @@ ip6_opt_print(const u_char *bp, int len) printf("(rtalert: invalid len %d)", bp[i + 1]); goto trunc; } - printf("(rtalert: 0x%04x) ", ntohs(*(u_int16_t *)&bp[i + 2])); + printf("(rtalert: 0x%04x) ", EXTRACT_16BITS(&bp[i + 2])); break; case IP6OPT_JUMBO: if (len - i < IP6OPT_JUMBO_LEN) { @@ -184,7 +186,7 @@ ip6_opt_print(const u_char *bp, int len) printf("(jumbo: invalid len %d)", bp[i + 1]); goto trunc; } - printf("(jumbo: %u) ", (u_int32_t)ntohl(*(u_int32_t *)&bp[i + 2])); + printf("(jumbo: %u) ", EXTRACT_32BITS(&bp[i + 2])); break; case IP6OPT_HOME_ADDRESS: if (len - i < IP6OPT_HOMEADDR_MINLEN) { @@ -223,8 +225,7 @@ ip6_opt_print(const u_char *bp, int len) if ((bp[i + 2] & 0x0f) || bp[i + 3] || bp[i + 4]) printf("res"); printf(", sequence: %u", bp[i + 5]); - printf(", lifetime: %u", - (u_int32_t)ntohl(*(u_int32_t *)&bp[i + 6])); + printf(", lifetime: %u", EXTRACT_32BITS(&bp[i + 6])); if (bp[i + 1] > IP6OPT_BU_MINLEN - 2) { ip6_sopt_print(&bp[i + IP6OPT_BU_MINLEN], @@ -246,10 +247,8 @@ ip6_opt_print(const u_char *bp, int len) if (bp[i + 3]) printf("res"); printf(", sequence: %u", bp[i + 4]); - printf(", lifetime: %u", - (u_int32_t)ntohl(*(u_int32_t *)&bp[i + 5])); - printf(", refresh: %u", - (u_int32_t)ntohl(*(u_int32_t *)&bp[i + 9])); + printf(", lifetime: %u", EXTRACT_32BITS(&bp[i + 5])); + printf(", refresh: %u", EXTRACT_32BITS(&bp[i + 9])); if (bp[i + 1] > IP6OPT_BA_MINLEN - 2) { ip6_sopt_print(&bp[i + IP6OPT_BA_MINLEN], @@ -274,10 +273,11 @@ ip6_opt_print(const u_char *bp, int len) printf("(type %d: trunc)", bp[i]); goto trunc; } - printf("(opt_type 0x%02x: len=%d) ", bp[i], bp[i + 1]); + printf("(opt_type 0x%02x: len=%d)", bp[i], bp[i + 1]); break; } } + printf(" "); #if 0 end: @@ -292,11 +292,8 @@ int hbhopt_print(register const u_char *bp) { const struct ip6_hbh *dp = (struct ip6_hbh *)bp; - register const u_char *ep; int hbhlen = 0; - /* 'ep' points to the end of available data. */ - ep = snapend; TCHECK(dp->ip6h_len); hbhlen = (int)((dp->ip6h_len + 1) << 3); TCHECK2(*dp, hbhlen); @@ -308,18 +305,15 @@ hbhopt_print(register const u_char *bp) trunc: fputs("[|HBH]", stdout); - return(hbhlen); + return(-1); } int dstopt_print(register const u_char *bp) { const struct ip6_dest *dp = (struct ip6_dest *)bp; - register const u_char *ep; int dstoptlen = 0; - /* 'ep' points to the end of available data. */ - ep = snapend; TCHECK(dp->ip6d_len); dstoptlen = (int)((dp->ip6d_len + 1) << 3); TCHECK2(*dp, dstoptlen); @@ -333,6 +327,6 @@ dstopt_print(register const u_char *bp) trunc: fputs("[|DSTOPT]", stdout); - return(dstoptlen); + return(-1); } #endif /* INET6 */