Loading libs/binder/RpcServer.cpp +2 −17 Original line number Diff line number Diff line Loading @@ -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, Loading libs/binder/include/binder/RpcServer.h +2 −5 Original line number Diff line number Diff line Loading @@ -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. Loading libs/binder/tests/BinderRpcTestServerConfig.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ parcelable BinderRpcTestServerConfig { int socketType; int rpcSecurity; int serverVersion; int vsockPort; int socketFd; // Inherited from the parent process. @utf8InCpp String addr; } libs/binder/tests/binderRpcTest.cpp +17 −10 Original line number Diff line number Diff line Loading @@ -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))); Loading Loading @@ -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) { Loading Loading @@ -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); Loading Loading @@ -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))); Loading @@ -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); Loading @@ -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 Loading @@ -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), Loading Loading @@ -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); } Loading libs/binder/tests/binderRpcTestService.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -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: { Loading Loading
libs/binder/RpcServer.cpp +2 −17 Original line number Diff line number Diff line Loading @@ -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, Loading
libs/binder/include/binder/RpcServer.h +2 −5 Original line number Diff line number Diff line Loading @@ -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. Loading
libs/binder/tests/BinderRpcTestServerConfig.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ parcelable BinderRpcTestServerConfig { int socketType; int rpcSecurity; int serverVersion; int vsockPort; int socketFd; // Inherited from the parent process. @utf8InCpp String addr; }
libs/binder/tests/binderRpcTest.cpp +17 −10 Original line number Diff line number Diff line Loading @@ -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))); Loading Loading @@ -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) { Loading Loading @@ -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); Loading Loading @@ -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))); Loading @@ -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); Loading @@ -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 Loading @@ -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), Loading Loading @@ -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); } Loading
libs/binder/tests/binderRpcTestService.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -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: { Loading