X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/28b293f330d5afdff9a127c0781dadda576602d5..a945058fa79c1bba7adf12268d9d2baa56e35316:/print-ether.c diff --git a/print-ether.c b/print-ether.c index 437b9160..e2f487c2 100644 --- a/print-ether.c +++ b/print-ether.c @@ -37,7 +37,6 @@ static const char rcsid[] _U_ = #include "extract.h" #include "addrtoname.h" #include "ethertype.h" - #include "ether.h" const struct tok ethertype_values[] = { @@ -84,6 +83,7 @@ const struct tok ethertype_values[] = { { ETHERTYPE_CFM_OLD, "CFM (old)" }, { ETHERTYPE_CFM, "CFM" }, { ETHERTYPE_LLDP, "LLDP" }, + { ETHERTYPE_TIPC, "TIPC"}, { 0, NULL} }; @@ -96,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)); } /* @@ -135,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; } @@ -180,21 +180,21 @@ recurse: * 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; @@ -252,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. @@ -272,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*/ @@ -296,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); @@ -351,6 +408,10 @@ ethertype_print(netdissect_options *ndo, mpls_print(/*ndo,*/p, length); return (1); + case ETHERTYPE_TIPC: + tipc_print(ndo, p, length, caplen); + return (1); + case ETHERTYPE_LAT: case ETHERTYPE_SCA: case ETHERTYPE_MOPRC: