blob: 01dd11303841a8fec4725c6e25f1fbec7d8157c1 [file] [log] [blame]
The Android Open Source Project2949f582009-03-03 19:30:46 -08001/*
2 * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that: (1) source code distributions
7 * retain the above copyright notice and this paragraph in its entirety, (2)
8 * distributions including binary code include the above copyright notice and
9 * this paragraph in its entirety in the documentation or other materials
10 * provided with the distribution, and (3) all advertising materials mentioning
11 * features or use of this software display the following acknowledgement:
12 * ``This product includes software developed by the University of California,
13 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14 * the University nor the names of its contributors may be used to endorse
15 * or promote products derived from this software without specific prior
16 * written permission.
17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20 */
The Android Open Source Project2949f582009-03-03 19:30:46 -080021
Elliott Hughese2e3bd12017-05-15 10:59:29 -070022/* \summary: Ethernet printer */
23
The Android Open Source Project2949f582009-03-03 19:30:46 -080024#ifdef HAVE_CONFIG_H
25#include "config.h"
26#endif
27
Elliott Hughese2e3bd12017-05-15 10:59:29 -070028#include <netdissect-stdinc.h>
The Android Open Source Project2949f582009-03-03 19:30:46 -080029
Elliott Hughese2e3bd12017-05-15 10:59:29 -070030#include "netdissect.h"
JP Abgrall53f17a92014-02-12 14:02:41 -080031#include "extract.h"
The Android Open Source Project2949f582009-03-03 19:30:46 -080032#include "addrtoname.h"
33#include "ethertype.h"
The Android Open Source Project2949f582009-03-03 19:30:46 -080034#include "ether.h"
35
Elliott Hughes892a68b2015-10-19 14:43:53 -070036const struct tok ethertype_values[] = {
The Android Open Source Project2949f582009-03-03 19:30:46 -080037 { ETHERTYPE_IP, "IPv4" },
38 { ETHERTYPE_MPLS, "MPLS unicast" },
39 { ETHERTYPE_MPLS_MULTI, "MPLS multicast" },
40 { ETHERTYPE_IPV6, "IPv6" },
41 { ETHERTYPE_8021Q, "802.1Q" },
JP Abgrall53f17a92014-02-12 14:02:41 -080042 { ETHERTYPE_8021Q9100, "802.1Q-9100" },
43 { ETHERTYPE_8021QinQ, "802.1Q-QinQ" },
44 { ETHERTYPE_8021Q9200, "802.1Q-9200" },
The Android Open Source Project2949f582009-03-03 19:30:46 -080045 { ETHERTYPE_VMAN, "VMAN" },
46 { ETHERTYPE_PUP, "PUP" },
47 { ETHERTYPE_ARP, "ARP"},
48 { ETHERTYPE_REVARP, "Reverse ARP"},
49 { ETHERTYPE_NS, "NS" },
50 { ETHERTYPE_SPRITE, "Sprite" },
51 { ETHERTYPE_TRAIL, "Trail" },
52 { ETHERTYPE_MOPDL, "MOP DL" },
53 { ETHERTYPE_MOPRC, "MOP RC" },
54 { ETHERTYPE_DN, "DN" },
55 { ETHERTYPE_LAT, "LAT" },
56 { ETHERTYPE_SCA, "SCA" },
JP Abgrall53f17a92014-02-12 14:02:41 -080057 { ETHERTYPE_TEB, "TEB" },
The Android Open Source Project2949f582009-03-03 19:30:46 -080058 { ETHERTYPE_LANBRIDGE, "Lanbridge" },
59 { ETHERTYPE_DECDNS, "DEC DNS" },
60 { ETHERTYPE_DECDTS, "DEC DTS" },
61 { ETHERTYPE_VEXP, "VEXP" },
62 { ETHERTYPE_VPROD, "VPROD" },
63 { ETHERTYPE_ATALK, "Appletalk" },
64 { ETHERTYPE_AARP, "Appletalk ARP" },
65 { ETHERTYPE_IPX, "IPX" },
66 { ETHERTYPE_PPP, "PPP" },
JP Abgrall53f17a92014-02-12 14:02:41 -080067 { ETHERTYPE_MPCP, "MPCP" },
The Android Open Source Project2949f582009-03-03 19:30:46 -080068 { ETHERTYPE_SLOW, "Slow Protocols" },
69 { ETHERTYPE_PPPOED, "PPPoE D" },
70 { ETHERTYPE_PPPOES, "PPPoE S" },
71 { ETHERTYPE_EAPOL, "EAPOL" },
JP Abgrall53f17a92014-02-12 14:02:41 -080072 { ETHERTYPE_RRCP, "RRCP" },
73 { ETHERTYPE_MS_NLB_HB, "MS NLB heartbeat" },
The Android Open Source Project2949f582009-03-03 19:30:46 -080074 { ETHERTYPE_JUMBO, "Jumbo" },
75 { ETHERTYPE_LOOPBACK, "Loopback" },
76 { ETHERTYPE_ISO, "OSI" },
77 { ETHERTYPE_GRE_ISO, "GRE-OSI" },
JP Abgrall53f17a92014-02-12 14:02:41 -080078 { ETHERTYPE_CFM_OLD, "CFM (old)" },
79 { ETHERTYPE_CFM, "CFM" },
Elliott Hughes892a68b2015-10-19 14:43:53 -070080 { ETHERTYPE_IEEE1905_1, "IEEE1905.1" },
JP Abgrall53f17a92014-02-12 14:02:41 -080081 { ETHERTYPE_LLDP, "LLDP" },
Elliott Hughes892a68b2015-10-19 14:43:53 -070082 { ETHERTYPE_TIPC, "TIPC"},
JP Abgrall53f17a92014-02-12 14:02:41 -080083 { ETHERTYPE_GEONET_OLD, "GeoNet (old)"},
84 { ETHERTYPE_GEONET, "GeoNet"},
85 { ETHERTYPE_CALM_FAST, "CALM FAST"},
Elliott Hughes892a68b2015-10-19 14:43:53 -070086 { ETHERTYPE_AOE, "AoE" },
Elliott Hughese2e3bd12017-05-15 10:59:29 -070087 { ETHERTYPE_MEDSA, "MEDSA" },
The Android Open Source Project2949f582009-03-03 19:30:46 -080088 { 0, NULL}
89};
90
91static inline void
JP Abgrall53f17a92014-02-12 14:02:41 -080092ether_hdr_print(netdissect_options *ndo,
93 const u_char *bp, u_int length)
The Android Open Source Project2949f582009-03-03 19:30:46 -080094{
95 register const struct ether_header *ep;
Elliott Hughese2e3bd12017-05-15 10:59:29 -070096 uint16_t length_type;
JP Abgrall53f17a92014-02-12 14:02:41 -080097
The Android Open Source Project2949f582009-03-03 19:30:46 -080098 ep = (const struct ether_header *)bp;
99
Elliott Hughes892a68b2015-10-19 14:43:53 -0700100 ND_PRINT((ndo, "%s > %s",
101 etheraddr_string(ndo, ESRC(ep)),
102 etheraddr_string(ndo, EDST(ep))));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800103
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700104 length_type = EXTRACT_16BITS(&ep->ether_length_type);
JP Abgrall53f17a92014-02-12 14:02:41 -0800105 if (!ndo->ndo_qflag) {
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700106 if (length_type <= ETHERMTU) {
107 ND_PRINT((ndo, ", 802.3"));
108 length = length_type;
109 } else
110 ND_PRINT((ndo, ", ethertype %s (0x%04x)",
111 tok2str(ethertype_values,"Unknown", length_type),
112 length_type));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800113 } else {
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700114 if (length_type <= ETHERMTU) {
115 ND_PRINT((ndo, ", 802.3"));
116 length = length_type;
117 } else
118 ND_PRINT((ndo, ", %s", tok2str(ethertype_values,"Unknown Ethertype (0x%04x)", length_type)));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800119 }
120
Elliott Hughes892a68b2015-10-19 14:43:53 -0700121 ND_PRINT((ndo, ", length %u: ", length));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800122}
123
JP Abgrall53f17a92014-02-12 14:02:41 -0800124/*
125 * Print an Ethernet frame.
126 * This might be encapsulated within another frame; we might be passed
127 * a pointer to a function that can print header information for that
128 * frame's protocol, and an argument to pass to that function.
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700129 *
130 * FIXME: caplen can and should be derived from ndo->ndo_snapend and p.
JP Abgrall53f17a92014-02-12 14:02:41 -0800131 */
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700132u_int
JP Abgrall53f17a92014-02-12 14:02:41 -0800133ether_print(netdissect_options *ndo,
134 const u_char *p, u_int length, u_int caplen,
135 void (*print_encap_header)(netdissect_options *ndo, const u_char *), const u_char *encap_header_arg)
The Android Open Source Project2949f582009-03-03 19:30:46 -0800136{
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700137 const struct ether_header *ep;
JP Abgrall53f17a92014-02-12 14:02:41 -0800138 u_int orig_length;
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700139 u_short length_type;
140 u_int hdrlen;
141 int llc_hdrlen;
142 struct lladdr_info src, dst;
The Android Open Source Project2949f582009-03-03 19:30:46 -0800143
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700144 if (caplen < ETHER_HDRLEN) {
JP Abgrall53f17a92014-02-12 14:02:41 -0800145 ND_PRINT((ndo, "[|ether]"));
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700146 return (caplen);
147 }
148 if (length < ETHER_HDRLEN) {
149 ND_PRINT((ndo, "[|ether]"));
150 return (length);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800151 }
152
JP Abgrall53f17a92014-02-12 14:02:41 -0800153 if (ndo->ndo_eflag) {
154 if (print_encap_header != NULL)
155 (*print_encap_header)(ndo, encap_header_arg);
156 ether_hdr_print(ndo, p, length);
157 }
158 orig_length = length;
The Android Open Source Project2949f582009-03-03 19:30:46 -0800159
160 length -= ETHER_HDRLEN;
161 caplen -= ETHER_HDRLEN;
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700162 ep = (const struct ether_header *)p;
The Android Open Source Project2949f582009-03-03 19:30:46 -0800163 p += ETHER_HDRLEN;
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700164 hdrlen = ETHER_HDRLEN;
The Android Open Source Project2949f582009-03-03 19:30:46 -0800165
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700166 src.addr = ESRC(ep);
167 src.addr_string = etheraddr_string;
168 dst.addr = EDST(ep);
169 dst.addr_string = etheraddr_string;
170 length_type = EXTRACT_16BITS(&ep->ether_length_type);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800171
JP Abgrall53f17a92014-02-12 14:02:41 -0800172recurse:
The Android Open Source Project2949f582009-03-03 19:30:46 -0800173 /*
174 * Is it (gag) an 802.3 encapsulation?
175 */
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700176 if (length_type <= ETHERMTU) {
The Android Open Source Project2949f582009-03-03 19:30:46 -0800177 /* Try to print the LLC-layer header & higher layers */
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700178 llc_hdrlen = llc_print(ndo, p, length, caplen, &src, &dst);
179 if (llc_hdrlen < 0) {
180 /* packet type not known, print raw packet */
JP Abgrall53f17a92014-02-12 14:02:41 -0800181 if (!ndo->ndo_suppress_default_print)
Elliott Hughes892a68b2015-10-19 14:43:53 -0700182 ND_DEFAULTPRINT(p, caplen);
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700183 llc_hdrlen = -llc_hdrlen;
The Android Open Source Project2949f582009-03-03 19:30:46 -0800184 }
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700185 hdrlen += llc_hdrlen;
186 } else if (length_type == ETHERTYPE_8021Q ||
187 length_type == ETHERTYPE_8021Q9100 ||
188 length_type == ETHERTYPE_8021Q9200 ||
189 length_type == ETHERTYPE_8021QinQ) {
JP Abgrall53f17a92014-02-12 14:02:41 -0800190 /*
191 * Print VLAN information, and then go back and process
192 * the enclosed type field.
193 */
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700194 if (caplen < 4) {
JP Abgrall53f17a92014-02-12 14:02:41 -0800195 ND_PRINT((ndo, "[|vlan]"));
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700196 return (hdrlen + caplen);
197 }
198 if (length < 4) {
199 ND_PRINT((ndo, "[|vlan]"));
200 return (hdrlen + length);
JP Abgrall53f17a92014-02-12 14:02:41 -0800201 }
202 if (ndo->ndo_eflag) {
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700203 uint16_t tag = EXTRACT_16BITS(p);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800204
Elliott Hughes892a68b2015-10-19 14:43:53 -0700205 ND_PRINT((ndo, "%s, ", ieee8021q_tci_string(tag)));
JP Abgrall53f17a92014-02-12 14:02:41 -0800206 }
207
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700208 length_type = EXTRACT_16BITS(p + 2);
209 if (ndo->ndo_eflag && length_type > ETHERMTU)
210 ND_PRINT((ndo, "ethertype %s, ", tok2str(ethertype_values,"0x%04x", length_type)));
JP Abgrall53f17a92014-02-12 14:02:41 -0800211 p += 4;
212 length -= 4;
213 caplen -= 4;
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700214 hdrlen += 4;
JP Abgrall53f17a92014-02-12 14:02:41 -0800215 goto recurse;
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700216 } else if (length_type == ETHERTYPE_JUMBO) {
JP Abgrall53f17a92014-02-12 14:02:41 -0800217 /*
218 * Alteon jumbo frames.
219 * See
220 *
221 * http://tools.ietf.org/html/draft-ietf-isis-ext-eth-01
222 *
223 * which indicates that, following the type field,
224 * there's an LLC header and payload.
225 */
226 /* Try to print the LLC-layer header & higher layers */
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700227 llc_hdrlen = llc_print(ndo, p, length, caplen, &src, &dst);
228 if (llc_hdrlen < 0) {
229 /* packet type not known, print raw packet */
JP Abgrall53f17a92014-02-12 14:02:41 -0800230 if (!ndo->ndo_suppress_default_print)
Elliott Hughes892a68b2015-10-19 14:43:53 -0700231 ND_DEFAULTPRINT(p, caplen);
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700232 llc_hdrlen = -llc_hdrlen;
JP Abgrall53f17a92014-02-12 14:02:41 -0800233 }
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700234 hdrlen += llc_hdrlen;
JP Abgrall53f17a92014-02-12 14:02:41 -0800235 } else {
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700236 if (ethertype_print(ndo, length_type, p, length, caplen, &src, &dst) == 0) {
237 /* type not known, print raw packet */
JP Abgrall53f17a92014-02-12 14:02:41 -0800238 if (!ndo->ndo_eflag) {
239 if (print_encap_header != NULL)
240 (*print_encap_header)(ndo, encap_header_arg);
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700241 ether_hdr_print(ndo, (const u_char *)ep, orig_length);
JP Abgrall53f17a92014-02-12 14:02:41 -0800242 }
243
244 if (!ndo->ndo_suppress_default_print)
Elliott Hughes892a68b2015-10-19 14:43:53 -0700245 ND_DEFAULTPRINT(p, caplen);
JP Abgrall53f17a92014-02-12 14:02:41 -0800246 }
247 }
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700248 return (hdrlen);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800249}
250
251/*
252 * This is the top level routine of the printer. 'p' points
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700253 * to the ether header of the packet, 'h->len' is the length
254 * of the packet off the wire, and 'h->caplen' is the number
255 * of bytes actually captured.
The Android Open Source Project2949f582009-03-03 19:30:46 -0800256 */
257u_int
JP Abgrall53f17a92014-02-12 14:02:41 -0800258ether_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h,
259 const u_char *p)
The Android Open Source Project2949f582009-03-03 19:30:46 -0800260{
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700261 return (ether_print(ndo, p, h->len, h->caplen, NULL, NULL));
The Android Open Source Project2949f582009-03-03 19:30:46 -0800262}
263
264/*
JP Abgrall53f17a92014-02-12 14:02:41 -0800265 * This is the top level routine of the printer. 'p' points
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700266 * to the ether header of the packet, 'h->len' is the length
267 * of the packet off the wire, and 'h->caplen' is the number
268 * of bytes actually captured.
JP Abgrall53f17a92014-02-12 14:02:41 -0800269 *
270 * This is for DLT_NETANALYZER, which has a 4-byte pseudo-header
271 * before the Ethernet header.
272 */
273u_int
274netanalyzer_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h,
275 const u_char *p)
276{
277 /*
278 * Fail if we don't have enough data for the Hilscher pseudo-header.
279 */
280 if (h->len < 4 || h->caplen < 4) {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700281 ND_PRINT((ndo, "[|netanalyzer]"));
JP Abgrall53f17a92014-02-12 14:02:41 -0800282 return (h->caplen);
283 }
284
285 /* Skip the pseudo-header. */
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700286 return (4 + ether_print(ndo, p + 4, h->len - 4, h->caplen - 4, NULL, NULL));
JP Abgrall53f17a92014-02-12 14:02:41 -0800287}
288
289/*
290 * This is the top level routine of the printer. 'p' points
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700291 * to the ether header of the packet, 'h->len' is the length
292 * of the packet off the wire, and 'h->caplen' is the number
293 * of bytes actually captured.
JP Abgrall53f17a92014-02-12 14:02:41 -0800294 *
295 * This is for DLT_NETANALYZER_TRANSPARENT, which has a 4-byte
296 * pseudo-header, a 7-byte Ethernet preamble, and a 1-byte Ethernet SOF
297 * before the Ethernet header.
298 */
299u_int
300netanalyzer_transparent_if_print(netdissect_options *ndo,
301 const struct pcap_pkthdr *h,
302 const u_char *p)
303{
304 /*
305 * Fail if we don't have enough data for the Hilscher pseudo-header,
306 * preamble, and SOF.
307 */
308 if (h->len < 12 || h->caplen < 12) {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700309 ND_PRINT((ndo, "[|netanalyzer-transparent]"));
JP Abgrall53f17a92014-02-12 14:02:41 -0800310 return (h->caplen);
311 }
312
313 /* Skip the pseudo-header, preamble, and SOF. */
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700314 return (12 + ether_print(ndo, p + 12, h->len - 12, h->caplen - 12, NULL, NULL));
JP Abgrall53f17a92014-02-12 14:02:41 -0800315}
316
317/*
318 * Prints the packet payload, given an Ethernet type code for the payload's
319 * protocol.
The Android Open Source Project2949f582009-03-03 19:30:46 -0800320 *
321 * Returns non-zero if it can do so, zero if the ethertype is unknown.
The Android Open Source Project2949f582009-03-03 19:30:46 -0800322 */
323
324int
JP Abgrall53f17a92014-02-12 14:02:41 -0800325ethertype_print(netdissect_options *ndo,
326 u_short ether_type, const u_char *p,
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700327 u_int length, u_int caplen,
328 const struct lladdr_info *src, const struct lladdr_info *dst)
The Android Open Source Project2949f582009-03-03 19:30:46 -0800329{
The Android Open Source Project2949f582009-03-03 19:30:46 -0800330 switch (ether_type) {
331
332 case ETHERTYPE_IP:
JP Abgrall53f17a92014-02-12 14:02:41 -0800333 ip_print(ndo, p, length);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800334 return (1);
335
The Android Open Source Project2949f582009-03-03 19:30:46 -0800336 case ETHERTYPE_IPV6:
JP Abgrall53f17a92014-02-12 14:02:41 -0800337 ip6_print(ndo, p, length);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800338 return (1);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800339
340 case ETHERTYPE_ARP:
341 case ETHERTYPE_REVARP:
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700342 arp_print(ndo, p, length, caplen);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800343 return (1);
344
345 case ETHERTYPE_DN:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700346 decnet_print(ndo, p, length, caplen);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800347 return (1);
348
349 case ETHERTYPE_ATALK:
JP Abgrall53f17a92014-02-12 14:02:41 -0800350 if (ndo->ndo_vflag)
Elliott Hughes892a68b2015-10-19 14:43:53 -0700351 ND_PRINT((ndo, "et1 "));
352 atalk_print(ndo, p, length);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800353 return (1);
354
355 case ETHERTYPE_AARP:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700356 aarp_print(ndo, p, length);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800357 return (1);
358
359 case ETHERTYPE_IPX:
JP Abgrall53f17a92014-02-12 14:02:41 -0800360 ND_PRINT((ndo, "(NOV-ETHII) "));
Elliott Hughes892a68b2015-10-19 14:43:53 -0700361 ipx_print(ndo, p, length);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800362 return (1);
363
Elliott Hughes892a68b2015-10-19 14:43:53 -0700364 case ETHERTYPE_ISO:
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700365 if (length == 0 || caplen == 0) {
366 ND_PRINT((ndo, " [|osi]"));
367 return (1);
368 }
Elliott Hughescec480a2017-12-19 16:54:57 -0800369 isoclns_print(ndo, p + 1, length - 1);
Elliott Hughes892a68b2015-10-19 14:43:53 -0700370 return(1);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800371
372 case ETHERTYPE_PPPOED:
373 case ETHERTYPE_PPPOES:
JP Abgrall53f17a92014-02-12 14:02:41 -0800374 case ETHERTYPE_PPPOED2:
375 case ETHERTYPE_PPPOES2:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700376 pppoe_print(ndo, p, length);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800377 return (1);
378
379 case ETHERTYPE_EAPOL:
JP Abgrall53f17a92014-02-12 14:02:41 -0800380 eap_print(ndo, p, length);
381 return (1);
382
383 case ETHERTYPE_RRCP:
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700384 rrcp_print(ndo, p, length, src, dst);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800385 return (1);
386
387 case ETHERTYPE_PPP:
388 if (length) {
Elliott Hughes892a68b2015-10-19 14:43:53 -0700389 ND_PRINT((ndo, ": "));
390 ppp_print(ndo, p, length);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800391 }
392 return (1);
393
JP Abgrall53f17a92014-02-12 14:02:41 -0800394 case ETHERTYPE_MPCP:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700395 mpcp_print(ndo, p, length);
JP Abgrall53f17a92014-02-12 14:02:41 -0800396 return (1);
397
The Android Open Source Project2949f582009-03-03 19:30:46 -0800398 case ETHERTYPE_SLOW:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700399 slow_print(ndo, p, length);
JP Abgrall53f17a92014-02-12 14:02:41 -0800400 return (1);
401
402 case ETHERTYPE_CFM:
403 case ETHERTYPE_CFM_OLD:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700404 cfm_print(ndo, p, length);
JP Abgrall53f17a92014-02-12 14:02:41 -0800405 return (1);
406
407 case ETHERTYPE_LLDP:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700408 lldp_print(ndo, p, length);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800409 return (1);
410
411 case ETHERTYPE_LOOPBACK:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700412 loopback_print(ndo, p, length);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800413 return (1);
414
415 case ETHERTYPE_MPLS:
416 case ETHERTYPE_MPLS_MULTI:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700417 mpls_print(ndo, p, length);
The Android Open Source Project2949f582009-03-03 19:30:46 -0800418 return (1);
419
JP Abgrall53f17a92014-02-12 14:02:41 -0800420 case ETHERTYPE_TIPC:
421 tipc_print(ndo, p, length, caplen);
422 return (1);
423
424 case ETHERTYPE_MS_NLB_HB:
425 msnlb_print(ndo, p);
426 return (1);
427
428 case ETHERTYPE_GEONET_OLD:
429 case ETHERTYPE_GEONET:
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700430 geonet_print(ndo, p, length, src);
JP Abgrall53f17a92014-02-12 14:02:41 -0800431 return (1);
432
433 case ETHERTYPE_CALM_FAST:
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700434 calm_fast_print(ndo, p, length, src);
JP Abgrall53f17a92014-02-12 14:02:41 -0800435 return (1);
436
Elliott Hughes892a68b2015-10-19 14:43:53 -0700437 case ETHERTYPE_AOE:
438 aoe_print(ndo, p, length);
439 return (1);
440
Elliott Hughese2e3bd12017-05-15 10:59:29 -0700441 case ETHERTYPE_MEDSA:
442 medsa_print(ndo, p, length, caplen, src, dst);
443 return (1);
444
The Android Open Source Project2949f582009-03-03 19:30:46 -0800445 case ETHERTYPE_LAT:
446 case ETHERTYPE_SCA:
447 case ETHERTYPE_MOPRC:
448 case ETHERTYPE_MOPDL:
Elliott Hughes892a68b2015-10-19 14:43:53 -0700449 case ETHERTYPE_IEEE1905_1:
The Android Open Source Project2949f582009-03-03 19:30:46 -0800450 /* default_print for now */
451 default:
452 return (0);
453 }
454}
455
456
457/*
458 * Local Variables:
459 * c-style: whitesmith
460 * c-basic-offset: 8
461 * End:
462 */
463