• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  *  Copyright 2009-2012 Broadcom Corporation
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 
19 /*******************************************************************************
20  *
21  *  Filename:      bluetooth.c
22  *
23  *  Description:   Bluetooth HAL implementation
24  *
25  ******************************************************************************/
26 
27 #define LOG_TAG "bt_btif"
28 
29 #include <base/logging.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <string.h>
33 #include <unistd.h>
34 
35 #include <hardware/bluetooth.h>
36 #include <hardware/bluetooth_headset_interface.h>
37 #include <hardware/bt_av.h>
38 #include <hardware/bt_gatt.h>
39 #include <hardware/bt_hd.h>
40 #include <hardware/bt_hearing_aid.h>
41 #include <hardware/bt_hf_client.h>
42 #include <hardware/bt_hh.h>
43 #include <hardware/bt_hl.h>
44 #include <hardware/bt_mce.h>
45 #include <hardware/bt_pan.h>
46 #include <hardware/bt_rc.h>
47 #include <hardware/bt_sdp.h>
48 #include <hardware/bt_sock.h>
49 
50 #include "avrcp_service.h"
51 #include "bt_utils.h"
52 #include "bta/include/bta_hearing_aid_api.h"
53 #include "bta/include/bta_hf_client_api.h"
54 #include "btif_a2dp.h"
55 #include "btif_api.h"
56 #include "btif_av.h"
57 #include "btif_config.h"
58 #include "btif_debug.h"
59 #include "btif_debug_btsnoop.h"
60 #include "btif_debug_conn.h"
61 #include "btif_hf.h"
62 #include "btif_storage.h"
63 #include "btsnoop.h"
64 #include "btsnoop_mem.h"
65 #include "device/include/interop.h"
66 #include "osi/include/alarm.h"
67 #include "osi/include/allocation_tracker.h"
68 #include "osi/include/log.h"
69 #include "osi/include/metrics.h"
70 #include "osi/include/osi.h"
71 #include "osi/include/wakelock.h"
72 #include "stack_manager.h"
73 
74 /* Test interface includes */
75 #include "mca_api.h"
76 
77 using bluetooth::hearing_aid::HearingAidInterface;
78 
79 /*******************************************************************************
80  *  Static variables
81  ******************************************************************************/
82 
83 bt_callbacks_t* bt_hal_cbacks = NULL;
84 bool restricted_mode = false;
85 
86 /*******************************************************************************
87  *  Externs
88  ******************************************************************************/
89 
90 /* list all extended interfaces here */
91 
92 /* handsfree profile - client */
93 extern const bthf_client_interface_t* btif_hf_client_get_interface();
94 /* advanced audio profile */
95 extern const btav_source_interface_t* btif_av_get_src_interface();
96 extern const btav_sink_interface_t* btif_av_get_sink_interface();
97 /*rfc l2cap*/
98 extern const btsock_interface_t* btif_sock_get_interface();
99 /* hid host profile */
100 extern const bthh_interface_t* btif_hh_get_interface();
101 /* hid device profile */
102 extern const bthd_interface_t* btif_hd_get_interface();
103 /* health device profile */
104 extern const bthl_interface_t* btif_hl_get_interface();
105 /*pan*/
106 extern const btpan_interface_t* btif_pan_get_interface();
107 /*map client*/
108 extern const btmce_interface_t* btif_mce_get_interface();
109 /* gatt */
110 extern const btgatt_interface_t* btif_gatt_get_interface();
111 /* avrc target */
112 extern const btrc_interface_t* btif_rc_get_interface();
113 /* avrc controller */
114 extern const btrc_ctrl_interface_t* btif_rc_ctrl_get_interface();
115 /*SDP search client*/
116 extern const btsdp_interface_t* btif_sdp_get_interface();
117 /*Hearing Aid client*/
118 extern HearingAidInterface* btif_hearing_aid_get_interface();
119 
120 /* List all test interface here */
121 extern const btmcap_test_interface_t* stack_mcap_get_interface();
122 
123 /*******************************************************************************
124  *  Functions
125  ******************************************************************************/
126 
interface_ready(void)127 static bool interface_ready(void) { return bt_hal_cbacks != NULL; }
128 
is_profile(const char * p1,const char * p2)129 static bool is_profile(const char* p1, const char* p2) {
130   CHECK(p1);
131   CHECK(p2);
132   return strlen(p1) == strlen(p2) && strncmp(p1, p2, strlen(p2)) == 0;
133 }
134 
135 /*****************************************************************************
136  *
137  *   BLUETOOTH HAL INTERFACE FUNCTIONS
138  *
139  ****************************************************************************/
140 
init(bt_callbacks_t * callbacks)141 static int init(bt_callbacks_t* callbacks) {
142   LOG_INFO(LOG_TAG, "%s", __func__);
143 
144   if (interface_ready()) return BT_STATUS_DONE;
145 
146 #ifdef BLUEDROID_DEBUG
147   allocation_tracker_init();
148 #endif
149 
150   bt_hal_cbacks = callbacks;
151   stack_manager_get_interface()->init_stack();
152   btif_debug_init();
153   return BT_STATUS_SUCCESS;
154 }
155 
enable(bool start_restricted)156 static int enable(bool start_restricted) {
157   LOG_INFO(LOG_TAG, "%s: start restricted = %d", __func__, start_restricted);
158 
159   restricted_mode = start_restricted;
160 
161   if (!interface_ready()) return BT_STATUS_NOT_READY;
162 
163   stack_manager_get_interface()->start_up_stack_async();
164   return BT_STATUS_SUCCESS;
165 }
166 
disable(void)167 static int disable(void) {
168   if (!interface_ready()) return BT_STATUS_NOT_READY;
169 
170   stack_manager_get_interface()->shut_down_stack_async();
171   return BT_STATUS_SUCCESS;
172 }
173 
cleanup(void)174 static void cleanup(void) { stack_manager_get_interface()->clean_up_stack(); }
175 
is_restricted_mode()176 bool is_restricted_mode() { return restricted_mode; }
177 
get_adapter_properties(void)178 static int get_adapter_properties(void) {
179   /* sanity check */
180   if (!interface_ready()) return BT_STATUS_NOT_READY;
181 
182   return btif_get_adapter_properties();
183 }
184 
get_adapter_property(bt_property_type_t type)185 static int get_adapter_property(bt_property_type_t type) {
186   /* sanity check */
187   if (!interface_ready()) return BT_STATUS_NOT_READY;
188 
189   return btif_get_adapter_property(type);
190 }
191 
set_adapter_property(const bt_property_t * property)192 static int set_adapter_property(const bt_property_t* property) {
193   /* sanity check */
194   if (!interface_ready()) return BT_STATUS_NOT_READY;
195 
196   return btif_set_adapter_property(property);
197 }
198 
get_remote_device_properties(RawAddress * remote_addr)199 int get_remote_device_properties(RawAddress* remote_addr) {
200   /* sanity check */
201   if (!interface_ready()) return BT_STATUS_NOT_READY;
202 
203   return btif_get_remote_device_properties(remote_addr);
204 }
205 
get_remote_device_property(RawAddress * remote_addr,bt_property_type_t type)206 int get_remote_device_property(RawAddress* remote_addr,
207                                bt_property_type_t type) {
208   /* sanity check */
209   if (!interface_ready()) return BT_STATUS_NOT_READY;
210 
211   return btif_get_remote_device_property(remote_addr, type);
212 }
213 
set_remote_device_property(RawAddress * remote_addr,const bt_property_t * property)214 int set_remote_device_property(RawAddress* remote_addr,
215                                const bt_property_t* property) {
216   /* sanity check */
217   if (!interface_ready()) return BT_STATUS_NOT_READY;
218 
219   return btif_set_remote_device_property(remote_addr, property);
220 }
221 
get_remote_service_record(const RawAddress & remote_addr,const bluetooth::Uuid & uuid)222 int get_remote_service_record(const RawAddress& remote_addr,
223                               const bluetooth::Uuid& uuid) {
224   /* sanity check */
225   if (!interface_ready()) return BT_STATUS_NOT_READY;
226 
227   return btif_get_remote_service_record(remote_addr, uuid);
228 }
229 
get_remote_services(RawAddress * remote_addr)230 int get_remote_services(RawAddress* remote_addr) {
231   /* sanity check */
232   if (!interface_ready()) return BT_STATUS_NOT_READY;
233 
234   return btif_dm_get_remote_services(*remote_addr);
235 }
236 
start_discovery(void)237 static int start_discovery(void) {
238   /* sanity check */
239   if (!interface_ready()) return BT_STATUS_NOT_READY;
240 
241   return btif_dm_start_discovery();
242 }
243 
cancel_discovery(void)244 static int cancel_discovery(void) {
245   /* sanity check */
246   if (!interface_ready()) return BT_STATUS_NOT_READY;
247 
248   return btif_dm_cancel_discovery();
249 }
250 
create_bond(const RawAddress * bd_addr,int transport)251 static int create_bond(const RawAddress* bd_addr, int transport) {
252   /* sanity check */
253   if (!interface_ready()) return BT_STATUS_NOT_READY;
254 
255   return btif_dm_create_bond(bd_addr, transport);
256 }
257 
create_bond_out_of_band(const RawAddress * bd_addr,int transport,const bt_out_of_band_data_t * oob_data)258 static int create_bond_out_of_band(const RawAddress* bd_addr, int transport,
259                                    const bt_out_of_band_data_t* oob_data) {
260   /* sanity check */
261   if (!interface_ready()) return BT_STATUS_NOT_READY;
262 
263   return btif_dm_create_bond_out_of_band(bd_addr, transport, oob_data);
264 }
265 
cancel_bond(const RawAddress * bd_addr)266 static int cancel_bond(const RawAddress* bd_addr) {
267   /* sanity check */
268   if (!interface_ready()) return BT_STATUS_NOT_READY;
269 
270   return btif_dm_cancel_bond(bd_addr);
271 }
272 
remove_bond(const RawAddress * bd_addr)273 static int remove_bond(const RawAddress* bd_addr) {
274   if (is_restricted_mode() && !btif_storage_is_restricted_device(bd_addr))
275     return BT_STATUS_SUCCESS;
276 
277   /* sanity check */
278   if (!interface_ready()) return BT_STATUS_NOT_READY;
279 
280   return btif_dm_remove_bond(bd_addr);
281 }
282 
get_connection_state(const RawAddress * bd_addr)283 static int get_connection_state(const RawAddress* bd_addr) {
284   /* sanity check */
285   if (!interface_ready()) return 0;
286 
287   return btif_dm_get_connection_state(bd_addr);
288 }
289 
pin_reply(const RawAddress * bd_addr,uint8_t accept,uint8_t pin_len,bt_pin_code_t * pin_code)290 static int pin_reply(const RawAddress* bd_addr, uint8_t accept, uint8_t pin_len,
291                      bt_pin_code_t* pin_code) {
292   /* sanity check */
293   if (!interface_ready()) return BT_STATUS_NOT_READY;
294 
295   return btif_dm_pin_reply(bd_addr, accept, pin_len, pin_code);
296 }
297 
ssp_reply(const RawAddress * bd_addr,bt_ssp_variant_t variant,uint8_t accept,uint32_t passkey)298 static int ssp_reply(const RawAddress* bd_addr, bt_ssp_variant_t variant,
299                      uint8_t accept, uint32_t passkey) {
300   /* sanity check */
301   if (!interface_ready()) return BT_STATUS_NOT_READY;
302 
303   return btif_dm_ssp_reply(bd_addr, variant, accept, passkey);
304 }
305 
read_energy_info()306 static int read_energy_info() {
307   if (!interface_ready()) return BT_STATUS_NOT_READY;
308   btif_dm_read_energy_info();
309   return BT_STATUS_SUCCESS;
310 }
311 
dump(int fd,const char ** arguments)312 static void dump(int fd, const char** arguments) {
313   btif_debug_conn_dump(fd);
314   btif_debug_bond_event_dump(fd);
315   btif_debug_a2dp_dump(fd);
316   btif_debug_av_dump(fd);
317   bta_debug_av_dump(fd);
318   stack_debug_avdtp_api_dump(fd);
319   bluetooth::avrcp::AvrcpService::DebugDump(fd);
320   btif_debug_config_dump(fd);
321   BTA_HfClientDumpStatistics(fd);
322   wakelock_debug_dump(fd);
323   osi_allocator_debug_dump(fd);
324   alarm_debug_dump(fd);
325   HearingAid::DebugDump(fd);
326 #if (BTSNOOP_MEM == TRUE)
327   btif_debug_btsnoop_dump(fd);
328 #endif
329 
330   close(fd);
331 }
332 
dumpMetrics(std::string * output)333 static void dumpMetrics(std::string* output) {
334   system_bt_osi::BluetoothMetricsLogger::GetInstance()->WriteString(output);
335 }
336 
get_profile_interface(const char * profile_id)337 static const void* get_profile_interface(const char* profile_id) {
338   LOG_INFO(LOG_TAG, "%s: id = %s", __func__, profile_id);
339 
340   /* sanity check */
341   if (!interface_ready()) return NULL;
342 
343   /* check for supported profile interfaces */
344   if (is_profile(profile_id, BT_PROFILE_HANDSFREE_ID))
345     return bluetooth::headset::GetInterface();
346 
347   if (is_profile(profile_id, BT_PROFILE_HANDSFREE_CLIENT_ID))
348     return btif_hf_client_get_interface();
349 
350   if (is_profile(profile_id, BT_PROFILE_SOCKETS_ID))
351     return btif_sock_get_interface();
352 
353   if (is_profile(profile_id, BT_PROFILE_PAN_ID))
354     return btif_pan_get_interface();
355 
356   if (is_profile(profile_id, BT_PROFILE_ADVANCED_AUDIO_ID))
357     return btif_av_get_src_interface();
358 
359   if (is_profile(profile_id, BT_PROFILE_ADVANCED_AUDIO_SINK_ID))
360     return btif_av_get_sink_interface();
361 
362   if (is_profile(profile_id, BT_PROFILE_HIDHOST_ID))
363     return btif_hh_get_interface();
364 
365   if (is_profile(profile_id, BT_PROFILE_HIDDEV_ID))
366     return btif_hd_get_interface();
367 
368   if (is_profile(profile_id, BT_PROFILE_HEALTH_ID))
369     return btif_hl_get_interface();
370 
371   if (is_profile(profile_id, BT_PROFILE_SDP_CLIENT_ID))
372     return btif_sdp_get_interface();
373 
374   if (is_profile(profile_id, BT_PROFILE_GATT_ID))
375     return btif_gatt_get_interface();
376 
377   if (is_profile(profile_id, BT_PROFILE_AV_RC_ID))
378     return btif_rc_get_interface();
379 
380   if (is_profile(profile_id, BT_PROFILE_AV_RC_CTRL_ID))
381     return btif_rc_ctrl_get_interface();
382 
383   if (is_profile(profile_id, BT_TEST_INTERFACE_MCAP_ID))
384     return stack_mcap_get_interface();
385 
386   if (is_profile(profile_id, BT_PROFILE_HEARING_AID_ID))
387     return btif_hearing_aid_get_interface();
388   return NULL;
389 }
390 
dut_mode_configure(uint8_t enable)391 int dut_mode_configure(uint8_t enable) {
392   LOG_INFO(LOG_TAG, "%s", __func__);
393 
394   /* sanity check */
395   if (!interface_ready()) return BT_STATUS_NOT_READY;
396 
397   return btif_dut_mode_configure(enable);
398 }
399 
dut_mode_send(uint16_t opcode,uint8_t * buf,uint8_t len)400 int dut_mode_send(uint16_t opcode, uint8_t* buf, uint8_t len) {
401   LOG_INFO(LOG_TAG, "%s", __func__);
402 
403   /* sanity check */
404   if (!interface_ready()) return BT_STATUS_NOT_READY;
405 
406   return btif_dut_mode_send(opcode, buf, len);
407 }
408 
le_test_mode(uint16_t opcode,uint8_t * buf,uint8_t len)409 int le_test_mode(uint16_t opcode, uint8_t* buf, uint8_t len) {
410   LOG_INFO(LOG_TAG, "%s", __func__);
411 
412   /* sanity check */
413   if (!interface_ready()) return BT_STATUS_NOT_READY;
414 
415   return btif_le_test_mode(opcode, buf, len);
416 }
417 
set_os_callouts(bt_os_callouts_t * callouts)418 static int set_os_callouts(bt_os_callouts_t* callouts) {
419   wakelock_set_os_callouts(callouts);
420   return BT_STATUS_SUCCESS;
421 }
422 
config_clear(void)423 static int config_clear(void) {
424   LOG_INFO(LOG_TAG, "%s", __func__);
425   return btif_config_clear() ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
426 }
427 
get_avrcp_service(void)428 static bluetooth::avrcp::ServiceInterface* get_avrcp_service(void) {
429   return bluetooth::avrcp::AvrcpService::GetServiceInterface();
430 }
431 
432 EXPORT_SYMBOL bt_interface_t bluetoothInterface = {
433     sizeof(bluetoothInterface),
434     init,
435     enable,
436     disable,
437     cleanup,
438     get_adapter_properties,
439     get_adapter_property,
440     set_adapter_property,
441     get_remote_device_properties,
442     get_remote_device_property,
443     set_remote_device_property,
444     get_remote_service_record,
445     get_remote_services,
446     start_discovery,
447     cancel_discovery,
448     create_bond,
449     create_bond_out_of_band,
450     remove_bond,
451     cancel_bond,
452     get_connection_state,
453     pin_reply,
454     ssp_reply,
455     get_profile_interface,
456     dut_mode_configure,
457     dut_mode_send,
458     le_test_mode,
459     set_os_callouts,
460     read_energy_info,
461     dump,
462     dumpMetrics,
463     config_clear,
464     interop_database_clear,
465     interop_database_add,
466     get_avrcp_service,
467 };
468