usb-redir: Let the usb-host know about our device filtering

libusbredirparser-0.3.4 adds 2 new packets which allows us to notify
the usb-host:
-about the usb device filter we have (if any), so that it knows not the even
 try to redirect certain devices
-when we reject a device based on filtering (in case it tries anyways)

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Hans de Goede 2012-02-26 16:14:45 +01:00 committed by Gerd Hoffmann
parent 5b3bd68244
commit 097a66ef5f
2 changed files with 21 additions and 1 deletions

2
configure vendored
View File

@ -2592,7 +2592,7 @@ fi
# check for usbredirparser for usb network redirection support # check for usbredirparser for usb network redirection support
if test "$usb_redir" != "no" ; then if test "$usb_redir" != "no" ; then
if $pkg_config --atleast-version=0.3.3 libusbredirparser >/dev/null 2>&1 ; then if $pkg_config --atleast-version=0.3.4 libusbredirparser >/dev/null 2>&1 ; then
usb_redir="yes" usb_redir="yes"
usb_redir_cflags=$($pkg_config --cflags libusbredirparser 2>/dev/null) usb_redir_cflags=$($pkg_config --cflags libusbredirparser 2>/dev/null)
usb_redir_libs=$($pkg_config --libs libusbredirparser 2>/dev/null) usb_redir_libs=$($pkg_config --libs libusbredirparser 2>/dev/null)

View File

@ -106,6 +106,7 @@ struct AsyncURB {
QTAILQ_ENTRY(AsyncURB)next; QTAILQ_ENTRY(AsyncURB)next;
}; };
static void usbredir_hello(void *priv, struct usb_redir_hello_header *h);
static void usbredir_device_connect(void *priv, static void usbredir_device_connect(void *priv,
struct usb_redir_device_connect_header *device_connect); struct usb_redir_device_connect_header *device_connect);
static void usbredir_device_disconnect(void *priv); static void usbredir_device_disconnect(void *priv);
@ -802,6 +803,7 @@ static void usbredir_open_close_bh(void *opaque)
dev->parser->log_func = usbredir_log; dev->parser->log_func = usbredir_log;
dev->parser->read_func = usbredir_read; dev->parser->read_func = usbredir_read;
dev->parser->write_func = usbredir_write; dev->parser->write_func = usbredir_write;
dev->parser->hello_func = usbredir_hello;
dev->parser->device_connect_func = usbredir_device_connect; dev->parser->device_connect_func = usbredir_device_connect;
dev->parser->device_disconnect_func = usbredir_device_disconnect; dev->parser->device_disconnect_func = usbredir_device_disconnect;
dev->parser->interface_info_func = usbredir_interface_info; dev->parser->interface_info_func = usbredir_interface_info;
@ -820,6 +822,7 @@ static void usbredir_open_close_bh(void *opaque)
dev->read_buf_size = 0; dev->read_buf_size = 0;
usbredirparser_caps_set_cap(caps, usb_redir_cap_connect_device_version); usbredirparser_caps_set_cap(caps, usb_redir_cap_connect_device_version);
usbredirparser_caps_set_cap(caps, usb_redir_cap_filter);
usbredirparser_init(dev->parser, VERSION, caps, USB_REDIR_CAPS_SIZE, 0); usbredirparser_init(dev->parser, VERSION, caps, USB_REDIR_CAPS_SIZE, 0);
usbredirparser_do_write(dev->parser); usbredirparser_do_write(dev->parser);
} }
@ -991,6 +994,10 @@ static int usbredir_check_filter(USBRedirDevice *dev)
error: error:
usbredir_device_disconnect(dev); usbredir_device_disconnect(dev);
if (usbredirparser_peer_has_cap(dev->parser, usb_redir_cap_filter)) {
usbredirparser_send_filter_reject(dev->parser);
usbredirparser_do_write(dev->parser);
}
return -1; return -1;
} }
@ -1016,6 +1023,19 @@ static int usbredir_handle_status(USBRedirDevice *dev,
} }
} }
static void usbredir_hello(void *priv, struct usb_redir_hello_header *h)
{
USBRedirDevice *dev = priv;
/* Try to send the filter info now that we've the usb-host's caps */
if (usbredirparser_peer_has_cap(dev->parser, usb_redir_cap_filter) &&
dev->filter_rules) {
usbredirparser_send_filter_filter(dev->parser, dev->filter_rules,
dev->filter_rules_count);
usbredirparser_do_write(dev->parser);
}
}
static void usbredir_device_connect(void *priv, static void usbredir_device_connect(void *priv,
struct usb_redir_device_connect_header *device_connect) struct usb_redir_device_connect_header *device_connect)
{ {