1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * VMware vSockets Driver
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2007-2013 VMware, Inc. All rights reserved.
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #ifndef __AF_VSOCK_H__
9*4882a593Smuzhiyun #define __AF_VSOCK_H__
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include <linux/kernel.h>
12*4882a593Smuzhiyun #include <linux/workqueue.h>
13*4882a593Smuzhiyun #include <uapi/linux/vm_sockets.h>
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun #include "vsock_addr.h"
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun #define LAST_RESERVED_PORT 1023
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun #define VSOCK_HASH_SIZE 251
20*4882a593Smuzhiyun extern struct list_head vsock_bind_table[VSOCK_HASH_SIZE + 1];
21*4882a593Smuzhiyun extern struct list_head vsock_connected_table[VSOCK_HASH_SIZE];
22*4882a593Smuzhiyun extern spinlock_t vsock_table_lock;
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun #define vsock_sk(__sk) ((struct vsock_sock *)__sk)
25*4882a593Smuzhiyun #define sk_vsock(__vsk) (&(__vsk)->sk)
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun struct vsock_sock {
28*4882a593Smuzhiyun /* sk must be the first member. */
29*4882a593Smuzhiyun struct sock sk;
30*4882a593Smuzhiyun const struct vsock_transport *transport;
31*4882a593Smuzhiyun struct sockaddr_vm local_addr;
32*4882a593Smuzhiyun struct sockaddr_vm remote_addr;
33*4882a593Smuzhiyun /* Links for the global tables of bound and connected sockets. */
34*4882a593Smuzhiyun struct list_head bound_table;
35*4882a593Smuzhiyun struct list_head connected_table;
36*4882a593Smuzhiyun /* Accessed without the socket lock held. This means it can never be
37*4882a593Smuzhiyun * modified outsided of socket create or destruct.
38*4882a593Smuzhiyun */
39*4882a593Smuzhiyun bool trusted;
40*4882a593Smuzhiyun bool cached_peer_allow_dgram; /* Dgram communication allowed to
41*4882a593Smuzhiyun * cached peer?
42*4882a593Smuzhiyun */
43*4882a593Smuzhiyun u32 cached_peer; /* Context ID of last dgram destination check. */
44*4882a593Smuzhiyun const struct cred *owner;
45*4882a593Smuzhiyun /* Rest are SOCK_STREAM only. */
46*4882a593Smuzhiyun long connect_timeout;
47*4882a593Smuzhiyun /* Listening socket that this came from. */
48*4882a593Smuzhiyun struct sock *listener;
49*4882a593Smuzhiyun /* Used for pending list and accept queue during connection handshake.
50*4882a593Smuzhiyun * The listening socket is the head for both lists. Sockets created
51*4882a593Smuzhiyun * for connection requests are placed in the pending list until they
52*4882a593Smuzhiyun * are connected, at which point they are put in the accept queue list
53*4882a593Smuzhiyun * so they can be accepted in accept(). If accept() cannot accept the
54*4882a593Smuzhiyun * connection, it is marked as rejected so the cleanup function knows
55*4882a593Smuzhiyun * to clean up the socket.
56*4882a593Smuzhiyun */
57*4882a593Smuzhiyun struct list_head pending_links;
58*4882a593Smuzhiyun struct list_head accept_queue;
59*4882a593Smuzhiyun bool rejected;
60*4882a593Smuzhiyun struct delayed_work connect_work;
61*4882a593Smuzhiyun struct delayed_work pending_work;
62*4882a593Smuzhiyun struct delayed_work close_work;
63*4882a593Smuzhiyun bool close_work_scheduled;
64*4882a593Smuzhiyun u32 peer_shutdown;
65*4882a593Smuzhiyun bool sent_request;
66*4882a593Smuzhiyun bool ignore_connecting_rst;
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun /* Protected by lock_sock(sk) */
69*4882a593Smuzhiyun u64 buffer_size;
70*4882a593Smuzhiyun u64 buffer_min_size;
71*4882a593Smuzhiyun u64 buffer_max_size;
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun /* Private to transport. */
74*4882a593Smuzhiyun void *trans;
75*4882a593Smuzhiyun };
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun s64 vsock_stream_has_data(struct vsock_sock *vsk);
78*4882a593Smuzhiyun s64 vsock_stream_has_space(struct vsock_sock *vsk);
79*4882a593Smuzhiyun struct sock *vsock_create_connected(struct sock *parent);
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun /**** TRANSPORT ****/
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun struct vsock_transport_recv_notify_data {
84*4882a593Smuzhiyun u64 data1; /* Transport-defined. */
85*4882a593Smuzhiyun u64 data2; /* Transport-defined. */
86*4882a593Smuzhiyun bool notify_on_block;
87*4882a593Smuzhiyun };
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun struct vsock_transport_send_notify_data {
90*4882a593Smuzhiyun u64 data1; /* Transport-defined. */
91*4882a593Smuzhiyun u64 data2; /* Transport-defined. */
92*4882a593Smuzhiyun };
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun /* Transport features flags */
95*4882a593Smuzhiyun /* Transport provides host->guest communication */
96*4882a593Smuzhiyun #define VSOCK_TRANSPORT_F_H2G 0x00000001
97*4882a593Smuzhiyun /* Transport provides guest->host communication */
98*4882a593Smuzhiyun #define VSOCK_TRANSPORT_F_G2H 0x00000002
99*4882a593Smuzhiyun /* Transport provides DGRAM communication */
100*4882a593Smuzhiyun #define VSOCK_TRANSPORT_F_DGRAM 0x00000004
101*4882a593Smuzhiyun /* Transport provides local (loopback) communication */
102*4882a593Smuzhiyun #define VSOCK_TRANSPORT_F_LOCAL 0x00000008
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun struct vsock_transport {
105*4882a593Smuzhiyun struct module *module;
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun /* Initialize/tear-down socket. */
108*4882a593Smuzhiyun int (*init)(struct vsock_sock *, struct vsock_sock *);
109*4882a593Smuzhiyun void (*destruct)(struct vsock_sock *);
110*4882a593Smuzhiyun void (*release)(struct vsock_sock *);
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun /* Cancel all pending packets sent on vsock. */
113*4882a593Smuzhiyun int (*cancel_pkt)(struct vsock_sock *vsk);
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun /* Connections. */
116*4882a593Smuzhiyun int (*connect)(struct vsock_sock *);
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun /* DGRAM. */
119*4882a593Smuzhiyun int (*dgram_bind)(struct vsock_sock *, struct sockaddr_vm *);
120*4882a593Smuzhiyun int (*dgram_dequeue)(struct vsock_sock *vsk, struct msghdr *msg,
121*4882a593Smuzhiyun size_t len, int flags);
122*4882a593Smuzhiyun int (*dgram_enqueue)(struct vsock_sock *, struct sockaddr_vm *,
123*4882a593Smuzhiyun struct msghdr *, size_t len);
124*4882a593Smuzhiyun bool (*dgram_allow)(u32 cid, u32 port);
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun /* STREAM. */
127*4882a593Smuzhiyun /* TODO: stream_bind() */
128*4882a593Smuzhiyun ssize_t (*stream_dequeue)(struct vsock_sock *, struct msghdr *,
129*4882a593Smuzhiyun size_t len, int flags);
130*4882a593Smuzhiyun ssize_t (*stream_enqueue)(struct vsock_sock *, struct msghdr *,
131*4882a593Smuzhiyun size_t len);
132*4882a593Smuzhiyun s64 (*stream_has_data)(struct vsock_sock *);
133*4882a593Smuzhiyun s64 (*stream_has_space)(struct vsock_sock *);
134*4882a593Smuzhiyun u64 (*stream_rcvhiwat)(struct vsock_sock *);
135*4882a593Smuzhiyun bool (*stream_is_active)(struct vsock_sock *);
136*4882a593Smuzhiyun bool (*stream_allow)(u32 cid, u32 port);
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun /* Notification. */
139*4882a593Smuzhiyun int (*notify_poll_in)(struct vsock_sock *, size_t, bool *);
140*4882a593Smuzhiyun int (*notify_poll_out)(struct vsock_sock *, size_t, bool *);
141*4882a593Smuzhiyun int (*notify_recv_init)(struct vsock_sock *, size_t,
142*4882a593Smuzhiyun struct vsock_transport_recv_notify_data *);
143*4882a593Smuzhiyun int (*notify_recv_pre_block)(struct vsock_sock *, size_t,
144*4882a593Smuzhiyun struct vsock_transport_recv_notify_data *);
145*4882a593Smuzhiyun int (*notify_recv_pre_dequeue)(struct vsock_sock *, size_t,
146*4882a593Smuzhiyun struct vsock_transport_recv_notify_data *);
147*4882a593Smuzhiyun int (*notify_recv_post_dequeue)(struct vsock_sock *, size_t,
148*4882a593Smuzhiyun ssize_t, bool, struct vsock_transport_recv_notify_data *);
149*4882a593Smuzhiyun int (*notify_send_init)(struct vsock_sock *,
150*4882a593Smuzhiyun struct vsock_transport_send_notify_data *);
151*4882a593Smuzhiyun int (*notify_send_pre_block)(struct vsock_sock *,
152*4882a593Smuzhiyun struct vsock_transport_send_notify_data *);
153*4882a593Smuzhiyun int (*notify_send_pre_enqueue)(struct vsock_sock *,
154*4882a593Smuzhiyun struct vsock_transport_send_notify_data *);
155*4882a593Smuzhiyun int (*notify_send_post_enqueue)(struct vsock_sock *, ssize_t,
156*4882a593Smuzhiyun struct vsock_transport_send_notify_data *);
157*4882a593Smuzhiyun /* sk_lock held by the caller */
158*4882a593Smuzhiyun void (*notify_buffer_size)(struct vsock_sock *, u64 *);
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun /* Shutdown. */
161*4882a593Smuzhiyun int (*shutdown)(struct vsock_sock *, int);
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun /* Addressing. */
164*4882a593Smuzhiyun u32 (*get_local_cid)(void);
165*4882a593Smuzhiyun };
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun /**** CORE ****/
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun int vsock_core_register(const struct vsock_transport *t, int features);
170*4882a593Smuzhiyun void vsock_core_unregister(const struct vsock_transport *t);
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun /* The transport may downcast this to access transport-specific functions */
173*4882a593Smuzhiyun const struct vsock_transport *vsock_core_get_transport(struct vsock_sock *vsk);
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun /**** UTILS ****/
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun /* vsock_table_lock must be held */
__vsock_in_bound_table(struct vsock_sock * vsk)178*4882a593Smuzhiyun static inline bool __vsock_in_bound_table(struct vsock_sock *vsk)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun return !list_empty(&vsk->bound_table);
181*4882a593Smuzhiyun }
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun /* vsock_table_lock must be held */
__vsock_in_connected_table(struct vsock_sock * vsk)184*4882a593Smuzhiyun static inline bool __vsock_in_connected_table(struct vsock_sock *vsk)
185*4882a593Smuzhiyun {
186*4882a593Smuzhiyun return !list_empty(&vsk->connected_table);
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun void vsock_release_pending(struct sock *pending);
190*4882a593Smuzhiyun void vsock_add_pending(struct sock *listener, struct sock *pending);
191*4882a593Smuzhiyun void vsock_remove_pending(struct sock *listener, struct sock *pending);
192*4882a593Smuzhiyun void vsock_enqueue_accept(struct sock *listener, struct sock *connected);
193*4882a593Smuzhiyun void vsock_insert_connected(struct vsock_sock *vsk);
194*4882a593Smuzhiyun void vsock_remove_bound(struct vsock_sock *vsk);
195*4882a593Smuzhiyun void vsock_remove_connected(struct vsock_sock *vsk);
196*4882a593Smuzhiyun struct sock *vsock_find_bound_socket(struct sockaddr_vm *addr);
197*4882a593Smuzhiyun struct sock *vsock_find_connected_socket(struct sockaddr_vm *src,
198*4882a593Smuzhiyun struct sockaddr_vm *dst);
199*4882a593Smuzhiyun void vsock_remove_sock(struct vsock_sock *vsk);
200*4882a593Smuzhiyun void vsock_for_each_connected_socket(void (*fn)(struct sock *sk));
201*4882a593Smuzhiyun int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk);
202*4882a593Smuzhiyun bool vsock_find_cid(unsigned int cid);
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun /**** TAP ****/
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun struct vsock_tap {
207*4882a593Smuzhiyun struct net_device *dev;
208*4882a593Smuzhiyun struct module *module;
209*4882a593Smuzhiyun struct list_head list;
210*4882a593Smuzhiyun };
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun int vsock_init_tap(void);
213*4882a593Smuzhiyun int vsock_add_tap(struct vsock_tap *vt);
214*4882a593Smuzhiyun int vsock_remove_tap(struct vsock_tap *vt);
215*4882a593Smuzhiyun void vsock_deliver_tap(struct sk_buff *build_skb(void *opaque), void *opaque);
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun #endif /* __AF_VSOCK_H__ */
218