mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-15 08:44:14 +08:00
d021c34405
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>
87 lines
2.2 KiB
C
87 lines
2.2 KiB
C
/*
|
|
* VMware vSockets Driver
|
|
*
|
|
* Copyright (C) 2007-2012 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.
|
|
*/
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/socket.h>
|
|
#include <linux/stddef.h>
|
|
#include <net/sock.h>
|
|
|
|
#include "vsock_addr.h"
|
|
|
|
void vsock_addr_init(struct sockaddr_vm *addr, u32 cid, u32 port)
|
|
{
|
|
memset(addr, 0, sizeof(*addr));
|
|
addr->svm_family = AF_VSOCK;
|
|
addr->svm_cid = cid;
|
|
addr->svm_port = port;
|
|
}
|
|
EXPORT_SYMBOL_GPL(vsock_addr_init);
|
|
|
|
int vsock_addr_validate(const struct sockaddr_vm *addr)
|
|
{
|
|
if (!addr)
|
|
return -EFAULT;
|
|
|
|
if (addr->svm_family != AF_VSOCK)
|
|
return -EAFNOSUPPORT;
|
|
|
|
if (addr->svm_zero[0] != 0)
|
|
return -EINVAL;
|
|
|
|
return 0;
|
|
}
|
|
EXPORT_SYMBOL_GPL(vsock_addr_validate);
|
|
|
|
bool vsock_addr_bound(const struct sockaddr_vm *addr)
|
|
{
|
|
return addr->svm_port != VMADDR_PORT_ANY;
|
|
}
|
|
EXPORT_SYMBOL_GPL(vsock_addr_bound);
|
|
|
|
void vsock_addr_unbind(struct sockaddr_vm *addr)
|
|
{
|
|
vsock_addr_init(addr, VMADDR_CID_ANY, VMADDR_PORT_ANY);
|
|
}
|
|
EXPORT_SYMBOL_GPL(vsock_addr_unbind);
|
|
|
|
bool vsock_addr_equals_addr(const struct sockaddr_vm *addr,
|
|
const struct sockaddr_vm *other)
|
|
{
|
|
return addr->svm_cid == other->svm_cid &&
|
|
addr->svm_port == other->svm_port;
|
|
}
|
|
EXPORT_SYMBOL_GPL(vsock_addr_equals_addr);
|
|
|
|
bool vsock_addr_equals_addr_any(const struct sockaddr_vm *addr,
|
|
const struct sockaddr_vm *other)
|
|
{
|
|
return (addr->svm_cid == VMADDR_CID_ANY ||
|
|
other->svm_cid == VMADDR_CID_ANY ||
|
|
addr->svm_cid == other->svm_cid) &&
|
|
addr->svm_port == other->svm_port;
|
|
}
|
|
EXPORT_SYMBOL_GPL(vsock_addr_equals_addr_any);
|
|
|
|
int vsock_addr_cast(const struct sockaddr *addr,
|
|
size_t len, struct sockaddr_vm **out_addr)
|
|
{
|
|
if (len < sizeof(**out_addr))
|
|
return -EFAULT;
|
|
|
|
*out_addr = (struct sockaddr_vm *)addr;
|
|
return vsock_addr_validate(*out_addr);
|
|
}
|
|
EXPORT_SYMBOL_GPL(vsock_addr_cast);
|