12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Marko Kiiskila carnil@cs.tut.fi
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Tampere University of Technology - Telecommunications Laboratory
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Permission to use, copy, modify and distribute this
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * software and its documentation is hereby granted,
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided that both the copyright notice and this
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * permission notice appear in all copies of the software,
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * derivative works or modified versions, and any portions
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * thereof, that both notices appear in supporting
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * documentation, and that the use of this software is
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * acknowledged in any publications resulting from using
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the software.
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * TUT ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * CONDITION AND DISCLAIMS ANY LIABILITY OF ANY KIND FOR
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * SOFTWARE.
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    "@(#) $Header: /tcpdump/master/tcpdump/print-lane.c,v 1.23.2.2 2005/11/13 12:12:59 guy Exp $ (LBL)";
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <pcap.h>
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ether.h"
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "lane.h"
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok lecop2str[] = {
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0x0001,	"configure request" },
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0x0101,	"configure response" },
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0x0002,	"join request" },
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0x0102,	"join response" },
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0x0003,	"ready query" },
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0x0103,	"ready indication" },
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0x0004,	"register request" },
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0x0104,	"register response" },
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0x0005,	"unregister request" },
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0x0105,	"unregister response" },
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0x0006,	"ARP request" },
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0x0106,	"ARP response" },
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0x0007,	"flush request" },
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0x0107,	"flush response" },
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0x0008,	"NARP request" },
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0x0009,	"topology request" },
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,		NULL }
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic inline void
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectlane_hdr_print(register const u_char *bp, int length)
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct lecdatahdr_8023 *ep;
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ep = (const struct lecdatahdr_8023 *)bp;
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (qflag)
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("lecid:%x %s %s %d: ",
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     EXTRACT_16BITS(&ep->le_header),
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     etheraddr_string(ep->h_source),
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     etheraddr_string(ep->h_dest),
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     length);
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	else
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("lecid:%x %s %s %s %d: ",
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     EXTRACT_16BITS(&ep->le_header),
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     etheraddr_string(ep->h_source),
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     etheraddr_string(ep->h_dest),
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     etherproto_string(ep->h_type),
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			     length);
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This is the top level routine of the printer.  'p' points
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * to the LANE header of the packet, 'h->ts' is the timestamp,
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 'h->len' is the length of the packet off the wire, and 'h->caplen'
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * is the number of bytes actually captured.
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This assumes 802.3, not 802.5, LAN emulation.
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectlane_print(const u_char *p, u_int length, u_int caplen)
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct lane_controlhdr *lec;
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct lecdatahdr_8023 *ep;
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_short ether_type;
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_short extracted_ethertype;
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (caplen < sizeof(struct lane_controlhdr)) {
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("[|lane]");
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lec = (struct lane_controlhdr *)p;
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (EXTRACT_16BITS(&lec->lec_header) == 0xff00) {
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * LE Control.
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("lec: proto %x vers %x %s",
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    lec->lec_proto, lec->lec_vers,
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    tok2str(lecop2str, "opcode-#%u", EXTRACT_16BITS(&lec->lec_opcode)));
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (caplen < sizeof(struct lecdatahdr_8023)) {
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("[|lane]");
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return;
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (eflag)
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		lane_hdr_print(p, length);
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Go past the LANE header.
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	length -= sizeof(struct lecdatahdr_8023);
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	caplen -= sizeof(struct lecdatahdr_8023);
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ep = (struct lecdatahdr_8023 *)p;
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p += sizeof(struct lecdatahdr_8023);
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ether_type = EXTRACT_16BITS(&ep->h_type);
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * Is it (gag) an 802.3 encapsulation?
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ether_type <= ETHERMTU) {
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* Try to print the LLC-layer header & higher layers */
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (llc_print(p, length, caplen, ep->h_source, ep->h_dest,
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		    &extracted_ethertype) == 0) {
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/* ether_type not known, print raw packet */
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!eflag)
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				lane_hdr_print((u_char *)ep, length + sizeof(*ep));
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (extracted_ethertype) {
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf("(LLC %s) ",
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			       etherproto_string(htons(extracted_ethertype)));
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (!suppress_default_print)
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				default_print(p, caplen);
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else if (ether_encap_print(ether_type, p, length, caplen,
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    &extracted_ethertype) == 0) {
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* ether_type not known, print raw packet */
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!eflag)
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			lane_hdr_print((u_char *)ep, length + sizeof(*ep));
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!suppress_default_print)
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			default_print(p, caplen);
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectlane_if_print(const struct pcap_pkthdr *h, const u_char *p)
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	lane_print(p, h->len, h->caplen);
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (sizeof(struct lecdatahdr_8023));
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
168