#include <sys/mman.h>
#include <arpa/inet.h>
+#ifndef SO_BUSY_POLL
+#define SO_BUSY_POLL 46
+#endif
+
#define FRAME_SIZE 256
#define BLOCK_SIZE 4096
#define BLOCK_NR 2
enum { IN_READ, IN_RECVMMSG, IN_MMAP, IN_MMAPBUSY } in_method = IN_READ;
enum { WRITE, OUT_MMAP } out_method = WRITE;
bool quiet = false;
+int busy_poll_us = 0;
enum in2out {
STORE_ONLY,
s = CHECK(socket(PF_CAN, SOCK_RAW, CAN_RAW));
+ if (busy_poll_us) {
+ CHECK(setsockopt(s, SOL_SOCKET, SO_BUSY_POLL,
+ &busy_poll_us, sizeof(busy_poll_us)));
+ }
+
strncpy(ifr.ifr_name, devin, sizeof(ifr.ifr_name));
if (-1 == ioctl(s, SIOCGIFINDEX, &ifr)) {
perror(devin);
s = CHECK(socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)));
+ if (busy_poll_us) {
+ CHECK(setsockopt(s, SOL_SOCKET, SO_BUSY_POLL,
+ &busy_poll_us, sizeof(busy_poll_us)));
+ }
+
int val = TPACKET_V2;
CHECK(setsockopt(s, SOL_PACKET, PACKET_VERSION, &val, sizeof(val)));
socklen_t len = sizeof(ctx->hdrlen);
int ret = -1;
while (hdr->tp_status != TP_STATUS_AVAILABLE) {
- printf("TX status: %#x\n", hdr->tp_status);
struct pollfd pfd = {.fd = ctx->s, .revents = 0,
.events = POLLIN|POLLRDNORM|POLLERR };
ret = CHECK(poll(&pfd, 1, -1));
if (ctx->from_in == SEND){
ret = CHECK(send(ctx->s, NULL, 0, 0));
- printf("send:%d\n", ret);
return 0;
}
return 0;
CHECK(ioctl(s, SIOCGIFINDEX, &ifr));
my_addr.sll_family = AF_PACKET;
- my_addr.sll_protocol = htons(ETH_P_ALL);
+ my_addr.sll_protocol = htons(ETH_P_CAN);
my_addr.sll_ifindex = ifr.ifr_ifindex;
CHECK(bind(s, (struct sockaddr *)&my_addr, sizeof(struct sockaddr_ll)));
{
int opt;
- while ((opt = getopt(argc, argv, "qr:t:")) != -1) {
+ while ((opt = getopt(argc, argv, "b:qr:t:")) != -1) {
switch (opt) {
+ case 'b':
+ busy_poll_us = atoi(optarg);
+ break;
case 'q':
quiet = true;
break;