Home | History | Annotate | Download | only in usbip
      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