Home | History | Annotate | Download | only in dm
      1 /******************************************************************************
      2  *
      3  *  Copyright 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 using bluetooth::Uuid;
     39 
     40 /*****************************************************************************
     41  *  Constants
     42  ****************************************************************************/
     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_SEARCH, &bta_dm_search_reg);
     63 
     64   /* if UUID list is not provided as static data */
     65   bta_sys_eir_register(bta_dm_eir_update_uuid);
     66 
     67   do_in_bta_thread(FROM_HERE, base::Bind(bta_dm_enable, p_cback));
     68   return BTA_SUCCESS;
     69 }
     70 
     71 /*******************************************************************************
     72  *
     73  * Function         BTA_DisableBluetooth
     74  *
     75  * Description      Disables bluetooth service.  This function is called when
     76  *                  the application no longer needs bluetooth service
     77  *
     78  * Returns          void
     79  *
     80  ******************************************************************************/
     81 tBTA_STATUS BTA_DisableBluetooth(void) {
     82   do_in_bta_thread(FROM_HERE, base::Bind(bta_dm_disable));
     83   return BTA_SUCCESS;
     84 }
     85 
     86 /** Enables bluetooth device under test mode */
     87 void BTA_EnableTestMode(void) {
     88   do_in_bta_thread(FROM_HERE,
     89                    base::Bind(base::IgnoreResult(BTM_EnableTestMode)));
     90 }
     91 
     92 /** Disable bluetooth device under test mode */
     93 void BTA_DisableTestMode(void) {
     94   do_in_bta_thread(FROM_HERE, base::Bind(BTM_DeviceReset, nullptr));
     95 }
     96 
     97 /** This function sets the Bluetooth name of local device */
     98 void BTA_DmSetDeviceName(char* p_name) {
     99   std::vector<uint8_t> name(BD_NAME_LEN);
    100   strlcpy((char*)name.data(), p_name, BD_NAME_LEN);
    101 
    102   do_in_bta_thread(FROM_HERE, base::Bind(bta_dm_set_dev_name, name));
    103 }
    104 
    105 /** This function sets the Bluetooth connectable, discoverable, pairable and
    106  * conn paired only modes of local device
    107  */
    108 void BTA_DmSetVisibility(tBTA_DM_DISC disc_mode, tBTA_DM_CONN conn_mode,
    109                          uint8_t pairable_mode, uint8_t conn_paired_only) {
    110   do_in_bta_thread(FROM_HERE,
    111                    base::Bind(bta_dm_set_visibility, disc_mode, conn_mode,
    112                               pairable_mode, conn_paired_only));
    113 }
    114 
    115 /*******************************************************************************
    116  *
    117  * Function         BTA_DmSearch
    118  *
    119  * Description      This function searches for peer Bluetooth devices. It
    120  *                  performs an inquiry and gets the remote name for devices.
    121  *                  Service discovery is done if services is non zero
    122  *
    123  *
    124  * Returns          void
    125  *
    126  ******************************************************************************/
    127 void BTA_DmSearch(tBTA_DM_INQ* p_dm_inq, tBTA_SERVICE_MASK services,
    128                   tBTA_DM_SEARCH_CBACK* p_cback) {
    129   tBTA_DM_API_SEARCH* p_msg =
    130       (tBTA_DM_API_SEARCH*)osi_calloc(sizeof(tBTA_DM_API_SEARCH));
    131 
    132   p_msg->hdr.event = BTA_DM_API_SEARCH_EVT;
    133   memcpy(&p_msg->inq_params, p_dm_inq, sizeof(tBTA_DM_INQ));
    134   p_msg->services = services;
    135   p_msg->p_cback = p_cback;
    136   p_msg->rs_res = BTA_DM_RS_NONE;
    137 
    138   bta_sys_sendmsg(p_msg);
    139 }
    140 
    141 /*******************************************************************************
    142  *
    143  * Function         BTA_DmSearchCancel
    144  *
    145  * Description      This function  cancels a search initiated by BTA_DmSearch
    146  *
    147  *
    148  * Returns          void
    149  *
    150  ******************************************************************************/
    151 void BTA_DmSearchCancel(void) {
    152   BT_HDR* p_msg = (BT_HDR*)osi_malloc(sizeof(BT_HDR));
    153 
    154   p_msg->event = BTA_DM_API_SEARCH_CANCEL_EVT;
    155   bta_sys_sendmsg(p_msg);
    156 }
    157 
    158 /*******************************************************************************
    159  *
    160  * Function         BTA_DmDiscover
    161  *
    162  * Description      This function does service discovery for services of a
    163  *                  peer device
    164  *
    165  *
    166  * Returns          void
    167  *
    168  ******************************************************************************/
    169 void BTA_DmDiscover(const RawAddress& bd_addr, tBTA_SERVICE_MASK services,
    170                     tBTA_DM_SEARCH_CBACK* p_cback, bool sdp_search) {
    171   tBTA_DM_API_DISCOVER* p_msg =
    172       (tBTA_DM_API_DISCOVER*)osi_calloc(sizeof(tBTA_DM_API_DISCOVER));
    173 
    174   p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT;
    175   p_msg->bd_addr = bd_addr;
    176   p_msg->services = services;
    177   p_msg->p_cback = p_cback;
    178   p_msg->sdp_search = sdp_search;
    179 
    180   bta_sys_sendmsg(p_msg);
    181 }
    182 
    183 /*******************************************************************************
    184  *
    185  * Function         BTA_DmDiscoverUUID
    186  *
    187  * Description      This function does service discovery for services of a
    188  *                  peer device
    189  *
    190  *
    191  * Returns          void
    192  *
    193  ******************************************************************************/
    194 void BTA_DmDiscoverUUID(const RawAddress& bd_addr, const Uuid& uuid,
    195                         tBTA_DM_SEARCH_CBACK* p_cback, bool sdp_search) {
    196   tBTA_DM_API_DISCOVER* p_msg =
    197       (tBTA_DM_API_DISCOVER*)osi_malloc(sizeof(tBTA_DM_API_DISCOVER));
    198 
    199   p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT;
    200   p_msg->bd_addr = bd_addr;
    201   p_msg->services = BTA_USER_SERVICE_MASK;  // Not exposed at API level
    202   p_msg->p_cback = p_cback;
    203   p_msg->sdp_search = sdp_search;
    204 
    205   p_msg->num_uuid = 0;
    206   p_msg->p_uuid = NULL;
    207   p_msg->uuid = uuid;
    208 
    209   bta_sys_sendmsg(p_msg);
    210 }
    211 
    212 /** This function initiates a bonding procedure with a peer device */
    213 void BTA_DmBond(const RawAddress& bd_addr) {
    214   do_in_bta_thread(FROM_HERE,
    215                    base::Bind(bta_dm_bond, bd_addr, BTA_TRANSPORT_UNKNOWN));
    216 }
    217 
    218 /** This function initiates a bonding procedure with a peer device */
    219 void BTA_DmBondByTransport(const RawAddress& bd_addr,
    220                            tBTA_TRANSPORT transport) {
    221   do_in_bta_thread(FROM_HERE, base::Bind(bta_dm_bond, bd_addr, transport));
    222 }
    223 
    224 /** This function cancels the bonding procedure with a peer device
    225  */
    226 void BTA_DmBondCancel(const RawAddress& bd_addr) {
    227   do_in_bta_thread(FROM_HERE, base::Bind(bta_dm_bond_cancel, bd_addr));
    228 }
    229 
    230 /*******************************************************************************
    231  *
    232  * Function         BTA_DmPinReply
    233  *
    234  * Description      This function provides a pincode for a remote device when
    235  *                  one is requested by DM through BTA_DM_PIN_REQ_EVT
    236  *
    237  *
    238  * Returns          void
    239  *
    240  ******************************************************************************/
    241 void BTA_DmPinReply(const RawAddress& bd_addr, bool accept, uint8_t pin_len,
    242                     uint8_t* p_pin) {
    243   std::unique_ptr<tBTA_DM_API_PIN_REPLY> msg =
    244       std::make_unique<tBTA_DM_API_PIN_REPLY>();
    245 
    246   msg->bd_addr = bd_addr;
    247   msg->accept = accept;
    248   if (accept) {
    249     msg->pin_len = pin_len;
    250     memcpy(msg->p_pin, p_pin, pin_len);
    251   }
    252 
    253   do_in_bta_thread(FROM_HERE, base::Bind(bta_dm_pin_reply, base::Passed(&msg)));
    254 }
    255 
    256 /*******************************************************************************
    257  *
    258  * Function         BTA_DmLocalOob
    259  *
    260  * Description      This function retrieves the OOB data from local controller.
    261  *                  The result is reported by:
    262  *                  - bta_dm_co_loc_oob_ext() if device supports secure
    263  *                    connections (SC)
    264  *                  - bta_dm_co_loc_oob() if device doesn't support SC
    265  *
    266  * Returns          void
    267  *
    268  ******************************************************************************/
    269 void BTA_DmLocalOob(void) {
    270   do_in_bta_thread(FROM_HERE, base::Bind(BTM_ReadLocalOobData));
    271 }
    272 
    273 /*******************************************************************************
    274  *
    275  * Function         BTA_DmConfirm
    276  *
    277  * Description      This function accepts or rejects the numerical value of the
    278  *                  Simple Pairing process on BTA_DM_SP_CFM_REQ_EVT
    279  *
    280  * Returns          void
    281  *
    282  ******************************************************************************/
    283 void BTA_DmConfirm(const RawAddress& bd_addr, bool accept) {
    284   do_in_bta_thread(FROM_HERE, base::Bind(bta_dm_confirm, bd_addr, accept));
    285 }
    286 
    287 /*******************************************************************************
    288  *
    289  * Function         BTA_DmAddDevice
    290  *
    291  * Description      This function adds a device to the security database list of
    292  *                  peer device
    293  *
    294  *
    295  * Returns          void
    296  *
    297  ******************************************************************************/
    298 void BTA_DmAddDevice(const RawAddress& bd_addr, DEV_CLASS dev_class,
    299                      LINK_KEY link_key, tBTA_SERVICE_MASK trusted_mask,
    300                      bool is_trusted, uint8_t key_type, tBTA_IO_CAP io_cap,
    301                      uint8_t pin_length) {
    302   std::unique_ptr<tBTA_DM_API_ADD_DEVICE> msg =
    303       std::make_unique<tBTA_DM_API_ADD_DEVICE>();
    304 
    305   msg->bd_addr = bd_addr;
    306   msg->tm = trusted_mask;
    307   msg->is_trusted = is_trusted;
    308   msg->io_cap = io_cap;
    309 
    310   if (link_key) {
    311     msg->link_key_known = true;
    312     msg->key_type = key_type;
    313     memcpy(msg->link_key, link_key, LINK_KEY_LEN);
    314   }
    315 
    316   /* Load device class if specified */
    317   if (dev_class) {
    318     msg->dc_known = true;
    319     memcpy(msg->dc, dev_class, DEV_CLASS_LEN);
    320   }
    321 
    322   memset(msg->bd_name, 0, BD_NAME_LEN + 1);
    323   memset(msg->features, 0, sizeof(msg->features));
    324   msg->pin_length = pin_length;
    325 
    326   do_in_bta_thread(FROM_HERE,
    327                    base::Bind(bta_dm_add_device, base::Passed(&msg)));
    328 }
    329 
    330 /** This function removes a device fromthe security database list of peer
    331  * device. It manages unpairing even while connected */
    332 tBTA_STATUS BTA_DmRemoveDevice(const RawAddress& bd_addr) {
    333   do_in_bta_thread(FROM_HERE, base::Bind(bta_dm_remove_device, bd_addr));
    334   return BTA_SUCCESS;
    335 }
    336 
    337 /*******************************************************************************
    338  *
    339  * Function         BTA_GetEirService
    340  *
    341  * Description      This function is called to get BTA service mask from EIR.
    342  *
    343  * Parameters       p_eir - pointer of EIR significant part
    344  *                  p_services - return the BTA service mask
    345  *
    346  * Returns          None
    347  *
    348  ******************************************************************************/
    349 extern const uint16_t bta_service_id_to_uuid_lkup_tbl[];
    350 void BTA_GetEirService(uint8_t* p_eir, size_t eir_len,
    351                        tBTA_SERVICE_MASK* p_services) {
    352   uint8_t xx, yy;
    353   uint8_t num_uuid, max_num_uuid = 32;
    354   uint8_t uuid_list[32 * Uuid::kNumBytes16];
    355   uint16_t* p_uuid16 = (uint16_t*)uuid_list;
    356   tBTA_SERVICE_MASK mask;
    357 
    358   BTM_GetEirUuidList(p_eir, eir_len, Uuid::kNumBytes16, &num_uuid, uuid_list,
    359                      max_num_uuid);
    360   for (xx = 0; xx < num_uuid; xx++) {
    361     mask = 1;
    362     for (yy = 0; yy < BTA_MAX_SERVICE_ID; yy++) {
    363       if (*(p_uuid16 + xx) == bta_service_id_to_uuid_lkup_tbl[yy]) {
    364         *p_services |= mask;
    365         break;
    366       }
    367       mask <<= 1;
    368     }
    369 
    370     /* for HSP v1.2 only device */
    371     if (*(p_uuid16 + xx) == UUID_SERVCLASS_HEADSET_HS)
    372       *p_services |= BTA_HSP_SERVICE_MASK;
    373 
    374     if (*(p_uuid16 + xx) == UUID_SERVCLASS_HDP_SOURCE)
    375       *p_services |= BTA_HL_SERVICE_MASK;
    376 
    377     if (*(p_uuid16 + xx) == UUID_SERVCLASS_HDP_SINK)
    378       *p_services |= BTA_HL_SERVICE_MASK;
    379   }
    380 }
    381 
    382 /*******************************************************************************
    383  *
    384  * Function         BTA_DmGetConnectionState
    385  *
    386  * Description      Returns whether the remote device is currently connected.
    387  *
    388  * Returns          0 if the device is NOT connected.
    389  *
    390  ******************************************************************************/
    391 uint16_t BTA_DmGetConnectionState(const RawAddress& bd_addr) {
    392   tBTA_DM_PEER_DEVICE* p_dev = bta_dm_find_peer_device(bd_addr);
    393   return (p_dev && p_dev->conn_state == BTA_DM_CONNECTED);
    394 }
    395 
    396 /*******************************************************************************
    397  *                   Device Identification (DI) Server Functions
    398  ******************************************************************************/
    399 /*******************************************************************************
    400  *
    401  * Function         BTA_DmSetLocalDiRecord
    402  *
    403  * Description      This function adds a DI record to the local SDP database.
    404  *
    405  * Returns          BTA_SUCCESS if record set sucessfully, otherwise error code.
    406  *
    407  ******************************************************************************/
    408 tBTA_STATUS BTA_DmSetLocalDiRecord(tBTA_DI_RECORD* p_device_info,
    409                                    uint32_t* p_handle) {
    410   tBTA_STATUS status = BTA_FAILURE;
    411 
    412   if (bta_dm_di_cb.di_num < BTA_DI_NUM_MAX) {
    413     if (SDP_SetLocalDiRecord((tSDP_DI_RECORD*)p_device_info, p_handle) ==
    414         SDP_SUCCESS) {
    415       if (!p_device_info->primary_record) {
    416         bta_dm_di_cb.di_handle[bta_dm_di_cb.di_num] = *p_handle;
    417         bta_dm_di_cb.di_num++;
    418       }
    419 
    420       bta_sys_add_uuid(UUID_SERVCLASS_PNP_INFORMATION);
    421       status = BTA_SUCCESS;
    422     }
    423   }
    424 
    425   return status;
    426 }
    427 
    428 /*******************************************************************************
    429  *
    430  * Function         BTA_DmAddBleKey
    431  *
    432  * Description      Add/modify LE device information.  This function will be
    433  *                  normally called during host startup to restore all required
    434  *                  information stored in the NVRAM.
    435  *
    436  * Parameters:      bd_addr          - BD address of the peer
    437  *                  p_le_key         - LE key values.
    438  *                  key_type         - LE SMP key type.
    439  *
    440  * Returns          BTA_SUCCESS if successful
    441  *                  BTA_FAIL if operation failed.
    442  *
    443  ******************************************************************************/
    444 void BTA_DmAddBleKey(const RawAddress& bd_addr, tBTA_LE_KEY_VALUE* p_le_key,
    445                      tBTA_LE_KEY_TYPE key_type) {
    446   do_in_bta_thread(FROM_HERE,
    447                    base::Bind(bta_dm_add_blekey, bd_addr, *p_le_key, key_type));
    448 }
    449 
    450 /*******************************************************************************
    451  *
    452  * Function         BTA_DmAddBleDevice
    453  *
    454  * Description      Add a BLE device.  This function will be normally called
    455  *                  during host startup to restore all required information
    456  *                  for a LE device stored in the NVRAM.
    457  *
    458  * Parameters:      bd_addr          - BD address of the peer
    459  *                  dev_type         - Remote device's device type.
    460  *                  addr_type        - LE device address type.
    461  *
    462  * Returns          void
    463  *
    464  ******************************************************************************/
    465 void BTA_DmAddBleDevice(const RawAddress& bd_addr, tBLE_ADDR_TYPE addr_type,
    466                         tBT_DEVICE_TYPE dev_type) {
    467   do_in_bta_thread(FROM_HERE, base::Bind(bta_dm_add_ble_device, bd_addr,
    468                                          addr_type, dev_type));
    469 }
    470 
    471 /*******************************************************************************
    472  *
    473  * Function         BTA_DmBlePasskeyReply
    474  *
    475  * Description      Send BLE SMP passkey reply.
    476  *
    477  * Parameters:      bd_addr          - BD address of the peer
    478  *                  accept           - passkey entry sucessful or declined.
    479  *                  passkey          - passkey value, must be a 6 digit number,
    480  *                                     can be lead by 0.
    481  *
    482  * Returns          void
    483  *
    484  ******************************************************************************/
    485 void BTA_DmBlePasskeyReply(const RawAddress& bd_addr, bool accept,
    486                            uint32_t passkey) {
    487   do_in_bta_thread(FROM_HERE, base::Bind(bta_dm_ble_passkey_reply, bd_addr,
    488                                          accept, accept ? passkey : 0));
    489 }
    490 
    491 /*******************************************************************************
    492  *
    493  * Function         BTA_DmBleConfirmReply
    494  *
    495  * Description      Send BLE SMP SC user confirmation reply.
    496  *
    497  * Parameters:      bd_addr          - BD address of the peer
    498  *                  accept           - numbers to compare are the same or
    499  *                                     different.
    500  *
    501  * Returns          void
    502  *
    503  ******************************************************************************/
    504 void BTA_DmBleConfirmReply(const RawAddress& bd_addr, bool accept) {
    505   do_in_bta_thread(FROM_HERE,
    506                    base::Bind(bta_dm_ble_confirm_reply, bd_addr, accept));
    507 }
    508 
    509 /*******************************************************************************
    510  *
    511  * Function         BTA_DmBleSecurityGrant
    512  *
    513  * Description      Grant security request access.
    514  *
    515  * Parameters:      bd_addr          - BD address of the peer
    516  *                  res              - security grant status.
    517  *
    518  * Returns          void
    519  *
    520  ******************************************************************************/
    521 void BTA_DmBleSecurityGrant(const RawAddress& bd_addr,
    522                             tBTA_DM_BLE_SEC_GRANT res) {
    523   do_in_bta_thread(FROM_HERE, base::Bind(BTM_SecurityGrant, bd_addr, res));
    524 }
    525 
    526 /*******************************************************************************
    527  *
    528  * Function         BTA_DmSetBlePrefConnParams
    529  *
    530  * Description      This function is called to set the preferred connection
    531  *                  parameters when default connection parameter is not desired.
    532  *
    533  * Parameters:      bd_addr          - BD address of the peripheral
    534  *                  scan_interval    - scan interval
    535  *                  scan_window      - scan window
    536  *                  min_conn_int     - minimum preferred connection interval
    537  *                  max_conn_int     - maximum preferred connection interval
    538  *                  slave_latency    - preferred slave latency
    539  *                  supervision_tout - preferred supervision timeout
    540  *
    541  *
    542  * Returns          void
    543  *
    544  ******************************************************************************/
    545 void BTA_DmSetBlePrefConnParams(const RawAddress& bd_addr,
    546                                 uint16_t min_conn_int, uint16_t max_conn_int,
    547                                 uint16_t slave_latency,
    548                                 uint16_t supervision_tout) {
    549   do_in_bta_thread(FROM_HERE,
    550                    base::Bind(bta_dm_ble_set_conn_params, bd_addr, min_conn_int,
    551                               max_conn_int, slave_latency, supervision_tout));
    552 }
    553 
    554 /*******************************************************************************
    555  *
    556  * Function         BTA_DmSetBleConnScanParams
    557  *
    558  * Description      This function is called to set scan parameters used in
    559  *                  BLE connection request
    560  *
    561  * Parameters:      scan_interval    - scan interval
    562  *                  scan_window      - scan window
    563  *
    564  * Returns          void
    565  *
    566  ******************************************************************************/
    567 void BTA_DmSetBleConnScanParams(uint32_t scan_interval, uint32_t scan_window) {
    568   do_in_bta_thread(FROM_HERE, base::Bind(bta_dm_ble_set_conn_scan_params,
    569                                          scan_interval, scan_window));
    570 }
    571 
    572 /** Set BLE connectable mode to auto connect */
    573 void BTA_DmBleStartAutoConn() {
    574   do_in_bta_thread(FROM_HERE, base::Bind(BTM_BleStartAutoConn));
    575 }
    576 
    577 /*******************************************************************************
    578  *
    579  * Function         bta_dm_discover_send_msg
    580  *
    581  * Description      This function send discover message to BTA task.
    582  *
    583  * Returns          void
    584  *
    585  ******************************************************************************/
    586 static void bta_dm_discover_send_msg(const RawAddress& bd_addr,
    587                                      tBTA_SERVICE_MASK_EXT* p_services,
    588                                      tBTA_DM_SEARCH_CBACK* p_cback,
    589                                      bool sdp_search,
    590                                      tBTA_TRANSPORT transport) {
    591   const size_t len =
    592       p_services
    593           ? (sizeof(tBTA_DM_API_DISCOVER) + sizeof(Uuid) * p_services->num_uuid)
    594           : sizeof(tBTA_DM_API_DISCOVER);
    595   tBTA_DM_API_DISCOVER* p_msg = (tBTA_DM_API_DISCOVER*)osi_calloc(len);
    596 
    597   p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT;
    598   p_msg->bd_addr = bd_addr;
    599   p_msg->p_cback = p_cback;
    600   p_msg->sdp_search = sdp_search;
    601   p_msg->transport = transport;
    602 
    603   if (p_services != NULL) {
    604     p_msg->services = p_services->srvc_mask;
    605     p_msg->num_uuid = p_services->num_uuid;
    606     if (p_services->num_uuid != 0) {
    607       p_msg->p_uuid = (Uuid*)(p_msg + 1);
    608       memcpy(p_msg->p_uuid, p_services->p_uuid,
    609              sizeof(Uuid) * p_services->num_uuid);
    610     }
    611   }
    612 
    613   bta_sys_sendmsg(p_msg);
    614 }
    615 
    616 /*******************************************************************************
    617  *
    618  * Function         BTA_DmDiscoverByTransport
    619  *
    620  * Description      This function does service discovery on particular transport
    621  *                  for services of a
    622  *                  peer device. When services.num_uuid is 0, it indicates all
    623  *                  GATT based services are to be searched; otherwise a list of
    624  *                  UUID of interested services should be provided through
    625  *                  p_services->p_uuid.
    626  *
    627  *
    628  *
    629  * Returns          void
    630  *
    631  ******************************************************************************/
    632 void BTA_DmDiscoverByTransport(const RawAddress& bd_addr,
    633                                tBTA_SERVICE_MASK_EXT* p_services,
    634                                tBTA_DM_SEARCH_CBACK* p_cback, bool sdp_search,
    635                                tBTA_TRANSPORT transport) {
    636   bta_dm_discover_send_msg(bd_addr, p_services, p_cback, sdp_search, transport);
    637 }
    638 
    639 /*******************************************************************************
    640  *
    641  * Function         BTA_DmDiscoverExt
    642  *
    643  * Description      This function does service discovery for services of a
    644  *                  peer device. When services.num_uuid is 0, it indicates all
    645  *                  GATT based services are to be searched; other wise a list of
    646  *                  UUID of interested services should be provided through
    647  *                  p_services->p_uuid.
    648  *
    649  *
    650  *
    651  * Returns          void
    652  *
    653  ******************************************************************************/
    654 void BTA_DmDiscoverExt(const RawAddress& bd_addr,
    655                        tBTA_SERVICE_MASK_EXT* p_services,
    656                        tBTA_DM_SEARCH_CBACK* p_cback, bool sdp_search) {
    657   bta_dm_discover_send_msg(bd_addr, p_services, p_cback, sdp_search,
    658                            BTA_TRANSPORT_UNKNOWN);
    659 }
    660 
    661 /*******************************************************************************
    662  *
    663  * Function         BTA_DmSearchExt
    664  *
    665  * Description      This function searches for peer Bluetooth devices. It
    666  *                  performs an inquiry and gets the remote name for devices.
    667  *                  Service discovery is done if services is non zero
    668  *
    669  * Parameters       p_dm_inq: inquiry conditions
    670  *                  p_services: if service is not empty, service discovery will
    671  *                              be done. For all GATT based service conditions,
    672  *                              put num_uuid, and p_uuid is the pointer to the
    673  *                              list of UUID values.
    674  *                  p_cback: callback function when search is completed.
    675  *
    676  *
    677  *
    678  * Returns          void
    679  *
    680  ******************************************************************************/
    681 void BTA_DmSearchExt(tBTA_DM_INQ* p_dm_inq, tBTA_SERVICE_MASK_EXT* p_services,
    682                      tBTA_DM_SEARCH_CBACK* p_cback) {
    683   const size_t len =
    684       p_services
    685           ? (sizeof(tBTA_DM_API_SEARCH) + sizeof(Uuid) * p_services->num_uuid)
    686           : sizeof(tBTA_DM_API_SEARCH);
    687   tBTA_DM_API_SEARCH* p_msg = (tBTA_DM_API_SEARCH*)osi_calloc(len);
    688 
    689   p_msg->hdr.event = BTA_DM_API_SEARCH_EVT;
    690   memcpy(&p_msg->inq_params, p_dm_inq, sizeof(tBTA_DM_INQ));
    691   p_msg->p_cback = p_cback;
    692   p_msg->rs_res = BTA_DM_RS_NONE;
    693 
    694   if (p_services != NULL) {
    695     p_msg->services = p_services->srvc_mask;
    696     p_msg->num_uuid = p_services->num_uuid;
    697 
    698     if (p_services->num_uuid != 0) {
    699       p_msg->p_uuid = (Uuid*)(p_msg + 1);
    700       memcpy(p_msg->p_uuid, p_services->p_uuid,
    701              sizeof(Uuid) * p_services->num_uuid);
    702     } else {
    703       p_msg->p_uuid = NULL;
    704     }
    705   }
    706 
    707   bta_sys_sendmsg(p_msg);
    708 }
    709 
    710 /*******************************************************************************
    711  *
    712  * Function         BTA_DmBleUpdateConnectionParam
    713  *
    714  * Description      Update connection parameters, can only be used when
    715  *                  connection is up.
    716  *
    717  * Parameters:      bd_addr          - BD address of the peer
    718  *                  min_int   -     minimum connection interval,
    719  *                                  [0x0004 ~ 0x4000]
    720  *                  max_int   -     maximum connection interval,
    721  *                                  [0x0004 ~ 0x4000]
    722  *                  latency   -     slave latency [0 ~ 500]
    723  *                  timeout   -     supervision timeout [0x000a ~ 0xc80]
    724  *
    725  * Returns          void
    726  *
    727  ******************************************************************************/
    728 void BTA_DmBleUpdateConnectionParams(const RawAddress& bd_addr,
    729                                      uint16_t min_int, uint16_t max_int,
    730                                      uint16_t latency, uint16_t timeout,
    731                                      uint16_t min_ce_len, uint16_t max_ce_len) {
    732   do_in_bta_thread(
    733       FROM_HERE, base::Bind(bta_dm_ble_update_conn_params, bd_addr, min_int,
    734                             max_int, latency, timeout, min_ce_len, max_ce_len));
    735 }
    736 
    737 /*******************************************************************************
    738  *
    739  * Function         BTA_DmBleConfigLocalPrivacy
    740  *
    741  * Description      Enable/disable privacy on the local device
    742  *
    743  * Parameters:      privacy_enable   - enable/disabe privacy on remote device.
    744  *
    745  * Returns          void
    746  *
    747  ******************************************************************************/
    748 void BTA_DmBleConfigLocalPrivacy(bool privacy_enable) {
    749 #if (BLE_PRIVACY_SPT == TRUE)
    750   do_in_bta_thread(FROM_HERE,
    751                    base::Bind(bta_dm_ble_config_local_privacy, privacy_enable));
    752 #else
    753   UNUSED(privacy_enable);
    754 #endif
    755 }
    756 
    757 /*******************************************************************************
    758  *
    759  * Function         BTA_DmBleGetEnergyInfo
    760  *
    761  * Description      This function is called to obtain the energy info
    762  *
    763  * Parameters       p_cmpl_cback - Command complete callback
    764  *
    765  * Returns          void
    766  *
    767  ******************************************************************************/
    768 void BTA_DmBleGetEnergyInfo(tBTA_BLE_ENERGY_INFO_CBACK* p_cmpl_cback) {
    769   do_in_bta_thread(FROM_HERE,
    770                    base::Bind(bta_dm_ble_get_energy_info, p_cmpl_cback));
    771 }
    772 
    773 /** This function is to set maximum LE data packet size */
    774 void BTA_DmBleSetDataLength(const RawAddress& remote_device,
    775                             uint16_t tx_data_length) {
    776   do_in_bta_thread(FROM_HERE, base::Bind(bta_dm_ble_set_data_length,
    777                                          remote_device, tx_data_length));
    778 }
    779 
    780 /*******************************************************************************
    781  *
    782  * Function         BTA_DmSetEncryption
    783  *
    784  * Description      This function is called to ensure that connection is
    785  *                  encrypted.  Should be called only on an open connection.
    786  *                  Typically only needed for connections that first want to
    787  *                  bring up unencrypted links, then later encrypt them.
    788  *
    789  * Parameters:      bd_addr       - Address of the peer device
    790  *                  transport     - transport of the link to be encruypted
    791  *                  p_callback    - Pointer to callback function to indicat the
    792  *                                  link encryption status
    793  *                  sec_act       - This is the security action to indicate
    794  *                                  what kind of BLE security level is required
    795  *                                  for the BLE link if BLE is supported.
    796  *                                  Note: This parameter is ignored for the
    797  *                                        BR/EDR or if BLE is not supported.
    798  *
    799  * Returns          void
    800  *
    801  ******************************************************************************/
    802 void BTA_DmSetEncryption(const RawAddress& bd_addr, tBTA_TRANSPORT transport,
    803                          tBTA_DM_ENCRYPT_CBACK* p_callback,
    804                          tBTA_DM_BLE_SEC_ACT sec_act) {
    805   APPL_TRACE_API("%s", __func__);
    806   do_in_bta_thread(FROM_HERE, base::Bind(bta_dm_set_encryption, bd_addr,
    807                                          transport, p_callback, sec_act));
    808 }
    809 
    810 /*******************************************************************************
    811  *
    812  * Function         BTA_DmCloseACL
    813  *
    814  * Description      This function force to close an ACL connection and remove
    815  *                  the device from the security database list of known devices.
    816  *
    817  * Parameters:      bd_addr       - Address of the peer device
    818  *                  remove_dev    - remove device or not after link down
    819  *
    820  * Returns          void
    821  *
    822  ******************************************************************************/
    823 void BTA_DmCloseACL(const RawAddress& bd_addr, bool remove_dev,
    824                     tBTA_TRANSPORT transport) {
    825   do_in_bta_thread(
    826       FROM_HERE, base::Bind(bta_dm_close_acl, bd_addr, remove_dev, transport));
    827 }
    828 
    829 /*******************************************************************************
    830  *
    831  * Function         BTA_DmBleObserve
    832  *
    833  * Description      This procedure keep the device listening for advertising
    834  *                  events from a broadcast device.
    835  *
    836  * Parameters       start: start or stop observe.
    837  *
    838  * Returns          void
    839 
    840  *
    841  * Returns          void.
    842  *
    843  ******************************************************************************/
    844 extern void BTA_DmBleObserve(bool start, uint8_t duration,
    845                              tBTA_DM_SEARCH_CBACK* p_results_cb) {
    846   APPL_TRACE_API("%s:start = %d ", __func__, start);
    847   do_in_bta_thread(
    848       FROM_HERE, base::Bind(bta_dm_ble_observe, start, duration, p_results_cb));
    849 }
    850 
    851 /*******************************************************************************
    852  *
    853  * Function         BTA_VendorInit
    854  *
    855  * Description      This function initializes vendor specific
    856  *
    857  * Returns          void
    858  *
    859  ******************************************************************************/
    860 void BTA_VendorInit(void) { APPL_TRACE_API("BTA_VendorInit"); }
    861 
    862 /*******************************************************************************
    863  *
    864  * Function         BTA_VendorCleanup
    865  *
    866  * Description      This function frees up Broadcom specific VS specific dynamic
    867  *                  memory
    868  *
    869  * Returns          void
    870  *
    871  ******************************************************************************/
    872 void BTA_VendorCleanup(void) {
    873   tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
    874   BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
    875 
    876   if (cmn_ble_vsc_cb.max_filter > 0) {
    877     btm_ble_adv_filter_cleanup();
    878 #if (BLE_PRIVACY_SPT == TRUE)
    879     btm_ble_resolving_list_cleanup();
    880 #endif
    881   }
    882 
    883   if (cmn_ble_vsc_cb.tot_scan_results_strg > 0) btm_ble_batchscan_cleanup();
    884 
    885   if (cmn_ble_vsc_cb.adv_inst_max > 0) btm_ble_multi_adv_cleanup();
    886 }
    887