diff --git a/pcap-bt-linux.c b/pcap-bt-linux.c index a36c144..55c1b6a 100644 --- a/pcap-bt-linux.c +++ b/pcap-bt-linux.c @@ -67,7 +67,6 @@ static const char rcsid[] _U_ = static int bt_activate(pcap_t *); static int bt_read_linux(pcap_t *, int , pcap_handler , u_char *); static int bt_inject_linux(pcap_t *, const void *, size_t); -static int bt_setfilter_linux(pcap_t *, struct bpf_program *); static int bt_setdirection_linux(pcap_t *, pcap_direction_t); static int bt_stats_linux(pcap_t *, struct pcap_stat *); @@ -172,7 +171,7 @@ bt_activate(pcap_t* handle) handle->read_op = bt_read_linux; handle->inject_op = bt_inject_linux; - handle->setfilter_op = bt_setfilter_linux; + handle->setfilter_op = install_bpf_program; /* no kernel filtering */ handle->setdirection_op = bt_setdirection_linux; handle->set_datalink_op = NULL; /* can't change data link type */ handle->getnonblock_op = pcap_getnonblock_fd; @@ -301,10 +300,11 @@ bt_read_linux(pcap_t *handle, int max_packets, pcap_handler callback, u_char *us while (cmsg) { switch (cmsg->cmsg_type) { case HCI_CMSG_DIR: - in = *((int *) CMSG_DATA(cmsg)); + memcpy(&in, CMSG_DATA(cmsg), sizeof in); break; case HCI_CMSG_TSTAMP: - pkth.ts = *((struct timeval *) CMSG_DATA(cmsg)); + memcpy(&pkth.ts, CMSG_DATA(cmsg), + sizeof pkth.ts); break; } cmsg = CMSG_NXTHDR(&msg, cmsg); @@ -316,8 +316,13 @@ bt_read_linux(pcap_t *handle, int max_packets, pcap_handler callback, u_char *us bthdr->direction = htonl(in != 0); pkth.caplen+=sizeof(pcap_bluetooth_h4_header); pkth.len = pkth.caplen; - callback(user, &pkth, &handle->buffer[handle->offset]); - return 1; + if (handle->fcode.bf_insns == NULL || + bpf_filter(handle->fcode.bf_insns, &handle->buffer[handle->offset], + pkth.len, pkth.caplen)) { + callback(user, &pkth, &handle->buffer[handle->offset]); + return 1; + } + return 0; /* didn't pass filter */ } static int @@ -357,13 +362,6 @@ bt_stats_linux(pcap_t *handle, struct pcap_stat *stats) return 0; } -static int -bt_setfilter_linux(pcap_t *p, struct bpf_program *fp) -{ - return 0; -} - - static int bt_setdirection_linux(pcap_t *p, pcap_direction_t d) { diff --git a/pcap-usb-linux.c b/pcap-usb-linux.c index fea527f..daaa900 100644 --- a/pcap-usb-linux.c +++ b/pcap-usb-linux.c @@ -122,7 +122,6 @@ static int usb_read_linux(pcap_t *, int , pcap_handler , u_char *); static int usb_read_linux_bin(pcap_t *, int , pcap_handler , u_char *); static int usb_read_linux_mmap(pcap_t *, int , pcap_handler , u_char *); static int usb_inject_linux(pcap_t *, const void *, size_t); -static int usb_setfilter_linux(pcap_t *, struct bpf_program *); static int usb_setdirection_linux(pcap_t *, pcap_direction_t); static void usb_cleanup_linux_mmap(pcap_t *); @@ -301,7 +300,7 @@ usb_activate(pcap_t* handle) handle->linktype = DLT_USB_LINUX; handle->inject_op = usb_inject_linux; - handle->setfilter_op = usb_setfilter_linux; + handle->setfilter_op = install_bpf_program; /* no kernel filtering */ handle->setdirection_op = usb_setdirection_linux; handle->set_datalink_op = NULL; /* can't change data link type */ handle->getnonblock_op = pcap_getnonblock_fd; @@ -597,12 +596,17 @@ usb_read_linux(pcap_t *handle, int max_packets, pcap_handler callback, u_char *u got: uhdr->data_len = data_len; - handle->md.packets_read++; if (pkth.caplen > handle->snapshot) pkth.caplen = handle->snapshot; - callback(user, &pkth, handle->buffer); - return 1; + if (handle->fcode.bf_insns == NULL || + bpf_filter(handle->fcode.bf_insns, handle->buffer, + pkth.len, pkth.caplen)) { + handle->md.packets_read++; + callback(user, &pkth, handle->buffer); + return 1; + } + return 0; /* didn't pass filter */ } static int @@ -688,12 +692,6 @@ usb_stats_linux(pcap_t *handle, struct pcap_stat *stats) return 0; } -static int -usb_setfilter_linux(pcap_t *p, struct bpf_program *fp) -{ - return 0; -} - static int usb_setdirection_linux(pcap_t *p, pcap_direction_t d) { @@ -767,9 +765,15 @@ usb_read_linux_bin(pcap_t *handle, int max_packets, pcap_handler callback, u_cha pkth.ts.tv_sec = info.hdr->ts_sec; pkth.ts.tv_usec = info.hdr->ts_usec; - handle->md.packets_read++; - callback(user, &pkth, handle->buffer); - return 1; + if (handle->fcode.bf_insns == NULL || + bpf_filter(handle->fcode.bf_insns, handle->buffer, + pkth.len, pkth.caplen)) { + handle->md.packets_read++; + callback(user, &pkth, handle->buffer); + return 1; + } + + return 0; /* didn't pass filter */ } /* @@ -841,9 +845,13 @@ usb_read_linux_mmap(pcap_t *handle, int max_packets, pcap_handler callback, u_ch pkth.ts.tv_sec = hdr->ts_sec; pkth.ts.tv_usec = hdr->ts_usec; - handle->md.packets_read++; - callback(user, &pkth, (u_char*) hdr); - packets++; + if (handle->fcode.bf_insns == NULL || + bpf_filter(handle->fcode.bf_insns, (u_char*) hdr, + pkth.len, pkth.caplen)) { + handle->md.packets_read++; + callback(user, &pkth, (u_char*) hdr); + packets++; + } } /* with max_packets <= 0 we stop afer the first chunk*/