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: [email protected]

Signed-off-by: Stephen Hemminger <[email protected]>
---
 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

Reply via email to