X-Git-Url: http://rtime.felk.cvut.cz/gitweb/can-benchmark.git/blobdiff_plain/89d198f9565e5c693252280ed8154a8cb3d131b5..7aaa57c64c179eddf45a55e5dcd85764f4171566:/ugw/ugw.c diff --git a/ugw/ugw.c b/ugw/ugw.c index 64d00b0..482f4e1 100644 --- a/ugw/ugw.c +++ b/ugw/ugw.c @@ -21,6 +21,10 @@ #include #include +#ifndef SO_BUSY_POLL +#define SO_BUSY_POLL 46 +#endif + #define FRAME_SIZE 256 #define BLOCK_SIZE 4096 #define BLOCK_NR 2 @@ -36,6 +40,7 @@ char *devout = "can1"; 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, @@ -80,6 +85,11 @@ void init_read(struct in_ctx *ctx) 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); @@ -127,6 +137,11 @@ void init_packet_rx(struct in_ctx *ctx) 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); @@ -313,8 +328,11 @@ int main(int argc, char *argv[]) { 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;