aboutsummaryrefslogtreecommitdiffstats
path: root/sys/linux/socket_can.txt
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2018-01-13 12:41:16 +0100
committerDmitry Vyukov <dvyukov@google.com>2018-01-13 12:52:09 +0100
commitc9e7aeaef64e4e16a32baac1c66d772afbaf8ed0 (patch)
tree98e0b37d8039c747d5f4ba76e7a3eeebb7852122 /sys/linux/socket_can.txt
parent1768ee71e60b25df36ca190b63f286c63613f686 (diff)
sys/linux: add AF_CAN descriptions
Diffstat (limited to 'sys/linux/socket_can.txt')
-rw-r--r--sys/linux/socket_can.txt87
1 files changed, 87 insertions, 0 deletions
diff --git a/sys/linux/socket_can.txt b/sys/linux/socket_can.txt
new file mode 100644
index 000000000..fdedf7c1e
--- /dev/null
+++ b/sys/linux/socket_can.txt
@@ -0,0 +1,87 @@
+# Copyright 2018 syzkaller project authors. All rights reserved.
+# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
+
+# AF_CAN support.
+
+include <linux/net.h>
+include <linux/socket.h>
+include <uapi/linux/if.h>
+include <uapi/linux/can.h>
+include <uapi/linux/can/raw.h>
+include <uapi/linux/can/bcm.h>
+
+resource sock_can[sock]
+resource sock_can_raw[sock_can]
+resource sock_can_bcm[sock_can]
+resource ifindex_vcan[ifindex]
+
+socket$can_raw(domain const[AF_CAN], type const[SOCK_RAW], proto const[CAN_RAW]) sock_can_raw
+bind$can_raw(fd sock_can_raw, addr ptr[in, sockaddr_can], len bytesize[addr])
+sendmsg$can_raw(fd sock_can_raw, msg ptr[in, msghdr_can[can_raw_msg]], f flags[send_flags])
+
+socket$can_bcm(domain const[AF_CAN], type const[SOCK_DGRAM], proto const[CAN_BCM]) sock_can_bcm
+connect$can_bcm(fd sock_can_bcm, addr ptr[in, sockaddr_can], len bytesize[addr])
+sendmsg$can_bcm(fd sock_can_bcm, msg ptr[in, msghdr_can[can_bcm_msg]], f flags[send_flags])
+
+# TODO: do setsockopt/getsockopt/ioctl.
+
+ioctl$ifreq_SIOCGIFINDEX_vcan(fd sock_can, cmd const[SIOCGIFINDEX], arg ptr[inout, ifreq_SIOCGIFINDEX_vcan])
+
+ifreq_SIOCGIFINDEX_vcan {
+ ifr_ifrn string["vcan0", IFNAMSIZ]
+ ifr_ifru ifindex_vcan
+ pad array[const[0, int8], 20]
+} [packed]
+
+sockaddr_can {
+ can_family const[AF_CAN, int16]
+ can_ifindex ifindex_vcan[opt]
+ rx_id const[0, int32]
+ tx_id const[0, int32]
+}
+
+type msghdr_can[MSG] {
+ addr ptr[in, sockaddr_can]
+ addrlen len[addr, int32]
+ vec ptr[in, iovec[in, MSG]]
+ vlen const[1, intptr]
+ ctrl const[0, intptr]
+ ctrllen const[0, intptr]
+ f flags[send_flags, int32]
+}
+
+can_raw_msg [
+ can can_frame_t[CAN_MAX_DLEN]
+ canfd can_frame_t[CANFD_MAX_DLEN]
+] [varlen]
+
+can_bcm_msg {
+ opcode flags[can_bcm_opcodes, int32]
+ flags flags[can_bcm_flags, int32]
+ count int32
+ ival1 timeval
+ ival2 timeval
+ can_id canid_t
+ nframes const[1, int32]
+ frames can_raw_msg
+}
+
+type can_frame_t[DATA_SIZE] {
+ can_id canid_t
+ len int8[0:DATA_SIZE]
+ flags flags[can_frame_flags, int8]
+ __res0 const[0, int8]
+ __res1 const[0, int8]
+ data array[int8, DATA_SIZE]
+}
+
+canid_t {
+ id int32:29[0:4]
+ err int32:1
+ rtr int32:1
+ eff int32:1
+}
+
+can_bcm_opcodes = TX_SETUP, TX_DELETE, TX_READ, TX_SEND, RX_SETUP, RX_DELETE, RX_READ
+can_bcm_flags = SETTIMER, STARTTIMER, TX_COUNTEVT, TX_ANNOUNCE, TX_CP_CAN_ID, RX_FILTER_ID, RX_CHECK_DLC, RX_NO_AUTOTIMER, RX_ANNOUNCE_RESUME, TX_RESET_MULTI_IDX, RX_RTR_FRAME, CAN_FD_FRAME
+can_frame_flags = CANFD_BRS, CANFD_ESI