summaryrefslogtreecommitdiff
path: root/print-token.c
diff options
context:
space:
mode:
authorguy <guy>2002-05-29 10:06:24 +0000
committerguy <guy>2002-05-29 10:06:24 +0000
commit06181bc3ee49e68339905317c5cf5b5e17c11259 (patch)
treeec012eb8cb9df4df06b369eb4ee9e3517e10f69b /print-token.c
parentf72fe0d0de6eb91663b005b7d061ecebb555d667 (diff)
downloadtcpdump-06181bc3ee49e68339905317c5cf5b5e17c11259.tar.gz
Only do "-x" printing in the top-level interface print routine; don't do
it in the routines, called by the top-level routines, to dissect Ethernet, FDDI, or Token Ring packets, as those routines might also be called for bridged frames over ATM, and the interface print routine for ATM will also do "-x" printing.
Diffstat (limited to 'print-token.c')
-rw-r--r--print-token.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/print-token.c b/print-token.c
index 0f4afedb..1690b3c9 100644
--- a/print-token.c
+++ b/print-token.c
@@ -25,7 +25,7 @@
*/
#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/tcpdump/print-token.c,v 1.14 2002-04-07 09:50:33 guy Exp $";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-token.c,v 1.15 2002-05-29 10:06:27 guy Exp $";
#endif
#ifdef HAVE_CONFIG_H
@@ -101,19 +101,19 @@ static const char *largest_frame[] = {
"??"
};
-void
+u_int
token_print(const u_char *p, u_int length, u_int caplen)
{
const struct token_header *trp;
u_short extracted_ethertype;
struct ether_header ehdr;
- u_int route_len = 0, seg;
+ u_int route_len = 0, hdr_len = TOKEN_HDRLEN, seg;
trp = (const struct token_header *)p;
if (caplen < TOKEN_HDRLEN) {
printf("[|token-ring]");
- goto out;
+ return hdr_len;
}
/*
* Get the TR addresses into a canonical form
@@ -162,9 +162,10 @@ token_print(const u_char *p, u_int length, u_int caplen)
}
/* Skip over token ring MAC header and routing information */
- length -= TOKEN_HDRLEN + route_len;
- p += TOKEN_HDRLEN + route_len;
- caplen -= TOKEN_HDRLEN + route_len;
+ hdr_len += route_len;
+ length -= hdr_len;
+ p += hdr_len;
+ caplen -= hdr_len;
/* Frame Control field determines interpretation of packet */
extracted_ethertype = 0;
@@ -193,10 +194,7 @@ token_print(const u_char *p, u_int length, u_int caplen)
if (!xflag && !qflag)
default_print(p, caplen);
}
- if (xflag)
- default_print(p, caplen);
-out:
- putchar('\n');
+ return (hdr_len);
}
/*
@@ -210,11 +208,21 @@ token_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
{
u_int caplen = h->caplen;
u_int length = h->len;
+ u_int hdr_len;
++infodelay;
ts_print(&h->ts);
- token_print(p, length, caplen);
+ hdr_len = token_print(p, length, caplen);
+
+ /*
+ * If "-x" was specified, print stuff past the Token Ring header,
+ * if there's anything to print.
+ */
+ if (xflag && caplen > hdr_len)
+ default_print(p + hdr_len, caplen - hdr_len);
+
+ putchar('\n');
--infodelay;
if (infoprint)