print-token.c revision 2949f58a438f6fd85f66a8b7ed4708042cde4b37
12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2)
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement:
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California,
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission.
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Hacked version of print-ether.c  Larry Lile <lile@stdio.com>
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Further tweaked to more closely resemble print-fddi.c
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	Guy Harris <guy@alum.mit.edu>
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    "@(#) $Header: /tcpdump/master/tcpdump/print-token.c,v 1.25.2.2 2005/11/13 12:13:01 guy Exp $";
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <pcap.h>
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ethertype.h"
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ether.h"
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "token.h"
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Extract src, dst addresses */
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic inline void
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectextract_token_addrs(const struct token_header *trp, char *fsrc, char *fdst)
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	memcpy(fdst, (const char *)trp->token_dhost, 6);
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	memcpy(fsrc, (const char *)trp->token_shost, 6);
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print the TR MAC header
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic inline void
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttoken_hdr_print(register const struct token_header *trp, register u_int length,
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	   register const u_char *fsrc, register const u_char *fdst)
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const char *srcname, *dstname;
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	srcname = etheraddr_string(fsrc);
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dstname = etheraddr_string(fdst);
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (vflag)
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void) printf("%02x %02x %s %s %d: ",
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       trp->token_ac,
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       trp->token_fc,
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       srcname, dstname,
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       length);
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("%s %s %d: ", srcname, dstname, length);
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *broadcast_indicator[] = {
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"Non-Broadcast", "Non-Broadcast",
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"Non-Broadcast", "Non-Broadcast",
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"All-routes",    "All-routes",
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"Single-route",  "Single-route"
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *direction[] = {
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"Forward", "Backward"
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char *largest_frame[] = {
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"516",
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"1500",
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"2052",
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"4472",
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"8144",
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"11407",
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"17800",
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	"??"
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttoken_print(const u_char *p, u_int length, u_int caplen)
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct token_header *trp;
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_short extracted_ethertype;
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct ether_header ehdr;
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int route_len = 0, hdr_len = TOKEN_HDRLEN;
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int seg;
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	trp = (const struct token_header *)p;
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (caplen < TOKEN_HDRLEN) {
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("[|token-ring]");
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return hdr_len;
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Get the TR addresses into a canonical form
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	extract_token_addrs(trp, (char*)ESRC(&ehdr), (char*)EDST(&ehdr));
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Adjust for source routing information in the MAC header */
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (IS_SOURCE_ROUTED(trp)) {
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Clear source-routed bit */
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		*ESRC(&ehdr) &= 0x7f;
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (eflag)
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			token_hdr_print(trp, length, ESRC(&ehdr), EDST(&ehdr));
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		route_len = RIF_LENGTH(trp);
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (vflag) {
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%s ", broadcast_indicator[BROADCAST(trp)]);
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("%s", direction[DIRECTION(trp)]);
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (seg = 0; seg < SEGMENT_COUNT(trp); seg++)
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(" [%d:%d]", RING_NUMBER(trp, seg),
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    BRIDGE_NUMBER(trp, seg));
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf("rt = %x", ntohs(trp->token_rcf));
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			for (seg = 0; seg < SEGMENT_COUNT(trp); seg++)
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(":%x", ntohs(trp->token_rseg[seg]));
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf(" (%s) ", largest_frame[LARGEST_FRAME(trp)]);
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (eflag)
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			token_hdr_print(trp, length, ESRC(&ehdr), EDST(&ehdr));
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Skip over token ring MAC header and routing information */
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	hdr_len += route_len;
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	length -= hdr_len;
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p += hdr_len;
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	caplen -= hdr_len;
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/* Frame Control field determines interpretation of packet */
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (FRAME_TYPE(trp) == TOKEN_FC_LLC) {
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Try to print the LLC-layer header & higher layers */
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (llc_print(p, length, caplen, ESRC(&ehdr), EDST(&ehdr),
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    &extracted_ethertype) == 0) {
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* ether_type not known, print raw packet */
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!eflag)
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				token_hdr_print(trp,
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    length + TOKEN_HDRLEN + route_len,
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				    ESRC(&ehdr), EDST(&ehdr));
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (extracted_ethertype) {
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("(LLC %s) ",
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			etherproto_string(htons(extracted_ethertype)));
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!suppress_default_print)
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				default_print(p, caplen);
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Some kinds of TR packet we cannot handle intelligently */
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* XXX - dissect MAC packets if frame type is 0 */
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!eflag)
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			token_hdr_print(trp, length + TOKEN_HDRLEN + route_len,
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			    ESRC(&ehdr), EDST(&ehdr));
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!suppress_default_print)
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			default_print(p, caplen);
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (hdr_len);
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This is the top level routine of the printer.  'p' points
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * to the TR header of the packet, 'h->ts' is the timestamp,
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 'h->len' is the length of the packet off the wire, and 'h->caplen'
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * is the number of bytes actually captured.
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttoken_if_print(const struct pcap_pkthdr *h, const u_char *p)
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (token_print(p, h->len, h->caplen));
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
195