xref: /freebsd/contrib/tcpdump/print-bcm-li.c (revision 0a7e5f1f02aad2ff5fff1c60f44c6975fd07e1d9)
1*ee67461eSJoseph Mingrone /*
2*ee67461eSJoseph Mingrone  * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996, 1997
3*ee67461eSJoseph Mingrone  *	The Regents of the University of California.  All rights reserved.
4*ee67461eSJoseph Mingrone  *
5*ee67461eSJoseph Mingrone  * Redistribution and use in source and binary forms, with or without
6*ee67461eSJoseph Mingrone  * modification, are permitted provided that: (1) source code distributions
7*ee67461eSJoseph Mingrone  * retain the above copyright notice and this paragraph in its entirety, (2)
8*ee67461eSJoseph Mingrone  * distributions including binary code include the above copyright notice and
9*ee67461eSJoseph Mingrone  * this paragraph in its entirety in the documentation or other materials
10*ee67461eSJoseph Mingrone  * provided with the distribution, and (3) all advertising materials mentioning
11*ee67461eSJoseph Mingrone  * features or use of this software display the following acknowledgement:
12*ee67461eSJoseph Mingrone  * ``This product includes software developed by the University of California,
13*ee67461eSJoseph Mingrone  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14*ee67461eSJoseph Mingrone  * the University nor the names of its contributors may be used to endorse
15*ee67461eSJoseph Mingrone  * or promote products derived from this software without specific prior
16*ee67461eSJoseph Mingrone  * written permission.
17*ee67461eSJoseph Mingrone  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18*ee67461eSJoseph Mingrone  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19*ee67461eSJoseph Mingrone  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20*ee67461eSJoseph Mingrone  */
21*ee67461eSJoseph Mingrone 
22*ee67461eSJoseph Mingrone /* \summary: Broadcom LI Printer */
23*ee67461eSJoseph Mingrone 
24*ee67461eSJoseph Mingrone #include <config.h>
25*ee67461eSJoseph Mingrone 
26*ee67461eSJoseph Mingrone #include "netdissect-stdinc.h"
27*ee67461eSJoseph Mingrone 
28*ee67461eSJoseph Mingrone #define ND_LONGJMP_FROM_TCHECK
29*ee67461eSJoseph Mingrone #include "netdissect.h"
30*ee67461eSJoseph Mingrone #include "addrtoname.h"
31*ee67461eSJoseph Mingrone #include "extract.h"
32*ee67461eSJoseph Mingrone 
33*ee67461eSJoseph Mingrone #define BCM_LI_SHIM_LEN	4
34*ee67461eSJoseph Mingrone 
35*ee67461eSJoseph Mingrone static const struct tok bcm_li_direction_values[] = {
36*ee67461eSJoseph Mingrone     { 1, "unused" },
37*ee67461eSJoseph Mingrone     { 2, "egress" },
38*ee67461eSJoseph Mingrone     { 3, "ingress" },
39*ee67461eSJoseph Mingrone     { 0, NULL}
40*ee67461eSJoseph Mingrone };
41*ee67461eSJoseph Mingrone 
42*ee67461eSJoseph Mingrone #define BCM_LI_PKT_TYPE_UNDECIDED 4
43*ee67461eSJoseph Mingrone #define BCM_LI_PKT_TYPE_IPV4      5
44*ee67461eSJoseph Mingrone #define BCM_LI_PKT_TYPE_IPV6      6
45*ee67461eSJoseph Mingrone #define BCM_LI_PKT_TYPE_ETHERNET  7
46*ee67461eSJoseph Mingrone 
47*ee67461eSJoseph Mingrone static const struct tok bcm_li_pkt_type_values[] = {
48*ee67461eSJoseph Mingrone     { BCM_LI_PKT_TYPE_UNDECIDED, "undecided" },
49*ee67461eSJoseph Mingrone     { BCM_LI_PKT_TYPE_IPV4, "ipv4" },
50*ee67461eSJoseph Mingrone     { BCM_LI_PKT_TYPE_IPV6, "ipv6" },
51*ee67461eSJoseph Mingrone     { BCM_LI_PKT_TYPE_ETHERNET, "ethernet" },
52*ee67461eSJoseph Mingrone     { 0, NULL}
53*ee67461eSJoseph Mingrone };
54*ee67461eSJoseph Mingrone 
55*ee67461eSJoseph Mingrone static const struct tok bcm_li_pkt_subtype_values[] = {
56*ee67461eSJoseph Mingrone     { 1, "single VLAN tag" },
57*ee67461eSJoseph Mingrone     { 2, "double VLAN tag" },
58*ee67461eSJoseph Mingrone     { 3, "untagged" },
59*ee67461eSJoseph Mingrone     { 0, NULL}
60*ee67461eSJoseph Mingrone };
61*ee67461eSJoseph Mingrone 
62*ee67461eSJoseph Mingrone void
bcm_li_print(netdissect_options * ndo,const u_char * bp,u_int length)63*ee67461eSJoseph Mingrone bcm_li_print(netdissect_options *ndo,
64*ee67461eSJoseph Mingrone              const u_char *bp, u_int length)
65*ee67461eSJoseph Mingrone {
66*ee67461eSJoseph Mingrone 	u_int shim, direction, pkt_type, pkt_subtype, li_id;
67*ee67461eSJoseph Mingrone 
68*ee67461eSJoseph Mingrone 	ndo->ndo_protocol = "bcm_li";
69*ee67461eSJoseph Mingrone 	if (length < BCM_LI_SHIM_LEN) {
70*ee67461eSJoseph Mingrone 	    ND_PRINT(" (length %u < %u)", length, BCM_LI_SHIM_LEN);
71*ee67461eSJoseph Mingrone 	    goto invalid;
72*ee67461eSJoseph Mingrone 	}
73*ee67461eSJoseph Mingrone 	shim = GET_BE_U_4(bp);
74*ee67461eSJoseph Mingrone 
75*ee67461eSJoseph Mingrone 	direction = (shim >> 29) & 0x7;
76*ee67461eSJoseph Mingrone 	pkt_type = (shim >> 25) & 0xf;
77*ee67461eSJoseph Mingrone 	pkt_subtype = (shim >> 22) & 0x7;
78*ee67461eSJoseph Mingrone 	li_id = shim & 0x3fffff;
79*ee67461eSJoseph Mingrone 
80*ee67461eSJoseph Mingrone 	length -= BCM_LI_SHIM_LEN;
81*ee67461eSJoseph Mingrone 	bp += BCM_LI_SHIM_LEN;
82*ee67461eSJoseph Mingrone 
83*ee67461eSJoseph Mingrone 	ND_PRINT("%sBCM-LI-SHIM: direction %s, pkt-type %s, pkt-subtype %s, li-id %u%s",
84*ee67461eSJoseph Mingrone 		 ndo->ndo_vflag ? "\n    " : "",
85*ee67461eSJoseph Mingrone 		 tok2str(bcm_li_direction_values, "unknown", direction),
86*ee67461eSJoseph Mingrone 		 tok2str(bcm_li_pkt_type_values, "unknown", pkt_type),
87*ee67461eSJoseph Mingrone 		 tok2str(bcm_li_pkt_subtype_values, "unknown", pkt_subtype),
88*ee67461eSJoseph Mingrone 		 li_id,
89*ee67461eSJoseph Mingrone 		 ndo->ndo_vflag ? "\n    ": "");
90*ee67461eSJoseph Mingrone 
91*ee67461eSJoseph Mingrone 	if (!ndo->ndo_vflag) {
92*ee67461eSJoseph Mingrone 	    ND_TCHECK_LEN(bp, length);
93*ee67461eSJoseph Mingrone 	    return;
94*ee67461eSJoseph Mingrone 	}
95*ee67461eSJoseph Mingrone 
96*ee67461eSJoseph Mingrone 	switch (pkt_type) {
97*ee67461eSJoseph Mingrone 	case BCM_LI_PKT_TYPE_ETHERNET:
98*ee67461eSJoseph Mingrone 	    ether_print(ndo, bp, length, ND_BYTES_AVAILABLE_AFTER(bp), NULL, NULL);
99*ee67461eSJoseph Mingrone 	    break;
100*ee67461eSJoseph Mingrone 	case BCM_LI_PKT_TYPE_IPV4:
101*ee67461eSJoseph Mingrone 	    ip_print(ndo, bp, length);
102*ee67461eSJoseph Mingrone 	    break;
103*ee67461eSJoseph Mingrone 	case BCM_LI_PKT_TYPE_IPV6:
104*ee67461eSJoseph Mingrone 	    ip6_print(ndo, bp, length);
105*ee67461eSJoseph Mingrone 	    break;
106*ee67461eSJoseph Mingrone 	case BCM_LI_PKT_TYPE_UNDECIDED:
107*ee67461eSJoseph Mingrone 
108*ee67461eSJoseph Mingrone 	    /*
109*ee67461eSJoseph Mingrone 	     * Guess IP version from first nibble.
110*ee67461eSJoseph Mingrone 	     */
111*ee67461eSJoseph Mingrone 	    if ((GET_U_1(bp) >> 4) == 4) {
112*ee67461eSJoseph Mingrone 		ip_print(ndo, bp, length);
113*ee67461eSJoseph Mingrone 	    } else if ((GET_U_1(bp) >> 4) == 6) {
114*ee67461eSJoseph Mingrone 		ip6_print(ndo, bp, length);
115*ee67461eSJoseph Mingrone 	    } else {
116*ee67461eSJoseph Mingrone 		ND_PRINT("unknown payload");
117*ee67461eSJoseph Mingrone 	    }
118*ee67461eSJoseph Mingrone 	    break;
119*ee67461eSJoseph Mingrone 
120*ee67461eSJoseph Mingrone 	default:
121*ee67461eSJoseph Mingrone 	    goto invalid;
122*ee67461eSJoseph Mingrone 	}
123*ee67461eSJoseph Mingrone 
124*ee67461eSJoseph Mingrone 	return;
125*ee67461eSJoseph Mingrone invalid:
126*ee67461eSJoseph Mingrone 	nd_print_invalid(ndo);
127*ee67461eSJoseph Mingrone }
128*ee67461eSJoseph Mingrone 
129