[PATCH] net: pcap: support lwIP

James Hilliard <[email protected]>
Newsgroups org.u-boot-project.lists.u-boot
Message-ID <[email protected]>
The packet capture command is restricted to NET_LEGACY even though the
recorder only consumes Ethernet frames. The lwIP adapter sends and receives
directly through Ethernet drivers, bypassing the legacy capture hooks.

Build the recorder for either network stack and add capture hooks to the
lwIP transmit and receive paths. Print the capture summary when the
outermost lwIP network operation stops, matching the legacy net_loop()
behavior.

Signed-off-by: James Hilliard <[email protected]>
---
 cmd/Kconfig         | 14 +++++++-------
 net/Makefile        |  2 +-
 net/lwip/net-lwip.c |  8 ++++++++
 3 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/cmd/Kconfig b/cmd/Kconfig
index ff90a87024c..7025aab4714 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -2078,13 +2078,6 @@ config BOOTP_TIMEOFFSET
 	bool "Request & store 'timeoffset' from BOOTP/DHCP server"
 	depends on CMD_BOOTP && CMD_SNTP
 
-config CMD_PCAP
-	bool "pcap capture"
-	help
-	  Selecting this will allow capturing all Ethernet packets and store
-	  them in physical memory in a PCAP formated file,
-	  later to be analyzed by PCAP reader application (IE. WireShark).
-
 config BOOTP_PXE
 	bool "Send PXE client arch to BOOTP/DHCP server"
 	default y
@@ -2210,6 +2203,13 @@ config CMD_WOL
 
 endif  # if NET_LEGACY
 
+config CMD_PCAP
+	bool "pcap capture"
+	help
+	  Selecting this will allow capturing all Ethernet packets and store
+	  them in physical memory in a PCAP formated file,
+	  later to be analyzed by PCAP reader application (IE. WireShark).
+
 config CMD_DHCP
 	bool "dhcp"
 	select PROT_DHCP_LWIP if NET_LWIP
diff --git a/net/Makefile b/net/Makefile
index ceac6de6377..6666db519a1 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -19,7 +19,6 @@ obj-$(CONFIG_CMD_NFS)  += nfs.o
 obj-$(CONFIG_CMD_PING) += ping.o
 obj-$(CONFIG_CMD_PING6) += ping6.o
 obj-$(CONFIG_CMD_DHCP6) += dhcpv6.o
-obj-$(CONFIG_CMD_PCAP) += pcap.o
 obj-$(CONFIG_CMD_RARP) += rarp.o
 obj-$(CONFIG_CMD_SNTP) += sntp.o
 obj-$(CONFIG_CMD_TFTPBOOT) += tftp.o
@@ -44,6 +43,7 @@ obj-$(CONFIG_$(PHASE_)BOOTDEV_ETH) += eth_bootdev.o
 obj-$(CONFIG_DM_MDIO)  += mdio-uclass.o
 obj-$(CONFIG_DM_MDIO_MUX) += mdio-mux-uclass.o
 obj-$(CONFIG_CMD_NFS)  += nfs-common.o
+obj-$(CONFIG_CMD_PCAP) += pcap.o
 obj-$(CONFIG_$(PHASE_)DM_ETH) += eth_common.o
 obj-y += net-common.o
 endif
diff --git a/net/lwip/net-lwip.c b/net/lwip/net-lwip.c
index 8f8f9d69020..e114d98c1c8 100644
--- a/net/lwip/net-lwip.c
+++ b/net/lwip/net-lwip.c
@@ -19,6 +19,7 @@
 #include <lwip/prot/etharp.h>
 #include <lwip/timeouts.h>
 #include <net.h>
+#include <net/pcap.h>
 #include <timer.h>
 #include <u-boot/schedule.h>
 
@@ -77,6 +78,8 @@ static err_t net_lwip_tx(struct netif *netif, struct pbuf *p)
 	}
 
 	err = eth_get_ops(udev)->send(udev, pp, plen);
+	if (err >= 0 && CONFIG_IS_ENABLED(CMD_PCAP))
+		pcap_post(pp, plen, true);
 
 	if (pp_allocated)
 		free(pp);
@@ -225,6 +228,8 @@ void net_lwip_eth_stop(void)
 		return;
 
 	eth_halt();
+	if (CONFIG_IS_ENABLED(CMD_PCAP) && pcap_active())
+		pcap_print_status();
 }
 
 static struct netif *new_netif(struct udevice *udev, bool with_ip)
@@ -365,6 +370,9 @@ int net_lwip_rx(struct udevice *udev, struct netif *netif)
 		flags = 0;
 
 		if (len > 0) {
+			if (CONFIG_IS_ENABLED(CMD_PCAP))
+				pcap_post(packet, len, false);
+
 			if (CONFIG_IS_ENABLED(LWIP_DEBUG_RXTX)) {
 				printf("net_lwip_tx: %u bytes, udev %s \n", len,
 				       udev->name);

---
base-commit: 964ad5b5c91b7be56e443e899d7f873e6aa8c9fc
change-id: 20260825-submit-lwip-pcap-v1-fd0514deb533

Best regards,
--  
James Hilliard <[email protected]>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.