• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_VSOCK support.
5
6include <linux/net.h>
7include <linux/socket.h>
8include <linux/virtio_vsock.h>
9include <uapi/linux/fcntl.h>
10include <uapi/linux/vhost.h>
11include <uapi/linux/vm_sockets.h>
12include <uapi/linux/virtio_net.h>
13include <uapi/linux/virtio_config.h>
14
15resource sock_vsock[sock]
16resource sock_vsock_stream[sock_vsock]
17resource sock_vsock_dgram[sock_vsock]
18
19resource fd_vhost[fd]
20resource vhost_vsock[fd_vhost]
21resource vhost_net[fd_vhost]
22
23socket$vsock_stream(domain const[AF_VSOCK], type const[SOCK_STREAM], proto const[0]) sock_vsock_stream
24bind$vsock_stream(fd sock_vsock_stream, addr ptr[in, sockaddr_vm], addrlen len[addr])
25connect$vsock_stream(fd sock_vsock_stream, addr ptr[in, sockaddr_vm], addrlen len[addr])
26accept4$vsock_stream(fd sock_vsock_stream, addr ptr[in, sockaddr_vm], addrlen len[addr], flags flags[accept_flags]) sock_vsock_stream
27setsockopt$SO_VM_SOCKETS_BUFFER_SIZE(fd sock_vsock_stream, level const[AF_VSOCK], opt const[SO_VM_SOCKETS_BUFFER_SIZE], val ptr[in, int64], len len[val])
28setsockopt$SO_VM_SOCKETS_BUFFER_MAX_SIZE(fd sock_vsock_stream, level const[AF_VSOCK], opt const[SO_VM_SOCKETS_BUFFER_MAX_SIZE], val ptr[in, int64], len len[val])
29setsockopt$SO_VM_SOCKETS_BUFFER_MIN_SIZE(fd sock_vsock_stream, level const[AF_VSOCK], opt const[SO_VM_SOCKETS_BUFFER_MIN_SIZE], val ptr[in, int64], len len[val])
30setsockopt$SO_VM_SOCKETS_CONNECT_TIMEOUT(fd sock_vsock_stream, level const[AF_VSOCK], opt const[SO_VM_SOCKETS_CONNECT_TIMEOUT], val ptr[in, timeval], len len[val])
31
32socket$vsock_dgram(domain const[AF_VSOCK], type const[SOCK_DGRAM], proto const[0]) sock_vsock_dgram
33bind$vsock_dgram(fd sock_vsock_dgram, addr ptr[in, sockaddr_vm], addrlen len[addr])
34connect$vsock_dgram(fd sock_vsock_dgram, addr ptr[in, sockaddr_vm], addrlen len[addr])
35
36openat$vsock(fd const[AT_FDCWD], file ptr[in, string["/dev/vsock"]], flags flags[open_flags], mode const[0]) fd
37
38openat$vhost_vsock(fd const[AT_FDCWD], file ptr[in, string["/dev/vhost-vsock"]], flags const[O_RDWR], mode const[0]) vhost_vsock
39ioctl$VHOST_VSOCK_SET_GUEST_CID(fd vhost_vsock, cmd const[VHOST_VSOCK_SET_GUEST_CID], arg ptr[in, vmaddr_cid64])
40ioctl$VHOST_VSOCK_SET_RUNNING(fd vhost_vsock, cmd const[VHOST_VSOCK_SET_RUNNING], arg ptr[in, bool32])
41
42openat$vnet(fd const[AT_FDCWD], file ptr[in, string["/dev/vhost-net"]], flags const[O_RDWR], mode const[0]) vhost_net
43write$vnet(fd vhost_net, buf ptr[in, vhost_msg], size len[buf])
44ioctl$VHOST_NET_SET_BACKEND(fd vhost_net, cmd const[VHOST_NET_SET_BACKEND], arg ptr[in, vhost_vring_file])
45
46ioctl$VHOST_GET_FEATURES(fd fd_vhost, cmd const[VHOST_GET_FEATURES], arg ptr[out, int64])
47ioctl$VHOST_SET_FEATURES(fd fd_vhost, cmd const[VHOST_SET_FEATURES], arg ptr[in, flags[vhost_features, int64]])
48ioctl$VHOST_SET_OWNER(fd fd_vhost, cmd const[VHOST_SET_OWNER], arg const[0])
49ioctl$VHOST_RESET_OWNER(fd fd_vhost, cmd const[VHOST_RESET_OWNER], arg const[0])
50ioctl$VHOST_SET_MEM_TABLE(fd fd_vhost, cmd const[VHOST_SET_MEM_TABLE], arg ptr[in, vhost_memory])
51ioctl$VHOST_SET_LOG_BASE(fd fd_vhost, cmd const[VHOST_SET_LOG_BASE], arg ptr[in, ptr64[out, int8]])
52ioctl$VHOST_SET_LOG_FD(fd fd_vhost, cmd const[VHOST_SET_LOG_FD], arg ptr[in, fd_event[opt]])
53ioctl$VHOST_SET_VRING_NUM(fd fd_vhost, cmd const[VHOST_SET_VRING_NUM], arg ptr[in, vhost_vring_state])
54ioctl$VHOST_SET_VRING_BASE(fd fd_vhost, cmd const[VHOST_SET_VRING_BASE], arg ptr[in, vhost_vring_state])
55ioctl$VHOST_GET_VRING_BASE(fd fd_vhost, cmd const[VHOST_GET_VRING_BASE], arg ptr[out, vhost_vring_state])
56ioctl$VHOST_SET_VRING_ADDR(fd fd_vhost, cmd const[VHOST_SET_VRING_ADDR], arg ptr[in, vhost_vring_addr])
57ioctl$VHOST_SET_VRING_KICK(fd fd_vhost, cmd const[VHOST_SET_VRING_KICK], arg ptr[in, vhost_vring_file])
58ioctl$VHOST_SET_VRING_CALL(fd fd_vhost, cmd const[VHOST_SET_VRING_CALL], arg ptr[in, vhost_vring_file])
59ioctl$VHOST_SET_VRING_ERR(fd fd_vhost, cmd const[VHOST_SET_VRING_ERR], arg ptr[in, vhost_vring_file])
60ioctl$VHOST_SET_VRING_ENDIAN(fd fd_vhost, cmd const[VHOST_SET_VRING_ENDIAN], arg ptr[in, vhost_vring_state])
61ioctl$VHOST_GET_VRING_ENDIAN(fd fd_vhost, cmd const[VHOST_GET_VRING_ENDIAN], arg ptr[in, vhost_vring_state])
62ioctl$VHOST_SET_VRING_BUSYLOOP_TIMEOUT(fd fd_vhost, cmd const[VHOST_SET_VRING_BUSYLOOP_TIMEOUT], arg ptr[in, vhost_vring_state])
63
64sockaddr_vm {
65	svm_family	const[AF_VSOCK, int16]
66	svm_reserved1	const[0, int16]
67	svm_port	flags[vmaddr_port, int32]
68	svm_cid		vmaddr_cid
69	svm_zero	const[0, int32]
70}
71
72vmaddr_cid [
73	any		const[VMADDR_CID_ANY, int32]
74	hyper		const[VMADDR_CID_HYPERVISOR, int32]
75	reserved	const[VMADDR_CID_RESERVED, int32]
76	host		const[VMADDR_CID_HOST, int32]
77	my		proc[1234, 2, int32]
78]
79
80vmaddr_cid64 {
81	cid	vmaddr_cid
82	pad	const[0, int32]
83} [align_8]
84
85vhost_memory {
86	nregions	len[regions, int32]
87	padding		const[0, int32]
88	regions		array[vhost_memory_region]
89}
90
91vhost_memory_region {
92	guest_phys_addr	flags[kvm_guest_addrs, int64]
93	memory_size	bytesize[userspace_addr, int64]
94	userspace_addr	ptr64[out, array[int8]]
95	flags_padding	const[0, int64]
96}
97
98vhost_vring_state {
99	index	flags[vhost_vring_index, int32]
100	num	int32
101}
102
103vhost_vring_addr {
104	index		flags[vhost_vring_index, int32]
105	flags		int32[0:1]
106	desc_user_addr	ptr64[out, array[int8]]
107	used_user_addr	ptr64[out, array[int8]]
108	avail_user_addr	ptr64[out, array[int8]]
109	log_guest_addr	flags[kvm_guest_addrs, int64]
110}
111
112vhost_vring_file {
113	index	flags[vhost_vring_index, int32]
114	fd	fd_event[opt]
115}
116
117vhost_msg {
118	type	const[VHOST_IOTLB_MSG, int32]
119	iotlb	vhost_iotlb_msg
120	padding	array[const[0, int64], 8]
121}
122
123vhost_iotlb_msg {
124# TODO: is it host or guest address?
125	iova	ptr64[out, array[int8]]
126	size	len[iova, int64]
127	uaddr	ptr64[out, array[int8]]
128	perm	flags[vhost_iotlb_perm, int8]
129	type	flags[vhost_iotlb_type, int8]
130}
131
132vmaddr_port = VMADDR_PORT_ANY, 0, 10000, 10001
133vhost_features = VHOST_LOG_ALL, VIRTIO_NOTIFY_ON_EMPTY, VIRTIO_RING_F_INDIRECT_DESC, VIRTIO_RING_F_EVENT_IDX, VIRTIO_ANY_LAYOUT, VIRTIO_VERSION_1, VHOST_NET_VIRTIO_NET_HDR, VIRTIO_NET_MRG_RXBUF, VIRTIO_IOMMU_PLATFORM
134vhost_vring_index = VSOCK_VQ_RX, VSOCK_VQ_TX, VSOCK_VQ_EVENT, VSOCK_VQ_MAX
135vhost_iotlb_type = VHOST_IOTLB_MISS, VHOST_IOTLB_UPDATE, VHOST_IOTLB_INVALIDATE, VHOST_IOTLB_ACCESS_FAIL
136vhost_iotlb_perm = VHOST_ACCESS_RO, VHOST_ACCESS_WO, VHOST_ACCESS_RW
137
138define VHOST_LOG_ALL	1 << VHOST_F_LOG_ALL
139define VIRTIO_NOTIFY_ON_EMPTY	1 << VIRTIO_F_NOTIFY_ON_EMPTY
140define VIRTIO_RING_F_INDIRECT_DESC	1 << VIRTIO_RING_F_INDIRECT_DESC
141define VIRTIO_RING_F_EVENT_IDX	1 << VIRTIO_RING_F_EVENT_IDX
142define VIRTIO_ANY_LAYOUT	1 << VIRTIO_F_ANY_LAYOUT
143define VIRTIO_VERSION_1	1 << VIRTIO_F_VERSION_1
144define VHOST_NET_VIRTIO_NET_HDR	1 << VHOST_NET_F_VIRTIO_NET_HDR
145define VIRTIO_NET_MRG_RXBUF	1 << VIRTIO_NET_F_MRG_RXBUF
146define VIRTIO_IOMMU_PLATFORM	1 << VIRTIO_F_IOMMU_PLATFORM
147