12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1992, 1993, 1994, 1995, 1996, 1997
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2)
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement:
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California,
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission.
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Code by Matt Thomas, Digital Equipment Corporation
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	with an awful lot of hacking by Jeffrey Mogul, DECWRL
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
2753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    "@(#) $Header: /tcpdump/master/tcpdump/print-llc.c,v 1.75 2007-04-13 09:43:11 hannes Exp $";
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"			/* must come after interface.h */
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "llc.h"
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ethertype.h"
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "oui.h"
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok llc_values[] = {
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLCSAP_NULL,     "Null" },
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLCSAP_GLOBAL,   "Global" },
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLCSAP_8021B_I,  "802.1B I" },
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLCSAP_8021B_G,  "802.1B G" },
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLCSAP_IP,       "IP" },
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLCSAP_SNA,      "SNA" },
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLCSAP_PROWAYNM, "ProWay NM" },
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLCSAP_8021D,    "STP" },
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLCSAP_RS511,    "RS511" },
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLCSAP_ISO8208,  "ISO8208" },
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLCSAP_PROWAY,   "ProWay" },
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLCSAP_SNAP,     "SNAP" },
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLCSAP_IPX,      "IPX" },
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLCSAP_NETBEUI,  "NetBeui" },
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLCSAP_ISONS,    "OSI" },
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { 0,               NULL },
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
6653f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok llc_cmd_values[] = {
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ LLC_UI,	"ui" },
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ LLC_TEST,	"test" },
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ LLC_XID,	"xid" },
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ LLC_UA,	"ua" },
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ LLC_DISC,	"disc" },
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ LLC_DM,	"dm" },
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ LLC_SABME,	"sabme" },
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ LLC_FRMR,	"frmr" },
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,		NULL }
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok llc_flag_values[] = {
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { 0, "Command" },
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLC_GSAP, "Response" },
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLC_U_POLL, "Poll" },
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLC_GSAP|LLC_U_POLL, "Final" },
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLC_IS_POLL, "Poll" },
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLC_GSAP|LLC_IS_POLL, "Final" },
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0, NULL }
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok llc_ig_flag_values[] = {
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { 0, "Individual" },
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { LLC_IG, "Group" },
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0, NULL }
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok llc_supervisory_values[] = {
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { 0, "Receiver Ready" },
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { 1, "Receiver not Ready" },
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        { 2, "Reject" },
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,             NULL }
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok cisco_values[] = {
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ PID_CISCO_CDP, "CDP" },
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ PID_CISCO_VTP, "VTP" },
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ PID_CISCO_DTP, "DTP" },
10853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ PID_CISCO_UDLD, "UDLD" },
10953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ PID_CISCO_PVST, "PVST" },
11053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{ PID_CISCO_VLANBRIDGE, "VLAN Bridge" },
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,             NULL }
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok bridged_values[] = {
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ PID_RFC2684_ETH_FCS,     "Ethernet + FCS" },
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ PID_RFC2684_ETH_NOFCS,   "Ethernet w/o FCS" },
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ PID_RFC2684_802_4_FCS,   "802.4 + FCS" },
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ PID_RFC2684_802_4_NOFCS, "802.4 w/o FCS" },
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ PID_RFC2684_802_5_FCS,   "Token Ring + FCS" },
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ PID_RFC2684_802_5_NOFCS, "Token Ring w/o FCS" },
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ PID_RFC2684_FDDI_FCS,    "FDDI + FCS" },
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ PID_RFC2684_FDDI_NOFCS,  "FDDI w/o FCS" },
1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ PID_RFC2684_802_6_FCS,   "802.6 + FCS" },
1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ PID_RFC2684_802_6_NOFCS, "802.6 w/o FCS" },
1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ PID_RFC2684_BPDU,        "BPDU" },
1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,                       NULL },
1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct tok null_values[] = {
1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0,             NULL }
1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct oui_tok {
1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t	oui;
1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	const struct tok *tok;
1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const struct oui_tok oui_to_tok[] = {
1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ OUI_ENCAP_ETHER, ethertype_values },
1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ OUI_CISCO_90, ethertype_values },	/* uses some Ethertype values */
1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ OUI_APPLETALK, ethertype_values },	/* uses some Ethertype values */
1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ OUI_CISCO, cisco_values },
1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ OUI_RFC2684, bridged_values },	/* bridged, RFC 2427 FR or RFC 2864 ATM */
1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	{ 0, NULL }
1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Returns non-zero IFF it succeeds in printing the header
1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint
1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectllc_print(const u_char *p, u_int length, u_int caplen,
1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	  const u_char *esrc, const u_char *edst, u_short *extracted_ethertype)
1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t dsap_field, dsap, ssap_field, ssap;
1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int16_t control;
1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int is_u;
1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int ret;
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	*extracted_ethertype = 0;
1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (caplen < 3) {
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("[|llc]");
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		default_print((u_char *)p, caplen);
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return(0);
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dsap_field = *p;
1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ssap_field = *(p + 1);
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * OK, what type of LLC frame is this?  The length
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * of the control field depends on that - I frames
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * have a two-byte control field, and U frames have
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * a one-byte control field.
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	control = *(p + 2);
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if ((control & LLC_U_FMT) == LLC_U_FMT) {
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * U frame.
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		is_u = 1;
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * The control field in I and S frames is
1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * 2 bytes...
1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (caplen < 4) {
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("[|llc]");
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			default_print((u_char *)p, caplen);
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return(0);
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * ...and is little-endian.
1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		control = EXTRACT_LE_16BITS(p + 2);
1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		is_u = 0;
1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ssap_field == LLCSAP_GLOBAL && dsap_field == LLCSAP_GLOBAL) {
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * This is an Ethernet_802.3 IPX frame; it has an
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * 802.3 header (i.e., an Ethernet header where the
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * type/length field is <= ETHERMTU, i.e. it's a length
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * field, not a type field), but has no 802.2 header -
2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * the IPX packet starts right after the Ethernet header,
2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * with a signature of two bytes of 0xFF (which is
2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * LLCSAP_GLOBAL).
2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 *
2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * (It might also have been an Ethernet_802.3 IPX at
2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * one time, but got bridged onto another network,
2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * such as an 802.11 network; this has appeared in at
2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * least one capture file.)
2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            if (eflag)
2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("IPX 802.3: ");
2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            ipx_print(p, length);
2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project            return (1);
2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	dsap = dsap_field & ~LLC_IG;
2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ssap = ssap_field & ~LLC_GSAP;
2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (eflag) {
2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                printf("LLC, dsap %s (0x%02x) %s, ssap %s (0x%02x) %s",
2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       tok2str(llc_values, "Unknown", dsap),
2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       dsap,
2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       tok2str(llc_ig_flag_values, "Unknown", dsap_field & LLC_IG),
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       tok2str(llc_values, "Unknown", ssap),
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       ssap,
2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       tok2str(llc_flag_values, "Unknown", ssap_field & LLC_GSAP));
2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (is_u) {
2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(", ctrl 0x%02x: ", control);
2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			printf(", ctrl 0x%04x: ", control);
2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ssap == LLCSAP_8021D && dsap == LLCSAP_8021D &&
2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    control == LLC_UI) {
2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		stp_print(p+3, length-3);
2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (1);
2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ssap == LLCSAP_IP && dsap == LLCSAP_IP &&
2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    control == LLC_UI) {
2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ip_print(gndo, p+4, length-4);
2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (1);
2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ssap == LLCSAP_IPX && dsap == LLCSAP_IPX &&
2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    control == LLC_UI) {
2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * This is an Ethernet_802.2 IPX frame, with an 802.3
2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * header and an 802.2 LLC header with the source and
2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * destination SAPs being the IPX SAP.
2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 *
2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Skip DSAP, LSAP, and control field.
2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (eflag)
2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                        printf("IPX 802.2: ");
2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		ipx_print(p+3, length-3);
2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (1);
2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef TCPDUMP_DO_SMB
2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ssap == LLCSAP_NETBEUI && dsap == LLCSAP_NETBEUI
2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    && (!(control & LLC_S_FMT) || control == LLC_U_FMT)) {
2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * we don't actually have a full netbeui parser yet, but the
2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * smb parser can handle many smb-in-netbeui packets, which
2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * is very useful, so we call that
2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 *
2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * We don't call it for S frames, however, just I frames
2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * (which are frames that don't have the low-order bit,
2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * LLC_S_FMT, set in the first byte of the control field)
2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * and UI frames (whose control field is just 3, LLC_U_FMT).
2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Skip the LLC header.
2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (is_u) {
2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			p += 3;
2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			length -= 3;
2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			caplen -= 3;
2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			p += 4;
2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			length -= 4;
2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			caplen -= 4;
2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		netbeui_print(control, p, length);
2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (1);
2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ssap == LLCSAP_ISONS && dsap == LLCSAP_ISONS
3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    && control == LLC_UI) {
3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		isoclns_print(p + 3, length - 3, caplen - 3);
3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return (1);
3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ssap == LLCSAP_SNAP && dsap == LLCSAP_SNAP
3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    && control == LLC_UI) {
3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * XXX - what *is* the right bridge pad value here?
3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Does anybody ever bridge one form of LAN traffic
3112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * over a networking type that uses 802.2 LLC?
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
31353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ret = snap_print(p+3, length-3, caplen-3, 2);
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (ret)
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return (ret);
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!eflag) {
3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (ssap == dsap) {
3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (esrc == NULL || edst == NULL)
3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("%s ", tok2str(llc_values, "Unknown DSAP 0x%02x", dsap));
3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else
3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("%s > %s %s ",
3242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						etheraddr_string(esrc),
3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						etheraddr_string(edst),
3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project						tok2str(llc_values, "Unknown DSAP 0x%02x", dsap));
3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (esrc == NULL || edst == NULL)
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("%s > %s ",
3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                        tok2str(llc_values, "Unknown SSAP 0x%02x", ssap),
3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					tok2str(llc_values, "Unknown DSAP 0x%02x", dsap));
3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			else
3332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				(void)printf("%s %s > %s %s ",
3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					etheraddr_string(esrc),
3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                        tok2str(llc_values, "Unknown SSAP 0x%02x", ssap),
3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					etheraddr_string(edst),
3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project					tok2str(llc_values, "Unknown DSAP 0x%02x", dsap));
3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (is_u) {
3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("Unnumbered, %s, Flags [%s], length %u",
3432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       tok2str(llc_cmd_values, "%02x", LLC_U_CMD(control)),
3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       tok2str(llc_flag_values,"?",(ssap_field & LLC_GSAP) | (control & LLC_U_POLL)),
3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                       length);
3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		p += 3;
3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		length -= 3;
3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		caplen -= 3;
3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((control & ~LLC_U_POLL) == LLC_XID) {
3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (*p == LLC_XID_FI) {
3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				printf(": %02x %02x", p[1], p[2]);
3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				p += 3;
3552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				length -= 3;
3562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				caplen -= 3;
3572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
3582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else {
3602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if ((control & LLC_S_FMT) == LLC_S_FMT) {
3612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("Supervisory, %s, rcv seq %u, Flags [%s], length %u",
3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				tok2str(llc_supervisory_values,"?",LLC_S_CMD(control)),
3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				LLC_IS_NR(control),
3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				tok2str(llc_flag_values,"?",(ssap_field & LLC_GSAP) | (control & LLC_IS_POLL)),
3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                length);
3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		} else {
3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			(void)printf("Information, send seq %u, rcv seq %u, Flags [%s], length %u",
3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				LLC_I_NS(control),
3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				LLC_IS_NR(control),
3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				tok2str(llc_flag_values,"?",(ssap_field & LLC_GSAP) | (control & LLC_IS_POLL)),
3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                length);
3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		p += 4;
3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		length -= 4;
3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		caplen -= 4;
3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return(1);
3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectint
38153f17a9db278d33517d9888dd77848f554522a38JP Abgrallsnap_print(const u_char *p, u_int length, u_int caplen, u_int bridge_pad)
3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int32_t orgcode;
3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register u_short et;
3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register int ret;
3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	TCHECK2(*p, 5);
3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	orgcode = EXTRACT_24BITS(p);
3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	et = EXTRACT_16BITS(p + 3);
3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (eflag) {
3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		const struct tok *tok = null_values;
3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		const struct oui_tok *otp;
3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		for (otp = &oui_to_tok[0]; otp->tok != NULL; otp++) {
3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (otp->oui == orgcode) {
3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				tok = otp->tok;
3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				break;
3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			}
4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		(void)printf("oui %s (0x%06x), %s %s (0x%04x): ",
4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		     tok2str(oui_values, "Unknown", orgcode),
4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		     orgcode,
4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		     (orgcode == 0x000000 ? "ethertype" : "pid"),
4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		     tok2str(tok, "Unknown", et),
4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		     et);
4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p += 5;
4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	length -= 5;
4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	caplen -= 5;
4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	switch (orgcode) {
4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case OUI_ENCAP_ETHER:
4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case OUI_CISCO_90:
4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/*
4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * This is an encapsulated Ethernet packet,
4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * or a packet bridged by some piece of
4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * Cisco hardware; the protocol ID is
4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 * an Ethernet protocol type.
4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		 */
42153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ret = ethertype_print(gndo, et, p, length, caplen);
4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (ret)
4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return (ret);
4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case OUI_APPLETALK:
4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (et == ETHERTYPE_ATALK) {
4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * No, I have no idea why Apple used one
4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * of their own OUIs, rather than
4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * 0x000000, and an Ethernet packet
4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * type, for Appletalk data packets,
4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * but used 0x000000 and an Ethernet
4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * packet type for AARP packets.
4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
43653f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ret = ethertype_print(gndo, et, p, length, caplen);
4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			if (ret)
4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				return (ret);
4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		break;
4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case OUI_CISCO:
44353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                switch (et) {
44453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case PID_CISCO_CDP:
44553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        cdp_print(p, length, caplen);
44653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        return (1);
44753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case PID_CISCO_DTP:
44853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        dtp_print(p, length);
44953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        return (1);
45053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case PID_CISCO_UDLD:
45153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        udld_print(p, length);
45253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        return (1);
45353f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case PID_CISCO_VTP:
45453f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        vtp_print(p, length);
45553f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        return (1);
45653f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case PID_CISCO_PVST:
45753f17a9db278d33517d9888dd77848f554522a38JP Abgrall                case PID_CISCO_VLANBRIDGE:
45853f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        stp_print(p, length);
45953f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        return (1);
46053f17a9db278d33517d9888dd77848f554522a38JP Abgrall                default:
46153f17a9db278d33517d9888dd77848f554522a38JP Abgrall                        break;
46253f17a9db278d33517d9888dd77848f554522a38JP Abgrall                }
4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	case OUI_RFC2684:
4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		switch (et) {
4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case PID_RFC2684_ETH_FCS:
4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case PID_RFC2684_ETH_NOFCS:
4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * XXX - remove the last two bytes for
4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * PID_RFC2684_ETH_FCS?
4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Skip the padding.
4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(*p, bridge_pad);
4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			caplen -= bridge_pad;
4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			length -= bridge_pad;
4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			p += bridge_pad;
4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * What remains is an Ethernet packet.
4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
48453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ether_print(gndo, p, length, caplen, NULL, NULL);
4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return (1);
4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case PID_RFC2684_802_5_FCS:
4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case PID_RFC2684_802_5_NOFCS:
4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * XXX - remove the last two bytes for
4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * PID_RFC2684_ETH_FCS?
4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Skip the padding, but not the Access
4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Control field.
4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(*p, bridge_pad);
4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			caplen -= bridge_pad;
4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			length -= bridge_pad;
5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			p += bridge_pad;
5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * What remains is an 802.5 Token Ring
5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * packet.
5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			token_print(p, length, caplen);
5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return (1);
5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case PID_RFC2684_FDDI_FCS:
5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case PID_RFC2684_FDDI_NOFCS:
5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * XXX - remove the last two bytes for
5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * PID_RFC2684_ETH_FCS?
5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * Skip the padding.
5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			TCHECK2(*p, bridge_pad + 1);
5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			caplen -= bridge_pad + 1;
5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			length -= bridge_pad + 1;
5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			p += bridge_pad + 1;
5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			/*
5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 * What remains is an FDDI packet.
5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			 */
5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			fddi_print(p, length, caplen);
5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return (1);
5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		case PID_RFC2684_BPDU:
5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			stp_print(p, length);
5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			return (1);
5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (0);
5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc:
5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf("[|snap]");
5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (1);
5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Local Variables:
5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-style: whitesmith
5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * c-basic-offset: 8
5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * End:
5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
548