X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/7c7089d732cfbc1c061cfe3fc570e3507abb98ee..d2669e52ae7d1540e7c041e4dfe05176fa9abe8e:/print-ether.c?ds=sidebyside diff --git a/print-ether.c b/print-ether.c index 2704148d..6474f059 100644 --- a/print-ether.c +++ b/print-ether.c @@ -19,8 +19,8 @@ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint -static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/print-ether.c,v 1.81 2003-05-28 12:56:52 hannes Exp $ (LBL)"; +static const char rcsid[] _U_ = + "@(#) $Header: /tcpdump/master/tcpdump/print-ether.c,v 1.90 2004-03-30 14:42:40 mcr Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -40,6 +40,42 @@ static const char rcsid[] = const u_char *snapend; +const struct tok ethertype_values[] = { + { ETHERTYPE_IP, "IPv4" }, + { ETHERTYPE_MPLS, "MPLS unicast" }, + { ETHERTYPE_MPLS_MULTI, "MPLS multicast" }, + { ETHERTYPE_IPV6, "IPv6" }, + { ETHERTYPE_8021Q, "802.1Q" }, + { ETHERTYPE_VMAN, "VMAN" }, + { ETHERTYPE_PUP, "PUP" }, + { ETHERTYPE_ARP, "ARP"}, + { ETHERTYPE_REVARP , "Reverse ARP"}, + { ETHERTYPE_NS, "NS" }, + { ETHERTYPE_SPRITE, "Sprite" }, + { ETHERTYPE_TRAIL, "Trail" }, + { ETHERTYPE_MOPDL, "MOP DL" }, + { ETHERTYPE_MOPRC, "MOP RC" }, + { ETHERTYPE_DN, "DN" }, + { ETHERTYPE_LAT, "LAT" }, + { ETHERTYPE_SCA, "SCA" }, + { ETHERTYPE_LANBRIDGE, "Lanbridge" }, + { ETHERTYPE_DECDNS, "DEC DNS" }, + { ETHERTYPE_DECDTS, "DEC DTS" }, + { ETHERTYPE_VEXP, "VEXP" }, + { ETHERTYPE_VPROD, "VPROD" }, + { ETHERTYPE_ATALK, "Appletalk" }, + { ETHERTYPE_AARP, "Appletalk ARP" }, + { ETHERTYPE_IPX, "IPX" }, + { ETHERTYPE_PPP, "PPP" }, + { ETHERTYPE_PPPOED, "PPPoE D" }, + { ETHERTYPE_PPPOES, "PPPoE S" }, + { ETHERTYPE_EAPOL, "EAPOL" }, + { ETHERTYPE_JUMBO, "Jumbo" }, + { ETHERTYPE_LOOPBACK, "Loopback" }, + { ETHERTYPE_ISO, "OSI" }, + { 0, NULL} +}; + static inline void ether_hdr_print(register const u_char *bp, u_int length) { @@ -54,8 +90,14 @@ ether_hdr_print(register const u_char *bp, u_int length) if (ntohs(ep->ether_type) <= ETHERMTU) (void)printf(", 802.3"); else - (void)printf(", ethertype %s", - tok2str(ethertype_values,"0x%04x", ntohs(ep->ether_type))); + (void)printf(", ethertype %s (0x%04x)", + tok2str(ethertype_values,"Unknown", ntohs(ep->ether_type)), + ntohs(ep->ether_type)); + } else { + if (ntohs(ep->ether_type) <= ETHERMTU) + (void)printf(", 802.3"); + else + (void)printf(", %s", tok2str(ethertype_values,"Unknown Ethertype (0x%04x)", ntohs(ep->ether_type))); } (void)printf(", length %u: ", length); @@ -106,13 +148,13 @@ ether_print(const u_char *p, u_int length, u_int caplen) if (!xflag && !qflag) default_print(p, caplen); - } + } } /* * This is the top level routine of the printer. 'p' points * to the ether header of the packet, 'h->ts' is the timestamp, - * 'h->length' is the length of the packet off the wire, and 'h->caplen' + * 'h->len' is the length of the packet off the wire, and 'h->caplen' * is the number of bytes actually captured. */ u_int @@ -209,11 +251,44 @@ ether_encap_print(u_short ether_type, const u_char *p, return (1); + case ETHERTYPE_JUMBO: + ether_type = ntohs(*(u_int16_t *)(p)); + p += 2; + length -= 2; + caplen -= 2; + + if (ether_type > ETHERMTU) { + if (eflag) + printf("ethertype %s, ", + tok2str(ethertype_values,"0x%04x", ether_type)); + goto recurse; + } + + *extracted_ether_type = 0; + + if (llc_print(p, length, caplen, p - 16, p - 10, + extracted_ether_type) == 0) { + ether_hdr_print(p - 16, length + 2); + } + + if (!xflag && !qflag) + default_print(p - 16, caplen + 2); + + return (1); + + case ETHERTYPE_ISO: + isoclns_print(p+1, length-1, length-1); + return(1); + case ETHERTYPE_PPPOED: case ETHERTYPE_PPPOES: pppoe_print(p, length); return (1); + case ETHERTYPE_EAPOL: + eap_print(gndo, p, length); + return (1); + case ETHERTYPE_PPP: if (length) { printf(": "); @@ -222,7 +297,7 @@ ether_encap_print(u_short ether_type, const u_char *p, return (1); case ETHERTYPE_LOOPBACK: - return (1); + return (0); case ETHERTYPE_MPLS: case ETHERTYPE_MPLS_MULTI: