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 25namespace vadb { 26namespace usbip { 27 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 108