Blame usbredirparser/usbredirproto.h

Packit 9795e1
/* usbredirproto.h usb redirection protocol definitions
Packit 9795e1
Packit 9795e1
   Copyright 2010-2011 Red Hat, Inc.
Packit 9795e1
Packit 9795e1
   Red Hat Authors:
Packit 9795e1
   Hans de Goede <hdegoede@redhat.com>
Packit 9795e1
Packit 9795e1
   This library is free software; you can redistribute it and/or
Packit 9795e1
   modify it under the terms of the GNU Lesser General Public
Packit 9795e1
   License as published by the Free Software Foundation; either
Packit 9795e1
   version 2.1 of the License, or (at your option) any later version.
Packit 9795e1
Packit 9795e1
   This library is distributed in the hope that it will be useful,
Packit 9795e1
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 9795e1
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 9795e1
   Lesser General Public License for more details.
Packit 9795e1
Packit 9795e1
   You should have received a copy of the GNU Lesser General Public
Packit 9795e1
   License along with this library; if not, see <http://www.gnu.org/licenses/>.
Packit 9795e1
*/
Packit 9795e1
#ifndef __USBREDIRPROTO_H
Packit 9795e1
#define __USBREDIRPROTO_H
Packit 9795e1
Packit 9795e1
/* PACK macros borrowed from spice-protocol */
Packit 9795e1
#ifdef __GNUC__
Packit 9795e1
Packit 9795e1
#define ATTR_PACKED __attribute__ ((__packed__))
Packit 9795e1
Packit 9795e1
#ifdef __MINGW32__
Packit 9795e1
#pragma pack(push,1)
Packit 9795e1
#endif
Packit 9795e1
Packit 9795e1
#else
Packit 9795e1
Packit 9795e1
#pragma pack(push)
Packit 9795e1
#pragma pack(1)
Packit 9795e1
#define ATTR_PACKED
Packit 9795e1
#pragma warning(disable:4200)
Packit 9795e1
#pragma warning(disable:4103)
Packit 9795e1
Packit 9795e1
#endif
Packit 9795e1
Packit 9795e1
#include <stdint.h>
Packit 9795e1
Packit 9795e1
#ifdef __cplusplus
Packit 9795e1
extern "C" {
Packit 9795e1
#endif
Packit 9795e1
Packit 9795e1
#define USBREDIR_VERSION 0x000701 /* 0.7 [.0] */
Packit 9795e1
Packit 9795e1
enum {
Packit 9795e1
    usb_redir_success,
Packit 9795e1
    usb_redir_cancelled,    /* The transfer was cancelled */
Packit 9795e1
    usb_redir_inval,        /* Invalid packet type / length / ep, etc. */
Packit 9795e1
    usb_redir_ioerror,      /* IO error */
Packit 9795e1
    usb_redir_stall,        /* Stalled */
Packit 9795e1
    usb_redir_timeout,      /* Request timed out */
Packit 9795e1
    usb_redir_babble,       /* The device has "babbled" (since 0.4.2) */
Packit 9795e1
};
Packit 9795e1
Packit 9795e1
enum {
Packit 9795e1
    /* Note these 4 match the usb spec! */
Packit 9795e1
    usb_redir_type_control,
Packit 9795e1
    usb_redir_type_iso,
Packit 9795e1
    usb_redir_type_bulk,
Packit 9795e1
    usb_redir_type_interrupt,
Packit 9795e1
    usb_redir_type_invalid = 255
Packit 9795e1
};
Packit 9795e1
Packit 9795e1
enum {
Packit 9795e1
    usb_redir_speed_low,
Packit 9795e1
    usb_redir_speed_full,
Packit 9795e1
    usb_redir_speed_high,
Packit 9795e1
    usb_redir_speed_super,
Packit 9795e1
    usb_redir_speed_unknown = 255
Packit 9795e1
};
Packit 9795e1
Packit 9795e1
enum {
Packit 9795e1
    /* Control packets */
Packit 9795e1
    usb_redir_hello,
Packit 9795e1
    usb_redir_device_connect,
Packit 9795e1
    usb_redir_device_disconnect,
Packit 9795e1
    usb_redir_reset,
Packit 9795e1
    usb_redir_interface_info,
Packit 9795e1
    usb_redir_ep_info,
Packit 9795e1
    usb_redir_set_configuration,
Packit 9795e1
    usb_redir_get_configuration,
Packit 9795e1
    usb_redir_configuration_status,
Packit 9795e1
    usb_redir_set_alt_setting,
Packit 9795e1
    usb_redir_get_alt_setting,
Packit 9795e1
    usb_redir_alt_setting_status,
Packit 9795e1
    usb_redir_start_iso_stream,
Packit 9795e1
    usb_redir_stop_iso_stream,
Packit 9795e1
    usb_redir_iso_stream_status,
Packit 9795e1
    usb_redir_start_interrupt_receiving,
Packit 9795e1
    usb_redir_stop_interrupt_receiving,
Packit 9795e1
    usb_redir_interrupt_receiving_status,
Packit 9795e1
    usb_redir_alloc_bulk_streams,
Packit 9795e1
    usb_redir_free_bulk_streams,
Packit 9795e1
    usb_redir_bulk_streams_status,
Packit 9795e1
    usb_redir_cancel_data_packet,
Packit 9795e1
    usb_redir_filter_reject,
Packit 9795e1
    usb_redir_filter_filter,
Packit 9795e1
    usb_redir_device_disconnect_ack,
Packit 9795e1
    usb_redir_start_bulk_receiving,
Packit 9795e1
    usb_redir_stop_bulk_receiving,
Packit 9795e1
    usb_redir_bulk_receiving_status,
Packit 9795e1
Packit 9795e1
    /* Data packets */
Packit 9795e1
    usb_redir_control_packet = 100,
Packit 9795e1
    usb_redir_bulk_packet,
Packit 9795e1
    usb_redir_iso_packet,
Packit 9795e1
    usb_redir_interrupt_packet,
Packit 9795e1
    usb_redir_buffered_bulk_packet,
Packit 9795e1
};
Packit 9795e1
Packit 9795e1
enum {
Packit 9795e1
    /* Supports USB 3 bulk streams */
Packit 9795e1
    usb_redir_cap_bulk_streams,
Packit 9795e1
    /* The device_connect packet has the device_version_bcd field */
Packit 9795e1
    usb_redir_cap_connect_device_version,
Packit 9795e1
    /* Supports usb_redir_filter_reject and usb_redir_filter_filter pkts */
Packit 9795e1
    usb_redir_cap_filter,
Packit 9795e1
    /* Supports the usb_redir_device_disconnect_ack packet */
Packit 9795e1
    usb_redir_cap_device_disconnect_ack,
Packit 9795e1
    /* The ep_info packet has the max_packet_size field */
Packit 9795e1
    usb_redir_cap_ep_info_max_packet_size,
Packit 9795e1
    /* Supports 64 bits ids in usb_redir_header */
Packit 9795e1
    usb_redir_cap_64bits_ids,
Packit 9795e1
    /* Supports 32 bits length in usb_redir_bulk_packet_header */
Packit 9795e1
    usb_redir_cap_32bits_bulk_length,
Packit 9795e1
    /* Supports bulk receiving / buffered bulk input */
Packit 9795e1
    usb_redir_cap_bulk_receiving,
Packit 9795e1
};
Packit 9795e1
/* Number of uint32_t-s needed to hold all (known) capabilities */
Packit 9795e1
#define USB_REDIR_CAPS_SIZE 1
Packit 9795e1
Packit 9795e1
struct usb_redir_header {
Packit 9795e1
    uint32_t type;
Packit 9795e1
    uint32_t length;
Packit 9795e1
    uint64_t id;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_hello_header {
Packit 9795e1
    char     version[64];
Packit 9795e1
    uint32_t capabilities[0];
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_device_connect_header {
Packit 9795e1
    uint8_t speed;
Packit 9795e1
    uint8_t device_class;
Packit 9795e1
    uint8_t device_subclass;
Packit 9795e1
    uint8_t device_protocol;
Packit 9795e1
    uint16_t vendor_id;
Packit 9795e1
    uint16_t product_id;
Packit 9795e1
    uint16_t device_version_bcd;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_interface_info_header {
Packit 9795e1
    uint32_t interface_count;
Packit 9795e1
    uint8_t interface[32];
Packit 9795e1
    uint8_t interface_class[32];
Packit 9795e1
    uint8_t interface_subclass[32];
Packit 9795e1
    uint8_t interface_protocol[32];
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_ep_info_header {
Packit 9795e1
    uint8_t type[32];
Packit 9795e1
    uint8_t interval[32];
Packit 9795e1
    uint8_t interface[32];
Packit 9795e1
    uint16_t max_packet_size[32];
Packit 9795e1
    uint32_t max_streams[32];
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_set_configuration_header {
Packit 9795e1
    uint8_t configuration;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_configuration_status_header {
Packit 9795e1
    uint8_t status;
Packit 9795e1
    uint8_t configuration;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_set_alt_setting_header {
Packit 9795e1
    uint8_t interface;
Packit 9795e1
    uint8_t alt;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_get_alt_setting_header {
Packit 9795e1
    uint8_t interface;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_alt_setting_status_header {
Packit 9795e1
    uint8_t status;
Packit 9795e1
    uint8_t interface;
Packit 9795e1
    uint8_t alt;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_start_iso_stream_header {
Packit 9795e1
    uint8_t endpoint;
Packit 9795e1
    uint8_t pkts_per_urb;
Packit 9795e1
    uint8_t no_urbs;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_stop_iso_stream_header {
Packit 9795e1
    uint8_t endpoint;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_iso_stream_status_header {
Packit 9795e1
    uint8_t status;
Packit 9795e1
    uint8_t endpoint;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_start_interrupt_receiving_header {
Packit 9795e1
    uint8_t endpoint;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_stop_interrupt_receiving_header {
Packit 9795e1
    uint8_t endpoint;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_interrupt_receiving_status_header {
Packit 9795e1
    uint8_t status;
Packit 9795e1
    uint8_t endpoint;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_alloc_bulk_streams_header {
Packit 9795e1
    uint32_t endpoints; /* bitmask indicating on which eps to alloc streams */
Packit 9795e1
    uint32_t no_streams;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_free_bulk_streams_header {
Packit 9795e1
    uint32_t endpoints; /* bitmask indicating on which eps to free streams */
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_bulk_streams_status_header {
Packit 9795e1
    uint32_t endpoints; /* bitmask indicating eps this status message is for */
Packit 9795e1
    uint32_t no_streams;
Packit 9795e1
    uint8_t status;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_start_bulk_receiving_header {
Packit 9795e1
    uint32_t stream_id;
Packit 9795e1
    uint32_t bytes_per_transfer;
Packit 9795e1
    uint8_t endpoint;
Packit 9795e1
    uint8_t no_transfers;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_stop_bulk_receiving_header {
Packit 9795e1
    uint32_t stream_id;
Packit 9795e1
    uint8_t endpoint;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_bulk_receiving_status_header {
Packit 9795e1
    uint32_t stream_id;
Packit 9795e1
    uint8_t endpoint;
Packit 9795e1
    uint8_t status;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_control_packet_header {
Packit 9795e1
    uint8_t endpoint;
Packit 9795e1
    uint8_t request;
Packit 9795e1
    uint8_t requesttype;
Packit 9795e1
    uint8_t status;
Packit 9795e1
    uint16_t value;
Packit 9795e1
    uint16_t index;
Packit 9795e1
    uint16_t length;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_bulk_packet_header {
Packit 9795e1
    uint8_t endpoint;
Packit 9795e1
    uint8_t status;
Packit 9795e1
    uint16_t length;
Packit 9795e1
    uint32_t stream_id;
Packit 9795e1
    uint16_t length_high; /* High 16 bits of the packet length */
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_iso_packet_header {
Packit 9795e1
    uint8_t endpoint;
Packit 9795e1
    uint8_t status;
Packit 9795e1
    uint16_t length;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_interrupt_packet_header {
Packit 9795e1
    uint8_t endpoint;
Packit 9795e1
    uint8_t status;
Packit 9795e1
    uint16_t length;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
struct usb_redir_buffered_bulk_packet_header {
Packit 9795e1
    uint32_t stream_id;
Packit 9795e1
    uint32_t length;
Packit 9795e1
    uint8_t endpoint;
Packit 9795e1
    uint8_t status;
Packit 9795e1
} ATTR_PACKED;
Packit 9795e1
Packit 9795e1
#undef ATTR_PACKED
Packit 9795e1
Packit 9795e1
#if defined(__MINGW32__) || !defined(__GNUC__)
Packit 9795e1
#pragma pack(pop)
Packit 9795e1
#endif
Packit 9795e1
Packit 9795e1
#ifdef __cplusplus
Packit 9795e1
}
Packit 9795e1
#endif
Packit 9795e1
Packit 9795e1
#endif