Use libcuttlefish_utils' Proxy for ADB
Bug: 222749636
Test: locally
Change-Id: I55e87972474f6f0dd8bfe15b10e84c6d5f090f37
diff --git a/common/frontend/socket_vsock_proxy/Android.bp b/common/frontend/socket_vsock_proxy/Android.bp
index f04251b..427d9c2 100644
--- a/common/frontend/socket_vsock_proxy/Android.bp
+++ b/common/frontend/socket_vsock_proxy/Android.bp
@@ -33,6 +33,7 @@
],
static_libs: [
"libgflags",
+ "libcuttlefish_utils",
],
target: {
host: {
diff --git a/common/frontend/socket_vsock_proxy/main.cpp b/common/frontend/socket_vsock_proxy/main.cpp
index cf68821..5d08790 100644
--- a/common/frontend/socket_vsock_proxy/main.cpp
+++ b/common/frontend/socket_vsock_proxy/main.cpp
@@ -15,19 +15,17 @@
*/
#include <set>
-#include <thread>
#include <android-base/logging.h>
#include <gflags/gflags.h>
#include "common/libs/fs/shared_fd.h"
+#include "common/libs/utils/socket2socket_proxy.h"
#include "host/commands/kernel_log_monitor/utils.h"
#ifdef CUTTLEFISH_HOST
#include "host/libs/config/logging.h"
#endif // CUTTLEFISH_HOST
-constexpr std::size_t kMaxPacketSize = 8192;
-
DEFINE_string(server, "",
"The type of server to host, `vsock` or `tcp`. When hosting a server "
"of one type, the proxy will take inbound connections of this type and "
@@ -46,109 +44,6 @@
"server and the corresponding port flag will be ignored");
namespace {
-// Sends packets, Shutdown(SHUT_WR) on destruction
-class SocketSender {
- public:
- explicit SocketSender(cuttlefish::SharedFD socket) : socket_{socket} {}
-
- SocketSender(SocketSender&&) = default;
- SocketSender& operator=(SocketSender&&) = default;
-
- SocketSender(const SocketSender&&) = delete;
- SocketSender& operator=(const SocketSender&) = delete;
-
- ~SocketSender() {
- if (socket_.operator->()) { // check that socket_ was not moved-from
- socket_->Shutdown(SHUT_WR);
- }
- }
-
- ssize_t SendAll(const char* packet, ssize_t length) {
- ssize_t written{};
- while (written < length) {
- if (!socket_->IsOpen()) {
- return -1;
- }
- auto just_written =
- socket_->Send(packet + written,
- length - written, MSG_NOSIGNAL);
- if (just_written <= 0) {
- LOG(WARNING) << "Couldn't write to client: "
- << strerror(socket_->GetErrno());
- return just_written;
- }
- written += just_written;
- }
- return written;
- }
-
- private:
- cuttlefish::SharedFD socket_;
-};
-
-class SocketReceiver {
- public:
- explicit SocketReceiver(cuttlefish::SharedFD socket) : socket_{socket} {}
-
- SocketReceiver(SocketReceiver&&) = default;
- SocketReceiver& operator=(SocketReceiver&&) = default;
-
- SocketReceiver(const SocketReceiver&&) = delete;
- SocketReceiver& operator=(const SocketReceiver&) = delete;
-
- // return value will be 0 if Read returns 0 or error
- ssize_t Recv(char* packet, ssize_t length) {
- auto size = socket_->Read(packet, length);
- if (size < 0) {
- size = 0;
- }
-
- return size;
- }
-
- private:
- cuttlefish::SharedFD socket_;
-};
-
-void SocketToVsock(SocketReceiver socket_receiver,
- SocketSender vsock_sender) {
- char packet[kMaxPacketSize] = {};
-
- while (true) {
- ssize_t length = socket_receiver.Recv(packet, kMaxPacketSize);
- if (length == 0 || vsock_sender.SendAll(packet, length) < 0) {
- break;
- }
- }
- LOG(DEBUG) << "Socket to vsock exiting";
-}
-
-void VsockToSocket(SocketSender socket_sender,
- SocketReceiver vsock_receiver) {
- char packet[kMaxPacketSize] = {};
-
- while (true) {
- ssize_t length = vsock_receiver.Recv(packet, kMaxPacketSize);
- if (length == 0) {
- break;
- }
- if (socket_sender.SendAll(packet, length) < 0) {
- break;
- }
- }
- LOG(DEBUG) << "Vsock to socket exiting";
-}
-
-// One thread for reading from shm and writing into a socket.
-// One thread for reading from a socket and writing into shm.
-void HandleConnection(cuttlefish::SharedFD vsock,
- cuttlefish::SharedFD socket) {
- auto socket_to_vsock =
- std::thread(SocketToVsock, SocketReceiver{socket}, SocketSender{vsock});
- VsockToSocket(SocketSender{socket}, SocketReceiver{vsock});
- socket_to_vsock.join();
-}
-
void WaitForAdbdToBeStarted(int events_fd) {
auto evt_shared_fd = cuttlefish::SharedFD::Dup(events_fd);
close(events_fd);
@@ -170,7 +65,7 @@
}
// intented to run as cuttlefish host service
-[[noreturn]] void TcpServer() {
+void TcpServer() {
LOG(DEBUG) << "starting TCP server on " << FLAGS_tcp_port
<< " for vsock port " << FLAGS_vsock_port;
cuttlefish::SharedFD server;
@@ -184,10 +79,8 @@
CHECK(server->IsOpen()) << "Could not start server on " << FLAGS_tcp_port;
LOG(DEBUG) << "Accepting client connections";
int last_failure_reason = 0;
- while (true) {
- auto client_socket = cuttlefish::SharedFD::Accept(*server);
- CHECK(client_socket->IsOpen()) << "error creating client socket";
- cuttlefish::SharedFD vsock_socket = cuttlefish::SharedFD::VsockClient(
+ cuttlefish::Proxy(server, [&last_failure_reason]() {
+ auto vsock_socket = cuttlefish::SharedFD::VsockClient(
FLAGS_vsock_cid, FLAGS_vsock_port, SOCK_STREAM);
if (vsock_socket->IsOpen()) {
last_failure_reason = 0;
@@ -200,12 +93,9 @@
LOG(ERROR) << "Unable to connect to vsock server: "
<< vsock_socket->StrError();
}
- continue;
}
- auto thread = std::thread(HandleConnection, std::move(vsock_socket),
- std::move(client_socket));
- thread.detach();
- }
+ return vsock_socket;
+ });
}
cuttlefish::SharedFD OpenSocketConnection() {
@@ -232,7 +122,7 @@
}
// intended to run inside Android guest
-[[noreturn]] void VsockServer() {
+void VsockServer() {
LOG(DEBUG) << "Starting vsock server on " << FLAGS_vsock_port;
cuttlefish::SharedFD vsock;
if (FLAGS_server_fd < 0) {
@@ -248,17 +138,12 @@
close(FLAGS_server_fd);
}
CHECK(vsock->IsOpen()) << "Could not start server on " << FLAGS_vsock_port;
- while (true) {
- LOG(DEBUG) << "waiting for vsock connection";
- auto vsock_client = cuttlefish::SharedFD::Accept(*vsock);
- CHECK(vsock_client->IsOpen()) << "error creating vsock socket";
+ cuttlefish::Proxy(vsock, []() {
LOG(DEBUG) << "vsock socket accepted";
auto client = OpenSocketConnection();
CHECK(client->IsOpen()) << "error connecting to guest client";
- auto thread = std::thread(HandleConnection, std::move(vsock_client),
- std::move(client));
- thread.detach();
- }
+ return client;
+ });
}
} // namespace