• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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
25 namespace vadb {
26 namespace usbip {
27 
28 ////////////////////////////////////////////////////////////////////////////////
29 // COMMANDS
30 ////////////////////////////////////////////////////////////////////////////////
31 
32 // Command numbers. Commands are valid only once USB device is attached.
33 enum 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.
41 enum 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
49 struct 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.
58 struct 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.
68 struct 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.
78 struct 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.
88 struct CmdReqUnlink {
89   uint32_t seq_num;
90   uint32_t reserved[6];
91 } __attribute__((packed));
92 
93 // Unlink USB response.
94 struct CmdRepUnlink {
95   uint32_t status;
96   uint32_t reserved[6];
97 } __attribute__((packed));
98 
99 // Diagnostics.
100 std::ostream& operator<<(std::ostream& out, const CmdHeader& header);
101 std::ostream& operator<<(std::ostream& out, const CmdReqSubmit& data);
102 std::ostream& operator<<(std::ostream& out, const CmdRepSubmit& data);
103 std::ostream& operator<<(std::ostream& out, const CmdReqUnlink& data);
104 std::ostream& operator<<(std::ostream& out, const CmdRepUnlink& data);
105 
106 }  // namespace usbip
107 }  // namespace vadb
108