blob: 953422fe0291753a414c5a80137c06fe80c004e1 [file] [log] [blame]
/*
* Copyright 2020 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef ARC_ADBD_ARCVM_SOCK_TO_USB_H_
#define ARC_ADBD_ARCVM_SOCK_TO_USB_H_
#include <base/threading/thread.h>
namespace adbd {
// Reference:
// https://android.googlesource.com/platform/system/core/+/HEAD/adb/adb.h
// We take the bigger value of macro MAX_PAYLOAD from AOSP ADB code for the size
// of the buffer to USB.
constexpr size_t kAdbPayloadMaxSize = 1024 * 1024;
// Reference:
// https://android.googlesource.com/platform/system/core/+/HEAD/adb/types.h
// The offset is derived from the data_length field in struct amessage in
// types.h.
constexpr uint8_t kAmessageDataLenOffset = 12;
// Also from the types.h, the total length of an amessage instance is:
constexpr uint8_t kAmessageSize = 24;
// Size of the buffer to write to USB (IN) endpoint.
constexpr size_t kUsbWriteBufSize =
kAdbPayloadMaxSize > kAmessageSize ? kAdbPayloadMaxSize : kAmessageSize;
// Provides a unidirectional channel to transfer
// ADB data from a socket to a USB endpoint.
class ArcVmSockToUsb {
public:
ArcVmSockToUsb(const int sock_fd, const int usb_fd);
// Disallows copy and assignment.
ArcVmSockToUsb(const ArcVmSockToUsb&) = delete;
ArcVmSockToUsb& operator=(const ArcVmSockToUsb&) = delete;
~ArcVmSockToUsb();
// Kicks off the channel.
bool Start();
private:
void Run();
const int sock_fd_;
const int usb_fd_;
base::Thread thread_;
};
} // namespace adbd
#endif // ARC_ADBD_ARCVM_SOCK_TO_USB_H_