ef3d343254
Previously, adb was assuming a fixed maximum packet size of 1024 bytes (the value for an endpoint connected via USB 3.0). When connected to an endpoint that has an actual maximum packet size of 512 bytes (i.e. every single device over USB 2.0), the following could occur: device sends amessage with 512 byte payload client reads amessage client tries to read payload with a length of 1024 In this scenario, the kernel will block, waiting for an additional packet which won't arrive until something else gets sent across the wire, which will result in the previous read failing, and the new packet being dropped. Bug: http://b/37783561 Test: python test_device.py on linux/darwin, with native/libusb Change-Id: I556f5344945e22dd1533b076f662a97eea24628e
62 lines
1.8 KiB
C++
62 lines
1.8 KiB
C++
/*
|
|
* Copyright (C) 2016 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 <sys/types.h>
|
|
|
|
// USB host/client interface.
|
|
|
|
#define ADB_USB_INTERFACE(handle_ref_type) \
|
|
void usb_init(); \
|
|
int usb_write(handle_ref_type h, const void* data, int len); \
|
|
int usb_read(handle_ref_type h, void* data, int len); \
|
|
int usb_close(handle_ref_type h); \
|
|
void usb_kick(handle_ref_type h); \
|
|
size_t usb_get_max_packet_size(handle_ref_type)
|
|
|
|
#if defined(_WIN32) || !ADB_HOST
|
|
// Windows and the daemon have a single implementation.
|
|
|
|
struct usb_handle;
|
|
ADB_USB_INTERFACE(usb_handle*);
|
|
|
|
#else // linux host || darwin
|
|
// Linux and Darwin clients have native and libusb implementations.
|
|
|
|
namespace libusb {
|
|
struct usb_handle;
|
|
ADB_USB_INTERFACE(libusb::usb_handle*);
|
|
}
|
|
|
|
namespace native {
|
|
struct usb_handle;
|
|
ADB_USB_INTERFACE(native::usb_handle*);
|
|
}
|
|
|
|
// Empty base that both implementations' opaque handles inherit from.
|
|
struct usb_handle {
|
|
};
|
|
|
|
ADB_USB_INTERFACE(::usb_handle*);
|
|
|
|
#endif // linux host || darwin
|
|
|
|
|
|
// USB device detection.
|
|
int is_adb_interface(int usb_class, int usb_subclass, int usb_protocol);
|
|
|
|
bool should_use_libusb();
|