summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancois-Xavier Le Bail <devel.fx.lebail@orange.fr>2020-05-09 19:32:05 +0200
committerFrancois-Xavier Le Bail <devel.fx.lebail@orange.fr>2020-05-10 11:05:59 +0200
commit25687e1a312a3bb63a6e8d7f0af0210a615e24a8 (patch)
treebd625058a963602f9571587f5345e58f30b07f43
parent2b5ab9ae73292ee9e0cc01b86e127d9079a78fb2 (diff)
downloadtcpdump-25687e1a312a3bb63a6e8d7f0af0210a615e24a8.tar.gz
Print packets for unsupported link-layer protocols in hexadecimal/ASCII
This avoids to get only: tcpdump: packet printing is not supported for link type XYZ: use -w The default printing is like: 18:45:52.723872 UNSUPPORTED 0x0000: 001f 0000 0540 6078 725d 586d 4d66 4671 .....@`xr]XmMfFq 0x0010: 6d58 4d5c 7159 5f71 565c 556c 4e71 7171 mXM\qY_qV\UlNqqq 0x0020: 7171 7171 7171 7171 7171 7171 7171 5180 qqqqqqqqqqqqqqQ. 0x0030: 7f7f .. 18:45:52.755995 UNSUPPORTED 0x0000: 001f 0000 0540 6043 7851 807f 7f .....@`CxQ... [...]
-rw-r--r--CMakeLists.txt1
-rw-r--r--Makefile.in1
-rw-r--r--netdissect.h1
-rw-r--r--print-unsupported.c34
-rw-r--r--print.c13
5 files changed, 39 insertions, 11 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 832f20c7..4ea6deca 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1077,6 +1077,7 @@ set(NETDISSECT_SOURCE_LIST_C
print-token.c
print-udld.c
print-udp.c
+ print-unsupported.c
print-usb.c
print-vjc.c
print-vqp.c
diff --git a/Makefile.in b/Makefile.in
index 0fe4d729..25e43ab6 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -233,6 +233,7 @@ LIBNETDISSECT_SRC=\
print-token.c \
print-udld.c \
print-udp.c \
+ print-unsupported.c \
print-usb.c \
print-vjc.c \
print-vqp.c \
diff --git a/netdissect.h b/netdissect.h
index 65a0d987..1c83361e 100644
--- a/netdissect.h
+++ b/netdissect.h
@@ -524,6 +524,7 @@ extern u_int sll2_if_print IF_PRINTER_ARGS;
extern void sunatm_if_print IF_PRINTER_ARGS;
extern void symantec_if_print IF_PRINTER_ARGS;
extern u_int token_if_print IF_PRINTER_ARGS;
+extern void unsupported_if_print IF_PRINTER_ARGS;
extern void usb_linux_48_byte_if_print IF_PRINTER_ARGS;
extern void usb_linux_64_byte_if_print IF_PRINTER_ARGS;
extern u_int vsock_if_print IF_PRINTER_ARGS;
diff --git a/print-unsupported.c b/print-unsupported.c
new file mode 100644
index 00000000..009cf6f9
--- /dev/null
+++ b/print-unsupported.c
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2020 The TCPDUMP project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that: (1) source code
+ * distributions retain the above copyright notice and this paragraph
+ * in its entirety, and (2) distributions including binary code include
+ * the above copyright notice and this paragraph in its entirety in
+ * the documentation or other materials provided with the distribution.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+ * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
+ * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE.
+ */
+
+/* \summary: unsupported link-layer protocols printer */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "netdissect-stdinc.h"
+
+#include "netdissect.h"
+
+void
+unsupported_if_print(netdissect_options *ndo, const struct pcap_pkthdr *h,
+ const u_char *p)
+{
+ ndo->ndo_protocol = "unsupported";
+ nd_print_protocol_caps(ndo);
+ hex_and_ascii_print(ndo, "\n\t", p, h->caplen);
+}
diff --git a/print.c b/print.c
index 7224e2e6..a7f006f9 100644
--- a/print.c
+++ b/print.c
@@ -379,20 +379,11 @@ has_printer(int type)
if_printer_t
get_if_printer(netdissect_options *ndo, int type)
{
- const char *dltname;
if_printer_t printer;
printer = lookup_printer(ndo, type);
- if (printer.printer == NULL) {
- dltname = pcap_datalink_val_to_name(type);
- if (dltname != NULL)
- (*ndo->ndo_error)(ndo, S_ERR_ND_NO_PRINTER,
- "packet printing is not supported for link type %s: use -w",
- dltname);
- else
- (*ndo->ndo_error)(ndo, S_ERR_ND_NO_PRINTER,
- "packet printing is not supported for link type %d: use -w", type);
- }
+ if (printer.printer == NULL)
+ printer.void_printer = unsupported_if_print;
return printer;
}