opnsense-src/sys/dev/vmware/vmci/vmci_kernel_api_1.h
Mark Peek 63a938566d Add VMCI (Virtual Machine Communication Interface) driver
In a virtual machine, VMCI is exposed as a regular PCI device. The primary
communication mechanisms supported are a point-to-point bidirectional
transport based on a pair of memory-mapped queues, and asynchronous
notifications in the form of datagrams and doorbells. These features are
available to kernel level components such as vSockets through the VMCI
kernel API. In addition to this, the VMCI kernel API provides support for
receiving events related to the state of the VMCI communication channels,
and the virtual machine itself.

Submitted by: Vishnu Dasa <vdasa@vmware.com>
Reviewed by: bcr, imp
Obtained from: VMware
Differential Revision: https://reviews.freebsd.org/D14289
2018-03-25 00:57:00 +00:00

71 lines
2.7 KiB
C

/*-
* Copyright (c) 2018 VMware, Inc. All Rights Reserved.
*
* SPDX-License-Identifier: (BSD-2-Clause AND GPL-2.0)
*
* $FreeBSD$
*/
/* Kernel API (v1) exported from the VMCI guest driver. */
#ifndef _VMCI_KERNEL_API_1_H_
#define _VMCI_KERNEL_API_1_H_
#include "vmci_call_defs.h"
#include "vmci_defs.h"
/* Define version 1. */
#undef VMCI_KERNEL_API_VERSION
#define VMCI_KERNEL_API_VERSION_1 1
#define VMCI_KERNEL_API_VERSION VMCI_KERNEL_API_VERSION_1
/* VMCI Datagram API. */
int vmci_datagram_create_handle(uint32_t resource_id, uint32_t flags,
vmci_datagram_recv_cb recv_cb, void *client_data,
struct vmci_handle *out_handle);
int vmci_datagram_create_handle_priv(uint32_t resource_id, uint32_t flags,
vmci_privilege_flags priv_flags, vmci_datagram_recv_cb recv_cb,
void *client_data, struct vmci_handle *out_handle);
int vmci_datagram_destroy_handle(struct vmci_handle handle);
int vmci_datagram_send(struct vmci_datagram *msg);
/* VMCI Utility API. */
vmci_id vmci_get_context_id(void);
/* VMCI Event API. */
typedef void (*vmci_event_cb)(vmci_id sub_id, struct vmci_event_data *ed,
void *client_data);
int vmci_event_subscribe(vmci_event_type event, vmci_event_cb callback,
void *callback_data, vmci_id *sub_id);
int vmci_event_unsubscribe(vmci_id sub_id);
/* VMCI Queue Pair API. */
struct vmci_qpair;
int vmci_qpair_alloc(struct vmci_qpair **qpair, struct vmci_handle *handle,
uint64_t produce_q_size, uint64_t consume_q_size, vmci_id peer,
uint32_t flags, vmci_privilege_flags priv_flags);
int vmci_qpair_detach(struct vmci_qpair **qpair);
int vmci_qpair_get_produce_indexes(const struct vmci_qpair *qpair,
uint64_t *producer_tail, uint64_t *consumer_head);
int vmci_qpair_get_consume_indexes(const struct vmci_qpair *qpair,
uint64_t *consumer_tail, uint64_t *producer_head);
int64_t vmci_qpair_produce_free_space(const struct vmci_qpair *qpair);
int64_t vmci_qpair_produce_buf_ready(const struct vmci_qpair *qpair);
int64_t vmci_qpair_consume_free_space(const struct vmci_qpair *qpair);
int64_t vmci_qpair_consume_buf_ready(const struct vmci_qpair *qpair);
ssize_t vmci_qpair_enqueue(struct vmci_qpair *qpair, const void *buf,
size_t buf_size, int mode);
ssize_t vmci_qpair_dequeue(struct vmci_qpair *qpair, void *buf,
size_t buf_size, int mode);
ssize_t vmci_qpair_peek(struct vmci_qpair *qpair, void *buf,
size_t buf_size, int mode);
ssize_t vmci_qpair_enquev(struct vmci_qpair *qpair, void *iov, size_t iov_size,
int mode);
ssize_t vmci_qpair_dequev(struct vmci_qpair *qpair, void *iov, size_t iov_size,
int mode);
ssize_t vmci_qpair_peekv(struct vmci_qpair *qpair, void *iov, size_t iov_size,
int mode);
#endif /* !_VMCI_KERNEL_API_1_H_ */