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.c219
1 files changed, 132 insertions, 87 deletions
diff --git a/contrib/tcpdump/print-token.c b/contrib/tcpdump/print-token.c
index e1dff5b..aff3607 100644
--- a/contrib/tcpdump/print-token.c
+++ b/contrib/tcpdump/print-token.c
@@ -19,81 +19,91 @@
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* Hacked version of print-ether.c Larry Lile <lile@stdio.com>
+ *
+ * Further tweaked to more closely resemble print-fddi.c
+ * Guy Harris <guy@alum.mit.edu>
*/
#ifndef lint
static const char rcsid[] =
- "@(#) $Header$";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-token.c,v 1.11 2000/12/23 20:48:13 guy Exp $";
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
#endif
#include <sys/param.h>
#include <sys/time.h>
#include <sys/socket.h>
-#if __STDC__
-struct mbuf;
-struct rtentry;
-#endif
-#include <net/if.h>
-
-#include "token.h"
-
#include <netinet/in.h>
-#include <net/ethernet.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#include <netinet/ip_var.h>
-#include <netinet/udp.h>
-#include <netinet/udp_var.h>
-#include <netinet/tcp.h>
-#include <netinet/tcpip.h>
-#include <stdio.h>
#include <pcap.h>
+#include <stdio.h>
+#include <string.h>
#include "interface.h"
#include "addrtoname.h"
#include "ethertype.h"
-#include "llc.h"
-const u_char *packetp;
-const u_char *snapend;
+#include "ether.h"
+#include "token.h"
+
+/* Extract src, dst addresses */
+static inline void
+extract_token_addrs(const struct token_header *trp, char *fsrc, char *fdst)
+{
+ memcpy(fdst, (char *)trp->token_dhost, 6);
+ memcpy(fsrc, (char *)trp->token_shost, 6);
+}
+/*
+ * Print the TR MAC header
+ */
static inline void
-token_print(register const u_char *bp, u_int length)
+token_print(register const struct token_header *trp, register u_int length,
+ register const u_char *fsrc, register const u_char *fdst)
{
- register const struct token_header *tp;
- register const struct llc *lp;
- u_short ether_type;
-
- tp = (const struct token_header *)bp;
- lp = (struct llc *)(bp + TOKEN_HDR_LEN);
- if (IS_SOURCE_ROUTED)
- lp = (struct llc *)(bp + TOKEN_HDR_LEN + RIF_LENGTH);
-
- /*
- * Ethertype on ethernet is a short, but ethertype in an llc-snap has
- * been defined as 2 u_chars. This is a stupid little hack to fix
- * this for now but something better should be done using ntohs()
- * XXX
- */
- ether_type = ((u_short)lp->ethertype[1] << 16) | lp->ethertype[0];
-
- if (qflag)
- (void)printf("%s %s %d: ",
- etheraddr_string(ESRC(tp)),
- etheraddr_string(EDST(tp)),
- length);
+ char *srcname, *dstname;
+
+ srcname = etheraddr_string(fsrc);
+ dstname = etheraddr_string(fdst);
+
+ if (vflag)
+ (void) printf("%02x %02x %s %s %d: ",
+ trp->token_ac,
+ trp->token_fc,
+ srcname, dstname,
+ length);
else
- (void)printf("%s %s %s %d: ",
- etheraddr_string(ESRC(tp)),
- etheraddr_string(EDST(tp)),
- etherproto_string(ether_type),
- length);
+ printf("%s %s %d: ", srcname, dstname, length);
}
+static char *broadcast_indicator[] = {
+ "Non-Broadcast", "Non-Broadcast",
+ "Non-Broadcast", "Non-Broadcast",
+ "All-routes", "All-routes",
+ "Single-route", "Single-route"
+};
+
+static char *direction[] = {
+ "Forward", "Backward"
+};
+
+static char *largest_frame[] = {
+ "516",
+ "1500",
+ "2052",
+ "4472",
+ "8144",
+ "11407",
+ "17800",
+ "??"
+};
+
/*
* This is the top level routine of the printer. 'p' is the points
- * to the ether header of the packet, 'tvp' is the timestamp,
+ * to the TR header of the packet, 'tvp' is the timestamp,
* 'length' is the length of the packet off the wire, and 'caplen'
* is the number of bytes actually captured.
*/
@@ -102,64 +112,99 @@ 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;
- struct token_header *tp;
- u_short ether_type;
- extern u_short extracted_ethertype;
- u_int route_len = 0;
- struct llc *lp;
+ struct token_header *trp;
+ u_short extracted_ethertype;
+ struct ether_header ehdr;
+ u_int route_len = 0, seg;
- tp = (struct token_header *)p;
+ trp = (struct token_header *)p;
ts_print(&h->ts);
- if (caplen < TOKEN_HDR_LEN) {
+ if (caplen < TOKEN_HDRLEN) {
printf("[|token-ring]");
goto out;
}
-
- if (eflag)
- token_print(p, length);
-
+ /*
+ * Get the TR addresses into a canonical form
+ */
+ extract_token_addrs(trp, (char*)ESRC(&ehdr), (char*)EDST(&ehdr));
/*
* Some printers want to get back at the ethernet addresses,
* and/or check that they're not walking off the end of the packet.
* Rather than pass them all the way down, we set these globals.
*/
- tp = (struct token_header *)p;
-
- /* Adjust for source routing information in the MAC header */
- if (IS_SOURCE_ROUTED) {
- route_len = RIF_LENGTH;
- }
-
- /* Set pointer to llc header, adjusted for routing information */
- lp = (struct llc *)(p + TOKEN_HDR_LEN + route_len);
-
- packetp = p;
snapend = p + caplen;
+ /*
+ * Actually, the only printers that use packetp are print-arp.c
+ * and print-bootp.c, and they assume that packetp points to an
+ * Ethernet header. The right thing to do is to fix them to know
+ * which link type is in use when they excavate. XXX
+ */
+ packetp = (u_char *)&ehdr;
+
+ /* Adjust for source routing information in the MAC header */
+ if (IS_SOURCE_ROUTED(trp)) {
+ /* Clear source-routed bit */
+ *ESRC(&ehdr) &= 0x7f;
+
+ if (eflag)
+ token_print(trp, length, ESRC(&ehdr), EDST(&ehdr));
+
+ route_len = RIF_LENGTH(trp);
+ if (vflag) {
+ printf("%s ", broadcast_indicator[BROADCAST(trp)]);
+ printf("%s", direction[DIRECTION(trp)]);
+
+ for (seg = 0; seg < SEGMENT_COUNT(trp); seg++)
+ printf(" [%d:%d]", RING_NUMBER(trp, seg),
+ BRIDGE_NUMBER(trp, seg));
+ } else {
+ printf("rt = %x", ntohs(trp->token_rcf));
+
+ for (seg = 0; seg < SEGMENT_COUNT(trp); seg++)
+ printf(":%x", ntohs(trp->token_rseg[seg]));
+ }
+ printf(" (%s) ", largest_frame[LARGEST_FRAME(trp)]);
+ } else {
+ if (eflag)
+ token_print(trp, length, ESRC(&ehdr), EDST(&ehdr));
+ }
- /* Skip over token ring MAC header */
- length -= TOKEN_HDR_LEN + route_len;
- caplen -= TOKEN_HDR_LEN + route_len;
- p += TOKEN_HDR_LEN + route_len;
-
- ether_type = ntohs((int)lp->ethertype);
+ /* Skip over token ring MAC header and routing information */
+ length -= TOKEN_HDRLEN + route_len;
+ p += TOKEN_HDRLEN + route_len;
+ caplen -= TOKEN_HDRLEN + route_len;
+ /* Frame Control field determines interpretation of packet */
extracted_ethertype = 0;
- /* Try to print the LLC-layer header & higher layers */
- if (llc_print(p, length, caplen, ESRC(tp), EDST(tp)) == 0) {
- /* ether_type not known, print raw packet */
- if (!eflag)
- token_print((u_char *)tp, length);
- if (extracted_ethertype) {
- printf("(LLC %s) ",
- etherproto_string(htons(extracted_ethertype)));
+ if (FRAME_TYPE(trp) == TOKEN_FC_LLC) {
+ /* Try to print the LLC-layer header & higher layers */
+ if (llc_print(p, length, caplen, ESRC(&ehdr), EDST(&ehdr),
+ &extracted_ethertype) == 0) {
+ /* ether_type not known, print raw packet */
+ if (!eflag)
+ token_print(trp,
+ length + TOKEN_HDRLEN + route_len,
+ ESRC(&ehdr), EDST(&ehdr));
+ if (extracted_ethertype) {
+ printf("(LLC %s) ",
+ etherproto_string(htons(extracted_ethertype)));
+ }
+ if (!xflag && !qflag)
+ default_print(p, caplen);
}
+ } else {
+ /* Some kinds of TR packet we cannot handle intelligently */
+ /* XXX - dissect MAC packets if frame type is 0 */
+ if (!eflag)
+ token_print(trp, length + TOKEN_HDRLEN + route_len,
+ ESRC(&ehdr), EDST(&ehdr));
if (!xflag && !qflag)
default_print(p, caplen);
}
if (xflag)
default_print(p, caplen);
- out:
+out:
putchar('\n');
}
OpenPOWER on IntegriCloud