aboutsummaryrefslogtreecommitdiff
path: root/print-pktap.c
diff options
context:
space:
mode:
Diffstat (limited to 'print-pktap.c')
-rw-r--r--print-pktap.c94
1 files changed, 49 insertions, 45 deletions
diff --git a/print-pktap.c b/print-pktap.c
index 4a295fdf6328..05ce5f997824 100644
--- a/print-pktap.c
+++ b/print-pktap.c
@@ -22,11 +22,12 @@
/* \summary: Apple's DLT_PKTAP printer */
#ifdef HAVE_CONFIG_H
-#include "config.h"
+#include <config.h>
#endif
-#include <netdissect-stdinc.h>
+#include "netdissect-stdinc.h"
+#define ND_LONGJMP_FROM_TCHECK
#include "netdissect.h"
#include "extract.h"
@@ -44,20 +45,20 @@
* to host byte order in libpcap.
*/
typedef struct pktap_header {
- uint32_t pkt_len; /* length of pktap header */
- uint32_t pkt_rectype; /* type of record */
- uint32_t pkt_dlt; /* DLT type of this packet */
+ nd_uint32_t pkt_len; /* length of pktap header */
+ nd_uint32_t pkt_rectype; /* type of record */
+ nd_uint32_t pkt_dlt; /* DLT type of this packet */
char pkt_ifname[24]; /* interface name */
- uint32_t pkt_flags;
- uint32_t pkt_pfamily; /* "protocol family" */
- uint32_t pkt_llhdrlen; /* link-layer header length? */
- uint32_t pkt_lltrlrlen; /* link-layer trailer length? */
- uint32_t pkt_pid; /* process ID */
+ nd_uint32_t pkt_flags;
+ nd_uint32_t pkt_pfamily; /* "protocol family" */
+ nd_uint32_t pkt_llhdrlen; /* link-layer header length? */
+ nd_uint32_t pkt_lltrlrlen; /* link-layer trailer length? */
+ nd_uint32_t pkt_pid; /* process ID */
char pkt_cmdname[20]; /* command name */
- uint32_t pkt_svc_class; /* "service class" */
- uint16_t pkt_iftype; /* "interface type" */
- uint16_t pkt_ifunit; /* unit number of interface? */
- uint32_t pkt_epid; /* "effective process ID" */
+ nd_uint32_t pkt_svc_class; /* "service class" */
+ nd_uint16_t pkt_iftype; /* "interface type" */
+ nd_uint16_t pkt_ifunit; /* unit number of interface? */
+ nd_uint32_t pkt_epid; /* "effective process ID" */
char pkt_ecmdname[20]; /* "effective command name" */
} pktap_header_t;
@@ -67,7 +68,7 @@ typedef struct pktap_header {
#define PKT_REC_NONE 0 /* nothing follows the header */
#define PKT_REC_PACKET 1 /* a packet follows the header */
-static inline void
+static void
pktap_header_print(netdissect_options *ndo, const u_char *bp, u_int length)
{
const pktap_header_t *hdr;
@@ -76,17 +77,17 @@ pktap_header_print(netdissect_options *ndo, const u_char *bp, u_int length)
hdr = (const pktap_header_t *)bp;
- dlt = EXTRACT_LE_32BITS(&hdr->pkt_dlt);
- hdrlen = EXTRACT_LE_32BITS(&hdr->pkt_len);
+ dlt = GET_LE_U_4(hdr->pkt_dlt);
+ hdrlen = GET_LE_U_4(hdr->pkt_len);
dltname = pcap_datalink_val_to_name(dlt);
if (!ndo->ndo_qflag) {
- ND_PRINT((ndo,"DLT %s (%d) len %d",
- (dltname != NULL ? dltname : "UNKNOWN"), dlt, hdrlen));
+ ND_PRINT("DLT %s (%u) len %u",
+ (dltname != NULL ? dltname : "UNKNOWN"), dlt, hdrlen);
} else {
- ND_PRINT((ndo,"%s", (dltname != NULL ? dltname : "UNKNOWN")));
+ ND_PRINT("%s", (dltname != NULL ? dltname : "UNKNOWN"));
}
- ND_PRINT((ndo, ", length %u: ", length));
+ ND_PRINT(", length %u: ", length);
}
/*
@@ -95,7 +96,7 @@ pktap_header_print(netdissect_options *ndo, const u_char *bp, u_int length)
* 'h->len' is the length of the packet off the wire, and 'h->caplen'
* is the number of bytes actually captured.
*/
-u_int
+void
pktap_if_print(netdissect_options *ndo,
const struct pcap_pkthdr *h, const u_char *p)
{
@@ -106,13 +107,15 @@ pktap_if_print(netdissect_options *ndo,
const pktap_header_t *hdr;
struct pcap_pkthdr nhdr;
- if (caplen < sizeof(pktap_header_t) || length < sizeof(pktap_header_t)) {
- ND_PRINT((ndo, "[|pktap]"));
- return (0);
+ ndo->ndo_protocol = "pktap";
+ if (length < sizeof(pktap_header_t)) {
+ ND_PRINT(" (packet too short, %u < %zu)",
+ length, sizeof(pktap_header_t));
+ goto invalid;
}
hdr = (const pktap_header_t *)p;
- dlt = EXTRACT_LE_32BITS(&hdr->pkt_dlt);
- hdrlen = EXTRACT_LE_32BITS(&hdr->pkt_len);
+ dlt = GET_LE_U_4(hdr->pkt_dlt);
+ hdrlen = GET_LE_U_4(hdr->pkt_len);
if (hdrlen < sizeof(pktap_header_t)) {
/*
* Claimed header length < structure length.
@@ -121,13 +124,16 @@ pktap_if_print(netdissect_options *ndo,
* is the length supplied so that the header can
* be expanded in the future)?
*/
- ND_PRINT((ndo, "[|pktap]"));
- return (0);
+ ND_PRINT(" (pkt_len too small, %u < %zu)",
+ hdrlen, sizeof(pktap_header_t));
+ goto invalid;
}
- if (caplen < hdrlen || length < hdrlen) {
- ND_PRINT((ndo, "[|pktap]"));
- return (hdrlen);
+ if (hdrlen > length) {
+ ND_PRINT(" (pkt_len too big, %u > %u)",
+ hdrlen, length);
+ goto invalid;
}
+ ND_TCHECK_LEN(p, hdrlen);
if (ndo->ndo_eflag)
pktap_header_print(ndo, p, length);
@@ -136,19 +142,21 @@ pktap_if_print(netdissect_options *ndo,
caplen -= hdrlen;
p += hdrlen;
- rectype = EXTRACT_LE_32BITS(&hdr->pkt_rectype);
+ rectype = GET_LE_U_4(hdr->pkt_rectype);
switch (rectype) {
case PKT_REC_NONE:
- ND_PRINT((ndo, "no data"));
+ ND_PRINT("no data");
break;
case PKT_REC_PACKET:
- if ((printer = lookup_printer(dlt)) != NULL) {
+ printer = lookup_printer(dlt);
+ if (printer != NULL) {
nhdr = *h;
nhdr.caplen = caplen;
nhdr.len = length;
- hdrlen += printer(ndo, &nhdr, p);
+ printer(ndo, &nhdr, p);
+ hdrlen += ndo->ndo_ll_hdr_len;
} else {
if (!ndo->ndo_eflag)
pktap_header_print(ndo, (const u_char *)hdr,
@@ -160,14 +168,10 @@ pktap_if_print(netdissect_options *ndo,
break;
}
- return (hdrlen);
-}
-
-/*
- * Local Variables:
- * c-style: whitesmith
- * c-basic-offset: 8
- * End:
- */
+ ndo->ndo_ll_hdr_len += hdrlen;
+ return;
+invalid:
+ nd_print_invalid(ndo);
+}
#endif /* DLT_PKTAP */