xref: /dflybsd-src/contrib/tcpdump/print-ether.c (revision 59c07fbdf8168fa08c76c515186d561b5a92690c)
141c99275SPeter Avalos /*
241c99275SPeter Avalos  * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
341c99275SPeter Avalos  *	The Regents of the University of California.  All rights reserved.
441c99275SPeter Avalos  *
541c99275SPeter Avalos  * Redistribution and use in source and binary forms, with or without
641c99275SPeter Avalos  * modification, are permitted provided that: (1) source code distributions
741c99275SPeter Avalos  * retain the above copyright notice and this paragraph in its entirety, (2)
841c99275SPeter Avalos  * distributions including binary code include the above copyright notice and
941c99275SPeter Avalos  * this paragraph in its entirety in the documentation or other materials
1041c99275SPeter Avalos  * provided with the distribution, and (3) all advertising materials mentioning
1141c99275SPeter Avalos  * features or use of this software display the following acknowledgement:
1241c99275SPeter Avalos  * ``This product includes software developed by the University of California,
1341c99275SPeter Avalos  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
1441c99275SPeter Avalos  * the University nor the names of its contributors may be used to endorse
1541c99275SPeter Avalos  * or promote products derived from this software without specific prior
1641c99275SPeter Avalos  * written permission.
1741c99275SPeter Avalos  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
1841c99275SPeter Avalos  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
1941c99275SPeter Avalos  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
2041c99275SPeter Avalos  */
2141c99275SPeter Avalos 
22411677aeSAaron LI /* \summary: Ethernet printer */
23411677aeSAaron LI 
2441c99275SPeter Avalos #ifdef HAVE_CONFIG_H
25*ed775ee7SAntonio Huete Jimenez #include <config.h>
2641c99275SPeter Avalos #endif
2741c99275SPeter Avalos 
28*ed775ee7SAntonio Huete Jimenez #include "netdissect-stdinc.h"
2941c99275SPeter Avalos 
30*ed775ee7SAntonio Huete Jimenez #define ND_LONGJMP_FROM_TCHECK
31411677aeSAaron LI #include "netdissect.h"
3227bfbee1SPeter Avalos #include "extract.h"
3341c99275SPeter Avalos #include "addrtoname.h"
3441c99275SPeter Avalos #include "ethertype.h"
35*ed775ee7SAntonio Huete Jimenez 
36*ed775ee7SAntonio Huete Jimenez /*
37*ed775ee7SAntonio Huete Jimenez  * Structure of an Ethernet header.
38*ed775ee7SAntonio Huete Jimenez  */
39*ed775ee7SAntonio Huete Jimenez struct	ether_header {
40*ed775ee7SAntonio Huete Jimenez 	nd_mac_addr	ether_dhost;
41*ed775ee7SAntonio Huete Jimenez 	nd_mac_addr	ether_shost;
42*ed775ee7SAntonio Huete Jimenez 	nd_uint16_t	ether_length_type;
43*ed775ee7SAntonio Huete Jimenez };
44*ed775ee7SAntonio Huete Jimenez 
45*ed775ee7SAntonio Huete Jimenez /*
46*ed775ee7SAntonio Huete Jimenez  * Length of an Ethernet header; note that some compilers may pad
47*ed775ee7SAntonio Huete Jimenez  * "struct ether_header" to a multiple of 4 bytes, for example, so
48*ed775ee7SAntonio Huete Jimenez  * "sizeof (struct ether_header)" may not give the right answer.
49*ed775ee7SAntonio Huete Jimenez  */
50*ed775ee7SAntonio Huete Jimenez #define ETHER_HDRLEN		14
5141c99275SPeter Avalos 
5241c99275SPeter Avalos const struct tok ethertype_values[] = {
5341c99275SPeter Avalos     { ETHERTYPE_IP,		"IPv4" },
5441c99275SPeter Avalos     { ETHERTYPE_MPLS,		"MPLS unicast" },
5541c99275SPeter Avalos     { ETHERTYPE_MPLS_MULTI,	"MPLS multicast" },
5641c99275SPeter Avalos     { ETHERTYPE_IPV6,		"IPv6" },
5741c99275SPeter Avalos     { ETHERTYPE_8021Q,		"802.1Q" },
5827bfbee1SPeter Avalos     { ETHERTYPE_8021Q9100,	"802.1Q-9100" },
5927bfbee1SPeter Avalos     { ETHERTYPE_8021QinQ,	"802.1Q-QinQ" },
6027bfbee1SPeter Avalos     { ETHERTYPE_8021Q9200,	"802.1Q-9200" },
61*ed775ee7SAntonio Huete Jimenez     { ETHERTYPE_MACSEC,		"802.1AE MACsec" },
6241c99275SPeter Avalos     { ETHERTYPE_VMAN,		"VMAN" },
6341c99275SPeter Avalos     { ETHERTYPE_PUP,            "PUP" },
6441c99275SPeter Avalos     { ETHERTYPE_ARP,            "ARP"},
6541c99275SPeter Avalos     { ETHERTYPE_REVARP,         "Reverse ARP"},
6641c99275SPeter Avalos     { ETHERTYPE_NS,             "NS" },
6741c99275SPeter Avalos     { ETHERTYPE_SPRITE,         "Sprite" },
6841c99275SPeter Avalos     { ETHERTYPE_TRAIL,          "Trail" },
6941c99275SPeter Avalos     { ETHERTYPE_MOPDL,          "MOP DL" },
7041c99275SPeter Avalos     { ETHERTYPE_MOPRC,          "MOP RC" },
7141c99275SPeter Avalos     { ETHERTYPE_DN,             "DN" },
7241c99275SPeter Avalos     { ETHERTYPE_LAT,            "LAT" },
7341c99275SPeter Avalos     { ETHERTYPE_SCA,            "SCA" },
7427bfbee1SPeter Avalos     { ETHERTYPE_TEB,            "TEB" },
7541c99275SPeter Avalos     { ETHERTYPE_LANBRIDGE,      "Lanbridge" },
7641c99275SPeter Avalos     { ETHERTYPE_DECDNS,         "DEC DNS" },
7741c99275SPeter Avalos     { ETHERTYPE_DECDTS,         "DEC DTS" },
7841c99275SPeter Avalos     { ETHERTYPE_VEXP,           "VEXP" },
7941c99275SPeter Avalos     { ETHERTYPE_VPROD,          "VPROD" },
8041c99275SPeter Avalos     { ETHERTYPE_ATALK,          "Appletalk" },
8141c99275SPeter Avalos     { ETHERTYPE_AARP,           "Appletalk ARP" },
8241c99275SPeter Avalos     { ETHERTYPE_IPX,            "IPX" },
8341c99275SPeter Avalos     { ETHERTYPE_PPP,            "PPP" },
84ea7b4bf5SPeter Avalos     { ETHERTYPE_MPCP,           "MPCP" },
8541c99275SPeter Avalos     { ETHERTYPE_SLOW,           "Slow Protocols" },
8641c99275SPeter Avalos     { ETHERTYPE_PPPOED,         "PPPoE D" },
8741c99275SPeter Avalos     { ETHERTYPE_PPPOES,         "PPPoE S" },
8841c99275SPeter Avalos     { ETHERTYPE_EAPOL,          "EAPOL" },
89ea7b4bf5SPeter Avalos     { ETHERTYPE_RRCP,           "RRCP" },
90411677aeSAaron LI     { ETHERTYPE_MS_NLB_HB,      "MS NLB heartbeat" },
9141c99275SPeter Avalos     { ETHERTYPE_JUMBO,          "Jumbo" },
92*ed775ee7SAntonio Huete Jimenez     { ETHERTYPE_NSH,            "NSH" },
9341c99275SPeter Avalos     { ETHERTYPE_LOOPBACK,       "Loopback" },
9441c99275SPeter Avalos     { ETHERTYPE_ISO,            "OSI" },
9541c99275SPeter Avalos     { ETHERTYPE_GRE_ISO,        "GRE-OSI" },
96ea7b4bf5SPeter Avalos     { ETHERTYPE_CFM_OLD,        "CFM (old)" },
97ea7b4bf5SPeter Avalos     { ETHERTYPE_CFM,            "CFM" },
98411677aeSAaron LI     { ETHERTYPE_IEEE1905_1,     "IEEE1905.1" },
99ea7b4bf5SPeter Avalos     { ETHERTYPE_LLDP,           "LLDP" },
1006263709fSPeter Avalos     { ETHERTYPE_TIPC,           "TIPC"},
101411677aeSAaron LI     { ETHERTYPE_GEONET_OLD,     "GeoNet (old)"},
102411677aeSAaron LI     { ETHERTYPE_GEONET,         "GeoNet"},
103411677aeSAaron LI     { ETHERTYPE_CALM_FAST,      "CALM FAST"},
104411677aeSAaron LI     { ETHERTYPE_AOE,            "AoE" },
105*ed775ee7SAntonio Huete Jimenez     { ETHERTYPE_PTP,            "PTP" },
106*ed775ee7SAntonio Huete Jimenez     { ETHERTYPE_ARISTA,         "Arista Vendor Specific Protocol" },
10741c99275SPeter Avalos     { 0, NULL}
10841c99275SPeter Avalos };
10941c99275SPeter Avalos 
110*ed775ee7SAntonio Huete Jimenez static void
ether_addresses_print(netdissect_options * ndo,const u_char * src,const u_char * dst)111*ed775ee7SAntonio Huete Jimenez ether_addresses_print(netdissect_options *ndo, const u_char *src,
112*ed775ee7SAntonio Huete Jimenez 		      const u_char *dst)
11341c99275SPeter Avalos {
114*ed775ee7SAntonio Huete Jimenez 	ND_PRINT("%s > %s, ",
115*ed775ee7SAntonio Huete Jimenez 		 GET_ETHERADDR_STRING(src), GET_ETHERADDR_STRING(dst));
11641c99275SPeter Avalos }
11741c99275SPeter Avalos 
118*ed775ee7SAntonio Huete Jimenez static void
ether_type_print(netdissect_options * ndo,uint16_t type)119*ed775ee7SAntonio Huete Jimenez ether_type_print(netdissect_options *ndo, uint16_t type)
120*ed775ee7SAntonio Huete Jimenez {
121*ed775ee7SAntonio Huete Jimenez 	if (!ndo->ndo_qflag)
122*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("ethertype %s (0x%04x)",
123*ed775ee7SAntonio Huete Jimenez 			 tok2str(ethertype_values, "Unknown", type), type);
124*ed775ee7SAntonio Huete Jimenez 	else
125*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("%s",
126*ed775ee7SAntonio Huete Jimenez 			 tok2str(ethertype_values, "Unknown Ethertype (0x%04x)", type));
12741c99275SPeter Avalos }
12841c99275SPeter Avalos 
12927bfbee1SPeter Avalos /*
130*ed775ee7SAntonio Huete Jimenez  * Common code for printing Ethernet frames.
131411677aeSAaron LI  *
132*ed775ee7SAntonio Huete Jimenez  * It can handle Ethernet headers with extra tag information inserted
133*ed775ee7SAntonio Huete Jimenez  * after the destination and source addresses, as is inserted by some
134*ed775ee7SAntonio Huete Jimenez  * switch chips, and extra encapsulation header information before
135*ed775ee7SAntonio Huete Jimenez  * printing Ethernet header information (such as a LANE ID for ATM LANE).
13627bfbee1SPeter Avalos  */
137*ed775ee7SAntonio Huete Jimenez static u_int
ether_common_print(netdissect_options * ndo,const u_char * p,u_int length,u_int caplen,void (* print_switch_tag)(netdissect_options * ndo,const u_char *),u_int switch_tag_len,void (* print_encap_header)(netdissect_options * ndo,const u_char *),const u_char * encap_header_arg)138*ed775ee7SAntonio Huete Jimenez ether_common_print(netdissect_options *ndo, const u_char *p, u_int length,
139*ed775ee7SAntonio Huete Jimenez     u_int caplen,
140*ed775ee7SAntonio Huete Jimenez     void (*print_switch_tag)(netdissect_options *ndo, const u_char *),
141*ed775ee7SAntonio Huete Jimenez     u_int switch_tag_len,
142*ed775ee7SAntonio Huete Jimenez     void (*print_encap_header)(netdissect_options *ndo, const u_char *),
143*ed775ee7SAntonio Huete Jimenez     const u_char *encap_header_arg)
14441c99275SPeter Avalos {
145*ed775ee7SAntonio Huete Jimenez 	const struct ether_header *ehp;
14627bfbee1SPeter Avalos 	u_int orig_length;
147411677aeSAaron LI 	u_int hdrlen;
148*ed775ee7SAntonio Huete Jimenez 	u_short length_type;
149*ed775ee7SAntonio Huete Jimenez 	int printed_length;
150411677aeSAaron LI 	int llc_hdrlen;
151411677aeSAaron LI 	struct lladdr_info src, dst;
15241c99275SPeter Avalos 
153*ed775ee7SAntonio Huete Jimenez 	if (caplen < ETHER_HDRLEN + switch_tag_len) {
154*ed775ee7SAntonio Huete Jimenez 		nd_print_trunc(ndo);
155*ed775ee7SAntonio Huete Jimenez 		return caplen;
156411677aeSAaron LI 	}
157*ed775ee7SAntonio Huete Jimenez 	if (length < ETHER_HDRLEN + switch_tag_len) {
158*ed775ee7SAntonio Huete Jimenez 		nd_print_trunc(ndo);
159*ed775ee7SAntonio Huete Jimenez 		return length;
16041c99275SPeter Avalos 	}
16141c99275SPeter Avalos 
16227bfbee1SPeter Avalos 	if (print_encap_header != NULL)
16327bfbee1SPeter Avalos 		(*print_encap_header)(ndo, encap_header_arg);
164*ed775ee7SAntonio Huete Jimenez 
16527bfbee1SPeter Avalos 	orig_length = length;
16641c99275SPeter Avalos 
16741c99275SPeter Avalos 	/*
168*ed775ee7SAntonio Huete Jimenez 	 * Get the source and destination addresses, skip past them,
169*ed775ee7SAntonio Huete Jimenez 	 * and print them if we're printing the link-layer header.
17041c99275SPeter Avalos 	 */
171*ed775ee7SAntonio Huete Jimenez 	ehp = (const struct ether_header *)p;
172*ed775ee7SAntonio Huete Jimenez 	src.addr = ehp->ether_shost;
173*ed775ee7SAntonio Huete Jimenez 	src.addr_string = etheraddr_string;
174*ed775ee7SAntonio Huete Jimenez 	dst.addr = ehp->ether_dhost;
175*ed775ee7SAntonio Huete Jimenez 	dst.addr_string = etheraddr_string;
176*ed775ee7SAntonio Huete Jimenez 
177*ed775ee7SAntonio Huete Jimenez 	length -= 2*MAC_ADDR_LEN;
178*ed775ee7SAntonio Huete Jimenez 	caplen -= 2*MAC_ADDR_LEN;
179*ed775ee7SAntonio Huete Jimenez 	p += 2*MAC_ADDR_LEN;
180*ed775ee7SAntonio Huete Jimenez 	hdrlen = 2*MAC_ADDR_LEN;
181*ed775ee7SAntonio Huete Jimenez 
182*ed775ee7SAntonio Huete Jimenez 	if (ndo->ndo_eflag)
183*ed775ee7SAntonio Huete Jimenez 		ether_addresses_print(ndo, src.addr, dst.addr);
184*ed775ee7SAntonio Huete Jimenez 
185*ed775ee7SAntonio Huete Jimenez 	/*
186*ed775ee7SAntonio Huete Jimenez 	 * Print the switch tag, if we have one, and skip past it.
187*ed775ee7SAntonio Huete Jimenez 	 */
188*ed775ee7SAntonio Huete Jimenez 	if (print_switch_tag != NULL)
189*ed775ee7SAntonio Huete Jimenez 		(*print_switch_tag)(ndo, p);
190*ed775ee7SAntonio Huete Jimenez 
191*ed775ee7SAntonio Huete Jimenez 	length -= switch_tag_len;
192*ed775ee7SAntonio Huete Jimenez 	caplen -= switch_tag_len;
193*ed775ee7SAntonio Huete Jimenez 	p += switch_tag_len;
194*ed775ee7SAntonio Huete Jimenez 	hdrlen += switch_tag_len;
195*ed775ee7SAntonio Huete Jimenez 
196*ed775ee7SAntonio Huete Jimenez 	/*
197*ed775ee7SAntonio Huete Jimenez 	 * Get the length/type field, skip past it, and print it
198*ed775ee7SAntonio Huete Jimenez 	 * if we're printing the link-layer header.
199*ed775ee7SAntonio Huete Jimenez 	 */
200*ed775ee7SAntonio Huete Jimenez recurse:
201*ed775ee7SAntonio Huete Jimenez 	length_type = GET_BE_U_2(p);
202*ed775ee7SAntonio Huete Jimenez 
203*ed775ee7SAntonio Huete Jimenez 	length -= 2;
204*ed775ee7SAntonio Huete Jimenez 	caplen -= 2;
205*ed775ee7SAntonio Huete Jimenez 	p += 2;
206*ed775ee7SAntonio Huete Jimenez 	hdrlen += 2;
207*ed775ee7SAntonio Huete Jimenez 
208*ed775ee7SAntonio Huete Jimenez 	/*
209*ed775ee7SAntonio Huete Jimenez 	 * Process 802.1AE MACsec headers.
210*ed775ee7SAntonio Huete Jimenez 	 */
211*ed775ee7SAntonio Huete Jimenez 	printed_length = 0;
212*ed775ee7SAntonio Huete Jimenez 	if (length_type == ETHERTYPE_MACSEC) {
213*ed775ee7SAntonio Huete Jimenez 		/*
214*ed775ee7SAntonio Huete Jimenez 		 * MACsec, aka IEEE 802.1AE-2006
215*ed775ee7SAntonio Huete Jimenez 		 * Print the header, and try to print the payload if it's not encrypted
216*ed775ee7SAntonio Huete Jimenez 		 */
217*ed775ee7SAntonio Huete Jimenez 		if (ndo->ndo_eflag) {
218*ed775ee7SAntonio Huete Jimenez 			ether_type_print(ndo, length_type);
219*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(", length %u: ", orig_length);
220*ed775ee7SAntonio Huete Jimenez 			printed_length = 1;
221*ed775ee7SAntonio Huete Jimenez 		}
222*ed775ee7SAntonio Huete Jimenez 
223*ed775ee7SAntonio Huete Jimenez 		int ret = macsec_print(ndo, &p, &length, &caplen, &hdrlen,
224*ed775ee7SAntonio Huete Jimenez 		    &src, &dst);
225*ed775ee7SAntonio Huete Jimenez 
226*ed775ee7SAntonio Huete Jimenez 		if (ret == 0) {
227*ed775ee7SAntonio Huete Jimenez 			/* Payload is encrypted; print it as raw data. */
228*ed775ee7SAntonio Huete Jimenez 			if (!ndo->ndo_suppress_default_print)
229*ed775ee7SAntonio Huete Jimenez 				ND_DEFAULTPRINT(p, caplen);
230*ed775ee7SAntonio Huete Jimenez 			return hdrlen;
231*ed775ee7SAntonio Huete Jimenez 		} else if (ret > 0) {
232*ed775ee7SAntonio Huete Jimenez 			/* Problem printing the header; just quit. */
233*ed775ee7SAntonio Huete Jimenez 			return ret;
234*ed775ee7SAntonio Huete Jimenez 		} else {
235*ed775ee7SAntonio Huete Jimenez 			/*
236*ed775ee7SAntonio Huete Jimenez 			 * Keep processing type/length fields.
237*ed775ee7SAntonio Huete Jimenez 			 */
238*ed775ee7SAntonio Huete Jimenez 			length_type = GET_BE_U_2(p);
239*ed775ee7SAntonio Huete Jimenez 
240*ed775ee7SAntonio Huete Jimenez 			length -= 2;
241*ed775ee7SAntonio Huete Jimenez 			caplen -= 2;
242*ed775ee7SAntonio Huete Jimenez 			p += 2;
243*ed775ee7SAntonio Huete Jimenez 			hdrlen += 2;
244*ed775ee7SAntonio Huete Jimenez 		}
245*ed775ee7SAntonio Huete Jimenez 	}
246*ed775ee7SAntonio Huete Jimenez 
247*ed775ee7SAntonio Huete Jimenez 	/*
248*ed775ee7SAntonio Huete Jimenez 	 * Process VLAN tag types.
249*ed775ee7SAntonio Huete Jimenez 	 */
250*ed775ee7SAntonio Huete Jimenez 	while (length_type == ETHERTYPE_8021Q  ||
251*ed775ee7SAntonio Huete Jimenez 		length_type == ETHERTYPE_8021Q9100 ||
252*ed775ee7SAntonio Huete Jimenez 		length_type == ETHERTYPE_8021Q9200 ||
253*ed775ee7SAntonio Huete Jimenez 		length_type == ETHERTYPE_8021QinQ) {
254*ed775ee7SAntonio Huete Jimenez 		/*
255*ed775ee7SAntonio Huete Jimenez 		 * It has a VLAN tag.
256*ed775ee7SAntonio Huete Jimenez 		 * Print VLAN information, and then go back and process
257*ed775ee7SAntonio Huete Jimenez 		 * the enclosed type field.
258*ed775ee7SAntonio Huete Jimenez 		 */
259*ed775ee7SAntonio Huete Jimenez 		if (caplen < 4) {
260*ed775ee7SAntonio Huete Jimenez 			ndo->ndo_protocol = "vlan";
261*ed775ee7SAntonio Huete Jimenez 			nd_print_trunc(ndo);
262*ed775ee7SAntonio Huete Jimenez 			return hdrlen + caplen;
263*ed775ee7SAntonio Huete Jimenez 		}
264*ed775ee7SAntonio Huete Jimenez 		if (length < 4) {
265*ed775ee7SAntonio Huete Jimenez 			ndo->ndo_protocol = "vlan";
266*ed775ee7SAntonio Huete Jimenez 			nd_print_trunc(ndo);
267*ed775ee7SAntonio Huete Jimenez 			return hdrlen + length;
268*ed775ee7SAntonio Huete Jimenez 		}
269*ed775ee7SAntonio Huete Jimenez 		if (ndo->ndo_eflag) {
270*ed775ee7SAntonio Huete Jimenez 			uint16_t tag = GET_BE_U_2(p);
271*ed775ee7SAntonio Huete Jimenez 
272*ed775ee7SAntonio Huete Jimenez 			ether_type_print(ndo, length_type);
273*ed775ee7SAntonio Huete Jimenez 			if (!printed_length) {
274*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(", length %u: ", orig_length);
275*ed775ee7SAntonio Huete Jimenez 				printed_length = 1;
276*ed775ee7SAntonio Huete Jimenez 			} else
277*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(", ");
278*ed775ee7SAntonio Huete Jimenez 			ND_PRINT("%s, ", ieee8021q_tci_string(tag));
279*ed775ee7SAntonio Huete Jimenez 		}
280*ed775ee7SAntonio Huete Jimenez 
281*ed775ee7SAntonio Huete Jimenez 		length_type = GET_BE_U_2(p + 2);
282*ed775ee7SAntonio Huete Jimenez 		p += 4;
283*ed775ee7SAntonio Huete Jimenez 		length -= 4;
284*ed775ee7SAntonio Huete Jimenez 		caplen -= 4;
285*ed775ee7SAntonio Huete Jimenez 		hdrlen += 4;
286*ed775ee7SAntonio Huete Jimenez 	}
287*ed775ee7SAntonio Huete Jimenez 
288*ed775ee7SAntonio Huete Jimenez 	/*
289*ed775ee7SAntonio Huete Jimenez 	 * We now have the final length/type field.
290*ed775ee7SAntonio Huete Jimenez 	 */
291*ed775ee7SAntonio Huete Jimenez 	if (length_type <= MAX_ETHERNET_LENGTH_VAL) {
292*ed775ee7SAntonio Huete Jimenez 		/*
293*ed775ee7SAntonio Huete Jimenez 		 * It's a length field, containing the length of the
294*ed775ee7SAntonio Huete Jimenez 		 * remaining payload; use it as such, as long as
295*ed775ee7SAntonio Huete Jimenez 		 * it's not too large (bigger than the actual payload).
296*ed775ee7SAntonio Huete Jimenez 		 */
297*ed775ee7SAntonio Huete Jimenez 		if (length_type < length) {
298*ed775ee7SAntonio Huete Jimenez 			length = length_type;
299*ed775ee7SAntonio Huete Jimenez 			if (caplen > length)
300*ed775ee7SAntonio Huete Jimenez 				caplen = length;
301*ed775ee7SAntonio Huete Jimenez 		}
302*ed775ee7SAntonio Huete Jimenez 
303*ed775ee7SAntonio Huete Jimenez 		/*
304*ed775ee7SAntonio Huete Jimenez 		 * Cut off the snapshot length to the end of the
305*ed775ee7SAntonio Huete Jimenez 		 * payload.
306*ed775ee7SAntonio Huete Jimenez 		 */
307*ed775ee7SAntonio Huete Jimenez 		nd_push_snapend(ndo, p + length);
308*ed775ee7SAntonio Huete Jimenez 
309*ed775ee7SAntonio Huete Jimenez 		if (ndo->ndo_eflag) {
310*ed775ee7SAntonio Huete Jimenez 			ND_PRINT("802.3");
311*ed775ee7SAntonio Huete Jimenez 			if (!printed_length)
312*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(", length %u: ", length);
313*ed775ee7SAntonio Huete Jimenez 		}
314*ed775ee7SAntonio Huete Jimenez 
315*ed775ee7SAntonio Huete Jimenez 		/*
316*ed775ee7SAntonio Huete Jimenez 		 * An LLC header follows the length.  Print that and
317*ed775ee7SAntonio Huete Jimenez 		 * higher layers.
318*ed775ee7SAntonio Huete Jimenez 		 */
319411677aeSAaron LI 		llc_hdrlen = llc_print(ndo, p, length, caplen, &src, &dst);
320411677aeSAaron LI 		if (llc_hdrlen < 0) {
321411677aeSAaron LI 			/* packet type not known, print raw packet */
32227bfbee1SPeter Avalos 			if (!ndo->ndo_suppress_default_print)
323411677aeSAaron LI 				ND_DEFAULTPRINT(p, caplen);
324411677aeSAaron LI 			llc_hdrlen = -llc_hdrlen;
32527bfbee1SPeter Avalos 		}
326411677aeSAaron LI 		hdrlen += llc_hdrlen;
327*ed775ee7SAntonio Huete Jimenez 		nd_pop_packet_info(ndo);
328411677aeSAaron LI 	} else if (length_type == ETHERTYPE_JUMBO) {
32927bfbee1SPeter Avalos 		/*
330*ed775ee7SAntonio Huete Jimenez 		 * It's a type field, with the type for Alteon jumbo frames.
33127bfbee1SPeter Avalos 		 * See
33227bfbee1SPeter Avalos 		 *
333*ed775ee7SAntonio Huete Jimenez 		 *	https://tools.ietf.org/html/draft-ietf-isis-ext-eth-01
33427bfbee1SPeter Avalos 		 *
33527bfbee1SPeter Avalos 		 * which indicates that, following the type field,
33627bfbee1SPeter Avalos 		 * there's an LLC header and payload.
33727bfbee1SPeter Avalos 		 */
33827bfbee1SPeter Avalos 		/* Try to print the LLC-layer header & higher layers */
339411677aeSAaron LI 		llc_hdrlen = llc_print(ndo, p, length, caplen, &src, &dst);
340411677aeSAaron LI 		if (llc_hdrlen < 0) {
341411677aeSAaron LI 			/* packet type not known, print raw packet */
34227bfbee1SPeter Avalos 			if (!ndo->ndo_suppress_default_print)
343411677aeSAaron LI 				ND_DEFAULTPRINT(p, caplen);
344411677aeSAaron LI 			llc_hdrlen = -llc_hdrlen;
34527bfbee1SPeter Avalos 		}
346411677aeSAaron LI 		hdrlen += llc_hdrlen;
347*ed775ee7SAntonio Huete Jimenez 	} else if (length_type == ETHERTYPE_ARISTA) {
348*ed775ee7SAntonio Huete Jimenez 		if (caplen < 2) {
349*ed775ee7SAntonio Huete Jimenez 			ND_PRINT("[|arista]");
350*ed775ee7SAntonio Huete Jimenez 			return hdrlen + caplen;
351*ed775ee7SAntonio Huete Jimenez 		}
352*ed775ee7SAntonio Huete Jimenez 		if (length < 2) {
353*ed775ee7SAntonio Huete Jimenez 			ND_PRINT("[|arista]");
354*ed775ee7SAntonio Huete Jimenez 			return hdrlen + length;
355*ed775ee7SAntonio Huete Jimenez 		}
356*ed775ee7SAntonio Huete Jimenez 		ether_type_print(ndo, length_type);
357*ed775ee7SAntonio Huete Jimenez 		ND_PRINT(", length %u: ", orig_length);
358*ed775ee7SAntonio Huete Jimenez 		int bytesConsumed = arista_ethertype_print(ndo, p, length);
359*ed775ee7SAntonio Huete Jimenez 		if (bytesConsumed > 0) {
360*ed775ee7SAntonio Huete Jimenez 			p += bytesConsumed;
361*ed775ee7SAntonio Huete Jimenez 			length -= bytesConsumed;
362*ed775ee7SAntonio Huete Jimenez 			caplen -= bytesConsumed;
363*ed775ee7SAntonio Huete Jimenez 			hdrlen += bytesConsumed;
364*ed775ee7SAntonio Huete Jimenez 			goto recurse;
36527bfbee1SPeter Avalos 		} else {
366*ed775ee7SAntonio Huete Jimenez 			/* subtype/version not known, print raw packet */
367*ed775ee7SAntonio Huete Jimenez 			if (!ndo->ndo_eflag && length_type > MAX_ETHERNET_LENGTH_VAL) {
368*ed775ee7SAntonio Huete Jimenez 				ether_addresses_print(ndo, src.addr, dst.addr);
369*ed775ee7SAntonio Huete Jimenez 				ether_type_print(ndo, length_type);
370*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(", length %u: ", orig_length);
371*ed775ee7SAntonio Huete Jimenez 			}
372*ed775ee7SAntonio Huete Jimenez 			 if (!ndo->ndo_suppress_default_print)
373*ed775ee7SAntonio Huete Jimenez 				 ND_DEFAULTPRINT(p, caplen);
374*ed775ee7SAntonio Huete Jimenez 		}
375*ed775ee7SAntonio Huete Jimenez 	} else {
376*ed775ee7SAntonio Huete Jimenez 		/*
377*ed775ee7SAntonio Huete Jimenez 		 * It's a type field with some other value.
378*ed775ee7SAntonio Huete Jimenez 		 */
379*ed775ee7SAntonio Huete Jimenez 		if (ndo->ndo_eflag) {
380*ed775ee7SAntonio Huete Jimenez 			ether_type_print(ndo, length_type);
381*ed775ee7SAntonio Huete Jimenez 			if (!printed_length)
382*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(", length %u: ", orig_length);
383*ed775ee7SAntonio Huete Jimenez 			else
384*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(", ");
385*ed775ee7SAntonio Huete Jimenez 		}
386411677aeSAaron LI 		if (ethertype_print(ndo, length_type, p, length, caplen, &src, &dst) == 0) {
387411677aeSAaron LI 			/* type not known, print raw packet */
38827bfbee1SPeter Avalos 			if (!ndo->ndo_eflag) {
389*ed775ee7SAntonio Huete Jimenez 				/*
390*ed775ee7SAntonio Huete Jimenez 				 * We didn't print the full link-layer
391*ed775ee7SAntonio Huete Jimenez 				 * header, as -e wasn't specified, so
392*ed775ee7SAntonio Huete Jimenez 				 * print only the source and destination
393*ed775ee7SAntonio Huete Jimenez 				 * MAC addresses and the final Ethernet
394*ed775ee7SAntonio Huete Jimenez 				 * type.
395*ed775ee7SAntonio Huete Jimenez 				 */
396*ed775ee7SAntonio Huete Jimenez 				ether_addresses_print(ndo, src.addr, dst.addr);
397*ed775ee7SAntonio Huete Jimenez 				ether_type_print(ndo, length_type);
398*ed775ee7SAntonio Huete Jimenez 				ND_PRINT(", length %u: ", orig_length);
39927bfbee1SPeter Avalos 			}
40027bfbee1SPeter Avalos 
40127bfbee1SPeter Avalos 			if (!ndo->ndo_suppress_default_print)
402411677aeSAaron LI 				ND_DEFAULTPRINT(p, caplen);
40327bfbee1SPeter Avalos 		}
40441c99275SPeter Avalos 	}
405*ed775ee7SAntonio Huete Jimenez 	return hdrlen;
406*ed775ee7SAntonio Huete Jimenez }
407*ed775ee7SAntonio Huete Jimenez 
408*ed775ee7SAntonio Huete Jimenez /*
409*ed775ee7SAntonio Huete Jimenez  * Print an Ethernet frame while specyfing a non-standard Ethernet header
410*ed775ee7SAntonio Huete Jimenez  * length.
411*ed775ee7SAntonio Huete Jimenez  * This might be encapsulated within another frame; we might be passed
412*ed775ee7SAntonio Huete Jimenez  * a pointer to a function that can print header information for that
413*ed775ee7SAntonio Huete Jimenez  * frame's protocol, and an argument to pass to that function.
414*ed775ee7SAntonio Huete Jimenez  *
415*ed775ee7SAntonio Huete Jimenez  * FIXME: caplen can and should be derived from ndo->ndo_snapend and p.
416*ed775ee7SAntonio Huete Jimenez  */
417*ed775ee7SAntonio Huete Jimenez u_int
ether_switch_tag_print(netdissect_options * ndo,const u_char * p,u_int length,u_int caplen,void (* print_switch_tag)(netdissect_options *,const u_char *),u_int switch_tag_len)418*ed775ee7SAntonio Huete Jimenez ether_switch_tag_print(netdissect_options *ndo, const u_char *p, u_int length,
419*ed775ee7SAntonio Huete Jimenez     u_int caplen,
420*ed775ee7SAntonio Huete Jimenez     void (*print_switch_tag)(netdissect_options *, const u_char *),
421*ed775ee7SAntonio Huete Jimenez     u_int switch_tag_len)
422*ed775ee7SAntonio Huete Jimenez {
423*ed775ee7SAntonio Huete Jimenez 	return ether_common_print(ndo, p, length, caplen, print_switch_tag,
424*ed775ee7SAntonio Huete Jimenez 				  switch_tag_len, NULL, NULL);
425*ed775ee7SAntonio Huete Jimenez }
426*ed775ee7SAntonio Huete Jimenez 
427*ed775ee7SAntonio Huete Jimenez /*
428*ed775ee7SAntonio Huete Jimenez  * Print an Ethernet frame.
429*ed775ee7SAntonio Huete Jimenez  * This might be encapsulated within another frame; we might be passed
430*ed775ee7SAntonio Huete Jimenez  * a pointer to a function that can print header information for that
431*ed775ee7SAntonio Huete Jimenez  * frame's protocol, and an argument to pass to that function.
432*ed775ee7SAntonio Huete Jimenez  *
433*ed775ee7SAntonio Huete Jimenez  * FIXME: caplen can and should be derived from ndo->ndo_snapend and p.
434*ed775ee7SAntonio Huete Jimenez  */
435*ed775ee7SAntonio Huete Jimenez u_int
ether_print(netdissect_options * ndo,const u_char * p,u_int length,u_int caplen,void (* print_encap_header)(netdissect_options * ndo,const u_char *),const u_char * encap_header_arg)436*ed775ee7SAntonio Huete Jimenez ether_print(netdissect_options *ndo,
437*ed775ee7SAntonio Huete Jimenez 	    const u_char *p, u_int length, u_int caplen,
438*ed775ee7SAntonio Huete Jimenez 	    void (*print_encap_header)(netdissect_options *ndo, const u_char *),
439*ed775ee7SAntonio Huete Jimenez 	    const u_char *encap_header_arg)
440*ed775ee7SAntonio Huete Jimenez {
441*ed775ee7SAntonio Huete Jimenez 	ndo->ndo_protocol = "ether";
442*ed775ee7SAntonio Huete Jimenez 	return ether_common_print(ndo, p, length, caplen, NULL, 0,
443*ed775ee7SAntonio Huete Jimenez 				  print_encap_header, encap_header_arg);
44441c99275SPeter Avalos }
44541c99275SPeter Avalos 
44641c99275SPeter Avalos /*
44741c99275SPeter Avalos  * This is the top level routine of the printer.  'p' points
448411677aeSAaron LI  * to the ether header of the packet, 'h->len' is the length
449411677aeSAaron LI  * of the packet off the wire, and 'h->caplen' is the number
450411677aeSAaron LI  * of bytes actually captured.
45141c99275SPeter Avalos  */
452*ed775ee7SAntonio Huete Jimenez void
ether_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)45327bfbee1SPeter Avalos ether_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h,
45427bfbee1SPeter Avalos 	       const u_char *p)
45541c99275SPeter Avalos {
456*ed775ee7SAntonio Huete Jimenez 	ndo->ndo_protocol = "ether";
457*ed775ee7SAntonio Huete Jimenez 	ndo->ndo_ll_hdr_len +=
458*ed775ee7SAntonio Huete Jimenez 		ether_print(ndo, p, h->len, h->caplen, NULL, NULL);
45941c99275SPeter Avalos }
46041c99275SPeter Avalos 
46141c99275SPeter Avalos /*
46227bfbee1SPeter Avalos  * This is the top level routine of the printer.  'p' points
463411677aeSAaron LI  * to the ether header of the packet, 'h->len' is the length
464411677aeSAaron LI  * of the packet off the wire, and 'h->caplen' is the number
465411677aeSAaron LI  * of bytes actually captured.
46627bfbee1SPeter Avalos  *
46727bfbee1SPeter Avalos  * This is for DLT_NETANALYZER, which has a 4-byte pseudo-header
46827bfbee1SPeter Avalos  * before the Ethernet header.
46927bfbee1SPeter Avalos  */
470*ed775ee7SAntonio Huete Jimenez void
netanalyzer_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)47127bfbee1SPeter Avalos netanalyzer_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h,
47227bfbee1SPeter Avalos 		     const u_char *p)
47327bfbee1SPeter Avalos {
47427bfbee1SPeter Avalos 	/*
47527bfbee1SPeter Avalos 	 * Fail if we don't have enough data for the Hilscher pseudo-header.
47627bfbee1SPeter Avalos 	 */
477*ed775ee7SAntonio Huete Jimenez 	ndo->ndo_protocol = "netanalyzer";
478*ed775ee7SAntonio Huete Jimenez 	ND_TCHECK_LEN(p, 4);
47927bfbee1SPeter Avalos 
48027bfbee1SPeter Avalos 	/* Skip the pseudo-header. */
481*ed775ee7SAntonio Huete Jimenez 	ndo->ndo_ll_hdr_len += 4;
482*ed775ee7SAntonio Huete Jimenez 	ndo->ndo_ll_hdr_len +=
483*ed775ee7SAntonio Huete Jimenez 		ether_print(ndo, p + 4, h->len - 4, h->caplen - 4, NULL, NULL);
48427bfbee1SPeter Avalos }
48527bfbee1SPeter Avalos 
48627bfbee1SPeter Avalos /*
48727bfbee1SPeter Avalos  * This is the top level routine of the printer.  'p' points
488411677aeSAaron LI  * to the ether header of the packet, 'h->len' is the length
489411677aeSAaron LI  * of the packet off the wire, and 'h->caplen' is the number
490411677aeSAaron LI  * of bytes actually captured.
49127bfbee1SPeter Avalos  *
49227bfbee1SPeter Avalos  * This is for DLT_NETANALYZER_TRANSPARENT, which has a 4-byte
49327bfbee1SPeter Avalos  * pseudo-header, a 7-byte Ethernet preamble, and a 1-byte Ethernet SOF
49427bfbee1SPeter Avalos  * before the Ethernet header.
49527bfbee1SPeter Avalos  */
496*ed775ee7SAntonio Huete Jimenez void
netanalyzer_transparent_if_print(netdissect_options * ndo,const struct pcap_pkthdr * h,const u_char * p)49727bfbee1SPeter Avalos netanalyzer_transparent_if_print(netdissect_options *ndo,
49827bfbee1SPeter Avalos 				 const struct pcap_pkthdr *h,
49927bfbee1SPeter Avalos 				 const u_char *p)
50027bfbee1SPeter Avalos {
50127bfbee1SPeter Avalos 	/*
50227bfbee1SPeter Avalos 	 * Fail if we don't have enough data for the Hilscher pseudo-header,
50327bfbee1SPeter Avalos 	 * preamble, and SOF.
50427bfbee1SPeter Avalos 	 */
505*ed775ee7SAntonio Huete Jimenez 	ndo->ndo_protocol = "netanalyzer_transparent";
506*ed775ee7SAntonio Huete Jimenez 	ND_TCHECK_LEN(p, 12);
50727bfbee1SPeter Avalos 
50827bfbee1SPeter Avalos 	/* Skip the pseudo-header, preamble, and SOF. */
509*ed775ee7SAntonio Huete Jimenez 	ndo->ndo_ll_hdr_len += 12;
510*ed775ee7SAntonio Huete Jimenez 	ndo->ndo_ll_hdr_len +=
511*ed775ee7SAntonio Huete Jimenez 		ether_print(ndo, p + 12, h->len - 12, h->caplen - 12, NULL, NULL);
51227bfbee1SPeter Avalos }
51327bfbee1SPeter Avalos 
51427bfbee1SPeter Avalos /*
51527bfbee1SPeter Avalos  * Prints the packet payload, given an Ethernet type code for the payload's
51627bfbee1SPeter Avalos  * protocol.
51741c99275SPeter Avalos  *
51841c99275SPeter Avalos  * Returns non-zero if it can do so, zero if the ethertype is unknown.
51941c99275SPeter Avalos  */
52041c99275SPeter Avalos 
52141c99275SPeter Avalos int
ethertype_print(netdissect_options * ndo,u_short ether_type,const u_char * p,u_int length,u_int caplen,const struct lladdr_info * src,const struct lladdr_info * dst)52227bfbee1SPeter Avalos ethertype_print(netdissect_options *ndo,
52327bfbee1SPeter Avalos 		u_short ether_type, const u_char *p,
524411677aeSAaron LI 		u_int length, u_int caplen,
525411677aeSAaron LI 		const struct lladdr_info *src, const struct lladdr_info *dst)
52641c99275SPeter Avalos {
52741c99275SPeter Avalos 	switch (ether_type) {
52841c99275SPeter Avalos 
52941c99275SPeter Avalos 	case ETHERTYPE_IP:
53027bfbee1SPeter Avalos 		ip_print(ndo, p, length);
53141c99275SPeter Avalos 		return (1);
53241c99275SPeter Avalos 
53341c99275SPeter Avalos 	case ETHERTYPE_IPV6:
53427bfbee1SPeter Avalos 		ip6_print(ndo, p, length);
53541c99275SPeter Avalos 		return (1);
53641c99275SPeter Avalos 
53741c99275SPeter Avalos 	case ETHERTYPE_ARP:
53841c99275SPeter Avalos 	case ETHERTYPE_REVARP:
53927bfbee1SPeter Avalos 		arp_print(ndo, p, length, caplen);
54041c99275SPeter Avalos 		return (1);
54141c99275SPeter Avalos 
54241c99275SPeter Avalos 	case ETHERTYPE_DN:
543411677aeSAaron LI 		decnet_print(ndo, p, length, caplen);
54441c99275SPeter Avalos 		return (1);
54541c99275SPeter Avalos 
54641c99275SPeter Avalos 	case ETHERTYPE_ATALK:
54727bfbee1SPeter Avalos 		if (ndo->ndo_vflag)
548*ed775ee7SAntonio Huete Jimenez 			ND_PRINT("et1 ");
549411677aeSAaron LI 		atalk_print(ndo, p, length);
55041c99275SPeter Avalos 		return (1);
55141c99275SPeter Avalos 
55241c99275SPeter Avalos 	case ETHERTYPE_AARP:
553411677aeSAaron LI 		aarp_print(ndo, p, length);
55441c99275SPeter Avalos 		return (1);
55541c99275SPeter Avalos 
55641c99275SPeter Avalos 	case ETHERTYPE_IPX:
557*ed775ee7SAntonio Huete Jimenez 		ND_PRINT("(NOV-ETHII) ");
558411677aeSAaron LI 		ipx_print(ndo, p, length);
55941c99275SPeter Avalos 		return (1);
56041c99275SPeter Avalos 
56141c99275SPeter Avalos 	case ETHERTYPE_ISO:
562411677aeSAaron LI 		if (length == 0 || caplen == 0) {
563*ed775ee7SAntonio Huete Jimenez 			ndo->ndo_protocol = "isoclns";
564*ed775ee7SAntonio Huete Jimenez 			nd_print_trunc(ndo);
565411677aeSAaron LI 			return (1);
566411677aeSAaron LI 		}
567*ed775ee7SAntonio Huete Jimenez 		/* At least one byte is required */
568*ed775ee7SAntonio Huete Jimenez 		/* FIXME: Reference for this byte? */
569*ed775ee7SAntonio Huete Jimenez 		ND_TCHECK_LEN(p, 1);
570411677aeSAaron LI 		isoclns_print(ndo, p + 1, length - 1);
57141c99275SPeter Avalos 		return(1);
57241c99275SPeter Avalos 
57341c99275SPeter Avalos 	case ETHERTYPE_PPPOED:
57441c99275SPeter Avalos 	case ETHERTYPE_PPPOES:
57527bfbee1SPeter Avalos 	case ETHERTYPE_PPPOED2:
57627bfbee1SPeter Avalos 	case ETHERTYPE_PPPOES2:
577411677aeSAaron LI 		pppoe_print(ndo, p, length);
57841c99275SPeter Avalos 		return (1);
57941c99275SPeter Avalos 
58041c99275SPeter Avalos 	case ETHERTYPE_EAPOL:
581*ed775ee7SAntonio Huete Jimenez 		eapol_print(ndo, p);
58241c99275SPeter Avalos 		return (1);
58341c99275SPeter Avalos 
584ea7b4bf5SPeter Avalos 	case ETHERTYPE_RRCP:
585411677aeSAaron LI 		rrcp_print(ndo, p, length, src, dst);
586ea7b4bf5SPeter Avalos 		return (1);
587ea7b4bf5SPeter Avalos 
58841c99275SPeter Avalos 	case ETHERTYPE_PPP:
58941c99275SPeter Avalos 		if (length) {
590*ed775ee7SAntonio Huete Jimenez 			ND_PRINT(": ");
591411677aeSAaron LI 			ppp_print(ndo, p, length);
59241c99275SPeter Avalos 		}
59341c99275SPeter Avalos 		return (1);
59441c99275SPeter Avalos 
595ea7b4bf5SPeter Avalos 	case ETHERTYPE_MPCP:
596411677aeSAaron LI 		mpcp_print(ndo, p, length);
597ea7b4bf5SPeter Avalos 		return (1);
598ea7b4bf5SPeter Avalos 
59941c99275SPeter Avalos 	case ETHERTYPE_SLOW:
600411677aeSAaron LI 		slow_print(ndo, p, length);
60141c99275SPeter Avalos 		return (1);
60241c99275SPeter Avalos 
603ea7b4bf5SPeter Avalos 	case ETHERTYPE_CFM:
604ea7b4bf5SPeter Avalos 	case ETHERTYPE_CFM_OLD:
605411677aeSAaron LI 		cfm_print(ndo, p, length);
606ea7b4bf5SPeter Avalos 		return (1);
607ea7b4bf5SPeter Avalos 
608ea7b4bf5SPeter Avalos 	case ETHERTYPE_LLDP:
609411677aeSAaron LI 		lldp_print(ndo, p, length);
610ea7b4bf5SPeter Avalos 		return (1);
611ea7b4bf5SPeter Avalos 
612*ed775ee7SAntonio Huete Jimenez 	case ETHERTYPE_NSH:
613*ed775ee7SAntonio Huete Jimenez 		nsh_print(ndo, p, length);
614*ed775ee7SAntonio Huete Jimenez 		return (1);
615*ed775ee7SAntonio Huete Jimenez 
61641c99275SPeter Avalos 	case ETHERTYPE_LOOPBACK:
617411677aeSAaron LI 		loopback_print(ndo, p, length);
61841c99275SPeter Avalos 		return (1);
61941c99275SPeter Avalos 
62041c99275SPeter Avalos 	case ETHERTYPE_MPLS:
62141c99275SPeter Avalos 	case ETHERTYPE_MPLS_MULTI:
622411677aeSAaron LI 		mpls_print(ndo, p, length);
62341c99275SPeter Avalos 		return (1);
62441c99275SPeter Avalos 
6256263709fSPeter Avalos 	case ETHERTYPE_TIPC:
6266263709fSPeter Avalos 		tipc_print(ndo, p, length, caplen);
6276263709fSPeter Avalos 		return (1);
6286263709fSPeter Avalos 
629411677aeSAaron LI 	case ETHERTYPE_MS_NLB_HB:
630411677aeSAaron LI 		msnlb_print(ndo, p);
631411677aeSAaron LI 		return (1);
632411677aeSAaron LI 
633411677aeSAaron LI 	case ETHERTYPE_GEONET_OLD:
634411677aeSAaron LI 	case ETHERTYPE_GEONET:
635411677aeSAaron LI 		geonet_print(ndo, p, length, src);
636411677aeSAaron LI 		return (1);
637411677aeSAaron LI 
638411677aeSAaron LI 	case ETHERTYPE_CALM_FAST:
639411677aeSAaron LI 		calm_fast_print(ndo, p, length, src);
640411677aeSAaron LI 		return (1);
641411677aeSAaron LI 
642411677aeSAaron LI 	case ETHERTYPE_AOE:
643411677aeSAaron LI 		aoe_print(ndo, p, length);
644411677aeSAaron LI 		return (1);
645411677aeSAaron LI 
646*ed775ee7SAntonio Huete Jimenez 	case ETHERTYPE_PTP:
647*ed775ee7SAntonio Huete Jimenez 		ptp_print(ndo, p, length);
648411677aeSAaron LI 		return (1);
649411677aeSAaron LI 
65041c99275SPeter Avalos 	case ETHERTYPE_LAT:
65141c99275SPeter Avalos 	case ETHERTYPE_SCA:
65241c99275SPeter Avalos 	case ETHERTYPE_MOPRC:
65341c99275SPeter Avalos 	case ETHERTYPE_MOPDL:
654411677aeSAaron LI 	case ETHERTYPE_IEEE1905_1:
65541c99275SPeter Avalos 		/* default_print for now */
65641c99275SPeter Avalos 	default:
65741c99275SPeter Avalos 		return (0);
65841c99275SPeter Avalos 	}
65941c99275SPeter Avalos }
660