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