1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
|
/** @file
* USBLib - Library for wrapping up the VBoxUSB functionality, Solaris flavor.
* (DEV,HDrv,Main)
*/
/*
* Copyright (C) 2008 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* you can redistribute it and/or modify it under the terms of the GNU
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*
* The contents of this file may alternatively be used under the terms
* of the Common Development and Distribution License Version 1.0
* (CDDL) only, as it comes in the "COPYING.CDDL" file of the
* VirtualBox OSE distribution, in which case the provisions of the
* CDDL are applicable instead of those of the GPL.
*
* You may elect to license modified versions of this file under the
* terms and conditions of either the GPL or the CDDL or both.
*/
#ifndef ___VBox_usblib_solaris_h
#define ___VBox_usblib_solaris_h
#include <VBox/cdefs.h>
#include <VBox/usbfilter.h>
#include <VBox/vusb.h>
#include <sys/types.h>
#include <sys/ioccom.h>
#include <sys/param.h>
RT_C_DECLS_BEGIN
/** @defgroup grp_USBLib_solaris Solaris Specifics
* @addtogroup grp_USBLib
* @{ */
/** @name VBoxUSB specific IOCtls.
* VBoxUSB uses them for resetting USB devices requests from userland.
* USBProxyService/Device makes use of them to communicate with VBoxUSB.
* @{ */
/** Ring-3 request wrapper for big requests.
*
* This is necessary because the ioctl number scheme on many Unixy OSes (esp. Solaris)
* only allows a relatively small size to be encoded into the request. So, for big
* request this generic form is used instead. */
typedef struct VBOXUSBREQ
{
/** Magic value (VBOXUSB(MON)_MAGIC). */
uint32_t u32Magic;
/** The size of the data buffer (In & Out). */
uint32_t cbData;
/** Result code of the request filled by driver. */
int32_t rc;
/** The user address of the data buffer. */
RTR3PTR pvDataR3;
} VBOXUSBREQ;
/** Pointer to a request wrapper for solaris. */
typedef VBOXUSBREQ *PVBOXUSBREQ;
/** Pointer to a const request wrapper for solaris. */
typedef const VBOXUSBREQ *PCVBOXUSBREQ;
#pragma pack(1)
typedef struct
{
/* Pointer to the Filter. */
USBFILTER Filter;
/* Where to store the added Filter (Id). */
uintptr_t uId;
} VBOXUSBREQ_ADD_FILTER;
typedef struct
{
/* Pointer to Filter (Id) to be removed. */
uintptr_t uId;
} VBOXUSBREQ_REMOVE_FILTER;
typedef struct
{
/** Whether to re-attach the driver. */
bool fReattach;
/* Physical path of the USB device. */
char szDevicePath[1];
} VBOXUSBREQ_RESET_DEVICE;
typedef struct
{
/* Where to store the instance. */
int *pInstance;
/* Physical path of the USB device. */
char szDevicePath[1];
} VBOXUSBREQ_DEVICE_INSTANCE;
typedef struct
{
/** Where to store the instance. */
int Instance;
/* Where to store the client path. */
char szClientPath[MAXPATHLEN];
/** Device identifier (VendorId:ProductId:Release:StaticPath) */
char szDeviceIdent[MAXPATHLEN+48];
/** Callback from monitor specifying client consumer (VM) credentials */
DECLR0CALLBACKMEMBER(int, pfnSetConsumerCredentials,(RTPROCESS Process, int Instance, void *pvReserved));
} VBOXUSBREQ_CLIENT_INFO, *PVBOXUSBREQ_CLIENT_INFO;
typedef VBOXUSBREQ_CLIENT_INFO VBOXUSB_CLIENT_INFO;
typedef PVBOXUSBREQ_CLIENT_INFO PVBOXUSB_CLIENT_INFO;
/** Isoc packet descriptor (Must mirror exactly Solaris USBA's usb_isoc_pkt_descr_t) */
typedef struct
{
ushort_t cbPkt; /* Size of the packet */
ushort_t cbActPkt; /* Size of the packet actually transferred */
VUSBSTATUS enmStatus; /* Per frame transfer status */
} VUSBISOC_PKT_DESC;
/** VBoxUSB IOCtls */
typedef struct
{
void *pvUrbR3; /* Pointer to userland URB (untouched by kernel driver) */
uint8_t bEndpoint; /* Endpoint address */
VUSBXFERTYPE enmType; /* Xfer type */
VUSBDIRECTION enmDir; /* Xfer direction */
VUSBSTATUS enmStatus; /* URB status */
size_t cbData; /* Size of the data */
void *pvData; /* Pointer to the data */
uint32_t cIsocPkts; /* Number of Isoc packets */
VUSBISOC_PKT_DESC aIsocPkts[8]; /* Array of Isoc packet descriptors */
} VBOXUSBREQ_URB, *PVBOXUSBREQ_URB;
typedef struct
{
uint8_t bEndpoint; /* Endpoint address */
} VBOXUSBREQ_CLEAR_EP, *PVBOXUSBREQ_CLEAR_EP;
typedef struct
{
uint8_t bConfigValue; /* Configuration value */
} VBOXUSBREQ_SET_CONFIG, *PVBOXUSBREQ_SET_CONFIG;
typedef VBOXUSBREQ_SET_CONFIG VBOXUSBREQ_GET_CONFIG;
typedef PVBOXUSBREQ_SET_CONFIG PVBOXUSBREQ_GET_CONFIG;
typedef struct
{
uint8_t bInterface; /* Interface number */
uint8_t bAlternate; /* Alternate setting */
} VBOXUSBREQ_SET_INTERFACE, *PVBOXUSBREQ_SET_INTERFACE;
typedef enum
{
VBOXUSB_RESET_LEVEL_NONE = 0,
VBOXUSB_RESET_LEVEL_REATTACH = 2,
VBOXUSB_RESET_LEVEL_SOFT = 4
} VBOXUSB_RESET_LEVEL;
typedef struct
{
VBOXUSB_RESET_LEVEL ResetLevel; /* Reset level after closing */
} VBOXUSBREQ_CLOSE_DEVICE, *PVBOXUSBREQ_CLOSE_DEVICE;
typedef struct
{
uint8_t bEndpoint; /* Endpoint address */
} VBOXUSBREQ_ABORT_PIPE, *PVBOXUSBREQ_ABORT_PIPE;
typedef struct
{
uint32_t u32Major; /* Driver major number */
uint32_t u32Minor; /* Driver minor number */
} VBOXUSBREQ_GET_VERSION, *PVBOXUSBREQ_GET_VERSION;
#pragma pack()
/** The VBOXUSBREQ::u32Magic value for VBoxUSBMon. */
#define VBOXUSBMON_MAGIC 0xba5eba11
/** The VBOXUSBREQ::u32Magic value for VBoxUSB.*/
#define VBOXUSB_MAGIC 0x601fba11
/** The USBLib entry point for userland. */
#define VBOXUSB_DEVICE_NAME "/dev/vboxusbmon"
/** The USBMonitor Major version. */
#define VBOXUSBMON_VERSION_MAJOR 2
/** The USBMonitor Minor version. */
#define VBOXUSBMON_VERSION_MINOR 1
/** The USB Major version. */
#define VBOXUSB_VERSION_MAJOR 1
/** The USB Minor version. */
#define VBOXUSB_VERSION_MINOR 1
#ifdef RT_ARCH_AMD64
# define VBOXUSB_IOCTL_FLAG 128
#elif defined(RT_ARCH_X86)
# define VBOXUSB_IOCTL_FLAG 0
#else
# error "dunno which arch this is!"
#endif
/** USB driver name*/
#define VBOXUSB_DRIVER_NAME "vboxusb"
/* No automatic buffering, size limited to 255 bytes => use VBOXUSBREQ for everything. */
#define VBOXUSB_IOCTL_CODE(Function, Size) _IOWRN('V', (Function) | VBOXUSB_IOCTL_FLAG, sizeof(VBOXUSBREQ))
#define VBOXUSB_IOCTL_CODE_FAST(Function) _IO( 'V', (Function) | VBOXUSB_IOCTL_FLAG)
#define VBOXUSB_IOCTL_STRIP_SIZE(Code) (Code)
#define VBOXUSBMON_IOCTL_ADD_FILTER VBOXUSB_IOCTL_CODE(1, (sizeof(VBoxUSBAddFilterReq)))
#define VBOXUSBMON_IOCTL_REMOVE_FILTER VBOXUSB_IOCTL_CODE(2, (sizeof(VBoxUSBRemoveFilterReq)))
#define VBOXUSBMON_IOCTL_RESET_DEVICE VBOXUSB_IOCTL_CODE(3, (sizeof(VBOXUSBREQ_RESET_DEVICE)))
#define VBOXUSBMON_IOCTL_DEVICE_INSTANCE VBOXUSB_IOCTL_CODE(4, (sizeof(VBOXUSBREQ_DEVICE_INSTANCE)))
#define VBOXUSBMON_IOCTL_CLIENT_INFO VBOXUSB_IOCTL_CODE(5, (sizeof(VBOXUSBREQ_CLIENT_PATH)))
#define VBOXUSBMON_IOCTL_GET_VERSION VBOXUSB_IOCTL_CODE(6, (sizeof(VBOXUSBREQ_GET_VERSION)))
/* VBoxUSB ioctls */
#define VBOXUSB_IOCTL_SEND_URB VBOXUSB_IOCTL_CODE(20, (sizeof(VBOXUSBREQ_URB))) /* 1072146796 */
#define VBOXUSB_IOCTL_REAP_URB VBOXUSB_IOCTL_CODE(21, (sizeof(VBOXUSBREQ_URB))) /* 1072146795 */
#define VBOXUSB_IOCTL_CLEAR_EP VBOXUSB_IOCTL_CODE(22, (sizeof(VBOXUSBREQ_CLEAR_EP))) /* 1072146794 */
#define VBOXUSB_IOCTL_SET_CONFIG VBOXUSB_IOCTL_CODE(23, (sizeof(VBOXUSBREQ_SET_CONFIG))) /* 1072146793 */
#define VBOXUSB_IOCTL_SET_INTERFACE VBOXUSB_IOCTL_CODE(24, (sizeof(VBOXUSBREQ_SET_INTERFACE))) /* 1072146792 */
#define VBOXUSB_IOCTL_CLOSE_DEVICE VBOXUSB_IOCTL_CODE(25, (sizeof(VBOXUSBREQ_CLOSE_DEVICE))) /* 1072146791 0xc0185699 */
#define VBOXUSB_IOCTL_ABORT_PIPE VBOXUSB_IOCTL_CODE(26, (sizeof(VBOXUSBREQ_ABORT_PIPE))) /* 1072146790 */
#define VBOXUSB_IOCTL_GET_CONFIG VBOXUSB_IOCTL_CODE(27, (sizeof(VBOXUSBREQ_GET_CONFIG))) /* 1072146789 */
#define VBOXUSB_IOCTL_GET_VERSION VBOXUSB_IOCTL_CODE(28, (sizeof(VBOXUSBREQ_GET_VERSION))) /* 1072146788 */
/** @} */
/* USBLibHelper data for resetting the device. */
typedef struct VBOXUSBHELPERDATA_RESET
{
/** Path of the USB device. */
const char *pszDevicePath;
/** Re-enumerate or not. */
bool fHardReset;
} VBOXUSBHELPERDATA_RESET;
typedef VBOXUSBHELPERDATA_RESET *PVBOXUSBHELPERDATA_RESET;
typedef const VBOXUSBHELPERDATA_RESET *PCVBOXUSBHELPERDATA_RESET;
/* USBLibHelper data for device hijacking. */
typedef struct VBOXUSBHELPERDATA_ALIAS
{
/** Vendor ID. */
uint16_t idVendor;
/** Product ID. */
uint16_t idProduct;
/** Revision, integer part. */
uint16_t bcdDevice;
/** Path of the USB device. */
const char *pszDevicePath;
} VBOXUSBHELPERDATA_ALIAS;
typedef VBOXUSBHELPERDATA_ALIAS *PVBOXUSBHELPERDATA_ALIAS;
typedef const VBOXUSBHELPERDATA_ALIAS *PCVBOXUSBHELPERDATA_ALIAS;
USBLIB_DECL(int) USBLibResetDevice(char *pszDevicePath, bool fReattach);
USBLIB_DECL(int) USBLibDeviceInstance(char *pszDevicePath, int *pInstance);
USBLIB_DECL(int) USBLibGetClientInfo(char *pszDeviceIdent, char **ppszClientPath, int *pInstance);
USBLIB_DECL(int) USBLibAddDeviceAlias(PUSBDEVICE pDevice);
USBLIB_DECL(int) USBLibRemoveDeviceAlias(PUSBDEVICE pDevice);
/*USBLIB_DECL(int) USBLibConfigureDevice(PUSBDEVICE pDevice);*/
/** @} */
RT_C_DECLS_END
#endif
|