162306a36Sopenharmony_ci=============== 262306a36Sopenharmony_ciUSB/IP protocol 362306a36Sopenharmony_ci=============== 462306a36Sopenharmony_ci 562306a36Sopenharmony_ciArchitecture 662306a36Sopenharmony_ci============ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ciThe USB/IP protocol follows a server/client architecture. The server exports the 962306a36Sopenharmony_ciUSB devices and the clients import them. The device driver for the exported 1062306a36Sopenharmony_ciUSB device runs on the client machine. 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ciThe client may ask for the list of the exported USB devices. To get the list the 1362306a36Sopenharmony_ciclient opens a TCP/IP connection to the server, and sends an OP_REQ_DEVLIST 1462306a36Sopenharmony_cipacket on top of the TCP/IP connection (so the actual OP_REQ_DEVLIST may be sent 1562306a36Sopenharmony_ciin one or more pieces at the low level transport layer). The server sends back 1662306a36Sopenharmony_cithe OP_REP_DEVLIST packet which lists the exported USB devices. Finally the 1762306a36Sopenharmony_ciTCP/IP connection is closed. 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci:: 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci virtual host controller usb host 2262306a36Sopenharmony_ci "client" "server" 2362306a36Sopenharmony_ci (imports USB devices) (exports USB devices) 2462306a36Sopenharmony_ci | | 2562306a36Sopenharmony_ci | OP_REQ_DEVLIST | 2662306a36Sopenharmony_ci | ----------------------------------------------> | 2762306a36Sopenharmony_ci | | 2862306a36Sopenharmony_ci | OP_REP_DEVLIST | 2962306a36Sopenharmony_ci | <---------------------------------------------- | 3062306a36Sopenharmony_ci | | 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ciOnce the client knows the list of exported USB devices it may decide to use one 3362306a36Sopenharmony_ciof them. First the client opens a TCP/IP connection to the server and 3462306a36Sopenharmony_cisends an OP_REQ_IMPORT packet. The server replies with OP_REP_IMPORT. If the 3562306a36Sopenharmony_ciimport was successful the TCP/IP connection remains open and will be used 3662306a36Sopenharmony_cito transfer the URB traffic between the client and the server. The client may 3762306a36Sopenharmony_cisend two types of packets: the USBIP_CMD_SUBMIT to submit an URB, and 3862306a36Sopenharmony_ciUSBIP_CMD_UNLINK to unlink a previously submitted URB. The answers of the 3962306a36Sopenharmony_ciserver may be USBIP_RET_SUBMIT and USBIP_RET_UNLINK respectively. 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci:: 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci virtual host controller usb host 4462306a36Sopenharmony_ci "client" "server" 4562306a36Sopenharmony_ci (imports USB devices) (exports USB devices) 4662306a36Sopenharmony_ci | | 4762306a36Sopenharmony_ci | OP_REQ_IMPORT | 4862306a36Sopenharmony_ci | ----------------------------------------------> | 4962306a36Sopenharmony_ci | | 5062306a36Sopenharmony_ci | OP_REP_IMPORT | 5162306a36Sopenharmony_ci | <---------------------------------------------- | 5262306a36Sopenharmony_ci | | 5362306a36Sopenharmony_ci | | 5462306a36Sopenharmony_ci | USBIP_CMD_SUBMIT(seqnum = n) | 5562306a36Sopenharmony_ci | ----------------------------------------------> | 5662306a36Sopenharmony_ci | | 5762306a36Sopenharmony_ci | USBIP_RET_SUBMIT(seqnum = n) | 5862306a36Sopenharmony_ci | <---------------------------------------------- | 5962306a36Sopenharmony_ci | . | 6062306a36Sopenharmony_ci | : | 6162306a36Sopenharmony_ci | | 6262306a36Sopenharmony_ci | USBIP_CMD_SUBMIT(seqnum = m) | 6362306a36Sopenharmony_ci | ----------------------------------------------> | 6462306a36Sopenharmony_ci | | 6562306a36Sopenharmony_ci | USBIP_CMD_SUBMIT(seqnum = m+1) | 6662306a36Sopenharmony_ci | ----------------------------------------------> | 6762306a36Sopenharmony_ci | | 6862306a36Sopenharmony_ci | USBIP_CMD_SUBMIT(seqnum = m+2) | 6962306a36Sopenharmony_ci | ----------------------------------------------> | 7062306a36Sopenharmony_ci | | 7162306a36Sopenharmony_ci | USBIP_RET_SUBMIT(seqnum = m) | 7262306a36Sopenharmony_ci | <---------------------------------------------- | 7362306a36Sopenharmony_ci | | 7462306a36Sopenharmony_ci | USBIP_CMD_SUBMIT(seqnum = m+3) | 7562306a36Sopenharmony_ci | ----------------------------------------------> | 7662306a36Sopenharmony_ci | | 7762306a36Sopenharmony_ci | USBIP_RET_SUBMIT(seqnum = m+1) | 7862306a36Sopenharmony_ci | <---------------------------------------------- | 7962306a36Sopenharmony_ci | | 8062306a36Sopenharmony_ci | USBIP_CMD_SUBMIT(seqnum = m+4) | 8162306a36Sopenharmony_ci | ----------------------------------------------> | 8262306a36Sopenharmony_ci | | 8362306a36Sopenharmony_ci | USBIP_RET_SUBMIT(seqnum = m+2) | 8462306a36Sopenharmony_ci | <---------------------------------------------- | 8562306a36Sopenharmony_ci | . | 8662306a36Sopenharmony_ci | : | 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ciFor UNLINK, note that after a successful USBIP_RET_UNLINK, the unlinked URB 8962306a36Sopenharmony_cisubmission would not have a corresponding USBIP_RET_SUBMIT (this is explained in 9062306a36Sopenharmony_cifunction stub_recv_cmd_unlink of drivers/usb/usbip/stub_rx.c). 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci:: 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci virtual host controller usb host 9562306a36Sopenharmony_ci "client" "server" 9662306a36Sopenharmony_ci (imports USB devices) (exports USB devices) 9762306a36Sopenharmony_ci | | 9862306a36Sopenharmony_ci | USBIP_CMD_SUBMIT(seqnum = p) | 9962306a36Sopenharmony_ci | ----------------------------------------------> | 10062306a36Sopenharmony_ci | | 10162306a36Sopenharmony_ci | USBIP_CMD_UNLINK | 10262306a36Sopenharmony_ci | (seqnum = p+1, unlink_seqnum = p) | 10362306a36Sopenharmony_ci | ----------------------------------------------> | 10462306a36Sopenharmony_ci | | 10562306a36Sopenharmony_ci | USBIP_RET_UNLINK | 10662306a36Sopenharmony_ci | (seqnum = p+1, status = -ECONNRESET) | 10762306a36Sopenharmony_ci | <---------------------------------------------- | 10862306a36Sopenharmony_ci | | 10962306a36Sopenharmony_ci | Note: No USBIP_RET_SUBMIT(seqnum = p) | 11062306a36Sopenharmony_ci | <--X---X---X---X---X---X---X---X---X---X---X--- | 11162306a36Sopenharmony_ci | . | 11262306a36Sopenharmony_ci | : | 11362306a36Sopenharmony_ci | | 11462306a36Sopenharmony_ci | USBIP_CMD_SUBMIT(seqnum = q) | 11562306a36Sopenharmony_ci | ----------------------------------------------> | 11662306a36Sopenharmony_ci | | 11762306a36Sopenharmony_ci | USBIP_RET_SUBMIT(seqnum = q) | 11862306a36Sopenharmony_ci | <---------------------------------------------- | 11962306a36Sopenharmony_ci | | 12062306a36Sopenharmony_ci | USBIP_CMD_UNLINK | 12162306a36Sopenharmony_ci | (seqnum = q+1, unlink_seqnum = q) | 12262306a36Sopenharmony_ci | ----------------------------------------------> | 12362306a36Sopenharmony_ci | | 12462306a36Sopenharmony_ci | USBIP_RET_UNLINK | 12562306a36Sopenharmony_ci | (seqnum = q+1, status = 0) | 12662306a36Sopenharmony_ci | <---------------------------------------------- | 12762306a36Sopenharmony_ci | | 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ciThe fields are in network (big endian) byte order meaning that the most significant 13062306a36Sopenharmony_cibyte (MSB) is stored at the lowest address. 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ciProtocol Version 13362306a36Sopenharmony_ci================ 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ciThe documented USBIP version is v1.1.1. The binary representation of this 13662306a36Sopenharmony_civersion in message headers is 0x0111. 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ciThis is defined in tools/usb/usbip/configure.ac 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ciMessage Format 14162306a36Sopenharmony_ci============== 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ciOP_REQ_DEVLIST: 14462306a36Sopenharmony_ci Retrieve the list of exported USB devices. 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 14762306a36Sopenharmony_ci| Offset | Length | Value | Description | 14862306a36Sopenharmony_ci+===========+========+============+===================================================+ 14962306a36Sopenharmony_ci| 0 | 2 | | USBIP version | 15062306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 15162306a36Sopenharmony_ci| 2 | 2 | 0x8005 | Command code: Retrieve the list of exported USB | 15262306a36Sopenharmony_ci| | | | devices. | 15362306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 15462306a36Sopenharmony_ci| 4 | 4 | 0x00000000 | Status: unused, shall be set to 0 | 15562306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ciOP_REP_DEVLIST: 15862306a36Sopenharmony_ci Reply with the list of exported USB devices. 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 16162306a36Sopenharmony_ci| Offset | Length | Value | Description | 16262306a36Sopenharmony_ci+===========+========+============+===================================================+ 16362306a36Sopenharmony_ci| 0 | 2 | | USBIP version | 16462306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 16562306a36Sopenharmony_ci| 2 | 2 | 0x0005 | Reply code: The list of exported USB devices. | 16662306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 16762306a36Sopenharmony_ci| 4 | 4 | 0x00000000 | Status: 0 for OK | 16862306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 16962306a36Sopenharmony_ci| 8 | 4 | n | Number of exported devices: 0 means no exported | 17062306a36Sopenharmony_ci| | | | devices. | 17162306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 17262306a36Sopenharmony_ci| 0x0C | | | From now on the exported n devices are described, | 17362306a36Sopenharmony_ci| | | | if any. If no devices are exported the message | 17462306a36Sopenharmony_ci| | | | ends with the previous "number of exported | 17562306a36Sopenharmony_ci| | | | devices" field. | 17662306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 17762306a36Sopenharmony_ci| | 256 | | path: Path of the device on the host exporting the| 17862306a36Sopenharmony_ci| | | | USB device, string closed with zero byte, e.g. | 17962306a36Sopenharmony_ci| | | | "/sys/devices/pci0000:00/0000:00:1d.1/usb3/3-2" | 18062306a36Sopenharmony_ci| | | | The unused bytes shall be filled with zero | 18162306a36Sopenharmony_ci| | | | bytes. | 18262306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 18362306a36Sopenharmony_ci| 0x10C | 32 | | busid: Bus ID of the exported device, string | 18462306a36Sopenharmony_ci| | | | closed with zero byte, e.g. "3-2". The unused | 18562306a36Sopenharmony_ci| | | | bytes shall be filled with zero bytes. | 18662306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 18762306a36Sopenharmony_ci| 0x12C | 4 | | busnum | 18862306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 18962306a36Sopenharmony_ci| 0x130 | 4 | | devnum | 19062306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 19162306a36Sopenharmony_ci| 0x134 | 4 | | speed | 19262306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 19362306a36Sopenharmony_ci| 0x138 | 2 | | idVendor | 19462306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 19562306a36Sopenharmony_ci| 0x13A | 2 | | idProduct | 19662306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 19762306a36Sopenharmony_ci| 0x13C | 2 | | bcdDevice | 19862306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 19962306a36Sopenharmony_ci| 0x13E | 1 | | bDeviceClass | 20062306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 20162306a36Sopenharmony_ci| 0x13F | 1 | | bDeviceSubClass | 20262306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 20362306a36Sopenharmony_ci| 0x140 | 1 | | bDeviceProtocol | 20462306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 20562306a36Sopenharmony_ci| 0x141 | 1 | | bConfigurationValue | 20662306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 20762306a36Sopenharmony_ci| 0x142 | 1 | | bNumConfigurations | 20862306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 20962306a36Sopenharmony_ci| 0x143 | 1 | | bNumInterfaces | 21062306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 21162306a36Sopenharmony_ci| 0x144 | | m_0 | From now on each interface is described, all | 21262306a36Sopenharmony_ci| | | | together bNumInterfaces times, with the following | 21362306a36Sopenharmony_ci| | | | 4 fields: | 21462306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 21562306a36Sopenharmony_ci| | 1 | | bInterfaceClass | 21662306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 21762306a36Sopenharmony_ci| 0x145 | 1 | | bInterfaceSubClass | 21862306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 21962306a36Sopenharmony_ci| 0x146 | 1 | | bInterfaceProtocol | 22062306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 22162306a36Sopenharmony_ci| 0x147 | 1 | | padding byte for alignment, shall be set to zero | 22262306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 22362306a36Sopenharmony_ci| 0xC + | | | The second exported USB device starts at i=1 | 22462306a36Sopenharmony_ci| i*0x138 + | | | with the path field. | 22562306a36Sopenharmony_ci| m_(i-1)*4 | | | | 22662306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ciOP_REQ_IMPORT: 22962306a36Sopenharmony_ci Request to import (attach) a remote USB device. 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 23262306a36Sopenharmony_ci| Offset | Length | Value | Description | 23362306a36Sopenharmony_ci+===========+========+============+===================================================+ 23462306a36Sopenharmony_ci| 0 | 2 | | USBIP version | 23562306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 23662306a36Sopenharmony_ci| 2 | 2 | 0x8003 | Command code: import a remote USB device. | 23762306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 23862306a36Sopenharmony_ci| 4 | 4 | 0x00000000 | Status: unused, shall be set to 0 | 23962306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 24062306a36Sopenharmony_ci| 8 | 32 | | busid: the busid of the exported device on the | 24162306a36Sopenharmony_ci| | | | remote host. The possible values are taken | 24262306a36Sopenharmony_ci| | | | from the message field OP_REP_DEVLIST.busid. | 24362306a36Sopenharmony_ci| | | | A string closed with zero, the unused bytes | 24462306a36Sopenharmony_ci| | | | shall be filled with zeros. | 24562306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ciOP_REP_IMPORT: 24862306a36Sopenharmony_ci Reply to import (attach) a remote USB device. 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 25162306a36Sopenharmony_ci| Offset | Length | Value | Description | 25262306a36Sopenharmony_ci+===========+========+============+===================================================+ 25362306a36Sopenharmony_ci| 0 | 2 | | USBIP version | 25462306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 25562306a36Sopenharmony_ci| 2 | 2 | 0x0003 | Reply code: Reply to import. | 25662306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 25762306a36Sopenharmony_ci| 4 | 4 | 0x00000000 | Status: | 25862306a36Sopenharmony_ci| | | | | 25962306a36Sopenharmony_ci| | | | - 0 for OK | 26062306a36Sopenharmony_ci| | | | - 1 for error | 26162306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 26262306a36Sopenharmony_ci| 8 | | | From now on comes the details of the imported | 26362306a36Sopenharmony_ci| | | | device, if the previous status field was OK (0), | 26462306a36Sopenharmony_ci| | | | otherwise the reply ends with the status field. | 26562306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 26662306a36Sopenharmony_ci| | 256 | | path: Path of the device on the host exporting the| 26762306a36Sopenharmony_ci| | | | USB device, string closed with zero byte, e.g. | 26862306a36Sopenharmony_ci| | | | "/sys/devices/pci0000:00/0000:00:1d.1/usb3/3-2" | 26962306a36Sopenharmony_ci| | | | The unused bytes shall be filled with zero | 27062306a36Sopenharmony_ci| | | | bytes. | 27162306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 27262306a36Sopenharmony_ci| 0x108 | 32 | | busid: Bus ID of the exported device, string | 27362306a36Sopenharmony_ci| | | | closed with zero byte, e.g. "3-2". The unused | 27462306a36Sopenharmony_ci| | | | bytes shall be filled with zero bytes. | 27562306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 27662306a36Sopenharmony_ci| 0x128 | 4 | | busnum | 27762306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 27862306a36Sopenharmony_ci| 0x12C | 4 | | devnum | 27962306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 28062306a36Sopenharmony_ci| 0x130 | 4 | | speed | 28162306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 28262306a36Sopenharmony_ci| 0x134 | 2 | | idVendor | 28362306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 28462306a36Sopenharmony_ci| 0x136 | 2 | | idProduct | 28562306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 28662306a36Sopenharmony_ci| 0x138 | 2 | | bcdDevice | 28762306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 28862306a36Sopenharmony_ci| 0x139 | 1 | | bDeviceClass | 28962306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 29062306a36Sopenharmony_ci| 0x13A | 1 | | bDeviceSubClass | 29162306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 29262306a36Sopenharmony_ci| 0x13B | 1 | | bDeviceProtocol | 29362306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 29462306a36Sopenharmony_ci| 0x13C | 1 | | bConfigurationValue | 29562306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 29662306a36Sopenharmony_ci| 0x13D | 1 | | bNumConfigurations | 29762306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 29862306a36Sopenharmony_ci| 0x13E | 1 | | bNumInterfaces | 29962306a36Sopenharmony_ci+-----------+--------+------------+---------------------------------------------------+ 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ciThe following four commands have a common basic header called 30262306a36Sopenharmony_ci'usbip_header_basic', and their headers, called 'usbip_header' (before 30362306a36Sopenharmony_citransfer_buffer payload), have the same length, therefore paddings are needed. 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ciusbip_header_basic: 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 30862306a36Sopenharmony_ci| Offset | Length | Description | 30962306a36Sopenharmony_ci+===========+========+===================================================+ 31062306a36Sopenharmony_ci| 0 | 4 | command | 31162306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 31262306a36Sopenharmony_ci| 4 | 4 | seqnum: sequential number that identifies requests| 31362306a36Sopenharmony_ci| | | and corresponding responses; | 31462306a36Sopenharmony_ci| | | incremented per connection | 31562306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 31662306a36Sopenharmony_ci| 8 | 4 | devid: specifies a remote USB device uniquely | 31762306a36Sopenharmony_ci| | | instead of busnum and devnum; | 31862306a36Sopenharmony_ci| | | for client (request), this value is | 31962306a36Sopenharmony_ci| | | ((busnum << 16) | devnum); | 32062306a36Sopenharmony_ci| | | for server (response), this shall be set to 0 | 32162306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 32262306a36Sopenharmony_ci| 0xC | 4 | direction: | 32362306a36Sopenharmony_ci| | | | 32462306a36Sopenharmony_ci| | | - 0: USBIP_DIR_OUT | 32562306a36Sopenharmony_ci| | | - 1: USBIP_DIR_IN | 32662306a36Sopenharmony_ci| | | | 32762306a36Sopenharmony_ci| | | only used by client, for server this shall be 0 | 32862306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 32962306a36Sopenharmony_ci| 0x10 | 4 | ep: endpoint number | 33062306a36Sopenharmony_ci| | | only used by client, for server this shall be 0; | 33162306a36Sopenharmony_ci| | | for UNLINK, this shall be 0 | 33262306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ciUSBIP_CMD_SUBMIT: 33562306a36Sopenharmony_ci Submit an URB 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 33862306a36Sopenharmony_ci| Offset | Length | Description | 33962306a36Sopenharmony_ci+===========+========+===================================================+ 34062306a36Sopenharmony_ci| 0 | 20 | usbip_header_basic, 'command' shall be 0x00000001 | 34162306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 34262306a36Sopenharmony_ci| 0x14 | 4 | transfer_flags: possible values depend on the | 34362306a36Sopenharmony_ci| | | USBIP_URB transfer_flags. | 34462306a36Sopenharmony_ci| | | Refer to include/uapi/linux/usbip.h and | 34562306a36Sopenharmony_ci| | | Documentation/driver-api/usb/URB.rst. | 34662306a36Sopenharmony_ci| | | Refer to usbip_pack_cmd_submit() and | 34762306a36Sopenharmony_ci| | | tweak_transfer_flags() in drivers/usb/usbip/ | 34862306a36Sopenharmony_ci| | | usbip_common.c. | 34962306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 35062306a36Sopenharmony_ci| 0x18 | 4 | transfer_buffer_length: | 35162306a36Sopenharmony_ci| | | use URB transfer_buffer_length | 35262306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 35362306a36Sopenharmony_ci| 0x1C | 4 | start_frame: use URB start_frame; | 35462306a36Sopenharmony_ci| | | initial frame for ISO transfer; | 35562306a36Sopenharmony_ci| | | shall be set to 0 if not ISO transfer | 35662306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 35762306a36Sopenharmony_ci| 0x20 | 4 | number_of_packets: number of ISO packets; | 35862306a36Sopenharmony_ci| | | shall be set to 0xffffffff if not ISO transfer | 35962306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 36062306a36Sopenharmony_ci| 0x24 | 4 | interval: maximum time for the request on the | 36162306a36Sopenharmony_ci| | | server-side host controller | 36262306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 36362306a36Sopenharmony_ci| 0x28 | 8 | setup: data bytes for USB setup, filled with | 36462306a36Sopenharmony_ci| | | zeros if not used. | 36562306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 36662306a36Sopenharmony_ci| 0x30 | n | transfer_buffer. | 36762306a36Sopenharmony_ci| | | If direction is USBIP_DIR_OUT then n equals | 36862306a36Sopenharmony_ci| | | transfer_buffer_length; otherwise n equals 0. | 36962306a36Sopenharmony_ci| | | For ISO transfers the padding between each ISO | 37062306a36Sopenharmony_ci| | | packets is not transmitted. | 37162306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 37262306a36Sopenharmony_ci| 0x30+n | m | iso_packet_descriptor | 37362306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ciUSBIP_RET_SUBMIT: 37662306a36Sopenharmony_ci Reply for submitting an URB 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 37962306a36Sopenharmony_ci| Offset | Length | Description | 38062306a36Sopenharmony_ci+===========+========+===================================================+ 38162306a36Sopenharmony_ci| 0 | 20 | usbip_header_basic, 'command' shall be 0x00000003 | 38262306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 38362306a36Sopenharmony_ci| 0x14 | 4 | status: zero for successful URB transaction, | 38462306a36Sopenharmony_ci| | | otherwise some kind of error happened. | 38562306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 38662306a36Sopenharmony_ci| 0x18 | 4 | actual_length: number of URB data bytes; | 38762306a36Sopenharmony_ci| | | use URB actual_length | 38862306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 38962306a36Sopenharmony_ci| 0x1C | 4 | start_frame: use URB start_frame; | 39062306a36Sopenharmony_ci| | | initial frame for ISO transfer; | 39162306a36Sopenharmony_ci| | | shall be set to 0 if not ISO transfer | 39262306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 39362306a36Sopenharmony_ci| 0x20 | 4 | number_of_packets: number of ISO packets; | 39462306a36Sopenharmony_ci| | | shall be set to 0xffffffff if not ISO transfer | 39562306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 39662306a36Sopenharmony_ci| 0x24 | 4 | error_count | 39762306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 39862306a36Sopenharmony_ci| 0x28 | 8 | padding, shall be set to 0 | 39962306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 40062306a36Sopenharmony_ci| 0x30 | n | transfer_buffer. | 40162306a36Sopenharmony_ci| | | If direction is USBIP_DIR_IN then n equals | 40262306a36Sopenharmony_ci| | | actual_length; otherwise n equals 0. | 40362306a36Sopenharmony_ci| | | For ISO transfers the padding between each ISO | 40462306a36Sopenharmony_ci| | | packets is not transmitted. | 40562306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 40662306a36Sopenharmony_ci| 0x30+n | m | iso_packet_descriptor | 40762306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ciUSBIP_CMD_UNLINK: 41062306a36Sopenharmony_ci Unlink an URB 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 41362306a36Sopenharmony_ci| Offset | Length | Description | 41462306a36Sopenharmony_ci+===========+========+===================================================+ 41562306a36Sopenharmony_ci| 0 | 20 | usbip_header_basic, 'command' shall be 0x00000002 | 41662306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 41762306a36Sopenharmony_ci| 0x14 | 4 | unlink_seqnum, of the SUBMIT request to unlink | 41862306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 41962306a36Sopenharmony_ci| 0x18 | 24 | padding, shall be set to 0 | 42062306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ciUSBIP_RET_UNLINK: 42362306a36Sopenharmony_ci Reply for URB unlink 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 42662306a36Sopenharmony_ci| Offset | Length | Description | 42762306a36Sopenharmony_ci+===========+========+===================================================+ 42862306a36Sopenharmony_ci| 0 | 20 | usbip_header_basic, 'command' shall be 0x00000004 | 42962306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 43062306a36Sopenharmony_ci| 0x14 | 4 | status: This is similar to the status of | 43162306a36Sopenharmony_ci| | | USBIP_RET_SUBMIT (share the same memory offset). | 43262306a36Sopenharmony_ci| | | When UNLINK is successful, status is -ECONNRESET; | 43362306a36Sopenharmony_ci| | | when USBIP_CMD_UNLINK is after USBIP_RET_SUBMIT | 43462306a36Sopenharmony_ci| | | status is 0 | 43562306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 43662306a36Sopenharmony_ci| 0x18 | 24 | padding, shall be set to 0 | 43762306a36Sopenharmony_ci+-----------+--------+---------------------------------------------------+ 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_ciEXAMPLE 44062306a36Sopenharmony_ci======= 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci The following data is captured from wire with Human Interface Devices (HID) 44362306a36Sopenharmony_ci payload 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_ci:: 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_ci CmdIntrIN: 00000001 00000d05 0001000f 00000001 00000001 00000200 00000040 ffffffff 00000000 00000004 00000000 00000000 44862306a36Sopenharmony_ci CmdIntrOUT: 00000001 00000d06 0001000f 00000000 00000001 00000000 00000040 ffffffff 00000000 00000004 00000000 00000000 44962306a36Sopenharmony_ci ffffffff860008a784ce5ae212376300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 45062306a36Sopenharmony_ci RetIntrOut: 00000003 00000d06 00000000 00000000 00000000 00000000 00000040 ffffffff 00000000 00000000 00000000 00000000 45162306a36Sopenharmony_ci RetIntrIn: 00000003 00000d05 00000000 00000000 00000000 00000000 00000040 ffffffff 00000000 00000000 00000000 00000000 45262306a36Sopenharmony_ci ffffffff860011a784ce5ae2123763612891b1020100000400000000000000000000000000000000000000000000000000000000000000000000000000000000 453