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