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