#define VMCI_DOORBELL_LINK 3
#define VMCI_DOORBELL_UNLINK 4
#define VMCI_DOORBELL_NOTIFY 5
+/*
+ * VMCI_DATAGRAM_REQUEST_MAP and VMCI_DATAGRAM_REMOVE_MAP are
+ * obsoleted by the removal of VM to VM communication.
+ */
#define VMCI_DATAGRAM_REQUEST_MAP 6
#define VMCI_DATAGRAM_REMOVE_MAP 7
#define VMCI_EVENT_SUBSCRIBE 8
#define VMCI_HYPERVISOR_CONTEXT_ID 0
/*
- * Well-known context id, a logical context that contains
- * a set of well-known services.
+ * Well-known context id, a logical context that contains a set of
+ * well-known services. This context ID is now obsolete.
*/
#define VMCI_WELL_KNOWN_CONTEXT_ID 1
-/* Todo: Change host context id to dynamic/random id. */
+/*
+ * Context ID used by host endpoints.
+ */
#define VMCI_HOST_CONTEXT_ID 2
/*
1024 * (sizeof(VMCIDatagram) + sizeof(VMCIEventData_Max)))
/*
- * Struct for sending VMCI_DATAGRAM_REQUEST_MAP and VMCI_DATAGRAM_REMOVE_MAP
- * datagrams. Struct size is 32 bytes. All fields in struct are aligned to
- * their natural alignment.
+ * Struct for sending VMCI_DATAGRAM_REQUEST_MAP and
+ * VMCI_DATAGRAM_REMOVE_MAP datagrams. Struct size is 32 bytes. All
+ * fields in struct are aligned to their natural alignment. These
+ * datagrams are obsoleted by the removal of VM to VM communication.
*/
typedef struct VMCIDatagramWellKnownMapMsg {
VMCIDatagram hdr;
#define VMCI_DOORBELL_LINK 3
#define VMCI_DOORBELL_UNLINK 4
#define VMCI_DOORBELL_NOTIFY 5
+/*
+ * VMCI_DATAGRAM_REQUEST_MAP and VMCI_DATAGRAM_REMOVE_MAP are
+ * obsoleted by the removal of VM to VM communication.
+ */
#define VMCI_DATAGRAM_REQUEST_MAP 6
#define VMCI_DATAGRAM_REMOVE_MAP 7
#define VMCI_EVENT_SUBSCRIBE 8
#define VMCI_HYPERVISOR_CONTEXT_ID 0
/*
- * Well-known context id, a logical context that contains
- * a set of well-known services.
+ * Well-known context id, a logical context that contains a set of
+ * well-known services. This context ID is now obsolete.
*/
#define VMCI_WELL_KNOWN_CONTEXT_ID 1
-/* Todo: Change host context id to dynamic/random id. */
+/*
+ * Context ID used by host endpoints.
+ */
#define VMCI_HOST_CONTEXT_ID 2
/*
* this context; e.g., VMX.
*/
VMCILock lock; /* Locks callQueue and handleArrays. */
- VMCIHandleArray *wellKnownArray; /* WellKnown mappings owned by context. */
VMCIHandleArray *queuePairArray; /*
* QueuePairs attached to. The array of
* handles for queue pairs is accessed
context->userVersion = userVersion;
- context->wellKnownArray = VMCIHandleArray_Create(0);
- if (context->wellKnownArray == NULL) {
- result = VMCI_ERROR_NO_MEM;
- goto error;
- }
-
context->queuePairArray = VMCIHandleArray_Create(0);
if (!context->queuePairArray) {
result = VMCI_ERROR_NO_MEM;
if (context->notifierArray) {
VMCIHandleArray_Destroy(context->notifierArray);
}
- if (context->wellKnownArray) {
- VMCIHandleArray_Destroy(context->wellKnownArray);
- }
if (context->queuePairArray) {
VMCIHandleArray_Destroy(context->queuePairArray);
}
VMCIContextFireNotification(context->cid, context->privFlags,
VMCIContextGetDomainName(context));
- /*
- * Cleanup all wellknown mappings owned by context. Ideally these would
- * be removed already but we maintain this list to make sure no resources
- * are leaked. It is updated by the VMCIDatagramAdd/RemoveWellKnownMap.
- */
- ASSERT(context->wellKnownArray);
- tempHandle = VMCIHandleArray_RemoveTail(context->wellKnownArray);
- while (!VMCI_HANDLE_EQUAL(tempHandle, VMCI_INVALID_HANDLE)) {
- VMCIDatagramRemoveWellKnownMap(tempHandle.resource, context->cid);
- tempHandle = VMCIHandleArray_RemoveTail(context->wellKnownArray);
- }
-
/*
* Cleanup all queue pair resources attached to context. If the VM dies
* without cleaning up, this code will make sure that no resources are
}
VMCIHandleArray_Destroy(context->notifierArray);
- VMCIHandleArray_Destroy(context->wellKnownArray);
VMCIHandleArray_Destroy(context->queuePairArray);
VMCIHandleArray_Destroy(context->doorbellArray);
VMCIHandleArray_Destroy(context->pendingDoorbellArray);
}
-/*
- *----------------------------------------------------------------------
- *
- * VMCIContext_AddWellKnown --
- *
- * Wrapper to call VMCIHandleArray_AppendEntry().
- *
- * Results:
- * VMCI_SUCCESS on success, error code otherwise.
- *
- * Side effects:
- * As in VMCIHandleArray_AppendEntry().
- *
- *----------------------------------------------------------------------
- */
-
-int
-VMCIContext_AddWellKnown(VMCIId contextID, // IN:
- VMCIId wellKnownID) // IN:
-{
- VMCILockFlags flags;
- VMCIHandle wkHandle;
- VMCIContext *context = VMCIContext_Get(contextID);
- if (context == NULL) {
- return VMCI_ERROR_NOT_FOUND;
- }
- wkHandle = VMCI_MAKE_HANDLE(VMCI_WELL_KNOWN_CONTEXT_ID, wellKnownID);
- VMCI_GrabLock(&context->lock, &flags);
- VMCIHandleArray_AppendEntry(&context->wellKnownArray, wkHandle);
- VMCI_ReleaseLock(&context->lock, flags);
- VMCIContext_Release(context);
-
- return VMCI_SUCCESS;
-}
-
-
-/*
- *----------------------------------------------------------------------
- *
- * VMCIContext_RemoveWellKnown --
- *
- * Wrapper to call VMCIHandleArray_RemoveEntry().
- *
- * Results:
- * VMCI_SUCCESS if removed, error code otherwise.
- *
- * Side effects:
- * As in VMCIHandleArray_RemoveEntry().
- *
- *----------------------------------------------------------------------
- */
-
-int
-VMCIContext_RemoveWellKnown(VMCIId contextID, // IN:
- VMCIId wellKnownID) // IN:
-{
- VMCILockFlags flags;
- VMCIHandle wkHandle, tmpHandle;
- VMCIContext *context = VMCIContext_Get(contextID);
- if (context == NULL) {
- return VMCI_ERROR_NOT_FOUND;
- }
- wkHandle = VMCI_MAKE_HANDLE(VMCI_WELL_KNOWN_CONTEXT_ID, wellKnownID);
- VMCI_GrabLock(&context->lock, &flags);
- tmpHandle = VMCIHandleArray_RemoveEntry(context->wellKnownArray, wkHandle);
- VMCI_ReleaseLock(&context->lock, flags);
- VMCIContext_Release(context);
-
- if (VMCI_HANDLE_EQUAL(tmpHandle, VMCI_INVALID_HANDLE)) {
- return VMCI_ERROR_NOT_FOUND;
- }
- return VMCI_SUCCESS;
-}
-
-
/*
*----------------------------------------------------------------------
*
array = context->notifierArray;
getContextID = TRUE;
} else if (cptType == VMCI_WELLKNOWN_CPT_STATE) {
- ASSERT(context->wellKnownArray);
- array = context->wellKnownArray;
- getContextID = FALSE;
+ /*
+ * For compatibility with VMX'en with VM to VM communication, we
+ * always return zero wellknown handles.
+ */
+
+ *bufSize = 0;
+ *cptBufPtr = NULL;
+ result = VMCI_SUCCESS;
+ goto release;
} else if (cptType == VMCI_DOORBELL_CPT_STATE) {
ASSERT(context->doorbellArray);
array = context->doorbellArray;
uint32 numIDs = bufSize / sizeof(VMCIId);
ASSERT(cptBuf);
- if (cptType != VMCI_NOTIFICATION_CPT_STATE &&
- cptType != VMCI_WELLKNOWN_CPT_STATE) {
+ if (cptType == VMCI_WELLKNOWN_CPT_STATE && numIDs > 0) {
+ /*
+ * We would end up here if VMX with VM to VM communication
+ * attempts to restore a checkpoint with wellknown handles.
+ */
+
+ VMCI_WARNING((LGPFX"Attempt to restore checkpoint with obsolete "
+ "wellknown handles.\n"));
+ return VMCI_ERROR_OBSOLETE;
+ }
+
+ if (cptType != VMCI_NOTIFICATION_CPT_STATE) {
VMCI_DEBUG_LOG(4, (LGPFX"Invalid cpt state (type=%d).\n", cptType));
return VMCI_ERROR_INVALID_ARGS;
}
for (i = 0; i < numIDs && result == VMCI_SUCCESS; i++) {
currentID = ((VMCIId *)cptBuf)[i];
- if (cptType == VMCI_NOTIFICATION_CPT_STATE) {
- result = VMCIContext_AddNotification(contextID, currentID);
- } else if (cptType == VMCI_WELLKNOWN_CPT_STATE) {
- result = VMCIDatagramRequestWellKnownMap(currentID, contextID,
- VMCIContext_GetPrivFlags(contextID));
+ result = VMCIContext_AddNotification(contextID, currentID);
+ if (result != VMCI_SUCCESS) {
+ break;
}
}
if (result != VMCI_SUCCESS) {
VMCIHandle entryHandle);
VMCIHandle VMCIContext_RemoveGroupEntry(VMCIContext *context,
VMCIHandle entryHandle);
-int VMCIContext_AddWellKnown(VMCIId contextID, VMCIId wellKnownID);
-int VMCIContext_RemoveWellKnown(VMCIId contextID, VMCIId wellKnownID);
int VMCIContext_AddNotification(VMCIId contextID, VMCIId remoteCID);
int VMCIContext_RemoveNotification(VMCIId contextID, VMCIId remoteCID);
int VMCIContext_GetCheckpointState(VMCIId contextID, uint32 cptType,
VMCIPrivilegeFlags privFlags;
} DatagramEntry;
-/* Mapping between wellknown resource and context. */
-typedef struct DatagramWKMapping {
- VMCIHashEntry entry;
- VMCIId contextID;
-} DatagramWKMapping;
-
typedef struct VMCIDelayedDatagramInfo {
Bool inDGHostQueue;
DatagramEntry *entry;
} VMCIDelayedDatagramInfo;
-/* Wellknown mapping hashtable. */
-static VMCIHashTable *wellKnownTable = NULL;
-
static Atomic_uint32 delayedDGHostQueueSize;
static int VMCIDatagramGetPrivFlagsInt(VMCIId contextID, VMCIHandle handle,
static void DatagramFreeCB(void *resource);
static int DatagramReleaseCB(void *clientData);
-static DatagramWKMapping *DatagramGetWellKnownMap(VMCIId wellKnownID);
-static void DatagramReleaseWellKnownMap(DatagramWKMapping *wkMap);
-
/*------------------------------ Helper functions ----------------------------*/
int
VMCIDatagram_Init(void)
{
- /* Create hash table for wellknown mappings. */
- wellKnownTable = VMCIHashTable_Create(32);
- if (wellKnownTable == NULL) {
- return VMCI_ERROR_NO_RESOURCES;
- }
-
Atomic_Write(&delayedDGHostQueueSize, 0);
return VMCI_SUCCESS;
}
void
VMCIDatagram_Exit(void)
{
- if (wellKnownTable != NULL) {
- VMCIHashTable_Destroy(wellKnownTable);
- wellKnownTable = NULL;
- }
}
*/
VMCI_WaitOnEvent(&entry->destroyEvent, DatagramReleaseCB, entry);
- if ((entry->flags & VMCI_FLAG_WELLKNOWN_DG_HND) != 0) {
- VMCIDatagramRemoveWellKnownMap(handle.resource, VMCI_HOST_CONTEXT_ID);
- }
-
/*
* We know that we are now the only reference to the above entry so
* can safely free it.
{
int retval;
size_t dgSize;
- VMCIId dstContext;
VMCIPrivilegeFlags srcPrivFlags;
char srcDomain[VMCI_DOMAIN_NAME_MAXLEN]; /* Not used on hosted. */
char dstDomain[VMCI_DOMAIN_NAME_MAXLEN]; /* Not used on hosted. */
* Check that source handle matches sending context.
*/
if (dg->src.context != contextID) {
- if (dg->src.context == VMCI_WELL_KNOWN_CONTEXT_ID) {
- /* Determine mapping. */
- DatagramWKMapping *wkMap = DatagramGetWellKnownMap(dg->src.resource);
- if (wkMap == NULL) {
- VMCI_DEBUG_LOG(4, (LGPFX"Sending from invalid well-known resource "
- "(handle=0x%x:0x%x).\n",
- dg->src.context, dg->src.resource));
- return VMCI_ERROR_INVALID_RESOURCE;
- }
- if (wkMap->contextID != contextID) {
- VMCI_DEBUG_LOG(4, (LGPFX"Sender context (ID=0x%x) is not owner of "
- "well-known src datagram entry "
- "(handle=0x%x:0x%x).\n",
- contextID, dg->src.context, dg->src.resource));
- DatagramReleaseWellKnownMap(wkMap);
- return VMCI_ERROR_NO_ACCESS;
- }
- DatagramReleaseWellKnownMap(wkMap);
- } else {
- VMCI_DEBUG_LOG(4, (LGPFX"Sender context (ID=0x%x) is not owner of src "
- "datagram entry (handle=0x%x:0x%x).\n",
- contextID, dg->src.context, dg->src.resource));
- return VMCI_ERROR_NO_ACCESS;
- }
- }
-
- if (dg->dst.context == VMCI_WELL_KNOWN_CONTEXT_ID) {
- /* Determine mapping. */
- DatagramWKMapping *wkMap = DatagramGetWellKnownMap(dg->dst.resource);
- if (wkMap == NULL) {
- VMCI_DEBUG_LOG(4, (LGPFX"Sending to invalid wellknown destination "
- "(handle=0x%x:0x%x).\n",
- dg->dst.context, dg->dst.resource));
- return VMCI_ERROR_DST_UNREACHABLE;
- }
- dstContext = wkMap->contextID;
- DatagramReleaseWellKnownMap(wkMap);
- } else {
- dstContext = dg->dst.context;
+ VMCI_DEBUG_LOG(4, (LGPFX"Sender context (ID=0x%x) is not owner of src "
+ "datagram entry (handle=0x%x:0x%x).\n",
+ contextID, dg->src.context, dg->src.resource));
+ return VMCI_ERROR_NO_ACCESS;
}
/*
#endif
/* Determine if we should route to host or guest destination. */
- if (dstContext == VMCI_HOST_CONTEXT_ID) {
+ if (dg->dst.context == VMCI_HOST_CONTEXT_ID) {
/* Route to host datagram entry. */
DatagramEntry *dstEntry;
VMCIResource *resource;
VMCIDatagram *newDG;
#ifdef VMKERNEL
- retval = VMCIContext_GetDomainName(dstContext, dstDomain,
+ retval = VMCIContext_GetDomainName(dg->dst.context, dstDomain,
sizeof dstDomain);
if (retval < VMCI_SUCCESS) {
VMCI_DEBUG_LOG(4, (LGPFX"Failed to get domain name for context "
- "(ID=0x%x).\n", dstContext));
+ "(ID=0x%x).\n", dg->dst.context));
return retval;
}
#endif
- if (contextID != dstContext &&
- VMCIDenyInteraction(srcPrivFlags, VMCIContext_GetPrivFlags(dstContext),
+ if (contextID != dg->dst.context &&
+ VMCIDenyInteraction(srcPrivFlags,
+ VMCIContext_GetPrivFlags(dg->dst.context),
srcDomain, dstDomain)) {
return VMCI_ERROR_NO_ACCESS;
}
return VMCI_ERROR_NO_MEM;
}
memcpy(newDG, dg, dgSize);
- retval = VMCIContext_EnqueueDatagram(dstContext, newDG);
+ retval = VMCIContext_EnqueueDatagram(dg->dst.context, newDG);
if (retval < VMCI_SUCCESS) {
VMCI_FreeKernelMem(newDG, dgSize);
return retval;
}
-/*
- *------------------------------------------------------------------------------
- *
- * DatagramGetWellKnownMap --
- *
- * Gets a mapping between handle and wellknown resource.
- *
- * Results:
- * DatagramWKMapping * if found, NULL if not.
- *
- * Side effects:
- * None.
- *
- *------------------------------------------------------------------------------
- */
-
-static DatagramWKMapping *
-DatagramGetWellKnownMap(VMCIId wellKnownID) // IN:
-{
- VMCIHashEntry *entry;
- DatagramWKMapping *wkMap = NULL;
- VMCIHandle wkHandle = VMCI_MAKE_HANDLE(VMCI_WELL_KNOWN_CONTEXT_ID,
- wellKnownID);
- entry = VMCIHashTable_GetEntry(wellKnownTable, wkHandle);
- if (entry != NULL) {
- wkMap = RESOURCE_CONTAINER(entry, DatagramWKMapping, entry);
- }
- return wkMap;
-}
-
-
-/*
- *------------------------------------------------------------------------------
- *
- * DatagramReleaseWellKnownMap --
- *
- * Releases a wellknown mapping.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *------------------------------------------------------------------------------
- */
-
-static void
-DatagramReleaseWellKnownMap(DatagramWKMapping *wkMap) // IN:
-{
- if (VMCIHashTable_ReleaseEntry(wellKnownTable, &wkMap->entry) ==
- VMCI_SUCCESS_ENTRY_DEAD) {
- VMCI_FreeKernelMem(wkMap, sizeof *wkMap);
- }
-}
-
-
-/*
- *------------------------------------------------------------------------------
- *
- * VMCIDatagramRequestWellKnownMap --
- *
- * Creates a mapping between handle and wellknown resource. If resource
- * is already used we fail the request.
- *
- * Results:
- * VMCI_SUCCESS if created, negative errno value otherwise.
- *
- * Side effects:
- * None.
- *
- *------------------------------------------------------------------------------
- */
-
-int
-VMCIDatagramRequestWellKnownMap(VMCIId wellKnownID, // IN:
- VMCIId contextID, // IN:
- VMCIPrivilegeFlags privFlags) // IN:
-{
- int result;
- DatagramWKMapping *wkMap;
- VMCIHandle wkHandle = VMCI_MAKE_HANDLE(VMCI_WELL_KNOWN_CONTEXT_ID,
- wellKnownID);
-
- if (privFlags & VMCI_PRIVILEGE_FLAG_RESTRICTED ||
- !VMCIWellKnownID_AllowMap(wellKnownID, privFlags)) {
- return VMCI_ERROR_NO_ACCESS;
- }
-
- wkMap = VMCI_AllocKernelMem(sizeof *wkMap, VMCI_MEMORY_NONPAGED);
- if (wkMap == NULL) {
- return VMCI_ERROR_NO_MEM;
- }
-
- VMCIHashTable_InitEntry(&wkMap->entry, wkHandle);
- wkMap->contextID = contextID;
-
- /* Fails if wkHandle (wellKnownID) already exists. */
- result = VMCIHashTable_AddEntry(wellKnownTable, &wkMap->entry);
- if (result != VMCI_SUCCESS) {
- VMCI_FreeKernelMem(wkMap, sizeof *wkMap);
- return result;
- }
- result = VMCIContext_AddWellKnown(contextID, wellKnownID);
- if (UNLIKELY(result < VMCI_SUCCESS)) {
- VMCIHashTable_RemoveEntry(wellKnownTable, &wkMap->entry);
- VMCI_FreeKernelMem(wkMap, sizeof *wkMap);
- }
- return result;
-}
-
-
-/*
- *------------------------------------------------------------------------------
- *
- * VMCIDatagramRemoveWellKnownMap --
- *
- * Removes a mapping between handle and wellknown resource. Checks if
- * mapping belongs to calling context.
- *
- * Results:
- * VMCI_SUCCESS if removed, negative errno value otherwise.
- *
- * Side effects:
- * None.
- *
- *------------------------------------------------------------------------------
- */
-
-int
-VMCIDatagramRemoveWellKnownMap(VMCIId wellKnownID, // IN:
- VMCIId contextID) // IN:
-{
- int result = VMCI_ERROR_NO_ACCESS;
- DatagramWKMapping *wkMap = DatagramGetWellKnownMap(wellKnownID);
- if (wkMap == NULL) {
- VMCI_DEBUG_LOG(4, (LGPFX"Failed to remove well-known mapping between "
- "resource (ID=0x%x) and context (ID=0x%x).\n",
- wellKnownID, contextID));
- return VMCI_ERROR_NOT_FOUND;
- }
-
- if (contextID == wkMap->contextID) {
- VMCIHashTable_RemoveEntry(wellKnownTable, &wkMap->entry);
- VMCIContext_RemoveWellKnown(contextID, wellKnownID);
- result = VMCI_SUCCESS;
- }
- DatagramReleaseWellKnownMap(wkMap);
- return result;
-}
-
-
/*
*-----------------------------------------------------------------------------
*
void VMCIDatagram_Sync(void);
Bool VMCIDatagram_CheckHostCapabilities(void);
-/* Non public datagram API. */
-int VMCIDatagramRequestWellKnownMap(VMCIId wellKnownID, VMCIId contextID,
- VMCIPrivilegeFlags privFlags);
-int VMCIDatagramRemoveWellKnownMap(VMCIId wellKnownID, VMCIId contextID);
-
#endif // _VMCI_DATAGRAM_H_
return VMCI_ERROR_INVALID_ARGS;
}
- /*
- * If we are acting as a host and the datagram is from or for a well-known
- * context (which also means it must have been passed down from a guest),
- * then we can assume it is intended for a guest on this host.
- */
-
- if (fromGuest && hasHostDevice &&
- (VMCI_WELL_KNOWN_CONTEXT_ID == src->context ||
- VMCI_WELL_KNOWN_CONTEXT_ID == dst->context)) {
- *route = VMCI_ROUTE_AS_HOST;
- return VMCI_SUCCESS;
- }
-
/* Anywhere to hypervisor. */
if (VMCI_HYPERVISOR_CONTEXT_ID == dst->context) {
/*
break;
}
- case IOCTL_VMCI_DATAGRAM_REQUEST_MAP: {
- VMCIDatagramMapInfo mapInfo;
- VMCIDatagramMapInfo *info = (VMCIDatagramMapInfo *)ioarg;
- int32 result;
- VMCIId cid;
-
- if (vmciLinux->ctType != VMCIOBJ_CONTEXT) {
- Log(LGPFX"IOCTL_VMCI_REQUEST_MAP only valid for contexts.\n");
- retval = -EINVAL;
- break;
- }
-
- retval = copy_from_user(&mapInfo, (void *)ioarg, sizeof mapInfo);
- if (retval) {
- retval = -EFAULT;
- break;
- }
-
- cid = VMCIContext_GetId(vmciLinux->context);
- result = VMCIDatagramRequestWellKnownMap(mapInfo.wellKnownID, cid,
- VMCIContext_GetPrivFlags(cid));
- retval = copy_to_user(&info->result, &result, sizeof result);
- if (retval) {
- retval = -EFAULT;
- break;
- }
- break;
- }
-
- case IOCTL_VMCI_DATAGRAM_REMOVE_MAP: {
- VMCIDatagramMapInfo mapInfo;
- VMCIDatagramMapInfo *info = (VMCIDatagramMapInfo *)ioarg;
- int32 result;
- VMCIId cid;
-
- if (vmciLinux->ctType != VMCIOBJ_CONTEXT) {
- Log(LGPFX"IOCTL_VMCI_REMOVE_MAP only valid for contexts.\n");
- retval = -EINVAL;
- break;
- }
-
- retval = copy_from_user(&mapInfo, (void *)ioarg, sizeof mapInfo);
- if (retval) {
- retval = -EFAULT;
- break;
- }
-
- cid = VMCIContext_GetId(vmciLinux->context);
- result = VMCIDatagramRemoveWellKnownMap(mapInfo.wellKnownID, cid);
- retval = copy_to_user(&info->result, &result, sizeof result);
- if (retval) {
- retval = -EFAULT;
- break;
- }
- break;
- }
-
case IOCTL_VMCI_CTX_ADD_NOTIFICATION: {
VMCINotifyAddRemoveInfo arInfo;
VMCINotifyAddRemoveInfo *info = (VMCINotifyAddRemoveInfo *)ioarg;
#ifndef _VMCI_VERSION_H_
#define _VMCI_VERSION_H_
-#define VMCI_DRIVER_VERSION 9.3.5.0
-#define VMCI_DRIVER_VERSION_COMMAS 9,3,5,0
-#define VMCI_DRIVER_VERSION_STRING "9.3.5.0"
+#define VMCI_DRIVER_VERSION 9.3.6.0
+#define VMCI_DRIVER_VERSION_COMMAS 9,3,6,0
+#define VMCI_DRIVER_VERSION_STRING "9.3.6.0"
#endif /* _VMCI_VERSION_H_ */