156893Sfenner/*
2127668Sbms * Marko Kiiskila carnil@cs.tut.fi
3127668Sbms *
456893Sfenner * Tampere University of Technology - Telecommunications Laboratory
556893Sfenner *
656893Sfenner * Permission to use, copy, modify and distribute this
756893Sfenner * software and its documentation is hereby granted,
856893Sfenner * provided that both the copyright notice and this
956893Sfenner * permission notice appear in all copies of the software,
1056893Sfenner * derivative works or modified versions, and any portions
1156893Sfenner * thereof, that both notices appear in supporting
1256893Sfenner * documentation, and that the use of this software is
1356893Sfenner * acknowledged in any publications resulting from using
1456893Sfenner * the software.
15127668Sbms *
1656893Sfenner * TUT ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
1756893Sfenner * CONDITION AND DISCLAIMS ANY LIABILITY OF ANY KIND FOR
1856893Sfenner * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS
1956893Sfenner * SOFTWARE.
20127668Sbms *
2156893Sfenner */
2256893Sfenner
2356893Sfenner#ifndef lint
24127668Sbmsstatic const char rcsid[] _U_ =
25190207Srpaulo    "@(#) $Header: /tcpdump/master/tcpdump/print-lane.c,v 1.25 2005-11-13 12:12:42 guy Exp $ (LBL)";
2656893Sfenner#endif
2756893Sfenner
2856893Sfenner#ifdef HAVE_CONFIG_H
2956893Sfenner#include "config.h"
3056893Sfenner#endif
3156893Sfenner
32127668Sbms#include <tcpdump-stdinc.h>
3356893Sfenner
3456893Sfenner#include <stdio.h>
3556893Sfenner#include <pcap.h>
3656893Sfenner
3756893Sfenner#include "interface.h"
3856893Sfenner#include "addrtoname.h"
39127668Sbms#include "extract.h"
4075115Sfenner#include "ether.h"
4156893Sfenner#include "lane.h"
4256893Sfenner
43127668Sbmsstatic const struct tok lecop2str[] = {
44127668Sbms	{ 0x0001,	"configure request" },
45127668Sbms	{ 0x0101,	"configure response" },
46127668Sbms	{ 0x0002,	"join request" },
47127668Sbms	{ 0x0102,	"join response" },
48127668Sbms	{ 0x0003,	"ready query" },
49127668Sbms	{ 0x0103,	"ready indication" },
50127668Sbms	{ 0x0004,	"register request" },
51127668Sbms	{ 0x0104,	"register response" },
52127668Sbms	{ 0x0005,	"unregister request" },
53127668Sbms	{ 0x0105,	"unregister response" },
54127668Sbms	{ 0x0006,	"ARP request" },
55127668Sbms	{ 0x0106,	"ARP response" },
56127668Sbms	{ 0x0007,	"flush request" },
57127668Sbms	{ 0x0107,	"flush response" },
58127668Sbms	{ 0x0008,	"NARP request" },
59127668Sbms	{ 0x0009,	"topology request" },
60127668Sbms	{ 0,		NULL }
61127668Sbms};
62127668Sbms
63214478Srpaulostatic void
64235530Sdelphijlane_hdr_print(netdissect_options *ndo, const u_char *bp)
6556893Sfenner{
66235530Sdelphij	(void)ND_PRINT((ndo, "lecid:%x ", EXTRACT_16BITS(bp)));
6756893Sfenner}
6856893Sfenner
6956893Sfenner/*
70127668Sbms * This is the top level routine of the printer.  'p' points
71127668Sbms * to the LANE header of the packet, 'h->ts' is the timestamp,
72146773Ssam * 'h->len' is the length of the packet off the wire, and 'h->caplen'
7356893Sfenner * is the number of bytes actually captured.
74127668Sbms *
75127668Sbms * This assumes 802.3, not 802.5, LAN emulation.
7656893Sfenner */
7756893Sfennervoid
78127668Sbmslane_print(const u_char *p, u_int length, u_int caplen)
7956893Sfenner{
80127668Sbms	struct lane_controlhdr *lec;
8156893Sfenner
82127668Sbms	if (caplen < sizeof(struct lane_controlhdr)) {
83127668Sbms		printf("[|lane]");
84127668Sbms		return;
85127668Sbms	}
8656893Sfenner
87127668Sbms	lec = (struct lane_controlhdr *)p;
88127668Sbms	if (EXTRACT_16BITS(&lec->lec_header) == 0xff00) {
89127668Sbms		/*
90127668Sbms		 * LE Control.
91127668Sbms		 */
92127668Sbms		printf("lec: proto %x vers %x %s",
93127668Sbms		    lec->lec_proto, lec->lec_vers,
94127668Sbms		    tok2str(lecop2str, "opcode-#%u", EXTRACT_16BITS(&lec->lec_opcode)));
95127668Sbms		return;
96127668Sbms	}
97127668Sbms
9856893Sfenner	/*
99214478Srpaulo	 * Go past the LE header.
10056893Sfenner	 */
101214478Srpaulo	length -= 2;
102214478Srpaulo	caplen -= 2;
103214478Srpaulo	p += 2;
10456893Sfenner
10556893Sfenner	/*
106214478Srpaulo	 * Now print the encapsulated frame, under the assumption
107214478Srpaulo	 * that it's an Ethernet frame.
10856893Sfenner	 */
109235530Sdelphij	ether_print(gndo, p, length, caplen, lane_hdr_print, p - 2);
11056893Sfenner}
111127668Sbms
112127668Sbmsu_int
113127668Sbmslane_if_print(const struct pcap_pkthdr *h, const u_char *p)
114127668Sbms{
115127668Sbms	lane_print(p, h->len, h->caplen);
116127668Sbms
117127668Sbms	return (sizeof(struct lecdatahdr_8023));
118127668Sbms}
119