1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _LINUX_VIRTIO_VSOCK_H 3*4882a593Smuzhiyun #define _LINUX_VIRTIO_VSOCK_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <uapi/linux/virtio_vsock.h> 6*4882a593Smuzhiyun #include <linux/socket.h> 7*4882a593Smuzhiyun #include <net/sock.h> 8*4882a593Smuzhiyun #include <net/af_vsock.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #define VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE (1024 * 4) 11*4882a593Smuzhiyun #define VIRTIO_VSOCK_MAX_BUF_SIZE 0xFFFFFFFFUL 12*4882a593Smuzhiyun #define VIRTIO_VSOCK_MAX_PKT_BUF_SIZE virtio_transport_max_vsock_pkt_buf_size 13*4882a593Smuzhiyun extern uint virtio_transport_max_vsock_pkt_buf_size; 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun enum { 16*4882a593Smuzhiyun VSOCK_VQ_RX = 0, /* for host to guest data */ 17*4882a593Smuzhiyun VSOCK_VQ_TX = 1, /* for guest to host data */ 18*4882a593Smuzhiyun VSOCK_VQ_EVENT = 2, 19*4882a593Smuzhiyun VSOCK_VQ_MAX = 3, 20*4882a593Smuzhiyun }; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* Per-socket state (accessed via vsk->trans) */ 23*4882a593Smuzhiyun struct virtio_vsock_sock { 24*4882a593Smuzhiyun struct vsock_sock *vsk; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun spinlock_t tx_lock; 27*4882a593Smuzhiyun spinlock_t rx_lock; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /* Protected by tx_lock */ 30*4882a593Smuzhiyun u32 tx_cnt; 31*4882a593Smuzhiyun u32 peer_fwd_cnt; 32*4882a593Smuzhiyun u32 peer_buf_alloc; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* Protected by rx_lock */ 35*4882a593Smuzhiyun u32 fwd_cnt; 36*4882a593Smuzhiyun u32 last_fwd_cnt; 37*4882a593Smuzhiyun u32 rx_bytes; 38*4882a593Smuzhiyun u32 buf_alloc; 39*4882a593Smuzhiyun struct list_head rx_queue; 40*4882a593Smuzhiyun }; 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun struct virtio_vsock_pkt { 43*4882a593Smuzhiyun struct virtio_vsock_hdr hdr; 44*4882a593Smuzhiyun struct list_head list; 45*4882a593Smuzhiyun /* socket refcnt not held, only use for cancellation */ 46*4882a593Smuzhiyun struct vsock_sock *vsk; 47*4882a593Smuzhiyun void *buf; 48*4882a593Smuzhiyun u32 buf_len; 49*4882a593Smuzhiyun u32 len; 50*4882a593Smuzhiyun u32 off; 51*4882a593Smuzhiyun bool reply; 52*4882a593Smuzhiyun bool tap_delivered; 53*4882a593Smuzhiyun }; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun struct virtio_vsock_pkt_info { 56*4882a593Smuzhiyun u32 remote_cid, remote_port; 57*4882a593Smuzhiyun struct vsock_sock *vsk; 58*4882a593Smuzhiyun struct msghdr *msg; 59*4882a593Smuzhiyun u32 pkt_len; 60*4882a593Smuzhiyun u16 type; 61*4882a593Smuzhiyun u16 op; 62*4882a593Smuzhiyun u32 flags; 63*4882a593Smuzhiyun bool reply; 64*4882a593Smuzhiyun }; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun struct virtio_transport { 67*4882a593Smuzhiyun /* This must be the first field */ 68*4882a593Smuzhiyun struct vsock_transport transport; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun /* Takes ownership of the packet */ 71*4882a593Smuzhiyun int (*send_pkt)(struct virtio_vsock_pkt *pkt); 72*4882a593Smuzhiyun }; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun ssize_t 75*4882a593Smuzhiyun virtio_transport_stream_dequeue(struct vsock_sock *vsk, 76*4882a593Smuzhiyun struct msghdr *msg, 77*4882a593Smuzhiyun size_t len, 78*4882a593Smuzhiyun int type); 79*4882a593Smuzhiyun int 80*4882a593Smuzhiyun virtio_transport_dgram_dequeue(struct vsock_sock *vsk, 81*4882a593Smuzhiyun struct msghdr *msg, 82*4882a593Smuzhiyun size_t len, int flags); 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun s64 virtio_transport_stream_has_data(struct vsock_sock *vsk); 85*4882a593Smuzhiyun s64 virtio_transport_stream_has_space(struct vsock_sock *vsk); 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun int virtio_transport_do_socket_init(struct vsock_sock *vsk, 88*4882a593Smuzhiyun struct vsock_sock *psk); 89*4882a593Smuzhiyun int 90*4882a593Smuzhiyun virtio_transport_notify_poll_in(struct vsock_sock *vsk, 91*4882a593Smuzhiyun size_t target, 92*4882a593Smuzhiyun bool *data_ready_now); 93*4882a593Smuzhiyun int 94*4882a593Smuzhiyun virtio_transport_notify_poll_out(struct vsock_sock *vsk, 95*4882a593Smuzhiyun size_t target, 96*4882a593Smuzhiyun bool *space_available_now); 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun int virtio_transport_notify_recv_init(struct vsock_sock *vsk, 99*4882a593Smuzhiyun size_t target, struct vsock_transport_recv_notify_data *data); 100*4882a593Smuzhiyun int virtio_transport_notify_recv_pre_block(struct vsock_sock *vsk, 101*4882a593Smuzhiyun size_t target, struct vsock_transport_recv_notify_data *data); 102*4882a593Smuzhiyun int virtio_transport_notify_recv_pre_dequeue(struct vsock_sock *vsk, 103*4882a593Smuzhiyun size_t target, struct vsock_transport_recv_notify_data *data); 104*4882a593Smuzhiyun int virtio_transport_notify_recv_post_dequeue(struct vsock_sock *vsk, 105*4882a593Smuzhiyun size_t target, ssize_t copied, bool data_read, 106*4882a593Smuzhiyun struct vsock_transport_recv_notify_data *data); 107*4882a593Smuzhiyun int virtio_transport_notify_send_init(struct vsock_sock *vsk, 108*4882a593Smuzhiyun struct vsock_transport_send_notify_data *data); 109*4882a593Smuzhiyun int virtio_transport_notify_send_pre_block(struct vsock_sock *vsk, 110*4882a593Smuzhiyun struct vsock_transport_send_notify_data *data); 111*4882a593Smuzhiyun int virtio_transport_notify_send_pre_enqueue(struct vsock_sock *vsk, 112*4882a593Smuzhiyun struct vsock_transport_send_notify_data *data); 113*4882a593Smuzhiyun int virtio_transport_notify_send_post_enqueue(struct vsock_sock *vsk, 114*4882a593Smuzhiyun ssize_t written, struct vsock_transport_send_notify_data *data); 115*4882a593Smuzhiyun void virtio_transport_notify_buffer_size(struct vsock_sock *vsk, u64 *val); 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun u64 virtio_transport_stream_rcvhiwat(struct vsock_sock *vsk); 118*4882a593Smuzhiyun bool virtio_transport_stream_is_active(struct vsock_sock *vsk); 119*4882a593Smuzhiyun bool virtio_transport_stream_allow(u32 cid, u32 port); 120*4882a593Smuzhiyun int virtio_transport_dgram_bind(struct vsock_sock *vsk, 121*4882a593Smuzhiyun struct sockaddr_vm *addr); 122*4882a593Smuzhiyun bool virtio_transport_dgram_allow(u32 cid, u32 port); 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun int virtio_transport_connect(struct vsock_sock *vsk); 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun int virtio_transport_shutdown(struct vsock_sock *vsk, int mode); 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun void virtio_transport_release(struct vsock_sock *vsk); 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun ssize_t 131*4882a593Smuzhiyun virtio_transport_stream_enqueue(struct vsock_sock *vsk, 132*4882a593Smuzhiyun struct msghdr *msg, 133*4882a593Smuzhiyun size_t len); 134*4882a593Smuzhiyun int 135*4882a593Smuzhiyun virtio_transport_dgram_enqueue(struct vsock_sock *vsk, 136*4882a593Smuzhiyun struct sockaddr_vm *remote_addr, 137*4882a593Smuzhiyun struct msghdr *msg, 138*4882a593Smuzhiyun size_t len); 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun void virtio_transport_destruct(struct vsock_sock *vsk); 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun void virtio_transport_recv_pkt(struct virtio_transport *t, 143*4882a593Smuzhiyun struct virtio_vsock_pkt *pkt); 144*4882a593Smuzhiyun void virtio_transport_free_pkt(struct virtio_vsock_pkt *pkt); 145*4882a593Smuzhiyun void virtio_transport_inc_tx_pkt(struct virtio_vsock_sock *vvs, struct virtio_vsock_pkt *pkt); 146*4882a593Smuzhiyun u32 virtio_transport_get_credit(struct virtio_vsock_sock *vvs, u32 wanted); 147*4882a593Smuzhiyun void virtio_transport_put_credit(struct virtio_vsock_sock *vvs, u32 credit); 148*4882a593Smuzhiyun void virtio_transport_deliver_tap_pkt(struct virtio_vsock_pkt *pkt); 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #endif /* _LINUX_VIRTIO_VSOCK_H */ 151