Index | Thread | Search

From:
David Gwynne <david@gwynne.id.au>
Subject:
tcpdump(8): let DLT_RAW handle both ipv6 and ipv4 packets
To:
tech@openbsd.org
Date:
Thu, 5 Jun 2025 15:51:08 +1000

Download raw body.

Thread
https://www.tcpdump.org/linktypes.html say that DLT_RAW can contain both
types of ip, you just need to peek at the first nibble to figure out
which one it is.

seems reasonable to me.

ok?

Index: print-raw.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-raw.c,v
diff -u -p -r1.9 print-raw.c
--- print-raw.c	1 Dec 2021 18:28:46 -0000	1.9
+++ print-raw.c	5 Jun 2025 05:45:50 -0000
@@ -56,6 +56,7 @@ raw_if_print(u_char *user, const struct 
 {
 	u_int length = h->len;
 	u_int caplen = h->caplen;
+	uint8_t v;
 
 	ts_print(&h->ts);
 
@@ -67,10 +68,27 @@ raw_if_print(u_char *user, const struct 
 	packetp = p;
 	snapend = p + caplen;
 
-	if (eflag)
-		printf("ip: ");
+	if (caplen >= sizeof(v)) {
+		v = *p >> 4;
+		switch (v) {
+		case 4:
+			if (eflag)
+				printf("ip: ");
 
-	ip_print(p, length);
+			ip_print(p, length);
+			break;
+		case 6:
+			if (eflag)
+				printf("ip6: ");
+
+			ip6_print(p, length);
+			break;
+		default:
+			if (eflag)
+				printf("v%u: ", v);
+			break;
+		}
+	}
 
 	if (xflag)
 		default_print(p, caplen);