X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/10bdeb0c44eb4a997645ebdc15376fb36f9d3ae2..bc619816f47834be0f699a05b4ce8048e027238b:/print-ether.c diff --git a/print-ether.c b/print-ether.c index 8727bff5..76505721 100644 --- a/print-ether.c +++ b/print-ether.c @@ -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.