| Andrei Homescu | 2a29801 | 2022-06-15 01:08:54 +0000 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) 2022 The Android Open Source Project | 
|  | 3 | * | 
|  | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | 5 | * you may not use this file except in compliance with the License. | 
|  | 6 | * You may obtain a copy of the License at | 
|  | 7 | * | 
|  | 8 | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | 9 | * | 
|  | 10 | * Unless required by applicable law or agreed to in writing, software | 
|  | 11 | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | 13 | * See the License for the specific language governing permissions and | 
|  | 14 | * limitations under the License. | 
|  | 15 | */ | 
|  | 16 |  | 
|  | 17 | #include "binderRpcTestCommon.h" | 
|  | 18 |  | 
|  | 19 | using namespace android; | 
|  | 20 |  | 
|  | 21 | int main(int argc, const char* argv[]) { | 
|  | 22 | LOG_ALWAYS_FATAL_IF(argc != 3, "Invalid number of arguments: %d", argc); | 
|  | 23 | base::unique_fd writeEnd(atoi(argv[1])); | 
|  | 24 | base::unique_fd readEnd(atoi(argv[2])); | 
|  | 25 |  | 
|  | 26 | auto serverConfig = readFromFd<BinderRpcTestServerConfig>(readEnd); | 
|  | 27 | auto socketType = static_cast<SocketType>(serverConfig.socketType); | 
|  | 28 | auto rpcSecurity = static_cast<RpcSecurity>(serverConfig.rpcSecurity); | 
|  | 29 |  | 
|  | 30 | std::vector<RpcSession::FileDescriptorTransportMode> | 
|  | 31 | serverSupportedFileDescriptorTransportModes; | 
|  | 32 | for (auto mode : serverConfig.serverSupportedFileDescriptorTransportModes) { | 
|  | 33 | serverSupportedFileDescriptorTransportModes.push_back( | 
|  | 34 | static_cast<RpcSession::FileDescriptorTransportMode>(mode)); | 
|  | 35 | } | 
|  | 36 |  | 
|  | 37 | auto certVerifier = std::make_shared<RpcCertificateVerifierSimple>(); | 
|  | 38 | sp<RpcServer> server = RpcServer::make(newFactory(rpcSecurity, certVerifier)); | 
|  | 39 |  | 
|  | 40 | server->setProtocolVersion(serverConfig.serverVersion); | 
|  | 41 | server->setMaxThreads(serverConfig.numThreads); | 
|  | 42 | server->setSupportedFileDescriptorTransportModes(serverSupportedFileDescriptorTransportModes); | 
|  | 43 |  | 
|  | 44 | unsigned int outPort = 0; | 
| Alice Wang | 1ef010b | 2022-11-14 09:09:25 +0000 | [diff] [blame] | 45 | base::unique_fd socketFd(serverConfig.socketFd); | 
| Andrei Homescu | 2a29801 | 2022-06-15 01:08:54 +0000 | [diff] [blame] | 46 |  | 
|  | 47 | switch (socketType) { | 
|  | 48 | case SocketType::PRECONNECTED: | 
|  | 49 | [[fallthrough]]; | 
|  | 50 | case SocketType::UNIX: | 
|  | 51 | CHECK_EQ(OK, server->setupUnixDomainServer(serverConfig.addr.c_str())) | 
|  | 52 | << serverConfig.addr; | 
|  | 53 | break; | 
| David Brazdil | 21c887c | 2022-09-23 12:25:18 +0100 | [diff] [blame] | 54 | case SocketType::UNIX_BOOTSTRAP: | 
| Alice Wang | 1ef010b | 2022-11-14 09:09:25 +0000 | [diff] [blame] | 55 | CHECK_EQ(OK, server->setupUnixDomainSocketBootstrapServer(std::move(socketFd))); | 
| David Brazdil | 21c887c | 2022-09-23 12:25:18 +0100 | [diff] [blame] | 56 | break; | 
| Alice Wang | 893a991 | 2022-10-24 10:44:09 +0000 | [diff] [blame] | 57 | case SocketType::UNIX_RAW: | 
| Alice Wang | 1ef010b | 2022-11-14 09:09:25 +0000 | [diff] [blame] | 58 | CHECK_EQ(OK, server->setupRawSocketServer(std::move(socketFd))); | 
| Alice Wang | 893a991 | 2022-10-24 10:44:09 +0000 | [diff] [blame] | 59 | break; | 
| Andrei Homescu | 2a29801 | 2022-06-15 01:08:54 +0000 | [diff] [blame] | 60 | case SocketType::VSOCK: | 
|  | 61 | CHECK_EQ(OK, server->setupVsockServer(serverConfig.vsockPort)); | 
|  | 62 | break; | 
|  | 63 | case SocketType::INET: { | 
|  | 64 | CHECK_EQ(OK, server->setupInetServer(kLocalInetAddress, 0, &outPort)); | 
|  | 65 | CHECK_NE(0, outPort); | 
|  | 66 | break; | 
|  | 67 | } | 
|  | 68 | default: | 
|  | 69 | LOG_ALWAYS_FATAL("Unknown socket type"); | 
|  | 70 | } | 
|  | 71 |  | 
|  | 72 | BinderRpcTestServerInfo serverInfo; | 
|  | 73 | serverInfo.port = static_cast<int64_t>(outPort); | 
|  | 74 | serverInfo.cert.data = server->getCertificate(RpcCertificateFormat::PEM); | 
|  | 75 | writeToFd(writeEnd, serverInfo); | 
|  | 76 | auto clientInfo = readFromFd<BinderRpcTestClientInfo>(readEnd); | 
|  | 77 |  | 
|  | 78 | if (rpcSecurity == RpcSecurity::TLS) { | 
|  | 79 | for (const auto& clientCert : clientInfo.certs) { | 
|  | 80 | CHECK_EQ(OK, | 
|  | 81 | certVerifier->addTrustedPeerCertificate(RpcCertificateFormat::PEM, | 
|  | 82 | clientCert.data)); | 
|  | 83 | } | 
|  | 84 | } | 
|  | 85 |  | 
|  | 86 | server->setPerSessionRootObject([&](const void* addrPtr, size_t len) { | 
|  | 87 | // UNIX sockets with abstract addresses return | 
|  | 88 | // sizeof(sa_family_t)==2 in addrlen | 
|  | 89 | CHECK_GE(len, sizeof(sa_family_t)); | 
|  | 90 | const sockaddr* addr = reinterpret_cast<const sockaddr*>(addrPtr); | 
|  | 91 | sp<MyBinderRpcTest> service = sp<MyBinderRpcTest>::make(); | 
|  | 92 | switch (addr->sa_family) { | 
|  | 93 | case AF_UNIX: | 
|  | 94 | // nothing to save | 
|  | 95 | break; | 
|  | 96 | case AF_VSOCK: | 
|  | 97 | CHECK_EQ(len, sizeof(sockaddr_vm)); | 
|  | 98 | service->port = reinterpret_cast<const sockaddr_vm*>(addr)->svm_port; | 
|  | 99 | break; | 
|  | 100 | case AF_INET: | 
|  | 101 | CHECK_EQ(len, sizeof(sockaddr_in)); | 
|  | 102 | service->port = ntohs(reinterpret_cast<const sockaddr_in*>(addr)->sin_port); | 
|  | 103 | break; | 
|  | 104 | case AF_INET6: | 
|  | 105 | CHECK_EQ(len, sizeof(sockaddr_in)); | 
|  | 106 | service->port = ntohs(reinterpret_cast<const sockaddr_in6*>(addr)->sin6_port); | 
|  | 107 | break; | 
|  | 108 | default: | 
|  | 109 | LOG_ALWAYS_FATAL("Unrecognized address family %d", addr->sa_family); | 
|  | 110 | } | 
|  | 111 | service->server = server; | 
|  | 112 | return service; | 
|  | 113 | }); | 
|  | 114 |  | 
|  | 115 | server->join(); | 
|  | 116 |  | 
|  | 117 | // Another thread calls shutdown. Wait for it to complete. | 
|  | 118 | (void)server->shutdown(); | 
|  | 119 |  | 
|  | 120 | return 0; | 
|  | 121 | } |