1 /**************************************************************/
2 /* CAN system calls example */
3 /* Author: Michal Sojka, Czech Technical University in Prague */
4 /* License: Public domain */
5 /**************************************************************/
11 #include <linux/can.h>
17 #include <sys/ioctl.h>
18 #include <sys/socket.h>
22 struct mmsghdr msgs[MMSG_MAX];
23 struct iovec iovecs[MMSG_MAX];
24 struct can_frame cf[MMSG_MAX];
26 int init_recvmmsg(const char *dev)
29 struct sockaddr_can addr;
33 sock = CHECK(socket(PF_CAN, SOCK_RAW, CAN_RAW));
35 strncpy(ifr.ifr_name, dev, sizeof(ifr.ifr_name));
36 if (-1 == ioctl(sock, SIOCGIFINDEX, &ifr)) {
41 addr.can_family = AF_CAN;
42 addr.can_ifindex = ifr.ifr_ifindex;
44 CHECK(bind(sock, (struct sockaddr *)&addr, sizeof(addr)));
46 memset(msgs, 0, sizeof(msgs));
47 memset(iovecs, 0, sizeof(iovecs));
48 for (i = 0; i < MMSG_MAX; i++) {
49 iovecs[i].iov_base = &cf[i];
50 iovecs[i].iov_len = sizeof(cf[i]);
51 msgs[i].msg_hdr.msg_iov = &iovecs[i];
52 msgs[i].msg_hdr.msg_iovlen = 1;
58 void can_recvmmsg(int sock)
61 int received = CHECK(recvmmsg(sock, msgs, MMSG_MAX, MSG_WAITFORONE, NULL));
63 printf("Received %d CAN frames in one system call\n", received);
64 for (i = 0; i < received; i++)
65 print_can_frame(&cf[i]);
68 int main(int argc, char *argv[])
73 dev = candump_parse_args(argc, argv);
75 sock = init_recvmmsg(dev);