diff --git a/adb/daemon/usb.cpp b/adb/daemon/usb.cpp index 5631dd898..707203ae6 100644 --- a/adb/daemon/usb.cpp +++ b/adb/daemon/usb.cpp @@ -370,6 +370,33 @@ struct UsbFfsConnection : public Connection { bound = false; running = false; break; + + case FUNCTIONFS_SETUP: { + LOG(INFO) << "received FUNCTIONFS_SETUP control transfer: bRequestType = " + << static_cast(event.u.setup.bRequestType) + << ", bRequest = " << static_cast(event.u.setup.bRequest) + << ", wValue = " << static_cast(event.u.setup.wValue) + << ", wIndex = " << static_cast(event.u.setup.wIndex) + << ", wLength = " << static_cast(event.u.setup.wLength); + + if ((event.u.setup.bRequestType & USB_DIR_IN)) { + LOG(WARNING) << "received a device-to-host control transfer, ignoring"; + } else { + std::string buf; + buf.resize(event.u.setup.wLength + 1); + + ssize_t rc = adb_read(control_fd_.get(), buf.data(), buf.size()); + if (rc != event.u.setup.wLength) { + LOG(ERROR) + << "read " << rc + << " bytes when trying to read control request, expected " + << event.u.setup.wLength; + } + + LOG(INFO) << "control request contents: " << buf; + break; + } + } } }