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