1PRELIMINARY DRAFT, MAY CONTAIN MISTAKES! 228 Jun 2011 3 4The USB/IP protocol follows a server/client architecture. The server exports the 5USB devices and the clients imports them. The device driver for the exported 6USB device runs on the client machine. 7 8The client may ask for the list of the exported USB devices. To get the list the 9client opens a TCP/IP connection towards the server, and sends an OP_REQ_DEVLIST 10packet on top of the TCP/IP connection (so the actual OP_REQ_DEVLIST may be sent 11in one or more pieces at the low level transport layer). The server sends back 12the OP_REP_DEVLIST packet which lists the exported USB devices. Finally the 13TCP/IP connection is closed. 14 15 virtual host controller usb host 16 "client" "server" 17 (imports USB devices) (exports USB devices) 18 | | 19 | OP_REQ_DEVLIST | 20 | ----------------------------------------------> | 21 | | 22 | OP_REP_DEVLIST | 23 | <---------------------------------------------- | 24 | | 25 26Once the client knows the list of exported USB devices it may decide to use one 27of them. First the client opens a TCP/IP connection towards the server and 28sends an OP_REQ_IMPORT packet. The server replies with OP_REP_IMPORT. If the 29import was successful the TCP/IP connection remains open and will be used 30to transfer the URB traffic between the client and the server. The client may 31send two types of packets: the USBIP_CMD_SUBMIT to submit an URB, and 32USBIP_CMD_UNLINK to unlink a previously submitted URB. The answers of the 33server may be USBIP_RET_SUBMIT and USBIP_RET_UNLINK respectively. 34 35 virtual host controller usb host 36 "client" "server" 37 (imports USB devices) (exports USB devices) 38 | | 39 | OP_REQ_IMPORT | 40 | ----------------------------------------------> | 41 | | 42 | OP_REP_IMPORT | 43 | <---------------------------------------------- | 44 | | 45 | | 46 | USBIP_CMD_SUBMIT(seqnum = n) | 47 | ----------------------------------------------> | 48 | | 49 | USBIP_RET_SUBMIT(seqnum = n) | 50 | <---------------------------------------------- | 51 | . | 52 | : | 53 | | 54 | USBIP_CMD_SUBMIT(seqnum = m) | 55 | ----------------------------------------------> | 56 | | 57 | USBIP_CMD_SUBMIT(seqnum = m+1) | 58 | ----------------------------------------------> | 59 | | 60 | USBIP_CMD_SUBMIT(seqnum = m+2) | 61 | ----------------------------------------------> | 62 | | 63 | USBIP_RET_SUBMIT(seqnum = m) | 64 | <---------------------------------------------- | 65 | | 66 | USBIP_CMD_SUBMIT(seqnum = m+3) | 67 | ----------------------------------------------> | 68 | | 69 | USBIP_RET_SUBMIT(seqnum = m+1) | 70 | <---------------------------------------------- | 71 | | 72 | USBIP_CMD_SUBMIT(seqnum = m+4) | 73 | ----------------------------------------------> | 74 | | 75 | USBIP_RET_SUBMIT(seqnum = m+2) | 76 | <---------------------------------------------- | 77 | . | 78 | : | 79 | | 80 | USBIP_CMD_UNLINK | 81 | ----------------------------------------------> | 82 | | 83 | USBIP_RET_UNLINK | 84 | <---------------------------------------------- | 85 | | 86 87The fields are in network (big endian) byte order meaning that the most significant 88byte (MSB) is stored at the lowest address. 89 90 91OP_REQ_DEVLIST: Retrieve the list of exported USB devices. 92 93 Offset | Length | Value | Description 94-----------+--------+------------+--------------------------------------------------- 95 0 | 2 | 0x0100 | Binary-coded decimal USBIP version number: v1.0.0 96-----------+--------+------------+--------------------------------------------------- 97 2 | 2 | 0x8005 | Command code: Retrieve the list of exported USB 98 | | | devices. 99-----------+--------+------------+--------------------------------------------------- 100 4 | 4 | 0x00000000 | Status: unused, shall be set to 0 101 102OP_REP_DEVLIST: Reply with the list of exported USB devices. 103 104 Offset | Length | Value | Description 105-----------+--------+------------+--------------------------------------------------- 106 0 | 2 | 0x0100 | Binary-coded decimal USBIP version number: v1.0.0. 107-----------+--------+------------+--------------------------------------------------- 108 2 | 2 | 0x0005 | Reply code: The list of exported USB devices. 109-----------+--------+------------+--------------------------------------------------- 110 4 | 4 | 0x00000000 | Status: 0 for OK 111-----------+--------+------------+--------------------------------------------------- 112 8 | 4 | n | Number of exported devices: 0 means no exported 113 | | | devices. 114-----------+--------+------------+--------------------------------------------------- 115 0x0C | | | From now on the exported n devices are described, 116 | | | if any. If no devices are exported the message 117 | | | ends with the previous "number of exported 118 | | | devices" field. 119-----------+--------+------------+--------------------------------------------------- 120 | 256 | | path: Path of the device on the host exporting the 121 | | | USB device, string closed with zero byte, e.g. 122 | | | "/sys/devices/pci0000:00/0000:00:1d.1/usb3/3-2" 123 | | | The unused bytes shall be filled with zero 124 | | | bytes. 125-----------+--------+------------+--------------------------------------------------- 126 0x10C | 32 | | busid: Bus ID of the exported device, string 127 | | | closed with zero byte, e.g. "3-2". The unused 128 | | | bytes shall be filled with zero bytes. 129-----------+--------+------------+--------------------------------------------------- 130 0x12C | 4 | | busnum 131-----------+--------+------------+--------------------------------------------------- 132 0x130 | 4 | | devnum 133-----------+--------+------------+--------------------------------------------------- 134 0x134 | 4 | | speed 135-----------+--------+------------+--------------------------------------------------- 136 0x138 | 2 | | idVendor 137-----------+--------+------------+--------------------------------------------------- 138 0x13A | 2 | | idProduct 139-----------+--------+------------+--------------------------------------------------- 140 0x13C | 2 | | bcdDevice 141-----------+--------+------------+--------------------------------------------------- 142 0x13E | 1 | | bDeviceClass 143-----------+--------+------------+--------------------------------------------------- 144 0x13F | 1 | | bDeviceSubClass 145-----------+--------+------------+--------------------------------------------------- 146 0x140 | 1 | | bDeviceProtocol 147-----------+--------+------------+--------------------------------------------------- 148 0x141 | 1 | | bConfigurationValue 149-----------+--------+------------+--------------------------------------------------- 150 0x142 | 1 | | bNumConfigurations 151-----------+--------+------------+--------------------------------------------------- 152 0x143 | 1 | | bNumInterfaces 153-----------+--------+------------+--------------------------------------------------- 154 0x144 | | m_0 | From now on each interface is described, all 155 | | | together bNumInterfaces times, with the 156 | | | the following 4 fields: 157-----------+--------+------------+--------------------------------------------------- 158 | 1 | | bInterfaceClass 159-----------+--------+------------+--------------------------------------------------- 160 0x145 | 1 | | bInterfaceSubClass 161-----------+--------+------------+--------------------------------------------------- 162 0x146 | 1 | | bInterfaceProtocol 163-----------+--------+------------+--------------------------------------------------- 164 0x147 | 1 | | padding byte for alignment, shall be set to zero 165-----------+--------+------------+--------------------------------------------------- 166 0xC + | | | The second exported USB device starts at i=1 167 i*0x138 + | | | with the busid field. 168 m_(i-1)*4 | | | 169 170OP_REQ_IMPORT: Request to import (attach) a remote USB device. 171 172 Offset | Length | Value | Description 173-----------+--------+------------+--------------------------------------------------- 174 0 | 2 | 0x0100 | Binary-coded decimal USBIP version number: v1.0.0 175-----------+--------+------------+--------------------------------------------------- 176 2 | 2 | 0x8003 | Command code: import a remote USB device. 177-----------+--------+------------+--------------------------------------------------- 178 4 | 4 | 0x00000000 | Status: unused, shall be set to 0 179-----------+--------+------------+--------------------------------------------------- 180 8 | 32 | | busid: the busid of the exported device on the 181 | | | remote host. The possible values are taken 182 | | | from the message field OP_REP_DEVLIST.busid. 183 | | | A string closed with zero, the unused bytes 184 | | | shall be filled with zeros. 185-----------+--------+------------+--------------------------------------------------- 186 187OP_REP_IMPORT: Reply to import (attach) a remote USB device. 188 189 Offset | Length | Value | Description 190-----------+--------+------------+--------------------------------------------------- 191 0 | 2 | 0x0100 | Binary-coded decimal USBIP version number: v1.0.0 192-----------+--------+------------+--------------------------------------------------- 193 2 | 2 | 0x0003 | Reply code: Reply to import. 194-----------+--------+------------+--------------------------------------------------- 195 4 | 4 | 0x00000000 | Status: 0 for OK 196 | | | 1 for error 197-----------+--------+------------+--------------------------------------------------- 198 8 | | | From now on comes the details of the imported 199 | | | device, if the previous status field was OK (0), 200 | | | otherwise the reply ends with the status field. 201-----------+--------+------------+--------------------------------------------------- 202 | 256 | | path: Path of the device on the host exporting the 203 | | | USB device, string closed with zero byte, e.g. 204 | | | "/sys/devices/pci0000:00/0000:00:1d.1/usb3/3-2" 205 | | | The unused bytes shall be filled with zero 206 | | | bytes. 207-----------+--------+------------+--------------------------------------------------- 208 0x108 | 32 | | busid: Bus ID of the exported device, string 209 | | | closed with zero byte, e.g. "3-2". The unused 210 | | | bytes shall be filled with zero bytes. 211-----------+--------+------------+--------------------------------------------------- 212 0x128 | 4 | | busnum 213-----------+--------+------------+--------------------------------------------------- 214 0x12C | 4 | | devnum 215-----------+--------+------------+--------------------------------------------------- 216 0x130 | 4 | | speed 217-----------+--------+------------+--------------------------------------------------- 218 0x134 | 2 | | idVendor 219-----------+--------+------------+--------------------------------------------------- 220 0x136 | 2 | | idProduct 221-----------+--------+------------+--------------------------------------------------- 222 0x138 | 2 | | bcdDevice 223-----------+--------+------------+--------------------------------------------------- 224 0x139 | 1 | | bDeviceClass 225-----------+--------+------------+--------------------------------------------------- 226 0x13A | 1 | | bDeviceSubClass 227-----------+--------+------------+--------------------------------------------------- 228 0x13B | 1 | | bDeviceProtocol 229-----------+--------+------------+--------------------------------------------------- 230 0x13C | 1 | | bConfigurationValue 231-----------+--------+------------+--------------------------------------------------- 232 0x13D | 1 | | bNumConfigurations 233-----------+--------+------------+--------------------------------------------------- 234 0x13E | 1 | | bNumInterfaces 235 236USBIP_CMD_SUBMIT: Submit an URB 237 238 Offset | Length | Value | Description 239-----------+--------+------------+--------------------------------------------------- 240 0 | 4 | 0x00000001 | command: Submit an URB 241-----------+--------+------------+--------------------------------------------------- 242 4 | 4 | | seqnum: the sequence number of the URB to submit 243-----------+--------+------------+--------------------------------------------------- 244 8 | 4 | | devid 245-----------+--------+------------+--------------------------------------------------- 246 0xC | 4 | | direction: 0: USBIP_DIR_OUT 247 | | | 1: USBIP_DIR_IN 248-----------+--------+------------+--------------------------------------------------- 249 0x10 | 4 | | ep: endpoint number, possible values are: 0...15 250-----------+--------+------------+--------------------------------------------------- 251 0x14 | 4 | | transfer_flags: possible values depend on the 252 | | | URB transfer type, see below 253-----------+--------+------------+--------------------------------------------------- 254 0x18 | 4 | | transfer_buffer_length 255-----------+--------+------------+--------------------------------------------------- 256 0x1C | 4 | | start_frame: specify the selected frame to 257 | | | transmit an ISO frame, ignored if URB_ISO_ASAP 258 | | | is specified at transfer_flags 259-----------+--------+------------+--------------------------------------------------- 260 0x20 | 4 | | number_of_packets: number of ISO packets 261-----------+--------+------------+--------------------------------------------------- 262 0x24 | 4 | | interval: maximum time for the request on the 263 | | | server-side host controller 264-----------+--------+------------+--------------------------------------------------- 265 0x28 | 8 | | setup: data bytes for USB setup, filled with 266 | | | zeros if not used 267-----------+--------+------------+--------------------------------------------------- 268 0x30 | | | URB data. For ISO transfers the padding between 269 | | | each ISO packets is not transmitted. 270 271 272 Allowed transfer_flags | value | control | interrupt | bulk | isochronous 273 -------------------------+------------+---------+-----------+----------+------------- 274 URB_SHORT_NOT_OK | 0x00000001 | only in | only in | only in | no 275 URB_ISO_ASAP | 0x00000002 | no | no | no | yes 276 URB_NO_TRANSFER_DMA_MAP | 0x00000004 | yes | yes | yes | yes 277 URB_NO_FSBR | 0x00000020 | yes | no | no | no 278 URB_ZERO_PACKET | 0x00000040 | no | no | only out | no 279 URB_NO_INTERRUPT | 0x00000080 | yes | yes | yes | yes 280 URB_FREE_BUFFER | 0x00000100 | yes | yes | yes | yes 281 URB_DIR_MASK | 0x00000200 | yes | yes | yes | yes 282 283 284USBIP_RET_SUBMIT: Reply for submitting an URB 285 286 Offset | Length | Value | Description 287-----------+--------+------------+--------------------------------------------------- 288 0 | 4 | 0x00000003 | command 289-----------+--------+------------+--------------------------------------------------- 290 4 | 4 | | seqnum: URB sequence number 291-----------+--------+------------+--------------------------------------------------- 292 8 | 4 | | devid 293-----------+--------+------------+--------------------------------------------------- 294 0xC | 4 | | direction: 0: USBIP_DIR_OUT 295 | | | 1: USBIP_DIR_IN 296-----------+--------+------------+--------------------------------------------------- 297 0x10 | 4 | | ep: endpoint number 298-----------+--------+------------+--------------------------------------------------- 299 0x14 | 4 | | status: zero for successful URB transaction, 300 | | | otherwise some kind of error happened. 301-----------+--------+------------+--------------------------------------------------- 302 0x18 | 4 | n | actual_length: number of URB data bytes 303-----------+--------+------------+--------------------------------------------------- 304 0x1C | 4 | | start_frame: for an ISO frame the actually 305 | | | selected frame for transmit. 306-----------+--------+------------+--------------------------------------------------- 307 0x20 | 4 | | number_of_packets 308-----------+--------+------------+--------------------------------------------------- 309 0x24 | 4 | | error_count 310-----------+--------+------------+--------------------------------------------------- 311 0x28 | 8 | | setup: data bytes for USB setup, filled with 312 | | | zeros if not used 313-----------+--------+------------+--------------------------------------------------- 314 0x30 | n | | URB data bytes. For ISO transfers the padding 315 | | | between each ISO packets is not transmitted. 316 317USBIP_CMD_UNLINK: Unlink an URB 318 319 Offset | Length | Value | Description 320-----------+--------+------------+--------------------------------------------------- 321 0 | 4 | 0x00000002 | command: URB unlink command 322-----------+--------+------------+--------------------------------------------------- 323 4 | 4 | | seqnum: URB sequence number to unlink: FIXME: is this so? 324-----------+--------+------------+--------------------------------------------------- 325 8 | 4 | | devid 326-----------+--------+------------+--------------------------------------------------- 327 0xC | 4 | | direction: 0: USBIP_DIR_OUT 328 | | | 1: USBIP_DIR_IN 329-----------+--------+------------+--------------------------------------------------- 330 0x10 | 4 | | ep: endpoint number: zero 331-----------+--------+------------+--------------------------------------------------- 332 0x14 | 4 | | seqnum: the URB sequence number given previously 333 | | | at USBIP_CMD_SUBMIT.seqnum field 334-----------+--------+------------+--------------------------------------------------- 335 0x30 | n | | URB data bytes. For ISO transfers the padding 336 | | | between each ISO packets is not transmitted. 337 338USBIP_RET_UNLINK: Reply for URB unlink 339 340 Offset | Length | Value | Description 341-----------+--------+------------+--------------------------------------------------- 342 0 | 4 | 0x00000004 | command: reply for the URB unlink command 343-----------+--------+------------+--------------------------------------------------- 344 4 | 4 | | seqnum: the unlinked URB sequence number 345-----------+--------+------------+--------------------------------------------------- 346 8 | 4 | | devid 347-----------+--------+------------+--------------------------------------------------- 348 0xC | 4 | | direction: 0: USBIP_DIR_OUT 349 | | | 1: USBIP_DIR_IN 350-----------+--------+------------+--------------------------------------------------- 351 0x10 | 4 | | ep: endpoint number 352-----------+--------+------------+--------------------------------------------------- 353 0x14 | 4 | | status: This is the value contained in the 354 | | | urb->status in the URB completition handler. 355 | | | FIXME: a better explanation needed. 356-----------+--------+------------+--------------------------------------------------- 357 0x30 | n | | URB data bytes. For ISO transfers the padding 358 | | | between each ISO packets is not transmitted. 359