blob: 1e32278b0d534fdbdb11d0b24c1a56f0cee2839c [file] [log] [blame]
Garrick Evans3cbac7c2019-04-18 15:31:31 +09001// Copyright 2019 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Garrick Evans3388a032020-03-24 11:25:55 +09005#ifndef PATCHPANEL_ADB_PROXY_H_
6#define PATCHPANEL_ADB_PROXY_H_
Garrick Evans3cbac7c2019-04-18 15:31:31 +09007
8#include <deque>
9#include <memory>
10
Hidehiko Abede129222019-08-16 00:55:04 +090011#include <base/files/file_descriptor_watcher_posix.h>
Garrick Evans96e03042019-05-28 14:30:52 +090012#include <base/files/scoped_file.h>
Garrick Evans3cbac7c2019-04-18 15:31:31 +090013#include <base/memory/weak_ptr.h>
Jason Jeremy Iman378930a2020-12-11 05:40:08 +090014#include <brillo/daemons/dbus_daemon.h>
15#include <dbus/bus.h>
Garrick Evans3cbac7c2019-04-18 15:31:31 +090016
Garrick Evans3388a032020-03-24 11:25:55 +090017#include "patchpanel/message_dispatcher.h"
18#include "patchpanel/socket.h"
19#include "patchpanel/socket_forwarder.h"
Garrick Evans3cbac7c2019-04-18 15:31:31 +090020
Garrick Evans3388a032020-03-24 11:25:55 +090021namespace patchpanel {
Garrick Evans3cbac7c2019-04-18 15:31:31 +090022
Jason Jeremy Iman3081d0e2020-03-04 15:52:06 +090023// Running the proxy on port 5555 will cause ADBD to see it as an Android
24// emulator rather than an attached device. This means, whenever host ADBD
25// server runs a device named "emulator-5554" will show up.
26// Connections to ARC via ADB (including by Tast) should now be done by
27// starting ADB server (e.g. 'adb devices') instead of
28// 'adb connect 127.0.0.1:5555' to avoid seeing multiple devices.
29constexpr uint16_t kAdbProxyTcpListenPort = 5555;
Jason Jeremy Imanfa8b6d22020-02-20 03:44:21 +000030
Garrick Evans3cbac7c2019-04-18 15:31:31 +090031// Subprocess for proxying ADB traffic.
Jason Jeremy Iman378930a2020-12-11 05:40:08 +090032class AdbProxy : public brillo::DBusDaemon {
Garrick Evans3cbac7c2019-04-18 15:31:31 +090033 public:
Garrick Evans96e03042019-05-28 14:30:52 +090034 explicit AdbProxy(base::ScopedFD control_fd);
Qijiang Fan6bc59e12020-11-11 02:51:06 +090035 AdbProxy(const AdbProxy&) = delete;
36 AdbProxy& operator=(const AdbProxy&) = delete;
37
Garrick Evans3cbac7c2019-04-18 15:31:31 +090038 virtual ~AdbProxy();
39
40 protected:
Garrick Evans3cbac7c2019-04-18 15:31:31 +090041 int OnInit() override;
42
Garrick Evans96e03042019-05-28 14:30:52 +090043 void OnParentProcessExit();
44 void OnGuestMessage(const GuestMessage& msg);
Garrick Evans3cbac7c2019-04-18 15:31:31 +090045
Garrick Evans96e03042019-05-28 14:30:52 +090046 private:
Jason Jeremy Iman378930a2020-12-11 05:40:08 +090047 void InitialSetup();
Garrick Evansbdf1f982019-06-07 09:46:49 +090048 void Reset();
Hidehiko Abede129222019-08-16 00:55:04 +090049 void OnFileCanReadWithoutBlocking();
Garrick Evansbdf1f982019-06-07 09:46:49 +090050
Garrick Evans3cbac7c2019-04-18 15:31:31 +090051 // Attempts to establish a connection to ADB at well-known destinations.
52 std::unique_ptr<Socket> Connect() const;
53
Jason Jeremy Iman378930a2020-12-11 05:40:08 +090054 // Start listening for ADB connection. Only listen when ARC guest is started
55 // and either Chrome OS is in developer mode or ADB sideloading is turned on.
56 void Listen();
57
58 // Checks ADB sideloading status and set it to |adb_sideloading_enabled_|.
59 // This function will call itself again if ADB sideloading status is not
60 // known yet. If ADB sideloading status is enabled and guest is started,
61 // start listening for connections.
62 void CheckAdbSideloadingStatus(int num_try);
63
Garrick Evans96e03042019-05-28 14:30:52 +090064 MessageDispatcher msg_dispatcher_;
Garrick Evans3cbac7c2019-04-18 15:31:31 +090065 std::unique_ptr<Socket> src_;
66 std::deque<std::unique_ptr<SocketForwarder>> fwd_;
Hidehiko Abede129222019-08-16 00:55:04 +090067 std::unique_ptr<base::FileDescriptorWatcher::Controller> src_watcher_;
Garrick Evans3cbac7c2019-04-18 15:31:31 +090068
Garrick Evansbdf1f982019-06-07 09:46:49 +090069 GuestMessage::GuestType arc_type_;
Garrick Evans1cce71a2019-06-21 10:43:14 +090070 uint32_t arcvm_vsock_cid_;
Garrick Evansbdf1f982019-06-07 09:46:49 +090071
Jason Jeremy Iman378930a2020-12-11 05:40:08 +090072 bool dev_mode_enabled_;
73 bool adb_sideloading_enabled_;
74
Garrick Evans3cbac7c2019-04-18 15:31:31 +090075 base::WeakPtrFactory<AdbProxy> weak_factory_{this};
Garrick Evans3cbac7c2019-04-18 15:31:31 +090076};
77
Garrick Evans3388a032020-03-24 11:25:55 +090078} // namespace patchpanel
Garrick Evans3cbac7c2019-04-18 15:31:31 +090079
Garrick Evans3388a032020-03-24 11:25:55 +090080#endif // PATCHPANEL_ADB_PROXY_H_