X-Git-Url: https://git.tcpdump.org/libpcap/blobdiff_plain/10d7a3c17283fb3f97753a3f291468af774e871f..09b51d326c38ea8e10ce4da09c09d50e08c5aeb8:/pcap-bt-monitor-linux.c diff --git a/pcap-bt-monitor-linux.c b/pcap-bt-monitor-linux.c index 00d48798..206e65b5 100644 --- a/pcap-bt-monitor-linux.c +++ b/pcap-bt-monitor-linux.c @@ -49,6 +49,14 @@ #define BT_CONTROL_SIZE 32 #define INTERFACE_NAME "bluetooth-monitor" +/* + * Private data. + * Currently contains nothing. + */ +struct pcap_bt_monitor { + int dummy; +}; + /* * 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. @@ -119,6 +127,10 @@ bt_monitor_read(pcap_t *handle, int max_packets _U_, pcap_handler callback, u_ch } while ((ret == -1) && (errno == EINTR)); if (ret < 0) { + if (errno == EAGAIN || errno == EWOULDBLOCK) { + /* Nonblocking mode, no data */ + return 0; + } pcap_fmt_errmsg_for_errno(handle->errbuf, PCAP_ERRBUF_SIZE, errno, "Can't receive packet"); return -1; @@ -149,17 +161,11 @@ bt_monitor_read(pcap_t *handle, int max_packets _U_, pcap_handler callback, u_ch static int bt_monitor_inject(pcap_t *handle, const void *buf _U_, int size _U_) { - pcap_snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "inject not supported yet"); + snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, + "Packet injection is not supported yet on Bluetooth monitor devices"); return -1; } -static int -bt_monitor_setdirection(pcap_t *p, pcap_direction_t d) -{ - p->direction = d; - return 0; -} - static int bt_monitor_stats(pcap_t *handle _U_, struct pcap_stat *stats) { @@ -199,7 +205,7 @@ bt_monitor_activate(pcap_t* handle) handle->read_op = bt_monitor_read; handle->inject_op = bt_monitor_inject; handle->setfilter_op = install_bpf_program; /* no kernel filtering */ - handle->setdirection_op = bt_monitor_setdirection; + handle->setdirection_op = NULL; /* Not implemented */ handle->set_datalink_op = NULL; /* can't change data link type */ handle->getnonblock_op = pcap_getnonblock_fd; handle->setnonblock_op = pcap_setnonblock_fd; @@ -262,7 +268,7 @@ bt_monitor_create(const char *device, char *ebuf, int *is_ours) } *is_ours = 1; - p = pcap_create_common(ebuf, 0); + p = PCAP_CREATE_COMMON(ebuf, struct pcap_bt_monitor); if (p == NULL) return NULL;