Revert "RpcServer: let system allocate vsock ports"
This reverts commit 022db680633b483ec5fab4f6b0722981482b3a02.
Reason for revert: not in Android 15 release, will be reverted in testing branch only, since it is causing testing issues.
Bug: 381486922
Bug: 380785879
Bug: 380934736
Change-Id: I9a1f0d9b18fc01898b61e338300fad3b4bdbe1a6
Merged-In: I2eec99a8e8f894546e025455cc0c5eb58962395f
diff --git a/libs/binder/RpcServer.cpp b/libs/binder/RpcServer.cpp
index b8742af..d9e926a 100644
--- a/libs/binder/RpcServer.cpp
+++ b/libs/binder/RpcServer.cpp
@@ -71,23 +71,8 @@
return setupSocketServer(UnixSocketAddress(path));
}
-status_t RpcServer::setupVsockServer(unsigned bindCid, unsigned port, unsigned* assignedPort) {
- auto status = setupSocketServer(VsockSocketAddress(bindCid, port));
- if (status != OK) return status;
-
- if (assignedPort == nullptr) return OK;
- sockaddr_vm addr;
- socklen_t len = sizeof(addr);
- if (0 != getsockname(mServer.fd.get(), reinterpret_cast<sockaddr*>(&addr), &len)) {
- status = -errno;
- ALOGE("setupVsockServer: Failed to getsockname: %s", strerror(-status));
- return status;
- }
-
- LOG_ALWAYS_FATAL_IF(len != sizeof(addr), "Wrong socket type: len %zu vs len %zu",
- static_cast<size_t>(len), sizeof(addr));
- *assignedPort = addr.svm_port;
- return OK;
+status_t RpcServer::setupVsockServer(unsigned int bindCid, unsigned int port) {
+ return setupSocketServer(VsockSocketAddress(bindCid, port));
}
status_t RpcServer::setupInetServer(const char* address, unsigned int port,
diff --git a/libs/binder/include/binder/RpcServer.h b/libs/binder/include/binder/RpcServer.h
index c241d31..abea0fb 100644
--- a/libs/binder/include/binder/RpcServer.h
+++ b/libs/binder/include/binder/RpcServer.h
@@ -85,12 +85,9 @@
/**
* Creates an RPC server binding to the given CID at the given port.
- *
- * Set |port| to VMADDR_PORT_ANY to pick an ephemeral port. In this case, |assignedPort|
- * will be set to the picked port number, if it is not null.
*/
- [[nodiscard]] LIBBINDER_EXPORTED status_t setupVsockServer(unsigned bindCid, unsigned port,
- unsigned* assignedPort = nullptr);
+ [[nodiscard]] LIBBINDER_EXPORTED status_t setupVsockServer(unsigned int bindCid,
+ unsigned int port);
/**
* Creates an RPC server at the current port using IPv4.
diff --git a/libs/binder/tests/BinderRpcTestServerConfig.aidl b/libs/binder/tests/BinderRpcTestServerConfig.aidl
index 96550bc..b2e0ef2 100644
--- a/libs/binder/tests/BinderRpcTestServerConfig.aidl
+++ b/libs/binder/tests/BinderRpcTestServerConfig.aidl
@@ -20,6 +20,7 @@
int socketType;
int rpcSecurity;
int serverVersion;
+ int vsockPort;
int socketFd; // Inherited from the parent process.
@utf8InCpp String addr;
}
diff --git a/libs/binder/tests/binderRpcTest.cpp b/libs/binder/tests/binderRpcTest.cpp
index d88048b..cec0dbf 100644
--- a/libs/binder/tests/binderRpcTest.cpp
+++ b/libs/binder/tests/binderRpcTest.cpp
@@ -141,6 +141,11 @@
return ret;
};
+static unsigned int allocateVsockPort() {
+ static unsigned int vsockPort = 34567;
+ return vsockPort++;
+}
+
static unique_fd initUnixSocket(std::string addr) {
auto socket_addr = UnixSocketAddress(addr.c_str());
unique_fd fd(TEMP_FAILURE_RETRY(socket(socket_addr.addr()->sa_family, SOCK_STREAM, AF_UNIX)));
@@ -295,6 +300,7 @@
serverConfig.socketType = static_cast<int32_t>(socketType);
serverConfig.rpcSecurity = static_cast<int32_t>(rpcSecurity);
serverConfig.serverVersion = serverVersion;
+ serverConfig.vsockPort = allocateVsockPort();
serverConfig.addr = addr;
serverConfig.socketFd = socketFd.get();
for (auto mode : options.serverSupportedFileDescriptorTransportModes) {
@@ -373,7 +379,7 @@
unique_fd(dup(bootstrapClientFd.get())));
break;
case SocketType::VSOCK:
- status = session->setupVsockClient(VMADDR_CID_LOCAL, serverInfo.port);
+ status = session->setupVsockClient(VMADDR_CID_LOCAL, serverConfig.vsockPort);
break;
case SocketType::INET:
status = session->setupInetClient("127.0.0.1", serverInfo.port);
@@ -1146,6 +1152,8 @@
#else // BINDER_RPC_TO_TRUSTY_TEST
bool testSupportVsockLoopback() {
// We don't need to enable TLS to know if vsock is supported.
+ unsigned int vsockPort = allocateVsockPort();
+
unique_fd serverFd(
TEMP_FAILURE_RETRY(socket(AF_VSOCK, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0)));
@@ -1157,12 +1165,12 @@
sockaddr_vm serverAddr{
.svm_family = AF_VSOCK,
- .svm_port = VMADDR_PORT_ANY,
+ .svm_port = vsockPort,
.svm_cid = VMADDR_CID_ANY,
};
int ret = TEMP_FAILURE_RETRY(
bind(serverFd.get(), reinterpret_cast<sockaddr*>(&serverAddr), sizeof(serverAddr)));
- LOG_ALWAYS_FATAL_IF(0 != ret, "Could not bind socket to port VMADDR_PORT_ANY: %s",
+ LOG_ALWAYS_FATAL_IF(0 != ret, "Could not bind socket to port %u: %s", vsockPort,
strerror(errno));
socklen_t len = sizeof(serverAddr);
@@ -1172,7 +1180,7 @@
"getsockname didn't read the full addr struct");
ret = TEMP_FAILURE_RETRY(listen(serverFd.get(), 1 /*backlog*/));
- LOG_ALWAYS_FATAL_IF(0 != ret, "Could not listen socket on port %u: %s", serverAddr.svm_port,
+ LOG_ALWAYS_FATAL_IF(0 != ret, "Could not listen socket on port %u: %s", vsockPort,
strerror(errno));
// Try to connect to the server using the VMADDR_CID_LOCAL cid
@@ -1181,13 +1189,13 @@
// and they return ETIMEDOUT after that.
unique_fd connectFd(
TEMP_FAILURE_RETRY(socket(AF_VSOCK, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0)));
- LOG_ALWAYS_FATAL_IF(!connectFd.ok(), "Could not create socket for port %u: %s",
- serverAddr.svm_port, strerror(errno));
+ LOG_ALWAYS_FATAL_IF(!connectFd.ok(), "Could not create socket for port %u: %s", vsockPort,
+ strerror(errno));
bool success = false;
sockaddr_vm connectAddr{
.svm_family = AF_VSOCK,
- .svm_port = serverAddr.svm_port,
+ .svm_port = vsockPort,
.svm_cid = VMADDR_CID_LOCAL,
};
ret = TEMP_FAILURE_RETRY(connect(connectFd.get(), reinterpret_cast<sockaddr*>(&connectAddr),
@@ -1536,9 +1544,8 @@
};
} break;
case SocketType::VSOCK: {
- unsigned port;
- auto status =
- rpcServer->setupVsockServer(VMADDR_CID_LOCAL, VMADDR_PORT_ANY, &port);
+ auto port = allocateVsockPort();
+ auto status = rpcServer->setupVsockServer(VMADDR_CID_LOCAL, port);
if (status != OK) {
return AssertionFailure() << "setupVsockServer: " << statusToString(status);
}
diff --git a/libs/binder/tests/binderRpcTestService.cpp b/libs/binder/tests/binderRpcTestService.cpp
index aef9464..28125f1 100644
--- a/libs/binder/tests/binderRpcTestService.cpp
+++ b/libs/binder/tests/binderRpcTestService.cpp
@@ -143,8 +143,8 @@
break;
case SocketType::VSOCK:
LOG_ALWAYS_FATAL_IF(OK !=
- server->setupVsockServer(VMADDR_CID_LOCAL, VMADDR_PORT_ANY,
- &outPort),
+ server->setupVsockServer(VMADDR_CID_LOCAL,
+ serverConfig.vsockPort),
"Need `sudo modprobe vsock_loopback`?");
break;
case SocketType::INET: {