From 43914310b6a3dc549036a70fcc4feb3a5dc76337 Mon Sep 17 00:00:00 2001
From: Tomas Zak <tomas.zak@turris.com>
Date: Fri, 22 Mar 2024 12:01:43 +0100
Subject: [PATCH] network: tcpdump: Bump to new version and fix adblock

Temporary patch for fixing adblock - DNS Report function. Due to new version of
tcpdump package, pcap file is recorded correctly and DNS Report function is
functional again.
---
 .../pending/0002-adblock-tcpdump-fix.patch    | 1894 +++++++++++++++++
 1 file changed, 1894 insertions(+)
 create mode 100644 patches/openwrt/pending/0002-adblock-tcpdump-fix.patch

diff --git a/patches/openwrt/pending/0002-adblock-tcpdump-fix.patch b/patches/openwrt/pending/0002-adblock-tcpdump-fix.patch
new file mode 100644
index 000000000..b835bdab6
--- /dev/null
+++ b/patches/openwrt/pending/0002-adblock-tcpdump-fix.patch
@@ -0,0 +1,1894 @@
+From 065fc1126afb92e1e1fa65cd17da15ec6235da35 Mon Sep 17 00:00:00 2001
+From: Nick Hainke <vincent@systemli.org>
+Date: Sat, 25 Jun 2022 16:59:30 +0200
+Subject: [PATCH 1/4] tcpdump: update to 4.99.1
+
+Adjust
+- 100-tcpdump_mini.patch
+
+Remove upstreamed patches:
+- 101-CVE-2020-8037.patch
+- 102-CVE-2018-16301.patch
+
+Changelog:
+
+  Wednesday, June 9, 2021 by gharris
+  Summary for 4.99.1 tcpdump release
+    Source code:
+      Squelch some compiler warnings
+      ICMP: Update the snapend for some nested IP packets.
+      MACsec: Update the snapend thus the ICV field is not payload
+        for the caller.
+      EIGRP: Fix packet header fields
+      SMB: Disable printer by default in CMake builds
+      OLSR: Print the protocol name even if the packet is invalid
+      MSDP: Print ": " before the protocol name
+      ESP: Remove padding, padding length and next header from the buffer
+      DHCPv6: Update the snapend for nested DHCPv6 packets
+      OpenFlow 1.0: Get snapend right for nested frames.
+      TCP: Update the snapend before decoding a MPTCP option
+      Ethernet, IEEE 802.15.4, IP, L2TP, TCP, ZEP: Add bounds checks
+      ForCES: Refine SPARSEDATA-TLV length check.
+      ASCII/hex: Use nd_trunc_longjmp() in truncation cases
+      GeoNet: Add a ND_TCHECK_LEN() call
+      Replace ND_TCHECK_/memcpy() pairs with GET_CPY_BYTES().
+      BGP: Fix overwrites of global 'astostr' temporary buffer
+      ARP: fix overwrites of static buffer in q922_string().
+      Frame Relay: have q922_string() handle errors better.
+    Building and testing:
+      Rebuild configure script when building release
+      Fix "make clean" for out-of-tree autotools builds
+      CMake: add stuff from CMAKE_PREFIX_PATH to PKG_CONFIG_PATH.
+    Documentation:
+      man: Update a reference as www.cifs.org is gone. [skip ci]
+      man: Update DNS sections
+    Solaris:
+      Fix a compile error with Sun C
+
+  Wednesday, December 30, 2020, by mcr@sandelman.ca, denis and fxl.
+  Summary for 4.99.0 tcpdump release
+    CVE-2018-16301: For the -F option handle large input files safely.
+    Improve the contents, wording and formatting of the man page.
+    Print unsupported link-layer protocol packets in hex.
+    Add support for new network protocols and DLTs: Arista, Autosar SOME/IP,
+      Broadcom LI and Ethernet switches tag, IEEE 802.15.9, IP-over-InfiniBand
+      (IPoIB), Linux SLL2, Linux vsockmon, MACsec, Marvell Distributed Switch
+      Architecture, OpenFlow 1.3, Precision Time Protocol (PTP), SSH, WHOIS,
+      ZigBee Encapsulation Protocol (ZEP).
+    Make protocol-specific updates for: AH, DHCP, DNS, ESP, FRF.16, HNCP,
+      ICMP6, IEEE 802.15.4, IPv6, IS-IS, Linux SLL, LLDP, LSP ping, MPTCP, NFS,
+      NSH, NTP, OSPF, OSPF6, PGM, PIM, PPTP, RADIUS, RSVP, Rx, SMB, UDLD,
+      VXLAN-GPE.
+    User interface:
+      Make SLL2 the default for Linux "any" pseudo-device.
+      Add --micro and --nano shorthands.
+      Add --count to print a counter only instead of decoding.
+      Add --print, to cause packet printing even with -w.
+      Add support for remote capture if libpcap supports it.
+      Display the "wireless" flag and connection status.
+      Flush the output packet buffer on a SIGUSR2.
+      Add the snapshot length to the "reading from file ..." message.
+      Fix local time printing (DST offset in timestamps).
+      Allow -C arguments > 2^31-1 GB if they can fit into a long.
+      Handle very large -f files by rejecting them.
+      Report periodic stats only when safe to do so.
+      Print the number of packets captured only as often as necessary.
+      With no -s, or with -s 0, don't specify the snapshot length with newer
+        versions of libpcap.
+      Improve version and usage message printing.
+    Building and testing:
+      Install into bindir, not sbindir.
+      autoconf: replace --with-system-libpcap with --disable-local-libpcap.
+      Require the compiler to support C99.
+      Better detect and use various C compilers and their features.
+      Add CMake as the second build system.
+      Make out-of-tree builds more reliable.
+      Use pkg-config to detect libpcap if available.
+      Improve Windows support.
+      Add more tests and improve the scripts that run them.
+      Test both with "normal" and "x87" floating-point.
+      Eliminate dependency on libdnet.
+    FreeBSD:
+      Print a proper error message about monitor mode VAP.
+      Use libcasper if available.
+      Fix failure to capture on RDMA device.
+      Include the correct capsicum header.
+    Source code:
+      Start the transition to longjmp() for packet truncation handling.
+      Introduce new helper functions, including GET_*(), nd_print_protocol(),
+        nd_print_invalid(), nd_print_trunc(), nd_trunc_longjmp() and others.
+      Put integer signedness right in many cases.
+      Introduce nd_uint*, nd_mac_addr, nd_ipv4 and nd_ipv6 types to fix
+        alignment issues, especially on SPARC.
+      Fix many C compiler, Coverity, UBSan and cppcheck warnings.
+      Fix issues detected with AddressSanitizer.
+      Remove many workarounds for older compilers and OSes.
+      Add a sanity check on packet header length.
+      Add and remove plenty of bounds checks.
+      Clean up pcap_findalldevs() call to find the first interface.
+      Use a short timeout, rather than immediate mode, for text output.
+      Handle DLT_ENC files *not* written on the same OS and byte-order host.
+      Add, and use, macros to do locale-independent case mapping.
+      Use a table instead of getprotobynumber().
+      Get rid of ND_UNALIGNED and ND_TCHECK().
+      Make roundup2() generally available.
+      Resync SMI list
+ against Wireshark.
+      Fix many typos.
+
+Co-Developed-by: Ivan Pavlov <AuthorReflex@gmail.com>
+Signed-off-by: Ivan Pavlov <AuthorReflex@gmail.com>
+Signed-off-by: Nick Hainke <vincent@systemli.org>
+(cherry picked from commit 86b0d3b00b021375a7c9aede7a7596540c84ab80)
+Signed-off-by: Tomas Zak <tomas.zak@turris.com>
+---
+ package/network/utils/tcpdump/Makefile        |  10 +-
+ .../patches/001-remove_pcap_debug.patch       |   6 +-
+ .../tcpdump/patches/100-tcpdump_mini.patch    | 703 +++++++++---------
+ .../tcpdump/patches/101-CVE-2020-8037.patch   |  47 --
+ .../tcpdump/patches/102-CVE-2018-16301.patch  | 101 ---
+ 5 files changed, 361 insertions(+), 506 deletions(-)
+ delete mode 100644 package/network/utils/tcpdump/patches/101-CVE-2020-8037.patch
+ delete mode 100644 package/network/utils/tcpdump/patches/102-CVE-2018-16301.patch
+
+diff --git a/package/network/utils/tcpdump/Makefile b/package/network/utils/tcpdump/Makefile
+index f14f86e9a3599..d6da50f25e4e0 100644
+--- a/package/network/utils/tcpdump/Makefile
++++ b/package/network/utils/tcpdump/Makefile
+@@ -8,12 +8,12 @@
+ include $(TOPDIR)/rules.mk
+ 
+ PKG_NAME:=tcpdump
+-PKG_VERSION:=4.9.3
+-PKG_RELEASE:=4
++PKG_VERSION:=4.99.1
++PKG_RELEASE:=1
+ 
+ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+ PKG_SOURCE_URL:=http://www.tcpdump.org/release/
+-PKG_HASH:=2cd47cb3d460b6ff75f4a9940f594317ad456cfbf2bd2c8e5151e16559db6410
++PKG_HASH:=79b36985fb2703146618d87c4acde3e068b91c553fb93f021a337f175fd10ebe
+ 
+ PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
+ PKG_LICENSE:=BSD-3-Clause
+@@ -58,8 +58,8 @@ ifeq ($(BUILD_VARIANT),mini)
+ endif
+ 
+ define Package/tcpdump/install
+-	$(INSTALL_DIR) $(1)/usr/sbin
+-	$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/tcpdump $(1)/usr/sbin/
++	$(INSTALL_DIR) $(1)/usr/bin
++	$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/tcpdump $(1)/usr/bin/
+ endef
+ 
+ Package/tcpdump-mini/install = $(Package/tcpdump/install)
+diff --git a/package/network/utils/tcpdump/patches/001-remove_pcap_debug.patch b/package/network/utils/tcpdump/patches/001-remove_pcap_debug.patch
+index 3da979dd35ec0..e79de526a1340 100644
+--- a/package/network/utils/tcpdump/patches/001-remove_pcap_debug.patch
++++ b/package/network/utils/tcpdump/patches/001-remove_pcap_debug.patch
+@@ -1,8 +1,8 @@
+ --- a/configure
+ +++ b/configure
+-@@ -6183,97 +6183,6 @@ $as_echo "no" >&6; }
+-     fi
+- fi
++@@ -6230,97 +6230,6 @@ fi
++ 
++ 
+  
+ -#
+ -# Check for special debugging functions
+diff --git a/package/network/utils/tcpdump/patches/100-tcpdump_mini.patch b/package/network/utils/tcpdump/patches/100-tcpdump_mini.patch
+index 17477d2799781..ad7c3feb4eceb 100644
+--- a/package/network/utils/tcpdump/patches/100-tcpdump_mini.patch
++++ b/package/network/utils/tcpdump/patches/100-tcpdump_mini.patch
+@@ -1,13 +1,14 @@
+ --- a/Makefile.in
+ +++ b/Makefile.in
+-@@ -72,6 +72,80 @@ DEPENDENCY_CFLAG = @DEPENDENCY_CFLAG@
++@@ -73,6 +73,85 @@ DEPENDENCY_CFLAG = @DEPENDENCY_CFLAG@
+  
+- CSRC =	setsignal.c tcpdump.c
++ CSRC =	fptype.c tcpdump.c
+  
+ +ifdef TCPDUMP_MINI
+ +
+ +LIBNETDISSECT_SRC=\
+ +	netdissect.c \
+++	netdissect-alloc.c \
+ +	addrtoname.c \
+ +	addrtostr.c \
+ +	af.c \
+@@ -15,17 +16,18 @@
+ +	checksum.c \
+ +	cpack.c \
+ +	gmpls.c \
+-+	gmt2local.c \
+ +	in_cksum.c \
+ +	ipproto.c \
+ +	l2vpn.c \
+ +	machdep.c \
+++	ntp.c \
+ +	nlpid.c \
+ +	oui.c \
+ +	parsenfsfh.c \
+ +	print.c \
+ +	print-802_11.c \
+ +	print-aodv.c \
+++	print-arista.c \
+ +	print-arp.c \
+ +	print-ascii.c \
+ +	print-bootp.c \
+@@ -39,6 +41,7 @@
+ +	print-icmp.c \
+ +	print-icmp6.c \
+ +	print-igmp.c \
+++	print-ip-demux.c \
+ +	print-ip.c \
+ +	print-ip6.c \
+ +	print-ip6opts.c \
+@@ -47,6 +50,7 @@
+ +	print-llc.c \
+ +	print-lldp.c \
+ +	print-loopback.c \
+++	print-macsec.c \
+ +	print-nfs.c \
+ +	print-ntp.c \
+ +	print-null.c \
+@@ -72,6 +76,7 @@
+ +	print-telnet.c \
+ +	print-tftp.c \
+ +	print-udp.c \
+++	print-unsupported.c \
+ +	signature.c \
+ +	strtoaddr.c \
+ +	util-print.c
+@@ -81,19 +86,19 @@
+  LIBNETDISSECT_SRC=\
+  	addrtoname.c \
+  	addrtostr.c \
+-@@ -237,6 +311,8 @@ LIBNETDISSECT_SRC=\
++@@ -252,6 +331,8 @@ LIBNETDISSECT_SRC=\
+  	strtoaddr.c \
+  	util-print.c
+  
+ +endif
+ +
+  LOCALSRC = @LOCALSRC@
+- GENSRC = version.c
+  LIBOBJS = @LIBOBJS@
++ 
+ --- a/addrtoname.c
+ +++ b/addrtoname.c
+-@@ -578,8 +578,10 @@ linkaddr_string(netdissect_options *ndo,
+- 	if (type == LINKADDR_ETHER && len == ETHER_ADDR_LEN)
++@@ -683,8 +683,10 @@ linkaddr_string(netdissect_options *ndo,
++ 	if (type == LINKADDR_ETHER && len == MAC_ADDR_LEN)
+  		return (etheraddr_string(ndo, ep));
+  
+ +#ifndef TCPDUMP_MINI
+@@ -103,7 +108,7 @@
+  
+  	tp = lookup_bytestring(ndo, ep, len);
+  	if (tp->bs_name)
+-@@ -1214,6 +1216,7 @@ init_addrtoname(netdissect_options *ndo,
++@@ -1263,6 +1265,7 @@ init_addrtoname(netdissect_options *ndo,
+  	init_ipxsaparray(ndo);
+  }
+  
+@@ -111,7 +116,7 @@
+  const char *
+  dnaddr_string(netdissect_options *ndo, u_short dnaddr)
+  {
+-@@ -1230,6 +1233,7 @@ dnaddr_string(netdissect_options *ndo, u
++@@ -1279,6 +1282,7 @@ dnaddr_string(netdissect_options *ndo, u
+  
+  	return(tp->name);
+  }
+@@ -119,138 +124,45 @@
+  
+  /* Return a zero'ed hnamemem struct and cuts down on calloc() overhead */
+  struct hnamemem *
+---- a/print.c
+-+++ b/print.c
+-@@ -48,6 +48,7 @@ static const struct printer printers[] =
+- #ifdef DLT_IPNET
+- 	{ ipnet_if_print,	DLT_IPNET },
+- #endif
+-+#ifndef TCPDUMP_MINI
+- #ifdef DLT_IEEE802_15_4
+- 	{ ieee802_15_4_if_print, DLT_IEEE802_15_4 },
+- #endif
+-@@ -57,12 +58,14 @@ static const struct printer printers[] =
+- #ifdef DLT_PPI
+- 	{ ppi_if_print,		DLT_PPI },
+- #endif
+-+#endif
+- #ifdef DLT_NETANALYZER
+- 	{ netanalyzer_if_print, DLT_NETANALYZER },
+- #endif
+- #ifdef DLT_NETANALYZER_TRANSPARENT
+- 	{ netanalyzer_transparent_if_print, DLT_NETANALYZER_TRANSPARENT },
+- #endif
+-+#ifndef TCPDUMP_MINI
+- #if defined(DLT_NFLOG) && defined(HAVE_PCAP_NFLOG_H)
+- 	{ nflog_if_print,	DLT_NFLOG},
+- #endif
+-@@ -75,10 +78,12 @@ static const struct printer printers[] =
+- #ifdef DLT_IP_OVER_FC
+- 	{ ipfc_if_print,	DLT_IP_OVER_FC },
+- #endif
+-+#endif
+- 	{ null_if_print,	DLT_NULL },
+- #ifdef DLT_LOOP
+- 	{ null_if_print,	DLT_LOOP },
+- #endif
+-+#ifndef TCPDUMP_MINI
+- #ifdef DLT_APPLE_IP_OVER_IEEE1394
+- 	{ ap1394_if_print,	DLT_APPLE_IP_OVER_IEEE1394 },
+- #endif
+-@@ -92,7 +97,9 @@ static const struct printer printers[] =
+- #ifdef DLT_ARCNET_LINUX
+- 	{ arcnet_linux_if_print, DLT_ARCNET_LINUX },
+- #endif
+-+#endif
+- 	{ raw_if_print,		DLT_RAW },
+-+#ifndef TCPDUMP_MINI
+- #ifdef DLT_IPV4
+- 	{ raw_if_print,		DLT_IPV4 },
+- #endif
+-@@ -116,17 +123,21 @@ static const struct printer printers[] =
+- #ifdef DLT_HDLC
+- 	{ chdlc_if_print,	DLT_HDLC },
+- #endif
+-+#endif
+- #ifdef DLT_PPP_ETHER
+- 	{ pppoe_if_print,	DLT_PPP_ETHER },
+- #endif
+-+#ifndef TCPDUMP_MINI
+- #if defined(DLT_PFLOG) && defined(HAVE_NET_IF_PFLOG_H)
+- 	{ pflog_if_print,	DLT_PFLOG },
+- #endif
+- 	{ token_if_print,	DLT_IEEE802 },
+- 	{ fddi_if_print,	DLT_FDDI },
+-+#endif
+- #ifdef DLT_LINUX_SLL
+- 	{ sll_if_print,		DLT_LINUX_SLL },
+- #endif
+-+#ifndef TCPDUMP_MINI
+- #ifdef DLT_FR
+- 	{ fr_if_print,		DLT_FR },
+- #endif
+-@@ -198,6 +209,7 @@ static const struct printer printers[] =
+- #ifdef DLT_PKTAP
+- 	{ pktap_if_print,	DLT_PKTAP },
+- #endif
+-+#endif
+- #ifdef DLT_IEEE802_11_RADIO
+- 	{ ieee802_11_radio_if_print,	DLT_IEEE802_11_RADIO },
+- #endif
+-@@ -214,12 +226,14 @@ static const struct printer printers[] =
+- #ifdef DLT_PPP_WITHDIRECTION
+- 	{ ppp_if_print,		DLT_PPP_WITHDIRECTION },
+- #endif
+-+#ifndef TCPDUMP_MINI
+- #ifdef DLT_PPP_BSDOS
+- 	{ ppp_bsdos_if_print,	DLT_PPP_BSDOS },
+- #endif
+- #ifdef DLT_PPP_SERIAL
+- 	{ ppp_hdlc_if_print,	DLT_PPP_SERIAL },
+- #endif
+-+#endif
+- 	{ NULL,			0 },
+- };
+- 
+ --- a/print-ether.c
+ +++ b/print-ether.c
+-@@ -342,6 +342,7 @@ ethertype_print(netdissect_options *ndo,
+- 	        arp_print(ndo, p, length, caplen);
++@@ -539,6 +539,7 @@ ethertype_print(netdissect_options *ndo,
++ 		arp_print(ndo, p, length, caplen);
+  		return (1);
+  
+ +#ifndef TCPDUMP_MINI
+  	case ETHERTYPE_DN:
+  		decnet_print(ndo, p, length, caplen);
+  		return (1);
+-@@ -368,6 +369,7 @@ ethertype_print(netdissect_options *ndo,
+- 		}
++@@ -569,6 +570,7 @@ ethertype_print(netdissect_options *ndo,
++ 		ND_TCHECK_LEN(p, 1);
+  		isoclns_print(ndo, p + 1, length - 1);
+  		return(1);
+ +#endif
+  
+  	case ETHERTYPE_PPPOED:
+  	case ETHERTYPE_PPPOES:
+-@@ -380,9 +382,11 @@ ethertype_print(netdissect_options *ndo,
+- 	        eap_print(ndo, p, length);
++@@ -581,9 +583,11 @@ ethertype_print(netdissect_options *ndo,
++ 		eapol_print(ndo, p);
+  		return (1);
+  
+ +#ifndef TCPDUMP_MINI
+  	case ETHERTYPE_RRCP:
+- 	        rrcp_print(ndo, p, length, src, dst);
++ 		rrcp_print(ndo, p, length, src, dst);
+  		return (1);
+ +#endif
+  
+  	case ETHERTYPE_PPP:
+  		if (length) {
+-@@ -391,6 +395,7 @@ ethertype_print(netdissect_options *ndo,
++@@ -592,6 +596,7 @@ ethertype_print(netdissect_options *ndo,
+  		}
+  		return (1);
+  
+ +#ifndef TCPDUMP_MINI
+  	case ETHERTYPE_MPCP:
+- 	        mpcp_print(ndo, p, length);
++ 		mpcp_print(ndo, p, length);
+  		return (1);
+-@@ -403,6 +408,7 @@ ethertype_print(netdissect_options *ndo,
++@@ -604,19 +609,23 @@ ethertype_print(netdissect_options *ndo,
+  	case ETHERTYPE_CFM_OLD:
+  		cfm_print(ndo, p, length);
+  		return (1);
+@@ -258,17 +170,25 @@
+  
+  	case ETHERTYPE_LLDP:
+  		lldp_print(ndo, p, length);
+-@@ -412,6 +418,7 @@ ethertype_print(netdissect_options *ndo,
++ 		return (1);
++ 
+++#ifndef TCPDUMP_MINI
++ 	case ETHERTYPE_NSH:
++ 		nsh_print(ndo, p, length);
++ 		return (1);
+++#endif
++ 
++ 	case ETHERTYPE_LOOPBACK:
+  		loopback_print(ndo, p, length);
+-                 return (1);
++ 		return (1);
+  
+ +#ifndef TCPDUMP_MINI
+  	case ETHERTYPE_MPLS:
+  	case ETHERTYPE_MPLS_MULTI:
+  		mpls_print(ndo, p, length);
+-@@ -441,6 +448,7 @@ ethertype_print(netdissect_options *ndo,
+- 	case ETHERTYPE_MEDSA:
+- 		medsa_print(ndo, p, length, caplen, src, dst);
++@@ -646,6 +655,7 @@ ethertype_print(netdissect_options *ndo,
++ 	case ETHERTYPE_PTP:
++ 		ptp_print(ndo, p, length);
+  		return (1);
+ +#endif
+  
+@@ -276,7 +196,7 @@
+  	case ETHERTYPE_SCA:
+ --- a/print-gre.c
+ +++ b/print-gre.c
+-@@ -216,6 +216,7 @@ gre_print_0(netdissect_options *ndo, con
++@@ -207,6 +207,7 @@ gre_print_0(netdissect_options *ndo, con
+  	case ETHERTYPE_IPV6:
+  		ip6_print(ndo, bp, len);
+  		break;
+@@ -284,104 +204,63 @@
+  	case ETHERTYPE_MPLS:
+  		mpls_print(ndo, bp, len);
+  		break;
+-@@ -231,6 +232,7 @@ gre_print_0(netdissect_options *ndo, con
++@@ -219,6 +220,7 @@ gre_print_0(netdissect_options *ndo, con
++ 	case ETHERTYPE_GRE_ISO:
++ 		isoclns_print(ndo, bp, len);
++ 		break;
+++#endif
+  	case ETHERTYPE_TEB:
+- 		ether_print(ndo, bp, len, ndo->ndo_snapend - bp, NULL, NULL);
++ 		ether_print(ndo, bp, len, ND_BYTES_AVAILABLE_AFTER(bp), NULL, NULL);
+  		break;
++--- a/print-icmp6.c
+++++ b/print-icmp6.c
++@@ -1384,7 +1384,7 @@ get_upperlayer(netdissect_options *ndo,
++ 			nh = GET_U_1(fragh->ip6f_nxt);
++ 			hlen = sizeof(struct ip6_frag);
++ 			break;
++-
+++#ifndef TCPDUMP_MINI
++ 		case IPPROTO_AH:
++ 			ah = (const struct ah *)bp;
++ 			if (!ND_TTEST_1(ah->ah_len))
++@@ -1392,7 +1392,7 @@ get_upperlayer(netdissect_options *ndo,
++ 			nh = GET_U_1(ah->ah_nxt);
++ 			hlen = (GET_U_1(ah->ah_len) + 2) << 2;
++ 			break;
++-
+ +#endif
+- 	default:
+- 		ND_PRINT((ndo, "gre-proto-0x%x", prot));
+- 	}
++ 		default:	/* unknown or undecodable header */
++ 			*prot = nh; /* meaningless, but set here anyway */
++ 			return(NULL);
+ --- a/print-igmp.c
+ +++ b/print-igmp.c
+-@@ -306,6 +306,7 @@ igmp_print(netdissect_options *ndo,
+-         ND_TCHECK2(bp[4], 4);
+-         ND_PRINT((ndo, "igmp leave %s", ipaddr_string(ndo, &bp[4])));
++@@ -269,6 +269,7 @@ igmp_print(netdissect_options *ndo,
++     case 0x17:
++         ND_PRINT("igmp leave %s", GET_IPADDR_STRING(bp + 4));
+          break;
+ +#ifndef TCPDUMP_MINI
+      case 0x13:
+-         ND_PRINT((ndo, "igmp dvmrp"));
++         ND_PRINT("igmp dvmrp");
+          if (len < 8)
+-@@ -317,6 +318,7 @@ igmp_print(netdissect_options *ndo,
+-         ND_PRINT((ndo, "igmp pimv1"));
++@@ -280,6 +281,7 @@ igmp_print(netdissect_options *ndo,
++         ND_PRINT("igmp pimv1");
+          pimv1_print(ndo, bp, len);
+          break;
+ +#endif
+      case 0x1e:
+-         print_mresp(ndo, bp, len);
++         print_mtrace(ndo, "mresp", bp, len);
+          break;
+---- a/print-ip6.c
+-+++ b/print-ip6.c
+-@@ -305,6 +305,7 @@ ip6_print(netdissect_options *ndo, const
+- 				return;
+- 			nh = *cp;
+- 			break;
+-+#ifndef TCPDUMP_MINI
+- 		case IPPROTO_FRAGMENT:
+- 			advance = frag6_print(ndo, cp, (const u_char *)ip6);
+- 			if (advance < 0 || ndo->ndo_snapend <= cp + advance)
+-@@ -328,6 +329,7 @@ ip6_print(netdissect_options *ndo, const
+- 				return;
+- 			nh = *cp;
+- 			return;
+-+#endif
+- 		case IPPROTO_ROUTING:
+- 			ND_TCHECK(*cp);
+- 			advance = rt6_print(ndo, cp, (const u_char *)ip6);
+-@@ -335,12 +337,14 @@ ip6_print(netdissect_options *ndo, const
+- 				return;
+- 			nh = *cp;
+- 			break;
+-+#ifndef TCPDUMP_MINI
+- 		case IPPROTO_SCTP:
+- 			sctp_print(ndo, cp, (const u_char *)ip6, len);
+- 			return;
+- 		case IPPROTO_DCCP:
+- 			dccp_print(ndo, cp, (const u_char *)ip6, len);
+- 			return;
+-+#endif
+- 		case IPPROTO_TCP:
+- 			tcp_print(ndo, cp, len, (const u_char *)ip6, fragmented);
+- 			return;
+-@@ -350,6 +354,7 @@ ip6_print(netdissect_options *ndo, const
+- 		case IPPROTO_ICMPV6:
+- 			icmp6_print(ndo, cp, len, (const u_char *)ip6, fragmented);
+- 			return;
+-+#ifndef TCPDUMP_MINI
+- 		case IPPROTO_AH:
+- 			advance = ah_print(ndo, cp);
+- 			if (advance < 0)
+-@@ -382,6 +387,7 @@ ip6_print(netdissect_options *ndo, const
+- 		case IPPROTO_PIM:
+- 			pim_print(ndo, cp, len, (const u_char *)ip6);
+- 			return;
+-+#endif
+- 
+- 		case IPPROTO_OSPF:
+- 			ospf6_print(ndo, cp, len);
+-@@ -395,9 +401,11 @@ ip6_print(netdissect_options *ndo, const
+- 		        ip_print(ndo, cp, len);
+- 			return;
+- 
+-+#ifndef TCPDUMP_MINI
+-                 case IPPROTO_PGM:
+-                         pgm_print(ndo, cp, len, (const u_char *)ip6);
+-                         return;
+-+#endif
+- 
+- 		case IPPROTO_GRE:
+- 			gre_print(ndo, cp, len);
+---- a/print-ip.c
+-+++ b/print-ip.c
+-@@ -344,6 +344,7 @@ ip_print_demux(netdissect_options *ndo,
++--- a/print-ip-demux.c
+++++ b/print-ip-demux.c
++@@ -48,6 +48,7 @@ ip_demux_print(netdissect_options *ndo,
+  again:
+- 	switch (ipds->nh) {
++ 	switch (nh) {
+  
+ +#ifndef TCPDUMP_MINI
+  	case IPPROTO_AH:
+- 		if (!ND_TTEST(*ipds->cp)) {
+- 			ND_PRINT((ndo, "[|AH]"));
+-@@ -382,7 +383,9 @@ again:
++ 		if (!ND_TTEST_1(bp)) {
++ 			ndo->ndo_protocol = "ah";
++@@ -85,7 +86,9 @@ again:
+  		 */
+  		break;
+  	}
+@@ -389,61 +268,94 @@
+  
+ +#ifndef TCPDUMP_MINI
+  	case IPPROTO_SCTP:
+- 		sctp_print(ndo, ipds->cp, (const u_char *)ipds->ip, ipds->len);
++ 		sctp_print(ndo, bp, iph, length);
+  		break;
+-@@ -390,6 +393,7 @@ again:
++@@ -93,7 +96,7 @@ again:
+  	case IPPROTO_DCCP:
+- 		dccp_print(ndo, ipds->cp, (const u_char *)ipds->ip, ipds->len);
++ 		dccp_print(ndo, bp, iph, length);
+  		break;
++-
+ +#endif
+- 
+  	case IPPROTO_TCP:
+- 		/* pass on the MF bit plus the offset to detect fragments */
+-@@ -409,6 +413,7 @@ again:
+- 			   ipds->off & (IP_MF|IP_OFFMASK));
++ 		tcp_print(ndo, bp, length, iph, fragmented);
++ 		break;
++@@ -122,6 +125,7 @@ again:
++ 		}
+  		break;
+  
+ +#ifndef TCPDUMP_MINI
+  	case IPPROTO_PIGP:
+  		/*
+  		 * XXX - the current IANA protocol number assignments
+-@@ -429,14 +434,17 @@ again:
++@@ -142,14 +146,17 @@ again:
+  	case IPPROTO_EIGRP:
+- 		eigrp_print(ndo, ipds->cp, ipds->len);
++ 		eigrp_print(ndo, bp, length);
+  		break;
+ +#endif
+  
+  	case IPPROTO_ND:
+- 		ND_PRINT((ndo, " nd %d", ipds->len));
++ 		ND_PRINT(" nd %u", length);
+  		break;
+  
+ +#ifndef TCPDUMP_MINI
+  	case IPPROTO_EGP:
+- 		egp_print(ndo, ipds->cp, ipds->len);
++ 		egp_print(ndo, bp, length);
+  		break;
+ +#endif
+  
+  	case IPPROTO_OSPF:
+- 		ospf_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip);
+-@@ -469,6 +477,7 @@ again:
+- 		gre_print(ndo, ipds->cp, ipds->len);
++ 		if (ver == 6)
++@@ -186,6 +193,7 @@ again:
++ 		gre_print(ndo, bp, length);
+  		break;
+  
+ +#ifndef TCPDUMP_MINI
+  	case IPPROTO_MOBILE:
+- 		mobile_print(ndo, ipds->cp, ipds->len);
++ 		mobile_print(ndo, bp, length);
+  		break;
+-@@ -497,6 +506,7 @@ again:
++@@ -205,6 +213,7 @@ again:
+  	case IPPROTO_PGM:
+- 		pgm_print(ndo, ipds->cp, ipds->len, (const u_char *)ipds->ip);
++ 		pgm_print(ndo, bp, length, iph);
+  		break;
+ +#endif
+  
+- 	default:
+- 		if (ndo->ndo_nflag==0 && (p_name = netdb_protoname(ipds->nh)) != NULL)
++ 	case IPPROTO_ETHERNET:
++ 		if (ver == 6)
++--- a/print-ip6.c
+++++ b/print-ip6.c
++@@ -135,10 +135,11 @@ ip6_finddst(netdissect_options *ndo, nd_
++ 			 * Only one routing header to a customer.
++ 			 */
++ 			goto done;
++-
+++#ifndef TCPDUMP_MINI
++ 		case IPPROTO_AH:
++ 		case IPPROTO_ESP:
++ 		case IPPROTO_IPCOMP:
+++#endif
++ 		default:
++ 			/*
++ 			 * AH and ESP are, in the RFCs that describe them,
++@@ -357,6 +358,7 @@ ip6_print(netdissect_options *ndo, const
++ 			nh = GET_U_1(cp);
++ 			break;
++ 
+++#ifndef TCPDUMP_MINI
++ 		case IPPROTO_FRAGMENT:
++ 			advance = frag6_print(ndo, cp, (const u_char *)ip6);
++ 			if (advance < 0 || ndo->ndo_snapend <= cp + advance) {
++@@ -387,7 +389,7 @@ ip6_print(netdissect_options *ndo, const
++ 			nh = GET_U_1(cp);
++ 			nd_pop_packet_info(ndo);
++ 			return;
++-
+++#endif
++ 		case IPPROTO_ROUTING:
++ 			ND_TCHECK_1(cp);
++ 			advance = rt6_print(ndo, cp, (const u_char *)ip6);
+ --- a/print-llc.c
+ +++ b/print-llc.c
+-@@ -206,6 +206,7 @@ llc_print(netdissect_options *ndo, const
++@@ -207,6 +207,7 @@ llc_print(netdissect_options *ndo, const
+  		hdrlen = 4;	/* DSAP, SSAP, 2-byte control field */
+  	}
+  
+@@ -451,7 +363,7 @@
+  	if (ssap_field == LLCSAP_GLOBAL && dsap_field == LLCSAP_GLOBAL) {
+  		/*
+  		 * This is an Ethernet_802.3 IPX frame; it has an
+-@@ -228,6 +229,7 @@ llc_print(netdissect_options *ndo, const
++@@ -229,6 +230,7 @@ llc_print(netdissect_options *ndo, const
+              ipx_print(ndo, p, length);
+              return (0);		/* no LLC header */
+  	}
+@@ -459,7 +371,7 @@
+  
+  	dsap = dsap_field & ~LLC_IG;
+  	ssap = ssap_field & ~LLC_GSAP;
+-@@ -291,6 +293,7 @@ llc_print(netdissect_options *ndo, const
++@@ -292,6 +294,7 @@ llc_print(netdissect_options *ndo, const
+  		return (hdrlen);
+  	}
+  
+@@ -467,7 +379,7 @@
+  	if (ssap == LLCSAP_IPX && dsap == LLCSAP_IPX &&
+  	    control == LLC_UI) {
+  		/*
+-@@ -304,6 +307,7 @@ llc_print(netdissect_options *ndo, const
++@@ -305,6 +308,7 @@ llc_print(netdissect_options *ndo, const
+  		ipx_print(ndo, p, length);
+  		return (hdrlen);
+  	}
+@@ -475,7 +387,7 @@
+  
+  #ifdef ENABLE_SMB
+  	if (ssap == LLCSAP_NETBEUI && dsap == LLCSAP_NETBEUI
+-@@ -322,12 +326,13 @@ llc_print(netdissect_options *ndo, const
++@@ -323,12 +327,13 @@ llc_print(netdissect_options *ndo, const
+  		return (hdrlen);
+  	}
+  #endif
+@@ -490,15 +402,15 @@
+  	if (!ndo->ndo_eflag) {
+  		if (ssap == dsap) {
+  			if (src == NULL || dst == NULL)
+-@@ -480,6 +485,7 @@ snap_print(netdissect_options *ndo, cons
++@@ -484,6 +489,7 @@ snap_print(netdissect_options *ndo, cons
+  
+  	case OUI_CISCO:
+                  switch (et) {
+ +#ifndef TCPDUMP_MINI
+                  case PID_CISCO_CDP:
+-                         cdp_print(ndo, p, length, caplen);
++                         cdp_print(ndo, p, length);
+                          return (1);
+-@@ -492,6 +498,7 @@ snap_print(netdissect_options *ndo, cons
++@@ -496,6 +502,7 @@ snap_print(netdissect_options *ndo, cons
+                  case PID_CISCO_VTP:
+                          vtp_print(ndo, p, length);
+                          return (1);
+@@ -506,7 +418,7 @@
+                  case PID_CISCO_PVST:
+                  case PID_CISCO_VLANBRIDGE:
+                          stp_print(ndo, p, length);
+-@@ -504,6 +511,7 @@ snap_print(netdissect_options *ndo, cons
++@@ -508,6 +515,7 @@ snap_print(netdissect_options *ndo, cons
+  	case OUI_RFC2684:
+  		switch (et) {
+  
+@@ -514,7 +426,7 @@
+  		case PID_RFC2684_ETH_FCS:
+  		case PID_RFC2684_ETH_NOFCS:
+  			/*
+-@@ -565,6 +573,7 @@ snap_print(netdissect_options *ndo, cons
++@@ -569,6 +577,7 @@ snap_print(netdissect_options *ndo, cons
+  			 */
+  			fddi_print(ndo, p, length, caplen);
+  			return (1);
+@@ -542,25 +454,25 @@
+  		/* unknown AF_ value */
+ --- a/print-ppp.c
+ +++ b/print-ppp.c
+-@@ -1367,6 +1367,7 @@ trunc:
+- 	return 0;
+- }
+- 
++@@ -1355,6 +1355,7 @@ trunc:
++  * The length argument is the on-the-wire length, not the captured
++  * length; we can only un-escape the captured part.
++  */
+ +#ifndef TCPDUMP_MINI
+  static void
+  ppp_hdlc(netdissect_options *ndo,
+-          const u_char *p, int length)
+-@@ -1445,6 +1446,7 @@ trunc:
+- 	free(b);
+- 	ND_PRINT((ndo, "[|ppp]"));
++          const u_char *p, u_int length)
++@@ -1440,17 +1441,19 @@ trunc:
++ 	ndo->ndo_snapend = se;
++ 	nd_print_trunc(ndo);
+  }
++-
+ +#endif
+  
+- 
+  /* PPP */
+-@@ -1452,10 +1454,12 @@ static void
++ static void
+  handle_ppp(netdissect_options *ndo,
+-            u_int proto, const u_char *p, int length)
++            u_int proto, const u_char *p, u_int length)
+  {
+ +#ifndef TCPDUMP_MINI
+  	if ((proto & 0xff00) == 0x7e00) { /* is this an escape code ? */
+@@ -571,7 +483,7 @@
+  
+  	switch (proto) {
+  	case PPP_LCP: /* fall through */
+-@@ -1488,6 +1492,7 @@ handle_ppp(netdissect_options *ndo,
++@@ -1483,6 +1486,7 @@ handle_ppp(netdissect_options *ndo,
+  	case PPP_IPV6:
+  		ip6_print(ndo, p, length);
+  		break;
+@@ -579,33 +491,30 @@
+  	case ETHERTYPE_IPX:	/*XXX*/
+  	case PPP_IPX:
+  		ipx_print(ndo, p, length);
+-@@ -1499,6 +1504,7 @@ handle_ppp(netdissect_options *ndo,
++@@ -1494,6 +1498,7 @@ handle_ppp(netdissect_options *ndo,
+  	case PPP_MPLS_MCAST:
+  		mpls_print(ndo, p, length);
+  		break;
+ +#endif
+  	case PPP_COMP:
+- 		ND_PRINT((ndo, "compressed PPP data"));
++ 		ND_PRINT("compressed PPP data");
+  		break;
+-@@ -1639,6 +1645,7 @@ ppp_if_print(netdissect_options *ndo,
+- 	return (0);
++@@ -1634,6 +1639,7 @@ ppp_if_print(netdissect_options *ndo,
++ 	ppp_print(ndo, p, length);
+  }
+  
+ +#ifndef TCPDUMP_MINI
+  /*
+   * PPP I/F printer to use if we know that RFC 1662-style PPP in HDLC-like
+   * framing, or Cisco PPP with HDLC framing as per section 4.3.1 of RFC 1547,
+-@@ -1866,6 +1873,7 @@ printx:
++@@ -1877,3 +1883,4 @@ printx:
+  #endif /* __bsdi__ */
+- 	return (hdrlength);
++ 	ndo->ndo_ll_hdr_len += hdrlength;
+  }
+ +#endif
+- 
+- 
+- /*
+ --- a/print-sll.c
+ +++ b/print-sll.c
+-@@ -249,12 +249,14 @@ recurse:
++@@ -460,12 +460,14 @@ recurse:
+  		 */
+  		switch (ether_type) {
+  
+@@ -622,22 +531,24 @@
+  			/*
+ --- a/print-tcp.c
+ +++ b/print-tcp.c
+-@@ -589,12 +589,14 @@ tcp_print(netdissect_options *ndo,
+-                                 ND_PRINT((ndo, " %u", utoval));
++@@ -612,6 +612,7 @@ tcp_print(netdissect_options *ndo,
++                                 ND_PRINT(" %u", utoval);
+                                  break;
+  
+ +#ifndef TCPDUMP_MINI
+                          case TCPOPT_MPTCP:
+-                                 datalen = len - 2;
+-                                 LENCHECK(datalen);
+-                                 if (!mptcp_print(ndo, cp-2, len, flags))
++                             {
++                                 const u_char *snapend_save;
++@@ -635,7 +636,7 @@ tcp_print(netdissect_options *ndo,
+                                          goto bad;
+                                  break;
++                             }
++-
+ +#endif
+- 
+                          case TCPOPT_FASTOPEN:
+                                  datalen = len - 2;
+-@@ -670,6 +672,7 @@ tcp_print(netdissect_options *ndo,
++                                 LENCHECK(datalen);
++@@ -720,6 +721,7 @@ tcp_print(netdissect_options *ndo,
+                  return;
+          }
+  
+@@ -645,7 +556,7 @@
+          if (ndo->ndo_packettype) {
+                  switch (ndo->ndo_packettype) {
+                  case PT_ZMTP1:
+-@@ -681,28 +684,36 @@ tcp_print(netdissect_options *ndo,
++@@ -735,6 +737,7 @@ tcp_print(netdissect_options *ndo,
+                  }
+                  return;
+          }
+@@ -653,11 +564,12 @@
+  
+          if (IS_SRC_OR_DST_PORT(TELNET_PORT)) {
+                  telnet_print(ndo, bp, length);
+-         } else if (IS_SRC_OR_DST_PORT(SMTP_PORT)) {
+-                 ND_PRINT((ndo, ": "));
+-                 smtp_print(ndo, bp, length);
++@@ -745,24 +748,31 @@ tcp_print(netdissect_options *ndo,
++                 ND_PRINT(": ");
++                 ndo->ndo_protocol = "whois";	/* needed by txtproto_print() */
++                 txtproto_print(ndo, bp, length, NULL, 0); /* RFC 3912 */
+ -        } else if (IS_SRC_OR_DST_PORT(BGP_PORT))
+-+        }
+++        } 
+ +#ifndef TCPDUMP_MINI
+ +        else if (IS_SRC_OR_DST_PORT(BGP_PORT))
+                  bgp_print(ndo, bp, length);
+@@ -667,12 +579,14 @@
+ +#ifndef TCPDUMP_MINI
+          else if (IS_SRC_OR_DST_PORT(REDIS_PORT))
+                  resp_print(ndo, bp, length);
++         else if (IS_SRC_OR_DST_PORT(SSH_PORT))
++                 ssh_print(ndo, bp, length);
+ +#endif
+  #ifdef ENABLE_SMB
+          else if (IS_SRC_OR_DST_PORT(NETBIOS_SSN_PORT))
+                  nbt_tcp_print(ndo, bp, length);
+- 	else if (IS_SRC_OR_DST_PORT(SMB_PORT))
+- 		smb_tcp_print(ndo, bp, length);
++         else if (IS_SRC_OR_DST_PORT(SMB_PORT))
++                 smb_tcp_print(ndo, bp, length);
+  #endif
+ +#ifndef TCPDUMP_MINI
+          else if (IS_SRC_OR_DST_PORT(BEEP_PORT))
+@@ -681,41 +595,40 @@
+                  openflow_print(ndo, bp, length);
+ +#endif
+          else if (IS_SRC_OR_DST_PORT(FTP_PORT)) {
+-                 ND_PRINT((ndo, ": "));
++                 ND_PRINT(": ");
+                  ftp_print(ndo, bp, length);
+-@@ -725,6 +736,7 @@ tcp_print(netdissect_options *ndo,
+-                  * XXX packet could be unaligned, it can go strange
+-                  */
+-                 ns_print(ndo, bp + 2, length - 2, 0);
++@@ -775,12 +785,14 @@ tcp_print(netdissect_options *ndo,
++         } else if (IS_SRC_OR_DST_PORT(NAMESERVER_PORT)) {
++                 /* over_tcp: TRUE, is_mdns: FALSE */
++                 domain_print(ndo, bp, length, TRUE, FALSE);
+ +#ifndef TCPDUMP_MINI
+          } else if (IS_SRC_OR_DST_PORT(MSDP_PORT)) {
+                  msdp_print(ndo, bp, length);
+          } else if (IS_SRC_OR_DST_PORT(RPKI_RTR_PORT)) {
+-@@ -732,6 +744,7 @@ tcp_print(netdissect_options *ndo,
+-         }
+-         else if (length > 0 && (IS_SRC_OR_DST_PORT(LDP_PORT))) {
++                 rpki_rtr_print(ndo, bp, length);
++         } else if (IS_SRC_OR_DST_PORT(LDP_PORT)) {
+                  ldp_print(ndo, bp, length);
+ +#endif
+-         }
+-         else if ((IS_SRC_OR_DST_PORT(NFS_PORT)) &&
+-                  length >= 4 && ND_TTEST2(*bp, 4)) {
++         } else if ((IS_SRC_OR_DST_PORT(NFS_PORT)) &&
++                  length >= 4 && ND_TTEST_4(bp)) {
++                 /*
+ --- a/print-udp.c
+ +++ b/print-udp.c
+-@@ -430,10 +430,12 @@ udp_print(netdissect_options *ndo, regis
+- 			vat_print(ndo, (const void *)(up + 1), up);
++@@ -435,10 +435,12 @@ udp_print(netdissect_options *ndo, const
++ 			vat_print(ndo, cp, length);
+  			break;
+  
+ +#ifndef TCPDUMP_MINI
+  		case PT_WB:
+  			udpipaddr_print(ndo, ip, sport, dport);
+- 			wb_print(ndo, (const void *)(up + 1), length);
++ 			wb_print(ndo, cp, length);
+  			break;
+ +#endif
+  
+  		case PT_RPC:
+- 			rp = (const struct sunrpc_msg *)(up + 1);
+-@@ -462,10 +464,12 @@ udp_print(netdissect_options *ndo, regis
+- 			snmp_print(ndo, (const u_char *)(up + 1), length);
++ 			rp = (const struct sunrpc_msg *)cp;
++@@ -467,10 +469,12 @@ udp_print(netdissect_options *ndo, const
++ 			snmp_print(ndo, cp, length);
+  			break;
+  
+ +#ifndef TCPDUMP_MINI
+@@ -727,131 +640,221 @@
+  
+  		case PT_TFTP:
+  			udpipaddr_print(ndo, ip, sport, dport);
+-@@ -483,6 +487,7 @@ udp_print(netdissect_options *ndo, regis
++@@ -488,6 +492,7 @@ udp_print(netdissect_options *ndo, const
+  			radius_print(ndo, cp, length);
+  			break;
+  
+ +#ifndef TCPDUMP_MINI
+  		case PT_VXLAN:
+  			udpipaddr_print(ndo, ip, sport, dport);
+- 			vxlan_print(ndo, (const u_char *)(up + 1), length);
+-@@ -497,6 +502,7 @@ udp_print(netdissect_options *ndo, regis
++ 			vxlan_print(ndo, cp, length);
++@@ -510,6 +515,7 @@ udp_print(netdissect_options *ndo, const
+  			udpipaddr_print(ndo, ip, sport, dport);
+- 			lmp_print(ndo, cp, length);
++ 			someip_print(ndo, cp, length);
+  			break;
+ +#endif
+- 		}
+- 		return;
+- 	}
+-@@ -574,31 +580,40 @@ udp_print(netdissect_options *ndo, regis
+- 			ns_print(ndo, (const u_char *)(up + 1), length, 0);
++ 		case PT_DOMAIN:
++ 			udpipaddr_print(ndo, ip, sport, dport);
++ 			/* over_tcp: FALSE, is_mdns: FALSE */
++@@ -596,29 +602,37 @@ udp_print(netdissect_options *ndo, const
+  		else if (IS_SRC_OR_DST_PORT(MULTICASTDNS_PORT))
+- 			ns_print(ndo, (const u_char *)(up + 1), length, 1);
++ 			/* over_tcp: FALSE, is_mdns: TRUE */
++ 			domain_print(ndo, cp, length, FALSE, TRUE);
+ +#ifndef TCPDUMP_MINI
+  		else if (IS_SRC_OR_DST_PORT(TIMED_PORT))
+- 			timed_print(ndo, (const u_char *)(up + 1));
++ 			timed_print(ndo, (const u_char *)cp);
+ +#endif
+  		else if (IS_SRC_OR_DST_PORT(TFTP_PORT))
+- 			tftp_print(ndo, (const u_char *)(up + 1), length);
++ 			tftp_print(ndo, cp, length);
+  		else if (IS_SRC_OR_DST_PORT(BOOTPC_PORT) || IS_SRC_OR_DST_PORT(BOOTPS_PORT))
+- 			bootp_print(ndo, (const u_char *)(up + 1), length);
++ 			bootp_print(ndo, cp, length);
+ +#ifndef TCPDUMP_MINI
+  		else if (IS_SRC_OR_DST_PORT(RIP_PORT))
+- 			rip_print(ndo, (const u_char *)(up + 1), length);
++ 			rip_print(ndo, cp, length);
+ +#endif
+  		else if (IS_SRC_OR_DST_PORT(AODV_PORT))
+- 			aodv_print(ndo, (const u_char *)(up + 1), length,
++ 			aodv_print(ndo, cp, length,
+  			    ip6 != NULL);
+ +#ifndef TCPDUMP_MINI
+- 	        else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT))
+- 			 isakmp_print(ndo, (const u_char *)(up + 1), length, bp2);
+-+
+- 	        else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT_NATT))
+- 			 isakmp_rfc3948_print(ndo, (const u_char *)(up + 1), length, bp2);
+- #if 1 /*???*/
+- 	        else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT_USER1) || IS_SRC_OR_DST_PORT(ISAKMP_PORT_USER2))
+- 			isakmp_print(ndo, (const u_char *)(up + 1), length, bp2);
+- #endif
++ 		else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT))
++ 			 isakmp_print(ndo, cp, length, bp2);
++ 		else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT_NATT))
++ 			 isakmp_rfc3948_print(ndo, cp, length, bp2, IP_V(ip), fragmented, ttl_hl);
++ 		else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT_USER1) || IS_SRC_OR_DST_PORT(ISAKMP_PORT_USER2))
++ 			isakmp_print(ndo, cp, length, bp2);
+ +#endif
+  		else if (IS_SRC_OR_DST_PORT(SNMP_PORT) || IS_SRC_OR_DST_PORT(SNMPTRAP_PORT))
+- 			snmp_print(ndo, (const u_char *)(up + 1), length);
++ 			snmp_print(ndo, cp, length);
+  		else if (IS_SRC_OR_DST_PORT(NTP_PORT))
+- 			ntp_print(ndo, (const u_char *)(up + 1), length);
++ 			ntp_print(ndo, cp, length);
+ +#ifndef TCPDUMP_MINI
+  		else if (IS_SRC_OR_DST_PORT(KERBEROS_PORT) || IS_SRC_OR_DST_PORT(KERBEROS_SEC_PORT))
+- 			krb_print(ndo, (const void *)(up + 1));
++ 			krb_print(ndo, (const u_char *)cp);
+ +#endif
+  		else if (IS_SRC_OR_DST_PORT(L2TP_PORT))
+- 			l2tp_print(ndo, (const u_char *)(up + 1), length);
++ 			l2tp_print(ndo, cp, length);
+  #ifdef ENABLE_SMB
+-@@ -609,6 +624,7 @@ udp_print(netdissect_options *ndo, regis
++@@ -629,6 +643,7 @@ udp_print(netdissect_options *ndo, const
+  #endif
+  		else if (dport == VAT_PORT)
+- 			vat_print(ndo, (const void *)(up + 1), up);
++ 			vat_print(ndo, cp, length);
+ +#ifndef TCPDUMP_MINI
+  		else if (IS_SRC_OR_DST_PORT(ZEPHYR_SRV_PORT) || IS_SRC_OR_DST_PORT(ZEPHYR_CLT_PORT))
+- 			zephyr_print(ndo, (const void *)(up + 1), length);
++ 			zephyr_print(ndo, cp, length);
+  		/*
+-@@ -621,8 +637,11 @@ udp_print(netdissect_options *ndo, regis
++@@ -641,8 +656,11 @@ udp_print(netdissect_options *ndo, const
+  				 (const u_char *) ip);
+  		else if (IS_SRC_OR_DST_PORT(RIPNG_PORT))
+- 			ripng_print(ndo, (const u_char *)(up + 1), length);
++ 			ripng_print(ndo, cp, length);
+ +#endif
+ +
+  		else if (IS_SRC_OR_DST_PORT(DHCP6_SERV_PORT) || IS_SRC_OR_DST_PORT(DHCP6_CLI_PORT))
+- 			dhcp6_print(ndo, (const u_char *)(up + 1), length);
++ 			dhcp6_print(ndo, cp, length);
+ +#ifndef TCPDUMP_MINI
+  		else if (IS_SRC_OR_DST_PORT(AHCP_PORT))
+- 			ahcp_print(ndo, (const u_char *)(up + 1), length);
++ 			ahcp_print(ndo, cp, length);
+  		else if (IS_SRC_OR_DST_PORT(BABEL_PORT) || IS_SRC_OR_DST_PORT(BABEL_PORT_OLD))
+-@@ -636,6 +655,7 @@ udp_print(netdissect_options *ndo, regis
+- 			wb_print(ndo, (const void *)(up + 1), length);
++@@ -656,6 +674,7 @@ udp_print(netdissect_options *ndo, const
++ 			wb_print(ndo, cp, length);
+  		else if (IS_SRC_OR_DST_PORT(CISCO_AUTORP_PORT))
+- 			cisco_autorp_print(ndo, (const void *)(up + 1), length);
++ 			cisco_autorp_print(ndo, cp, length);
+ +#endif
+  		else if (IS_SRC_OR_DST_PORT(RADIUS_PORT) ||
+  			 IS_SRC_OR_DST_PORT(RADIUS_NEW_PORT) ||
+  			 IS_SRC_OR_DST_PORT(RADIUS_ACCOUNTING_PORT) ||
+-@@ -643,15 +663,18 @@ udp_print(netdissect_options *ndo, regis
++@@ -663,15 +682,18 @@ udp_print(netdissect_options *ndo, const
+  			 IS_SRC_OR_DST_PORT(RADIUS_CISCO_COA_PORT) ||
+  			 IS_SRC_OR_DST_PORT(RADIUS_COA_PORT) )
+- 			radius_print(ndo, (const u_char *)(up+1), length);
++ 			radius_print(ndo, cp, length);
+ +#ifndef TCPDUMP_MINI
+  		else if (dport == HSRP_PORT)
+- 			hsrp_print(ndo, (const u_char *)(up + 1), length);
++ 			hsrp_print(ndo, cp, length);
+  		else if (IS_SRC_OR_DST_PORT(LWRES_PORT))
+- 			lwres_print(ndo, (const u_char *)(up + 1), length);
++ 			lwres_print(ndo, cp, length);
+  		else if (IS_SRC_OR_DST_PORT(LDP_PORT))
+- 			ldp_print(ndo, (const u_char *)(up + 1), length);
++ 			ldp_print(ndo, cp, length);
+ +#endif
+  		else if (IS_SRC_OR_DST_PORT(OLSR_PORT))
+- 			olsr_print(ndo, (const u_char *)(up + 1), length,
++ 			olsr_print(ndo, cp, length,
+  					(IP_V(ip) == 6) ? 1 : 0);
+ +#ifndef TCPDUMP_MINI
+  		else if (IS_SRC_OR_DST_PORT(MPLS_LSP_PING_PORT))
+- 			lspping_print(ndo, (const u_char *)(up + 1), length);
+- 		else if (dport == BFD_CONTROL_PORT ||
+-@@ -669,10 +692,12 @@ udp_print(netdissect_options *ndo, regis
+-                         lwapp_control_print(ndo, (const u_char *)(up + 1), length, 0);
+-                 else if (IS_SRC_OR_DST_PORT(LWAPP_DATA_PORT))
+-                         lwapp_data_print(ndo, (const u_char *)(up + 1), length);
+-+#endif
+-                 else if (IS_SRC_OR_DST_PORT(SIP_PORT))
+- 			sip_print(ndo, (const u_char *)(up + 1), length);
+-                 else if (IS_SRC_OR_DST_PORT(SYSLOG_PORT))
+- 			syslog_print(ndo, (const u_char *)(up + 1), length);
+-+#ifndef TCPDUMP_MINI
+-                 else if (IS_SRC_OR_DST_PORT(OTV_PORT))
+- 			otv_print(ndo, (const u_char *)(up + 1), length);
+-                 else if (IS_SRC_OR_DST_PORT(VXLAN_PORT))
+-@@ -689,7 +714,9 @@ udp_print(netdissect_options *ndo, regis
+- 			if (ndo->ndo_vflag)
+- 				ND_PRINT((ndo, "kip "));
+- 			llap_print(ndo, cp, length);
+--		} else {
+-+		}
+-+#endif
+-+		else {
+- 			if (ulen > length)
+- 				ND_PRINT((ndo, "UDP, bad length %u > %u",
+- 				    ulen, length));
++ 			lspping_print(ndo, cp, length);
++ 		else if (sport == BCM_LI_PORT)
++@@ -693,10 +715,12 @@ udp_print(netdissect_options *ndo, const
++ 			lwapp_control_print(ndo, cp, length, 0);
++ 		else if (IS_SRC_OR_DST_PORT(LWAPP_DATA_PORT))
++ 			lwapp_data_print(ndo, cp, length);
+++#endif
++ 		else if (IS_SRC_OR_DST_PORT(SIP_PORT))
++ 			sip_print(ndo, cp, length);
++ 		else if (IS_SRC_OR_DST_PORT(SYSLOG_PORT))
++ 			syslog_print(ndo, cp, length);
+++#ifndef TCPDUMP_MINI
++ 		else if (IS_SRC_OR_DST_PORT(OTV_PORT))
++ 			otv_print(ndo, cp, length);
++ 		else if (IS_SRC_OR_DST_PORT(VXLAN_PORT))
++@@ -722,6 +746,7 @@ udp_print(netdissect_options *ndo, const
++ 			ptp_print(ndo, cp, length);
++ 		} else if (IS_SRC_OR_DST_PORT(SOMEIP_PORT))
++ 			someip_print(ndo, cp, length);
+++#endif
++ 		else {
++ 			if (ulen > length && !fragmented)
++ 				ND_PRINT("UDP, bad length %u > %u",
++--- a/print.c
+++++ b/print.c
++@@ -48,6 +48,7 @@ struct printer {
++ };
++ 
++ static const struct printer printers[] = {
+++#ifndef TCPDUMP_MINI
++ #ifdef DLT_APPLE_IP_OVER_IEEE1394
++ 	{ ap1394_if_print,	DLT_APPLE_IP_OVER_IEEE1394 },
++ #endif
++@@ -86,7 +87,9 @@ static const struct printer printers[] =
++ #ifdef DLT_ENC
++ 	{ enc_if_print,		DLT_ENC },
++ #endif
+++#endif
++ 	{ ether_if_print,	DLT_EN10MB },
+++#ifndef TCPDUMP_MINI
++ 	{ fddi_if_print,	DLT_FDDI },
++ #ifdef DLT_FR
++ 	{ fr_if_print,		DLT_FR },
++@@ -94,6 +97,7 @@ static const struct printer printers[] =
++ #ifdef DLT_FRELAY
++ 	{ fr_if_print,		DLT_FRELAY },
++ #endif
+++#endif
++ #ifdef DLT_IEEE802_11
++ 	{ ieee802_11_if_print,	DLT_IEEE802_11},
++ #endif
++@@ -103,6 +107,7 @@ static const struct printer printers[] =
++ #ifdef DLT_IEEE802_11_RADIO
++ 	{ ieee802_11_radio_if_print,	DLT_IEEE802_11_RADIO },
++ #endif
+++#ifndef TCPDUMP_MINI
++ #ifdef DLT_IEEE802_15_4
++ 	{ ieee802_15_4_if_print, DLT_IEEE802_15_4 },
++ #endif
++@@ -115,9 +120,11 @@ static const struct printer printers[] =
++ #ifdef DLT_IP_OVER_FC
++ 	{ ipfc_if_print,	DLT_IP_OVER_FC },
++ #endif
+++#endif
++ #ifdef DLT_IPNET
++ 	{ ipnet_if_print,	DLT_IPNET },
++ #endif
+++#ifndef TCPDUMP_MINI
++ #ifdef DLT_IPOIB
++ 	{ ipoib_if_print,       DLT_IPOIB },
++ #endif
++@@ -172,19 +179,23 @@ static const struct printer printers[] =
++ #ifdef DLT_MFR
++ 	{ mfr_if_print,		DLT_MFR },
++ #endif
+++#endif
++ #ifdef DLT_NETANALYZER
++ 	{ netanalyzer_if_print, DLT_NETANALYZER },
++ #endif
++ #ifdef DLT_NETANALYZER_TRANSPARENT
++ 	{ netanalyzer_transparent_if_print, DLT_NETANALYZER_TRANSPARENT },
++ #endif
+++#ifndef TCPDUMP_MINI
++ #ifdef DLT_NFLOG
++ 	{ nflog_if_print,	DLT_NFLOG},
++ #endif
+++#endif
++ 	{ null_if_print,	DLT_NULL },
++ #ifdef DLT_LOOP
++ 	{ null_if_print,	DLT_LOOP },
++ #endif
+++#ifndef TCPDUMP_MINI
++ #if defined(DLT_PFLOG) && defined(HAVE_NET_IF_PFLOG_H)
++ 	{ pflog_if_print,	DLT_PFLOG },
++ #endif
++@@ -200,6 +211,7 @@ static const struct printer printers[] =
++ #ifdef DLT_PPP_SERIAL
++ 	{ ppp_hdlc_if_print,	DLT_PPP_SERIAL },
++ #endif
+++#endif
++ 	{ ppp_if_print,		DLT_PPP },
++ #ifdef DLT_PPP_PPPD
++ 	{ ppp_if_print,		DLT_PPP_PPPD },
++@@ -211,6 +223,7 @@ static const struct printer printers[] =
++ 	{ prism_if_print,	DLT_PRISM_HEADER },
++ #endif
++ 	{ raw_if_print,		DLT_RAW },
+++#ifndef TCPDUMP_MINI
++ #ifdef DLT_IPV4
++ 	{ raw_if_print,		DLT_IPV4 },
++ #endif
++@@ -243,6 +256,7 @@ static const struct printer printers[] =
++ #ifdef DLT_VSOCK
++ 	{ vsock_if_print,	DLT_VSOCK },
++ #endif
+++#endif
++ 	{ NULL,                 0 },
++ };
++ 
+diff --git a/package/network/utils/tcpdump/patches/101-CVE-2020-8037.patch b/package/network/utils/tcpdump/patches/101-CVE-2020-8037.patch
+deleted file mode 100644
+index 281854777dff6..0000000000000
+--- a/package/network/utils/tcpdump/patches/101-CVE-2020-8037.patch
++++ /dev/null
+@@ -1,47 +0,0 @@
+---- a/print-ppp.c
+-+++ b/print-ppp.c
+-@@ -1368,19 +1368,29 @@ trunc:
+- }
+- 
+- #ifndef TCPDUMP_MINI
+-+/*
+-+ * Un-escape RFC 1662 PPP in HDLC-like framing, with octet escapes.
+-+ * The length argument is the on-the-wire length, not the captured
+-+ * length; we can only un-escape the captured part.
+-+ */
+- static void
+- ppp_hdlc(netdissect_options *ndo,
+-          const u_char *p, int length)
+- {
+-+	u_int caplen = ndo->ndo_snapend - p;
+- 	u_char *b, *t, c;
+- 	const u_char *s;
+--	int i, proto;
+-+	u_int i;
+-+	int proto;
+- 	const void *se;
+- 
+-+	if (caplen == 0)
+-+		return;
+-+
+-         if (length <= 0)
+-                 return;
+- 
+--	b = (u_char *)malloc(length);
+-+	b = (u_char *)malloc(caplen);
+- 	if (b == NULL)
+- 		return;
+- 
+-@@ -1389,10 +1399,10 @@ ppp_hdlc(netdissect_options *ndo,
+- 	 * Do this so that we dont overwrite the original packet
+- 	 * contents.
+- 	 */
+--	for (s = p, t = b, i = length; i > 0 && ND_TTEST(*s); i--) {
+-+	for (s = p, t = b, i = caplen; i != 0; i--) {
+- 		c = *s++;
+- 		if (c == 0x7d) {
+--			if (i <= 1 || !ND_TTEST(*s))
+-+			if (i <= 1)
+- 				break;
+- 			i--;
+- 			c = *s++ ^ 0x20;
+diff --git a/package/network/utils/tcpdump/patches/102-CVE-2018-16301.patch b/package/network/utils/tcpdump/patches/102-CVE-2018-16301.patch
+deleted file mode 100644
+index 39cd368915d2b..0000000000000
+--- a/package/network/utils/tcpdump/patches/102-CVE-2018-16301.patch
++++ /dev/null
+@@ -1,101 +0,0 @@
+-From 8ab211a7ec728bb0ad8c766c8eeb12deb0a13b86 Mon Sep 17 00:00:00 2001
+-From: Guy Harris <gharris@sonic.net>
+-Date: Wed, 30 Sep 2020 11:37:30 -0700
+-Subject: [PATCH] Handle very large -f files by rejecting them.
+-
+-_read(), on Windows, has a 32-bit size argument and a 32-bit return
+-value, so reject -f files that have more than 2^31-1 characters.
+-
+-Add some #defines so that, on Windows, we use _fstati64 to get the size
+-of that file, to handle large files.
+-
+-Don't assume that our definition for ssize_t is the same size as size_t;
+-by the time we want to print the return value of the read, we know it'll
+-fit into an int, so just cast it to int and print it with %d.
+-
+-(cherry picked from commit faf8fb70af3a013e5d662b8283dec742fd6b1a77)
+----
+- netdissect-stdinc.h | 16 +++++++++++++++-
+- tcpdump.c           | 15 ++++++++++++---
+- 2 files changed, 27 insertions(+), 4 deletions(-)
+-
+---- a/netdissect-stdinc.h
+-+++ b/netdissect-stdinc.h
+-@@ -149,10 +149,17 @@
+- #ifdef _MSC_VER
+- #define stat _stat
+- #define open _open
+--#define fstat _fstat
+- #define read _read
+- #define close _close
+- #define O_RDONLY _O_RDONLY
+-+
+-+/*
+-+ * We define our_fstat64 as _fstati64, and define our_statb as
+-+ * struct _stati64, so we get 64-bit file sizes.
+-+ */
+-+#define our_fstat _fstati64
+-+#define our_statb struct _stati64
+-+
+- #endif  /* _MSC_VER */
+- 
+- /*
+-@@ -211,6 +218,13 @@ typedef char* caddr_t;
+- 
+- #include <arpa/inet.h>
+- 
+-+/*
+-+ * We should have large file support enabled, if it's available,
+-+ * so just use fstat as our_fstat and struct stat as our_statb.
+-+ */
+-+#define our_fstat fstat
+-+#define our_statb struct stat
+-+
+- #endif /* _WIN32 */
+- 
+- #ifndef HAVE___ATTRIBUTE__
+---- a/tcpdump.c
+-+++ b/tcpdump.c
+-@@ -108,6 +108,7 @@ The Regents of the University of Califor
+- #endif /* HAVE_CAP_NG_H */
+- #endif /* HAVE_LIBCAP_NG */
+- 
+-+#include "netdissect-stdinc.h"
+- #include "netdissect.h"
+- #include "interface.h"
+- #include "addrtoname.h"
+-@@ -861,15 +862,22 @@ read_infile(char *fname)
+- {
+- 	register int i, fd, cc;
+- 	register char *cp;
+--	struct stat buf;
+-+	our_statb buf;
+- 
+- 	fd = open(fname, O_RDONLY|O_BINARY);
+- 	if (fd < 0)
+- 		error("can't open %s: %s", fname, pcap_strerror(errno));
+- 
+--	if (fstat(fd, &buf) < 0)
+-+	if (our_fstat(fd, &buf) < 0)
+- 		error("can't stat %s: %s", fname, pcap_strerror(errno));
+- 
+-+	/*
+-+	 * Reject files whose size doesn't fit into an int; a filter
+-+	 * *that* large will probably be too big.
+-+	 */
+-+	if (buf.st_size > INT_MAX)
+-+		error("%s is too large", fname);
+-+
+- 	cp = malloc((u_int)buf.st_size + 1);
+- 	if (cp == NULL)
+- 		error("malloc(%d) for %s: %s", (u_int)buf.st_size + 1,
+-@@ -878,7 +886,8 @@ read_infile(char *fname)
+- 	if (cc < 0)
+- 		error("read %s: %s", fname, pcap_strerror(errno));
+- 	if (cc != buf.st_size)
+--		error("short read %s (%d != %d)", fname, cc, (int)buf.st_size);
+-+		error("short read %s (%d != %d)", fname, (int) cc,
+-+		    (int)buf.st_size);
+- 
+- 	close(fd);
+- 	/* replace "# comment" with spaces */
+
+From 0ce9f07a44b8f920ea387574dd0b5b46035605bc Mon Sep 17 00:00:00 2001
+From: Nick Hainke <vincent@systemli.org>
+Date: Thu, 5 Jan 2023 15:45:38 +0100
+Subject: [PATCH 2/4] tcpdump: update to 4.99.2
+
+Update to latest version. For release information look into CHANGES
+file [0].
+
+Automatically refreshed:
+- 001-remove_pcap_debug.patch
+
+Manually refreshed:
+- 100-tcpdump_mini.patch
+
+old ipkg sizes:
+316554 bin/packages/mips_24kc/base/tcpdump_4.99.1-1_mips_24kc.ipk
+141457 bin/packages/mips_24kc/base/tcpdump-mini_4.99.1-1_mips_24kc.ipk
+
+new ipkg sizes:
+318089 bin/packages/mips_24kc/base/tcpdump_4.99.2-1_mips_24kc.ipk
+141941 bin/packages/mips_24kc/base/tcpdump-mini_4.99.2-1_mips_24kc.ipk
+
+[0] - https://github.com/the-tcpdump-group/tcpdump/blob/master/CHANGES
+
+Signed-off-by: Nick Hainke <vincent@systemli.org>
+(cherry picked from commit 5809fb4546eaf76d4d05a6e6fefb7ae0d8484681)
+Signed-off-by: Tomas Zak <tomas.zak@turris.com>
+---
+ package/network/utils/tcpdump/Makefile        |  6 +-
+ .../patches/001-remove_pcap_debug.patch       |  2 +-
+ .../tcpdump/patches/100-tcpdump_mini.patch    | 67 ++++++++++---------
+ 3 files changed, 38 insertions(+), 37 deletions(-)
+
+diff --git a/package/network/utils/tcpdump/Makefile b/package/network/utils/tcpdump/Makefile
+index d6da50f25e4e0..5019e0b3b67cf 100644
+--- a/package/network/utils/tcpdump/Makefile
++++ b/package/network/utils/tcpdump/Makefile
+@@ -8,12 +8,12 @@
+ include $(TOPDIR)/rules.mk
+ 
+ PKG_NAME:=tcpdump
+-PKG_VERSION:=4.99.1
++PKG_VERSION:=4.99.2
+ PKG_RELEASE:=1
+ 
+ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+-PKG_SOURCE_URL:=http://www.tcpdump.org/release/
+-PKG_HASH:=79b36985fb2703146618d87c4acde3e068b91c553fb93f021a337f175fd10ebe
++PKG_SOURCE_URL:=https://www.tcpdump.org/release/
++PKG_HASH:=f4304357d34b79d46f4e17e654f1f91f9ce4e3d5608a1badbd53295a26fb44d5
+ 
+ PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
+ PKG_LICENSE:=BSD-3-Clause
+diff --git a/package/network/utils/tcpdump/patches/001-remove_pcap_debug.patch b/package/network/utils/tcpdump/patches/001-remove_pcap_debug.patch
+index e79de526a1340..1988587029b65 100644
+--- a/package/network/utils/tcpdump/patches/001-remove_pcap_debug.patch
++++ b/package/network/utils/tcpdump/patches/001-remove_pcap_debug.patch
+@@ -1,6 +1,6 @@
+ --- a/configure
+ +++ b/configure
+-@@ -6230,97 +6230,6 @@ fi
++@@ -6568,97 +6568,6 @@ fi
+  
+  
+  
+diff --git a/package/network/utils/tcpdump/patches/100-tcpdump_mini.patch b/package/network/utils/tcpdump/patches/100-tcpdump_mini.patch
+index ad7c3feb4eceb..8a014cabf0b4e 100644
+--- a/package/network/utils/tcpdump/patches/100-tcpdump_mini.patch
++++ b/package/network/utils/tcpdump/patches/100-tcpdump_mini.patch
+@@ -1,6 +1,6 @@
+ --- a/Makefile.in
+ +++ b/Makefile.in
+-@@ -73,6 +73,85 @@ DEPENDENCY_CFLAG = @DEPENDENCY_CFLAG@
++@@ -73,6 +73,86 @@ DEPENDENCY_CFLAG = @DEPENDENCY_CFLAG@
+  
+  CSRC =	fptype.c tcpdump.c
+  
+@@ -77,6 +77,7 @@
+ +	print-tftp.c \
+ +	print-udp.c \
+ +	print-unsupported.c \
+++	print-whois.c \
+ +	signature.c \
+ +	strtoaddr.c \
+ +	util-print.c
+@@ -86,7 +87,7 @@
+  LIBNETDISSECT_SRC=\
+  	addrtoname.c \
+  	addrtostr.c \
+-@@ -252,6 +331,8 @@ LIBNETDISSECT_SRC=\
++@@ -254,6 +334,8 @@ LIBNETDISSECT_SRC=\
+  	strtoaddr.c \
+  	util-print.c
+  
+@@ -97,7 +98,7 @@
+  
+ --- a/addrtoname.c
+ +++ b/addrtoname.c
+-@@ -683,8 +683,10 @@ linkaddr_string(netdissect_options *ndo,
++@@ -680,8 +680,10 @@ linkaddr_string(netdissect_options *ndo,
+  	if (type == LINKADDR_ETHER && len == MAC_ADDR_LEN)
+  		return (etheraddr_string(ndo, ep));
+  
+@@ -108,7 +109,7 @@
+  
+  	tp = lookup_bytestring(ndo, ep, len);
+  	if (tp->bs_name)
+-@@ -1263,6 +1265,7 @@ init_addrtoname(netdissect_options *ndo,
++@@ -1260,6 +1262,7 @@ init_addrtoname(netdissect_options *ndo,
+  	init_ipxsaparray(ndo);
+  }
+  
+@@ -116,7 +117,7 @@
+  const char *
+  dnaddr_string(netdissect_options *ndo, u_short dnaddr)
+  {
+-@@ -1279,6 +1282,7 @@ dnaddr_string(netdissect_options *ndo, u
++@@ -1276,6 +1279,7 @@ dnaddr_string(netdissect_options *ndo, u
+  
+  	return(tp->name);
+  }
+@@ -126,7 +127,7 @@
+  struct hnamemem *
+ --- a/print-ether.c
+ +++ b/print-ether.c
+-@@ -539,6 +539,7 @@ ethertype_print(netdissect_options *ndo,
++@@ -545,6 +545,7 @@ ethertype_print(netdissect_options *ndo,
+  		arp_print(ndo, p, length, caplen);
+  		return (1);
+  
+@@ -134,7 +135,7 @@
+  	case ETHERTYPE_DN:
+  		decnet_print(ndo, p, length, caplen);
+  		return (1);
+-@@ -569,6 +570,7 @@ ethertype_print(netdissect_options *ndo,
++@@ -575,6 +576,7 @@ ethertype_print(netdissect_options *ndo,
+  		ND_TCHECK_LEN(p, 1);
+  		isoclns_print(ndo, p + 1, length - 1);
+  		return(1);
+@@ -142,19 +143,19 @@
+  
+  	case ETHERTYPE_PPPOED:
+  	case ETHERTYPE_PPPOES:
+-@@ -581,9 +583,11 @@ ethertype_print(netdissect_options *ndo,
++@@ -587,9 +589,11 @@ ethertype_print(netdissect_options *ndo,
+  		eapol_print(ndo, p);
+  		return (1);
+  
+ +#ifndef TCPDUMP_MINI
+- 	case ETHERTYPE_RRCP:
+- 		rrcp_print(ndo, p, length, src, dst);
++ 	case ETHERTYPE_REALTEK:
++ 		rtl_print(ndo, p, length, src, dst);
+  		return (1);
+ +#endif
+  
+  	case ETHERTYPE_PPP:
+  		if (length) {
+-@@ -592,6 +596,7 @@ ethertype_print(netdissect_options *ndo,
++@@ -598,6 +602,7 @@ ethertype_print(netdissect_options *ndo,
+  		}
+  		return (1);
+  
+@@ -162,7 +163,7 @@
+  	case ETHERTYPE_MPCP:
+  		mpcp_print(ndo, p, length);
+  		return (1);
+-@@ -604,19 +609,23 @@ ethertype_print(netdissect_options *ndo,
++@@ -610,19 +615,23 @@ ethertype_print(netdissect_options *ndo,
+  	case ETHERTYPE_CFM_OLD:
+  		cfm_print(ndo, p, length);
+  		return (1);
+@@ -186,7 +187,7 @@
+  	case ETHERTYPE_MPLS:
+  	case ETHERTYPE_MPLS_MULTI:
+  		mpls_print(ndo, p, length);
+-@@ -646,6 +655,7 @@ ethertype_print(netdissect_options *ndo,
++@@ -652,6 +661,7 @@ ethertype_print(netdissect_options *ndo,
+  	case ETHERTYPE_PTP:
+  		ptp_print(ndo, p, length);
+  		return (1);
+@@ -214,7 +215,7 @@
+  		break;
+ --- a/print-icmp6.c
+ +++ b/print-icmp6.c
+-@@ -1384,7 +1384,7 @@ get_upperlayer(netdissect_options *ndo,
++@@ -1371,7 +1371,7 @@ get_upperlayer(netdissect_options *ndo,
+  			nh = GET_U_1(fragh->ip6f_nxt);
+  			hlen = sizeof(struct ip6_frag);
+  			break;
+@@ -223,7 +224,7 @@
+  		case IPPROTO_AH:
+  			ah = (const struct ah *)bp;
+  			if (!ND_TTEST_1(ah->ah_len))
+-@@ -1392,7 +1392,7 @@ get_upperlayer(netdissect_options *ndo,
++@@ -1379,7 +1379,7 @@ get_upperlayer(netdissect_options *ndo,
+  			nh = GET_U_1(ah->ah_nxt);
+  			hlen = (GET_U_1(ah->ah_len) + 2) << 2;
+  			break;
+@@ -336,7 +337,7 @@
+  		default:
+  			/*
+  			 * AH and ESP are, in the RFCs that describe them,
+-@@ -357,6 +358,7 @@ ip6_print(netdissect_options *ndo, const
++@@ -375,6 +376,7 @@ ip6_print(netdissect_options *ndo, const
+  			nh = GET_U_1(cp);
+  			break;
+  
+@@ -344,7 +345,7 @@
+  		case IPPROTO_FRAGMENT:
+  			advance = frag6_print(ndo, cp, (const u_char *)ip6);
+  			if (advance < 0 || ndo->ndo_snapend <= cp + advance) {
+-@@ -387,7 +389,7 @@ ip6_print(netdissect_options *ndo, const
++@@ -405,7 +407,7 @@ ip6_print(netdissect_options *ndo, const
+  			nh = GET_U_1(cp);
+  			nd_pop_packet_info(ndo);
+  			return;
+@@ -462,7 +463,7 @@
+  static void
+  ppp_hdlc(netdissect_options *ndo,
+           const u_char *p, u_int length)
+-@@ -1440,17 +1441,19 @@ trunc:
++@@ -1451,17 +1452,19 @@ trunc:
+  	ndo->ndo_snapend = se;
+  	nd_print_trunc(ndo);
+  }
+@@ -483,7 +484,7 @@
+  
+  	switch (proto) {
+  	case PPP_LCP: /* fall through */
+-@@ -1483,6 +1486,7 @@ handle_ppp(netdissect_options *ndo,
++@@ -1494,6 +1497,7 @@ handle_ppp(netdissect_options *ndo,
+  	case PPP_IPV6:
+  		ip6_print(ndo, p, length);
+  		break;
+@@ -491,7 +492,7 @@
+  	case ETHERTYPE_IPX:	/*XXX*/
+  	case PPP_IPX:
+  		ipx_print(ndo, p, length);
+-@@ -1494,6 +1498,7 @@ handle_ppp(netdissect_options *ndo,
++@@ -1505,6 +1509,7 @@ handle_ppp(netdissect_options *ndo,
+  	case PPP_MPLS_MCAST:
+  		mpls_print(ndo, p, length);
+  		break;
+@@ -499,7 +500,7 @@
+  	case PPP_COMP:
+  		ND_PRINT("compressed PPP data");
+  		break;
+-@@ -1634,6 +1639,7 @@ ppp_if_print(netdissect_options *ndo,
++@@ -1652,6 +1657,7 @@ ppp_if_print(netdissect_options *ndo,
+  	ppp_print(ndo, p, length);
+  }
+  
+@@ -507,14 +508,14 @@
+  /*
+   * PPP I/F printer to use if we know that RFC 1662-style PPP in HDLC-like
+   * framing, or Cisco PPP with HDLC framing as per section 4.3.1 of RFC 1547,
+-@@ -1877,3 +1883,4 @@ printx:
++@@ -1895,3 +1901,4 @@ printx:
+  #endif /* __bsdi__ */
+  	ndo->ndo_ll_hdr_len += hdrlength;
+  }
+ +#endif
+ --- a/print-sll.c
+ +++ b/print-sll.c
+-@@ -460,12 +460,14 @@ recurse:
++@@ -465,12 +465,14 @@ recurse:
+  		 */
+  		switch (ether_type) {
+  
+@@ -531,7 +532,7 @@
+  			/*
+ --- a/print-tcp.c
+ +++ b/print-tcp.c
+-@@ -612,6 +612,7 @@ tcp_print(netdissect_options *ndo,
++@@ -614,6 +614,7 @@ tcp_print(netdissect_options *ndo,
+                                  ND_PRINT(" %u", utoval);
+                                  break;
+  
+@@ -539,7 +540,7 @@
+                          case TCPOPT_MPTCP:
+                              {
+                                  const u_char *snapend_save;
+-@@ -635,7 +636,7 @@ tcp_print(netdissect_options *ndo,
++@@ -637,7 +638,7 @@ tcp_print(netdissect_options *ndo,
+                                          goto bad;
+                                  break;
+                              }
+@@ -548,7 +549,7 @@
+                          case TCPOPT_FASTOPEN:
+                                  datalen = len - 2;
+                                  LENCHECK(datalen);
+-@@ -720,6 +721,7 @@ tcp_print(netdissect_options *ndo,
++@@ -722,6 +723,7 @@ tcp_print(netdissect_options *ndo,
+                  return;
+          }
+  
+@@ -556,7 +557,7 @@
+          if (ndo->ndo_packettype) {
+                  switch (ndo->ndo_packettype) {
+                  case PT_ZMTP1:
+-@@ -735,6 +737,7 @@ tcp_print(netdissect_options *ndo,
++@@ -737,6 +739,7 @@ tcp_print(netdissect_options *ndo,
+                  }
+                  return;
+          }
+@@ -564,12 +565,12 @@
+  
+          if (IS_SRC_OR_DST_PORT(TELNET_PORT)) {
+                  telnet_print(ndo, bp, length);
+-@@ -745,24 +748,31 @@ tcp_print(netdissect_options *ndo,
++@@ -746,24 +749,31 @@ tcp_print(netdissect_options *ndo,
++         } else if (IS_SRC_OR_DST_PORT(WHOIS_PORT)) {
+                  ND_PRINT(": ");
+-                 ndo->ndo_protocol = "whois";	/* needed by txtproto_print() */
+-                 txtproto_print(ndo, bp, length, NULL, 0); /* RFC 3912 */
++                 whois_print(ndo, bp, length);
+ -        } else if (IS_SRC_OR_DST_PORT(BGP_PORT))
+-+        } 
+++        }
+ +#ifndef TCPDUMP_MINI
+ +        else if (IS_SRC_OR_DST_PORT(BGP_PORT))
+                  bgp_print(ndo, bp, length);
+@@ -597,7 +598,7 @@
+          else if (IS_SRC_OR_DST_PORT(FTP_PORT)) {
+                  ND_PRINT(": ");
+                  ftp_print(ndo, bp, length);
+-@@ -775,12 +785,14 @@ tcp_print(netdissect_options *ndo,
++@@ -776,12 +786,14 @@ tcp_print(netdissect_options *ndo,
+          } else if (IS_SRC_OR_DST_PORT(NAMESERVER_PORT)) {
+                  /* over_tcp: TRUE, is_mdns: FALSE */
+                  domain_print(ndo, bp, length, TRUE, FALSE);
+@@ -831,7 +832,7 @@
+  	{ null_if_print,	DLT_LOOP },
+  #endif
+ +#ifndef TCPDUMP_MINI
+- #if defined(DLT_PFLOG) && defined(HAVE_NET_IF_PFLOG_H)
++ #ifdef DLT_PFLOG
+  	{ pflog_if_print,	DLT_PFLOG },
+  #endif
+ @@ -200,6 +211,7 @@ static const struct printer printers[] =
+
+From 1564bee479a3784208e8bd125f3653ff7c4ab5a1 Mon Sep 17 00:00:00 2001
+From: Nick Hainke <vincent@systemli.org>
+Date: Wed, 25 Jan 2023 00:22:01 +0100
+Subject: [PATCH 3/4] tcpdump: update to 4.99.3
+
+Changes:
+https://git.tcpdump.org/tcpdump/blob/032e4923e5202ea4d5a6d1cead83ed1927135874:/CHANGES
+
+Signed-off-by: Nick Hainke <vincent@systemli.org>
+(cherry picked from commit d68a73a025648cebbf68862090471d865b2a6605)
+Signed-off-by: Tomas Zak <tomas.zak@turris.com>
+---
+ package/network/utils/tcpdump/Makefile | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/package/network/utils/tcpdump/Makefile b/package/network/utils/tcpdump/Makefile
+index 5019e0b3b67cf..827a66e8604fe 100644
+--- a/package/network/utils/tcpdump/Makefile
++++ b/package/network/utils/tcpdump/Makefile
+@@ -8,12 +8,12 @@
+ include $(TOPDIR)/rules.mk
+ 
+ PKG_NAME:=tcpdump
+-PKG_VERSION:=4.99.2
++PKG_VERSION:=4.99.3
+ PKG_RELEASE:=1
+ 
+ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+ PKG_SOURCE_URL:=https://www.tcpdump.org/release/
+-PKG_HASH:=f4304357d34b79d46f4e17e654f1f91f9ce4e3d5608a1badbd53295a26fb44d5
++PKG_HASH:=ad75a6ed3dc0d9732945b2e5483cb41dc8b4b528a169315e499c6861952e73b3
+ 
+ PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
+ PKG_LICENSE:=BSD-3-Clause
+
+From 7511cb755470ec75e4ad27697c9becb7a0ffa015 Mon Sep 17 00:00:00 2001
+From: Nick Hainke <vincent@systemli.org>
+Date: Thu, 13 Apr 2023 11:20:05 +0200
+Subject: [PATCH 4/4] tcpdump: update to 4.99.4
+
+Fixes CVE-2023-1801.
+
+Changelog can be found here:
+https://git.tcpdump.org/tcpdump/blob/55bc126b0216cfe409b8d6bd378f65679d136ddf:/CHANGES
+
+Signed-off-by: Nick Hainke <vincent@systemli.org>
+(cherry picked from commit 36c30bee5e8d7821408358fbaf8eade5c8865672)
+Signed-off-by: Tomas Zak <tomas.zak@turris.com>
+---
+ package/network/utils/tcpdump/Makefile | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/package/network/utils/tcpdump/Makefile b/package/network/utils/tcpdump/Makefile
+index 827a66e8604fe..79792f15dd159 100644
+--- a/package/network/utils/tcpdump/Makefile
++++ b/package/network/utils/tcpdump/Makefile
+@@ -8,12 +8,12 @@
+ include $(TOPDIR)/rules.mk
+ 
+ PKG_NAME:=tcpdump
+-PKG_VERSION:=4.99.3
++PKG_VERSION:=4.99.4
+ PKG_RELEASE:=1
+ 
+ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+ PKG_SOURCE_URL:=https://www.tcpdump.org/release/
+-PKG_HASH:=ad75a6ed3dc0d9732945b2e5483cb41dc8b4b528a169315e499c6861952e73b3
++PKG_HASH:=0232231bb2f29d6bf2426e70a08a7e0c63a0d59a9b44863b7f5e2357a6e49fea
+ 
+ PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
+ PKG_LICENSE:=BSD-3-Clause
-- 
GitLab