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