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.
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
- * @(#) $Header: /tcpdump/master/tcpdump/interface.h,v 1.182 2002-04-25 04:31:42 guy Exp $ (LBL)
+ * @(#) $Header: /tcpdump/master/tcpdump/interface.h,v 1.183 2002-05-29 10:06:24 guy Exp $ (LBL)
*/
#ifndef tcpdump_interface_h
*/
#ifndef tcpdump_interface_h
extern void ether_print(const u_char *, u_int, u_int);
extern void ether_if_print(u_char *, const struct pcap_pkthdr *,
const u_char *);
extern void ether_print(const u_char *, u_int, u_int);
extern void ether_if_print(u_char *, const struct pcap_pkthdr *,
const u_char *);
-extern void token_print(const u_char *, u_int, u_int);
+extern u_int token_print(const u_char *, u_int, u_int);
extern void token_if_print(u_char *, const struct pcap_pkthdr *,
const u_char *);
extern void fddi_print(const u_char *, u_int, u_int);
extern void token_if_print(u_char *, const struct pcap_pkthdr *,
const u_char *);
extern void fddi_print(const u_char *, u_int, u_int);
*/
#ifndef lint
static const char rcsid[] =
*/
#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/tcpdump/print-ether.c,v 1.67 2002-04-07 09:50:31 guy Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-ether.c,v 1.68 2002-05-29 10:06:26 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
#endif
#ifdef HAVE_CONFIG_H
if (caplen < ETHER_HDRLEN) {
printf("[|ether]");
if (caplen < ETHER_HDRLEN) {
printf("[|ether]");
if (!xflag && !qflag)
default_print(p, caplen);
}
if (!xflag && !qflag)
default_print(p, caplen);
}
- if (xflag)
- default_print(p, caplen);
- out:
- putchar('\n');
ether_print(p, length, caplen);
ether_print(p, length, caplen);
+ /*
+ * If "-x" was specified, print stuff past the Ethernet header,
+ * if there's anything to print.
+ */
+ if (xflag && caplen > ETHER_HDRLEN)
+ default_print(p + ETHER_HDRLEN, caplen - ETHER_HDRLEN);
+
+ putchar('\n');
+
--infodelay;
if (infoprint)
info(0);
--infodelay;
if (infoprint)
info(0);
#ifndef lint
static const char rcsid[] =
#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/tcpdump/print-fddi.c,v 1.54 2002-04-07 09:50:32 guy Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-fddi.c,v 1.55 2002-05-29 10:06:27 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
#endif
#ifdef HAVE_CONFIG_H
if (caplen < FDDI_HDRLEN) {
printf("[|fddi]");
if (caplen < FDDI_HDRLEN) {
printf("[|fddi]");
}
/*
* Get the FDDI addresses into a canonical form
}
/*
* Get the FDDI addresses into a canonical form
if (!xflag && !qflag)
default_print(p, caplen);
}
if (!xflag && !qflag)
default_print(p, caplen);
}
- if (xflag)
- default_print(p, caplen);
-out:
- putchar('\n');
fddi_print(p, length, caplen);
fddi_print(p, length, caplen);
+ /*
+ * If "-x" was specified, print stuff past the FDDI header,
+ * if there's anything to print.
+ */
+ if (xflag && caplen > FDDI_HDRLEN)
+ default_print(p + FDDI_HDRLEN, caplen - FDDI_HDRLEN);
+
+ putchar('\n');
+
--infodelay;
if (infoprint)
info(0);
--infodelay;
if (infoprint)
info(0);
*/
#ifndef lint
static const char rcsid[] =
*/
#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
#endif
#ifdef HAVE_CONFIG_H
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;
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]");
trp = (const struct token_header *)p;
if (caplen < TOKEN_HDRLEN) {
printf("[|token-ring]");
}
/*
* Get the TR addresses into a canonical form
}
/*
* Get the TR addresses into a canonical form
}
/* Skip over token ring MAC header and routing information */
}
/* 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;
/* Frame Control field determines interpretation of packet */
extracted_ethertype = 0;
if (!xflag && !qflag)
default_print(p, caplen);
}
if (!xflag && !qflag)
default_print(p, caplen);
}
- if (xflag)
- default_print(p, caplen);
-out:
- putchar('\n');
{
u_int caplen = h->caplen;
u_int length = h->len;
{
u_int caplen = h->caplen;
u_int length = h->len;
++infodelay;
ts_print(&h->ts);
++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)
--infodelay;
if (infoprint)