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 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