Skip to content

Commit d0469c5

Browse files
Steven MorelandGerrit Code Review
authored andcommitted
Merge "Revert "RpcServer: let system allocate vsock ports"" into android15-tests-dev
2 parents 19dd036 + 5f1ffcb commit d0469c5

5 files changed

Lines changed: 24 additions & 34 deletions

File tree

libs/binder/RpcServer.cpp

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -71,23 +71,8 @@ status_t RpcServer::setupUnixDomainServer(const char* path) {
7171
return setupSocketServer(UnixSocketAddress(path));
7272
}
7373

74-
status_t RpcServer::setupVsockServer(unsigned bindCid, unsigned port, unsigned* assignedPort) {
75-
auto status = setupSocketServer(VsockSocketAddress(bindCid, port));
76-
if (status != OK) return status;
77-
78-
if (assignedPort == nullptr) return OK;
79-
sockaddr_vm addr;
80-
socklen_t len = sizeof(addr);
81-
if (0 != getsockname(mServer.fd.get(), reinterpret_cast<sockaddr*>(&addr), &len)) {
82-
status = -errno;
83-
ALOGE("setupVsockServer: Failed to getsockname: %s", strerror(-status));
84-
return status;
85-
}
86-
87-
LOG_ALWAYS_FATAL_IF(len != sizeof(addr), "Wrong socket type: len %zu vs len %zu",
88-
static_cast<size_t>(len), sizeof(addr));
89-
*assignedPort = addr.svm_port;
90-
return OK;
74+
status_t RpcServer::setupVsockServer(unsigned int bindCid, unsigned int port) {
75+
return setupSocketServer(VsockSocketAddress(bindCid, port));
9176
}
9277

9378
status_t RpcServer::setupInetServer(const char* address, unsigned int port,

libs/binder/include/binder/RpcServer.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,9 @@ class RpcServer final : public virtual RefBase, private RpcSession::EventListene
8585

8686
/**
8787
* Creates an RPC server binding to the given CID at the given port.
88-
*
89-
* Set |port| to VMADDR_PORT_ANY to pick an ephemeral port. In this case, |assignedPort|
90-
* will be set to the picked port number, if it is not null.
9188
*/
92-
[[nodiscard]] LIBBINDER_EXPORTED status_t setupVsockServer(unsigned bindCid, unsigned port,
93-
unsigned* assignedPort = nullptr);
89+
[[nodiscard]] LIBBINDER_EXPORTED status_t setupVsockServer(unsigned int bindCid,
90+
unsigned int port);
9491

9592
/**
9693
* Creates an RPC server at the current port using IPv4.

libs/binder/tests/BinderRpcTestServerConfig.aidl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ parcelable BinderRpcTestServerConfig {
2020
int socketType;
2121
int rpcSecurity;
2222
int serverVersion;
23+
int vsockPort;
2324
int socketFd; // Inherited from the parent process.
2425
@utf8InCpp String addr;
2526
}

libs/binder/tests/binderRpcTest.cpp

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,11 @@ static std::string allocateSocketAddress() {
141141
return ret;
142142
};
143143

144+
static unsigned int allocateVsockPort() {
145+
static unsigned int vsockPort = 34567;
146+
return vsockPort++;
147+
}
148+
144149
static unique_fd initUnixSocket(std::string addr) {
145150
auto socket_addr = UnixSocketAddress(addr.c_str());
146151
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(
295300
serverConfig.socketType = static_cast<int32_t>(socketType);
296301
serverConfig.rpcSecurity = static_cast<int32_t>(rpcSecurity);
297302
serverConfig.serverVersion = serverVersion;
303+
serverConfig.vsockPort = allocateVsockPort();
298304
serverConfig.addr = addr;
299305
serverConfig.socketFd = socketFd.get();
300306
for (auto mode : options.serverSupportedFileDescriptorTransportModes) {
@@ -373,7 +379,7 @@ std::unique_ptr<ProcessSession> BinderRpc::createRpcTestSocketServerProcessEtc(
373379
unique_fd(dup(bootstrapClientFd.get())));
374380
break;
375381
case SocketType::VSOCK:
376-
status = session->setupVsockClient(VMADDR_CID_LOCAL, serverInfo.port);
382+
status = session->setupVsockClient(VMADDR_CID_LOCAL, serverConfig.vsockPort);
377383
break;
378384
case SocketType::INET:
379385
status = session->setupInetClient("127.0.0.1", serverInfo.port);
@@ -1146,6 +1152,8 @@ INSTANTIATE_TEST_SUITE_P(Trusty, BinderRpc, ::testing::ValuesIn(getTrustyBinderR
11461152
#else // BINDER_RPC_TO_TRUSTY_TEST
11471153
bool testSupportVsockLoopback() {
11481154
// We don't need to enable TLS to know if vsock is supported.
1155+
unsigned int vsockPort = allocateVsockPort();
1156+
11491157
unique_fd serverFd(
11501158
TEMP_FAILURE_RETRY(socket(AF_VSOCK, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0)));
11511159

@@ -1157,12 +1165,12 @@ bool testSupportVsockLoopback() {
11571165

11581166
sockaddr_vm serverAddr{
11591167
.svm_family = AF_VSOCK,
1160-
.svm_port = VMADDR_PORT_ANY,
1168+
.svm_port = vsockPort,
11611169
.svm_cid = VMADDR_CID_ANY,
11621170
};
11631171
int ret = TEMP_FAILURE_RETRY(
11641172
bind(serverFd.get(), reinterpret_cast<sockaddr*>(&serverAddr), sizeof(serverAddr)));
1165-
LOG_ALWAYS_FATAL_IF(0 != ret, "Could not bind socket to port VMADDR_PORT_ANY: %s",
1173+
LOG_ALWAYS_FATAL_IF(0 != ret, "Could not bind socket to port %u: %s", vsockPort,
11661174
strerror(errno));
11671175

11681176
socklen_t len = sizeof(serverAddr);
@@ -1172,7 +1180,7 @@ bool testSupportVsockLoopback() {
11721180
"getsockname didn't read the full addr struct");
11731181

11741182
ret = TEMP_FAILURE_RETRY(listen(serverFd.get(), 1 /*backlog*/));
1175-
LOG_ALWAYS_FATAL_IF(0 != ret, "Could not listen socket on port %u: %s", serverAddr.svm_port,
1183+
LOG_ALWAYS_FATAL_IF(0 != ret, "Could not listen socket on port %u: %s", vsockPort,
11761184
strerror(errno));
11771185

11781186
// Try to connect to the server using the VMADDR_CID_LOCAL cid
@@ -1181,13 +1189,13 @@ bool testSupportVsockLoopback() {
11811189
// and they return ETIMEDOUT after that.
11821190
unique_fd connectFd(
11831191
TEMP_FAILURE_RETRY(socket(AF_VSOCK, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0)));
1184-
LOG_ALWAYS_FATAL_IF(!connectFd.ok(), "Could not create socket for port %u: %s",
1185-
serverAddr.svm_port, strerror(errno));
1192+
LOG_ALWAYS_FATAL_IF(!connectFd.ok(), "Could not create socket for port %u: %s", vsockPort,
1193+
strerror(errno));
11861194

11871195
bool success = false;
11881196
sockaddr_vm connectAddr{
11891197
.svm_family = AF_VSOCK,
1190-
.svm_port = serverAddr.svm_port,
1198+
.svm_port = vsockPort,
11911199
.svm_cid = VMADDR_CID_LOCAL,
11921200
};
11931201
ret = TEMP_FAILURE_RETRY(connect(connectFd.get(), reinterpret_cast<sockaddr*>(&connectAddr),
@@ -1536,9 +1544,8 @@ class RpcTransportTestUtils {
15361544
};
15371545
} break;
15381546
case SocketType::VSOCK: {
1539-
unsigned port;
1540-
auto status =
1541-
rpcServer->setupVsockServer(VMADDR_CID_LOCAL, VMADDR_PORT_ANY, &port);
1547+
auto port = allocateVsockPort();
1548+
auto status = rpcServer->setupVsockServer(VMADDR_CID_LOCAL, port);
15421549
if (status != OK) {
15431550
return AssertionFailure() << "setupVsockServer: " << statusToString(status);
15441551
}

libs/binder/tests/binderRpcTestService.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,8 @@ int main(int argc, char* argv[]) {
143143
break;
144144
case SocketType::VSOCK:
145145
LOG_ALWAYS_FATAL_IF(OK !=
146-
server->setupVsockServer(VMADDR_CID_LOCAL, VMADDR_PORT_ANY,
147-
&outPort),
146+
server->setupVsockServer(VMADDR_CID_LOCAL,
147+
serverConfig.vsockPort),
148148
"Need `sudo modprobe vsock_loopback`?");
149149
break;
150150
case SocketType::INET: {

0 commit comments

Comments
 (0)