drivers/misc/vmw_vmci/vmci_route.c

Source file repositories/reference/linux-study-clean/drivers/misc/vmw_vmci/vmci_route.c

File Facts

System
Linux kernel
Corpus path
drivers/misc/vmw_vmci/vmci_route.c
Extension
.c
Size
6056 bytes
Lines
219
Domain
Driver Families
Bucket
drivers/misc
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (src->context == VMCI_HYPERVISOR_CONTEXT_ID) {
			/*
			 * If the hypervisor is the source, this is
			 * host local communication. The hypervisor
			 * may send vmci event datagrams to the host
			 * itself, but it will never send datagrams to
			 * an "outer host" through the guest device.
			 */

			if (has_host_device) {
				*route = VMCI_ROUTE_AS_HOST;
				return VMCI_SUCCESS;
			} else {
				return VMCI_ERROR_DEVICE_NOT_FOUND;
			}
		}

		if (!from_guest && has_guest_device) {
			/* If no source context then use the current. */
			if (VMCI_INVALID_ID == src->context)
				src->context = vmci_get_context_id();

			/* Send it from local client down to the host. */
			*route = VMCI_ROUTE_AS_GUEST;
			return VMCI_SUCCESS;
		}

		/*
		 * Otherwise we already received it from a guest and
		 * it is destined for a local client on this host, or
		 * it is from another local client on this host.  We
		 * must be acting as a host to service it.
		 */
		if (!has_host_device)
			return VMCI_ERROR_DEVICE_NOT_FOUND;

		if (VMCI_INVALID_ID == src->context) {
			/*
			 * If it came from a guest then it must have a
			 * valid context.  Otherwise we can use the
			 * host context.
			 */
			if (from_guest)
				return VMCI_ERROR_INVALID_ARGS;

			src->context = VMCI_HOST_CONTEXT_ID;
		}

		/* Route to local client. */
		*route = VMCI_ROUTE_AS_HOST;
		return VMCI_SUCCESS;
	}

	/*
	 * If we are acting as a host then this might be destined for
	 * a guest.
	 */
	if (has_host_device) {
		/* It will have a context if it is meant for a guest. */
		if (vmci_ctx_exists(dst->context)) {
			if (VMCI_INVALID_ID == src->context) {
				/*
				 * If it came from a guest then it
				 * must have a valid context.
				 * Otherwise we can use the host
				 * context.
				 */

				if (from_guest)
					return VMCI_ERROR_INVALID_ARGS;

				src->context = VMCI_HOST_CONTEXT_ID;
			} else if (VMCI_CONTEXT_IS_VM(src->context) &&
				   src->context != dst->context) {
				/*
				 * VM to VM communication is not
				 * allowed. Since we catch all
				 * communication destined for the host
				 * above, this must be destined for a
				 * VM since there is a valid context.
				 */

				return VMCI_ERROR_DST_UNREACHABLE;
			}

			/* Pass it up to the guest. */
			*route = VMCI_ROUTE_AS_HOST;
			return VMCI_SUCCESS;
		} else if (!has_guest_device) {
			/*

Annotation

Implementation Notes