1 /* 2 * Copyright 2019 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 "facade/grpc_root_server.h" 18 19 #include <string> 20 21 #include "facade/read_only_property_server.h" 22 #include "facade/rootservice.grpc.pb.h" 23 #include "grpc/grpc_module.h" 24 #include "hal/facade.h" 25 #include "hci/facade/acl_manager_facade.h" 26 #include "hci/facade/controller_facade.h" 27 #include "hci/facade/facade.h" 28 #include "hci/facade/le_acl_manager_facade.h" 29 #include "hci/facade/le_advertising_manager_facade.h" 30 #include "hci/facade/le_scanning_manager_facade.h" 31 #include "hci/hci_layer.h" 32 #include "hci/le_advertising_manager.h" 33 #include "hci/le_scanning_manager.h" 34 #include "l2cap/classic/facade.h" 35 #include "neighbor/connectability.h" 36 #include "neighbor/discoverability.h" 37 #include "neighbor/facade/facade.h" 38 #include "neighbor/inquiry.h" 39 #include "neighbor/name.h" 40 #include "neighbor/page.h" 41 #include "os/log.h" 42 #include "os/thread.h" 43 #include "security/facade.h" 44 #include "security/security_module.h" 45 #include "shim/dumpsys.h" 46 #include "shim/l2cap.h" 47 #include "stack_manager.h" 48 #include "storage/legacy.h" 49 50 namespace bluetooth { 51 namespace facade { 52 53 using ::bluetooth::grpc::GrpcModule; 54 using ::bluetooth::os::Thread; 55 56 namespace { 57 class RootFacadeService : public ::bluetooth::facade::RootFacade::Service { 58 public: 59 RootFacadeService(int grpc_port) : grpc_port_(grpc_port) {} 60 61 ::grpc::Status StartStack(::grpc::ServerContext* context, const ::bluetooth::facade::StartStackRequest* request, 62 ::bluetooth::facade::StartStackResponse* response) override { 63 if (is_running_) { 64 return ::grpc::Status(::grpc::StatusCode::INVALID_ARGUMENT, "stack is running"); 65 } 66 67 ModuleList modules; 68 modules.add<::bluetooth::grpc::GrpcModule>(); 69 70 BluetoothModule module_under_test = request->module_under_test(); 71 switch (module_under_test) { 72 case BluetoothModule::HAL: 73 modules.add<::bluetooth::hal::HciHalFacadeModule>(); 74 break; 75 case BluetoothModule::HCI: 76 modules.add<::bluetooth::facade::ReadOnlyPropertyServerModule>(); 77 modules.add<::bluetooth::hci::facade::HciLayerFacadeModule>(); 78 break; 79 case BluetoothModule::HCI_INTERFACES: 80 modules.add<::bluetooth::facade::ReadOnlyPropertyServerModule>(); 81 modules.add<::bluetooth::hci::facade::HciLayerFacadeModule>(); 82 modules.add<::bluetooth::hci::facade::AclManagerFacadeModule>(); 83 modules.add<::bluetooth::hci::facade::ControllerFacadeModule>(); 84 modules.add<::bluetooth::hci::facade::LeAclManagerFacadeModule>(); 85 modules.add<::bluetooth::hci::facade::LeAdvertisingManagerFacadeModule>(); 86 modules.add<::bluetooth::hci::facade::LeScanningManagerFacadeModule>(); 87 modules.add<::bluetooth::neighbor::facade::NeighborFacadeModule>(); 88 break; 89 case BluetoothModule::L2CAP: 90 modules.add<::bluetooth::hci::facade::ControllerFacadeModule>(); 91 modules.add<::bluetooth::neighbor::facade::NeighborFacadeModule>(); 92 modules.add<::bluetooth::facade::ReadOnlyPropertyServerModule>(); 93 modules.add<::bluetooth::l2cap::classic::L2capClassicModuleFacadeModule>(); 94 modules.add<::bluetooth::hci::facade::HciLayerFacadeModule>(); 95 break; 96 case BluetoothModule::SECURITY: 97 modules.add<::bluetooth::facade::ReadOnlyPropertyServerModule>(); 98 modules.add<::bluetooth::hci::facade::ControllerFacadeModule>(); 99 modules.add<::bluetooth::security::SecurityModuleFacadeModule>(); 100 modules.add<::bluetooth::neighbor::facade::NeighborFacadeModule>(); 101 modules.add<::bluetooth::l2cap::classic::L2capClassicModuleFacadeModule>(); 102 modules.add<::bluetooth::hci::facade::HciLayerFacadeModule>(); 103 modules.add<::bluetooth::hci::facade::ControllerFacadeModule>(); 104 modules.add<::bluetooth::hci::facade::LeAdvertisingManagerFacadeModule>(); 105 modules.add<::bluetooth::hci::facade::LeScanningManagerFacadeModule>(); 106 break; 107 case BluetoothModule::SHIM: 108 modules.add<::bluetooth::neighbor::ConnectabilityModule>(); 109 modules.add<::bluetooth::neighbor::DiscoverabilityModule>(); 110 modules.add<::bluetooth::neighbor::InquiryModule>(); 111 modules.add<::bluetooth::neighbor::NameModule>(); 112 modules.add<::bluetooth::shim::Dumpsys>(); 113 modules.add<::bluetooth::shim::L2cap>(); 114 modules.add<::bluetooth::neighbor::PageModule>(); 115 modules.add<::bluetooth::hci::HciLayer>(); 116 modules.add<::bluetooth::hci::LeAdvertisingManager>(); 117 modules.add<::bluetooth::hci::LeScanningManager>(); 118 modules.add<::bluetooth::security::SecurityModule>(); 119 modules.add<::bluetooth::storage::LegacyModule>(); 120 break; 121 default: 122 return ::grpc::Status(::grpc::StatusCode::INVALID_ARGUMENT, "invalid module under test"); 123 } 124 125 stack_thread_ = new Thread("stack_thread", Thread::Priority::NORMAL); 126 stack_manager_.StartUp(&modules, stack_thread_); 127 128 GrpcModule* grpc_module = stack_manager_.GetInstance<GrpcModule>(); 129 grpc_module->StartServer("0.0.0.0", grpc_port_); 130 131 grpc_loop_thread_ = new std::thread([grpc_module] { grpc_module->RunGrpcLoop(); }); 132 is_running_ = true; 133 134 return ::grpc::Status::OK; 135 } 136 137 ::grpc::Status StopStack(::grpc::ServerContext* context, const ::bluetooth::facade::StopStackRequest* request, 138 ::bluetooth::facade::StopStackResponse* response) override { 139 if (!is_running_) { 140 return ::grpc::Status(::grpc::StatusCode::INVALID_ARGUMENT, "stack is not running"); 141 } 142 143 stack_manager_.GetInstance<GrpcModule>()->StopServer(); 144 grpc_loop_thread_->join(); 145 delete grpc_loop_thread_; 146 147 stack_manager_.ShutDown(); 148 delete stack_thread_; 149 is_running_ = false; 150 return ::grpc::Status::OK; 151 } 152 153 private: 154 Thread* stack_thread_ = nullptr; 155 bool is_running_ = false; 156 std::thread* grpc_loop_thread_ = nullptr; 157 StackManager stack_manager_; 158 int grpc_port_ = 8898; 159 }; 160 161 RootFacadeService* root_facade_service; 162 } // namespace 163 164 void GrpcRootServer::StartServer(const std::string& address, int grpc_root_server_port, int grpc_port) { 165 ASSERT(!started_); 166 started_ = true; 167 168 std::string listening_port = address + ":" + std::to_string(grpc_root_server_port); 169 ::grpc::ServerBuilder builder; 170 root_facade_service = new RootFacadeService(grpc_port); 171 builder.RegisterService(root_facade_service); 172 builder.AddListeningPort(listening_port, ::grpc::InsecureServerCredentials()); 173 server_ = builder.BuildAndStart(); 174 175 ASSERT(server_ != nullptr); 176 } 177 178 void GrpcRootServer::StopServer() { 179 ASSERT(started_); 180 server_->Shutdown(); 181 started_ = false; 182 server_.reset(); 183 delete root_facade_service; 184 } 185 186 void GrpcRootServer::RunGrpcLoop() { 187 ASSERT(started_); 188 server_->Wait(); 189 } 190 191 } // namespace facade 192 } // namespace bluetooth 193