1 /**************************************************************************/
2 /* CAN performance benchmark for recvmmsg() */
3 /* Copyright (C) 2013, 2014 Michal Sojka, DCE, FEE, CTU Prague */
5 /**************************************************************************/
8 #include <sys/socket.h>
10 #include <sys/ioctl.h>
18 #define CHECK(cmd) do { if ((cmd) == -1) { perror(#cmd); exit(1); } } while (0)
22 int main(int argc, char *argv[])
25 struct sockaddr_can addr;
29 struct timespec t1, t2;
31 ss = socket(PF_CAN, SOCK_RAW, CAN_RAW);
32 sr = socket(PF_CAN, SOCK_RAW, CAN_RAW);
34 strcpy(ifr.ifr_name, "vcan0" );
35 ioctl(ss, SIOCGIFINDEX, &ifr);
37 addr.can_family = AF_CAN;
38 addr.can_ifindex = ifr.ifr_ifindex;
40 bind(ss, (struct sockaddr *)&addr, sizeof(addr));
41 bind(sr, (struct sockaddr *)&addr, sizeof(addr));
43 int rcvbuf = 30 * count * sizeof(cf);
44 CHECK(setsockopt(sr, SOL_SOCKET, SO_RCVBUFFORCE, &rcvbuf, sizeof(rcvbuf)));
46 memset(&cf, 0, sizeof(cf));
49 fprintf(stderr, "Sending %d frames\n", count);
50 for (i = 0; i < count; i++) {
51 ret = write(ss, &cf, sizeof(cf));
52 if (ret != sizeof(cf)) {
59 fprintf(stderr, "Receiving %d frames with read()\n", count);
60 for (i = 0; i < count; i++) {
61 //fprintf(stderr, "Receiving frame %d\r", i);
62 ret = read(sr, &cf, sizeof(cf));
63 if (ret != sizeof(cf)) {
68 //fprintf(stderr, "\n");
71 fprintf(stderr, "Receiving %d frames with recvmmsg()\n", count);
72 struct mmsghdr msgs[count];
73 struct iovec iovecs[count];
74 char bufs[count][sizeof(struct can_frame)];
76 memset(msgs, 0, sizeof(msgs));
77 for (i = 0; i < count; i++) {
78 iovecs[i].iov_base = bufs[i];
79 iovecs[i].iov_len = sizeof(struct can_frame);
80 msgs[i].msg_hdr.msg_iov = &iovecs[i];
81 msgs[i].msg_hdr.msg_iovlen = 1;
84 ret = recvmmsg(sr, msgs, count, 0, NULL);
88 } else if (ret != count) {
89 fprintf(stderr, "Error: Only %d messages received\n", ret);