int val = TPACKET_V2;
CHECK(setsockopt(sock, SOL_PACKET, PACKET_VERSION, &val, sizeof(val)));
int val = TPACKET_V2;
CHECK(setsockopt(sock, SOL_PACKET, PACKET_VERSION, &val, sizeof(val)));
strncpy (ifr.ifr_name, dev, sizeof(ifr.ifr_name));
CHECK(ioctl(sock, SIOCGIFINDEX, &ifr));
strncpy (ifr.ifr_name, dev, sizeof(ifr.ifr_name));
CHECK(ioctl(sock, SIOCGIFINDEX, &ifr));
rx_ring_buffer = (char*)CHECKPTR(mmap(0, BLOCK_SIZE*BLOCK_NR, PROT_READ|PROT_WRITE, MAP_SHARED, sock, 0));
rx_ring_buffer = (char*)CHECKPTR(mmap(0, BLOCK_SIZE*BLOCK_NR, PROT_READ|PROT_WRITE, MAP_SHARED, sock, 0));
while (hdr->tp_status == TP_STATUS_KERNEL) {
struct pollfd pfd = {.fd = sock, .revents = 0,
.events = POLLIN|POLLRDNORM|POLLERR };
while (hdr->tp_status == TP_STATUS_KERNEL) {
struct pollfd pfd = {.fd = sock, .revents = 0,
.events = POLLIN|POLLRDNORM|POLLERR };
CHECK(poll(&pfd, 1, -1));
}
struct can_frame *cf = (void*)hdr + hdr->tp_mac;
CHECK(poll(&pfd, 1, -1));
}
struct can_frame *cf = (void*)hdr + hdr->tp_mac;