*/
-#ifdef HAVE_CONFIG_H
#include <config.h>
-#endif
#include <stdlib.h>
#include <string.h>
#include "print.h"
#include "netdissect-alloc.h"
-#include "pcap-missing.h"
-
struct printer {
if_printer f;
int type;
#ifdef DLT_LOOP
{ null_if_print, DLT_LOOP },
#endif
-#if defined(DLT_PFLOG) && defined(HAVE_NET_IF_PFLOG_H)
+#ifdef DLT_PFLOG
{ pflog_if_print, DLT_PFLOG },
#endif
#ifdef DLT_PKTAP
#ifdef DLT_PPI
{ ppi_if_print, DLT_PPI },
#endif
-#ifdef DLT_PPP_BSDOS
- { ppp_bsdos_if_print, DLT_PPP_BSDOS },
-#endif
#ifdef DLT_PPP_SERIAL
{ ppp_hdlc_if_print, DLT_PPP_SERIAL },
#endif
{ NULL, 0 },
};
-static void ndo_default_print(netdissect_options *ndo, const u_char *bp,
- u_int length);
-
-static void NORETURN ndo_error(netdissect_options *ndo,
- status_exit_codes_t status,
- FORMAT_STRING(const char *fmt), ...)
- PRINTFLIKE(3, 4);
-static void ndo_warning(netdissect_options *ndo,
- FORMAT_STRING(const char *fmt), ...)
- PRINTFLIKE(2, 3);
-
-static int ndo_printf(netdissect_options *ndo,
- FORMAT_STRING(const char *fmt), ...)
- PRINTFLIKE(2, 3);
-
+// Both localnet and mask are in network byte order.
void
init_print(netdissect_options *ndo, uint32_t localnet, uint32_t mask)
{
-
init_addrtoname(ndo, localnet, mask);
- init_checksum();
}
if_printer
return printer;
}
+#ifdef ENABLE_INSTRUMENT_FUNCTIONS
+extern int profile_func_level;
+static int pretty_print_packet_level = -1;
+#endif
+
void
pretty_print_packet(netdissect_options *ndo, const struct pcap_pkthdr *h,
const u_char *sp, u_int packets_captured)
u_int hdrlen = 0;
int invalid_header = 0;
+ if (ndo->ndo_print_sampling && packets_captured % ndo->ndo_print_sampling != 0)
+ return;
+
+#ifdef ENABLE_INSTRUMENT_FUNCTIONS
+ if (pretty_print_packet_level == -1)
+ pretty_print_packet_level = profile_func_level;
+#endif
+
if (ndo->ndo_packet_number)
ND_PRINT("%5u ", packets_captured);
+ if (ndo->ndo_lengths)
+ ND_PRINT("caplen %u len %u ", h->caplen, h->len);
+
/* Sanity checks on packet length / capture length */
if (h->caplen == 0) {
invalid_header = 1;
* bigger lengths.
*/
- ts_print(ndo, &h->ts);
+ /*
+ * The header /usr/include/pcap/pcap.h in OpenBSD declares h->ts as
+ * struct bpf_timeval, not struct timeval. The former comes from
+ * /usr/include/net/bpf.h and uses 32-bit unsigned types instead of
+ * the types used in struct timeval.
+ */
+ struct timeval tvbuf;
+ tvbuf.tv_sec = h->ts.tv_sec;
+ tvbuf.tv_usec = h->ts.tv_usec;
+ ts_print(ndo, &tvbuf);
/*
* Printers must check that they're not walking off the end of
* of the netdissect_options structure.
*/
ndo->ndo_snapend = sp + h->caplen;
+ ndo->ndo_packetp = sp;
ndo->ndo_protocol = "";
ndo->ndo_ll_hdr_len = 0;
- if (setjmp(ndo->ndo_truncated) == 0) {
+ switch (setjmp(ndo->ndo_early_end)) {
+ case 0:
/* Print the packet. */
(ndo->ndo_if_printer)(ndo, h, sp);
- } else {
+ break;
+ case ND_TRUNCATED:
/* A printer quit because the packet was truncated; report it */
- ND_PRINT(" [|%s]", ndo->ndo_protocol);
+ nd_print_trunc(ndo);
+ /* Print the full packet */
+ ndo->ndo_ll_hdr_len = 0;
+#ifdef ENABLE_INSTRUMENT_FUNCTIONS
+ /* truncation => reassignment */
+ profile_func_level = pretty_print_packet_level;
+#endif
+ break;
}
hdrlen = ndo->ndo_ll_hdr_len;
nd_pop_all_packet_info(ndo);
/*
- * Restore the original snapend, as a printer might have
- * changed it.
+ * Restore the originals snapend and packetp, as a printer
+ * might have changed them.
+ *
+ * XXX - nd_pop_all_packet_info() should have restored the
+ * original values, but, just in case....
*/
ndo->ndo_snapend = sp + h->caplen;
+ ndo->ndo_packetp = sp;
if (ndo->ndo_Xflag) {
/*
* Print the raw packet data in hex and ASCII.
}
/* VARARGS */
-static void
+static void NORETURN PRINTFLIKE(3, 4)
ndo_error(netdissect_options *ndo, status_exit_codes_t status,
- const char *fmt, ...)
+ FORMAT_STRING(const char *fmt), ...)
{
va_list ap;
}
/* VARARGS */
-static void
-ndo_warning(netdissect_options *ndo, const char *fmt, ...)
+static void PRINTFLIKE(2, 3)
+ndo_warning(netdissect_options *ndo, FORMAT_STRING(const char *fmt), ...)
{
va_list ap;
}
}
-static int
-ndo_printf(netdissect_options *ndo, const char *fmt, ...)
+/* VARARGS */
+static int PRINTFLIKE(2, 3)
+ndo_printf(netdissect_options *ndo, FORMAT_STRING(const char *fmt), ...)
{
va_list args;
int ret;