1 # Copyright 2018 syzkaller project authors. All rights reserved. 2 # Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. 3 4 # AF_CAN support. 5 6 include <linux/net.h> 7 include <linux/socket.h> 8 include <uapi/linux/if.h> 9 include <uapi/linux/can.h> 10 include <uapi/linux/can/raw.h> 11 include <uapi/linux/can/bcm.h> 12 13 resource sock_can[sock] 14 resource sock_can_raw[sock_can] 15 resource sock_can_bcm[sock_can] 16 resource ifindex_vcan[ifindex] 17 18 socket$can_raw(domain const[AF_CAN], type const[SOCK_RAW], proto const[CAN_RAW]) sock_can_raw 19 bind$can_raw(fd sock_can_raw, addr ptr[in, sockaddr_can], len bytesize[addr]) 20 sendmsg$can_raw(fd sock_can_raw, msg ptr[in, msghdr_can[can_raw_msg]], f flags[send_flags]) 21 22 socket$can_bcm(domain const[AF_CAN], type const[SOCK_DGRAM], proto const[CAN_BCM]) sock_can_bcm 23 connect$can_bcm(fd sock_can_bcm, addr ptr[in, sockaddr_can], len bytesize[addr]) 24 sendmsg$can_bcm(fd sock_can_bcm, msg ptr[in, msghdr_can[can_bcm_msg]], f flags[send_flags]) 25 26 # TODO: do setsockopt/getsockopt/ioctl. 27 28 ioctl$ifreq_SIOCGIFINDEX_vcan(fd sock_can, cmd const[SIOCGIFINDEX], arg ptr[inout, ifreq_dev_t["vcan0", ifindex_vcan]]) 29 30 sockaddr_can { 31 can_family const[AF_CAN, int16] 32 can_ifindex ifindex_vcan[opt] 33 rx_id const[0, int32] 34 tx_id const[0, int32] 35 } 36 37 type msghdr_can[MSG] { 38 addr ptr[in, sockaddr_can] 39 addrlen len[addr, int32] 40 vec ptr[in, iovec[in, MSG]] 41 vlen const[1, intptr] 42 ctrl const[0, intptr] 43 ctrllen const[0, intptr] 44 f flags[send_flags, int32] 45 } 46 47 can_raw_msg [ 48 can can_frame 49 canfd canfd_frame 50 ] [varlen] 51 52 can_bcm_msg { 53 opcode flags[can_bcm_opcodes, int32] 54 flags flags[can_bcm_flags, int32] 55 count int32 56 ival1 timeval 57 ival2 timeval 58 can_id canid_t 59 nframes const[1, int32] 60 frames can_raw_msg 61 } 62 63 type can_frame_t[DATA_SIZE] { 64 can_id canid_t 65 len int8[0:DATA_SIZE] 66 flags flags[can_frame_flags, int8] 67 __res0 const[0, int8] 68 __res1 const[0, int8] 69 data array[int8, DATA_SIZE] 70 } 71 72 type can_frame can_frame_t[CAN_MAX_DLEN] 73 type canfd_frame can_frame_t[CANFD_MAX_DLEN] 74 75 canid_t { 76 id int32:29[0:4] 77 err int32:1 78 rtr int32:1 79 eff int32:1 80 } 81 82 can_bcm_opcodes = TX_SETUP, TX_DELETE, TX_READ, TX_SEND, RX_SETUP, RX_DELETE, RX_READ 83 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 84 can_frame_flags = CANFD_BRS, CANFD_ESI 85