]> rtime.felk.cvut.cz Git - can-benchmark.git/blobdiff - ugw/ugw.c
Fix burst benchmark
[can-benchmark.git] / ugw / ugw.c
index 0aefe7e8a0b1d6b1a44635905c43f3779b2059e4..876d9ce3651d5a4bff0d31892f9c695f37f34080 100644 (file)
--- a/ugw/ugw.c
+++ b/ugw/ugw.c
@@ -93,7 +93,7 @@ enum in2out in_read(struct in_ctx *ctx, struct can_frame *cf)
                perror("read");
                exit(1);
        }
-       return SEND;
+       return STORE_ONLY;
 }
 
 void init_read(struct in_ctx *ctx)
@@ -104,6 +104,9 @@ void init_read(struct in_ctx *ctx)
 
        s = CHECK(socket(PF_CAN, SOCK_RAW, CAN_RAW));
 
+       int rcvbuf = 25000;     /* Limit rcvbuf to not have so big queueing latencies */
+       CHECK(setsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(rcvbuf)));
+
        if (nonblocking) {
                int flags = CHECK(fcntl(s, F_GETFL, 0));
                CHECK(fcntl(s, F_SETFL, flags | O_NONBLOCK));
@@ -233,18 +236,16 @@ void init_write(struct out_ctx *ctx)
 int out_packet_tx(struct out_ctx *ctx, struct can_frame *cf)
 {
        volatile struct tpacket2_hdr *hdr = ctx->ptr + ctx->current*FRAME_SIZE;
-       int ret = -1;
 
-       if (ctx->from_in == NOP)
+       if (ctx->from_in == NOP) {
+               CHECK(send(ctx->s, NULL, 0, 0));
                return 0;
-
+       }
 
        while (hdr->tp_status != TP_STATUS_AVAILABLE) {
-               struct pollfd pfd = {.fd = ctx->s, .revents = 0,
-                                    .events = POLLIN|POLLRDNORM|POLLERR };
-               ret = CHECK(poll(&pfd, 1, -1));
+               CHECK(send(ctx->s, NULL, 0, 0));
        }
-       (void)ret;
+
        //struct sockaddr_ll *addr = (void*)hdr + TPACKET_HDRLEN - sizeof(struct sockaddr_ll);
        struct can_frame *cf_mmap = (void*)hdr + TPACKET_HDRLEN  - sizeof(struct sockaddr_ll);
        *cf_mmap = *cf;
@@ -253,7 +254,7 @@ int out_packet_tx(struct out_ctx *ctx, struct can_frame *cf)
        ctx->current = (ctx->current + 1) % FRAME_NR;
 
        if (ctx->from_in == SEND){
-               ret = CHECK(send(ctx->s, NULL, 0, 0));
+               CHECK(send(ctx->s, NULL, 0, 0));
                return 0;
        }
        return 0;