1 /*
2  * Copyright 2020 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 "hci/facade/controller_facade.h"
18 
19 #include <condition_variable>
20 #include <memory>
21 #include <mutex>
22 
23 #include "blueberry/facade/hci/controller_facade.grpc.pb.h"
24 #include "blueberry/facade/hci/controller_facade.pb.h"
25 #include "common/bind.h"
26 #include "common/blocking_queue.h"
27 #include "grpc/grpc_event_queue.h"
28 #include "hci/address.h"
29 #include "hci/controller.h"
30 
31 using ::grpc::ServerAsyncResponseWriter;
32 using ::grpc::ServerAsyncWriter;
33 using ::grpc::ServerContext;
34 
35 namespace bluetooth {
36 namespace hci {
37 namespace facade {
38 
39 using namespace blueberry::facade::hci;
40 using blueberry::facade::BluetoothAddress;
41 
42 class ControllerFacadeService : public ControllerFacade::Service {
43 public:
ControllerFacadeService(Controller * controller,::bluetooth::os::Handler *)44   ControllerFacadeService(Controller* controller, ::bluetooth::os::Handler*)
45       : controller_(controller) {}
46 
GetMacAddress(::grpc::ServerContext *,const::google::protobuf::Empty *,BluetoothAddress * response)47   ::grpc::Status GetMacAddress(::grpc::ServerContext* /* context */,
48                                const ::google::protobuf::Empty* /* request */,
49                                BluetoothAddress* response) override {
50     Address local_address = controller_->GetMacAddress();
51     response->set_address(local_address.ToString());
52     return ::grpc::Status::OK;
53   }
54 
GetLocalName(::grpc::ServerContext *,const::google::protobuf::Empty *,NameMsg * response)55   ::grpc::Status GetLocalName(::grpc::ServerContext* /* context */,
56                               const ::google::protobuf::Empty* /* request */,
57                               NameMsg* response) override {
58     std::string local_name = controller_->GetLocalName();
59     response->set_name(local_name);
60     return ::grpc::Status::OK;
61   }
62 
WriteLocalName(::grpc::ServerContext *,const NameMsg * request,::google::protobuf::Empty *)63   ::grpc::Status WriteLocalName(::grpc::ServerContext* /* context */, const NameMsg* request,
64                                 ::google::protobuf::Empty* /* response */) override {
65     controller_->WriteLocalName(request->name());
66     return ::grpc::Status::OK;
67   }
68 
IsSupportedCommand(::grpc::ServerContext *,const OpCodeMsg * request,SupportedMsg * response)69   ::grpc::Status IsSupportedCommand(::grpc::ServerContext* /* context */, const OpCodeMsg* request,
70                                     SupportedMsg* response) override {
71     bool ret = controller_->IsSupported(static_cast<OpCode>(request->op_code()));
72     response->set_supported(ret);
73     return ::grpc::Status::OK;
74   }
75 
76 #define SUPPORTED_API(name)                                                                   \
77   ::grpc::Status name(::grpc::ServerContext* /* context */,                                   \
78                       const ::google::protobuf::Empty* /* request */, SupportedMsg* response) \
79           override {                                                                          \
80     response->set_supported(controller_->name());                                             \
81     return ::grpc::Status::OK;                                                                \
82   }
83 
84   SUPPORTED_API(SupportsSimplePairing)
SUPPORTED_API(SupportsSecureConnections)85   SUPPORTED_API(SupportsSecureConnections)
86   SUPPORTED_API(SupportsSimultaneousLeBrEdr)
87   SUPPORTED_API(SupportsInterlacedInquiryScan)
88   SUPPORTED_API(SupportsRssiWithInquiryResults)
89   SUPPORTED_API(SupportsExtendedInquiryResponse)
90   SUPPORTED_API(SupportsRoleSwitch)
91   SUPPORTED_API(Supports3SlotPackets)
92   SUPPORTED_API(Supports5SlotPackets)
93   SUPPORTED_API(SupportsClassic2mPhy)
94   SUPPORTED_API(SupportsClassic3mPhy)
95   SUPPORTED_API(Supports3SlotEdrPackets)
96   SUPPORTED_API(Supports5SlotEdrPackets)
97   SUPPORTED_API(SupportsSco)
98   SUPPORTED_API(SupportsHv2Packets)
99   SUPPORTED_API(SupportsHv3Packets)
100   SUPPORTED_API(SupportsEv3Packets)
101   SUPPORTED_API(SupportsEv4Packets)
102   SUPPORTED_API(SupportsEv5Packets)
103   SUPPORTED_API(SupportsEsco2mPhy)
104   SUPPORTED_API(SupportsEsco3mPhy)
105   SUPPORTED_API(Supports3SlotEscoEdrPackets)
106   SUPPORTED_API(SupportsHoldMode)
107   SUPPORTED_API(SupportsSniffMode)
108   SUPPORTED_API(SupportsParkMode)
109   SUPPORTED_API(SupportsNonFlushablePb)
110   SUPPORTED_API(SupportsSniffSubrating)
111   SUPPORTED_API(SupportsEncryptionPause)
112   SUPPORTED_API(SupportsBle)
113   SUPPORTED_API(SupportsBleEncryption)
114   SUPPORTED_API(SupportsBleConnectionParametersRequest)
115   SUPPORTED_API(SupportsBleExtendedReject)
116   SUPPORTED_API(SupportsBlePeripheralInitiatedFeaturesExchange)
117   SUPPORTED_API(SupportsBlePing)
118   SUPPORTED_API(SupportsBleDataPacketLengthExtension)
119   SUPPORTED_API(SupportsBlePrivacy)
120   SUPPORTED_API(SupportsBleExtendedScannerFilterPolicies)
121   SUPPORTED_API(SupportsBle2mPhy)
122   SUPPORTED_API(SupportsBleStableModulationIndexTx)
123   SUPPORTED_API(SupportsBleStableModulationIndexRx)
124   SUPPORTED_API(SupportsBleCodedPhy)
125   SUPPORTED_API(SupportsBleExtendedAdvertising)
126   SUPPORTED_API(SupportsBlePeriodicAdvertising)
127   SUPPORTED_API(SupportsBleChannelSelectionAlgorithm2)
128   SUPPORTED_API(SupportsBlePowerClass1)
129   SUPPORTED_API(SupportsBleMinimumUsedChannels)
130   SUPPORTED_API(SupportsBleConnectionCteRequest)
131   SUPPORTED_API(SupportsBleConnectionCteResponse)
132   SUPPORTED_API(SupportsBleConnectionlessCteTransmitter)
133   SUPPORTED_API(SupportsBleConnectionlessCteReceiver)
134   SUPPORTED_API(SupportsBleAntennaSwitchingDuringCteTx)
135   SUPPORTED_API(SupportsBleAntennaSwitchingDuringCteRx)
136   SUPPORTED_API(SupportsBleReceivingConstantToneExtensions)
137   SUPPORTED_API(SupportsBlePeriodicAdvertisingSyncTransferSender)
138   SUPPORTED_API(SupportsBlePeriodicAdvertisingSyncTransferRecipient)
139   SUPPORTED_API(SupportsBleSleepClockAccuracyUpdates)
140   SUPPORTED_API(SupportsBleRemotePublicKeyValidation)
141   SUPPORTED_API(SupportsBleConnectedIsochronousStreamCentral)
142   SUPPORTED_API(SupportsBleConnectedIsochronousStreamPeripheral)
143   SUPPORTED_API(SupportsBleIsochronousBroadcaster)
144   SUPPORTED_API(SupportsBleSynchronizedReceiver)
145   SUPPORTED_API(SupportsBleIsochronousChannelsHostSupport)
146   SUPPORTED_API(SupportsBlePowerControlRequest)
147   SUPPORTED_API(SupportsBlePowerChangeIndication)
148   SUPPORTED_API(SupportsBlePathLossMonitoring)
149   SUPPORTED_API(SupportsBlePeriodicAdvertisingAdi)
150 
151   ::grpc::Status GetLeNumberOfSupportedAdvertisingSets(
152           ::grpc::ServerContext* /* context */, const ::google::protobuf::Empty* /* request */,
153           SingleValueMsg* response) override {
154     uint8_t ret = controller_->GetLeNumberOfSupportedAdverisingSets();
155     response->set_value(ret);
156     return ::grpc::Status::OK;
157   }
158 
159 private:
160   Controller* controller_;
161 };
162 
ListDependencies(ModuleList * list) const163 void ControllerFacadeModule::ListDependencies(ModuleList* list) const {
164   ::bluetooth::grpc::GrpcFacadeModule::ListDependencies(list);
165   list->add<Controller>();
166 }
167 
Start()168 void ControllerFacadeModule::Start() {
169   ::bluetooth::grpc::GrpcFacadeModule::Start();
170   service_ = new ControllerFacadeService(GetDependency<Controller>(), GetHandler());
171 }
172 
Stop()173 void ControllerFacadeModule::Stop() {
174   delete service_;
175   ::bluetooth::grpc::GrpcFacadeModule::Stop();
176 }
177 
GetService() const178 ::grpc::Service* ControllerFacadeModule::GetService() const { return service_; }
179 
180 const ModuleFactory ControllerFacadeModule::Factory =
__anon494ec52f0102() 181         ::bluetooth::ModuleFactory([]() { return new ControllerFacadeModule(); });
182 
183 }  // namespace facade
184 }  // namespace hci
185 }  // namespace bluetooth
186