diff options
| author | 2024-12-02 21:15:28 +0000 | |
|---|---|---|
| committer | 2024-12-02 21:28:05 +0000 | |
| commit | 5f1ffcbc0bfdea0d5dddcfdcb9ff6bec5fe4f75b (patch) | |
| tree | 504a1611620c1cd0e5b1586fccb0e023bc70a529 | |
| parent | 19dd0366f010857d9fba2b86707e27950bfe2001 (diff) | |
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
| -rw-r--r-- | libs/binder/RpcServer.cpp | 19 | ||||
| -rw-r--r-- | libs/binder/include/binder/RpcServer.h | 7 | ||||
| -rw-r--r-- | libs/binder/tests/BinderRpcTestServerConfig.aidl | 1 | ||||
| -rw-r--r-- | libs/binder/tests/binderRpcTest.cpp | 27 | ||||
| -rw-r--r-- | libs/binder/tests/binderRpcTestService.cpp | 4 |
5 files changed, 24 insertions, 34 deletions
diff --git a/libs/binder/RpcServer.cpp b/libs/binder/RpcServer.cpp index b8742af1f9..d9e926a9d5 100644 --- a/libs/binder/RpcServer.cpp +++ b/libs/binder/RpcServer.cpp @@ -71,23 +71,8 @@ status_t RpcServer::setupUnixDomainServer(const char* path) { 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 c241d31623..abea0fb40c 100644 --- a/libs/binder/include/binder/RpcServer.h +++ b/libs/binder/include/binder/RpcServer.h @@ -85,12 +85,9 @@ public: /** * 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 96550bca6b..b2e0ef21c7 100644 --- a/libs/binder/tests/BinderRpcTestServerConfig.aidl +++ b/libs/binder/tests/BinderRpcTestServerConfig.aidl @@ -20,6 +20,7 @@ parcelable BinderRpcTestServerConfig { 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 d88048b96d..cec0dbf54d 100644 --- a/libs/binder/tests/binderRpcTest.cpp +++ b/libs/binder/tests/binderRpcTest.cpp @@ -141,6 +141,11 @@ static std::string allocateSocketAddress() { 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 @@ std::unique_ptr<ProcessSession> BinderRpc::createRpcTestSocketServerProcessEtc( 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 @@ std::unique_ptr<ProcessSession> BinderRpc::createRpcTestSocketServerProcessEtc( 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 @@ INSTANTIATE_TEST_SUITE_P(Trusty, BinderRpc, ::testing::ValuesIn(getTrustyBinderR #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 @@ bool testSupportVsockLoopback() { 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 @@ bool testSupportVsockLoopback() { "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 @@ bool testSupportVsockLoopback() { // 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 @@ public: }; } 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 aef946481f..28125f169c 100644 --- a/libs/binder/tests/binderRpcTestService.cpp +++ b/libs/binder/tests/binderRpcTestService.cpp @@ -143,8 +143,8 @@ int main(int argc, char* argv[]) { 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: { |