2017-11-01 22:09:13 +08:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
VSOCK: Introduce VM Sockets
VM Sockets allows communication between virtual machines and the hypervisor.
User level applications both in a virtual machine and on the host can use the
VM Sockets API, which facilitates fast and efficient communication between
guest virtual machines and their host. A socket address family, designed to be
compatible with UDP and TCP at the interface level, is provided.
Today, VM Sockets is used by various VMware Tools components inside the guest
for zero-config, network-less access to VMware host services. In addition to
this, VMware's users are using VM Sockets for various applications, where
network access of the virtual machine is restricted or non-existent. Examples
of this are VMs communicating with device proxies for proprietary hardware
running as host applications and automated testing of applications running
within virtual machines.
The VMware VM Sockets are similar to other socket types, like Berkeley UNIX
socket interface. The VM Sockets module supports both connection-oriented
stream sockets like TCP, and connectionless datagram sockets like UDP. The VM
Sockets protocol family is defined as "AF_VSOCK" and the socket operations
split for SOCK_DGRAM and SOCK_STREAM.
For additional information about the use of VM Sockets, please refer to the
VM Sockets Programming Guide available at:
https://www.vmware.com/support/developer/vmci-sdk/
Signed-off-by: George Zhang <georgezhang@vmware.com>
Signed-off-by: Dmitry Torokhov <dtor@vmware.com>
Signed-off-by: Andy king <acking@vmware.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-02-06 22:23:56 +08:00
|
|
|
/*
|
|
|
|
* VMware vSockets Driver
|
|
|
|
*
|
|
|
|
* Copyright (C) 2007-2013 VMware, Inc. All rights reserved.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
|
|
* under the terms of the GNU General Public License as published by the Free
|
|
|
|
* Software Foundation version 2 and no later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
|
|
* more details.
|
|
|
|
*/
|
|
|
|
|
2013-03-07 13:26:13 +08:00
|
|
|
#ifndef _UAPI_VM_SOCKETS_H
|
|
|
|
#define _UAPI_VM_SOCKETS_H
|
VSOCK: Introduce VM Sockets
VM Sockets allows communication between virtual machines and the hypervisor.
User level applications both in a virtual machine and on the host can use the
VM Sockets API, which facilitates fast and efficient communication between
guest virtual machines and their host. A socket address family, designed to be
compatible with UDP and TCP at the interface level, is provided.
Today, VM Sockets is used by various VMware Tools components inside the guest
for zero-config, network-less access to VMware host services. In addition to
this, VMware's users are using VM Sockets for various applications, where
network access of the virtual machine is restricted or non-existent. Examples
of this are VMs communicating with device proxies for proprietary hardware
running as host applications and automated testing of applications running
within virtual machines.
The VMware VM Sockets are similar to other socket types, like Berkeley UNIX
socket interface. The VM Sockets module supports both connection-oriented
stream sockets like TCP, and connectionless datagram sockets like UDP. The VM
Sockets protocol family is defined as "AF_VSOCK" and the socket operations
split for SOCK_DGRAM and SOCK_STREAM.
For additional information about the use of VM Sockets, please refer to the
VM Sockets Programming Guide available at:
https://www.vmware.com/support/developer/vmci-sdk/
Signed-off-by: George Zhang <georgezhang@vmware.com>
Signed-off-by: Dmitry Torokhov <dtor@vmware.com>
Signed-off-by: Andy king <acking@vmware.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-02-06 22:23:56 +08:00
|
|
|
|
2013-03-07 13:26:13 +08:00
|
|
|
#include <linux/socket.h>
|
2020-12-15 00:11:18 +08:00
|
|
|
#include <linux/types.h>
|
VSOCK: Introduce VM Sockets
VM Sockets allows communication between virtual machines and the hypervisor.
User level applications both in a virtual machine and on the host can use the
VM Sockets API, which facilitates fast and efficient communication between
guest virtual machines and their host. A socket address family, designed to be
compatible with UDP and TCP at the interface level, is provided.
Today, VM Sockets is used by various VMware Tools components inside the guest
for zero-config, network-less access to VMware host services. In addition to
this, VMware's users are using VM Sockets for various applications, where
network access of the virtual machine is restricted or non-existent. Examples
of this are VMs communicating with device proxies for proprietary hardware
running as host applications and automated testing of applications running
within virtual machines.
The VMware VM Sockets are similar to other socket types, like Berkeley UNIX
socket interface. The VM Sockets module supports both connection-oriented
stream sockets like TCP, and connectionless datagram sockets like UDP. The VM
Sockets protocol family is defined as "AF_VSOCK" and the socket operations
split for SOCK_DGRAM and SOCK_STREAM.
For additional information about the use of VM Sockets, please refer to the
VM Sockets Programming Guide available at:
https://www.vmware.com/support/developer/vmci-sdk/
Signed-off-by: George Zhang <georgezhang@vmware.com>
Signed-off-by: Dmitry Torokhov <dtor@vmware.com>
Signed-off-by: Andy king <acking@vmware.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-02-06 22:23:56 +08:00
|
|
|
|
|
|
|
/* Option name for STREAM socket buffer size. Use as the option name in
|
|
|
|
* setsockopt(3) or getsockopt(3) to set or get an unsigned long long that
|
|
|
|
* specifies the size of the buffer underlying a vSockets STREAM socket.
|
|
|
|
* Value is clamped to the MIN and MAX.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define SO_VM_SOCKETS_BUFFER_SIZE 0
|
|
|
|
|
|
|
|
/* Option name for STREAM socket minimum buffer size. Use as the option name
|
|
|
|
* in setsockopt(3) or getsockopt(3) to set or get an unsigned long long that
|
|
|
|
* specifies the minimum size allowed for the buffer underlying a vSockets
|
|
|
|
* STREAM socket.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define SO_VM_SOCKETS_BUFFER_MIN_SIZE 1
|
|
|
|
|
|
|
|
/* Option name for STREAM socket maximum buffer size. Use as the option name
|
|
|
|
* in setsockopt(3) or getsockopt(3) to set or get an unsigned long long
|
|
|
|
* that specifies the maximum size allowed for the buffer underlying a
|
|
|
|
* vSockets STREAM socket.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define SO_VM_SOCKETS_BUFFER_MAX_SIZE 2
|
|
|
|
|
|
|
|
/* Option name for socket peer's host-specific VM ID. Use as the option name
|
|
|
|
* in getsockopt(3) to get a host-specific identifier for the peer endpoint's
|
|
|
|
* VM. The identifier is a signed integer.
|
|
|
|
* Only available for hypervisor endpoints.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define SO_VM_SOCKETS_PEER_HOST_VM_ID 3
|
|
|
|
|
|
|
|
/* Option name for determining if a socket is trusted. Use as the option name
|
|
|
|
* in getsockopt(3) to determine if a socket is trusted. The value is a
|
|
|
|
* signed integer.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define SO_VM_SOCKETS_TRUSTED 5
|
|
|
|
|
|
|
|
/* Option name for STREAM socket connection timeout. Use as the option name
|
|
|
|
* in setsockopt(3) or getsockopt(3) to set or get the connection
|
|
|
|
* timeout for a STREAM socket.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define SO_VM_SOCKETS_CONNECT_TIMEOUT 6
|
|
|
|
|
|
|
|
/* Option name for using non-blocking send/receive. Use as the option name
|
|
|
|
* for setsockopt(3) or getsockopt(3) to set or get the non-blocking
|
|
|
|
* transmit/receive flag for a STREAM socket. This flag determines whether
|
|
|
|
* send() and recv() can be called in non-blocking contexts for the given
|
|
|
|
* socket. The value is a signed integer.
|
|
|
|
*
|
|
|
|
* This option is only relevant to kernel endpoints, where descheduling the
|
|
|
|
* thread of execution is not allowed, for example, while holding a spinlock.
|
|
|
|
* It is not to be confused with conventional non-blocking socket operations.
|
|
|
|
*
|
|
|
|
* Only available for hypervisor endpoints.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define SO_VM_SOCKETS_NONBLOCK_TXRX 7
|
|
|
|
|
|
|
|
/* The vSocket equivalent of INADDR_ANY. This works for the svm_cid field of
|
|
|
|
* sockaddr_vm and indicates the context ID of the current endpoint.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define VMADDR_CID_ANY -1U
|
|
|
|
|
|
|
|
/* Bind to any available port. Works for the svm_port field of
|
|
|
|
* sockaddr_vm.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define VMADDR_PORT_ANY -1U
|
|
|
|
|
|
|
|
/* Use this as the destination CID in an address when referring to the
|
|
|
|
* hypervisor. VMCI relies on it being 0, but this would be useful for other
|
|
|
|
* transports too.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define VMADDR_CID_HYPERVISOR 0
|
|
|
|
|
2019-12-10 18:43:03 +08:00
|
|
|
/* Use this as the destination CID in an address when referring to the
|
|
|
|
* local communication (loopback).
|
|
|
|
* (This was VMADDR_CID_RESERVED, but even VMCI doesn't use it anymore,
|
|
|
|
* it was a legacy value from an older release).
|
VSOCK: Introduce VM Sockets
VM Sockets allows communication between virtual machines and the hypervisor.
User level applications both in a virtual machine and on the host can use the
VM Sockets API, which facilitates fast and efficient communication between
guest virtual machines and their host. A socket address family, designed to be
compatible with UDP and TCP at the interface level, is provided.
Today, VM Sockets is used by various VMware Tools components inside the guest
for zero-config, network-less access to VMware host services. In addition to
this, VMware's users are using VM Sockets for various applications, where
network access of the virtual machine is restricted or non-existent. Examples
of this are VMs communicating with device proxies for proprietary hardware
running as host applications and automated testing of applications running
within virtual machines.
The VMware VM Sockets are similar to other socket types, like Berkeley UNIX
socket interface. The VM Sockets module supports both connection-oriented
stream sockets like TCP, and connectionless datagram sockets like UDP. The VM
Sockets protocol family is defined as "AF_VSOCK" and the socket operations
split for SOCK_DGRAM and SOCK_STREAM.
For additional information about the use of VM Sockets, please refer to the
VM Sockets Programming Guide available at:
https://www.vmware.com/support/developer/vmci-sdk/
Signed-off-by: George Zhang <georgezhang@vmware.com>
Signed-off-by: Dmitry Torokhov <dtor@vmware.com>
Signed-off-by: Andy king <acking@vmware.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-02-06 22:23:56 +08:00
|
|
|
*/
|
|
|
|
|
2019-12-10 18:43:03 +08:00
|
|
|
#define VMADDR_CID_LOCAL 1
|
VSOCK: Introduce VM Sockets
VM Sockets allows communication between virtual machines and the hypervisor.
User level applications both in a virtual machine and on the host can use the
VM Sockets API, which facilitates fast and efficient communication between
guest virtual machines and their host. A socket address family, designed to be
compatible with UDP and TCP at the interface level, is provided.
Today, VM Sockets is used by various VMware Tools components inside the guest
for zero-config, network-less access to VMware host services. In addition to
this, VMware's users are using VM Sockets for various applications, where
network access of the virtual machine is restricted or non-existent. Examples
of this are VMs communicating with device proxies for proprietary hardware
running as host applications and automated testing of applications running
within virtual machines.
The VMware VM Sockets are similar to other socket types, like Berkeley UNIX
socket interface. The VM Sockets module supports both connection-oriented
stream sockets like TCP, and connectionless datagram sockets like UDP. The VM
Sockets protocol family is defined as "AF_VSOCK" and the socket operations
split for SOCK_DGRAM and SOCK_STREAM.
For additional information about the use of VM Sockets, please refer to the
VM Sockets Programming Guide available at:
https://www.vmware.com/support/developer/vmci-sdk/
Signed-off-by: George Zhang <georgezhang@vmware.com>
Signed-off-by: Dmitry Torokhov <dtor@vmware.com>
Signed-off-by: Andy king <acking@vmware.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-02-06 22:23:56 +08:00
|
|
|
|
|
|
|
/* Use this as the destination CID in an address when referring to the host
|
|
|
|
* (any process other than the hypervisor). VMCI relies on it being 2, but
|
|
|
|
* this would be useful for other transports too.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define VMADDR_CID_HOST 2
|
|
|
|
|
2020-12-15 00:11:19 +08:00
|
|
|
/* The current default use case for the vsock channel is the following:
|
|
|
|
* local vsock communication between guest and host and nested VMs setup.
|
|
|
|
* In addition to this, implicitly, the vsock packets are forwarded to the host
|
|
|
|
* if no host->guest vsock transport is set.
|
|
|
|
*
|
|
|
|
* Set this flag value in the sockaddr_vm corresponding field if the vsock
|
|
|
|
* packets need to be always forwarded to the host. Using this behavior,
|
|
|
|
* vsock communication between sibling VMs can be setup.
|
|
|
|
*
|
|
|
|
* This way can explicitly distinguish between vsock channels created for
|
|
|
|
* different use cases, such as nested VMs (or local communication between
|
|
|
|
* guest and host) and sibling VMs.
|
|
|
|
*
|
|
|
|
* The flag can be set in the connect logic in the user space application flow.
|
|
|
|
* In the listen logic (from kernel space) the flag is set on the remote peer
|
|
|
|
* address. This happens for an incoming connection when it is routed from the
|
|
|
|
* host and comes from the guest (local CID and remote CID > VMADDR_CID_HOST).
|
|
|
|
*/
|
|
|
|
#define VMADDR_FLAG_TO_HOST 0x01
|
|
|
|
|
VSOCK: Introduce VM Sockets
VM Sockets allows communication between virtual machines and the hypervisor.
User level applications both in a virtual machine and on the host can use the
VM Sockets API, which facilitates fast and efficient communication between
guest virtual machines and their host. A socket address family, designed to be
compatible with UDP and TCP at the interface level, is provided.
Today, VM Sockets is used by various VMware Tools components inside the guest
for zero-config, network-less access to VMware host services. In addition to
this, VMware's users are using VM Sockets for various applications, where
network access of the virtual machine is restricted or non-existent. Examples
of this are VMs communicating with device proxies for proprietary hardware
running as host applications and automated testing of applications running
within virtual machines.
The VMware VM Sockets are similar to other socket types, like Berkeley UNIX
socket interface. The VM Sockets module supports both connection-oriented
stream sockets like TCP, and connectionless datagram sockets like UDP. The VM
Sockets protocol family is defined as "AF_VSOCK" and the socket operations
split for SOCK_DGRAM and SOCK_STREAM.
For additional information about the use of VM Sockets, please refer to the
VM Sockets Programming Guide available at:
https://www.vmware.com/support/developer/vmci-sdk/
Signed-off-by: George Zhang <georgezhang@vmware.com>
Signed-off-by: Dmitry Torokhov <dtor@vmware.com>
Signed-off-by: Andy king <acking@vmware.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-02-06 22:23:56 +08:00
|
|
|
/* Invalid vSockets version. */
|
|
|
|
|
|
|
|
#define VM_SOCKETS_INVALID_VERSION -1U
|
|
|
|
|
|
|
|
/* The epoch (first) component of the vSockets version. A single byte
|
|
|
|
* representing the epoch component of the vSockets version.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define VM_SOCKETS_VERSION_EPOCH(_v) (((_v) & 0xFF000000) >> 24)
|
|
|
|
|
|
|
|
/* The major (second) component of the vSockets version. A single byte
|
|
|
|
* representing the major component of the vSockets version. Typically
|
|
|
|
* changes for every major release of a product.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define VM_SOCKETS_VERSION_MAJOR(_v) (((_v) & 0x00FF0000) >> 16)
|
|
|
|
|
|
|
|
/* The minor (third) component of the vSockets version. Two bytes representing
|
|
|
|
* the minor component of the vSockets version.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define VM_SOCKETS_VERSION_MINOR(_v) (((_v) & 0x0000FFFF))
|
|
|
|
|
|
|
|
/* Address structure for vSockets. The address family should be set to
|
2013-03-07 13:26:13 +08:00
|
|
|
* AF_VSOCK. The structure members should all align on their natural
|
|
|
|
* boundaries without resorting to compiler packing directives. The total size
|
|
|
|
* of this structure should be exactly the same as that of struct sockaddr.
|
VSOCK: Introduce VM Sockets
VM Sockets allows communication between virtual machines and the hypervisor.
User level applications both in a virtual machine and on the host can use the
VM Sockets API, which facilitates fast and efficient communication between
guest virtual machines and their host. A socket address family, designed to be
compatible with UDP and TCP at the interface level, is provided.
Today, VM Sockets is used by various VMware Tools components inside the guest
for zero-config, network-less access to VMware host services. In addition to
this, VMware's users are using VM Sockets for various applications, where
network access of the virtual machine is restricted or non-existent. Examples
of this are VMs communicating with device proxies for proprietary hardware
running as host applications and automated testing of applications running
within virtual machines.
The VMware VM Sockets are similar to other socket types, like Berkeley UNIX
socket interface. The VM Sockets module supports both connection-oriented
stream sockets like TCP, and connectionless datagram sockets like UDP. The VM
Sockets protocol family is defined as "AF_VSOCK" and the socket operations
split for SOCK_DGRAM and SOCK_STREAM.
For additional information about the use of VM Sockets, please refer to the
VM Sockets Programming Guide available at:
https://www.vmware.com/support/developer/vmci-sdk/
Signed-off-by: George Zhang <georgezhang@vmware.com>
Signed-off-by: Dmitry Torokhov <dtor@vmware.com>
Signed-off-by: Andy king <acking@vmware.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-02-06 22:23:56 +08:00
|
|
|
*/
|
|
|
|
|
|
|
|
struct sockaddr_vm {
|
2013-03-07 13:26:13 +08:00
|
|
|
__kernel_sa_family_t svm_family;
|
VSOCK: Introduce VM Sockets
VM Sockets allows communication between virtual machines and the hypervisor.
User level applications both in a virtual machine and on the host can use the
VM Sockets API, which facilitates fast and efficient communication between
guest virtual machines and their host. A socket address family, designed to be
compatible with UDP and TCP at the interface level, is provided.
Today, VM Sockets is used by various VMware Tools components inside the guest
for zero-config, network-less access to VMware host services. In addition to
this, VMware's users are using VM Sockets for various applications, where
network access of the virtual machine is restricted or non-existent. Examples
of this are VMs communicating with device proxies for proprietary hardware
running as host applications and automated testing of applications running
within virtual machines.
The VMware VM Sockets are similar to other socket types, like Berkeley UNIX
socket interface. The VM Sockets module supports both connection-oriented
stream sockets like TCP, and connectionless datagram sockets like UDP. The VM
Sockets protocol family is defined as "AF_VSOCK" and the socket operations
split for SOCK_DGRAM and SOCK_STREAM.
For additional information about the use of VM Sockets, please refer to the
VM Sockets Programming Guide available at:
https://www.vmware.com/support/developer/vmci-sdk/
Signed-off-by: George Zhang <georgezhang@vmware.com>
Signed-off-by: Dmitry Torokhov <dtor@vmware.com>
Signed-off-by: Andy king <acking@vmware.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-02-06 22:23:56 +08:00
|
|
|
unsigned short svm_reserved1;
|
|
|
|
unsigned int svm_port;
|
|
|
|
unsigned int svm_cid;
|
2020-12-15 00:11:18 +08:00
|
|
|
__u8 svm_flags;
|
VSOCK: Introduce VM Sockets
VM Sockets allows communication between virtual machines and the hypervisor.
User level applications both in a virtual machine and on the host can use the
VM Sockets API, which facilitates fast and efficient communication between
guest virtual machines and their host. A socket address family, designed to be
compatible with UDP and TCP at the interface level, is provided.
Today, VM Sockets is used by various VMware Tools components inside the guest
for zero-config, network-less access to VMware host services. In addition to
this, VMware's users are using VM Sockets for various applications, where
network access of the virtual machine is restricted or non-existent. Examples
of this are VMs communicating with device proxies for proprietary hardware
running as host applications and automated testing of applications running
within virtual machines.
The VMware VM Sockets are similar to other socket types, like Berkeley UNIX
socket interface. The VM Sockets module supports both connection-oriented
stream sockets like TCP, and connectionless datagram sockets like UDP. The VM
Sockets protocol family is defined as "AF_VSOCK" and the socket operations
split for SOCK_DGRAM and SOCK_STREAM.
For additional information about the use of VM Sockets, please refer to the
VM Sockets Programming Guide available at:
https://www.vmware.com/support/developer/vmci-sdk/
Signed-off-by: George Zhang <georgezhang@vmware.com>
Signed-off-by: Dmitry Torokhov <dtor@vmware.com>
Signed-off-by: Andy king <acking@vmware.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-02-06 22:23:56 +08:00
|
|
|
unsigned char svm_zero[sizeof(struct sockaddr) -
|
|
|
|
sizeof(sa_family_t) -
|
|
|
|
sizeof(unsigned short) -
|
2020-12-15 00:11:18 +08:00
|
|
|
sizeof(unsigned int) -
|
|
|
|
sizeof(unsigned int) -
|
|
|
|
sizeof(__u8)];
|
VSOCK: Introduce VM Sockets
VM Sockets allows communication between virtual machines and the hypervisor.
User level applications both in a virtual machine and on the host can use the
VM Sockets API, which facilitates fast and efficient communication between
guest virtual machines and their host. A socket address family, designed to be
compatible with UDP and TCP at the interface level, is provided.
Today, VM Sockets is used by various VMware Tools components inside the guest
for zero-config, network-less access to VMware host services. In addition to
this, VMware's users are using VM Sockets for various applications, where
network access of the virtual machine is restricted or non-existent. Examples
of this are VMs communicating with device proxies for proprietary hardware
running as host applications and automated testing of applications running
within virtual machines.
The VMware VM Sockets are similar to other socket types, like Berkeley UNIX
socket interface. The VM Sockets module supports both connection-oriented
stream sockets like TCP, and connectionless datagram sockets like UDP. The VM
Sockets protocol family is defined as "AF_VSOCK" and the socket operations
split for SOCK_DGRAM and SOCK_STREAM.
For additional information about the use of VM Sockets, please refer to the
VM Sockets Programming Guide available at:
https://www.vmware.com/support/developer/vmci-sdk/
Signed-off-by: George Zhang <georgezhang@vmware.com>
Signed-off-by: Dmitry Torokhov <dtor@vmware.com>
Signed-off-by: Andy king <acking@vmware.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2013-02-06 22:23:56 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
#define IOCTL_VM_SOCKETS_GET_LOCAL_CID _IO(7, 0xb9)
|
|
|
|
|
2013-03-07 13:26:13 +08:00
|
|
|
#endif /* _UAPI_VM_SOCKETS_H */
|