Blame view

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