summaryrefslogtreecommitdiffstats
path: root/contrib/tcpdump/print-token.c
diff options
context:
space:
mode:
authorfenner <fenner@FreeBSD.org>2002-06-21 00:49:02 +0000
committerfenner <fenner@FreeBSD.org>2002-06-21 00:49:02 +0000
commit6d9538de202e4b8787f1b1a2ee8dce6273a43dc2 (patch)
treecf4df09e1e89ebd11358792543230083e577ad0f /contrib/tcpdump/print-token.c
parentd832be42ce7cc0a492cddc15e8429bc29fb46462 (diff)
downloadFreeBSD-src-6d9538de202e4b8787f1b1a2ee8dce6273a43dc2.zip
FreeBSD-src-6d9538de202e4b8787f1b1a2ee8dce6273a43dc2.tar.gz
Merge tcpdump 3.7.1
MFC after: 2 weeks
Diffstat (limited to 'contrib/tcpdump/print-token.c')
-rw-r--r--contrib/tcpdump/print-token.c241
1 files changed, 134 insertions, 107 deletions
diff --git a/contrib/tcpdump/print-token.c b/contrib/tcpdump/print-token.c
index 158d86a..748c4b6 100644
--- a/contrib/tcpdump/print-token.c
+++ b/contrib/tcpdump/print-token.c
@@ -20,85 +20,92 @@
*
* 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>
+ *
* $FreeBSD$
*/
#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /home/ncvs/src/contrib/tcpdump/print-token.c,v 1.1 1999/02/20 11:17:55 julian Exp $";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-token.c,v 1.13 2001/09/18 15:46:37 fenner 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, (const char *)trp->token_dhost, 6);
+ memcpy(fsrc, (const 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) {
- tp->ether_shost[0] = tp->ether_shost[0] & 0x7f;
- 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);
+ const 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 const char *broadcast_indicator[] = {
+ "Non-Broadcast", "Non-Broadcast",
+ "Non-Broadcast", "Non-Broadcast",
+ "All-routes", "All-routes",
+ "Single-route", "Single-route"
+};
+
+static const char *direction[] = {
+ "Forward", "Backward"
+};
+
+static const 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.
*/
@@ -107,83 +114,103 @@ 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;
+ const struct token_header *trp;
u_short extracted_ethertype;
- u_int route_len = 0, seg;
- struct llc *lp;
+ struct ether_header ehdr;
+ u_int route_len = 0, seg;
- tp = (struct token_header *)p;
+ trp = (const struct token_header *)p;
+ ++infodelay;
ts_print(&h->ts);
- if (caplen < TOKEN_HDR_LEN) {
+ if (caplen < TOKEN_HDRLEN) {
printf("[|token-ring]");
goto out;
}
-
+ /*
+ * 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) {
-
- if (eflag)
- token_print(p, length);
-
- route_len = RIF_LENGTH;
- if (vflag) {
- if (vflag > 1)
- printf("ac %x fc %x ", tp->ac, tp->fc);
- ether_type = ntohs((int)lp->ethertype);
-
- printf("%s ", broadcast_indicator[BROADCAST]);
- printf("%s", direction[DIRECTION]);
+ 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; seg++)
- printf(" [%d:%d]", RING_NUMBER(seg), BRIDGE_NUMBER(seg));
- } else {
- printf("rt = %x", ntohs(tp->rcf));
+ 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; seg++)
- printf(":%x", ntohs(tp->rseg[seg]));
- }
- printf(" (%s) ", largest_frame[LARGEST_FRAME]);
- } else {
- if (eflag)
- token_print(p, length);
- }
-
- /* Set pointer to llc header, adjusted for routing information */
- lp = (struct llc *)(p + TOKEN_HDR_LEN + route_len);
-
- packetp = p;
- snapend = p + caplen;
+ 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;
+ /* 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), &extracted_ethertype) == 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');
+ --infodelay;
+ if (infoprint)
+ info(0);
}
OpenPOWER on IntegriCloud