blob: 8594465f7320b978d742c18248b50482a68e6c4d [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <glog/logging.h>
#include <stdint.h>
#include "common/libs/fs/shared_fd.h"
// Requests and constants below are defined in kernel documentation file:
// https://www.kernel.org/doc/Documentation/usb/usbip_protocol.txt
namespace vadb {
namespace usbip {
////////////////////////////////////////////////////////////////////////////////
// COMMANDS
////////////////////////////////////////////////////////////////////////////////
// Command numbers. Commands are valid only once USB device is attached.
enum Command : uint32_t {
kUsbIpCmdReqSubmit = 1, // Submit request
kUsbIpCmdReqUnlink = 2, // Unlink request
kUsbIpCmdRepSubmit = 3, // Submit response
kUsbIpCmdRepUnlink = 4, // Unlink response
};
// Direction of data flow.
enum Direction : uint32_t {
kUsbIpDirectionOut = 0,
kUsbIpDirectionIn = 1,
};
// Setup structure is explained in great detail here:
// - http://www.beyondlogic.org/usbnutshell/usb6.shtml
// - http://www.usbmadesimple.co.uk/ums_4.htm
struct CmdRequest {
uint8_t type;
uint8_t cmd;
uint16_t value;
uint16_t index;
uint16_t length;
} __attribute__((packed));
// CmdHeader precedes any command request or response body.
struct CmdHeader {
Command command;
uint32_t seq_num;
uint16_t bus_num;
uint16_t dev_num;
Direction direction;
uint32_t endpoint; // valid values: 0-15
} __attribute__((packed));
// Command data for submitting an USB request.
struct CmdReqSubmit {
uint32_t transfer_flags;
uint32_t transfer_buffer_length;
uint32_t start_frame;
uint32_t number_of_packets;
uint32_t deadline_interval;
CmdRequest setup;
} __attribute__((packed));
// Command response for submitting an USB request.
struct CmdRepSubmit {
uint32_t status; // 0 = success.
uint32_t actual_length;
uint32_t start_frame;
uint32_t number_of_packets;
uint32_t error_count;
CmdRequest setup;
} __attribute__((packed));
// Unlink USB request.
struct CmdReqUnlink {
uint32_t seq_num;
uint32_t reserved[6];
} __attribute__((packed));
// Unlink USB response.
struct CmdRepUnlink {
uint32_t status;
uint32_t reserved[6];
} __attribute__((packed));
// Diagnostics.
std::ostream& operator<<(std::ostream& out, const CmdHeader& header);
std::ostream& operator<<(std::ostream& out, const CmdReqSubmit& data);
std::ostream& operator<<(std::ostream& out, const CmdRepSubmit& data);
std::ostream& operator<<(std::ostream& out, const CmdReqUnlink& data);
std::ostream& operator<<(std::ostream& out, const CmdRepUnlink& data);
} // namespace usbip
} // namespace vadb