blob: 8594465f7320b978d742c18248b50482a68e6c4d [file] [log] [blame]
Greg Hartman92045f62017-10-31 17:12:24 -07001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#pragma once
17
18#include <glog/logging.h>
19#include <stdint.h>
20
21#include "common/libs/fs/shared_fd.h"
22
23// Requests and constants below are defined in kernel documentation file:
24// https://www.kernel.org/doc/Documentation/usb/usbip_protocol.txt
25namespace vadb {
26namespace usbip {
Greg Hartman92045f62017-10-31 17:12:24 -070027
28////////////////////////////////////////////////////////////////////////////////
29// COMMANDS
30////////////////////////////////////////////////////////////////////////////////
31
32// Command numbers. Commands are valid only once USB device is attached.
33enum Command : uint32_t {
34 kUsbIpCmdReqSubmit = 1, // Submit request
35 kUsbIpCmdReqUnlink = 2, // Unlink request
36 kUsbIpCmdRepSubmit = 3, // Submit response
37 kUsbIpCmdRepUnlink = 4, // Unlink response
38};
39
40// Direction of data flow.
41enum Direction : uint32_t {
42 kUsbIpDirectionOut = 0,
43 kUsbIpDirectionIn = 1,
44};
45
46// Setup structure is explained in great detail here:
47// - http://www.beyondlogic.org/usbnutshell/usb6.shtml
48// - http://www.usbmadesimple.co.uk/ums_4.htm
49struct CmdRequest {
50 uint8_t type;
51 uint8_t cmd;
52 uint16_t value;
53 uint16_t index;
54 uint16_t length;
55} __attribute__((packed));
56
57// CmdHeader precedes any command request or response body.
58struct CmdHeader {
59 Command command;
60 uint32_t seq_num;
61 uint16_t bus_num;
62 uint16_t dev_num;
63 Direction direction;
64 uint32_t endpoint; // valid values: 0-15
65} __attribute__((packed));
66
67// Command data for submitting an USB request.
68struct CmdReqSubmit {
69 uint32_t transfer_flags;
70 uint32_t transfer_buffer_length;
71 uint32_t start_frame;
72 uint32_t number_of_packets;
73 uint32_t deadline_interval;
74 CmdRequest setup;
75} __attribute__((packed));
76
77// Command response for submitting an USB request.
78struct CmdRepSubmit {
79 uint32_t status; // 0 = success.
80 uint32_t actual_length;
81 uint32_t start_frame;
82 uint32_t number_of_packets;
83 uint32_t error_count;
84 CmdRequest setup;
85} __attribute__((packed));
86
87// Unlink USB request.
88struct CmdReqUnlink {
89 uint32_t seq_num;
90 uint32_t reserved[6];
91} __attribute__((packed));
92
93// Unlink USB response.
94struct CmdRepUnlink {
95 uint32_t status;
96 uint32_t reserved[6];
97} __attribute__((packed));
98
99// Diagnostics.
100std::ostream& operator<<(std::ostream& out, const CmdHeader& header);
101std::ostream& operator<<(std::ostream& out, const CmdReqSubmit& data);
102std::ostream& operator<<(std::ostream& out, const CmdRepSubmit& data);
103std::ostream& operator<<(std::ostream& out, const CmdReqUnlink& data);
104std::ostream& operator<<(std::ostream& out, const CmdRepUnlink& data);
105
106} // namespace usbip
107} // namespace vadb