Files
haikuports/net-libs/libpcap/patches/libpcap-1.10.4.patchset
2024-02-17 17:35:19 +01:00

52 lines
1.4 KiB
Plaintext

From e025ba1728337329298f54cb2cca4ebb0f931948 Mon Sep 17 00:00:00 2001
From: Jerome Duval <jerome.duval@gmail.com>
Date: Sat, 17 Feb 2024 17:26:58 +0100
Subject: libpcap: switch to DLT_RAW for loop and tunnel devices
backported to 1.10 from upstream 1.11
diff --git a/pcap-haiku.cpp b/pcap-haiku.cpp
index 8ae9119..2afca60 100644
--- a/pcap-haiku.cpp
+++ b/pcap-haiku.cpp
@@ -189,8 +189,6 @@ pcap_activate_haiku(pcap_t *handle)
}
handle->offset = 0;
- handle->linktype = DLT_EN10MB;
- // TODO: check interface type!
return 0;
}
@@ -240,6 +238,16 @@ pcap_create_interface(const char *device, char *errorBuffer)
return NULL;
}
+ // get address
+ if (ioctl(socket, SIOCGIFADDR, &request, sizeof(struct ifreq)) < 0) {
+ snprintf(errorBuffer, PCAP_ERRBUF_SIZE, "Cannot get address: %s\n",
+ strerror(errno));
+ close(socket);
+ return NULL;
+ }
+
+ uint8 sdl_type = ((sockaddr_dl&)request.ifr_addr).sdl_type;
+
// start monitoring
if (ioctl(socket, SIOCSPACKETCAP, &request, sizeof(struct ifreq)) < 0) {
snprintf(errorBuffer, PCAP_ERRBUF_SIZE, "Cannot start monitoring: %s\n",
@@ -261,6 +269,10 @@ pcap_create_interface(const char *device, char *errorBuffer)
handle->selectable_fd = socket;
handle->fd = socket;
+#ifndef IFT_TUNNEL
+#define IFT_TUNNEL IFT_TUN
+#endif
+ handle->linktype = (sdl_type == IFT_LOOP || sdl_type == IFT_TUNNEL) ? DLT_RAW : DLT_EN10MB;
handle->activate_op = pcap_activate_haiku;
--
2.42.1