summaryrefslogtreecommitdiffstats
path: root/contrib/tcpdump/print-token.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tcpdump/print-token.c')
-rw-r--r--contrib/tcpdump/print-token.c15
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;
OpenPOWER on IntegriCloud