I am sponsoring this fast-track on behalf of Strony Zhang,
with a timeout set to 08/12/2009.  The project desires
minor release binding.


-jg


----------------------------------

Template Version: @(#)sac_nextcase 1.68 02/23/09 SMI
This information is Copyright 2009 Sun Microsystems
1. Introduction
   1.1. Project/Component Working Name:
      VirtualBox USB Device Capture
   1.2. Name of Document Author/Supplier:
      Author:  Strony.Zhang
   1.3  Date of This Document:
       04 Aug, 2009

4. Technical Description

Background:
The VirtualBox is a virtualization software product. When VirtualBox
runs on Solaris host OS), it should be able to proxy the USB devices
plugged in the host OS to the guest OS depending on user's
configuration. To achieve this, the VirtualBox needs to control the 
entire USB device completely and ensure the USB device in the pristine
state for guest OS. No driver in host OS should be attached to the
device. Therefore, the VirtualBox team developed a Monitor driver for
capturing devices using the callback and a VirtualBox-specific USB
client driver for transferring data between guest OS and device.

Problem:
When the USB device is plugged in the Solaris system, usba (7D) will
create the compatible names and then attach the corresponding USB client
driver to it by default. During the process, the VirtualBox doesn't have 
a chance to request to attach its own driver to the USB device in which
it is interested.

Solution:
The usba(7D) provides the registration entry to VirtualBox for the
callback and makes the Virtual-specific USB client driver higher
priority than the default USB client driver.  When a USB device is
plugged in the system, the usba(7D) will first call the registered
callback function to query if VirtualBox wants to capture the device.
If yes, the VirtualBox-specific USB client driver will be attached to
the device. Once the VirtualBox exits or user doesn't want to access the 
USB device on guest OS, the VirtualBox will unregister the callback and
then Solaris will take over the USB device taken by VirtualBox.

Interfaces:
The interfaces are Contracted Project Private since they are intended to 
be only used by the VirtualBox.

The following new Interfaces provided by this project:

|-----------------------------------------------------------------------
| Interfaces                    |  Class.   |   Comments               |
|-----------------------------------------------------------------------
| struct usb_dev_str(9s)        |   C.P.P.  |  usb capture device info |
| usb_register_dev_driver(9f)   |   C.P.P   |  usb capture register    |
| usb_unregister_dev_driver(9f) |   C.P.P   |  usb capture unregister  |
| usb_dev_driver_callback()     |   C.P.P   |  usb capture callback    |
|-----------------------------------------------------------------------

They will be available in the <sys/usb/usbai.h>.

/*
* getting the device strings of manufacturer, product and serial number
*/
typedef struct usb_dev_str {
        char        *usb_mfg;         /* manufacturer string */
        char        *usb_product;     /* product string */
        char        *usb_serialno;    /* serial number string */
} usb_dev_str_t;

The callback interface is:

/*
* Return Values:
*      USB_SUCCESS     - VirtualBox will capture the device
*      USB_FAILURE     - VirtualBox will not capture the device
*/
typedef int (*usb_dev_driver_callback)(
        usb_dev_descr_t *dev_descr,     /* ptr to device descriptor */
        usb_dev_str_t   *dev_str,       /* ptr to device strings */
        char            *path,          /* ptr to physical path */
        int             bus,            /* USB bus address */
        int             port,           /* USB port number */
        char            **drv,          /* capture driver name */
        void            *reserved)
            usb_dev_driver_t;

If VirtualBox wants to capture the device, the client driver name
to be attached to the device will be returned by the parameter
(char **drv).

The callback registration and unregistration interfaces are:

int usb_register_dev_driver(dev_info_t *dip, usb_dev_driver_t cb);
void usb_unregister_dev_driver(dev_info_t *dip);

The return value of usb_register_dev_driver() will be USB_SUCCESS
or USB_FAILURE which indicates that the callback registration was
successful or failed.

5. Reference Documents:
PSARC/2000/542 USB Architecture Update project
PSARC/2003/207 USBA2.0: adding USBA interfaces to the DDI

6. Resources and Schedule
6.4. Steering Committee requested information
   6.4.1. Consolidation C-team Name:
       ON
6.5. ARC review type: FastTrack
6.6. ARC Exposure: open



Reply via email to