Skip to content

Commit c0cfa2d

Browse files
stefano-garzarelladavem330
authored andcommitted
vsock: add multi-transports support
This patch adds the support of multiple transports in the VSOCK core. With the multi-transports support, we can use vsock with nested VMs (using also different hypervisors) loading both guest->host and host->guest transports at the same time. Major changes: - vsock core module can be loaded regardless of the transports - vsock_core_init() and vsock_core_exit() are renamed to vsock_core_register() and vsock_core_unregister() - vsock_core_register() has a feature parameter (H2G, G2H, DGRAM) to identify which directions the transport can handle and if it's support DGRAM (only vmci) - each stream socket is assigned to a transport when the remote CID is set (during the connect() or when we receive a connection request on a listener socket). The remote CID is used to decide which transport to use: - remote CID <= VMADDR_CID_HOST will use guest->host transport; - remote CID == local_cid (guest->host transport) will use guest->host transport for loopback (host->guest transports don't support loopback); - remote CID > VMADDR_CID_HOST will use host->guest transport; - listener sockets are not bound to any transports since no transport operations are done on it. In this way we can create a listener socket, also if the transports are not loaded or with VMADDR_CID_ANY to listen on all transports. - DGRAM sockets are handled as before, since only the vmci_transport provides this feature. Signed-off-by: Stefano Garzarella <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 0396425 commit c0cfa2d

File tree

7 files changed

+297
-97
lines changed

7 files changed

+297
-97
lines changed

drivers/vhost/vsock.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -831,7 +831,8 @@ static int __init vhost_vsock_init(void)
831831
{
832832
int ret;
833833

834-
ret = vsock_core_init(&vhost_transport.transport);
834+
ret = vsock_core_register(&vhost_transport.transport,
835+
VSOCK_TRANSPORT_F_H2G);
835836
if (ret < 0)
836837
return ret;
837838
return misc_register(&vhost_vsock_misc);
@@ -840,7 +841,7 @@ static int __init vhost_vsock_init(void)
840841
static void __exit vhost_vsock_exit(void)
841842
{
842843
misc_deregister(&vhost_vsock_misc);
843-
vsock_core_exit();
844+
vsock_core_unregister(&vhost_transport.transport);
844845
};
845846

846847
module_init(vhost_vsock_init);

include/net/af_vsock.h

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,14 @@ struct vsock_transport_send_notify_data {
9191
u64 data2; /* Transport-defined. */
9292
};
9393

94+
/* Transport features flags */
95+
/* Transport provides host->guest communication */
96+
#define VSOCK_TRANSPORT_F_H2G 0x00000001
97+
/* Transport provides guest->host communication */
98+
#define VSOCK_TRANSPORT_F_G2H 0x00000002
99+
/* Transport provides DGRAM communication */
100+
#define VSOCK_TRANSPORT_F_DGRAM 0x00000004
101+
94102
struct vsock_transport {
95103
/* Initialize/tear-down socket. */
96104
int (*init)(struct vsock_sock *, struct vsock_sock *);
@@ -154,12 +162,8 @@ struct vsock_transport {
154162

155163
/**** CORE ****/
156164

157-
int __vsock_core_init(const struct vsock_transport *t, struct module *owner);
158-
static inline int vsock_core_init(const struct vsock_transport *t)
159-
{
160-
return __vsock_core_init(t, THIS_MODULE);
161-
}
162-
void vsock_core_exit(void);
165+
int vsock_core_register(const struct vsock_transport *t, int features);
166+
void vsock_core_unregister(const struct vsock_transport *t);
163167

164168
/* The transport may downcast this to access transport-specific functions */
165169
const struct vsock_transport *vsock_core_get_transport(struct vsock_sock *vsk);
@@ -190,6 +194,8 @@ struct sock *vsock_find_connected_socket(struct sockaddr_vm *src,
190194
struct sockaddr_vm *dst);
191195
void vsock_remove_sock(struct vsock_sock *vsk);
192196
void vsock_for_each_connected_socket(void (*fn)(struct sock *sk));
197+
int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk);
198+
bool vsock_find_cid(unsigned int cid);
193199

194200
/**** TAP ****/
195201

0 commit comments

Comments
 (0)