X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/1cead823ec6b407886002fbe160d31d70fcf4412..bc619816f47834be0f699a05b4ce8048e027238b:/print-ether.c diff --git a/print-ether.c b/print-ether.c index dc6e78cb..76505721 100644 --- a/print-ether.c +++ b/print-ether.c @@ -46,6 +46,9 @@ const struct tok ethertype_values[] = { { ETHERTYPE_MPLS_MULTI, "MPLS multicast" }, { ETHERTYPE_IPV6, "IPv6" }, { ETHERTYPE_8021Q, "802.1Q" }, + { ETHERTYPE_8021Q9100, "802.1Q-9100" }, + { ETHERTYPE_8021QinQ, "802.1Q-QinQ" }, + { ETHERTYPE_8021Q9200, "802.1Q-9200" }, { ETHERTYPE_VMAN, "VMAN" }, { ETHERTYPE_PUP, "PUP" }, { ETHERTYPE_ARP, "ARP"}, @@ -93,26 +96,26 @@ ether_hdr_print(netdissect_options *ndo, ep = (const struct ether_header *)bp; - (void)printf("%s > %s", + (void)ND_PRINT((ndo, "%s > %s", etheraddr_string(ESRC(ep)), - etheraddr_string(EDST(ep))); + etheraddr_string(EDST(ep)))); ether_type = EXTRACT_16BITS(&ep->ether_type); if (!ndo->ndo_qflag) { if (ether_type <= ETHERMTU) - (void)printf(", 802.3"); + (void)ND_PRINT((ndo, ", 802.3")); else - (void)printf(", ethertype %s (0x%04x)", + (void)ND_PRINT((ndo, ", ethertype %s (0x%04x)", tok2str(ethertype_values,"Unknown", ether_type), - ether_type); + ether_type)); } else { if (ether_type <= ETHERMTU) - (void)printf(", 802.3"); + (void)ND_PRINT((ndo, ", 802.3")); else - (void)printf(", %s", tok2str(ethertype_values,"Unknown Ethertype (0x%04x)", ether_type)); + (void)ND_PRINT((ndo, ", %s", tok2str(ethertype_values,"Unknown Ethertype (0x%04x)", ether_type))); } - (void)printf(", length %u: ", length); + (void)ND_PRINT((ndo, ", length %u: ", length)); } /* @@ -132,7 +135,7 @@ ether_print(netdissect_options *ndo, u_short extracted_ether_type; if (caplen < ETHER_HDRLEN || length < ETHER_HDRLEN) { - printf("[|ether]"); + ND_PRINT((ndo, "[|ether]")); return; } @@ -168,27 +171,30 @@ recurse: if (!ndo->ndo_suppress_default_print) ndo->ndo_default_print(ndo, p, caplen); } - } else if (ether_type == ETHERTYPE_8021Q) { + } else if (ether_type == ETHERTYPE_8021Q || + ether_type == ETHERTYPE_8021Q9100 || + ether_type == ETHERTYPE_8021Q9200 || + ether_type == ETHERTYPE_8021QinQ) { /* * Print VLAN information, and then go back and process * the enclosed type field. */ if (caplen < 4 || length < 4) { - printf("[|vlan]"); + ND_PRINT((ndo, "[|vlan]")); return; } if (ndo->ndo_eflag) { u_int16_t tag = EXTRACT_16BITS(p); - printf("vlan %u, p %u%s, ", + ND_PRINT((ndo, "vlan %u, p %u%s, ", tag & 0xfff, tag >> 13, - (tag & 0x1000) ? ", CFI" : ""); + (tag & 0x1000) ? ", CFI" : "")); } ether_type = EXTRACT_16BITS(p + 2); if (ndo->ndo_eflag && ether_type > ETHERMTU) - printf("ethertype %s, ", tok2str(ethertype_values,"0x%04x", ether_type)); + ND_PRINT((ndo, "ethertype %s, ", tok2str(ethertype_values,"0x%04x", ether_type))); p += 4; length -= 4; caplen -= 4; @@ -246,6 +252,63 @@ ether_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, return (ETHER_HDRLEN); } +/* + * This is the top level routine of the printer. 'p' points + * to the ether header of the packet, 'h->ts' is the timestamp, + * 'h->len' is the length of the packet off the wire, and 'h->caplen' + * is the number of bytes actually captured. + * + * This is for DLT_NETANALYZER, which has a 4-byte pseudo-header + * before the Ethernet header. + */ +u_int +netanalyzer_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h, + const u_char *p) +{ + /* + * Fail if we don't have enough data for the Hilscher pseudo-header. + */ + if (h->len < 4 || h->caplen < 4) { + printf("[|netanalyzer]"); + return (h->caplen); + } + + /* Skip the pseudo-header. */ + ether_print(ndo, p + 4, h->len - 4, h->caplen - 4, NULL, NULL); + + return (4 + ETHER_HDRLEN); +} + +/* + * This is the top level routine of the printer. 'p' points + * to the ether header of the packet, 'h->ts' is the timestamp, + * 'h->len' is the length of the packet off the wire, and 'h->caplen' + * is the number of bytes actually captured. + * + * This is for DLT_NETANALYZER_TRANSPARENT, which has a 4-byte + * pseudo-header, a 7-byte Ethernet preamble, and a 1-byte Ethernet SOF + * before the Ethernet header. + */ +u_int +netanalyzer_transparent_if_print(netdissect_options *ndo, + const struct pcap_pkthdr *h, + const u_char *p) +{ + /* + * Fail if we don't have enough data for the Hilscher pseudo-header, + * preamble, and SOF. + */ + if (h->len < 12 || h->caplen < 12) { + printf("[|netanalyzer-transparent]"); + return (h->caplen); + } + + /* Skip the pseudo-header, preamble, and SOF. */ + ether_print(ndo, p + 12, h->len - 12, h->caplen - 12, NULL, NULL); + + return (12 + ETHER_HDRLEN); +} + /* * Prints the packet payload, given an Ethernet type code for the payload's * protocol. @@ -266,7 +329,7 @@ ethertype_print(netdissect_options *ndo, #ifdef INET6 case ETHERTYPE_IPV6: - ip6_print(/*ndo,*/ p, length); + ip6_print(ndo, p, length); return (1); #endif /*INET6*/ @@ -290,7 +353,7 @@ ethertype_print(netdissect_options *ndo, return (1); case ETHERTYPE_IPX: - printf("(NOV-ETHII) "); + ND_PRINT((ndo, "(NOV-ETHII) ")); ipx_print(/*ndo,*/p, length); return (1);