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