Home | History | Annotate | Download | only in dm
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2003-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  *  This is the API implementation file for the BTA device manager.
     22  *
     23  ******************************************************************************/
     24 
     25 #include "gki.h"
     26 #include "bd.h"
     27 #include "bta_sys.h"
     28 #include "bta_api.h"
     29 #include "bta_dm_int.h"
     30 #include "bta_sys_int.h"
     31 #include "btm_api.h"
     32 #include "btm_int.h"
     33 #include <string.h>
     34 
     35 /*****************************************************************************
     36 **  Constants
     37 *****************************************************************************/
     38 
     39 static const tBTA_SYS_REG bta_dm_reg =
     40 {
     41     bta_dm_sm_execute,
     42     bta_dm_sm_disable
     43 };
     44 
     45 static const tBTA_SYS_REG bta_dm_search_reg =
     46 {
     47     bta_dm_search_sm_execute,
     48     bta_dm_search_sm_disable
     49 };
     50 
     51 /*******************************************************************************
     52 **
     53 ** Function         BTA_EnableBluetooth
     54 **
     55 ** Description      Enables bluetooth service.  This function must be
     56 **                  called before any other functions in the BTA API are called.
     57 **
     58 **
     59 ** Returns          tBTA_STATUS
     60 **
     61 *******************************************************************************/
     62 tBTA_STATUS BTA_EnableBluetooth(tBTA_DM_SEC_CBACK *p_cback)
     63 {
     64 
     65     tBTA_DM_API_ENABLE    *p_msg;
     66 
     67     /* Bluetooth disabling is in progress */
     68     if (bta_dm_cb.disabling)
     69         return BTA_FAILURE;
     70 
     71     memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
     72 
     73     GKI_sched_lock();
     74     bta_sys_register (BTA_ID_DM, &bta_dm_reg );
     75     bta_sys_register (BTA_ID_DM_SEARCH, &bta_dm_search_reg );
     76 
     77     /* if UUID list is not provided as static data */
     78     bta_sys_eir_register(bta_dm_eir_update_uuid);
     79 
     80     GKI_sched_unlock();
     81 
     82     if ((p_msg = (tBTA_DM_API_ENABLE *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE))) != NULL)
     83     {
     84         p_msg->hdr.event = BTA_DM_API_ENABLE_EVT;
     85         p_msg->p_sec_cback = p_cback;
     86         bta_sys_sendmsg(p_msg);
     87         return BTA_SUCCESS;
     88     }
     89     return BTA_FAILURE;
     90 
     91 }
     92 
     93 /*******************************************************************************
     94 **
     95 ** Function         BTA_DisableBluetooth
     96 **
     97 ** Description      Disables bluetooth service.  This function is called when
     98 **                  the application no longer needs bluetooth service
     99 **
    100 ** Returns          void
    101 **
    102 *******************************************************************************/
    103 tBTA_STATUS BTA_DisableBluetooth(void)
    104 {
    105 
    106     BT_HDR    *p_msg;
    107 
    108     if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
    109     {
    110         p_msg->event = BTA_DM_API_DISABLE_EVT;
    111         bta_sys_sendmsg(p_msg);
    112     }
    113     else
    114     {
    115         return BTA_FAILURE;
    116     }
    117 
    118     return BTA_SUCCESS;
    119 }
    120 
    121 /*******************************************************************************
    122 **
    123 ** Function         BTA_EnableTestMode
    124 **
    125 ** Description      Enables bluetooth device under test mode
    126 **
    127 **
    128 ** Returns          tBTA_STATUS
    129 **
    130 *******************************************************************************/
    131 tBTA_STATUS BTA_EnableTestMode(void)
    132 {
    133     BT_HDR    *p_msg;
    134 
    135     APPL_TRACE_API0("BTA_EnableTestMode");
    136 
    137     if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
    138     {
    139         p_msg->event = BTA_DM_API_ENABLE_TEST_MODE_EVT;
    140         bta_sys_sendmsg(p_msg);
    141         return BTA_SUCCESS;
    142     }
    143     return BTA_FAILURE;
    144 }
    145 
    146 /*******************************************************************************
    147 **
    148 ** Function         BTA_DisableTestMode
    149 **
    150 ** Description      Disable bluetooth device under test mode
    151 **
    152 **
    153 ** Returns          None
    154 **
    155 *******************************************************************************/
    156 void BTA_DisableTestMode(void)
    157 {
    158     BT_HDR    *p_msg;
    159 
    160     APPL_TRACE_API0("BTA_DisableTestMode");
    161 
    162     if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
    163     {
    164         p_msg->event = BTA_DM_API_DISABLE_TEST_MODE_EVT;
    165         bta_sys_sendmsg(p_msg);
    166     }
    167 }
    168 
    169 /*******************************************************************************
    170 **
    171 ** Function         BTA_DmIsDeviceUp
    172 **
    173 ** Description      Called during startup to check whether the bluetooth module
    174 **                  is up and ready
    175 **
    176 ** Returns          BOOLEAN
    177 **
    178 *******************************************************************************/
    179 BOOLEAN BTA_DmIsDeviceUp(void)
    180 {
    181 
    182     BOOLEAN status;
    183 
    184     GKI_sched_lock();
    185     status = BTM_IsDeviceUp();
    186     GKI_sched_unlock();
    187     return status;
    188 
    189 }
    190 
    191 /*******************************************************************************
    192 **
    193 ** Function         BTA_DmSetDeviceName
    194 **
    195 ** Description      This function sets the Bluetooth name of local device
    196 **
    197 **
    198 ** Returns          void
    199 **
    200 *******************************************************************************/
    201 void BTA_DmSetDeviceName(char *p_name)
    202 {
    203 
    204     tBTA_DM_API_SET_NAME    *p_msg;
    205 
    206     if ((p_msg = (tBTA_DM_API_SET_NAME *) GKI_getbuf(sizeof(tBTA_DM_API_SET_NAME))) != NULL)
    207     {
    208         p_msg->hdr.event = BTA_DM_API_SET_NAME_EVT;
    209         /* truncate the name if needed */
    210         BCM_STRNCPY_S(p_msg->name, sizeof(p_msg->name), p_name, BD_NAME_LEN-1);
    211         p_msg->name[BD_NAME_LEN-1]=0;
    212 
    213         bta_sys_sendmsg(p_msg);
    214     }
    215 
    216 
    217 }
    218 
    219 /*******************************************************************************
    220 **
    221 ** Function         BTA_DmSetVisibility
    222 **
    223 ** Description      This function sets the Bluetooth connectable,
    224 **                  discoverable, pairable and conn paired only modes of local device
    225 **
    226 **
    227 ** Returns          void
    228 **
    229 *******************************************************************************/
    230 void BTA_DmSetVisibility(tBTA_DM_DISC disc_mode, tBTA_DM_CONN conn_mode, UINT8 pairable_mode, UINT8 conn_filter )
    231 {
    232 
    233     tBTA_DM_API_SET_VISIBILITY    *p_msg;
    234 
    235     if ((p_msg = (tBTA_DM_API_SET_VISIBILITY *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
    236     {
    237         p_msg->hdr.event = BTA_DM_API_SET_VISIBILITY_EVT;
    238         p_msg->disc_mode = disc_mode;
    239         p_msg->conn_mode = conn_mode;
    240         p_msg->pair_mode = pairable_mode;
    241         p_msg->conn_paired_only = conn_filter;
    242 
    243 
    244         bta_sys_sendmsg(p_msg);
    245     }
    246 
    247 
    248 }
    249 
    250 /*******************************************************************************
    251 **
    252 ** Function         BTA_DmSetScanParam
    253 **
    254 ** Description      This function sets the parameters for page scan and
    255 **                  inquiry scan.
    256 **
    257 **
    258 ** Returns          void
    259 **
    260 *******************************************************************************/
    261 void BTA_DmSetScanParam (UINT16 page_scan_interval, UINT16 page_scan_window,
    262                                   UINT16 inquiry_scan_interval, UINT16 inquiry_scan_window)
    263 {
    264     APPL_TRACE_API4 ("BTA_DmSetScanParam: %d, %d, %d, %d",
    265             page_scan_interval, page_scan_window,
    266             inquiry_scan_interval, inquiry_scan_window);
    267 
    268     bta_dm_cb.page_scan_interval = page_scan_interval;
    269     bta_dm_cb.page_scan_window = page_scan_window;
    270     bta_dm_cb.inquiry_scan_interval = inquiry_scan_interval;
    271     bta_dm_cb.inquiry_scan_window = inquiry_scan_window;
    272 }
    273 
    274 /*******************************************************************************
    275 **
    276 ** Function         BTA_DmSetAfhChannels
    277 **
    278 ** Description      This function sets the AFH first and
    279 **                  last disable channel, so channels within
    280 **                  that range are disabled.
    281 **
    282 ** Returns          void
    283 **
    284 *******************************************************************************/
    285 void BTA_DmSetAfhChannels(UINT8 first, UINT8 last)
    286 {
    287 
    288     tBTA_DM_API_SET_AFH_CHANNELS_EVT    *p_msg;
    289 
    290     if ((p_msg = (tBTA_DM_API_SET_AFH_CHANNELS_EVT *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
    291     {
    292         p_msg->hdr.event = BTA_DM_API_SET_AFH_CHANNELS_EVT;
    293         p_msg->first = first;
    294         p_msg->last = last;
    295         bta_sys_sendmsg(p_msg);
    296     }
    297 
    298 
    299 }
    300 
    301 /*******************************************************************************
    302 **
    303 ** Function         BTA_SetAfhChannelAssessment
    304 **
    305 ** Description      This function is called to set the channel assessment mode on or off
    306 **
    307 ** Returns          status
    308 **
    309 *******************************************************************************/
    310 void BTA_DmSetAfhChannelAssessment (BOOLEAN enable_or_disable)
    311 {
    312     tBTA_DM_API_SET_AFH_CHANNEL_ASSESSMENT *p_msg;
    313 
    314     if ((p_msg = (tBTA_DM_API_SET_AFH_CHANNEL_ASSESSMENT *) GKI_getbuf(sizeof(tBTA_DM_API_SET_AFH_CHANNEL_ASSESSMENT))) != NULL)
    315     {
    316         p_msg->hdr.event    = BTA_DM_API_SET_AFH_CHANNEL_ASSESMENT_EVT;
    317         p_msg->enable_or_disable = enable_or_disable;
    318         bta_sys_sendmsg(p_msg);
    319     }
    320 }
    321 
    322 /*******************************************************************************
    323 **
    324 ** Function         BTA_DmVendorSpecificCommand
    325 **
    326 ** Description      This function sends the vendor specific command
    327 **                  to the controller
    328 **
    329 **
    330 ** Returns          tBTA_STATUS
    331 **
    332 *******************************************************************************/
    333 tBTA_STATUS BTA_DmVendorSpecificCommand (UINT16 opcode, UINT8 param_len,
    334                                          UINT8 *p_param_buf,
    335                                          tBTA_VENDOR_CMPL_CBACK *p_cback)
    336 {
    337 
    338     tBTA_DM_API_VENDOR_SPECIFIC_COMMAND    *p_msg;
    339     UINT16 size;
    340 
    341     /* If p_cback is NULL, Notify application */
    342     if (p_cback == NULL)
    343     {
    344         return (BTA_FAILURE);
    345     }
    346     else
    347     {
    348         size = sizeof (tBTA_DM_API_VENDOR_SPECIFIC_COMMAND) + param_len;
    349         if ((p_msg = (tBTA_DM_API_VENDOR_SPECIFIC_COMMAND *) GKI_getbuf(size)) != NULL)
    350         {
    351             p_msg->hdr.event = BTA_DM_API_VENDOR_SPECIFIC_COMMAND_EVT;
    352             p_msg->opcode = opcode;
    353             p_msg->param_len = param_len;
    354             p_msg->p_param_buf = (UINT8 *)(p_msg + 1);
    355             p_msg->p_cback = p_cback;
    356 
    357             memcpy (p_msg->p_param_buf, p_param_buf, param_len);
    358 
    359             bta_sys_sendmsg(p_msg);
    360         }
    361         return (BTA_SUCCESS);
    362     }
    363 }
    364 /*******************************************************************************
    365 **
    366 ** Function         BTA_DmSearch
    367 **
    368 ** Description      This function searches for peer Bluetooth devices. It performs
    369 **                  an inquiry and gets the remote name for devices. Service
    370 **                  discovery is done if services is non zero
    371 **
    372 **
    373 ** Returns          void
    374 **
    375 *******************************************************************************/
    376 void BTA_DmSearch(tBTA_DM_INQ *p_dm_inq, tBTA_SERVICE_MASK services, tBTA_DM_SEARCH_CBACK *p_cback)
    377 {
    378 
    379     tBTA_DM_API_SEARCH    *p_msg;
    380 
    381     if ((p_msg = (tBTA_DM_API_SEARCH *) GKI_getbuf(sizeof(tBTA_DM_API_SEARCH))) != NULL)
    382     {
    383         memset(p_msg, 0, sizeof(tBTA_DM_API_SEARCH));
    384 
    385         p_msg->hdr.event = BTA_DM_API_SEARCH_EVT;
    386         memcpy(&p_msg->inq_params, p_dm_inq, sizeof(tBTA_DM_INQ));
    387         p_msg->services = services;
    388         p_msg->p_cback = p_cback;
    389         p_msg->rs_res  = BTA_DM_RS_NONE;
    390         bta_sys_sendmsg(p_msg);
    391     }
    392 
    393 }
    394 
    395 
    396 /*******************************************************************************
    397 **
    398 ** Function         BTA_DmSearchCancel
    399 **
    400 ** Description      This function  cancels a search initiated by BTA_DmSearch
    401 **
    402 **
    403 ** Returns          void
    404 **
    405 *******************************************************************************/
    406 void BTA_DmSearchCancel(void)
    407 {
    408     BT_HDR    *p_msg;
    409 
    410     if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
    411     {
    412         p_msg->event = BTA_DM_API_SEARCH_CANCEL_EVT;
    413         bta_sys_sendmsg(p_msg);
    414     }
    415 
    416 }
    417 
    418 /*******************************************************************************
    419 **
    420 ** Function         BTA_DmDiscover
    421 **
    422 ** Description      This function does service discovery for services of a
    423 **                  peer device
    424 **
    425 **
    426 ** Returns          void
    427 **
    428 *******************************************************************************/
    429 void BTA_DmDiscover(BD_ADDR bd_addr, tBTA_SERVICE_MASK services,
    430                     tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search)
    431 {
    432     tBTA_DM_API_DISCOVER    *p_msg;
    433 
    434     if ((p_msg = (tBTA_DM_API_DISCOVER *) GKI_getbuf(sizeof(tBTA_DM_API_DISCOVER))) != NULL)
    435     {
    436         memset(p_msg, 0, sizeof(tBTA_DM_API_DISCOVER));
    437 
    438         p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT;
    439         bdcpy(p_msg->bd_addr, bd_addr);
    440         p_msg->services = services;
    441         p_msg->p_cback = p_cback;
    442         p_msg->sdp_search = sdp_search;
    443         bta_sys_sendmsg(p_msg);
    444     }
    445 
    446 }
    447 
    448 /*******************************************************************************
    449 **
    450 ** Function         BTA_DmDiscoverUUID
    451 **
    452 ** Description      This function does service discovery for services of a
    453 **                  peer device
    454 **
    455 **
    456 ** Returns          void
    457 **
    458 *******************************************************************************/
    459 void BTA_DmDiscoverUUID(BD_ADDR bd_addr, tSDP_UUID *uuid,
    460                     tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search)
    461 {
    462     tBTA_DM_API_DISCOVER    *p_msg;
    463 
    464     if ((p_msg = (tBTA_DM_API_DISCOVER *) GKI_getbuf(sizeof(tBTA_DM_API_DISCOVER))) != NULL)
    465     {
    466         p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT;
    467         bdcpy(p_msg->bd_addr, bd_addr);
    468         p_msg->services = BTA_USER_SERVICE_MASK; //Not exposed at API level
    469         p_msg->p_cback = p_cback;
    470         p_msg->sdp_search = sdp_search;
    471 
    472 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
    473         p_msg->num_uuid = 0;
    474         p_msg->p_uuid = NULL;
    475 #endif
    476         memcpy( &p_msg->uuid, uuid, sizeof(tSDP_UUID) );
    477         bta_sys_sendmsg(p_msg);
    478     }
    479 
    480 }
    481 /*******************************************************************************
    482 **
    483 ** Function         BTA_DmIsMaster
    484 **
    485 ** Description      This function checks if the local device is the master of
    486 **                  the link to the given device
    487 **
    488 ** Returns          TRUE if master.
    489 **                  FALSE if not.
    490 **
    491 *******************************************************************************/
    492 BOOLEAN BTA_DmIsMaster(BD_ADDR bd_addr)
    493 {
    494     BOOLEAN is_master = FALSE;
    495     UINT8 link_role;
    496 
    497     BTM_GetRole(bd_addr, &link_role);
    498     APPL_TRACE_API1("BTA_DmIsMaster role:x%x", link_role);
    499     if(link_role == BTM_ROLE_MASTER)
    500     {
    501         is_master = TRUE;
    502     }
    503     return is_master;
    504 }
    505 
    506 /*******************************************************************************
    507 **
    508 ** Function         BTA_DmBond
    509 **
    510 ** Description      This function initiates a bonding procedure with a peer
    511 **                  device
    512 **
    513 **
    514 ** Returns          void
    515 **
    516 *******************************************************************************/
    517 void BTA_DmBond(BD_ADDR bd_addr)
    518 {
    519     tBTA_DM_API_BOND    *p_msg;
    520 
    521     if ((p_msg = (tBTA_DM_API_BOND *) GKI_getbuf(sizeof(tBTA_DM_API_BOND))) != NULL)
    522     {
    523         p_msg->hdr.event = BTA_DM_API_BOND_EVT;
    524         bdcpy(p_msg->bd_addr, bd_addr);
    525         bta_sys_sendmsg(p_msg);
    526     }
    527 
    528 
    529 }
    530 
    531 /*******************************************************************************
    532 **
    533 ** Function         BTA_DmBondCancel
    534 **
    535 ** Description      This function cancels the bonding procedure with a peer
    536 **                  device
    537 **
    538 **
    539 ** Returns          void
    540 **
    541 *******************************************************************************/
    542 void BTA_DmBondCancel(BD_ADDR bd_addr)
    543 {
    544     tBTA_DM_API_BOND_CANCEL    *p_msg;
    545 
    546     if ((p_msg = (tBTA_DM_API_BOND_CANCEL *) GKI_getbuf(sizeof(tBTA_DM_API_BOND_CANCEL))) != NULL)
    547     {
    548         p_msg->hdr.event = BTA_DM_API_BOND_CANCEL_EVT;
    549         bdcpy(p_msg->bd_addr, bd_addr);
    550         bta_sys_sendmsg(p_msg);
    551     }
    552 
    553 
    554 }
    555 
    556 /*******************************************************************************
    557 **
    558 ** Function         BTA_DmPinReply
    559 **
    560 ** Description      This function provides a pincode for a remote device when
    561 **                  one is requested by DM through BTA_DM_PIN_REQ_EVT
    562 **
    563 **
    564 ** Returns          void
    565 **
    566 *******************************************************************************/
    567 void BTA_DmPinReply(BD_ADDR bd_addr, BOOLEAN accept, UINT8 pin_len, UINT8 *p_pin)
    568 
    569 {
    570     tBTA_DM_API_PIN_REPLY    *p_msg;
    571 
    572     if ((p_msg = (tBTA_DM_API_PIN_REPLY *) GKI_getbuf(sizeof(tBTA_DM_API_PIN_REPLY))) != NULL)
    573     {
    574         p_msg->hdr.event = BTA_DM_API_PIN_REPLY_EVT;
    575         bdcpy(p_msg->bd_addr, bd_addr);
    576         p_msg->accept = accept;
    577         if(accept)
    578         {
    579             p_msg->pin_len = pin_len;
    580             memcpy(p_msg->p_pin, p_pin, pin_len);
    581         }
    582         bta_sys_sendmsg(p_msg);
    583     }
    584 
    585 }
    586 
    587 /*******************************************************************************
    588 **
    589 ** Function         BTA_DmLinkPolicy
    590 **
    591 ** Description      This function sets/clears the link policy mask to the given
    592 **                  bd_addr.
    593 **                  If clearing the sniff or park mode mask, the link is put
    594 **                  in active mode.
    595 **
    596 ** Returns          void
    597 **
    598 *******************************************************************************/
    599 void BTA_DmLinkPolicy(BD_ADDR bd_addr, tBTA_DM_LP_MASK policy_mask,
    600                       BOOLEAN set)
    601 {
    602     tBTA_DM_API_LINK_POLICY    *p_msg;
    603 
    604     if ((p_msg = (tBTA_DM_API_LINK_POLICY *) GKI_getbuf(sizeof(tBTA_DM_API_LINK_POLICY))) != NULL)
    605     {
    606         p_msg->hdr.event = BTA_DM_API_LINK_POLICY_EVT;
    607         bdcpy(p_msg->bd_addr, bd_addr);
    608         p_msg->policy_mask = policy_mask;
    609         p_msg->set = set;
    610         bta_sys_sendmsg(p_msg);
    611     }
    612 }
    613 
    614 
    615 #if (BTM_OOB_INCLUDED == TRUE)
    616 /*******************************************************************************
    617 **
    618 ** Function         BTA_DmLocalOob
    619 **
    620 ** Description      This function retrieves the OOB data from local controller.
    621 **                  The result is reported by bta_dm_co_loc_oob().
    622 **
    623 ** Returns          void
    624 **
    625 *******************************************************************************/
    626 void BTA_DmLocalOob(void)
    627 {
    628     tBTA_DM_API_LOC_OOB    *p_msg;
    629 
    630     if ((p_msg = (tBTA_DM_API_LOC_OOB *) GKI_getbuf(sizeof(tBTA_DM_API_LOC_OOB))) != NULL)
    631     {
    632         p_msg->hdr.event = BTA_DM_API_LOC_OOB_EVT;
    633         bta_sys_sendmsg(p_msg);
    634     }
    635 }
    636 #endif /* BTM_OOB_INCLUDED */
    637 /*******************************************************************************
    638 **
    639 ** Function         BTA_DmConfirm
    640 **
    641 ** Description      This function accepts or rejects the numerical value of the
    642 **                  Simple Pairing process on BTA_DM_SP_CFM_REQ_EVT
    643 **
    644 ** Returns          void
    645 **
    646 *******************************************************************************/
    647 void BTA_DmConfirm(BD_ADDR bd_addr, BOOLEAN accept)
    648 {
    649     tBTA_DM_API_CONFIRM    *p_msg;
    650 
    651     if ((p_msg = (tBTA_DM_API_CONFIRM *) GKI_getbuf(sizeof(tBTA_DM_API_CONFIRM))) != NULL)
    652     {
    653         p_msg->hdr.event = BTA_DM_API_CONFIRM_EVT;
    654         bdcpy(p_msg->bd_addr, bd_addr);
    655         p_msg->accept = accept;
    656         bta_sys_sendmsg(p_msg);
    657     }
    658 }
    659 
    660 /*******************************************************************************
    661 **
    662 ** Function         BTA_DmPasskeyCancel
    663 **
    664 ** Description      This function is called to cancel the simple pairing process
    665 **                  reported by BTA_DM_SP_KEY_NOTIF_EVT
    666 **
    667 ** Returns          void
    668 **
    669 *******************************************************************************/
    670 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
    671 void BTA_DmPasskeyCancel(BD_ADDR bd_addr)
    672 {
    673     tBTA_DM_API_PASKY_CANCEL    *p_msg;
    674 
    675     if ((p_msg = (tBTA_DM_API_PASKY_CANCEL *) \
    676         GKI_getbuf(sizeof(tBTA_DM_API_PASKY_CANCEL))) != NULL)
    677     {
    678         p_msg->hdr.event = BTA_DM_API_PASKY_CANCEL_EVT;
    679         bdcpy(p_msg->bd_addr, bd_addr);
    680         bta_sys_sendmsg(p_msg);
    681     }
    682 }
    683 #endif
    684 
    685 
    686 /*******************************************************************************
    687 **
    688 ** Function         BTA_DmAddDevice
    689 **
    690 ** Description      This function adds a device to the security database list of
    691 **                  peer device
    692 **
    693 **
    694 ** Returns          void
    695 **
    696 *******************************************************************************/
    697 void BTA_DmAddDevice(BD_ADDR bd_addr, DEV_CLASS dev_class, LINK_KEY link_key,
    698                      tBTA_SERVICE_MASK trusted_mask, BOOLEAN is_trusted,
    699                      UINT8 key_type, tBTA_IO_CAP io_cap)
    700 {
    701 
    702     tBTA_DM_API_ADD_DEVICE *p_msg;
    703 
    704     if ((p_msg = (tBTA_DM_API_ADD_DEVICE *) GKI_getbuf(sizeof(tBTA_DM_API_ADD_DEVICE))) != NULL)
    705     {
    706         memset (p_msg, 0, sizeof(tBTA_DM_API_ADD_DEVICE));
    707 
    708         p_msg->hdr.event = BTA_DM_API_ADD_DEVICE_EVT;
    709         bdcpy(p_msg->bd_addr, bd_addr);
    710         p_msg->tm = trusted_mask;
    711         p_msg->is_trusted = is_trusted;
    712         p_msg->io_cap = io_cap;
    713 
    714         if (link_key)
    715         {
    716             p_msg->link_key_known = TRUE;
    717             p_msg->key_type = key_type;
    718             memcpy(p_msg->link_key, link_key, LINK_KEY_LEN);
    719         }
    720 
    721         /* Load device class if specified */
    722         if (dev_class)
    723         {
    724             p_msg->dc_known = TRUE;
    725             memcpy (p_msg->dc, dev_class, DEV_CLASS_LEN);
    726         }
    727 
    728         memset (p_msg->bd_name, 0, BD_NAME_LEN);
    729         memset (p_msg->features, 0, BD_FEATURES_LEN);
    730 
    731         bta_sys_sendmsg(p_msg);
    732     }
    733 }
    734 
    735 
    736 /*******************************************************************************
    737 **
    738 ** Function         BTA_DmRemoveDevice
    739 **
    740 ** Description      This function removes a device fromthe security database list of
    741 **                  peer device
    742 **
    743 **
    744 ** Returns          void
    745 **
    746 *******************************************************************************/
    747 tBTA_STATUS BTA_DmRemoveDevice(BD_ADDR bd_addr)
    748 {
    749     tBTA_DM_API_REMOVE_DEVICE *p_msg;
    750 
    751     if ((p_msg = (tBTA_DM_API_REMOVE_DEVICE *) GKI_getbuf(sizeof(tBTA_DM_API_REMOVE_DEVICE))) != NULL)
    752     {
    753         memset (p_msg, 0, sizeof(tBTA_DM_API_REMOVE_DEVICE));
    754 
    755         p_msg->hdr.event = BTA_DM_API_REMOVE_DEVICE_EVT;
    756         bdcpy(p_msg->bd_addr, bd_addr);
    757         bta_sys_sendmsg(p_msg);
    758     }
    759     else
    760     {
    761         return BTA_FAILURE;
    762     }
    763 
    764     return BTA_SUCCESS;
    765 }
    766 
    767 /*******************************************************************************
    768 **
    769 ** Function         BTA_DmAddDevWithName
    770 **
    771 ** Description      This function is newer version of  BTA_DmAddDevice()
    772 **                  which added bd_name and features as input parameters.
    773 **
    774 **
    775 ** Returns          void
    776 **
    777 *******************************************************************************/
    778 void BTA_DmAddDevWithName (BD_ADDR bd_addr, DEV_CLASS dev_class,
    779                                       BD_NAME bd_name, BD_FEATURES features,
    780                                       LINK_KEY link_key, tBTA_SERVICE_MASK trusted_mask,
    781                                       BOOLEAN is_trusted, UINT8 key_type, tBTA_IO_CAP io_cap)
    782 {
    783     tBTA_DM_API_ADD_DEVICE *p_msg;
    784 
    785     if ((p_msg = (tBTA_DM_API_ADD_DEVICE *) GKI_getbuf(sizeof(tBTA_DM_API_ADD_DEVICE))) != NULL)
    786     {
    787         memset (p_msg, 0, sizeof(tBTA_DM_API_ADD_DEVICE));
    788 
    789         p_msg->hdr.event = BTA_DM_API_ADD_DEVICE_EVT;
    790         bdcpy(p_msg->bd_addr, bd_addr);
    791         p_msg->tm = trusted_mask;
    792         p_msg->is_trusted = is_trusted;
    793         p_msg->io_cap = io_cap;
    794 
    795         if (link_key)
    796         {
    797             p_msg->link_key_known = TRUE;
    798             p_msg->key_type = key_type;
    799             memcpy(p_msg->link_key, link_key, LINK_KEY_LEN);
    800         }
    801 
    802         /* Load device class if specified */
    803         if (dev_class)
    804         {
    805             p_msg->dc_known = TRUE;
    806             memcpy (p_msg->dc, dev_class, DEV_CLASS_LEN);
    807         }
    808 
    809         if (bd_name)
    810             memcpy(p_msg->bd_name, bd_name, BD_NAME_LEN);
    811 
    812         if (features)
    813             memcpy(p_msg->features, features, BD_FEATURES_LEN);
    814 
    815         bta_sys_sendmsg(p_msg);
    816     }
    817 }
    818 
    819 /*******************************************************************************
    820 **
    821 ** Function         BTA_DmAuthorizeReply
    822 **
    823 ** Description      This function provides an authorization reply when authorization
    824 **                  is requested by BTA through BTA_DM_AUTHORIZE_EVT
    825 **
    826 **
    827 ** Returns          tBTA_STATUS
    828 **
    829 *******************************************************************************/
    830 void BTA_DmAuthorizeReply(BD_ADDR bd_addr, tBTA_SERVICE_ID service, tBTA_AUTH_RESP response)
    831 {
    832 
    833     tBTA_DM_API_AUTH_REPLY    *p_msg;
    834 
    835     if ((p_msg = (tBTA_DM_API_AUTH_REPLY *) GKI_getbuf(sizeof(tBTA_DM_API_AUTH_REPLY))) != NULL)
    836     {
    837         p_msg->hdr.event = BTA_DM_API_AUTH_REPLY_EVT;
    838         bdcpy(p_msg->bd_addr, bd_addr);
    839         p_msg->service = service;
    840         p_msg->response = response;
    841 
    842         bta_sys_sendmsg(p_msg);
    843     }
    844 
    845 }
    846 
    847 /*******************************************************************************
    848 **
    849 ** Function         BTA_DmSignalStrength
    850 **
    851 ** Description      This function initiates RSSI and channnel quality
    852 **                  measurments. BTA_DM_SIG_STRENGTH_EVT is sent to
    853 **                  application with the values of RSSI and channel
    854 **                  quality
    855 **
    856 **
    857 ** Returns          void
    858 **
    859 *******************************************************************************/
    860 void BTA_DmSignalStrength(tBTA_SIG_STRENGTH_MASK mask, UINT16 period, BOOLEAN start)
    861 {
    862 
    863     tBTA_API_DM_SIG_STRENGTH    *p_msg;
    864 
    865     if ((p_msg = (tBTA_API_DM_SIG_STRENGTH *) GKI_getbuf(sizeof(tBTA_API_DM_SIG_STRENGTH))) != NULL)
    866     {
    867         p_msg->hdr.event = BTA_API_DM_SIG_STRENGTH_EVT;
    868         p_msg->mask = mask;
    869         p_msg->period = period;
    870         p_msg->start = start;
    871 
    872         bta_sys_sendmsg(p_msg);
    873     }
    874 
    875 
    876 }
    877 
    878 /*******************************************************************************
    879 **
    880 ** Function         BTA_DmWriteInqTxPower
    881 **
    882 ** Description      This command is used to write the inquiry transmit power level
    883 **                  used to transmit the inquiry (ID) data packets.
    884 **
    885 ** Parameters       tx_power - tx inquiry power to use, valid value is -70 ~ 20
    886 
    887 ** Returns          void
    888 **
    889 *******************************************************************************/
    890 void BTA_DmWriteInqTxPower(INT8 tx_power)
    891 {
    892 
    893     tBTA_API_DM_TX_INQPWR    *p_msg;
    894 
    895     if ((p_msg = (tBTA_API_DM_TX_INQPWR *) GKI_getbuf(sizeof(tBTA_API_DM_TX_INQPWR))) != NULL)
    896     {
    897         p_msg->hdr.event = BTA_DM_API_TX_INQPWR_EVT;
    898         p_msg->tx_power = tx_power;
    899 
    900         bta_sys_sendmsg(p_msg);
    901     }
    902 }
    903 
    904 
    905 /*******************************************************************************
    906 **
    907 ** Function         BTA_DmEirAddUUID
    908 **
    909 ** Description      This function is called to add UUID into EIR.
    910 **
    911 ** Parameters       tBT_UUID - UUID
    912 **
    913 ** Returns          None
    914 **
    915 *******************************************************************************/
    916 void BTA_DmEirAddUUID (tBT_UUID *p_uuid)
    917 {
    918 #if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
    919     tBTA_DM_API_UPDATE_EIR_UUID    *p_msg;
    920 
    921     if ((p_msg = (tBTA_DM_API_UPDATE_EIR_UUID *) GKI_getbuf(sizeof(tBTA_DM_API_UPDATE_EIR_UUID))) != NULL)
    922     {
    923         p_msg->hdr.event = BTA_DM_API_UPDATE_EIR_UUID_EVT;
    924         p_msg->is_add    = TRUE;
    925         memcpy (&(p_msg->uuid), p_uuid, sizeof(tBT_UUID));
    926 
    927         bta_sys_sendmsg(p_msg);
    928     }
    929 #endif
    930 }
    931 
    932 /*******************************************************************************
    933 **
    934 ** Function         BTA_DmEirRemoveUUID
    935 **
    936 ** Description      This function is called to remove UUID from EIR.
    937 **
    938 ** Parameters       tBT_UUID - UUID
    939 **
    940 ** Returns          None
    941 **
    942 *******************************************************************************/
    943 void BTA_DmEirRemoveUUID (tBT_UUID *p_uuid)
    944 {
    945 #if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
    946     tBTA_DM_API_UPDATE_EIR_UUID    *p_msg;
    947 
    948     if ((p_msg = (tBTA_DM_API_UPDATE_EIR_UUID *) GKI_getbuf(sizeof(tBTA_DM_API_UPDATE_EIR_UUID))) != NULL)
    949     {
    950         p_msg->hdr.event = BTA_DM_API_UPDATE_EIR_UUID_EVT;
    951         p_msg->is_add    = FALSE;
    952         memcpy (&(p_msg->uuid), p_uuid, sizeof(tBT_UUID));
    953 
    954         bta_sys_sendmsg(p_msg);
    955     }
    956 #endif
    957 }
    958 
    959 /*******************************************************************************
    960 **
    961 ** Function         BTA_DmSetEIRConfig
    962 **
    963 ** Description      This function is called to override the BTA default EIR parameters.
    964 **                  This funciton is only valid in a system where BTU & App task
    965 **                  are in the same memory space.
    966 **
    967 ** Parameters       Pointer to User defined EIR config
    968 **
    969 ** Returns          None
    970 **
    971 *******************************************************************************/
    972 void BTA_DmSetEIRConfig (tBTA_DM_EIR_CONF *p_eir_cfg)
    973 {
    974 #if (BTM_EIR_SERVER_INCLUDED == TRUE)
    975     tBTA_DM_API_SET_EIR_CONFIG  *p_msg;
    976 
    977     if ((p_msg = (tBTA_DM_API_SET_EIR_CONFIG *) GKI_getbuf(sizeof(tBTA_DM_API_SET_EIR_CONFIG))) != NULL)
    978     {
    979         p_msg->hdr.event = BTA_DM_API_SET_EIR_CONFIG_EVT;
    980         p_msg->p_eir_cfg = p_eir_cfg;
    981 
    982         bta_sys_sendmsg(p_msg);
    983     }
    984 #endif
    985 }
    986 
    987 /*******************************************************************************
    988 **
    989 ** Function         BTA_CheckEirData
    990 **
    991 ** Description      This function is called to get EIR data from significant part.
    992 **
    993 ** Parameters       p_eir - pointer of EIR significant part
    994 **                  type   - finding EIR data type
    995 **                  p_length - return the length of EIR data
    996 **
    997 ** Returns          pointer of EIR data
    998 **
    999 *******************************************************************************/
   1000 UINT8 *BTA_CheckEirData( UINT8 *p_eir, UINT8 type, UINT8 *p_length )
   1001 {
   1002 #if ( BTM_EIR_CLIENT_INCLUDED == TRUE )
   1003     return BTM_CheckEirData( p_eir, type, p_length );
   1004 #else
   1005     return NULL;
   1006 #endif
   1007 }
   1008 
   1009 /*******************************************************************************
   1010 **
   1011 ** Function         BTA_GetEirService
   1012 **
   1013 ** Description      This function is called to get BTA service mask from EIR.
   1014 **
   1015 ** Parameters       p_eir - pointer of EIR significant part
   1016 **                  p_services - return the BTA service mask
   1017 **
   1018 ** Returns          None
   1019 **
   1020 *******************************************************************************/
   1021 extern const UINT16 bta_service_id_to_uuid_lkup_tbl [];
   1022 void BTA_GetEirService( UINT8 *p_eir, tBTA_SERVICE_MASK *p_services )
   1023 {
   1024 #if ( BTM_EIR_CLIENT_INCLUDED == TRUE )
   1025     UINT8 xx, yy;
   1026     UINT8 num_uuid, max_num_uuid = 32;
   1027     UINT8 uuid_list[32*LEN_UUID_16];
   1028     UINT16 *p_uuid16 = (UINT16 *)uuid_list;
   1029     tBTA_SERVICE_MASK mask;
   1030 
   1031     BTM_GetEirUuidList( p_eir, LEN_UUID_16, &num_uuid, uuid_list, max_num_uuid);
   1032     for( xx = 0; xx < num_uuid; xx++ )
   1033     {
   1034         mask = 1;
   1035         for( yy = 0; yy < BTA_MAX_SERVICE_ID; yy++ )
   1036         {
   1037             if( *(p_uuid16 + xx) == bta_service_id_to_uuid_lkup_tbl[yy] )
   1038             {
   1039                 *p_services |= mask;
   1040                 break;
   1041             }
   1042             mask <<= 1;
   1043         }
   1044 
   1045         /* for HSP v1.2 only device */
   1046         if (*(p_uuid16 + xx) == UUID_SERVCLASS_HEADSET_HS)
   1047             *p_services |= BTA_HSP_SERVICE_MASK;
   1048 
   1049        if (*(p_uuid16 + xx) == UUID_SERVCLASS_HDP_SOURCE)
   1050             *p_services |= BTA_HL_SERVICE_MASK;
   1051 
   1052         if (*(p_uuid16 + xx) == UUID_SERVCLASS_HDP_SINK)
   1053             *p_services |= BTA_HL_SERVICE_MASK;
   1054     }
   1055 #endif
   1056 }
   1057 
   1058 /*******************************************************************************
   1059 **
   1060 ** Function         BTA_DmUseSsr
   1061 **
   1062 ** Description      This function is called to check if the connected peer device
   1063 **                  supports SSR or not.
   1064 **
   1065 ** Returns          TRUE, if SSR is supported
   1066 **
   1067 *******************************************************************************/
   1068 BOOLEAN BTA_DmUseSsr( BD_ADDR bd_addr )
   1069 {
   1070     BOOLEAN use_ssr = FALSE;
   1071     tBTA_DM_PEER_DEVICE * p_dev = bta_dm_find_peer_device(bd_addr);
   1072     if(p_dev && (p_dev->info & BTA_DM_DI_USE_SSR) )
   1073         use_ssr = TRUE;
   1074     return use_ssr;
   1075 }
   1076 
   1077 /*******************************************************************************
   1078 **                   Device Identification (DI) Server Functions
   1079 *******************************************************************************/
   1080 /*******************************************************************************
   1081 **
   1082 ** Function         BTA_DmSetLocalDiRecord
   1083 **
   1084 ** Description      This function adds a DI record to the local SDP database.
   1085 **
   1086 ** Returns          BTA_SUCCESS if record set sucessfully, otherwise error code.
   1087 **
   1088 *******************************************************************************/
   1089 tBTA_STATUS BTA_DmSetLocalDiRecord( tBTA_DI_RECORD *p_device_info,
   1090                               UINT32 *p_handle )
   1091 {
   1092     tBTA_STATUS  status = BTA_FAILURE;
   1093 
   1094     if(bta_dm_di_cb.di_num < BTA_DI_NUM_MAX)
   1095     {
   1096         if(SDP_SetLocalDiRecord((tSDP_DI_RECORD *)p_device_info, p_handle) == SDP_SUCCESS)
   1097         {
   1098             if(!p_device_info->primary_record)
   1099             {
   1100                 bta_dm_di_cb.di_handle[bta_dm_di_cb.di_num] = *p_handle;
   1101                 bta_dm_di_cb.di_num ++;
   1102             }
   1103 
   1104             bta_sys_add_uuid(UUID_SERVCLASS_PNP_INFORMATION);
   1105             status =  BTA_SUCCESS;
   1106         }
   1107     }
   1108 
   1109     return status;
   1110 }
   1111 
   1112 /*******************************************************************************
   1113 **
   1114 ** Function         BTA_DmGetLocalDiRecord
   1115 **
   1116 ** Description      Get a specified DI record to the local SDP database. If no
   1117 **                  record handle is provided, the primary DI record will be
   1118 **                  returned.
   1119 **
   1120 **                  Fills in the device information of the record
   1121 **                  p_handle - if p_handle == 0, the primary record is returned
   1122 **
   1123 ** Returns          BTA_SUCCESS if record set sucessfully, otherwise error code.
   1124 **
   1125 *******************************************************************************/
   1126 tBTA_STATUS BTA_DmGetLocalDiRecord( tBTA_DI_GET_RECORD *p_device_info,
   1127                               UINT32 *p_handle )
   1128 {
   1129     UINT16  status;
   1130 
   1131     status = SDP_GetLocalDiRecord(p_device_info, p_handle);
   1132 
   1133     if (status == SDP_SUCCESS)
   1134         return BTA_SUCCESS;
   1135     else
   1136         return BTA_FAILURE;
   1137 
   1138 }
   1139 
   1140 /*******************************************************************************
   1141 **                   Device Identification (DI) Client Functions
   1142 *******************************************************************************/
   1143 /*******************************************************************************
   1144 **
   1145 ** Function         BTA_DmDiDiscover
   1146 **
   1147 ** Description      This function queries a remote device for DI information.
   1148 **
   1149 **
   1150 ** Returns          None.
   1151 **
   1152 *******************************************************************************/
   1153 void BTA_DmDiDiscover( BD_ADDR remote_device, tBTA_DISCOVERY_DB *p_db,
   1154                        UINT32 len, tBTA_DM_SEARCH_CBACK *p_cback )
   1155 {
   1156     tBTA_DM_API_DI_DISC    *p_msg;
   1157 
   1158     if ((p_msg = (tBTA_DM_API_DI_DISC *) GKI_getbuf(sizeof(tBTA_DM_API_DI_DISC))) != NULL)
   1159     {
   1160         bdcpy(p_msg->bd_addr, remote_device);
   1161         p_msg->hdr.event    = BTA_DM_API_DI_DISCOVER_EVT;
   1162         p_msg->p_sdp_db     = p_db;
   1163         p_msg->len          = len;
   1164         p_msg->p_cback      = p_cback;
   1165 
   1166         bta_sys_sendmsg(p_msg);
   1167     }
   1168 }
   1169 
   1170 /*******************************************************************************
   1171 **
   1172 ** Function         BTA_DmGetDiRecord
   1173 **
   1174 ** Description      This function retrieves a remote device's DI record from
   1175 **                  the specified database.
   1176 **
   1177 ** Returns          BTA_SUCCESS if Get DI record is succeed.
   1178 **                  BTA_FAILURE if Get DI record failed.
   1179 **
   1180 *******************************************************************************/
   1181 tBTA_STATUS BTA_DmGetDiRecord( UINT8 get_record_index, tBTA_DI_GET_RECORD *p_device_info,
   1182                         tBTA_DISCOVERY_DB *p_db )
   1183 {
   1184     if (SDP_GetDiRecord(get_record_index, p_device_info, p_db) != SDP_SUCCESS)
   1185         return BTA_FAILURE;
   1186     else
   1187         return BTA_SUCCESS;
   1188 }
   1189 
   1190 /*******************************************************************************
   1191 **
   1192 ** Function         BTA_SysFeatures
   1193 **
   1194 ** Description      This function is called to set system features.
   1195 **
   1196 ** Returns          void
   1197 **
   1198 *******************************************************************************/
   1199 void BTA_SysFeatures (UINT16 sys_features)
   1200 {
   1201     bta_sys_cb.sys_features = sys_features;
   1202 
   1203     APPL_TRACE_API1("BTA_SysFeatures: sys_features = %d", sys_features);
   1204 }
   1205 
   1206 /*******************************************************************************
   1207 **
   1208 ** Function         bta_dmexecutecallback
   1209 **
   1210 ** Description      This function will request BTA to execute a call back in the context of BTU task
   1211 **                  This API was named in lower case because it is only intended
   1212 **                  for the internal customers(like BTIF).
   1213 **
   1214 ** Returns          void
   1215 **
   1216 *******************************************************************************/
   1217 void bta_dmexecutecallback (tBTA_DM_EXEC_CBACK* p_callback, void * p_param)
   1218 {
   1219     tBTA_DM_API_EXECUTE_CBACK *p_msg;
   1220 
   1221     if ((p_msg = (tBTA_DM_API_EXECUTE_CBACK *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
   1222     {
   1223         p_msg->hdr.event = BTA_DM_API_EXECUTE_CBACK_EVT;
   1224         p_msg->p_param= p_param;
   1225         p_msg->p_exec_cback= p_callback;
   1226         bta_sys_sendmsg(p_msg);
   1227     }
   1228 }
   1229 
   1230 /*******************************************************************************
   1231 **
   1232 ** Function         BTA_DmAddBleKey
   1233 **
   1234 ** Description      Add/modify LE device information.  This function will be
   1235 **                  normally called during host startup to restore all required
   1236 **                  information stored in the NVRAM.
   1237 **
   1238 ** Parameters:      bd_addr          - BD address of the peer
   1239 **                  p_le_key         - LE key values.
   1240 **                  key_type         - LE SMP key type.
   1241 **
   1242 ** Returns          void
   1243 **
   1244 *******************************************************************************/
   1245 void BTA_DmAddBleKey (BD_ADDR bd_addr, tBTA_LE_KEY_VALUE *p_le_key, tBTA_LE_KEY_TYPE key_type)
   1246 {
   1247 #if BLE_INCLUDED == TRUE
   1248 
   1249     tBTA_DM_API_ADD_BLEKEY *p_msg;
   1250 
   1251     if ((p_msg = (tBTA_DM_API_ADD_BLEKEY *) GKI_getbuf(sizeof(tBTA_DM_API_ADD_BLEKEY))) != NULL)
   1252     {
   1253         memset (p_msg, 0, sizeof(tBTA_DM_API_ADD_BLEKEY));
   1254 
   1255         p_msg->hdr.event = BTA_DM_API_ADD_BLEKEY_EVT;
   1256         p_msg->key_type = key_type;
   1257         bdcpy(p_msg->bd_addr, bd_addr);
   1258         memcpy(&p_msg->blekey, p_le_key, sizeof(tBTA_LE_KEY_VALUE));
   1259 
   1260         bta_sys_sendmsg(p_msg);
   1261     }
   1262 
   1263 #endif
   1264 }
   1265 
   1266 /*******************************************************************************
   1267 **
   1268 ** Function         BTA_DmAddBleDevice
   1269 **
   1270 ** Description      Add a BLE device.  This function will be normally called
   1271 **                  during host startup to restore all required information
   1272 **                  for a LE device stored in the NVRAM.
   1273 **
   1274 ** Parameters:      bd_addr          - BD address of the peer
   1275 **                  dev_type         - Remote device's device type.
   1276 **                  addr_type        - LE device address type.
   1277 **
   1278 ** Returns          void
   1279 **
   1280 *******************************************************************************/
   1281 void BTA_DmAddBleDevice(BD_ADDR bd_addr, tBLE_ADDR_TYPE addr_type, tBT_DEVICE_TYPE dev_type)
   1282 {
   1283 #if BLE_INCLUDED == TRUE
   1284     tBTA_DM_API_ADD_BLE_DEVICE *p_msg;
   1285 
   1286     if ((p_msg = (tBTA_DM_API_ADD_BLE_DEVICE *) GKI_getbuf(sizeof(tBTA_DM_API_ADD_BLE_DEVICE))) != NULL)
   1287     {
   1288         memset (p_msg, 0, sizeof(tBTA_DM_API_ADD_BLE_DEVICE));
   1289 
   1290         p_msg->hdr.event = BTA_DM_API_ADD_BLEDEVICE_EVT;
   1291         bdcpy(p_msg->bd_addr, bd_addr);
   1292         p_msg->addr_type = addr_type;
   1293         p_msg->dev_type = dev_type;
   1294 
   1295         bta_sys_sendmsg(p_msg);
   1296     }
   1297 #endif
   1298 }
   1299 /*******************************************************************************
   1300 **
   1301 ** Function         BTA_DmBlePasskeyReply
   1302 **
   1303 ** Description      Send BLE SMP passkey reply.
   1304 **
   1305 ** Parameters:      bd_addr          - BD address of the peer
   1306 **                  accept           - passkey entry sucessful or declined.
   1307 **                  passkey          - passkey value, must be a 6 digit number,
   1308 **                                     can be lead by 0.
   1309 **
   1310 ** Returns          void
   1311 **
   1312 *******************************************************************************/
   1313 void BTA_DmBlePasskeyReply(BD_ADDR bd_addr, BOOLEAN accept, UINT32 passkey)
   1314 {
   1315 #if BLE_INCLUDED == TRUE
   1316     tBTA_DM_API_PASSKEY_REPLY    *p_msg;
   1317 
   1318     if ((p_msg = (tBTA_DM_API_PASSKEY_REPLY *) GKI_getbuf(sizeof(tBTA_DM_API_PASSKEY_REPLY))) != NULL)
   1319     {
   1320         memset(p_msg, 0, sizeof(tBTA_DM_API_PASSKEY_REPLY));
   1321 
   1322         p_msg->hdr.event = BTA_DM_API_BLE_PASSKEY_REPLY_EVT;
   1323         bdcpy(p_msg->bd_addr, bd_addr);
   1324         p_msg->accept = accept;
   1325 
   1326         if(accept)
   1327         {
   1328             p_msg->passkey = passkey;
   1329         }
   1330         bta_sys_sendmsg(p_msg);
   1331     }
   1332 #endif
   1333 }
   1334 /*******************************************************************************
   1335 **
   1336 ** Function         BTA_DmBleSecurityGrant
   1337 **
   1338 ** Description      Grant security request access.
   1339 **
   1340 ** Parameters:      bd_addr          - BD address of the peer
   1341 **                  res              - security grant status.
   1342 **
   1343 ** Returns          void
   1344 **
   1345 *******************************************************************************/
   1346 void BTA_DmBleSecurityGrant(BD_ADDR bd_addr, tBTA_DM_BLE_SEC_GRANT res)
   1347 {
   1348 #if BLE_INCLUDED == TRUE
   1349     tBTA_DM_API_BLE_SEC_GRANT    *p_msg;
   1350 
   1351     if ((p_msg = (tBTA_DM_API_BLE_SEC_GRANT *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_SEC_GRANT))) != NULL)
   1352     {
   1353         memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_SEC_GRANT));
   1354 
   1355         p_msg->hdr.event = BTA_DM_API_BLE_SEC_GRANT_EVT;
   1356         bdcpy(p_msg->bd_addr, bd_addr);
   1357         p_msg->res = res;
   1358 
   1359         bta_sys_sendmsg(p_msg);
   1360     }
   1361 #endif
   1362 }
   1363 /*******************************************************************************
   1364 **
   1365 ** Function         BTA_DmSetBlePrefConnParams
   1366 **
   1367 ** Description      This function is called to set the preferred connection
   1368 **                  parameters when default connection parameter is not desired.
   1369 **
   1370 ** Parameters:      bd_addr          - BD address of the peripheral
   1371 **                  scan_interval    - scan interval
   1372 **                  scan_window      - scan window
   1373 **                  min_conn_int     - minimum preferred connection interval
   1374 **                  max_conn_int     - maximum preferred connection interval
   1375 **                  slave_latency    - preferred slave latency
   1376 **                  supervision_tout - preferred supervision timeout
   1377 **
   1378 **
   1379 ** Returns          void
   1380 **
   1381 *******************************************************************************/
   1382 void BTA_DmSetBlePrefConnParams(BD_ADDR bd_addr,
   1383                                UINT16 min_conn_int, UINT16 max_conn_int,
   1384                                UINT16 slave_latency, UINT16 supervision_tout )
   1385 {
   1386 #if BLE_INCLUDED == TRUE
   1387     tBTA_DM_API_BLE_CONN_PARAMS    *p_msg;
   1388 
   1389     if ((p_msg = (tBTA_DM_API_BLE_CONN_PARAMS *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_CONN_PARAMS))) != NULL)
   1390     {
   1391         memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_CONN_PARAMS));
   1392 
   1393         p_msg->hdr.event = BTA_DM_API_BLE_CONN_PARAM_EVT;
   1394 
   1395         memcpy(p_msg->peer_bda, bd_addr, BD_ADDR_LEN);
   1396 
   1397         p_msg->conn_int_max     = max_conn_int;
   1398         p_msg->conn_int_min     = min_conn_int;
   1399         p_msg->slave_latency    = slave_latency;
   1400         p_msg->supervision_tout = supervision_tout;
   1401 
   1402         bta_sys_sendmsg(p_msg);
   1403     }
   1404 #endif
   1405 }
   1406 
   1407 /*******************************************************************************
   1408 **
   1409 ** Function         BTA_DmSetBleConnScanParams
   1410 **
   1411 ** Description      This function is called to set scan parameters used in
   1412 **                  BLE connection request
   1413 **
   1414 ** Parameters:      scan_interval    - scan interval
   1415 **                  scan_window      - scan window
   1416 **
   1417 ** Returns          void
   1418 **
   1419 *******************************************************************************/
   1420 void BTA_DmSetBleConnScanParams(UINT16 scan_interval, UINT16 scan_window )
   1421 {
   1422 #if BLE_INCLUDED == TRUE
   1423     tBTA_DM_API_BLE_SCAN_PARAMS    *p_msg;
   1424 
   1425     if ((p_msg = (tBTA_DM_API_BLE_SCAN_PARAMS *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_SCAN_PARAMS))) != NULL)
   1426     {
   1427         memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_SCAN_PARAMS));
   1428 
   1429         p_msg->hdr.event = BTA_DM_API_BLE_SCAN_PARAM_EVT;
   1430 
   1431         p_msg->scan_int         = scan_interval;
   1432         p_msg->scan_window      = scan_window;
   1433 
   1434         bta_sys_sendmsg(p_msg);
   1435     }
   1436 #endif
   1437 }
   1438 
   1439 /*******************************************************************************
   1440 **
   1441 ** Function         BTA_DmBleSetBgConnType
   1442 **
   1443 ** Description      This function is called to set BLE connectable mode for a
   1444 **                  peripheral device.
   1445 **
   1446 ** Parameters       bg_conn_type: it can be auto connection, or selective connection.
   1447 **                  p_select_cback: callback function when selective connection procedure
   1448 **                              is being used.
   1449 **
   1450 ** Returns          void
   1451 **
   1452 *******************************************************************************/
   1453 void BTA_DmBleSetBgConnType(tBTA_DM_BLE_CONN_TYPE bg_conn_type, tBTA_DM_BLE_SEL_CBACK *p_select_cback)
   1454 {
   1455 #if BLE_INCLUDED == TRUE
   1456     tBTA_DM_API_BLE_SET_BG_CONN_TYPE    *p_msg;
   1457 
   1458     if ((p_msg = (tBTA_DM_API_BLE_SET_BG_CONN_TYPE *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_SET_BG_CONN_TYPE))) != NULL)
   1459     {
   1460         memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_SET_BG_CONN_TYPE));
   1461 
   1462         p_msg->hdr.event        = BTA_DM_API_BLE_SET_BG_CONN_TYPE;
   1463         p_msg->bg_conn_type     = bg_conn_type;
   1464         p_msg->p_select_cback   = p_select_cback;
   1465 
   1466         bta_sys_sendmsg(p_msg);
   1467     }
   1468 #endif
   1469 }
   1470 /*******************************************************************************
   1471 **
   1472 ** Function         BTA_DmDiscoverExt
   1473 **
   1474 ** Description      This function does service discovery for services of a
   1475 **                  peer device. When services.num_uuid is 0, it indicates all
   1476 **                  GATT based services are to be searched; other wise a list of
   1477 **                  UUID of interested services should be provided through
   1478 **                  p_services->p_uuid.
   1479 **
   1480 **
   1481 **
   1482 ** Returns          void
   1483 **
   1484 *******************************************************************************/
   1485 void BTA_DmDiscoverExt(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services,
   1486                     tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search)
   1487 {
   1488 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
   1489     tBTA_DM_API_DISCOVER    *p_msg;
   1490     UINT16  len = p_services ? (sizeof(tBTA_DM_API_DISCOVER) + sizeof(tBT_UUID) * p_services->num_uuid) :
   1491                     sizeof(tBTA_DM_API_DISCOVER);
   1492 
   1493     if ((p_msg = (tBTA_DM_API_DISCOVER *) GKI_getbuf(len)) != NULL)
   1494     {
   1495         memset(p_msg, 0, len);
   1496 
   1497         p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT;
   1498         bdcpy(p_msg->bd_addr, bd_addr);
   1499         p_msg->p_cback = p_cback;
   1500         p_msg->sdp_search = sdp_search;
   1501 
   1502         if (p_services != NULL)
   1503         {
   1504             p_msg->services = p_services->srvc_mask;
   1505             p_msg->num_uuid = p_services->num_uuid;
   1506 
   1507             if (p_services->num_uuid != 0)
   1508             {
   1509                 p_msg->p_uuid = (tBT_UUID *)(p_msg + 1);
   1510                 memcpy(p_msg->p_uuid, p_services->p_uuid, sizeof(tBT_UUID) * p_services->num_uuid);
   1511             }
   1512         }
   1513 
   1514         bta_sys_sendmsg(p_msg);
   1515     }
   1516 #endif
   1517 
   1518 }
   1519 
   1520 /*******************************************************************************
   1521 **
   1522 ** Function         BTA_DmSearchExt
   1523 **
   1524 ** Description      This function searches for peer Bluetooth devices. It performs
   1525 **                  an inquiry and gets the remote name for devices. Service
   1526 **                  discovery is done if services is non zero
   1527 **
   1528 ** Parameters       p_dm_inq: inquiry conditions
   1529 **                  p_services: if service is not empty, service discovery will be done.
   1530 **                            for all GATT based service condition, put num_uuid, and
   1531 **                            p_uuid is the pointer to the list of UUID values.
   1532 **                  p_cback: callback functino when search is completed.
   1533 **
   1534 **
   1535 **
   1536 ** Returns          void
   1537 **
   1538 *******************************************************************************/
   1539 void BTA_DmSearchExt(tBTA_DM_INQ *p_dm_inq, tBTA_SERVICE_MASK_EXT *p_services, tBTA_DM_SEARCH_CBACK *p_cback)
   1540 {
   1541 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
   1542     tBTA_DM_API_SEARCH    *p_msg;
   1543     UINT16  len = p_services ? (sizeof(tBTA_DM_API_SEARCH) + sizeof(tBT_UUID) * p_services->num_uuid) :
   1544                     sizeof(tBTA_DM_API_SEARCH);
   1545 
   1546     if ((p_msg = (tBTA_DM_API_SEARCH *) GKI_getbuf(len)) != NULL)
   1547     {
   1548         memset(p_msg, 0, len);
   1549 
   1550         p_msg->hdr.event = BTA_DM_API_SEARCH_EVT;
   1551         memcpy(&p_msg->inq_params, p_dm_inq, sizeof(tBTA_DM_INQ));
   1552         p_msg->p_cback = p_cback;
   1553         p_msg->rs_res  = BTA_DM_RS_NONE;
   1554 
   1555 
   1556         if (p_services != NULL)
   1557         {
   1558             p_msg->services = p_services->srvc_mask;
   1559             p_msg->num_uuid = p_services->num_uuid;
   1560 
   1561             if (p_services->num_uuid != 0)
   1562             {
   1563                 p_msg->p_uuid = (tBT_UUID *)(p_msg + 1);
   1564                 memcpy(p_msg->p_uuid, p_services->p_uuid, sizeof(tBT_UUID) * p_services->num_uuid);
   1565             }
   1566             else
   1567                 p_msg->p_uuid = NULL;
   1568         }
   1569 
   1570         bta_sys_sendmsg(p_msg);
   1571     }
   1572 #endif
   1573 }
   1574 
   1575 
   1576 /*******************************************************************************
   1577 **
   1578 ** Function         BTA_DmSetEncryption
   1579 **
   1580 ** Description      This function is called to ensure that connection is
   1581 **                  encrypted.  Should be called only on an open connection.
   1582 **                  Typically only needed for connections that first want to
   1583 **                  bring up unencrypted links, then later encrypt them.
   1584 **
   1585 ** Parameters:      bd_addr       - Address of the peer device
   1586 **                  p_callback    - Pointer to callback function to indicat the
   1587 **                                  link encryption status
   1588 **                  sec_act       - This is the security action to indicate
   1589 **                                  what knid of BLE security level is required for
   1590 **                                  the BLE link if the BLE is supported
   1591 **                                  Note: This parameter is ignored for the BR/EDR link
   1592 **                                        or the BLE is not supported
   1593 **
   1594 ** Returns          void
   1595 **
   1596 *******************************************************************************/
   1597 void BTA_DmSetEncryption(BD_ADDR bd_addr, tBTA_DM_ENCRYPT_CBACK *p_callback,
   1598                             tBTA_DM_BLE_SEC_ACT sec_act)
   1599 {
   1600     tBTA_DM_API_SET_ENCRYPTION   *p_msg;
   1601 
   1602     APPL_TRACE_API0("BTA_DmSetEncryption"); //todo
   1603     if ((p_msg = (tBTA_DM_API_SET_ENCRYPTION *) GKI_getbuf(sizeof(tBTA_DM_API_SET_ENCRYPTION))) != NULL)
   1604     {
   1605         memset(p_msg, 0, sizeof(tBTA_DM_API_SET_ENCRYPTION));
   1606 
   1607         p_msg->hdr.event = BTA_DM_API_SET_ENCRYPTION_EVT;
   1608 
   1609         memcpy(p_msg->bd_addr, bd_addr, BD_ADDR_LEN);
   1610         p_msg->p_callback      = p_callback;
   1611         p_msg->sec_act         = sec_act;
   1612 
   1613         bta_sys_sendmsg(p_msg);
   1614     }
   1615 }
   1616 
   1617