diff options
Diffstat (limited to 'contrib/tcpdump/print-ip6.c')
-rw-r--r-- | contrib/tcpdump/print-ip6.c | 90 |
1 files changed, 46 insertions, 44 deletions
diff --git a/contrib/tcpdump/print-ip6.c b/contrib/tcpdump/print-ip6.c index f4bd603..58a0f26 100644 --- a/contrib/tcpdump/print-ip6.c +++ b/contrib/tcpdump/print-ip6.c @@ -17,11 +17,13 @@ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * $FreeBSD$ */ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/tcpdump/print-ip6.c,v 1.47 2005/04/06 21:32:40 mcr Exp $"; + "@(#) $Header: /tcpdump/master/tcpdump/print-ip6.c,v 1.32.2.8 2003/11/24 20:31:22 guy Exp $"; #endif #ifdef HAVE_CONFIG_H @@ -63,43 +65,16 @@ ip6_print(register const u_char *bp, register u_int length) TCHECK(*ip6); if (length < sizeof (struct ip6_hdr)) { - (void)printf("truncated-ip6 %u", length); + (void)printf("truncated-ip6 %d", length); return; } - if (!eflag) - printf("IP6 "); - payload_len = EXTRACT_16BITS(&ip6->ip6_plen); len = payload_len + sizeof(struct ip6_hdr); if (length < len) - (void)printf("truncated-ip6 - %u bytes missing!", + (void)printf("truncated-ip6 - %d bytes missing!", len - length); - if (vflag) { - flow = EXTRACT_32BITS(&ip6->ip6_flow); - printf("("); -#if 0 - /* rfc1883 */ - if (flow & 0x0f000000) - (void)printf("pri 0x%02x, ", (flow & 0x0f000000) >> 24); - if (flow & 0x00ffffff) - (void)printf("flowlabel 0x%06x, ", flow & 0x00ffffff); -#else - /* RFC 2460 */ - if (flow & 0x0ff00000) - (void)printf("class 0x%02x, ", (flow & 0x0ff00000) >> 20); - if (flow & 0x000fffff) - (void)printf("flowlabel 0x%05x, ", flow & 0x000fffff); -#endif - - (void)printf("hlim %u, next-header: %s (%u), length: %u) ", - ip6->ip6_hlim, - tok2str(ipproto_values,"unknown",ip6->ip6_nxt), - ip6->ip6_nxt, - payload_len); - } - /* * Cut off the snapshot length to the end of the IP payload. */ @@ -133,7 +108,7 @@ ip6_print(register const u_char *bp, register u_int length) case IPPROTO_FRAGMENT: advance = frag6_print(cp, (const u_char *)ip6); if (snapend <= cp + advance) - return; + goto end; nh = *cp; fragmented = 1; break; @@ -152,23 +127,23 @@ ip6_print(register const u_char *bp, register u_int length) */ advance = mobility_print(cp, (const u_char *)ip6); nh = *cp; - return; + goto end; case IPPROTO_ROUTING: advance = rt6_print(cp, (const u_char *)ip6); nh = *cp; break; case IPPROTO_SCTP: sctp_print(cp, (const u_char *)ip6, len); - return; + goto end; case IPPROTO_TCP: tcp_print(cp, len, (const u_char *)ip6, fragmented); - return; + goto end; case IPPROTO_UDP: udp_print(cp, len, (const u_char *)ip6, fragmented); - return; + goto end; case IPPROTO_ICMPV6: icmp6_print(cp, len, (const u_char *)ip6, fragmented); - return; + goto end; case IPPROTO_AH: advance = ah_print(cp); nh = *cp; @@ -176,7 +151,7 @@ ip6_print(register const u_char *bp, register u_int length) case IPPROTO_ESP: { int enh, padlen; - advance = esp_print(gndo, cp, len, (const u_char *)ip6, &enh, &padlen); + advance = esp_print(cp, (const u_char *)ip6, &enh, &padlen); nh = enh & 0xff; len -= padlen; break; @@ -191,29 +166,56 @@ ip6_print(register const u_char *bp, register u_int length) case IPPROTO_PIM: pim_print(cp, len); - return; + goto end; case IPPROTO_OSPF: ospf6_print(cp, len); - return; + goto end; case IPPROTO_IPV6: ip6_print(cp, len); - return; + goto end; case IPPROTO_IPV4: - ip_print(gndo, cp, len); - return; + ip_print(cp, len); + goto end; case IPPROTO_NONE: (void)printf("no next header"); - return; + goto end; default: (void)printf("ip-proto-%d %d", ip6->ip6_nxt, len); - return; + goto end; } } + end: + + flow = EXTRACT_32BITS(&ip6->ip6_flow); +#if 0 + /* rfc1883 */ + if (flow & 0x0f000000) + (void)printf(" [pri 0x%x]", (flow & 0x0f000000) >> 24); + if (flow & 0x00ffffff) + (void)printf(" [flowlabel 0x%x]", flow & 0x00ffffff); +#else + /* RFC 2460 */ + if (flow & 0x0ff00000) + (void)printf(" [class 0x%x]", (flow & 0x0ff00000) >> 20); + if (flow & 0x000fffff) + (void)printf(" [flowlabel 0x%x]", flow & 0x000fffff); +#endif + + if (ip6->ip6_hlim <= 1) + (void)printf(" [hlim %u]", ip6->ip6_hlim); + + if (vflag) { + printf(" ("); + (void)printf("len %u", payload_len); + if (ip6->ip6_hlim > 1) + (void)printf(", hlim %d", (int)ip6->ip6_hlim); + printf(")"); + } return; trunc: (void)printf("[|ip6]"); |