[PATCH v10 14/19] net/pcap: reject non-Ethernet interfaces

Stephen Hemminger
2026-01-30T01:15:48Z

The pcap PMD sends and receives raw Ethernet frames. If used with
an interface that has a different link type, packets will be malformed.

On FreeBSD and macOS, the loopback interface uses DLT_NULL which expects
a 4-byte address family header instead of an Ethernet header. Sending
Ethernet frames to such interfaces causes kernel warnings like:
looutput: af=-1 unexpected

Add a check after pcap_activate() to verify the interface uses
DLT_EN10MB (Ethernet) link type and reject others with a clear error.

Fixes: 4c173302c307 ("pcap: add new driver")
Cc: stable@dpdk.org

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/net/pcap/pcap_ethdev.c | 11 +++++++++++
1 file changed, 11 insertions(+)

diff --git a/drivers/net/pcap/pcap_ethdev.c b/drivers/net/pcap/pcap_ethdev.c
index 90bedb6286..f1965449eb 100644
--- a/drivers/net/pcap/pcap_ethdev.c
+++ b/drivers/net/pcap/pcap_ethdev.c
@@ -578,6 +578,17 @@ open_iface_live(const char *iface, pcap_t **pcap)
goto error;
}

+ /*
+ * Verify interface supports Ethernet link type.
+ * Loopback on FreeBSD/macOS uses DLT_NULL which expects a 4-byte
+ * address family header instead of Ethernet, causing kernel warnings.
+ */
+ if (pcap_datalink(pc) != DLT_EN10MB) {
+ PMD_LOG(ERR, "%s: not Ethernet (link type %d)",
+ iface, pcap_datalink(pc));
+ goto error;
+ }
+
if (pcap_setnonblock(pc, 1, errbuf)) {
PMD_LOG(ERR, "Couldn't set non-blocking on %s: %s", iface, errbuf);
goto error;
--
2.51.0