X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/b2e294e55c363d3f447bdac93a3753be7ea1087e..HEAD:/print-ppi.c diff --git a/print-ppi.c b/print-ppi.c index 04aa1893..0795f276 100644 --- a/print-ppi.c +++ b/print-ppi.c @@ -9,9 +9,7 @@ * https://web.archive.org/web/20160328114748/http://www.cacetech.com/documents/PPI%20Header%20format%201.0.7.pdf */ -#ifdef HAVE_CONFIG_H #include -#endif #include "netdissect-stdinc.h" @@ -57,11 +55,17 @@ ppi_header_print(netdissect_options *ndo, const u_char *bp, u_int length) ND_PRINT(", length %u: ", length); } -static u_int -ppi_print(netdissect_options *ndo, - const struct pcap_pkthdr *h, const u_char *p) +/* + * 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. + */ +void +ppi_if_print(netdissect_options *ndo, + const struct pcap_pkthdr *h, const u_char *p) { - if_printer_t printer; + if_printer printer; const ppi_header_t *hdr; u_int caplen = h->caplen; u_int length = h->len; @@ -73,18 +77,19 @@ ppi_print(netdissect_options *ndo, ndo->ndo_protocol = "ppi"; if (caplen < sizeof(ppi_header_t)) { nd_print_trunc(ndo); - return (caplen); + ndo->ndo_ll_hdr_len += caplen; + return; } hdr = (const ppi_header_t *)p; - ND_TCHECK_2(hdr->ppi_len); len = GET_LE_U_2(hdr->ppi_len); if (len < sizeof(ppi_header_t) || len > 65532) { /* It MUST be between 8 and 65,532 inclusive (spec 3.1.3) */ ND_PRINT(" [length %u < %zu or > 65532]", len, sizeof(ppi_header_t)); nd_print_invalid(ndo); - return (caplen); + ndo->ndo_ll_hdr_len += caplen; + return; } if (caplen < len) { /* @@ -92,9 +97,9 @@ ppi_print(netdissect_options *ndo, * bother. */ nd_print_trunc(ndo); - return (caplen); + ndo->ndo_ll_hdr_len += caplen; + return; } - ND_TCHECK_4(hdr->ppi_dlt); dlt = GET_LE_U_4(hdr->ppi_dlt); if (ndo->ndo_eflag) @@ -104,16 +109,13 @@ ppi_print(netdissect_options *ndo, caplen -= len; p += len; - printer = lookup_printer(ndo, dlt); - if (printer.printer != NULL) { + printer = lookup_printer(dlt); + if (printer != NULL) { nhdr = *h; nhdr.caplen = caplen; nhdr.len = length; - if (ndo->ndo_void_printer == TRUE) { - printer.void_printer(ndo, &nhdr, p); - hdrlen = ndo->ndo_ll_header_length; - } else - hdrlen = printer.uint_printer(ndo, &nhdr, p); + printer(ndo, &nhdr, p); + hdrlen = ndo->ndo_ll_hdr_len; } else { if (!ndo->ndo_eflag) ppi_header_print(ndo, (const u_char *)hdr, length + len); @@ -122,22 +124,6 @@ ppi_print(netdissect_options *ndo, ND_DEFAULTPRINT(p, caplen); hdrlen = 0; } - return (len + hdrlen); -trunc: - return (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->len' is the length of the packet off the wire, and 'h->caplen' - * is the number of bytes actually captured. - */ -u_int -ppi_if_print(netdissect_options *ndo, - const struct pcap_pkthdr *h, const u_char *p) -{ - ndo->ndo_protocol = "ppi_if"; - return (ppi_print(ndo, h, p)); + ndo->ndo_ll_hdr_len += len + hdrlen; } #endif /* DLT_PPI */