diff options
Diffstat (limited to 'contrib/tcpdump/print-token.c')
-rw-r--r-- | contrib/tcpdump/print-token.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/contrib/tcpdump/print-token.c b/contrib/tcpdump/print-token.c index 8fe96c6..0f99354 100644 --- a/contrib/tcpdump/print-token.c +++ b/contrib/tcpdump/print-token.c @@ -41,6 +41,7 @@ static const char rcsid[] _U_ = #include <string.h> #include "interface.h" +#include "extract.h" #include "addrtoname.h" #include "ethertype.h" @@ -128,7 +129,16 @@ token_print(const u_char *p, u_int length, u_int caplen) if (eflag) token_hdr_print(trp, length, ESRC(&ehdr), EDST(&ehdr)); + if (caplen < TOKEN_HDRLEN + 2) { + printf("[|token-ring]"); + return hdr_len; + } route_len = RIF_LENGTH(trp); + hdr_len += route_len; + if (caplen < hdr_len) { + printf("[|token-ring]"); + return hdr_len; + } if (vflag) { printf("%s ", broadcast_indicator[BROADCAST(trp)]); printf("%s", direction[DIRECTION(trp)]); @@ -137,10 +147,10 @@ token_print(const u_char *p, u_int length, u_int caplen) printf(" [%d:%d]", RING_NUMBER(trp, seg), BRIDGE_NUMBER(trp, seg)); } else { - printf("rt = %x", ntohs(trp->token_rcf)); + printf("rt = %x", EXTRACT_16BITS(&trp->token_rcf)); for (seg = 0; seg < SEGMENT_COUNT(trp); seg++) - printf(":%x", ntohs(trp->token_rseg[seg])); + printf(":%x", EXTRACT_16BITS(&trp->token_rseg[seg])); } printf(" (%s) ", largest_frame[LARGEST_FRAME(trp)]); } else { @@ -149,7 +159,6 @@ token_print(const u_char *p, u_int length, u_int caplen) } /* Skip over token ring MAC header and routing information */ - hdr_len += route_len; length -= hdr_len; p += hdr_len; caplen -= hdr_len; |