[usbredir] Use the new libusb autodetach kernel driver functionality
Hans de Goede
jwrdegoede at fedoraproject.org
Tue Sep 10 09:04:51 UTC 2013
commit 750c3bc2453664599c1d5f791ef4e2d45b5e75c4
Author: Hans de Goede <hdegoede at redhat.com>
Date: Tue Sep 10 11:04:40 2013 +0200
Use the new libusb autodetach kernel driver functionality
- Fix a usbredirparser bug which causes tcp/ip redir to not work (rhbz#1005015)
...t-Use-libusb_set_auto_detach_kernel_drive.patch | 57 ++++++++++++++++++++
...ser-Update-header-len-inside-the-usbredir.patch | 33 +++++++++++
usbredir.spec | 10 +++-
3 files changed, 99 insertions(+), 1 deletions(-)
---
diff --git a/0004-usbredirhost-Use-libusb_set_auto_detach_kernel_drive.patch b/0004-usbredirhost-Use-libusb_set_auto_detach_kernel_drive.patch
new file mode 100644
index 0000000..01b4242
--- /dev/null
+++ b/0004-usbredirhost-Use-libusb_set_auto_detach_kernel_drive.patch
@@ -0,0 +1,57 @@
+From 050f32a35898c8ac8ac47322f21f0ec4928aa065 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Fri, 14 Jun 2013 09:56:20 +0200
+Subject: [PATCH 4/8] usbredirhost: Use libusb_set_auto_detach_kernel_driver
+ when available
+
+Signed-off-by: Hans de Goede <hdegoede at redhat.com>
+---
+ usbredirhost/usbredirhost.c | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+diff --git a/usbredirhost/usbredirhost.c b/usbredirhost/usbredirhost.c
+index 09745c2..0335b37 100644
+--- a/usbredirhost/usbredirhost.c
++++ b/usbredirhost/usbredirhost.c
+@@ -499,9 +499,13 @@ static int usbredirhost_claim(struct usbredirhost *host, int initial_claim)
+ memset(host->alt_setting, 0, MAX_INTERFACES);
+
+ host->claimed = 1;
++#if LIBUSBX_API_VERSION >= 0x01000102
++ libusb_set_auto_detach_kernel_driver(host->handle, 1);
++#endif
+ for (i = 0; host->config && i < host->config->bNumInterfaces; i++) {
+ n = host->config->interface[i].altsetting[0].bInterfaceNumber;
+
++#if LIBUSBX_API_VERSION < 0x01000102
+ r = libusb_detach_kernel_driver(host->handle, n);
+ if (r < 0 && r != LIBUSB_ERROR_NOT_FOUND
+ && r != LIBUSB_ERROR_NOT_SUPPORTED) {
+@@ -509,6 +513,7 @@ static int usbredirhost_claim(struct usbredirhost *host, int initial_claim)
+ n, host->config->bConfigurationValue, libusb_error_name(r));
+ return libusb_status_or_error_to_redir_status(host, r);
+ }
++#endif
+
+ r = libusb_claim_interface(host->handle, n);
+ if (r < 0) {
+@@ -534,6 +539,16 @@ static void usbredirhost_release(struct usbredirhost *host, int attach_drivers)
+ if (!host->claimed)
+ return;
+
++#if LIBUSBX_API_VERSION >= 0x01000102
++ /* We want to always do the attach ourselves because:
++ 1) For compound interfaces such as usb-audio we must first release all
++ interfaces before we can attach the driver;
++ 2) When releasing interfaces before calling libusb_set_configuration,
++ we don't want the kernel driver to get attached (our attach_drivers
++ parameter is 0 in this case). */
++ libusb_set_auto_detach_kernel_driver(host->handle, 0);
++#endif
++
+ for (i = 0; host->config && i < host->config->bNumInterfaces; i++) {
+ n = host->config->interface[i].altsetting[0].bInterfaceNumber;
+
+--
+1.8.3.1
+
diff --git a/0005-usbredirparser-Update-header-len-inside-the-usbredir.patch b/0005-usbredirparser-Update-header-len-inside-the-usbredir.patch
new file mode 100644
index 0000000..1081ccf
--- /dev/null
+++ b/0005-usbredirparser-Update-header-len-inside-the-usbredir.patch
@@ -0,0 +1,33 @@
+From 931a41c1c92410639a0e76e6fdd07482f06e4578 Mon Sep 17 00:00:00 2001
+From: Hans de Goede <hdegoede at redhat.com>
+Date: Thu, 5 Sep 2013 16:25:13 +0200
+Subject: [PATCH 5/5] usbredirparser: Update header-len inside the
+ usbredirparser_do_read loop
+
+If we process the hello packet with the 64 bit id capability bit in the same
+loop as other packets (because they were send quickly after one each other),
+then we end up reading 48 bytes for the header of the next packets processed
+in the same loop, while we should read 64 bytes for them, causing the
+sender and receiver to get out of sync.
+
+Signed-off-by: Hans de Goede <hdegoede at redhat.com>
+---
+ usbredirparser/usbredirparser.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/usbredirparser/usbredirparser.c b/usbredirparser/usbredirparser.c
+index b60d3f4..b50ddec 100644
+--- a/usbredirparser/usbredirparser.c
++++ b/usbredirparser/usbredirparser.c
+@@ -1011,6 +1011,8 @@ int usbredirparser_do_read(struct usbredirparser *parser_pub)
+ parser->data = NULL;
+ if (!r)
+ return -2;
++ /* header len may change if this was an hello packet */
++ header_len = usbredirparser_get_header_len(parser_pub);
+ }
+ }
+ }
+--
+1.8.3.1
+
diff --git a/usbredir.spec b/usbredir.spec
index 40cf9c4..f0936ff 100644
--- a/usbredir.spec
+++ b/usbredir.spec
@@ -1,6 +1,6 @@
Name: usbredir
Version: 0.6
-Release: 4%{?dist}
+Release: 5%{?dist}
Summary: USB network redirection protocol libraries
Group: System Environment/Libraries
License: LGPLv2+
@@ -10,6 +10,8 @@ Source0: http://spice-space.org/download/%{name}/%{name}-%{version}.tar.b
Patch1: 0001-usbredirserver-Allow-connections-from-both-ipv6-and-.patch
Patch2: 0002-usbredirserver-testclient-Error-check-fcntl-calls.patch
Patch3: 0003-usbredirhost-Fix-coverity-sign_extension-warning.patch
+Patch4: 0004-usbredirhost-Use-libusb_set_auto_detach_kernel_drive.patch
+Patch5: 0005-usbredirparser-Update-header-len-inside-the-usbredir.patch
BuildRequires: libusb1-devel >= 1.0.9
%description
@@ -52,6 +54,8 @@ A simple USB host TCP server, using libusbredirhost.
%patch1 -p1
%patch2 -p1
%patch3 -p1
+%patch4 -p1
+%patch5 -p1
%build
@@ -85,6 +89,10 @@ rm $RPM_BUILD_ROOT%{_libdir}/libusbredir*.la
%changelog
+* Tue Sep 10 2013 Hans de Goede <hdegoede at redhat.com> - 0.6-5
+- Use the new libusb autodetach kernel driver functionality
+- Fix a usbredirparser bug which causes tcp/ip redir to not work (rhbz#1005015)
+
* Sun Aug 04 2013 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 0.6-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
More information about the scm-commits
mailing list