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.c241
1 files changed, 108 insertions, 133 deletions
diff --git a/contrib/tcpdump/print-token.c b/contrib/tcpdump/print-token.c
index d2de92d..158d86a 100644
--- a/contrib/tcpdump/print-token.c
+++ b/contrib/tcpdump/print-token.c
@@ -20,90 +20,85 @@
*
* 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: /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"
+ "@(#) $Header: /home/ncvs/src/contrib/tcpdump/print-token.c,v 1.1 1999/02/20 11:17:55 julian Exp $";
#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 <pcap.h>
#include <stdio.h>
-#include <string.h>
+#include <pcap.h>
#include "interface.h"
#include "addrtoname.h"
#include "ethertype.h"
+#include "llc.h"
-#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);
-}
+const u_char *packetp;
+const u_char *snapend;
-/*
- * Print the TR MAC header
- */
static inline void
-token_print(register const struct token_header *trp, register u_int length,
- register const u_char *fsrc, register const u_char *fdst)
+token_print(register const u_char *bp, u_int 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);
+ 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);
else
- printf("%s %s %d: ", srcname, dstname, length);
+ (void)printf("%s %s %s %d: ",
+ etheraddr_string(ESRC(tp)),
+ etheraddr_string(EDST(tp)),
+ etherproto_string(ether_type),
+ 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 TR header of the packet, 'tvp' is the timestamp,
+ * to the ether 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.
*/
@@ -112,103 +107,83 @@ 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;
- const struct token_header *trp;
+ struct token_header *tp;
+ u_short ether_type;
u_short extracted_ethertype;
- struct ether_header ehdr;
- u_int route_len = 0, seg;
+ u_int route_len = 0, seg;
+ struct llc *lp;
- trp = (const struct token_header *)p;
+ tp = (struct token_header *)p;
- ++infodelay;
ts_print(&h->ts);
- if (caplen < TOKEN_HDRLEN) {
+ if (caplen < TOKEN_HDR_LEN) {
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.
*/
- 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)]);
+ 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]);
- 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(" [%d:%d]", RING_NUMBER(seg), BRIDGE_NUMBER(seg));
+ } else {
+ printf("rt = %x", ntohs(tp->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));
- }
+ 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;
- /* Skip over token ring MAC header and routing information */
- length -= TOKEN_HDRLEN + route_len;
- p += TOKEN_HDRLEN + route_len;
- caplen -= TOKEN_HDRLEN + route_len;
+ /* Skip over token ring MAC header */
+ length -= TOKEN_HDR_LEN + route_len;
+ caplen -= TOKEN_HDR_LEN + route_len;
+ p += TOKEN_HDR_LEN + route_len;
- /* Frame Control field determines interpretation of packet */
extracted_ethertype = 0;
- 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 */
+ /* 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(trp, length + TOKEN_HDRLEN + route_len,
- ESRC(&ehdr), EDST(&ehdr));
+ token_print((u_char *)tp, length);
+ if (extracted_ethertype) {
+ printf("(LLC %s) ",
+ etherproto_string(htons(extracted_ethertype)));
+ }
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