diff options
Diffstat (limited to 'contrib/libpcap/pcap-can-linux.c')
-rw-r--r-- | contrib/libpcap/pcap-can-linux.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/contrib/libpcap/pcap-can-linux.c b/contrib/libpcap/pcap-can-linux.c index f6a3925..3a9e8cb 100644 --- a/contrib/libpcap/pcap-can-linux.c +++ b/contrib/libpcap/pcap-can-linux.c @@ -72,6 +72,13 @@ static int can_setfilter_linux(pcap_t *, struct bpf_program *); static int can_setdirection_linux(pcap_t *, pcap_direction_t); static int can_stats_linux(pcap_t *, struct pcap_stat *); +/* + * Private data for capturing on Linux CANbus devices. + */ +struct pcap_can { + int ifindex; /* interface index of device we're bound to */ +}; + int can_findalldevs(pcap_if_t **devlistp, char *errbuf) { @@ -124,7 +131,7 @@ can_create(const char *device, char *ebuf, int *is_ours) /* OK, it's probably ours. */ *is_ours = 1; - p = pcap_create_common(device, ebuf); + p = pcap_create_common(device, ebuf, sizeof (struct pcap_can)); if (p == NULL) return (NULL); @@ -136,6 +143,7 @@ can_create(const char *device, char *ebuf, int *is_ours) static int can_activate(pcap_t* handle) { + struct pcap_can *handlep = handle->priv; struct sockaddr_can addr; struct ifreq ifr; @@ -172,7 +180,7 @@ can_activate(pcap_t* handle) pcap_cleanup_live_common(handle); return PCAP_ERROR; } - handle->md.ifindex = ifr.ifr_ifindex; + handlep->ifindex = ifr.ifr_ifindex; /* allocate butter */ handle->buffer = malloc(handle->bufsize); @@ -186,11 +194,11 @@ can_activate(pcap_t* handle) /* Bind to the socket */ addr.can_family = AF_CAN; - addr.can_ifindex = handle->md.ifindex; + addr.can_ifindex = handlep->ifindex; if( bind( handle->fd, (struct sockaddr*)&addr, sizeof(addr) ) < 0 ) { snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't attach to device %d %d:%s", - handle->md.ifindex, errno, strerror(errno)); + handlep->ifindex, errno, strerror(errno)); pcap_cleanup_live_common(handle); return PCAP_ERROR; } @@ -199,7 +207,7 @@ can_activate(pcap_t* handle) { /* Monitor mode doesn't apply to CAN devices. */ pcap_cleanup_live_common(handle); - return PCAP_ERROR; + return PCAP_ERROR_RFMON_NOTSUP; } handle->selectable_fd = handle->fd; @@ -235,7 +243,7 @@ can_read_linux(pcap_t *handle, int max_packets, pcap_handler callback, u_char *u } } while ((pkth.caplen == -1) && (errno == EINTR)); - if (pkth.caplen < 0) + if (pkth.caplen == -1) { snprintf(handle->errbuf, PCAP_ERRBUF_SIZE, "Can't receive packet %d:%s", errno, strerror(errno)); |