summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2011-02-17 16:52:30 +0100
committerHans de Goede <hdegoede@redhat.com>2011-02-17 16:52:30 +0100
commitf233c9dfed8e5b8c996c5bae02f6196e8262b651 (patch)
tree1137be31cb90c97bdd3172c65e00c4661cc30366
parentd9eeafb52555382de98324991ba7695d1c0420f9 (diff)
Diferentiate between all usb speeds, not just lo and the rest
-rw-r--r--usb-redirection-protocol.txt19
-rw-r--r--usbredirhost.c20
-rw-r--r--usbredirproto.h10
-rw-r--r--usbredirtestclient.c9
4 files changed, 44 insertions, 14 deletions
diff --git a/usb-redirection-protocol.txt b/usb-redirection-protocol.txt
index 5985d9d..71afeca 100644
--- a/usb-redirection-protocol.txt
+++ b/usb-redirection-protocol.txt
@@ -156,8 +156,16 @@ usb_redir_header.type: usb_redir_device_info
usb_redir_header.length: sizeof(usb_redir_device_info_header)
usb_redir_header.id: 0 (always as this is an unsolicited packet)
+enum {
+ usb_redir_speed_low,
+ usb_redir_speed_full,
+ usb_redir_speed_high,
+ usb_redir_speed_super,
+ usb_redir_speed_unknown = 255
+}
+
struct usb_redir_device_info_header {
- uint8_t slow; /* True if this is a low speed device */
+ uint8_t speed;
}
No packet type specific additional data.
@@ -173,6 +181,15 @@ usb_redir_header.type: usb_redir_ep_info
usb_redir_header.length: sizeof(usb_redir_ep_info_header)
usb_redir_header.id: 0 (always as this is an unsolicited packet)
+enum {
+ /* Note these 4 match the usb spec! */
+ usb_redir_type_control,
+ usb_redir_type_iso,
+ usb_redir_type_bulk,
+ usb_redir_type_interrupt,
+ usb_redir_type_invalid = 255
+}
+
struct usb_redir_ep_info_header {
uint8_t type[32];
uint8_t interval[32];
diff --git a/usbredirhost.c b/usbredirhost.c
index 8ca4b15..cc82ded 100644
--- a/usbredirhost.c
+++ b/usbredirhost.c
@@ -344,7 +344,7 @@ struct usbredirhost *usbredirhost_open(libusb_device_handle *usb_dev_handle,
{
struct usbredirhost *host;
struct usb_redir_device_info_header device_info;
- enum libusb_speed_type speed;
+ enum libusb_speed speed;
int r;
host = calloc(1, sizeof(*host));
@@ -404,16 +404,14 @@ struct usbredirhost *usbredirhost_open(libusb_device_handle *usb_dev_handle,
return NULL;
}
- r = libusb_get_device_speed(host->handle, &speed);
- if (r < 0) {
- ERROR("could not get device speed: %d", r);
- usbredirhost_close(host);
- return NULL;
- }
- if (speed == LIBUSB_SPEED_LOW) {
- device_info.slow = 1;
- } else {
- device_info.slow = 0;
+ speed = libusb_get_device_speed(host->dev);
+ switch (speed) {
+ case LIBUSB_SPEED_LOW: device_info.speed = usb_redir_speed_low; break;
+ case LIBUSB_SPEED_FULL: device_info.speed = usb_redir_speed_full; break;
+ case LIBUSB_SPEED_HIGH: device_info.speed = usb_redir_speed_high; break;
+ case LIBUSB_SPEED_SUPER: device_info.speed = usb_redir_speed_super; break;
+ default:
+ device_info.speed = usb_redir_speed_unknown;
}
usbredirparser_send_device_info(host->parser, &device_info);
diff --git a/usbredirproto.h b/usbredirproto.h
index 267472f..4196dff 100644
--- a/usbredirproto.h
+++ b/usbredirproto.h
@@ -43,6 +43,14 @@ enum {
};
enum {
+ usb_redir_speed_low,
+ usb_redir_speed_full,
+ usb_redir_speed_high,
+ usb_redir_speed_super,
+ usb_redir_speed_unknown = 255
+};
+
+enum {
/* Control packets */
usb_redir_hello,
usb_redir_device_info,
@@ -86,7 +94,7 @@ struct usb_redir_hello_header {
};
struct usb_redir_device_info_header {
- uint8_t slow; /* True if this is a low speed device */
+ uint8_t speed;
};
struct usb_redir_ep_info_header {
diff --git a/usbredirtestclient.c b/usbredirtestclient.c
index 6aec45b..7fc85fd 100644
--- a/usbredirtestclient.c
+++ b/usbredirtestclient.c
@@ -433,7 +433,14 @@ static void usbredirtestclient_cmdline_parse(void)
static void usbredirtestclient_device_info(void *priv,
struct usb_redir_device_info_header *device_info)
{
- printf("device info, speed: %s\n", device_info->slow ? "lo" : "full");
+ switch (device_info->speed) {
+ case usb_redir_speed_low: printf("device info: speed: low\n"); break;
+ case usb_redir_speed_full: printf("device info: speed: full\n"); break;
+ case usb_redir_speed_high: printf("device info: speed: high\n"); break;
+ case usb_redir_speed_super: printf("device info: speed: super\n"); break;
+ default:
+ printf("device info: speed: unknown\n");
+ }
}
static void usbredirtestclient_ep_info(void *priv,