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