1 //
2 // Copyright (C) 2015 Google, Inc.
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 "service/hal/bluetooth_gatt_interface.h"
18
19 #include <mutex>
20 #define _LIBCPP_BUILDING_SHARED_MUTEX
21 #include <shared_mutex>
22 #undef _LIBCPP_BUILDING_SHARED_MUTEX
23
24 #include <base/logging.h>
25 #include <base/observer_list.h>
26
27 #include "service/hal/bluetooth_interface.h"
28 #include "service/logging_helpers.h"
29
30 using std::lock_guard;
31 using std::unique_lock;
32 using std::shared_lock;
33 using std::mutex;
34 using std::shared_timed_mutex;
35
36 namespace bluetooth {
37 namespace hal {
38
39 namespace {
40
41 // The global BluetoothGattInterface instance.
42 BluetoothGattInterface* g_interface = nullptr;
43
44 // Mutex used by callbacks to access |g_interface|. If we initialize or clean it
45 // use unique_lock. If only accessing |g_interface| use shared lock.
46 //TODO(jpawlowski): this should be just shared_mutex, as we currently don't use
47 // timed methods. Change to shared_mutex when we upgrade to C++14
48 shared_timed_mutex g_instance_lock;
49
50 // Helper for obtaining the observer lists. This is forward declared here
51 // and defined below since it depends on BluetoothInterfaceImpl.
52 base::ObserverList<BluetoothGattInterface::ClientObserver>*
53 GetClientObservers();
54 base::ObserverList<BluetoothGattInterface::ServerObserver>*
55 GetServerObservers();
56
57 #define FOR_EACH_CLIENT_OBSERVER(func) \
58 FOR_EACH_OBSERVER(BluetoothGattInterface::ClientObserver, \
59 *GetClientObservers(), func)
60
61 #define FOR_EACH_SERVER_OBSERVER(func) \
62 FOR_EACH_OBSERVER(BluetoothGattInterface::ServerObserver, \
63 *GetServerObservers(), func)
64
65 #define VERIFY_INTERFACE_OR_RETURN() \
66 do { \
67 if (!g_interface) { \
68 LOG(WARNING) << "Callback received while |g_interface| is NULL"; \
69 return; \
70 } \
71 } while (0)
72
RegisterClientCallback(int status,int client_if,bt_uuid_t * app_uuid)73 void RegisterClientCallback(int status, int client_if, bt_uuid_t* app_uuid) {
74 shared_lock<shared_timed_mutex> lock(g_instance_lock);
75 VLOG(2) << __func__ << " - status: " << status << " client_if: " << client_if;
76 VERIFY_INTERFACE_OR_RETURN();
77 CHECK(app_uuid);
78
79 FOR_EACH_CLIENT_OBSERVER(
80 RegisterClientCallback(g_interface, status, client_if, *app_uuid));
81 }
82
ScanResultCallback(bt_bdaddr_t * bda,int rssi,uint8_t * adv_data)83 void ScanResultCallback(bt_bdaddr_t* bda, int rssi, uint8_t* adv_data) {
84 shared_lock<shared_timed_mutex> lock(g_instance_lock);
85 VERIFY_INTERFACE_OR_RETURN();
86 CHECK(bda);
87 CHECK(adv_data);
88
89 VLOG(2) << __func__ << " - BD_ADDR: " << BtAddrString(bda)
90 << " RSSI: " << rssi;
91 FOR_EACH_CLIENT_OBSERVER(
92 ScanResultCallback(g_interface, *bda, rssi, adv_data));
93 }
94
ConnectCallback(int conn_id,int status,int client_if,bt_bdaddr_t * bda)95 void ConnectCallback(int conn_id, int status, int client_if, bt_bdaddr_t* bda) {
96 shared_lock<shared_timed_mutex> lock(g_instance_lock);
97 VERIFY_INTERFACE_OR_RETURN();
98 CHECK(bda);
99
100 VLOG(2) << __func__ << " - status: " << status
101 << " client_if: " << client_if
102 << " - BD_ADDR: " << BtAddrString(bda)
103 << " - conn_id: " << conn_id;
104
105 FOR_EACH_CLIENT_OBSERVER(
106 ConnectCallback(g_interface, conn_id, status, client_if, *bda));
107 }
108
DisconnectCallback(int conn_id,int status,int client_if,bt_bdaddr_t * bda)109 void DisconnectCallback(int conn_id, int status, int client_if,
110 bt_bdaddr_t* bda) {
111 shared_lock<shared_timed_mutex> lock(g_instance_lock);
112 VERIFY_INTERFACE_OR_RETURN();
113 CHECK(bda);
114
115 VLOG(2) << __func__ << " - conn_id: " << conn_id
116 << " - status: " << status
117 << " client_if: " << client_if
118 << " - BD_ADDR: " << BtAddrString(bda);
119 FOR_EACH_CLIENT_OBSERVER(
120 DisconnectCallback(g_interface, conn_id, status, client_if, *bda));
121 }
122
SearchCompleteCallback(int conn_id,int status)123 void SearchCompleteCallback(int conn_id, int status) {
124 shared_lock<shared_timed_mutex> lock(g_instance_lock);
125 VERIFY_INTERFACE_OR_RETURN();
126
127 VLOG(2) << __func__ << " - conn_id: " << conn_id
128 << " - status: " << status;
129 FOR_EACH_CLIENT_OBSERVER(
130 SearchCompleteCallback(g_interface, conn_id, status));
131 }
132
RegisterForNotificationCallback(int conn_id,int registered,int status,uint16_t handle)133 void RegisterForNotificationCallback(int conn_id, int registered, int status, uint16_t handle) {
134 shared_lock<shared_timed_mutex> lock(g_instance_lock);
135 VERIFY_INTERFACE_OR_RETURN();
136
137 LOG(INFO) << __func__ << " - conn_id: " << conn_id
138 << " - status: " << status
139 << " - registered: " << registered
140 << " - handle: " << handle;
141 FOR_EACH_CLIENT_OBSERVER(
142 RegisterForNotificationCallback(g_interface, conn_id, status, registered, handle));
143 }
144
NotifyCallback(int conn_id,btgatt_notify_params_t * p_data)145 void NotifyCallback(int conn_id, btgatt_notify_params_t *p_data) {
146 shared_lock<shared_timed_mutex> lock(g_instance_lock);
147 VERIFY_INTERFACE_OR_RETURN();
148
149 VLOG(2) << __func__ << " - conn_id: " << conn_id
150 << " - address: " << BtAddrString(&p_data->bda)
151 << " - handle: " << p_data->handle
152 << " - len: " << p_data->len
153 << " - is_notify: " << p_data->is_notify;
154
155 FOR_EACH_CLIENT_OBSERVER(
156 NotifyCallback(g_interface, conn_id, p_data));
157 }
158
WriteCharacteristicCallback(int conn_id,int status,uint16_t handle)159 void WriteCharacteristicCallback(int conn_id, int status, uint16_t handle) {
160 shared_lock<shared_timed_mutex> lock(g_instance_lock);
161 VERIFY_INTERFACE_OR_RETURN();
162
163 VLOG(2) << __func__ << " - conn_id: " << conn_id
164 << " - status: " << status;
165
166 FOR_EACH_CLIENT_OBSERVER(
167 WriteCharacteristicCallback(g_interface, conn_id, status, handle));
168 }
169
WriteDescriptorCallback(int conn_id,int status,uint16_t handle)170 void WriteDescriptorCallback(int conn_id, int status,
171 uint16_t handle) {
172 shared_lock<shared_timed_mutex> lock(g_instance_lock);
173 VERIFY_INTERFACE_OR_RETURN();
174
175 VLOG(2) << __func__ << " - conn_id: " << conn_id
176 << " - status: " << status;
177
178 FOR_EACH_CLIENT_OBSERVER(
179 WriteDescriptorCallback(g_interface, conn_id, status, handle));
180 }
181
ListenCallback(int status,int client_if)182 void ListenCallback(int status, int client_if) {
183 shared_lock<shared_timed_mutex> lock(g_instance_lock);
184 VLOG(2) << __func__ << " - status: " << status << " client_if: " << client_if;
185 VERIFY_INTERFACE_OR_RETURN();
186
187 FOR_EACH_CLIENT_OBSERVER(ListenCallback(g_interface, status, client_if));
188 }
189
MtuChangedCallback(int conn_id,int status,int mtu)190 void MtuChangedCallback(int conn_id, int status, int mtu) {
191 shared_lock<shared_timed_mutex> lock(g_instance_lock);
192 VERIFY_INTERFACE_OR_RETURN();
193
194 VLOG(2) << __func__ << " - conn_id: " << conn_id
195 << " status: " << status
196 << " mtu: " << mtu;
197
198 FOR_EACH_CLIENT_OBSERVER(MtuChangedCallback(g_interface, conn_id, status, mtu));
199 }
200
MultiAdvEnableCallback(int client_if,int status)201 void MultiAdvEnableCallback(int client_if, int status) {
202 shared_lock<shared_timed_mutex> lock(g_instance_lock);
203 VLOG(2) << __func__ << " - status: " << status << " client_if: " << client_if;
204 VERIFY_INTERFACE_OR_RETURN();
205
206 FOR_EACH_CLIENT_OBSERVER(
207 MultiAdvEnableCallback(g_interface, client_if, status));
208 }
209
MultiAdvUpdateCallback(int client_if,int status)210 void MultiAdvUpdateCallback(int client_if, int status) {
211 shared_lock<shared_timed_mutex> lock(g_instance_lock);
212 VLOG(2) << __func__ << " - status: " << status << " client_if: " << client_if;
213 VERIFY_INTERFACE_OR_RETURN();
214
215 FOR_EACH_CLIENT_OBSERVER(
216 MultiAdvUpdateCallback(g_interface, client_if, status));
217 }
218
MultiAdvDataCallback(int client_if,int status)219 void MultiAdvDataCallback(int client_if, int status) {
220 shared_lock<shared_timed_mutex> lock(g_instance_lock);
221 VLOG(2) << __func__ << " - status: " << status << " client_if: " << client_if;
222 VERIFY_INTERFACE_OR_RETURN();
223
224 FOR_EACH_CLIENT_OBSERVER(
225 MultiAdvDataCallback(g_interface, client_if, status));
226 }
227
MultiAdvDisableCallback(int client_if,int status)228 void MultiAdvDisableCallback(int client_if, int status) {
229 shared_lock<shared_timed_mutex> lock(g_instance_lock);
230 VLOG(2) << __func__ << " - status: " << status << " client_if: " << client_if;
231 VERIFY_INTERFACE_OR_RETURN();
232
233 FOR_EACH_CLIENT_OBSERVER(
234 MultiAdvDisableCallback(g_interface, client_if, status));
235 }
236
GetGattDbCallback(int conn_id,btgatt_db_element_t * db,int size)237 void GetGattDbCallback(int conn_id, btgatt_db_element_t *db, int size) {
238 shared_lock<shared_timed_mutex> lock(g_instance_lock);
239 VLOG(2) << __func__ << " - conn_id: " << conn_id << " size: " << size;
240 VERIFY_INTERFACE_OR_RETURN();
241
242 FOR_EACH_CLIENT_OBSERVER(
243 GetGattDbCallback(g_interface, conn_id, db, size));
244 }
245
ServicesRemovedCallback(int conn_id,uint16_t start_handle,uint16_t end_handle)246 void ServicesRemovedCallback(int conn_id, uint16_t start_handle, uint16_t end_handle) {
247 shared_lock<shared_timed_mutex> lock(g_instance_lock);
248 VLOG(2) << __func__ << " - conn_id: " << conn_id
249 << " start_handle: " << start_handle
250 << " end_handle: " << end_handle;
251 VERIFY_INTERFACE_OR_RETURN();
252
253 FOR_EACH_CLIENT_OBSERVER(
254 ServicesRemovedCallback(g_interface, conn_id, start_handle, end_handle));
255 }
256
ServicesAddedCallback(int conn_id,btgatt_db_element_t * added,int added_count)257 void ServicesAddedCallback(int conn_id, btgatt_db_element_t *added, int added_count) {
258 shared_lock<shared_timed_mutex> lock(g_instance_lock);
259 VLOG(2) << __func__ << " - conn_id: " << conn_id
260 << " added_count: " << added_count;
261 VERIFY_INTERFACE_OR_RETURN();
262
263 FOR_EACH_CLIENT_OBSERVER(
264 ServicesAddedCallback(g_interface, conn_id, added, added_count));
265 }
266
RegisterServerCallback(int status,int server_if,bt_uuid_t * app_uuid)267 void RegisterServerCallback(int status, int server_if, bt_uuid_t* app_uuid) {
268 shared_lock<shared_timed_mutex> lock(g_instance_lock);
269 VLOG(2) << __func__ << " - status: " << status << " server_if: " << server_if;
270 VERIFY_INTERFACE_OR_RETURN();
271 CHECK(app_uuid);
272
273 FOR_EACH_SERVER_OBSERVER(
274 RegisterServerCallback(g_interface, status, server_if, *app_uuid));
275 }
276
ConnectionCallback(int conn_id,int server_if,int connected,bt_bdaddr_t * bda)277 void ConnectionCallback(int conn_id, int server_if, int connected,
278 bt_bdaddr_t* bda) {
279 shared_lock<shared_timed_mutex> lock(g_instance_lock);
280 VLOG(2) << __func__ << " - conn_id: " << conn_id
281 << " server_if: " << server_if << " connected: " << connected;
282 VERIFY_INTERFACE_OR_RETURN();
283 CHECK(bda);
284
285 FOR_EACH_SERVER_OBSERVER(
286 ConnectionCallback(g_interface, conn_id, server_if, connected, *bda));
287 }
288
ServiceAddedCallback(int status,int server_if,btgatt_srvc_id_t * srvc_id,int srvc_handle)289 void ServiceAddedCallback(
290 int status,
291 int server_if,
292 btgatt_srvc_id_t* srvc_id,
293 int srvc_handle) {
294 shared_lock<shared_timed_mutex> lock(g_instance_lock);
295 VLOG(2) << __func__ << " - status: " << status << " server_if: " << server_if
296 << " handle: " << srvc_handle;
297 VERIFY_INTERFACE_OR_RETURN();
298 CHECK(srvc_id);
299
300 FOR_EACH_SERVER_OBSERVER(ServiceAddedCallback(
301 g_interface, status, server_if, *srvc_id, srvc_handle));
302 }
303
CharacteristicAddedCallback(int status,int server_if,bt_uuid_t * uuid,int srvc_handle,int char_handle)304 void CharacteristicAddedCallback(
305 int status, int server_if,
306 bt_uuid_t* uuid,
307 int srvc_handle,
308 int char_handle) {
309 shared_lock<shared_timed_mutex> lock(g_instance_lock);
310 VLOG(2) << __func__ << " - status: " << status << " server_if: " << server_if
311 << " srvc_handle: " << srvc_handle << " char_handle: " << char_handle;
312 VERIFY_INTERFACE_OR_RETURN();
313 CHECK(uuid);
314
315 FOR_EACH_SERVER_OBSERVER(CharacteristicAddedCallback(
316 g_interface, status, server_if, *uuid, srvc_handle, char_handle));
317 }
318
DescriptorAddedCallback(int status,int server_if,bt_uuid_t * uuid,int srvc_handle,int desc_handle)319 void DescriptorAddedCallback(
320 int status, int server_if,
321 bt_uuid_t* uuid,
322 int srvc_handle,
323 int desc_handle) {
324 shared_lock<shared_timed_mutex> lock(g_instance_lock);
325 VLOG(2) << __func__ << " - status: " << status << " server_if: " << server_if
326 << " srvc_handle: " << srvc_handle << " desc_handle: " << desc_handle;
327 VERIFY_INTERFACE_OR_RETURN();
328 CHECK(uuid);
329
330 FOR_EACH_SERVER_OBSERVER(DescriptorAddedCallback(
331 g_interface, status, server_if, *uuid, srvc_handle, desc_handle));
332 }
333
ServiceStartedCallback(int status,int server_if,int srvc_handle)334 void ServiceStartedCallback(int status, int server_if, int srvc_handle) {
335 shared_lock<shared_timed_mutex> lock(g_instance_lock);
336 VLOG(2) << __func__ << " - status: " << status << " server_if: " << server_if
337 << " handle: " << srvc_handle;
338 VERIFY_INTERFACE_OR_RETURN();
339
340 FOR_EACH_SERVER_OBSERVER(ServiceStartedCallback(
341 g_interface, status, server_if, srvc_handle));
342 }
343
ServiceStoppedCallback(int status,int server_if,int srvc_handle)344 void ServiceStoppedCallback(int status, int server_if, int srvc_handle) {
345 shared_lock<shared_timed_mutex> lock(g_instance_lock);
346 VLOG(2) << __func__ << " - status: " << status << " server_if: " << server_if
347 << " handle: " << srvc_handle;
348 VERIFY_INTERFACE_OR_RETURN();
349
350 FOR_EACH_SERVER_OBSERVER(ServiceStoppedCallback(
351 g_interface, status, server_if, srvc_handle));
352 }
353
ServiceDeletedCallback(int status,int server_if,int srvc_handle)354 void ServiceDeletedCallback(int status, int server_if, int srvc_handle) {
355 shared_lock<shared_timed_mutex> lock(g_instance_lock);
356 VLOG(2) << __func__ << " - status: " << status << " server_if: " << server_if
357 << " handle: " << srvc_handle;
358 VERIFY_INTERFACE_OR_RETURN();
359
360 FOR_EACH_SERVER_OBSERVER(ServiceDeletedCallback(
361 g_interface, status, server_if, srvc_handle));
362 }
363
RequestReadCallback(int conn_id,int trans_id,bt_bdaddr_t * bda,int attr_handle,int offset,bool is_long)364 void RequestReadCallback(int conn_id, int trans_id, bt_bdaddr_t* bda,
365 int attr_handle, int offset, bool is_long) {
366 shared_lock<shared_timed_mutex> lock(g_instance_lock);
367 VLOG(2) << __func__ << " - conn_id: " << conn_id << " trans_id: " << trans_id
368 << " attr_handle: " << attr_handle << " offset: " << offset
369 << " is_long: " << is_long;
370 VERIFY_INTERFACE_OR_RETURN();
371 CHECK(bda);
372
373 FOR_EACH_SERVER_OBSERVER(RequestReadCallback(
374 g_interface, conn_id, trans_id, *bda, attr_handle, offset, is_long));
375 }
376
RequestWriteCallback(int conn_id,int trans_id,bt_bdaddr_t * bda,int attr_handle,int offset,int length,bool need_rsp,bool is_prep,uint8_t * value)377 void RequestWriteCallback(int conn_id, int trans_id,
378 bt_bdaddr_t* bda,
379 int attr_handle, int offset, int length,
380 bool need_rsp, bool is_prep, uint8_t* value) {
381 shared_lock<shared_timed_mutex> lock(g_instance_lock);
382 VLOG(2) << __func__ << " - conn_id: " << conn_id << " trans_id: " << trans_id
383 << " attr_handle: " << attr_handle << " offset: " << offset
384 << " length: " << length << " need_rsp: " << need_rsp
385 << " is_prep: " << is_prep;
386 VERIFY_INTERFACE_OR_RETURN();
387 CHECK(bda);
388
389 FOR_EACH_SERVER_OBSERVER(RequestWriteCallback(
390 g_interface, conn_id, trans_id, *bda, attr_handle, offset, length,
391 need_rsp, is_prep, value));
392 }
393
RequestExecWriteCallback(int conn_id,int trans_id,bt_bdaddr_t * bda,int exec_write)394 void RequestExecWriteCallback(int conn_id, int trans_id,
395 bt_bdaddr_t* bda, int exec_write) {
396 shared_lock<shared_timed_mutex> lock(g_instance_lock);
397 VLOG(2) << __func__ << " - conn_id: " << conn_id << " trans_id: " << trans_id
398 << " exec_write: " << exec_write;
399 VERIFY_INTERFACE_OR_RETURN();
400 CHECK(bda);
401
402 FOR_EACH_SERVER_OBSERVER(RequestExecWriteCallback(
403 g_interface, conn_id, trans_id, *bda, exec_write));
404 }
405
ResponseConfirmationCallback(int status,int handle)406 void ResponseConfirmationCallback(int status, int handle) {
407 shared_lock<shared_timed_mutex> lock(g_instance_lock);
408 VLOG(2) << __func__ << " - status: " << status << " handle: " << handle;
409 VERIFY_INTERFACE_OR_RETURN();
410
411 FOR_EACH_SERVER_OBSERVER(ResponseConfirmationCallback(
412 g_interface, status, handle));
413 }
414
IndicationSentCallback(int conn_id,int status)415 void IndicationSentCallback(int conn_id, int status) {
416 shared_lock<shared_timed_mutex> lock(g_instance_lock);
417 VLOG(2) << __func__ << " - conn_id: " << conn_id << " status: " << status;
418 VERIFY_INTERFACE_OR_RETURN();
419
420 FOR_EACH_SERVER_OBSERVER(IndicationSentCallback(
421 g_interface, conn_id, status));
422 }
423
MtuChangedCallback(int conn_id,int mtu)424 void MtuChangedCallback(int conn_id, int mtu) {
425 shared_lock<shared_timed_mutex> lock(g_instance_lock);
426 VLOG(2) << __func__ << " - conn_id: " << conn_id << " mtu: " << mtu;
427 VERIFY_INTERFACE_OR_RETURN();
428
429 FOR_EACH_SERVER_OBSERVER(MtuChangedCallback(g_interface, conn_id, mtu));
430 }
431
432 // The HAL Bluetooth GATT client interface callbacks. These signal a mixture of
433 // GATT client-role and GAP events.
434 const btgatt_client_callbacks_t gatt_client_callbacks = {
435 RegisterClientCallback,
436 ScanResultCallback,
437 ConnectCallback,
438 DisconnectCallback,
439 SearchCompleteCallback,
440 RegisterForNotificationCallback,
441 NotifyCallback,
442 nullptr, // read_characteristic_cb
443 WriteCharacteristicCallback,
444 nullptr, // read_descriptor_cb
445 WriteDescriptorCallback,
446 nullptr, // execute_write_cb
447 nullptr, // read_remote_rssi_cb
448 ListenCallback,
449 MtuChangedCallback,
450 nullptr, // scan_filter_cfg_cb
451 nullptr, // scan_filter_param_cb
452 nullptr, // scan_filter_status_cb
453 MultiAdvEnableCallback,
454 MultiAdvUpdateCallback,
455 MultiAdvDataCallback,
456 MultiAdvDisableCallback,
457 nullptr, // congestion_cb
458 nullptr, // batchscan_cfg_storage_cb
459 nullptr, // batchscan_enb_disable_cb
460 nullptr, // batchscan_reports_cb
461 nullptr, // batchscan_threshold_cb
462 nullptr, // track_adv_event_cb
463 nullptr, // scan_parameter_setup_completed_cb
464 GetGattDbCallback,
465 ServicesRemovedCallback,
466 ServicesAddedCallback,
467 };
468
469 const btgatt_server_callbacks_t gatt_server_callbacks = {
470 RegisterServerCallback,
471 ConnectionCallback,
472 ServiceAddedCallback,
473 nullptr, // included_service_added_cb
474 CharacteristicAddedCallback,
475 DescriptorAddedCallback,
476 ServiceStartedCallback,
477 ServiceStoppedCallback,
478 ServiceDeletedCallback,
479 RequestReadCallback,
480 RequestWriteCallback,
481 RequestExecWriteCallback,
482 ResponseConfirmationCallback,
483 IndicationSentCallback,
484 nullptr, // congestion_cb
485 MtuChangedCallback,
486 };
487
488 const btgatt_callbacks_t gatt_callbacks = {
489 sizeof(btgatt_callbacks_t),
490 &gatt_client_callbacks,
491 &gatt_server_callbacks
492 };
493
494 } // namespace
495
496 // BluetoothGattInterface implementation for production.
497 class BluetoothGattInterfaceImpl : public BluetoothGattInterface {
498 public:
BluetoothGattInterfaceImpl()499 BluetoothGattInterfaceImpl() : hal_iface_(nullptr) {
500 }
501
~BluetoothGattInterfaceImpl()502 ~BluetoothGattInterfaceImpl() override {
503 if (hal_iface_)
504 hal_iface_->cleanup();
505 }
506
507 // BluetoothGattInterface overrides:
AddClientObserver(ClientObserver * observer)508 void AddClientObserver(ClientObserver* observer) override {
509 client_observers_.AddObserver(observer);
510 }
511
RemoveClientObserver(ClientObserver * observer)512 void RemoveClientObserver(ClientObserver* observer) override {
513 client_observers_.RemoveObserver(observer);
514 }
515
AddServerObserver(ServerObserver * observer)516 void AddServerObserver(ServerObserver* observer) override {
517 server_observers_.AddObserver(observer);
518 }
519
RemoveServerObserver(ServerObserver * observer)520 void RemoveServerObserver(ServerObserver* observer) override {
521 server_observers_.RemoveObserver(observer);
522 }
523
GetClientHALInterface() const524 const btgatt_client_interface_t* GetClientHALInterface() const override {
525 return hal_iface_->client;
526 }
527
GetServerHALInterface() const528 const btgatt_server_interface_t* GetServerHALInterface() const override {
529 return hal_iface_->server;
530 }
531
532 // Initialize the interface.
Initialize()533 bool Initialize() {
534 const bt_interface_t* bt_iface =
535 BluetoothInterface::Get()->GetHALInterface();
536 CHECK(bt_iface);
537
538 const btgatt_interface_t* gatt_iface =
539 reinterpret_cast<const btgatt_interface_t*>(
540 bt_iface->get_profile_interface(BT_PROFILE_GATT_ID));
541 if (!gatt_iface) {
542 LOG(ERROR) << "Failed to obtain HAL GATT interface handle";
543 return false;
544 }
545
546 bt_status_t status = gatt_iface->init(&gatt_callbacks);
547 if (status != BT_STATUS_SUCCESS) {
548 LOG(ERROR) << "Failed to initialize HAL GATT interface";
549 return false;
550 }
551
552 hal_iface_ = gatt_iface;
553
554 return true;
555 }
556
client_observers()557 base::ObserverList<ClientObserver>* client_observers() {
558 return &client_observers_;
559 }
560
server_observers()561 base::ObserverList<ServerObserver>* server_observers() {
562 return &server_observers_;
563 }
564
565 private:
566 // List of observers that are interested in notifications from us.
567 // We're not using a base::ObserverListThreadSafe, which it posts observer
568 // events automatically on the origin threads, as we want to avoid that
569 // overhead and simply forward the events to the upper layer.
570 base::ObserverList<ClientObserver> client_observers_;
571 base::ObserverList<ServerObserver> server_observers_;
572
573 // The HAL handle obtained from the shared library. We hold a weak reference
574 // to this since the actual data resides in the shared Bluetooth library.
575 const btgatt_interface_t* hal_iface_;
576
577 DISALLOW_COPY_AND_ASSIGN(BluetoothGattInterfaceImpl);
578 };
579
580 namespace {
581
582 base::ObserverList<BluetoothGattInterface::ClientObserver>*
GetClientObservers()583 GetClientObservers() {
584 CHECK(g_interface);
585 return static_cast<BluetoothGattInterfaceImpl*>(
586 g_interface)->client_observers();
587 }
588
589 base::ObserverList<BluetoothGattInterface::ServerObserver>*
GetServerObservers()590 GetServerObservers() {
591 CHECK(g_interface);
592 return static_cast<BluetoothGattInterfaceImpl*>(
593 g_interface)->server_observers();
594 }
595
596 } // namespace
597
598 // Default observer implementations. These are provided so that the methods
599 // themselves are optional.
RegisterClientCallback(BluetoothGattInterface *,int,int,const bt_uuid_t &)600 void BluetoothGattInterface::ClientObserver::RegisterClientCallback(
601 BluetoothGattInterface* /* gatt_iface */,
602 int /* status */,
603 int /* client_if */,
604 const bt_uuid_t& /* app_uuid */) {
605 // Do nothing.
606 }
ScanResultCallback(BluetoothGattInterface *,const bt_bdaddr_t &,int,uint8_t *)607 void BluetoothGattInterface::ClientObserver::ScanResultCallback(
608 BluetoothGattInterface* /* gatt_iface */,
609 const bt_bdaddr_t& /* bda */,
610 int /* rssi */,
611 uint8_t* /* adv_data */) {
612 // Do Nothing.
613 }
614
ConnectCallback(BluetoothGattInterface *,int,int,int,const bt_bdaddr_t &)615 void BluetoothGattInterface::ClientObserver::ConnectCallback(
616 BluetoothGattInterface* /* gatt_iface */,
617 int /* conn_id */,
618 int /* status */,
619 int /* client_if */,
620 const bt_bdaddr_t& /* bda */) {
621 // Do nothing
622 }
623
DisconnectCallback(BluetoothGattInterface *,int,int,int,const bt_bdaddr_t &)624 void BluetoothGattInterface::ClientObserver::DisconnectCallback(
625 BluetoothGattInterface* /* gatt_iface */,
626 int /* conn_id */,
627 int /* status */,
628 int /* client_if */,
629 const bt_bdaddr_t& /* bda */) {
630 // Do nothing
631 }
632
SearchCompleteCallback(BluetoothGattInterface *,int,int)633 void BluetoothGattInterface::ClientObserver::SearchCompleteCallback(
634 BluetoothGattInterface* /* gatt_iface */,
635 int /* conn_id */,
636 int /* status */) {
637 // Do nothing
638 }
639
RegisterForNotificationCallback(BluetoothGattInterface *,int,int,int,uint16_t)640 void BluetoothGattInterface::ClientObserver::RegisterForNotificationCallback(
641 BluetoothGattInterface* /* gatt_iface */,
642 int /* conn_id */,
643 int /* status */,
644 int /* registered */,
645 uint16_t /* handle */) {
646 // Do nothing
647 }
648
NotifyCallback(BluetoothGattInterface *,int,btgatt_notify_params_t *)649 void BluetoothGattInterface::ClientObserver::NotifyCallback(
650 BluetoothGattInterface* /* gatt_iface */,
651 int /* conn_id */,
652 btgatt_notify_params_t* /* p_data */) {
653 // Do nothing
654 }
655
WriteCharacteristicCallback(BluetoothGattInterface *,int,int,uint16_t)656 void BluetoothGattInterface::ClientObserver::WriteCharacteristicCallback(
657 BluetoothGattInterface* /* gatt_iface */,
658 int /* conn_id */,
659 int /* status */,
660 uint16_t /* handle */) {
661 // Do nothing
662 }
663
WriteDescriptorCallback(BluetoothGattInterface *,int,int,uint16_t)664 void BluetoothGattInterface::ClientObserver::WriteDescriptorCallback(
665 BluetoothGattInterface* /* gatt_iface */,
666 int /* conn_id */,
667 int /* status */,
668 uint16_t /* handle */) {
669 // Do nothing
670 }
671
ListenCallback(BluetoothGattInterface *,int,int)672 void BluetoothGattInterface::ClientObserver::ListenCallback(
673 BluetoothGattInterface* /* gatt_iface */,
674 int /* status */,
675 int /* client_if */) {
676 // Do nothing.
677 }
678
MtuChangedCallback(BluetoothGattInterface *,int,int,int)679 void BluetoothGattInterface::ClientObserver::MtuChangedCallback(
680 BluetoothGattInterface* /* gatt_iface */,
681 int /* conn_id */,
682 int /* statis*/,
683 int /* mtu */) {
684 // Do nothing.
685 }
686
MultiAdvEnableCallback(BluetoothGattInterface *,int,int)687 void BluetoothGattInterface::ClientObserver::MultiAdvEnableCallback(
688 BluetoothGattInterface* /* gatt_iface */,
689 int /* status */,
690 int /* client_if */) {
691 // Do nothing.
692 }
MultiAdvUpdateCallback(BluetoothGattInterface *,int,int)693 void BluetoothGattInterface::ClientObserver::MultiAdvUpdateCallback(
694 BluetoothGattInterface* /* gatt_iface */,
695 int /* status */,
696 int /* client_if */) {
697 // Do nothing.
698 }
MultiAdvDataCallback(BluetoothGattInterface *,int,int)699 void BluetoothGattInterface::ClientObserver::MultiAdvDataCallback(
700 BluetoothGattInterface* /* gatt_iface */,
701 int /* status */,
702 int /* client_if */) {
703 // Do nothing.
704 }
MultiAdvDisableCallback(BluetoothGattInterface *,int,int)705 void BluetoothGattInterface::ClientObserver::MultiAdvDisableCallback(
706 BluetoothGattInterface* /* gatt_iface */,
707 int /* status */,
708 int /* client_if */) {
709 // Do nothing.
710 }
711
GetGattDbCallback(BluetoothGattInterface *,int,btgatt_db_element_t *,int)712 void BluetoothGattInterface::ClientObserver::GetGattDbCallback(
713 BluetoothGattInterface* /* gatt_iface */,
714 int /* conn_id */,
715 btgatt_db_element_t* /* gatt_db */,
716 int /* size */) {
717 // Do nothing.
718 }
719
ServicesRemovedCallback(BluetoothGattInterface *,int,uint16_t,uint16_t)720 void BluetoothGattInterface::ClientObserver::ServicesRemovedCallback(
721 BluetoothGattInterface* /* gatt_iface */,
722 int /* conn_id */,
723 uint16_t /* start_handle */,
724 uint16_t /* end_handle */) {
725 // Do nothing.
726 }
727
ServicesAddedCallback(BluetoothGattInterface *,int,btgatt_db_element_t *,int)728 void BluetoothGattInterface::ClientObserver::ServicesAddedCallback(
729 BluetoothGattInterface* /* gatt_iface */,
730 int /* conn_id */,
731 btgatt_db_element_t* /* added */,
732 int /* added_count */) {
733 // Do nothing.
734 }
735
RegisterServerCallback(BluetoothGattInterface *,int,int,const bt_uuid_t &)736 void BluetoothGattInterface::ServerObserver::RegisterServerCallback(
737 BluetoothGattInterface* /* gatt_iface */,
738 int /* status */,
739 int /* server_if */,
740 const bt_uuid_t& /* app_uuid */) {
741 // Do nothing.
742 }
743
ConnectionCallback(BluetoothGattInterface *,int,int,int,const bt_bdaddr_t &)744 void BluetoothGattInterface::ServerObserver::ConnectionCallback(
745 BluetoothGattInterface* /* gatt_iface */,
746 int /* conn_id */,
747 int /* server_if */,
748 int /* connected */,
749 const bt_bdaddr_t& /* bda */) {
750 // Do nothing.
751 }
752
ServiceAddedCallback(BluetoothGattInterface *,int,int,const btgatt_srvc_id_t &,int)753 void BluetoothGattInterface::ServerObserver::ServiceAddedCallback(
754 BluetoothGattInterface* /* gatt_iface */,
755 int /* status */,
756 int /* server_if */,
757 const btgatt_srvc_id_t& /* srvc_id */,
758 int /* srvc_handle */) {
759 // Do nothing.
760 }
761
CharacteristicAddedCallback(BluetoothGattInterface *,int,int,const bt_uuid_t &,int,int)762 void BluetoothGattInterface::ServerObserver::CharacteristicAddedCallback(
763 BluetoothGattInterface* /* gatt_iface */,
764 int /* status */,
765 int /* server_if */,
766 const bt_uuid_t& /* uuid */,
767 int /* srvc_handle */,
768 int /* char_handle */) {
769 // Do nothing.
770 }
771
DescriptorAddedCallback(BluetoothGattInterface *,int,int,const bt_uuid_t &,int,int)772 void BluetoothGattInterface::ServerObserver::DescriptorAddedCallback(
773 BluetoothGattInterface* /* gatt_iface */,
774 int /* status */,
775 int /* server_if */,
776 const bt_uuid_t& /* uuid */,
777 int /* srvc_handle */,
778 int /* desc_handle */) {
779 // Do nothing.
780 }
781
ServiceStartedCallback(BluetoothGattInterface *,int,int,int)782 void BluetoothGattInterface::ServerObserver::ServiceStartedCallback(
783 BluetoothGattInterface* /* gatt_iface */,
784 int /* status */,
785 int /* server_if */,
786 int /* srvc_handle */) {
787 // Do nothing.
788 }
789
ServiceStoppedCallback(BluetoothGattInterface *,int,int,int)790 void BluetoothGattInterface::ServerObserver::ServiceStoppedCallback(
791 BluetoothGattInterface* /* gatt_iface */,
792 int /* status */,
793 int /* server_if */,
794 int /* srvc_handle */) {
795 // Do nothing.
796 }
797
ServiceDeletedCallback(BluetoothGattInterface *,int,int,int)798 void BluetoothGattInterface::ServerObserver::ServiceDeletedCallback(
799 BluetoothGattInterface* /* gatt_iface */,
800 int /* status */,
801 int /* server_if */,
802 int /* srvc_handle */) {
803 // Do nothing.
804 }
805
RequestReadCallback(BluetoothGattInterface *,int,int,const bt_bdaddr_t &,int,int,bool)806 void BluetoothGattInterface::ServerObserver::RequestReadCallback(
807 BluetoothGattInterface* /* gatt_iface */,
808 int /* conn_id */,
809 int /* trans_id */,
810 const bt_bdaddr_t& /* bda */,
811 int /* attr_handle */,
812 int /* offset */,
813 bool /* is_long */) {
814 // Do nothing.
815 }
816
RequestWriteCallback(BluetoothGattInterface *,int,int,const bt_bdaddr_t &,int,int,int,bool,bool,uint8_t *)817 void BluetoothGattInterface::ServerObserver::RequestWriteCallback(
818 BluetoothGattInterface* /* gatt_iface */,
819 int /* conn_id */,
820 int /* trans_id */,
821 const bt_bdaddr_t& /* bda */,
822 int /* attr_handle */,
823 int /* offset */,
824 int /* length */,
825 bool /* need_rsp */,
826 bool /* is_prep */,
827 uint8_t* /* value */) {
828 // Do nothing.
829 }
830
RequestExecWriteCallback(BluetoothGattInterface *,int,int,const bt_bdaddr_t &,int)831 void BluetoothGattInterface::ServerObserver::RequestExecWriteCallback(
832 BluetoothGattInterface* /* gatt_iface */,
833 int /* conn_id */,
834 int /* trans_id */,
835 const bt_bdaddr_t& /* bda */,
836 int /* exec_write */) {
837 // Do nothing.
838 }
839
ResponseConfirmationCallback(BluetoothGattInterface *,int,int)840 void BluetoothGattInterface::ServerObserver::ResponseConfirmationCallback(
841 BluetoothGattInterface* /* gatt_iface */,
842 int /* status */,
843 int /* handle */) {
844 // Do nothing
845 }
846
IndicationSentCallback(BluetoothGattInterface *,int,int)847 void BluetoothGattInterface::ServerObserver::IndicationSentCallback(
848 BluetoothGattInterface* /* gatt_iface */,
849 int /* conn_id */,
850 int /* status */) {
851 // Do nothing.
852 }
853
MtuChangedCallback(BluetoothGattInterface *,int,int)854 void BluetoothGattInterface::ServerObserver::MtuChangedCallback(
855 BluetoothGattInterface* /* gatt_iface */,
856 int /* conn_id */,
857 int /* mtu */) {
858 // Do nothing.
859 }
860
861 // static
Initialize()862 bool BluetoothGattInterface::Initialize() {
863 unique_lock<shared_timed_mutex> lock(g_instance_lock);
864 CHECK(!g_interface);
865
866 std::unique_ptr<BluetoothGattInterfaceImpl> impl(
867 new BluetoothGattInterfaceImpl());
868 if (!impl->Initialize()) {
869 LOG(ERROR) << "Failed to initialize BluetoothGattInterface";
870 return false;
871 }
872
873 g_interface = impl.release();
874
875 return true;
876 }
877
878 // static
CleanUp()879 void BluetoothGattInterface::CleanUp() {
880 unique_lock<shared_timed_mutex> lock(g_instance_lock);
881 CHECK(g_interface);
882
883 delete g_interface;
884 g_interface = nullptr;
885 }
886
887 // static
IsInitialized()888 bool BluetoothGattInterface::IsInitialized() {
889 shared_lock<shared_timed_mutex> lock(g_instance_lock);
890
891 return g_interface != nullptr;
892 }
893
894 // static
Get()895 BluetoothGattInterface* BluetoothGattInterface::Get() {
896 shared_lock<shared_timed_mutex> lock(g_instance_lock);
897 CHECK(g_interface);
898 return g_interface;
899 }
900
901 // static
InitializeForTesting(BluetoothGattInterface * test_instance)902 void BluetoothGattInterface::InitializeForTesting(
903 BluetoothGattInterface* test_instance) {
904 unique_lock<shared_timed_mutex> lock(g_instance_lock);
905 CHECK(test_instance);
906 CHECK(!g_interface);
907
908 g_interface = test_instance;
909 }
910
StartScan(int client_id)911 bt_status_t BluetoothGattInterface::StartScan(int client_id) {
912 lock_guard<mutex> lock(scan_clients_lock_);
913
914 // Scan already initiated for this client.
915 if (scan_client_set_.find(client_id) != scan_client_set_.end()) {
916 // Assume starting scan multiple times is not error, but warn user.
917 LOG(WARNING) << "Scan already initiated for client";
918 return BT_STATUS_SUCCESS;
919 }
920
921 // If this is the first scan client, then make a call into the stack. We
922 // only do this when the reference count changes to or from 0.
923 if (scan_client_set_.empty()) {
924 bt_status_t status = GetClientHALInterface()->scan(true);
925 if (status != BT_STATUS_SUCCESS) {
926 LOG(ERROR) << "HAL call to scan failed";
927 return status;
928 }
929 }
930
931 scan_client_set_.insert(client_id);
932
933 return BT_STATUS_SUCCESS;
934 }
935
StopScan(int client_id)936 bt_status_t BluetoothGattInterface::StopScan(int client_id) {
937 lock_guard<mutex> lock(scan_clients_lock_);
938
939 // Scan not initiated for this client.
940 auto iter = scan_client_set_.find(client_id);
941 if (iter == scan_client_set_.end()) {
942 // Assume stopping scan multiple times is not error, but warn user.
943 LOG(WARNING) << "Scan already stopped or not initiated for client";
944 return BT_STATUS_SUCCESS;
945 }
946
947 if (scan_client_set_.size() == 1) {
948 bt_status_t status = GetClientHALInterface()->scan(false);
949 if (status != BT_STATUS_SUCCESS) {
950 LOG(ERROR) << "HAL call to stop scan failed";
951 return status;
952 }
953 }
954
955 scan_client_set_.erase(iter);
956 return BT_STATUS_SUCCESS;
957 }
958
959 } // namespace hal
960 } // namespace bluetooth
961