Home | History | Annotate | Download | only in linux
      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