aboutsummaryrefslogtreecommitdiff
path: root/pcap-bt-monitor-linux.c
diff options
context:
space:
mode:
authorJakub Sitnicki <jsitnicki@gmail.com>2015-03-26 22:35:29 +0100
committerFrancois-Xavier Le Bail <fx.lebail@yahoo.com>2015-06-03 14:42:51 +0200
commitb3776f3d50df9de9fcf702bd21a3ecb2539ffef4 (patch)
tree6962d82f296bd2e05bb8c66dced3d2b8733ed6ea /pcap-bt-monitor-linux.c
parentaea73b7008e233c36be18a862937e60a9d300d82 (diff)
Fix building Bluetooth Linux Monitor support with BlueZ 5.1+
Starting from version 5.1 BlueZ no longer exports the mgmt.h header or any other header that declares the structure of packets passed over HCI sockets set to use the HCI monitor channel. Declare the structure locally and give it the same name as in the Linux kernel 3.4+.
Diffstat (limited to 'pcap-bt-monitor-linux.c')
-rw-r--r--pcap-bt-monitor-linux.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/pcap-bt-monitor-linux.c b/pcap-bt-monitor-linux.c
index f193e263..b18bdcae 100644
--- a/pcap-bt-monitor-linux.c
+++ b/pcap-bt-monitor-linux.c
@@ -34,12 +34,12 @@
#endif
#include <errno.h>
+#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
-#include <bluetooth/mgmt.h>
#include "pcap/bluetooth.h"
#include "pcap-int.h"
@@ -49,6 +49,16 @@
#define BT_CONTROL_SIZE 32
#define INTERFACE_NAME "bluetooth-monitor"
+/*
+ * Fields and alignment must match the declaration in the Linux kernel 3.4+.
+ * See struct hci_mon_hdr in include/net/bluetooth/hci_mon.h.
+ */
+struct hci_mon_hdr {
+ uint16_t opcode;
+ uint16_t index;
+ uint16_t len;
+} __attribute__((packed));
+
int
bt_monitor_findalldevs(pcap_if_t **alldevsp, char *err_str)
{
@@ -72,12 +82,12 @@ bt_monitor_read(pcap_t *handle, int max_packets _U_, pcap_handler callback, u_ch
ssize_t ret;
struct pcap_pkthdr pkth;
pcap_bluetooth_linux_monitor_header *bthdr;
- struct mgmt_hdr hdr;
+ struct hci_mon_hdr hdr;
bthdr = (pcap_bluetooth_linux_monitor_header*) &handle->buffer[handle->offset];
iv[0].iov_base = &hdr;
- iv[0].iov_len = MGMT_HDR_SIZE;
+ iv[0].iov_len = sizeof(hdr);
iv[1].iov_base = &handle->buffer[handle->offset + sizeof(pcap_bluetooth_linux_monitor_header)];
iv[1].iov_len = handle->snapshot;
@@ -103,7 +113,7 @@ bt_monitor_read(pcap_t *handle, int max_packets _U_, pcap_handler callback, u_ch
return -1;
}
- pkth.caplen = ret - MGMT_HDR_SIZE + sizeof(pcap_bluetooth_linux_monitor_header);
+ pkth.caplen = ret - sizeof(hdr) + sizeof(pcap_bluetooth_linux_monitor_header);
pkth.len = pkth.caplen;
for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; cmsg = CMSG_NXTHDR(&msg, cmsg)) {