xref: /minix3/external/bsd/tcpdump/dist/print-lane.c (revision b636d99d91c3d54204248f643c14627405d4afd1)
1*b636d99dSDavid van Moolenbroek /*
2*b636d99dSDavid van Moolenbroek  * Marko Kiiskila carnil@cs.tut.fi
3*b636d99dSDavid van Moolenbroek  *
4*b636d99dSDavid van Moolenbroek  * Tampere University of Technology - Telecommunications Laboratory
5*b636d99dSDavid van Moolenbroek  *
6*b636d99dSDavid van Moolenbroek  * Permission to use, copy, modify and distribute this
7*b636d99dSDavid van Moolenbroek  * software and its documentation is hereby granted,
8*b636d99dSDavid van Moolenbroek  * provided that both the copyright notice and this
9*b636d99dSDavid van Moolenbroek  * permission notice appear in all copies of the software,
10*b636d99dSDavid van Moolenbroek  * derivative works or modified versions, and any portions
11*b636d99dSDavid van Moolenbroek  * thereof, that both notices appear in supporting
12*b636d99dSDavid van Moolenbroek  * documentation, and that the use of this software is
13*b636d99dSDavid van Moolenbroek  * acknowledged in any publications resulting from using
14*b636d99dSDavid van Moolenbroek  * the software.
15*b636d99dSDavid van Moolenbroek  *
16*b636d99dSDavid van Moolenbroek  * TUT ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
17*b636d99dSDavid van Moolenbroek  * CONDITION AND DISCLAIMS ANY LIABILITY OF ANY KIND FOR
18*b636d99dSDavid van Moolenbroek  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS
19*b636d99dSDavid van Moolenbroek  * SOFTWARE.
20*b636d99dSDavid van Moolenbroek  *
21*b636d99dSDavid van Moolenbroek  */
22*b636d99dSDavid van Moolenbroek 
23*b636d99dSDavid van Moolenbroek #include <sys/cdefs.h>
24*b636d99dSDavid van Moolenbroek #ifndef lint
25*b636d99dSDavid van Moolenbroek __RCSID("$NetBSD: print-lane.c,v 1.4 2014/11/20 03:05:03 christos Exp $");
26*b636d99dSDavid van Moolenbroek #endif
27*b636d99dSDavid van Moolenbroek 
28*b636d99dSDavid van Moolenbroek #define NETDISSECT_REWORKED
29*b636d99dSDavid van Moolenbroek #ifdef HAVE_CONFIG_H
30*b636d99dSDavid van Moolenbroek #include "config.h"
31*b636d99dSDavid van Moolenbroek #endif
32*b636d99dSDavid van Moolenbroek 
33*b636d99dSDavid van Moolenbroek #include <tcpdump-stdinc.h>
34*b636d99dSDavid van Moolenbroek 
35*b636d99dSDavid van Moolenbroek #include "interface.h"
36*b636d99dSDavid van Moolenbroek #include "extract.h"
37*b636d99dSDavid van Moolenbroek #include "ether.h"
38*b636d99dSDavid van Moolenbroek 
39*b636d99dSDavid van Moolenbroek struct lecdatahdr_8023 {
40*b636d99dSDavid van Moolenbroek   uint16_t le_header;
41*b636d99dSDavid van Moolenbroek   uint8_t h_dest[ETHER_ADDR_LEN];
42*b636d99dSDavid van Moolenbroek   uint8_t h_source[ETHER_ADDR_LEN];
43*b636d99dSDavid van Moolenbroek   uint16_t h_type;
44*b636d99dSDavid van Moolenbroek };
45*b636d99dSDavid van Moolenbroek 
46*b636d99dSDavid van Moolenbroek struct lane_controlhdr {
47*b636d99dSDavid van Moolenbroek   uint16_t lec_header;
48*b636d99dSDavid van Moolenbroek   uint8_t lec_proto;
49*b636d99dSDavid van Moolenbroek   uint8_t lec_vers;
50*b636d99dSDavid van Moolenbroek   uint16_t lec_opcode;
51*b636d99dSDavid van Moolenbroek };
52*b636d99dSDavid van Moolenbroek 
53*b636d99dSDavid van Moolenbroek static const struct tok lecop2str[] = {
54*b636d99dSDavid van Moolenbroek 	{ 0x0001,	"configure request" },
55*b636d99dSDavid van Moolenbroek 	{ 0x0101,	"configure response" },
56*b636d99dSDavid van Moolenbroek 	{ 0x0002,	"join request" },
57*b636d99dSDavid van Moolenbroek 	{ 0x0102,	"join response" },
58*b636d99dSDavid van Moolenbroek 	{ 0x0003,	"ready query" },
59*b636d99dSDavid van Moolenbroek 	{ 0x0103,	"ready indication" },
60*b636d99dSDavid van Moolenbroek 	{ 0x0004,	"register request" },
61*b636d99dSDavid van Moolenbroek 	{ 0x0104,	"register response" },
62*b636d99dSDavid van Moolenbroek 	{ 0x0005,	"unregister request" },
63*b636d99dSDavid van Moolenbroek 	{ 0x0105,	"unregister response" },
64*b636d99dSDavid van Moolenbroek 	{ 0x0006,	"ARP request" },
65*b636d99dSDavid van Moolenbroek 	{ 0x0106,	"ARP response" },
66*b636d99dSDavid van Moolenbroek 	{ 0x0007,	"flush request" },
67*b636d99dSDavid van Moolenbroek 	{ 0x0107,	"flush response" },
68*b636d99dSDavid van Moolenbroek 	{ 0x0008,	"NARP request" },
69*b636d99dSDavid van Moolenbroek 	{ 0x0009,	"topology request" },
70*b636d99dSDavid van Moolenbroek 	{ 0,		NULL }
71*b636d99dSDavid van Moolenbroek };
72*b636d99dSDavid van Moolenbroek 
73*b636d99dSDavid van Moolenbroek static void
lane_hdr_print(netdissect_options * ndo,const u_char * bp)74*b636d99dSDavid van Moolenbroek lane_hdr_print(netdissect_options *ndo, const u_char *bp)
75*b636d99dSDavid van Moolenbroek {
76*b636d99dSDavid van Moolenbroek 	ND_PRINT((ndo, "lecid:%x ", EXTRACT_16BITS(bp)));
77*b636d99dSDavid van Moolenbroek }
78*b636d99dSDavid van Moolenbroek 
79*b636d99dSDavid van Moolenbroek /*
80*b636d99dSDavid van Moolenbroek  * This is the top level routine of the printer.  'p' points
81*b636d99dSDavid van Moolenbroek  * to the LANE header of the packet, 'h->ts' is the timestamp,
82*b636d99dSDavid van Moolenbroek  * 'h->len' is the length of the packet off the wire, and 'h->caplen'
83*b636d99dSDavid van Moolenbroek  * is the number of bytes actually captured.
84*b636d99dSDavid van Moolenbroek  *
85*b636d99dSDavid van Moolenbroek  * This assumes 802.3, not 802.5, LAN emulation.
86*b636d99dSDavid van Moolenbroek  */
87*b636d99dSDavid van Moolenbroek void
lane_print(netdissect_options * ndo,const u_char * p,u_int length,u_int caplen)88*b636d99dSDavid van Moolenbroek lane_print(netdissect_options *ndo, const u_char *p, u_int length, u_int caplen)
89*b636d99dSDavid van Moolenbroek {
90*b636d99dSDavid van Moolenbroek 	struct lane_controlhdr *lec;
91*b636d99dSDavid van Moolenbroek 
92*b636d99dSDavid van Moolenbroek 	if (caplen < sizeof(struct lane_controlhdr)) {
93*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, "[|lane]"));
94*b636d99dSDavid van Moolenbroek 		return;
95*b636d99dSDavid van Moolenbroek 	}
96*b636d99dSDavid van Moolenbroek 
97*b636d99dSDavid van Moolenbroek 	lec = (struct lane_controlhdr *)p;
98*b636d99dSDavid van Moolenbroek 	if (EXTRACT_16BITS(&lec->lec_header) == 0xff00) {
99*b636d99dSDavid van Moolenbroek 		/*
100*b636d99dSDavid van Moolenbroek 		 * LE Control.
101*b636d99dSDavid van Moolenbroek 		 */
102*b636d99dSDavid van Moolenbroek 		ND_PRINT((ndo, "lec: proto %x vers %x %s",
103*b636d99dSDavid van Moolenbroek 		    lec->lec_proto, lec->lec_vers,
104*b636d99dSDavid van Moolenbroek 		    tok2str(lecop2str, "opcode-#%u", EXTRACT_16BITS(&lec->lec_opcode))));
105*b636d99dSDavid van Moolenbroek 		return;
106*b636d99dSDavid van Moolenbroek 	}
107*b636d99dSDavid van Moolenbroek 
108*b636d99dSDavid van Moolenbroek 	/*
109*b636d99dSDavid van Moolenbroek 	 * Go past the LE header.
110*b636d99dSDavid van Moolenbroek 	 */
111*b636d99dSDavid van Moolenbroek 	length -= 2;
112*b636d99dSDavid van Moolenbroek 	caplen -= 2;
113*b636d99dSDavid van Moolenbroek 	p += 2;
114*b636d99dSDavid van Moolenbroek 
115*b636d99dSDavid van Moolenbroek 	/*
116*b636d99dSDavid van Moolenbroek 	 * Now print the encapsulated frame, under the assumption
117*b636d99dSDavid van Moolenbroek 	 * that it's an Ethernet frame.
118*b636d99dSDavid van Moolenbroek 	 */
119*b636d99dSDavid van Moolenbroek 	ether_print(ndo, p, length, caplen, lane_hdr_print, p - 2);
120*b636d99dSDavid van Moolenbroek }
121*b636d99dSDavid van Moolenbroek 
122*b636d99dSDavid van Moolenbroek u_int
lane_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)123*b636d99dSDavid van Moolenbroek lane_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, const u_char *p)
124*b636d99dSDavid van Moolenbroek {
125*b636d99dSDavid van Moolenbroek 	lane_print(ndo, p, h->len, h->caplen);
126*b636d99dSDavid van Moolenbroek 
127*b636d99dSDavid van Moolenbroek 	return (sizeof(struct lecdatahdr_8023));
128*b636d99dSDavid van Moolenbroek }
129