Home | History | Annotate | Download | only in dm
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2003-2014 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  *  This is the API implementation file for the BTA device manager.
     22  *
     23  ******************************************************************************/
     24 #include <base/bind_helpers.h>
     25 #include <string.h>
     26 
     27 #include "bt_common.h"
     28 #include "bta_api.h"
     29 #include "bta_closure_api.h"
     30 #include "bta_dm_int.h"
     31 #include "bta_sys.h"
     32 #include "bta_sys_int.h"
     33 #include "btm_api.h"
     34 #include "btm_int.h"
     35 #include "osi/include/osi.h"
     36 #include "utl.h"
     37 
     38 /*****************************************************************************
     39  *  Constants
     40  ****************************************************************************/
     41 
     42 static const tBTA_SYS_REG bta_dm_reg = {bta_dm_sm_execute, bta_dm_sm_disable};
     43 
     44 static const tBTA_SYS_REG bta_dm_search_reg = {bta_dm_search_sm_execute,
     45                                                bta_dm_search_sm_disable};
     46 
     47 /*******************************************************************************
     48  *
     49  * Function         BTA_EnableBluetooth
     50  *
     51  * Description      Enables bluetooth service.  This function must be
     52  *                  called before any other functions in the BTA API are called.
     53  *
     54  *
     55  * Returns          tBTA_STATUS
     56  *
     57  ******************************************************************************/
     58 tBTA_STATUS BTA_EnableBluetooth(tBTA_DM_SEC_CBACK* p_cback) {
     59   /* Bluetooth disabling is in progress */
     60   if (bta_dm_cb.disabling) return BTA_FAILURE;
     61 
     62   bta_sys_register(BTA_ID_DM, &bta_dm_reg);
     63   bta_sys_register(BTA_ID_DM_SEARCH, &bta_dm_search_reg);
     64 
     65   /* if UUID list is not provided as static data */
     66   bta_sys_eir_register(bta_dm_eir_update_uuid);
     67 
     68   tBTA_DM_API_ENABLE* p_msg =
     69       (tBTA_DM_API_ENABLE*)osi_malloc(sizeof(tBTA_DM_API_ENABLE));
     70   p_msg->hdr.event = BTA_DM_API_ENABLE_EVT;
     71   p_msg->p_sec_cback = p_cback;
     72 
     73   bta_sys_sendmsg(p_msg);
     74 
     75   return BTA_SUCCESS;
     76 }
     77 
     78 /*******************************************************************************
     79  *
     80  * Function         BTA_DisableBluetooth
     81  *
     82  * Description      Disables bluetooth service.  This function is called when
     83  *                  the application no longer needs bluetooth service
     84  *
     85  * Returns          void
     86  *
     87  ******************************************************************************/
     88 tBTA_STATUS BTA_DisableBluetooth(void) {
     89   BT_HDR* p_msg = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
     90 
     91   p_msg->event = BTA_DM_API_DISABLE_EVT;
     92 
     93   bta_sys_sendmsg(p_msg);
     94 
     95   return BTA_SUCCESS;
     96 }
     97 
     98 /*******************************************************************************
     99  *
    100  * Function         BTA_EnableTestMode
    101  *
    102  * Description      Enables bluetooth device under test mode
    103  *
    104  *
    105  * Returns          tBTA_STATUS
    106  *
    107  ******************************************************************************/
    108 tBTA_STATUS BTA_EnableTestMode(void) {
    109   BT_HDR* p_msg = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
    110 
    111   APPL_TRACE_API("%s", __func__);
    112 
    113   p_msg->event = BTA_DM_API_ENABLE_TEST_MODE_EVT;
    114   bta_sys_sendmsg(p_msg);
    115 
    116   return BTA_SUCCESS;
    117 }
    118 
    119 /*******************************************************************************
    120  *
    121  * Function         BTA_DisableTestMode
    122  *
    123  * Description      Disable bluetooth device under test mode
    124  *
    125  *
    126  * Returns          None
    127  *
    128  ******************************************************************************/
    129 void BTA_DisableTestMode(void) {
    130   BT_HDR* p_msg = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
    131 
    132   APPL_TRACE_API("%s", __func__);
    133 
    134   p_msg->event = BTA_DM_API_DISABLE_TEST_MODE_EVT;
    135   bta_sys_sendmsg(p_msg);
    136 }
    137 
    138 /*******************************************************************************
    139  *
    140  * Function         BTA_DmSetDeviceName
    141  *
    142  * Description      This function sets the Bluetooth name of local device
    143  *
    144  *
    145  * Returns          void
    146  *
    147  ******************************************************************************/
    148 void BTA_DmSetDeviceName(char* p_name) {
    149   tBTA_DM_API_SET_NAME* p_msg =
    150       (tBTA_DM_API_SET_NAME*)osi_malloc(sizeof(tBTA_DM_API_SET_NAME));
    151 
    152   p_msg->hdr.event = BTA_DM_API_SET_NAME_EVT;
    153   strlcpy((char*)p_msg->name, p_name, BD_NAME_LEN);
    154 
    155   bta_sys_sendmsg(p_msg);
    156 }
    157 
    158 /*******************************************************************************
    159  *
    160  * Function         BTA_DmSetVisibility
    161  *
    162  * Description      This function sets the Bluetooth connectable,
    163  *                  discoverable, pairable and conn paired only modes of local
    164  *                  device
    165  *
    166  *
    167  * Returns          void
    168  *
    169  ******************************************************************************/
    170 void BTA_DmSetVisibility(tBTA_DM_DISC disc_mode, tBTA_DM_CONN conn_mode,
    171                          uint8_t pairable_mode, uint8_t conn_filter) {
    172   tBTA_DM_API_SET_VISIBILITY* p_msg =
    173       (tBTA_DM_API_SET_VISIBILITY*)osi_malloc(sizeof(tBTA_DM_MSG));
    174 
    175   p_msg->hdr.event = BTA_DM_API_SET_VISIBILITY_EVT;
    176   p_msg->disc_mode = disc_mode;
    177   p_msg->conn_mode = conn_mode;
    178   p_msg->pair_mode = pairable_mode;
    179   p_msg->conn_paired_only = conn_filter;
    180 
    181   bta_sys_sendmsg(p_msg);
    182 }
    183 
    184 /*******************************************************************************
    185  *
    186  * Function         BTA_DmSearch
    187  *
    188  * Description      This function searches for peer Bluetooth devices. It
    189  *                  performs an inquiry and gets the remote name for devices.
    190  *                  Service discovery is done if services is non zero
    191  *
    192  *
    193  * Returns          void
    194  *
    195  ******************************************************************************/
    196 void BTA_DmSearch(tBTA_DM_INQ* p_dm_inq, tBTA_SERVICE_MASK services,
    197                   tBTA_DM_SEARCH_CBACK* p_cback) {
    198   tBTA_DM_API_SEARCH* p_msg =
    199       (tBTA_DM_API_SEARCH*)osi_calloc(sizeof(tBTA_DM_API_SEARCH));
    200 
    201   p_msg->hdr.event = BTA_DM_API_SEARCH_EVT;
    202   memcpy(&p_msg->inq_params, p_dm_inq, sizeof(tBTA_DM_INQ));
    203   p_msg->services = services;
    204   p_msg->p_cback = p_cback;
    205   p_msg->rs_res = BTA_DM_RS_NONE;
    206 
    207   bta_sys_sendmsg(p_msg);
    208 }
    209 
    210 /*******************************************************************************
    211  *
    212  * Function         BTA_DmSearchCancel
    213  *
    214  * Description      This function  cancels a search initiated by BTA_DmSearch
    215  *
    216  *
    217  * Returns          void
    218  *
    219  ******************************************************************************/
    220 void BTA_DmSearchCancel(void) {
    221   BT_HDR* p_msg = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
    222 
    223   p_msg->event = BTA_DM_API_SEARCH_CANCEL_EVT;
    224   bta_sys_sendmsg(p_msg);
    225 }
    226 
    227 /*******************************************************************************
    228  *
    229  * Function         BTA_DmDiscover
    230  *
    231  * Description      This function does service discovery for services of a
    232  *                  peer device
    233  *
    234  *
    235  * Returns          void
    236  *
    237  ******************************************************************************/
    238 void BTA_DmDiscover(BD_ADDR bd_addr, tBTA_SERVICE_MASK services,
    239                     tBTA_DM_SEARCH_CBACK* p_cback, bool sdp_search) {
    240   tBTA_DM_API_DISCOVER* p_msg =
    241       (tBTA_DM_API_DISCOVER*)osi_calloc(sizeof(tBTA_DM_API_DISCOVER));
    242 
    243   p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT;
    244   bdcpy(p_msg->bd_addr, bd_addr);
    245   p_msg->services = services;
    246   p_msg->p_cback = p_cback;
    247   p_msg->sdp_search = sdp_search;
    248 
    249   bta_sys_sendmsg(p_msg);
    250 }
    251 
    252 /*******************************************************************************
    253  *
    254  * Function         BTA_DmDiscoverUUID
    255  *
    256  * Description      This function does service discovery for services of a
    257  *                  peer device
    258  *
    259  *
    260  * Returns          void
    261  *
    262  ******************************************************************************/
    263 void BTA_DmDiscoverUUID(BD_ADDR bd_addr, tSDP_UUID* uuid,
    264                         tBTA_DM_SEARCH_CBACK* p_cback, bool sdp_search) {
    265   tBTA_DM_API_DISCOVER* p_msg =
    266       (tBTA_DM_API_DISCOVER*)osi_malloc(sizeof(tBTA_DM_API_DISCOVER));
    267 
    268   p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT;
    269   bdcpy(p_msg->bd_addr, bd_addr);
    270   p_msg->services = BTA_USER_SERVICE_MASK;  // Not exposed at API level
    271   p_msg->p_cback = p_cback;
    272   p_msg->sdp_search = sdp_search;
    273 
    274   p_msg->num_uuid = 0;
    275   p_msg->p_uuid = NULL;
    276 
    277   memcpy(&p_msg->uuid, uuid, sizeof(tSDP_UUID));
    278 
    279   bta_sys_sendmsg(p_msg);
    280 }
    281 
    282 /*******************************************************************************
    283  *
    284  * Function         BTA_DmBond
    285  *
    286  * Description      This function initiates a bonding procedure with a peer
    287  *                  device
    288  *
    289  *
    290  * Returns          void
    291  *
    292  ******************************************************************************/
    293 void BTA_DmBond(BD_ADDR bd_addr) {
    294   tBTA_DM_API_BOND* p_msg =
    295       (tBTA_DM_API_BOND*)osi_malloc(sizeof(tBTA_DM_API_BOND));
    296 
    297   p_msg->hdr.event = BTA_DM_API_BOND_EVT;
    298   bdcpy(p_msg->bd_addr, bd_addr);
    299   p_msg->transport = BTA_TRANSPORT_UNKNOWN;
    300 
    301   bta_sys_sendmsg(p_msg);
    302 }
    303 
    304 /*******************************************************************************
    305  *
    306  * Function         BTA_DmBondByTransports
    307  *
    308  * Description      This function initiates a bonding procedure with a peer
    309  *                  device
    310  *
    311  *
    312  * Returns          void
    313  *
    314  ******************************************************************************/
    315 void BTA_DmBondByTransport(BD_ADDR bd_addr, tBTA_TRANSPORT transport) {
    316   tBTA_DM_API_BOND* p_msg =
    317       (tBTA_DM_API_BOND*)osi_malloc(sizeof(tBTA_DM_API_BOND));
    318 
    319   p_msg->hdr.event = BTA_DM_API_BOND_EVT;
    320   bdcpy(p_msg->bd_addr, bd_addr);
    321   p_msg->transport = transport;
    322 
    323   bta_sys_sendmsg(p_msg);
    324 }
    325 
    326 /*******************************************************************************
    327  *
    328  * Function         BTA_DmBondCancel
    329  *
    330  * Description      This function cancels the bonding procedure with a peer
    331  *                  device
    332  *
    333  *
    334  * Returns          void
    335  *
    336  ******************************************************************************/
    337 void BTA_DmBondCancel(BD_ADDR bd_addr) {
    338   tBTA_DM_API_BOND_CANCEL* p_msg =
    339       (tBTA_DM_API_BOND_CANCEL*)osi_malloc(sizeof(tBTA_DM_API_BOND_CANCEL));
    340 
    341   p_msg->hdr.event = BTA_DM_API_BOND_CANCEL_EVT;
    342   bdcpy(p_msg->bd_addr, bd_addr);
    343 
    344   bta_sys_sendmsg(p_msg);
    345 }
    346 
    347 /*******************************************************************************
    348  *
    349  * Function         BTA_DmPinReply
    350  *
    351  * Description      This function provides a pincode for a remote device when
    352  *                  one is requested by DM through BTA_DM_PIN_REQ_EVT
    353  *
    354  *
    355  * Returns          void
    356  *
    357  ******************************************************************************/
    358 void BTA_DmPinReply(BD_ADDR bd_addr, bool accept, uint8_t pin_len,
    359                     uint8_t* p_pin)
    360 
    361 {
    362   tBTA_DM_API_PIN_REPLY* p_msg =
    363       (tBTA_DM_API_PIN_REPLY*)osi_malloc(sizeof(tBTA_DM_API_PIN_REPLY));
    364 
    365   p_msg->hdr.event = BTA_DM_API_PIN_REPLY_EVT;
    366   bdcpy(p_msg->bd_addr, bd_addr);
    367   p_msg->accept = accept;
    368   if (accept) {
    369     p_msg->pin_len = pin_len;
    370     memcpy(p_msg->p_pin, p_pin, pin_len);
    371   }
    372 
    373   bta_sys_sendmsg(p_msg);
    374 }
    375 
    376 /*******************************************************************************
    377  *
    378  * Function         BTA_DmLocalOob
    379  *
    380  * Description      This function retrieves the OOB data from local controller.
    381  *                  The result is reported by:
    382  *                  - bta_dm_co_loc_oob_ext() if device supports secure
    383  *                    connections (SC)
    384  *                  - bta_dm_co_loc_oob() if device doesn't support SC
    385  *
    386  * Returns          void
    387  *
    388  ******************************************************************************/
    389 void BTA_DmLocalOob(void) {
    390   tBTA_DM_API_LOC_OOB* p_msg =
    391       (tBTA_DM_API_LOC_OOB*)osi_malloc(sizeof(tBTA_DM_API_LOC_OOB));
    392 
    393   p_msg->hdr.event = BTA_DM_API_LOC_OOB_EVT;
    394   bta_sys_sendmsg(p_msg);
    395 }
    396 
    397 /*******************************************************************************
    398  *
    399  * Function         BTA_DmConfirm
    400  *
    401  * Description      This function accepts or rejects the numerical value of the
    402  *                  Simple Pairing process on BTA_DM_SP_CFM_REQ_EVT
    403  *
    404  * Returns          void
    405  *
    406  ******************************************************************************/
    407 void BTA_DmConfirm(BD_ADDR bd_addr, bool accept) {
    408   tBTA_DM_API_CONFIRM* p_msg =
    409       (tBTA_DM_API_CONFIRM*)osi_malloc(sizeof(tBTA_DM_API_CONFIRM));
    410 
    411   p_msg->hdr.event = BTA_DM_API_CONFIRM_EVT;
    412   bdcpy(p_msg->bd_addr, bd_addr);
    413   p_msg->accept = accept;
    414 
    415   bta_sys_sendmsg(p_msg);
    416 }
    417 
    418 /*******************************************************************************
    419  *
    420  * Function         BTA_DmAddDevice
    421  *
    422  * Description      This function adds a device to the security database list of
    423  *                  peer device
    424  *
    425  *
    426  * Returns          void
    427  *
    428  ******************************************************************************/
    429 void BTA_DmAddDevice(BD_ADDR bd_addr, DEV_CLASS dev_class, LINK_KEY link_key,
    430                      tBTA_SERVICE_MASK trusted_mask, bool is_trusted,
    431                      uint8_t key_type, tBTA_IO_CAP io_cap, uint8_t pin_length) {
    432   tBTA_DM_API_ADD_DEVICE* p_msg =
    433       (tBTA_DM_API_ADD_DEVICE*)osi_calloc(sizeof(tBTA_DM_API_ADD_DEVICE));
    434 
    435   p_msg->hdr.event = BTA_DM_API_ADD_DEVICE_EVT;
    436   bdcpy(p_msg->bd_addr, bd_addr);
    437   p_msg->tm = trusted_mask;
    438   p_msg->is_trusted = is_trusted;
    439   p_msg->io_cap = io_cap;
    440 
    441   if (link_key) {
    442     p_msg->link_key_known = true;
    443     p_msg->key_type = key_type;
    444     memcpy(p_msg->link_key, link_key, LINK_KEY_LEN);
    445   }
    446 
    447   /* Load device class if specified */
    448   if (dev_class) {
    449     p_msg->dc_known = true;
    450     memcpy(p_msg->dc, dev_class, DEV_CLASS_LEN);
    451   }
    452 
    453   memset(p_msg->bd_name, 0, BD_NAME_LEN + 1);
    454   memset(p_msg->features, 0, sizeof(p_msg->features));
    455   p_msg->pin_length = pin_length;
    456 
    457   bta_sys_sendmsg(p_msg);
    458 }
    459 
    460 /*******************************************************************************
    461  *
    462  * Function         BTA_DmRemoveDevice
    463  *
    464  * Description      This function removes a device fromthe security database
    465  *                  list of peer device. It manages unpairing even while
    466  *                  connected.
    467  *
    468  *
    469  * Returns          void
    470  *
    471  ******************************************************************************/
    472 tBTA_STATUS BTA_DmRemoveDevice(BD_ADDR bd_addr) {
    473   tBTA_DM_API_REMOVE_DEVICE* p_msg =
    474       (tBTA_DM_API_REMOVE_DEVICE*)osi_calloc(sizeof(tBTA_DM_API_REMOVE_DEVICE));
    475 
    476   p_msg->hdr.event = BTA_DM_API_REMOVE_DEVICE_EVT;
    477   bdcpy(p_msg->bd_addr, bd_addr);
    478 
    479   bta_sys_sendmsg(p_msg);
    480 
    481   return BTA_SUCCESS;
    482 }
    483 
    484 /*******************************************************************************
    485  *
    486  * Function         BTA_GetEirService
    487  *
    488  * Description      This function is called to get BTA service mask from EIR.
    489  *
    490  * Parameters       p_eir - pointer of EIR significant part
    491  *                  p_services - return the BTA service mask
    492  *
    493  * Returns          None
    494  *
    495  ******************************************************************************/
    496 extern const uint16_t bta_service_id_to_uuid_lkup_tbl[];
    497 void BTA_GetEirService(uint8_t* p_eir, size_t eir_len,
    498                        tBTA_SERVICE_MASK* p_services) {
    499   uint8_t xx, yy;
    500   uint8_t num_uuid, max_num_uuid = 32;
    501   uint8_t uuid_list[32 * LEN_UUID_16];
    502   uint16_t* p_uuid16 = (uint16_t*)uuid_list;
    503   tBTA_SERVICE_MASK mask;
    504 
    505   BTM_GetEirUuidList(p_eir, eir_len, LEN_UUID_16, &num_uuid, uuid_list,
    506                      max_num_uuid);
    507   for (xx = 0; xx < num_uuid; xx++) {
    508     mask = 1;
    509     for (yy = 0; yy < BTA_MAX_SERVICE_ID; yy++) {
    510       if (*(p_uuid16 + xx) == bta_service_id_to_uuid_lkup_tbl[yy]) {
    511         *p_services |= mask;
    512         break;
    513       }
    514       mask <<= 1;
    515     }
    516 
    517     /* for HSP v1.2 only device */
    518     if (*(p_uuid16 + xx) == UUID_SERVCLASS_HEADSET_HS)
    519       *p_services |= BTA_HSP_SERVICE_MASK;
    520 
    521     if (*(p_uuid16 + xx) == UUID_SERVCLASS_HDP_SOURCE)
    522       *p_services |= BTA_HL_SERVICE_MASK;
    523 
    524     if (*(p_uuid16 + xx) == UUID_SERVCLASS_HDP_SINK)
    525       *p_services |= BTA_HL_SERVICE_MASK;
    526   }
    527 }
    528 
    529 /*******************************************************************************
    530  *
    531  * Function         BTA_DmGetConnectionState
    532  *
    533  * Description      Returns whether the remote device is currently connected.
    534  *
    535  * Returns          0 if the device is NOT connected.
    536  *
    537  ******************************************************************************/
    538 uint16_t BTA_DmGetConnectionState(const BD_ADDR bd_addr) {
    539   tBTA_DM_PEER_DEVICE* p_dev = bta_dm_find_peer_device(bd_addr);
    540   return (p_dev && p_dev->conn_state == BTA_DM_CONNECTED);
    541 }
    542 
    543 /*******************************************************************************
    544  *                   Device Identification (DI) Server Functions
    545  ******************************************************************************/
    546 /*******************************************************************************
    547  *
    548  * Function         BTA_DmSetLocalDiRecord
    549  *
    550  * Description      This function adds a DI record to the local SDP database.
    551  *
    552  * Returns          BTA_SUCCESS if record set sucessfully, otherwise error code.
    553  *
    554  ******************************************************************************/
    555 tBTA_STATUS BTA_DmSetLocalDiRecord(tBTA_DI_RECORD* p_device_info,
    556                                    uint32_t* p_handle) {
    557   tBTA_STATUS status = BTA_FAILURE;
    558 
    559   if (bta_dm_di_cb.di_num < BTA_DI_NUM_MAX) {
    560     if (SDP_SetLocalDiRecord((tSDP_DI_RECORD*)p_device_info, p_handle) ==
    561         SDP_SUCCESS) {
    562       if (!p_device_info->primary_record) {
    563         bta_dm_di_cb.di_handle[bta_dm_di_cb.di_num] = *p_handle;
    564         bta_dm_di_cb.di_num++;
    565       }
    566 
    567       bta_sys_add_uuid(UUID_SERVCLASS_PNP_INFORMATION);
    568       status = BTA_SUCCESS;
    569     }
    570   }
    571 
    572   return status;
    573 }
    574 
    575 /*******************************************************************************
    576  *
    577  * Function         bta_dmexecutecallback
    578  *
    579  * Description      This function will request BTA to execute a call back in the
    580  *                  context of BTU task.
    581  *                  This API was named in lower case because it is only intended
    582  *                  for the internal customers(like BTIF).
    583  *
    584  * Returns          void
    585  *
    586  ******************************************************************************/
    587 void bta_dmexecutecallback(tBTA_DM_EXEC_CBACK* p_callback, void* p_param) {
    588   tBTA_DM_API_EXECUTE_CBACK* p_msg =
    589       (tBTA_DM_API_EXECUTE_CBACK*)osi_malloc(sizeof(tBTA_DM_MSG));
    590 
    591   p_msg->hdr.event = BTA_DM_API_EXECUTE_CBACK_EVT;
    592   p_msg->p_param = p_param;
    593   p_msg->p_exec_cback = p_callback;
    594 
    595   bta_sys_sendmsg(p_msg);
    596 }
    597 
    598 /*******************************************************************************
    599  *
    600  * Function         BTA_DmAddBleKey
    601  *
    602  * Description      Add/modify LE device information.  This function will be
    603  *                  normally called during host startup to restore all required
    604  *                  information stored in the NVRAM.
    605  *
    606  * Parameters:      bd_addr          - BD address of the peer
    607  *                  p_le_key         - LE key values.
    608  *                  key_type         - LE SMP key type.
    609  *
    610  * Returns          BTA_SUCCESS if successful
    611  *                  BTA_FAIL if operation failed.
    612  *
    613  ******************************************************************************/
    614 void BTA_DmAddBleKey(BD_ADDR bd_addr, tBTA_LE_KEY_VALUE* p_le_key,
    615                      tBTA_LE_KEY_TYPE key_type) {
    616   tBTA_DM_API_ADD_BLEKEY* p_msg =
    617       (tBTA_DM_API_ADD_BLEKEY*)osi_calloc(sizeof(tBTA_DM_API_ADD_BLEKEY));
    618 
    619   p_msg->hdr.event = BTA_DM_API_ADD_BLEKEY_EVT;
    620   p_msg->key_type = key_type;
    621   bdcpy(p_msg->bd_addr, bd_addr);
    622   memcpy(&p_msg->blekey, p_le_key, sizeof(tBTA_LE_KEY_VALUE));
    623 
    624   bta_sys_sendmsg(p_msg);
    625 }
    626 
    627 /*******************************************************************************
    628  *
    629  * Function         BTA_DmAddBleDevice
    630  *
    631  * Description      Add a BLE device.  This function will be normally called
    632  *                  during host startup to restore all required information
    633  *                  for a LE device stored in the NVRAM.
    634  *
    635  * Parameters:      bd_addr          - BD address of the peer
    636  *                  dev_type         - Remote device's device type.
    637  *                  addr_type        - LE device address type.
    638  *
    639  * Returns          void
    640  *
    641  ******************************************************************************/
    642 void BTA_DmAddBleDevice(BD_ADDR bd_addr, tBLE_ADDR_TYPE addr_type,
    643                         tBT_DEVICE_TYPE dev_type) {
    644   tBTA_DM_API_ADD_BLE_DEVICE* p_msg = (tBTA_DM_API_ADD_BLE_DEVICE*)osi_calloc(
    645       sizeof(tBTA_DM_API_ADD_BLE_DEVICE));
    646 
    647   p_msg->hdr.event = BTA_DM_API_ADD_BLEDEVICE_EVT;
    648   bdcpy(p_msg->bd_addr, bd_addr);
    649   p_msg->addr_type = addr_type;
    650   p_msg->dev_type = dev_type;
    651 
    652   bta_sys_sendmsg(p_msg);
    653 }
    654 
    655 /*******************************************************************************
    656  *
    657  * Function         BTA_DmBlePasskeyReply
    658  *
    659  * Description      Send BLE SMP passkey reply.
    660  *
    661  * Parameters:      bd_addr          - BD address of the peer
    662  *                  accept           - passkey entry sucessful or declined.
    663  *                  passkey          - passkey value, must be a 6 digit number,
    664  *                                     can be lead by 0.
    665  *
    666  * Returns          void
    667  *
    668  ******************************************************************************/
    669 void BTA_DmBlePasskeyReply(BD_ADDR bd_addr, bool accept, uint32_t passkey) {
    670   tBTA_DM_API_PASSKEY_REPLY* p_msg =
    671       (tBTA_DM_API_PASSKEY_REPLY*)osi_calloc(sizeof(tBTA_DM_API_PASSKEY_REPLY));
    672 
    673   p_msg->hdr.event = BTA_DM_API_BLE_PASSKEY_REPLY_EVT;
    674   bdcpy(p_msg->bd_addr, bd_addr);
    675   p_msg->accept = accept;
    676 
    677   if (accept) p_msg->passkey = passkey;
    678 
    679   bta_sys_sendmsg(p_msg);
    680 }
    681 
    682 /*******************************************************************************
    683  *
    684  * Function         BTA_DmBleConfirmReply
    685  *
    686  * Description      Send BLE SMP SC user confirmation reply.
    687  *
    688  * Parameters:      bd_addr          - BD address of the peer
    689  *                  accept           - numbers to compare are the same or
    690  *                                     different.
    691  *
    692  * Returns          void
    693  *
    694  ******************************************************************************/
    695 void BTA_DmBleConfirmReply(BD_ADDR bd_addr, bool accept) {
    696   tBTA_DM_API_CONFIRM* p_msg =
    697       (tBTA_DM_API_CONFIRM*)osi_calloc(sizeof(tBTA_DM_API_CONFIRM));
    698 
    699   p_msg->hdr.event = BTA_DM_API_BLE_CONFIRM_REPLY_EVT;
    700   bdcpy(p_msg->bd_addr, bd_addr);
    701   p_msg->accept = accept;
    702 
    703   bta_sys_sendmsg(p_msg);
    704 }
    705 
    706 /*******************************************************************************
    707  *
    708  * Function         BTA_DmBleSecurityGrant
    709  *
    710  * Description      Grant security request access.
    711  *
    712  * Parameters:      bd_addr          - BD address of the peer
    713  *                  res              - security grant status.
    714  *
    715  * Returns          void
    716  *
    717  ******************************************************************************/
    718 void BTA_DmBleSecurityGrant(BD_ADDR bd_addr, tBTA_DM_BLE_SEC_GRANT res) {
    719   tBTA_DM_API_BLE_SEC_GRANT* p_msg =
    720       (tBTA_DM_API_BLE_SEC_GRANT*)osi_calloc(sizeof(tBTA_DM_API_BLE_SEC_GRANT));
    721 
    722   p_msg->hdr.event = BTA_DM_API_BLE_SEC_GRANT_EVT;
    723   bdcpy(p_msg->bd_addr, bd_addr);
    724   p_msg->res = res;
    725 
    726   bta_sys_sendmsg(p_msg);
    727 }
    728 
    729 /*******************************************************************************
    730  *
    731  * Function         BTA_DmSetBlePrefConnParams
    732  *
    733  * Description      This function is called to set the preferred connection
    734  *                  parameters when default connection parameter is not desired.
    735  *
    736  * Parameters:      bd_addr          - BD address of the peripheral
    737  *                  scan_interval    - scan interval
    738  *                  scan_window      - scan window
    739  *                  min_conn_int     - minimum preferred connection interval
    740  *                  max_conn_int     - maximum preferred connection interval
    741  *                  slave_latency    - preferred slave latency
    742  *                  supervision_tout - preferred supervision timeout
    743  *
    744  *
    745  * Returns          void
    746  *
    747  ******************************************************************************/
    748 void BTA_DmSetBlePrefConnParams(const BD_ADDR bd_addr, uint16_t min_conn_int,
    749                                 uint16_t max_conn_int, uint16_t slave_latency,
    750                                 uint16_t supervision_tout) {
    751   tBTA_DM_API_BLE_CONN_PARAMS* p_msg = (tBTA_DM_API_BLE_CONN_PARAMS*)osi_calloc(
    752       sizeof(tBTA_DM_API_BLE_CONN_PARAMS));
    753 
    754   p_msg->hdr.event = BTA_DM_API_BLE_CONN_PARAM_EVT;
    755   memcpy(p_msg->peer_bda, bd_addr, BD_ADDR_LEN);
    756   p_msg->conn_int_max = max_conn_int;
    757   p_msg->conn_int_min = min_conn_int;
    758   p_msg->slave_latency = slave_latency;
    759   p_msg->supervision_tout = supervision_tout;
    760 
    761   bta_sys_sendmsg(p_msg);
    762 }
    763 
    764 /*******************************************************************************
    765  *
    766  * Function         BTA_DmSetBleConnScanParams
    767  *
    768  * Description      This function is called to set scan parameters used in
    769  *                  BLE connection request
    770  *
    771  * Parameters:      scan_interval    - scan interval
    772  *                  scan_window      - scan window
    773  *
    774  * Returns          void
    775  *
    776  ******************************************************************************/
    777 void BTA_DmSetBleConnScanParams(uint32_t scan_interval, uint32_t scan_window) {
    778   tBTA_DM_API_BLE_SCAN_PARAMS* p_msg = (tBTA_DM_API_BLE_SCAN_PARAMS*)osi_calloc(
    779       sizeof(tBTA_DM_API_BLE_SCAN_PARAMS));
    780 
    781   p_msg->hdr.event = BTA_DM_API_BLE_CONN_SCAN_PARAM_EVT;
    782   p_msg->scan_int = scan_interval;
    783   p_msg->scan_window = scan_window;
    784 
    785   bta_sys_sendmsg(p_msg);
    786 }
    787 
    788 /**
    789  * Set BLE connectable mode to auto connect
    790  */
    791 void BTA_DmBleStartAutoConn() {
    792   tBTA_DM_API_SET_NAME* p_msg =
    793       (tBTA_DM_API_SET_NAME*)osi_calloc(sizeof(tBTA_DM_API_SET_NAME));
    794 
    795   p_msg->hdr.event = BTA_DM_API_BLE_SET_BG_CONN_TYPE;
    796   bta_sys_sendmsg(p_msg);
    797 }
    798 
    799 /*******************************************************************************
    800  *
    801  * Function         bta_dm_discover_send_msg
    802  *
    803  * Description      This function send discover message to BTA task.
    804  *
    805  * Returns          void
    806  *
    807  ******************************************************************************/
    808 static void bta_dm_discover_send_msg(BD_ADDR bd_addr,
    809                                      tBTA_SERVICE_MASK_EXT* p_services,
    810                                      tBTA_DM_SEARCH_CBACK* p_cback,
    811                                      bool sdp_search,
    812                                      tBTA_TRANSPORT transport) {
    813   const size_t len = p_services ? (sizeof(tBTA_DM_API_DISCOVER) +
    814                                    sizeof(tBT_UUID) * p_services->num_uuid)
    815                                 : sizeof(tBTA_DM_API_DISCOVER);
    816   tBTA_DM_API_DISCOVER* p_msg = (tBTA_DM_API_DISCOVER*)osi_calloc(len);
    817 
    818   p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT;
    819   bdcpy(p_msg->bd_addr, bd_addr);
    820   p_msg->p_cback = p_cback;
    821   p_msg->sdp_search = sdp_search;
    822   p_msg->transport = transport;
    823 
    824   if (p_services != NULL) {
    825     p_msg->services = p_services->srvc_mask;
    826     p_msg->num_uuid = p_services->num_uuid;
    827     if (p_services->num_uuid != 0) {
    828       p_msg->p_uuid = (tBT_UUID*)(p_msg + 1);
    829       memcpy(p_msg->p_uuid, p_services->p_uuid,
    830              sizeof(tBT_UUID) * p_services->num_uuid);
    831     }
    832   }
    833 
    834   bta_sys_sendmsg(p_msg);
    835 }
    836 
    837 /*******************************************************************************
    838  *
    839  * Function         BTA_DmDiscoverByTransport
    840  *
    841  * Description      This function does service discovery on particular transport
    842  *                  for services of a
    843  *                  peer device. When services.num_uuid is 0, it indicates all
    844  *                  GATT based services are to be searched; otherwise a list of
    845  *                  UUID of interested services should be provided through
    846  *                  p_services->p_uuid.
    847  *
    848  *
    849  *
    850  * Returns          void
    851  *
    852  ******************************************************************************/
    853 void BTA_DmDiscoverByTransport(BD_ADDR bd_addr,
    854                                tBTA_SERVICE_MASK_EXT* p_services,
    855                                tBTA_DM_SEARCH_CBACK* p_cback, bool sdp_search,
    856                                tBTA_TRANSPORT transport) {
    857   bta_dm_discover_send_msg(bd_addr, p_services, p_cback, sdp_search, transport);
    858 }
    859 
    860 /*******************************************************************************
    861  *
    862  * Function         BTA_DmDiscoverExt
    863  *
    864  * Description      This function does service discovery for services of a
    865  *                  peer device. When services.num_uuid is 0, it indicates all
    866  *                  GATT based services are to be searched; other wise a list of
    867  *                  UUID of interested services should be provided through
    868  *                  p_services->p_uuid.
    869  *
    870  *
    871  *
    872  * Returns          void
    873  *
    874  ******************************************************************************/
    875 void BTA_DmDiscoverExt(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT* p_services,
    876                        tBTA_DM_SEARCH_CBACK* p_cback, bool sdp_search) {
    877   bta_dm_discover_send_msg(bd_addr, p_services, p_cback, sdp_search,
    878                            BTA_TRANSPORT_UNKNOWN);
    879 }
    880 
    881 /*******************************************************************************
    882  *
    883  * Function         BTA_DmSearchExt
    884  *
    885  * Description      This function searches for peer Bluetooth devices. It
    886  *                  performs an inquiry and gets the remote name for devices.
    887  *                  Service discovery is done if services is non zero
    888  *
    889  * Parameters       p_dm_inq: inquiry conditions
    890  *                  p_services: if service is not empty, service discovery will
    891  *                              be done. For all GATT based service conditions,
    892  *                              put num_uuid, and p_uuid is the pointer to the
    893  *                              list of UUID values.
    894  *                  p_cback: callback function when search is completed.
    895  *
    896  *
    897  *
    898  * Returns          void
    899  *
    900  ******************************************************************************/
    901 void BTA_DmSearchExt(tBTA_DM_INQ* p_dm_inq, tBTA_SERVICE_MASK_EXT* p_services,
    902                      tBTA_DM_SEARCH_CBACK* p_cback) {
    903   const size_t len = p_services ? (sizeof(tBTA_DM_API_SEARCH) +
    904                                    sizeof(tBT_UUID) * p_services->num_uuid)
    905                                 : sizeof(tBTA_DM_API_SEARCH);
    906   tBTA_DM_API_SEARCH* p_msg = (tBTA_DM_API_SEARCH*)osi_calloc(len);
    907 
    908   p_msg->hdr.event = BTA_DM_API_SEARCH_EVT;
    909   memcpy(&p_msg->inq_params, p_dm_inq, sizeof(tBTA_DM_INQ));
    910   p_msg->p_cback = p_cback;
    911   p_msg->rs_res = BTA_DM_RS_NONE;
    912 
    913   if (p_services != NULL) {
    914     p_msg->services = p_services->srvc_mask;
    915     p_msg->num_uuid = p_services->num_uuid;
    916 
    917     if (p_services->num_uuid != 0) {
    918       p_msg->p_uuid = (tBT_UUID*)(p_msg + 1);
    919       memcpy(p_msg->p_uuid, p_services->p_uuid,
    920              sizeof(tBT_UUID) * p_services->num_uuid);
    921     } else {
    922       p_msg->p_uuid = NULL;
    923     }
    924   }
    925 
    926   bta_sys_sendmsg(p_msg);
    927 }
    928 
    929 /*******************************************************************************
    930  *
    931  * Function         BTA_DmBleUpdateConnectionParam
    932  *
    933  * Description      Update connection parameters, can only be used when
    934  *                  connection is up.
    935  *
    936  * Parameters:      bd_addr          - BD address of the peer
    937  *                  min_int   -     minimum connection interval,
    938  *                                  [0x0004 ~ 0x4000]
    939  *                  max_int   -     maximum connection interval,
    940  *                                  [0x0004 ~ 0x4000]
    941  *                  latency   -     slave latency [0 ~ 500]
    942  *                  timeout   -     supervision timeout [0x000a ~ 0xc80]
    943  *
    944  * Returns          void
    945  *
    946  ******************************************************************************/
    947 void BTA_DmBleUpdateConnectionParam(BD_ADDR bd_addr, uint16_t min_int,
    948                                     uint16_t max_int, uint16_t latency,
    949                                     uint16_t timeout) {
    950   tBTA_DM_API_UPDATE_CONN_PARAM* p_msg =
    951       (tBTA_DM_API_UPDATE_CONN_PARAM*)osi_calloc(
    952           sizeof(tBTA_DM_API_UPDATE_CONN_PARAM));
    953 
    954   p_msg->hdr.event = BTA_DM_API_UPDATE_CONN_PARAM_EVT;
    955   bdcpy(p_msg->bd_addr, bd_addr);
    956   p_msg->min_int = min_int;
    957   p_msg->max_int = max_int;
    958   p_msg->latency = latency;
    959   p_msg->timeout = timeout;
    960 
    961   bta_sys_sendmsg(p_msg);
    962 }
    963 
    964 /*******************************************************************************
    965  *
    966  * Function         BTA_DmBleConfigLocalPrivacy
    967  *
    968  * Description      Enable/disable privacy on the local device
    969  *
    970  * Parameters:      privacy_enable   - enable/disabe privacy on remote device.
    971  *
    972  * Returns          void
    973  *
    974  ******************************************************************************/
    975 void BTA_DmBleConfigLocalPrivacy(bool privacy_enable) {
    976 #if (BLE_PRIVACY_SPT == TRUE)
    977   tBTA_DM_API_LOCAL_PRIVACY* p_msg = (tBTA_DM_API_LOCAL_PRIVACY*)osi_calloc(
    978       sizeof(tBTA_DM_API_ENABLE_PRIVACY));
    979 
    980   p_msg->hdr.event = BTA_DM_API_LOCAL_PRIVACY_EVT;
    981   p_msg->privacy_enable = privacy_enable;
    982 
    983   bta_sys_sendmsg(p_msg);
    984 #else
    985   UNUSED(privacy_enable);
    986 #endif
    987 }
    988 
    989 /*******************************************************************************
    990  *
    991  * Function         BTA_DmBleGetEnergyInfo
    992  *
    993  * Description      This function is called to obtain the energy info
    994  *
    995  * Parameters       p_cmpl_cback - Command complete callback
    996  *
    997  * Returns          void
    998  *
    999  ******************************************************************************/
   1000 void BTA_DmBleGetEnergyInfo(tBTA_BLE_ENERGY_INFO_CBACK* p_cmpl_cback) {
   1001   const size_t len = sizeof(tBTA_DM_API_ENERGY_INFO) + sizeof(tBLE_BD_ADDR);
   1002   tBTA_DM_API_ENERGY_INFO* p_msg = (tBTA_DM_API_ENERGY_INFO*)osi_calloc(len);
   1003 
   1004   APPL_TRACE_API("%s", __func__);
   1005 
   1006   p_msg->hdr.event = BTA_DM_API_BLE_ENERGY_INFO_EVT;
   1007   p_msg->p_energy_info_cback = p_cmpl_cback;
   1008 
   1009   bta_sys_sendmsg(p_msg);
   1010 }
   1011 
   1012 /*******************************************************************************
   1013  *
   1014  * Function         BTA_DmBleUpdateConnectionParams
   1015  *
   1016  * Description      Update connection parameters, can only be used when
   1017  *                  connection is up.
   1018  *
   1019  * Parameters:      bd_addr   - BD address of the peer
   1020  *                  min_int   -     minimum connection interval,
   1021  *                                  [0x0004 ~ 0x4000]
   1022  *                  max_int   -     maximum connection interval,
   1023  *                                  [0x0004 ~ 0x4000]
   1024  *                  latency   -     slave latency [0 ~ 500]
   1025  *                  timeout   -     supervision timeout [0x000a ~ 0xc80]
   1026  *
   1027  * Returns          void
   1028  *
   1029  ******************************************************************************/
   1030 void BTA_DmBleUpdateConnectionParams(const BD_ADDR bd_addr, uint16_t min_int,
   1031                                      uint16_t max_int, uint16_t latency,
   1032                                      uint16_t timeout) {
   1033   tBTA_DM_API_UPDATE_CONN_PARAM* p_msg =
   1034       (tBTA_DM_API_UPDATE_CONN_PARAM*)osi_calloc(
   1035           sizeof(tBTA_DM_API_UPDATE_CONN_PARAM));
   1036 
   1037   p_msg->hdr.event = BTA_DM_API_UPDATE_CONN_PARAM_EVT;
   1038   bdcpy(p_msg->bd_addr, bd_addr);
   1039   p_msg->min_int = min_int;
   1040   p_msg->max_int = max_int;
   1041   p_msg->latency = latency;
   1042   p_msg->timeout = timeout;
   1043 
   1044   bta_sys_sendmsg(p_msg);
   1045 }
   1046 
   1047 /*******************************************************************************
   1048  *
   1049  * Function         BTA_DmBleSetDataLength
   1050  *
   1051  * Description      This function is to set maximum LE data packet size
   1052  *
   1053  * Returns          void
   1054  *
   1055  *
   1056  ******************************************************************************/
   1057 void BTA_DmBleSetDataLength(BD_ADDR remote_device, uint16_t tx_data_length) {
   1058   tBTA_DM_API_BLE_SET_DATA_LENGTH* p_msg =
   1059       (tBTA_DM_API_BLE_SET_DATA_LENGTH*)osi_malloc(
   1060           sizeof(tBTA_DM_API_BLE_SET_DATA_LENGTH));
   1061 
   1062   bdcpy(p_msg->remote_bda, remote_device);
   1063   p_msg->hdr.event = BTA_DM_API_SET_DATA_LENGTH_EVT;
   1064   p_msg->tx_data_length = tx_data_length;
   1065 
   1066   bta_sys_sendmsg(p_msg);
   1067 }
   1068 
   1069 /*******************************************************************************
   1070  *
   1071  * Function         BTA_DmSetEncryption
   1072  *
   1073  * Description      This function is called to ensure that connection is
   1074  *                  encrypted.  Should be called only on an open connection.
   1075  *                  Typically only needed for connections that first want to
   1076  *                  bring up unencrypted links, then later encrypt them.
   1077  *
   1078  * Parameters:      bd_addr       - Address of the peer device
   1079  *                  transport     - transport of the link to be encruypted
   1080  *                  p_callback    - Pointer to callback function to indicat the
   1081  *                                  link encryption status
   1082  *                  sec_act       - This is the security action to indicate
   1083  *                                  what kind of BLE security level is required
   1084  *                                  for the BLE link if BLE is supported.
   1085  *                                  Note: This parameter is ignored for the
   1086  *                                        BR/EDR or if BLE is not supported.
   1087  *
   1088  * Returns          void
   1089  *
   1090  ******************************************************************************/
   1091 void BTA_DmSetEncryption(BD_ADDR bd_addr, tBTA_TRANSPORT transport,
   1092                          tBTA_DM_ENCRYPT_CBACK* p_callback,
   1093                          tBTA_DM_BLE_SEC_ACT sec_act) {
   1094   tBTA_DM_API_SET_ENCRYPTION* p_msg = (tBTA_DM_API_SET_ENCRYPTION*)osi_calloc(
   1095       sizeof(tBTA_DM_API_SET_ENCRYPTION));
   1096 
   1097   APPL_TRACE_API("%s", __func__);
   1098 
   1099   p_msg->hdr.event = BTA_DM_API_SET_ENCRYPTION_EVT;
   1100   memcpy(p_msg->bd_addr, bd_addr, BD_ADDR_LEN);
   1101   p_msg->transport = transport;
   1102   p_msg->p_callback = p_callback;
   1103   p_msg->sec_act = sec_act;
   1104 
   1105   bta_sys_sendmsg(p_msg);
   1106 }
   1107 
   1108 /*******************************************************************************
   1109  *
   1110  * Function         BTA_DmCloseACL
   1111  *
   1112  * Description      This function force to close an ACL connection and remove
   1113  *                  the device from the security database list of known devices.
   1114  *
   1115  * Parameters:      bd_addr       - Address of the peer device
   1116  *                  remove_dev    - remove device or not after link down
   1117  *
   1118  * Returns          void
   1119  *
   1120  ******************************************************************************/
   1121 void BTA_DmCloseACL(BD_ADDR bd_addr, bool remove_dev,
   1122                     tBTA_TRANSPORT transport) {
   1123   tBTA_DM_API_REMOVE_ACL* p_msg =
   1124       (tBTA_DM_API_REMOVE_ACL*)osi_calloc(sizeof(tBTA_DM_API_REMOVE_ACL));
   1125 
   1126   APPL_TRACE_API("%s", __func__);
   1127 
   1128   p_msg->hdr.event = BTA_DM_API_REMOVE_ACL_EVT;
   1129   memcpy(p_msg->bd_addr, bd_addr, BD_ADDR_LEN);
   1130   p_msg->remove_dev = remove_dev;
   1131   p_msg->transport = transport;
   1132 
   1133   bta_sys_sendmsg(p_msg);
   1134 }
   1135 
   1136 /*******************************************************************************
   1137  *
   1138  * Function         BTA_DmBleObserve
   1139  *
   1140  * Description      This procedure keep the device listening for advertising
   1141  *                  events from a broadcast device.
   1142  *
   1143  * Parameters       start: start or stop observe.
   1144  *
   1145  * Returns          void
   1146 
   1147  *
   1148  * Returns          void.
   1149  *
   1150  ******************************************************************************/
   1151 extern void BTA_DmBleObserve(bool start, uint8_t duration,
   1152                              tBTA_DM_SEARCH_CBACK* p_results_cb) {
   1153   tBTA_DM_API_BLE_OBSERVE* p_msg =
   1154       (tBTA_DM_API_BLE_OBSERVE*)osi_calloc(sizeof(tBTA_DM_API_BLE_OBSERVE));
   1155 
   1156   APPL_TRACE_API("%s:start = %d ", __func__, start);
   1157 
   1158   p_msg->hdr.event = BTA_DM_API_BLE_OBSERVE_EVT;
   1159   p_msg->start = start;
   1160   p_msg->duration = duration;
   1161   p_msg->p_cback = p_results_cb;
   1162 
   1163   bta_sys_sendmsg(p_msg);
   1164 }
   1165 
   1166 /*******************************************************************************
   1167  *
   1168  * Function         BTA_VendorInit
   1169  *
   1170  * Description      This function initializes vendor specific
   1171  *
   1172  * Returns          void
   1173  *
   1174  ******************************************************************************/
   1175 void BTA_VendorInit(void) { APPL_TRACE_API("BTA_VendorInit"); }
   1176 
   1177 /*******************************************************************************
   1178  *
   1179  * Function         BTA_VendorCleanup
   1180  *
   1181  * Description      This function frees up Broadcom specific VS specific dynamic
   1182  *                  memory
   1183  *
   1184  * Returns          void
   1185  *
   1186  ******************************************************************************/
   1187 void BTA_VendorCleanup(void) {
   1188   tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
   1189   BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
   1190 
   1191   if (cmn_ble_vsc_cb.max_filter > 0) {
   1192     btm_ble_adv_filter_cleanup();
   1193 #if (BLE_PRIVACY_SPT == TRUE)
   1194     btm_ble_resolving_list_cleanup();
   1195 #endif
   1196   }
   1197 
   1198   if (cmn_ble_vsc_cb.tot_scan_results_strg > 0) btm_ble_batchscan_cleanup();
   1199 
   1200   if (cmn_ble_vsc_cb.adv_inst_max > 0) btm_ble_multi_adv_cleanup();
   1201 }
   1202