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