Home | History | Annotate | Download | only in dm
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2003-2014 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  This is the API implementation file for the BTA device manager.
     22  *
     23  ******************************************************************************/
     24 
     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 #include "utl.h"
     35 #include "vendor_ble.h"
     36 
     37 /*****************************************************************************
     38 **  Constants
     39 *****************************************************************************/
     40 
     41 static const tBTA_SYS_REG bta_dm_reg =
     42 {
     43     bta_dm_sm_execute,
     44     bta_dm_sm_disable
     45 };
     46 
     47 static const tBTA_SYS_REG bta_dm_search_reg =
     48 {
     49     bta_dm_search_sm_execute,
     50     bta_dm_search_sm_disable
     51 };
     52 
     53 /*******************************************************************************
     54 **
     55 ** Function         BTA_EnableBluetooth
     56 **
     57 ** Description      Enables bluetooth service.  This function must be
     58 **                  called before any other functions in the BTA API are called.
     59 **
     60 **
     61 ** Returns          tBTA_STATUS
     62 **
     63 *******************************************************************************/
     64 tBTA_STATUS BTA_EnableBluetooth(tBTA_DM_SEC_CBACK *p_cback)
     65 {
     66 
     67     tBTA_DM_API_ENABLE    *p_msg;
     68 
     69     /* Bluetooth disabling is in progress */
     70     if (bta_dm_cb.disabling)
     71         return BTA_FAILURE;
     72 
     73     memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
     74 
     75     bta_sys_register (BTA_ID_DM, &bta_dm_reg );
     76     bta_sys_register (BTA_ID_DM_SEARCH, &bta_dm_search_reg );
     77 
     78     /* if UUID list is not provided as static data */
     79     bta_sys_eir_register(bta_dm_eir_update_uuid);
     80 
     81     if ((p_msg = (tBTA_DM_API_ENABLE *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE))) != NULL)
     82     {
     83         p_msg->hdr.event = BTA_DM_API_ENABLE_EVT;
     84         p_msg->p_sec_cback = p_cback;
     85         bta_sys_sendmsg(p_msg);
     86         return BTA_SUCCESS;
     87     }
     88     return BTA_FAILURE;
     89 
     90 }
     91 
     92 /*******************************************************************************
     93 **
     94 ** Function         BTA_DisableBluetooth
     95 **
     96 ** Description      Disables bluetooth service.  This function is called when
     97 **                  the application no longer needs bluetooth service
     98 **
     99 ** Returns          void
    100 **
    101 *******************************************************************************/
    102 tBTA_STATUS BTA_DisableBluetooth(void)
    103 {
    104 
    105     BT_HDR    *p_msg;
    106 
    107     if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
    108     {
    109         p_msg->event = BTA_DM_API_DISABLE_EVT;
    110         bta_sys_sendmsg(p_msg);
    111     }
    112     else
    113     {
    114         return BTA_FAILURE;
    115     }
    116 
    117     return BTA_SUCCESS;
    118 }
    119 
    120 /*******************************************************************************
    121 **
    122 ** Function         BTA_EnableTestMode
    123 **
    124 ** Description      Enables bluetooth device under test mode
    125 **
    126 **
    127 ** Returns          tBTA_STATUS
    128 **
    129 *******************************************************************************/
    130 tBTA_STATUS BTA_EnableTestMode(void)
    131 {
    132     BT_HDR    *p_msg;
    133 
    134     APPL_TRACE_API("BTA_EnableTestMode");
    135 
    136     if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
    137     {
    138         p_msg->event = BTA_DM_API_ENABLE_TEST_MODE_EVT;
    139         bta_sys_sendmsg(p_msg);
    140         return BTA_SUCCESS;
    141     }
    142     return BTA_FAILURE;
    143 }
    144 
    145 /*******************************************************************************
    146 **
    147 ** Function         BTA_DisableTestMode
    148 **
    149 ** Description      Disable bluetooth device under test mode
    150 **
    151 **
    152 ** Returns          None
    153 **
    154 *******************************************************************************/
    155 void BTA_DisableTestMode(void)
    156 {
    157     BT_HDR    *p_msg;
    158 
    159     APPL_TRACE_API("BTA_DisableTestMode");
    160 
    161     if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
    162     {
    163         p_msg->event = BTA_DM_API_DISABLE_TEST_MODE_EVT;
    164         bta_sys_sendmsg(p_msg);
    165     }
    166 }
    167 
    168 /*******************************************************************************
    169 **
    170 ** Function         BTA_DmIsDeviceUp
    171 **
    172 ** Description      Called during startup to check whether the bluetooth module
    173 **                  is up and ready
    174 **
    175 ** Returns          BOOLEAN
    176 **
    177 *******************************************************************************/
    178 BOOLEAN BTA_DmIsDeviceUp(void)
    179 {
    180     return BTM_IsDeviceUp();
    181 }
    182 
    183 /*******************************************************************************
    184 **
    185 ** Function         BTA_DmSetDeviceName
    186 **
    187 ** Description      This function sets the Bluetooth name of local device
    188 **
    189 **
    190 ** Returns          void
    191 **
    192 *******************************************************************************/
    193 void BTA_DmSetDeviceName(char *p_name)
    194 {
    195 
    196     tBTA_DM_API_SET_NAME    *p_msg;
    197 
    198     if ((p_msg = (tBTA_DM_API_SET_NAME *) GKI_getbuf(sizeof(tBTA_DM_API_SET_NAME))) != NULL)
    199     {
    200         p_msg->hdr.event = BTA_DM_API_SET_NAME_EVT;
    201         /* truncate the name if needed */
    202         BCM_STRNCPY_S((char *)p_msg->name, sizeof(p_msg->name), p_name, BD_NAME_LEN-1);
    203         p_msg->name[BD_NAME_LEN-1]=0;
    204 
    205         bta_sys_sendmsg(p_msg);
    206     }
    207 
    208 
    209 }
    210 
    211 /*******************************************************************************
    212 **
    213 ** Function         BTA_DmSetVisibility
    214 **
    215 ** Description      This function sets the Bluetooth connectable,
    216 **                  discoverable, pairable and conn paired only modes of local device
    217 **
    218 **
    219 ** Returns          void
    220 **
    221 *******************************************************************************/
    222 void BTA_DmSetVisibility(tBTA_DM_DISC disc_mode, tBTA_DM_CONN conn_mode, UINT8 pairable_mode, UINT8 conn_filter )
    223 {
    224 
    225     tBTA_DM_API_SET_VISIBILITY    *p_msg;
    226 
    227     if ((p_msg = (tBTA_DM_API_SET_VISIBILITY *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
    228     {
    229         p_msg->hdr.event = BTA_DM_API_SET_VISIBILITY_EVT;
    230         p_msg->disc_mode = disc_mode;
    231         p_msg->conn_mode = conn_mode;
    232         p_msg->pair_mode = pairable_mode;
    233         p_msg->conn_paired_only = conn_filter;
    234 
    235 
    236         bta_sys_sendmsg(p_msg);
    237     }
    238 
    239 
    240 }
    241 
    242 /*******************************************************************************
    243 **
    244 ** Function         BTA_DmSetScanParam
    245 **
    246 ** Description      This function sets the parameters for page scan and
    247 **                  inquiry scan.
    248 **
    249 **
    250 ** Returns          void
    251 **
    252 *******************************************************************************/
    253 void BTA_DmSetScanParam (UINT16 page_scan_interval, UINT16 page_scan_window,
    254                                   UINT16 inquiry_scan_interval, UINT16 inquiry_scan_window)
    255 {
    256     APPL_TRACE_API ("BTA_DmSetScanParam: %d, %d, %d, %d",
    257             page_scan_interval, page_scan_window,
    258             inquiry_scan_interval, inquiry_scan_window);
    259 
    260     bta_dm_cb.page_scan_interval = page_scan_interval;
    261     bta_dm_cb.page_scan_window = page_scan_window;
    262     bta_dm_cb.inquiry_scan_interval = inquiry_scan_interval;
    263     bta_dm_cb.inquiry_scan_window = inquiry_scan_window;
    264 }
    265 
    266 /*******************************************************************************
    267 **
    268 ** Function         BTA_DmSetAfhChannels
    269 **
    270 ** Description      This function sets the AFH first and
    271 **                  last disable channel, so channels within
    272 **                  that range are disabled.
    273 **
    274 ** Returns          void
    275 **
    276 *******************************************************************************/
    277 void BTA_DmSetAfhChannels(UINT8 first, UINT8 last)
    278 {
    279 
    280     tBTA_DM_API_SET_AFH_CHANNELS_EVT    *p_msg;
    281 
    282     if ((p_msg = (tBTA_DM_API_SET_AFH_CHANNELS_EVT *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
    283     {
    284         p_msg->hdr.event = BTA_DM_API_SET_AFH_CHANNELS_EVT;
    285         p_msg->first = first;
    286         p_msg->last = last;
    287         bta_sys_sendmsg(p_msg);
    288     }
    289 
    290 
    291 }
    292 
    293 /*******************************************************************************
    294 **
    295 ** Function         BTA_SetAfhChannelAssessment
    296 **
    297 ** Description      This function is called to set the channel assessment mode on or off
    298 **
    299 ** Returns          status
    300 **
    301 *******************************************************************************/
    302 void BTA_DmSetAfhChannelAssessment (BOOLEAN enable_or_disable)
    303 {
    304     tBTA_DM_API_SET_AFH_CHANNEL_ASSESSMENT *p_msg;
    305 
    306     if ((p_msg = (tBTA_DM_API_SET_AFH_CHANNEL_ASSESSMENT *) GKI_getbuf(sizeof(tBTA_DM_API_SET_AFH_CHANNEL_ASSESSMENT))) != NULL)
    307     {
    308         p_msg->hdr.event    = BTA_DM_API_SET_AFH_CHANNEL_ASSESMENT_EVT;
    309         p_msg->enable_or_disable = enable_or_disable;
    310         bta_sys_sendmsg(p_msg);
    311     }
    312 }
    313 
    314 /*******************************************************************************
    315 **
    316 ** Function         BTA_DmVendorSpecificCommand
    317 **
    318 ** Description      This function sends the vendor specific command
    319 **                  to the controller
    320 **
    321 **
    322 ** Returns          tBTA_STATUS
    323 **
    324 *******************************************************************************/
    325 tBTA_STATUS BTA_DmVendorSpecificCommand (UINT16 opcode, UINT8 param_len,
    326                                          UINT8 *p_param_buf,
    327                                          tBTA_VENDOR_CMPL_CBACK *p_cback)
    328 {
    329 
    330     tBTA_DM_API_VENDOR_SPECIFIC_COMMAND    *p_msg;
    331     UINT16 size;
    332 
    333     /* If p_cback is NULL, Notify application */
    334     if (p_cback == NULL)
    335     {
    336         return (BTA_FAILURE);
    337     }
    338     else
    339     {
    340         size = sizeof (tBTA_DM_API_VENDOR_SPECIFIC_COMMAND) + param_len;
    341         if ((p_msg = (tBTA_DM_API_VENDOR_SPECIFIC_COMMAND *) GKI_getbuf(size)) != NULL)
    342         {
    343             p_msg->hdr.event = BTA_DM_API_VENDOR_SPECIFIC_COMMAND_EVT;
    344             p_msg->opcode = opcode;
    345             p_msg->p_param_buf = (UINT8 *)(p_msg + 1);
    346             p_msg->p_cback = p_cback;
    347 
    348             if (p_param_buf && param_len)
    349             {
    350                 memcpy (p_msg->p_param_buf, p_param_buf, param_len);
    351                 p_msg->param_len = param_len;
    352             }
    353             else
    354             {
    355                 p_msg->param_len = 0;
    356                 p_msg->p_param_buf = NULL;
    357 
    358             }
    359 
    360             bta_sys_sendmsg(p_msg);
    361         }
    362         return (BTA_SUCCESS);
    363     }
    364 }
    365 /*******************************************************************************
    366 **
    367 ** Function         BTA_DmSearch
    368 **
    369 ** Description      This function searches for peer Bluetooth devices. It performs
    370 **                  an inquiry and gets the remote name for devices. Service
    371 **                  discovery is done if services is non zero
    372 **
    373 **
    374 ** Returns          void
    375 **
    376 *******************************************************************************/
    377 void BTA_DmSearch(tBTA_DM_INQ *p_dm_inq, tBTA_SERVICE_MASK services, tBTA_DM_SEARCH_CBACK *p_cback)
    378 {
    379 
    380     tBTA_DM_API_SEARCH    *p_msg;
    381 
    382     if ((p_msg = (tBTA_DM_API_SEARCH *) GKI_getbuf(sizeof(tBTA_DM_API_SEARCH))) != NULL)
    383     {
    384         memset(p_msg, 0, sizeof(tBTA_DM_API_SEARCH));
    385 
    386         p_msg->hdr.event = BTA_DM_API_SEARCH_EVT;
    387         memcpy(&p_msg->inq_params, p_dm_inq, sizeof(tBTA_DM_INQ));
    388         p_msg->services = services;
    389         p_msg->p_cback = p_cback;
    390         p_msg->rs_res  = BTA_DM_RS_NONE;
    391         bta_sys_sendmsg(p_msg);
    392     }
    393 
    394 }
    395 
    396 
    397 /*******************************************************************************
    398 **
    399 ** Function         BTA_DmSearchCancel
    400 **
    401 ** Description      This function  cancels a search initiated by BTA_DmSearch
    402 **
    403 **
    404 ** Returns          void
    405 **
    406 *******************************************************************************/
    407 void BTA_DmSearchCancel(void)
    408 {
    409     BT_HDR    *p_msg;
    410 
    411     if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL)
    412     {
    413         p_msg->event = BTA_DM_API_SEARCH_CANCEL_EVT;
    414         bta_sys_sendmsg(p_msg);
    415     }
    416 
    417 }
    418 
    419 /*******************************************************************************
    420 **
    421 ** Function         BTA_DmDiscover
    422 **
    423 ** Description      This function does service discovery for services of a
    424 **                  peer device
    425 **
    426 **
    427 ** Returns          void
    428 **
    429 *******************************************************************************/
    430 void BTA_DmDiscover(BD_ADDR bd_addr, tBTA_SERVICE_MASK services,
    431                     tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search)
    432 {
    433     tBTA_DM_API_DISCOVER    *p_msg;
    434 
    435     if ((p_msg = (tBTA_DM_API_DISCOVER *) GKI_getbuf(sizeof(tBTA_DM_API_DISCOVER))) != NULL)
    436     {
    437         memset(p_msg, 0, sizeof(tBTA_DM_API_DISCOVER));
    438 
    439         p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT;
    440         bdcpy(p_msg->bd_addr, bd_addr);
    441         p_msg->services = services;
    442         p_msg->p_cback = p_cback;
    443         p_msg->sdp_search = sdp_search;
    444         bta_sys_sendmsg(p_msg);
    445     }
    446 
    447 }
    448 
    449 /*******************************************************************************
    450 **
    451 ** Function         BTA_DmDiscoverUUID
    452 **
    453 ** Description      This function does service discovery for services of a
    454 **                  peer device
    455 **
    456 **
    457 ** Returns          void
    458 **
    459 *******************************************************************************/
    460 void BTA_DmDiscoverUUID(BD_ADDR bd_addr, tSDP_UUID *uuid,
    461                     tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search)
    462 {
    463     tBTA_DM_API_DISCOVER    *p_msg;
    464 
    465     if ((p_msg = (tBTA_DM_API_DISCOVER *) GKI_getbuf(sizeof(tBTA_DM_API_DISCOVER))) != NULL)
    466     {
    467         p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT;
    468         bdcpy(p_msg->bd_addr, bd_addr);
    469         p_msg->services = BTA_USER_SERVICE_MASK; //Not exposed at API level
    470         p_msg->p_cback = p_cback;
    471         p_msg->sdp_search = sdp_search;
    472 
    473 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
    474         p_msg->num_uuid = 0;
    475         p_msg->p_uuid = NULL;
    476 #endif
    477         memcpy( &p_msg->uuid, uuid, sizeof(tSDP_UUID) );
    478         bta_sys_sendmsg(p_msg);
    479     }
    480 
    481 }
    482 /*******************************************************************************
    483 **
    484 ** Function         BTA_DmIsMaster
    485 **
    486 ** Description      This function checks if the local device is the master of
    487 **                  the link to the given device
    488 **
    489 ** Returns          TRUE if master.
    490 **                  FALSE if not.
    491 **
    492 *******************************************************************************/
    493 BOOLEAN BTA_DmIsMaster(BD_ADDR bd_addr)
    494 {
    495     BOOLEAN is_master = FALSE;
    496     UINT8 link_role;
    497 
    498     BTM_GetRole(bd_addr, &link_role);
    499     APPL_TRACE_API("BTA_DmIsMaster role:x%x", link_role);
    500     if(link_role == BTM_ROLE_MASTER)
    501     {
    502         is_master = TRUE;
    503     }
    504     return is_master;
    505 }
    506 
    507 /*******************************************************************************
    508 **
    509 ** Function         BTA_DmBond
    510 **
    511 ** Description      This function initiates a bonding procedure with a peer
    512 **                  device
    513 **
    514 **
    515 ** Returns          void
    516 **
    517 *******************************************************************************/
    518 void BTA_DmBond(BD_ADDR bd_addr)
    519 {
    520     BTA_DmBondByTransport (bd_addr, BTA_TRANSPORT_UNKNOWN);
    521 }
    522 
    523 /*******************************************************************************
    524 **
    525 ** Function         BTA_DmBondByTransports
    526 **
    527 ** Description      This function initiates a bonding procedure with a peer
    528 **                  device
    529 **
    530 **
    531 ** Returns          void
    532 **
    533 *******************************************************************************/
    534 void BTA_DmBondByTransport(BD_ADDR bd_addr, tBTA_TRANSPORT transport)
    535 {
    536     tBTA_DM_API_BOND    *p_msg;
    537 
    538     if ((p_msg = (tBTA_DM_API_BOND *) GKI_getbuf(sizeof(tBTA_DM_API_BOND))) != NULL)
    539     {
    540         p_msg->hdr.event = BTA_DM_API_BOND_EVT;
    541         bdcpy(p_msg->bd_addr, bd_addr);
    542         p_msg->transport = transport;
    543         bta_sys_sendmsg(p_msg);
    544     }
    545 
    546 
    547 }
    548 
    549 /*******************************************************************************
    550 **
    551 ** Function         BTA_DmBondCancel
    552 **
    553 ** Description      This function cancels the bonding procedure with a peer
    554 **                  device
    555 **
    556 **
    557 ** Returns          void
    558 **
    559 *******************************************************************************/
    560 void BTA_DmBondCancel(BD_ADDR bd_addr)
    561 {
    562     tBTA_DM_API_BOND_CANCEL    *p_msg;
    563 
    564     if ((p_msg = (tBTA_DM_API_BOND_CANCEL *) GKI_getbuf(sizeof(tBTA_DM_API_BOND_CANCEL))) != NULL)
    565     {
    566         p_msg->hdr.event = BTA_DM_API_BOND_CANCEL_EVT;
    567         bdcpy(p_msg->bd_addr, bd_addr);
    568         bta_sys_sendmsg(p_msg);
    569     }
    570 
    571 
    572 }
    573 
    574 /*******************************************************************************
    575 **
    576 ** Function         BTA_DmPinReply
    577 **
    578 ** Description      This function provides a pincode for a remote device when
    579 **                  one is requested by DM through BTA_DM_PIN_REQ_EVT
    580 **
    581 **
    582 ** Returns          void
    583 **
    584 *******************************************************************************/
    585 void BTA_DmPinReply(BD_ADDR bd_addr, BOOLEAN accept, UINT8 pin_len, UINT8 *p_pin)
    586 
    587 {
    588     tBTA_DM_API_PIN_REPLY    *p_msg;
    589 
    590     if ((p_msg = (tBTA_DM_API_PIN_REPLY *) GKI_getbuf(sizeof(tBTA_DM_API_PIN_REPLY))) != NULL)
    591     {
    592         p_msg->hdr.event = BTA_DM_API_PIN_REPLY_EVT;
    593         bdcpy(p_msg->bd_addr, bd_addr);
    594         p_msg->accept = accept;
    595         if(accept)
    596         {
    597             p_msg->pin_len = pin_len;
    598             memcpy(p_msg->p_pin, p_pin, pin_len);
    599         }
    600         bta_sys_sendmsg(p_msg);
    601     }
    602 
    603 }
    604 
    605 /*******************************************************************************
    606 **
    607 ** Function         BTA_DmLinkPolicy
    608 **
    609 ** Description      This function sets/clears the link policy mask to the given
    610 **                  bd_addr.
    611 **                  If clearing the sniff or park mode mask, the link is put
    612 **                  in active mode.
    613 **
    614 ** Returns          void
    615 **
    616 *******************************************************************************/
    617 void BTA_DmLinkPolicy(BD_ADDR bd_addr, tBTA_DM_LP_MASK policy_mask,
    618                       BOOLEAN set)
    619 {
    620     tBTA_DM_API_LINK_POLICY    *p_msg;
    621 
    622     if ((p_msg = (tBTA_DM_API_LINK_POLICY *) GKI_getbuf(sizeof(tBTA_DM_API_LINK_POLICY))) != NULL)
    623     {
    624         p_msg->hdr.event = BTA_DM_API_LINK_POLICY_EVT;
    625         bdcpy(p_msg->bd_addr, bd_addr);
    626         p_msg->policy_mask = policy_mask;
    627         p_msg->set = set;
    628         bta_sys_sendmsg(p_msg);
    629     }
    630 }
    631 
    632 
    633 #if (BTM_OOB_INCLUDED == TRUE)
    634 /*******************************************************************************
    635 **
    636 ** Function         BTA_DmLocalOob
    637 **
    638 ** Description      This function retrieves the OOB data from local controller.
    639 **                  The result is reported by bta_dm_co_loc_oob().
    640 **
    641 ** Returns          void
    642 **
    643 *******************************************************************************/
    644 void BTA_DmLocalOob(void)
    645 {
    646     tBTA_DM_API_LOC_OOB    *p_msg;
    647 
    648     if ((p_msg = (tBTA_DM_API_LOC_OOB *) GKI_getbuf(sizeof(tBTA_DM_API_LOC_OOB))) != NULL)
    649     {
    650         p_msg->hdr.event = BTA_DM_API_LOC_OOB_EVT;
    651         bta_sys_sendmsg(p_msg);
    652     }
    653 }
    654 #endif /* BTM_OOB_INCLUDED */
    655 /*******************************************************************************
    656 **
    657 ** Function         BTA_DmConfirm
    658 **
    659 ** Description      This function accepts or rejects the numerical value of the
    660 **                  Simple Pairing process on BTA_DM_SP_CFM_REQ_EVT
    661 **
    662 ** Returns          void
    663 **
    664 *******************************************************************************/
    665 void BTA_DmConfirm(BD_ADDR bd_addr, BOOLEAN accept)
    666 {
    667     tBTA_DM_API_CONFIRM    *p_msg;
    668 
    669     if ((p_msg = (tBTA_DM_API_CONFIRM *) GKI_getbuf(sizeof(tBTA_DM_API_CONFIRM))) != NULL)
    670     {
    671         p_msg->hdr.event = BTA_DM_API_CONFIRM_EVT;
    672         bdcpy(p_msg->bd_addr, bd_addr);
    673         p_msg->accept = accept;
    674         bta_sys_sendmsg(p_msg);
    675     }
    676 }
    677 
    678 /*******************************************************************************
    679 **
    680 ** Function         BTA_DmPasskeyCancel
    681 **
    682 ** Description      This function is called to cancel the simple pairing process
    683 **                  reported by BTA_DM_SP_KEY_NOTIF_EVT
    684 **
    685 ** Returns          void
    686 **
    687 *******************************************************************************/
    688 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
    689 void BTA_DmPasskeyCancel(BD_ADDR bd_addr)
    690 {
    691     tBTA_DM_API_PASKY_CANCEL    *p_msg;
    692 
    693     if ((p_msg = (tBTA_DM_API_PASKY_CANCEL *) \
    694         GKI_getbuf(sizeof(tBTA_DM_API_PASKY_CANCEL))) != NULL)
    695     {
    696         p_msg->hdr.event = BTA_DM_API_PASKY_CANCEL_EVT;
    697         bdcpy(p_msg->bd_addr, bd_addr);
    698         bta_sys_sendmsg(p_msg);
    699     }
    700 }
    701 #endif
    702 
    703 
    704 /*******************************************************************************
    705 **
    706 ** Function         BTA_DmAddDevice
    707 **
    708 ** Description      This function adds a device to the security database list of
    709 **                  peer device
    710 **
    711 **
    712 ** Returns          void
    713 **
    714 *******************************************************************************/
    715 void BTA_DmAddDevice(BD_ADDR bd_addr, DEV_CLASS dev_class, LINK_KEY link_key,
    716                      tBTA_SERVICE_MASK trusted_mask, BOOLEAN is_trusted,
    717                      UINT8 key_type, tBTA_IO_CAP io_cap)
    718 {
    719 
    720     tBTA_DM_API_ADD_DEVICE *p_msg;
    721 
    722     if ((p_msg = (tBTA_DM_API_ADD_DEVICE *) GKI_getbuf(sizeof(tBTA_DM_API_ADD_DEVICE))) != NULL)
    723     {
    724         memset (p_msg, 0, sizeof(tBTA_DM_API_ADD_DEVICE));
    725 
    726         p_msg->hdr.event = BTA_DM_API_ADD_DEVICE_EVT;
    727         bdcpy(p_msg->bd_addr, bd_addr);
    728         p_msg->tm = trusted_mask;
    729         p_msg->is_trusted = is_trusted;
    730         p_msg->io_cap = io_cap;
    731 
    732         if (link_key)
    733         {
    734             p_msg->link_key_known = TRUE;
    735             p_msg->key_type = key_type;
    736             memcpy(p_msg->link_key, link_key, LINK_KEY_LEN);
    737         }
    738 
    739         /* Load device class if specified */
    740         if (dev_class)
    741         {
    742             p_msg->dc_known = TRUE;
    743             memcpy (p_msg->dc, dev_class, DEV_CLASS_LEN);
    744         }
    745 
    746         memset (p_msg->bd_name, 0, BD_NAME_LEN);
    747         memset (p_msg->features, 0, sizeof (p_msg->features));
    748 
    749         bta_sys_sendmsg(p_msg);
    750     }
    751 }
    752 
    753 
    754 /*******************************************************************************
    755 **
    756 ** Function         BTA_DmRemoveDevice
    757 **
    758 ** Description      This function removes a device fromthe security database list of
    759 **                  peer device
    760 **
    761 **
    762 ** Returns          void
    763 **
    764 *******************************************************************************/
    765 tBTA_STATUS BTA_DmRemoveDevice(BD_ADDR bd_addr)
    766 {
    767     tBTA_DM_API_REMOVE_DEVICE *p_msg;
    768 
    769     if ((p_msg = (tBTA_DM_API_REMOVE_DEVICE *) GKI_getbuf(sizeof(tBTA_DM_API_REMOVE_DEVICE))) != NULL)
    770     {
    771         memset (p_msg, 0, sizeof(tBTA_DM_API_REMOVE_DEVICE));
    772 
    773         p_msg->hdr.event = BTA_DM_API_REMOVE_DEVICE_EVT;
    774         bdcpy(p_msg->bd_addr, bd_addr);
    775         bta_sys_sendmsg(p_msg);
    776     }
    777     else
    778     {
    779         return BTA_FAILURE;
    780     }
    781 
    782     return BTA_SUCCESS;
    783 }
    784 
    785 /*******************************************************************************
    786 **
    787 ** Function         BTA_DmAddDevWithName
    788 **
    789 ** Description      This function is newer version of  BTA_DmAddDevice()
    790 **                  which added bd_name and features as input parameters.
    791 **
    792 **
    793 ** Returns          void
    794 **
    795 *******************************************************************************/
    796 void BTA_DmAddDevWithName (BD_ADDR bd_addr, DEV_CLASS dev_class,
    797                                       BD_NAME bd_name, UINT8 *features,
    798                                       LINK_KEY link_key, tBTA_SERVICE_MASK trusted_mask,
    799                                       BOOLEAN is_trusted, UINT8 key_type, tBTA_IO_CAP io_cap)
    800 {
    801     tBTA_DM_API_ADD_DEVICE *p_msg;
    802 
    803     if ((p_msg = (tBTA_DM_API_ADD_DEVICE *) GKI_getbuf(sizeof(tBTA_DM_API_ADD_DEVICE))) != NULL)
    804     {
    805         memset (p_msg, 0, sizeof(tBTA_DM_API_ADD_DEVICE));
    806 
    807         p_msg->hdr.event = BTA_DM_API_ADD_DEVICE_EVT;
    808         bdcpy(p_msg->bd_addr, bd_addr);
    809         p_msg->tm = trusted_mask;
    810         p_msg->is_trusted = is_trusted;
    811         p_msg->io_cap = io_cap;
    812 
    813         if (link_key)
    814         {
    815             p_msg->link_key_known = TRUE;
    816             p_msg->key_type = key_type;
    817             memcpy(p_msg->link_key, link_key, LINK_KEY_LEN);
    818         }
    819 
    820         /* Load device class if specified */
    821         if (dev_class)
    822         {
    823             p_msg->dc_known = TRUE;
    824             memcpy (p_msg->dc, dev_class, DEV_CLASS_LEN);
    825         }
    826 
    827         if (bd_name)
    828             memcpy(p_msg->bd_name, bd_name, BD_NAME_LEN);
    829 
    830         if (features)
    831             memcpy(p_msg->features, features, sizeof(p_msg->features));
    832 
    833         bta_sys_sendmsg(p_msg);
    834     }
    835 }
    836 
    837 /*******************************************************************************
    838 **
    839 ** Function         BTA_DmAuthorizeReply
    840 **
    841 ** Description      This function provides an authorization reply when authorization
    842 **                  is requested by BTA through BTA_DM_AUTHORIZE_EVT
    843 **
    844 **
    845 ** Returns          tBTA_STATUS
    846 **
    847 *******************************************************************************/
    848 void BTA_DmAuthorizeReply(BD_ADDR bd_addr, tBTA_SERVICE_ID service, tBTA_AUTH_RESP response)
    849 {
    850 
    851     tBTA_DM_API_AUTH_REPLY    *p_msg;
    852 
    853     if ((p_msg = (tBTA_DM_API_AUTH_REPLY *) GKI_getbuf(sizeof(tBTA_DM_API_AUTH_REPLY))) != NULL)
    854     {
    855         p_msg->hdr.event = BTA_DM_API_AUTH_REPLY_EVT;
    856         bdcpy(p_msg->bd_addr, bd_addr);
    857         p_msg->service = service;
    858         p_msg->response = response;
    859 
    860         bta_sys_sendmsg(p_msg);
    861     }
    862 
    863 }
    864 
    865 /*******************************************************************************
    866 **
    867 ** Function         BTA_DmSignalStrength
    868 **
    869 ** Description      This function initiates RSSI and channnel quality
    870 **                  measurments. BTA_DM_SIG_STRENGTH_EVT is sent to
    871 **                  application with the values of RSSI and channel
    872 **                  quality
    873 **
    874 **
    875 ** Returns          void
    876 **
    877 *******************************************************************************/
    878 void BTA_DmSignalStrength(tBTA_SIG_STRENGTH_MASK mask, UINT16 period, BOOLEAN start)
    879 {
    880 
    881     tBTA_API_DM_SIG_STRENGTH    *p_msg;
    882 
    883     if ((p_msg = (tBTA_API_DM_SIG_STRENGTH *) GKI_getbuf(sizeof(tBTA_API_DM_SIG_STRENGTH))) != NULL)
    884     {
    885         p_msg->hdr.event = BTA_API_DM_SIG_STRENGTH_EVT;
    886         p_msg->mask = mask;
    887         p_msg->period = period;
    888         p_msg->start = start;
    889 
    890         bta_sys_sendmsg(p_msg);
    891     }
    892 
    893 
    894 }
    895 
    896 /*******************************************************************************
    897 **
    898 ** Function         BTA_DmWriteInqTxPower
    899 **
    900 ** Description      This command is used to write the inquiry transmit power level
    901 **                  used to transmit the inquiry (ID) data packets.
    902 **
    903 ** Parameters       tx_power - tx inquiry power to use, valid value is -70 ~ 20
    904 
    905 ** Returns          void
    906 **
    907 *******************************************************************************/
    908 void BTA_DmWriteInqTxPower(INT8 tx_power)
    909 {
    910 
    911     tBTA_API_DM_TX_INQPWR    *p_msg;
    912 
    913     if ((p_msg = (tBTA_API_DM_TX_INQPWR *) GKI_getbuf(sizeof(tBTA_API_DM_TX_INQPWR))) != NULL)
    914     {
    915         p_msg->hdr.event = BTA_DM_API_TX_INQPWR_EVT;
    916         p_msg->tx_power = tx_power;
    917 
    918         bta_sys_sendmsg(p_msg);
    919     }
    920 }
    921 
    922 
    923 /*******************************************************************************
    924 **
    925 ** Function         BTA_DmEirAddUUID
    926 **
    927 ** Description      This function is called to add UUID into EIR.
    928 **
    929 ** Parameters       tBT_UUID - UUID
    930 **
    931 ** Returns          None
    932 **
    933 *******************************************************************************/
    934 void BTA_DmEirAddUUID (tBT_UUID *p_uuid)
    935 {
    936 #if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
    937     tBTA_DM_API_UPDATE_EIR_UUID    *p_msg;
    938 
    939     if ((p_msg = (tBTA_DM_API_UPDATE_EIR_UUID *) GKI_getbuf(sizeof(tBTA_DM_API_UPDATE_EIR_UUID))) != NULL)
    940     {
    941         p_msg->hdr.event = BTA_DM_API_UPDATE_EIR_UUID_EVT;
    942         p_msg->is_add    = TRUE;
    943         memcpy (&(p_msg->uuid), p_uuid, sizeof(tBT_UUID));
    944 
    945         bta_sys_sendmsg(p_msg);
    946     }
    947 #endif
    948 }
    949 
    950 /*******************************************************************************
    951 **
    952 ** Function         BTA_DmEirRemoveUUID
    953 **
    954 ** Description      This function is called to remove UUID from EIR.
    955 **
    956 ** Parameters       tBT_UUID - UUID
    957 **
    958 ** Returns          None
    959 **
    960 *******************************************************************************/
    961 void BTA_DmEirRemoveUUID (tBT_UUID *p_uuid)
    962 {
    963 #if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
    964     tBTA_DM_API_UPDATE_EIR_UUID    *p_msg;
    965 
    966     if ((p_msg = (tBTA_DM_API_UPDATE_EIR_UUID *) GKI_getbuf(sizeof(tBTA_DM_API_UPDATE_EIR_UUID))) != NULL)
    967     {
    968         p_msg->hdr.event = BTA_DM_API_UPDATE_EIR_UUID_EVT;
    969         p_msg->is_add    = FALSE;
    970         memcpy (&(p_msg->uuid), p_uuid, sizeof(tBT_UUID));
    971 
    972         bta_sys_sendmsg(p_msg);
    973     }
    974 #endif
    975 }
    976 
    977 /*******************************************************************************
    978 **
    979 ** Function         BTA_DmSetEIRConfig
    980 **
    981 ** Description      This function is called to override the BTA default EIR parameters.
    982 **                  This funciton is only valid in a system where BTU & App task
    983 **                  are in the same memory space.
    984 **
    985 ** Parameters       Pointer to User defined EIR config
    986 **
    987 ** Returns          None
    988 **
    989 *******************************************************************************/
    990 void BTA_DmSetEIRConfig (tBTA_DM_EIR_CONF *p_eir_cfg)
    991 {
    992 #if (BTM_EIR_SERVER_INCLUDED == TRUE)
    993     tBTA_DM_API_SET_EIR_CONFIG  *p_msg;
    994 
    995     if ((p_msg = (tBTA_DM_API_SET_EIR_CONFIG *) GKI_getbuf(sizeof(tBTA_DM_API_SET_EIR_CONFIG))) != NULL)
    996     {
    997         p_msg->hdr.event = BTA_DM_API_SET_EIR_CONFIG_EVT;
    998         p_msg->p_eir_cfg = p_eir_cfg;
    999 
   1000         bta_sys_sendmsg(p_msg);
   1001     }
   1002 #endif
   1003 }
   1004 
   1005 /*******************************************************************************
   1006 **
   1007 ** Function         BTA_CheckEirData
   1008 **
   1009 ** Description      This function is called to get EIR data from significant part.
   1010 **
   1011 ** Parameters       p_eir - pointer of EIR significant part
   1012 **                  type   - finding EIR data type
   1013 **                  p_length - return the length of EIR data
   1014 **
   1015 ** Returns          pointer of EIR data
   1016 **
   1017 *******************************************************************************/
   1018 UINT8 *BTA_CheckEirData( UINT8 *p_eir, UINT8 type, UINT8 *p_length )
   1019 {
   1020 #if ( BTM_EIR_CLIENT_INCLUDED == TRUE )
   1021     return BTM_CheckEirData( p_eir, type, p_length );
   1022 #else
   1023     return NULL;
   1024 #endif
   1025 }
   1026 
   1027 /*******************************************************************************
   1028 **
   1029 ** Function         BTA_GetEirService
   1030 **
   1031 ** Description      This function is called to get BTA service mask from EIR.
   1032 **
   1033 ** Parameters       p_eir - pointer of EIR significant part
   1034 **                  p_services - return the BTA service mask
   1035 **
   1036 ** Returns          None
   1037 **
   1038 *******************************************************************************/
   1039 extern const UINT16 bta_service_id_to_uuid_lkup_tbl [];
   1040 void BTA_GetEirService( UINT8 *p_eir, tBTA_SERVICE_MASK *p_services )
   1041 {
   1042 #if ( BTM_EIR_CLIENT_INCLUDED == TRUE )
   1043     UINT8 xx, yy;
   1044     UINT8 num_uuid, max_num_uuid = 32;
   1045     UINT8 uuid_list[32*LEN_UUID_16];
   1046     UINT16 *p_uuid16 = (UINT16 *)uuid_list;
   1047     tBTA_SERVICE_MASK mask;
   1048 
   1049     BTM_GetEirUuidList( p_eir, LEN_UUID_16, &num_uuid, uuid_list, max_num_uuid);
   1050     for( xx = 0; xx < num_uuid; xx++ )
   1051     {
   1052         mask = 1;
   1053         for( yy = 0; yy < BTA_MAX_SERVICE_ID; yy++ )
   1054         {
   1055             if( *(p_uuid16 + xx) == bta_service_id_to_uuid_lkup_tbl[yy] )
   1056             {
   1057                 *p_services |= mask;
   1058                 break;
   1059             }
   1060             mask <<= 1;
   1061         }
   1062 
   1063         /* for HSP v1.2 only device */
   1064         if (*(p_uuid16 + xx) == UUID_SERVCLASS_HEADSET_HS)
   1065             *p_services |= BTA_HSP_SERVICE_MASK;
   1066 
   1067        if (*(p_uuid16 + xx) == UUID_SERVCLASS_HDP_SOURCE)
   1068             *p_services |= BTA_HL_SERVICE_MASK;
   1069 
   1070         if (*(p_uuid16 + xx) == UUID_SERVCLASS_HDP_SINK)
   1071             *p_services |= BTA_HL_SERVICE_MASK;
   1072     }
   1073 #endif
   1074 }
   1075 
   1076 /*******************************************************************************
   1077 **
   1078 ** Function         BTA_DmUseSsr
   1079 **
   1080 ** Description      This function is called to check if the connected peer device
   1081 **                  supports SSR or not.
   1082 **
   1083 ** Returns          TRUE, if SSR is supported
   1084 **
   1085 *******************************************************************************/
   1086 BOOLEAN BTA_DmUseSsr( BD_ADDR bd_addr )
   1087 {
   1088     BOOLEAN use_ssr = FALSE;
   1089     tBTA_DM_PEER_DEVICE * p_dev = bta_dm_find_peer_device(bd_addr);
   1090     if(p_dev && (p_dev->info & BTA_DM_DI_USE_SSR) )
   1091         use_ssr = TRUE;
   1092     return use_ssr;
   1093 }
   1094 
   1095 /*******************************************************************************
   1096 **
   1097 ** Function         BTA_DmGetConnectionState
   1098 **
   1099 ** Description      Returns whether the remote device is currently connected.
   1100 **
   1101 ** Returns          0 if the device is NOT connected.
   1102 **
   1103 *******************************************************************************/
   1104 UINT16 BTA_DmGetConnectionState( BD_ADDR bd_addr )
   1105 {
   1106     tBTA_DM_PEER_DEVICE * p_dev = bta_dm_find_peer_device(bd_addr);
   1107     return (p_dev && p_dev->conn_state == BTA_DM_CONNECTED);
   1108 }
   1109 
   1110 
   1111 /*******************************************************************************
   1112 **                   Device Identification (DI) Server Functions
   1113 *******************************************************************************/
   1114 /*******************************************************************************
   1115 **
   1116 ** Function         BTA_DmSetLocalDiRecord
   1117 **
   1118 ** Description      This function adds a DI record to the local SDP database.
   1119 **
   1120 ** Returns          BTA_SUCCESS if record set sucessfully, otherwise error code.
   1121 **
   1122 *******************************************************************************/
   1123 tBTA_STATUS BTA_DmSetLocalDiRecord( tBTA_DI_RECORD *p_device_info,
   1124                               UINT32 *p_handle )
   1125 {
   1126     tBTA_STATUS  status = BTA_FAILURE;
   1127 
   1128     if(bta_dm_di_cb.di_num < BTA_DI_NUM_MAX)
   1129     {
   1130         if(SDP_SetLocalDiRecord((tSDP_DI_RECORD *)p_device_info, p_handle) == SDP_SUCCESS)
   1131         {
   1132             if(!p_device_info->primary_record)
   1133             {
   1134                 bta_dm_di_cb.di_handle[bta_dm_di_cb.di_num] = *p_handle;
   1135                 bta_dm_di_cb.di_num ++;
   1136             }
   1137 
   1138             bta_sys_add_uuid(UUID_SERVCLASS_PNP_INFORMATION);
   1139             status =  BTA_SUCCESS;
   1140         }
   1141     }
   1142 
   1143     return status;
   1144 }
   1145 
   1146 /*******************************************************************************
   1147 **
   1148 ** Function         BTA_DmGetLocalDiRecord
   1149 **
   1150 ** Description      Get a specified DI record to the local SDP database. If no
   1151 **                  record handle is provided, the primary DI record will be
   1152 **                  returned.
   1153 **
   1154 **                  Fills in the device information of the record
   1155 **                  p_handle - if p_handle == 0, the primary record is returned
   1156 **
   1157 ** Returns          BTA_SUCCESS if record set sucessfully, otherwise error code.
   1158 **
   1159 *******************************************************************************/
   1160 tBTA_STATUS BTA_DmGetLocalDiRecord( tBTA_DI_GET_RECORD *p_device_info,
   1161                               UINT32 *p_handle )
   1162 {
   1163     UINT16  status;
   1164 
   1165     status = SDP_GetLocalDiRecord(p_device_info, p_handle);
   1166 
   1167     if (status == SDP_SUCCESS)
   1168         return BTA_SUCCESS;
   1169     else
   1170         return BTA_FAILURE;
   1171 
   1172 }
   1173 
   1174 /*******************************************************************************
   1175 **                   Device Identification (DI) Client Functions
   1176 *******************************************************************************/
   1177 /*******************************************************************************
   1178 **
   1179 ** Function         BTA_DmDiDiscover
   1180 **
   1181 ** Description      This function queries a remote device for DI information.
   1182 **
   1183 **
   1184 ** Returns          None.
   1185 **
   1186 *******************************************************************************/
   1187 void BTA_DmDiDiscover( BD_ADDR remote_device, tBTA_DISCOVERY_DB *p_db,
   1188                        UINT32 len, tBTA_DM_SEARCH_CBACK *p_cback )
   1189 {
   1190     tBTA_DM_API_DI_DISC    *p_msg;
   1191 
   1192     if ((p_msg = (tBTA_DM_API_DI_DISC *) GKI_getbuf(sizeof(tBTA_DM_API_DI_DISC))) != NULL)
   1193     {
   1194         bdcpy(p_msg->bd_addr, remote_device);
   1195         p_msg->hdr.event    = BTA_DM_API_DI_DISCOVER_EVT;
   1196         p_msg->p_sdp_db     = p_db;
   1197         p_msg->len          = len;
   1198         p_msg->p_cback      = p_cback;
   1199 
   1200         bta_sys_sendmsg(p_msg);
   1201     }
   1202 }
   1203 
   1204 /*******************************************************************************
   1205 **
   1206 ** Function         BTA_DmGetDiRecord
   1207 **
   1208 ** Description      This function retrieves a remote device's DI record from
   1209 **                  the specified database.
   1210 **
   1211 ** Returns          BTA_SUCCESS if Get DI record is succeed.
   1212 **                  BTA_FAILURE if Get DI record failed.
   1213 **
   1214 *******************************************************************************/
   1215 tBTA_STATUS BTA_DmGetDiRecord( UINT8 get_record_index, tBTA_DI_GET_RECORD *p_device_info,
   1216                         tBTA_DISCOVERY_DB *p_db )
   1217 {
   1218     if (SDP_GetDiRecord(get_record_index, p_device_info, p_db) != SDP_SUCCESS)
   1219         return BTA_FAILURE;
   1220     else
   1221         return BTA_SUCCESS;
   1222 }
   1223 
   1224 /*******************************************************************************
   1225 **
   1226 ** Function         BTA_SysFeatures
   1227 **
   1228 ** Description      This function is called to set system features.
   1229 **
   1230 ** Returns          void
   1231 **
   1232 *******************************************************************************/
   1233 void BTA_SysFeatures (UINT16 sys_features)
   1234 {
   1235     bta_sys_cb.sys_features = sys_features;
   1236 
   1237     APPL_TRACE_API("BTA_SysFeatures: sys_features = %d", sys_features);
   1238 }
   1239 
   1240 /*******************************************************************************
   1241 **
   1242 ** Function         bta_dmexecutecallback
   1243 **
   1244 ** Description      This function will request BTA to execute a call back in the context of BTU task
   1245 **                  This API was named in lower case because it is only intended
   1246 **                  for the internal customers(like BTIF).
   1247 **
   1248 ** Returns          void
   1249 **
   1250 *******************************************************************************/
   1251 void bta_dmexecutecallback (tBTA_DM_EXEC_CBACK* p_callback, void * p_param)
   1252 {
   1253     tBTA_DM_API_EXECUTE_CBACK *p_msg;
   1254 
   1255     if ((p_msg = (tBTA_DM_API_EXECUTE_CBACK *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
   1256     {
   1257         p_msg->hdr.event = BTA_DM_API_EXECUTE_CBACK_EVT;
   1258         p_msg->p_param= p_param;
   1259         p_msg->p_exec_cback= p_callback;
   1260         bta_sys_sendmsg(p_msg);
   1261     }
   1262 }
   1263 
   1264 /*******************************************************************************
   1265 **
   1266 ** Function         BTA_DmAddBleKey
   1267 **
   1268 ** Description      Add/modify LE device information.  This function will be
   1269 **                  normally called during host startup to restore all required
   1270 **                  information stored in the NVRAM.
   1271 **
   1272 ** Parameters:      bd_addr          - BD address of the peer
   1273 **                  p_le_key         - LE key values.
   1274 **                  key_type         - LE SMP key type.
   1275 **
   1276 ** Returns          void
   1277 **
   1278 *******************************************************************************/
   1279 void BTA_DmAddBleKey (BD_ADDR bd_addr, tBTA_LE_KEY_VALUE *p_le_key, tBTA_LE_KEY_TYPE key_type)
   1280 {
   1281 #if BLE_INCLUDED == TRUE
   1282 
   1283     tBTA_DM_API_ADD_BLEKEY *p_msg;
   1284 
   1285     if ((p_msg = (tBTA_DM_API_ADD_BLEKEY *) GKI_getbuf(sizeof(tBTA_DM_API_ADD_BLEKEY))) != NULL)
   1286     {
   1287         memset (p_msg, 0, sizeof(tBTA_DM_API_ADD_BLEKEY));
   1288 
   1289         p_msg->hdr.event = BTA_DM_API_ADD_BLEKEY_EVT;
   1290         p_msg->key_type = key_type;
   1291         bdcpy(p_msg->bd_addr, bd_addr);
   1292         memcpy(&p_msg->blekey, p_le_key, sizeof(tBTA_LE_KEY_VALUE));
   1293 
   1294         bta_sys_sendmsg(p_msg);
   1295     }
   1296 
   1297 #endif
   1298 }
   1299 
   1300 /*******************************************************************************
   1301 **
   1302 ** Function         BTA_DmAddBleDevice
   1303 **
   1304 ** Description      Add a BLE device.  This function will be normally called
   1305 **                  during host startup to restore all required information
   1306 **                  for a LE device stored in the NVRAM.
   1307 **
   1308 ** Parameters:      bd_addr          - BD address of the peer
   1309 **                  dev_type         - Remote device's device type.
   1310 **                  addr_type        - LE device address type.
   1311 **
   1312 ** Returns          void
   1313 **
   1314 *******************************************************************************/
   1315 void BTA_DmAddBleDevice(BD_ADDR bd_addr, tBLE_ADDR_TYPE addr_type, tBT_DEVICE_TYPE dev_type)
   1316 {
   1317 #if BLE_INCLUDED == TRUE
   1318     tBTA_DM_API_ADD_BLE_DEVICE *p_msg;
   1319 
   1320     if ((p_msg = (tBTA_DM_API_ADD_BLE_DEVICE *) GKI_getbuf(sizeof(tBTA_DM_API_ADD_BLE_DEVICE))) != NULL)
   1321     {
   1322         memset (p_msg, 0, sizeof(tBTA_DM_API_ADD_BLE_DEVICE));
   1323 
   1324         p_msg->hdr.event = BTA_DM_API_ADD_BLEDEVICE_EVT;
   1325         bdcpy(p_msg->bd_addr, bd_addr);
   1326         p_msg->addr_type = addr_type;
   1327         p_msg->dev_type = dev_type;
   1328 
   1329         bta_sys_sendmsg(p_msg);
   1330     }
   1331 #endif
   1332 }
   1333 /*******************************************************************************
   1334 **
   1335 ** Function         BTA_DmBlePasskeyReply
   1336 **
   1337 ** Description      Send BLE SMP passkey reply.
   1338 **
   1339 ** Parameters:      bd_addr          - BD address of the peer
   1340 **                  accept           - passkey entry sucessful or declined.
   1341 **                  passkey          - passkey value, must be a 6 digit number,
   1342 **                                     can be lead by 0.
   1343 **
   1344 ** Returns          void
   1345 **
   1346 *******************************************************************************/
   1347 void BTA_DmBlePasskeyReply(BD_ADDR bd_addr, BOOLEAN accept, UINT32 passkey)
   1348 {
   1349 #if BLE_INCLUDED == TRUE
   1350     tBTA_DM_API_PASSKEY_REPLY    *p_msg;
   1351 
   1352     if ((p_msg = (tBTA_DM_API_PASSKEY_REPLY *) GKI_getbuf(sizeof(tBTA_DM_API_PASSKEY_REPLY))) != NULL)
   1353     {
   1354         memset(p_msg, 0, sizeof(tBTA_DM_API_PASSKEY_REPLY));
   1355 
   1356         p_msg->hdr.event = BTA_DM_API_BLE_PASSKEY_REPLY_EVT;
   1357         bdcpy(p_msg->bd_addr, bd_addr);
   1358         p_msg->accept = accept;
   1359 
   1360         if(accept)
   1361         {
   1362             p_msg->passkey = passkey;
   1363         }
   1364         bta_sys_sendmsg(p_msg);
   1365     }
   1366 #endif
   1367 }
   1368 /*******************************************************************************
   1369 **
   1370 ** Function         BTA_DmBleSecurityGrant
   1371 **
   1372 ** Description      Grant security request access.
   1373 **
   1374 ** Parameters:      bd_addr          - BD address of the peer
   1375 **                  res              - security grant status.
   1376 **
   1377 ** Returns          void
   1378 **
   1379 *******************************************************************************/
   1380 void BTA_DmBleSecurityGrant(BD_ADDR bd_addr, tBTA_DM_BLE_SEC_GRANT res)
   1381 {
   1382 #if BLE_INCLUDED == TRUE
   1383     tBTA_DM_API_BLE_SEC_GRANT    *p_msg;
   1384 
   1385     if ((p_msg = (tBTA_DM_API_BLE_SEC_GRANT *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_SEC_GRANT))) != NULL)
   1386     {
   1387         memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_SEC_GRANT));
   1388 
   1389         p_msg->hdr.event = BTA_DM_API_BLE_SEC_GRANT_EVT;
   1390         bdcpy(p_msg->bd_addr, bd_addr);
   1391         p_msg->res = res;
   1392 
   1393         bta_sys_sendmsg(p_msg);
   1394     }
   1395 #endif
   1396 }
   1397 /*******************************************************************************
   1398 **
   1399 ** Function         BTA_DmSetBlePrefConnParams
   1400 **
   1401 ** Description      This function is called to set the preferred connection
   1402 **                  parameters when default connection parameter is not desired.
   1403 **
   1404 ** Parameters:      bd_addr          - BD address of the peripheral
   1405 **                  scan_interval    - scan interval
   1406 **                  scan_window      - scan window
   1407 **                  min_conn_int     - minimum preferred connection interval
   1408 **                  max_conn_int     - maximum preferred connection interval
   1409 **                  slave_latency    - preferred slave latency
   1410 **                  supervision_tout - preferred supervision timeout
   1411 **
   1412 **
   1413 ** Returns          void
   1414 **
   1415 *******************************************************************************/
   1416 void BTA_DmSetBlePrefConnParams(BD_ADDR bd_addr,
   1417                                UINT16 min_conn_int, UINT16 max_conn_int,
   1418                                UINT16 slave_latency, UINT16 supervision_tout )
   1419 {
   1420 #if BLE_INCLUDED == TRUE
   1421     tBTA_DM_API_BLE_CONN_PARAMS    *p_msg;
   1422 
   1423     if ((p_msg = (tBTA_DM_API_BLE_CONN_PARAMS *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_CONN_PARAMS))) != NULL)
   1424     {
   1425         memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_CONN_PARAMS));
   1426 
   1427         p_msg->hdr.event = BTA_DM_API_BLE_CONN_PARAM_EVT;
   1428 
   1429         memcpy(p_msg->peer_bda, bd_addr, BD_ADDR_LEN);
   1430 
   1431         p_msg->conn_int_max     = max_conn_int;
   1432         p_msg->conn_int_min     = min_conn_int;
   1433         p_msg->slave_latency    = slave_latency;
   1434         p_msg->supervision_tout = supervision_tout;
   1435 
   1436         bta_sys_sendmsg(p_msg);
   1437     }
   1438 #endif
   1439 }
   1440 
   1441 /*******************************************************************************
   1442 **
   1443 ** Function         BTA_DmSetBleConnScanParams
   1444 **
   1445 ** Description      This function is called to set scan parameters used in
   1446 **                  BLE connection request
   1447 **
   1448 ** Parameters:      scan_interval    - scan interval
   1449 **                  scan_window      - scan window
   1450 **
   1451 ** Returns          void
   1452 **
   1453 *******************************************************************************/
   1454 void BTA_DmSetBleConnScanParams(UINT16 scan_interval, UINT16 scan_window )
   1455 {
   1456 #if BLE_INCLUDED == TRUE
   1457     tBTA_DM_API_BLE_SCAN_PARAMS    *p_msg;
   1458 
   1459     if ((p_msg = (tBTA_DM_API_BLE_SCAN_PARAMS *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_SCAN_PARAMS))) != NULL)
   1460     {
   1461         memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_SCAN_PARAMS));
   1462 
   1463         p_msg->hdr.event = BTA_DM_API_BLE_SCAN_PARAM_EVT;
   1464 
   1465         p_msg->scan_int         = scan_interval;
   1466         p_msg->scan_window      = scan_window;
   1467 
   1468         bta_sys_sendmsg(p_msg);
   1469     }
   1470 #endif
   1471 }
   1472 
   1473 /*******************************************************************************
   1474 **
   1475 ** Function         BTA_DmSetBleAdvParams
   1476 **
   1477 ** Description      This function sets the advertising parameters BLE functionality.
   1478 **                  It is to be called when device act in peripheral or broadcaster
   1479 **                  role.
   1480 **
   1481 **
   1482 ** Returns          void
   1483 **
   1484 *******************************************************************************/
   1485 void BTA_DmSetBleAdvParams (UINT16 adv_int_min, UINT16 adv_int_max,
   1486                            tBLE_BD_ADDR *p_dir_bda)
   1487 {
   1488 #if BLE_INCLUDED == TRUE
   1489     tBTA_DM_API_BLE_ADV_PARAMS    *p_msg;
   1490 
   1491     APPL_TRACE_API ("BTA_DmSetBleAdvParam: %d, %d", adv_int_min, adv_int_max);
   1492 
   1493     if ((p_msg = (tBTA_DM_API_BLE_ADV_PARAMS *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_ADV_PARAMS))) != NULL)
   1494     {
   1495         memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_ADV_PARAMS));
   1496 
   1497         p_msg->hdr.event = BTA_DM_API_BLE_ADV_PARAM_EVT;
   1498 
   1499         p_msg->adv_int_min      = adv_int_min;
   1500         p_msg->adv_int_max      = adv_int_max;
   1501 
   1502         if (p_dir_bda != NULL)
   1503         {
   1504             p_msg->p_dir_bda = (tBLE_BD_ADDR *)(p_msg + 1);
   1505             memcpy(p_msg->p_dir_bda, p_dir_bda, sizeof(tBLE_BD_ADDR));
   1506         }
   1507 
   1508         bta_sys_sendmsg(p_msg);
   1509     }
   1510 #endif
   1511 }
   1512 /*******************************************************************************
   1513 **                      BLE ADV data management API
   1514 ********************************************************************************/
   1515 
   1516 #if BLE_INCLUDED == TRUE
   1517 /*******************************************************************************
   1518 **
   1519 ** Function         BTA_DmBleSetAdvConfig
   1520 **
   1521 ** Description      This function is called to override the BTA default ADV parameters.
   1522 **
   1523 ** Parameters       data_mask: adv data mask.
   1524 **                  p_adv_cfg: Pointer to User defined ADV data structure. This
   1525 **                             memory space can not be freed until p_adv_data_cback
   1526 **                             is received.
   1527 **                  p_adv_data_cback: set adv data complete callback.
   1528 **
   1529 ** Returns          None
   1530 **
   1531 *******************************************************************************/
   1532 void BTA_DmBleSetAdvConfig (tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_adv_cfg,
   1533                             tBTA_SET_ADV_DATA_CMPL_CBACK *p_adv_data_cback)
   1534 {
   1535     tBTA_DM_API_SET_ADV_CONFIG  *p_msg;
   1536 
   1537     if ((p_msg = (tBTA_DM_API_SET_ADV_CONFIG *)
   1538         GKI_getbuf(sizeof(tBTA_DM_API_SET_ADV_CONFIG))) != NULL)
   1539     {
   1540         p_msg->hdr.event = BTA_DM_API_BLE_SET_ADV_CONFIG_EVT;
   1541         p_msg->data_mask = data_mask;
   1542         p_msg->p_adv_data_cback = p_adv_data_cback;
   1543         p_msg->p_adv_cfg = p_adv_cfg;
   1544 
   1545         bta_sys_sendmsg(p_msg);
   1546     }
   1547 }
   1548 
   1549 /*******************************************************************************
   1550 **
   1551 ** Function         BTA_DmBleSetScanRsp
   1552 **
   1553 ** Description      This function is called to override the BTA scan response.
   1554 **
   1555 ** Parameters       Pointer to User defined ADV data structure
   1556 **
   1557 ** Returns          None
   1558 **
   1559 *******************************************************************************/
   1560 BTA_API extern void BTA_DmBleSetScanRsp (tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_adv_cfg,
   1561                         tBTA_SET_ADV_DATA_CMPL_CBACK *p_adv_data_cback)
   1562 {
   1563     tBTA_DM_API_SET_ADV_CONFIG  *p_msg;
   1564 
   1565     if ((p_msg = (tBTA_DM_API_SET_ADV_CONFIG *)
   1566         GKI_getbuf(sizeof(tBTA_DM_API_SET_ADV_CONFIG))) != NULL)
   1567     {
   1568         p_msg->hdr.event = BTA_DM_API_BLE_SET_SCAN_RSP_EVT;
   1569         p_msg->data_mask = data_mask;
   1570         p_msg->p_adv_data_cback = p_adv_data_cback;
   1571         p_msg->p_adv_cfg = p_adv_cfg;
   1572 
   1573         bta_sys_sendmsg(p_msg);
   1574     }
   1575 }
   1576 
   1577 /*******************************************************************************
   1578 **
   1579 ** Function         BTA_DmBleSetStorageParams
   1580 **
   1581 ** Description      This function is called to override the BTA scan response.
   1582 **
   1583 ** Parameters       batch_scan_full_max -Max storage space (in %) allocated to full scanning
   1584 **                  batch_scan_trunc_max -Max storage space (in %) allocated to truncated scanning
   1585 **                  batch_scan_notify_threshold -Setup notification level based on total space
   1586 **                  p_setup_cback - Setup callback pointer
   1587 **                  p_thres_cback - Threshold callback pointer
   1588 **                  p_rep_cback - Reports callback pointer
   1589 **                  ref_value - Ref value
   1590 **
   1591 ** Returns          None
   1592 **
   1593 *******************************************************************************/
   1594 BTA_API extern void BTA_DmBleSetStorageParams(UINT8 batch_scan_full_max,
   1595                                          UINT8 batch_scan_trunc_max,
   1596                                          UINT8 batch_scan_notify_threshold,
   1597                                          tBTA_BLE_SCAN_SETUP_CBACK *p_setup_cback,
   1598                                          tBTA_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback,
   1599                                          tBTA_BLE_SCAN_REP_CBACK* p_rep_cback,
   1600                                          tBTA_DM_BLE_REF_VALUE ref_value)
   1601 {
   1602     tBTA_DM_API_SET_STORAGE_CONFIG  *p_msg;
   1603     bta_dm_cb.p_setup_cback = p_setup_cback;
   1604     if ((p_msg = (tBTA_DM_API_SET_STORAGE_CONFIG *)
   1605           GKI_getbuf(sizeof(tBTA_DM_API_SET_STORAGE_CONFIG))) != NULL)
   1606     {
   1607         p_msg->hdr.event = BTA_DM_API_BLE_SETUP_STORAGE_EVT;
   1608         p_msg->p_setup_cback=bta_ble_scan_setup_cb;
   1609         p_msg->p_thres_cback=p_thres_cback;
   1610         p_msg->p_read_rep_cback=p_rep_cback;
   1611         p_msg->ref_value = ref_value;
   1612         p_msg->batch_scan_full_max = batch_scan_full_max;
   1613         p_msg->batch_scan_trunc_max = batch_scan_trunc_max;
   1614         p_msg->batch_scan_notify_threshold = batch_scan_notify_threshold;
   1615         bta_sys_sendmsg(p_msg);
   1616     }
   1617 }
   1618 
   1619 /*******************************************************************************
   1620 **
   1621 ** Function         BTA_DmBleEnableBatchScan
   1622 **
   1623 ** Description      This function is called to enable the batch scan
   1624 **
   1625 ** Parameters       scan_mode -Batch scan mode
   1626 **                  scan_interval - Scan interval
   1627 **                  scan_window - Scan window
   1628 **                  discard_rule -Discard rules
   1629 **                  addr_type - Address type
   1630 **                  ref_value - Reference value
   1631 **
   1632 ** Returns          None
   1633 **
   1634 *******************************************************************************/
   1635 BTA_API extern void BTA_DmBleEnableBatchScan(tBTA_BLE_SCAN_MODE scan_mode,
   1636                                          UINT32 scan_interval, UINT32 scan_window,
   1637                                          tBTA_BLE_DISCARD_RULE discard_rule,
   1638                                          tBLE_ADDR_TYPE        addr_type,
   1639                                          tBTA_DM_BLE_REF_VALUE ref_value)
   1640 {
   1641     tBTA_DM_API_ENABLE_SCAN  *p_msg;
   1642 
   1643     if ((p_msg = (tBTA_DM_API_ENABLE_SCAN *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE_SCAN))) != NULL)
   1644     {
   1645         p_msg->hdr.event = BTA_DM_API_BLE_ENABLE_BATCH_SCAN_EVT;
   1646         p_msg->scan_mode = scan_mode;
   1647         p_msg->scan_int = scan_interval;
   1648         p_msg->scan_window = scan_window;
   1649         p_msg->discard_rule = discard_rule;
   1650         p_msg->addr_type = addr_type;
   1651         p_msg->ref_value = ref_value;
   1652         bta_sys_sendmsg(p_msg);
   1653     }
   1654 }
   1655 
   1656 /*******************************************************************************
   1657 **
   1658 ** Function         BTA_DmBleDisableBatchScan
   1659 **
   1660 ** Description      This function is called to disable the batch scan
   1661 **
   1662 ** Parameters       ref_value - Reference value
   1663 **
   1664 ** Returns          None
   1665 **
   1666 *******************************************************************************/
   1667 BTA_API extern void BTA_DmBleDisableBatchScan(tBTA_DM_BLE_REF_VALUE ref_value)
   1668 {
   1669     tBTA_DM_API_DISABLE_SCAN  *p_msg;
   1670 
   1671     if ((p_msg = (tBTA_DM_API_DISABLE_SCAN *)
   1672          GKI_getbuf(sizeof(tBTA_DM_API_DISABLE_SCAN))) != NULL)
   1673     {
   1674         p_msg->hdr.event = BTA_DM_API_BLE_DISABLE_BATCH_SCAN_EVT;
   1675         p_msg->ref_value = ref_value;
   1676         bta_sys_sendmsg(p_msg);
   1677     }
   1678 }
   1679 
   1680 /*******************************************************************************
   1681 **
   1682 ** Function         BTA_DmBleReadScanReports
   1683 **
   1684 ** Description      This function is called to read scan reports
   1685 **
   1686 ** Parameters       scan_type -Batch scan mode
   1687 **                  ref_value - Reference value
   1688 **
   1689 ** Returns          None
   1690 **
   1691 *******************************************************************************/
   1692 BTA_API extern void BTA_DmBleReadScanReports(tBTA_BLE_SCAN_MODE scan_type,
   1693                                              tBTA_DM_BLE_REF_VALUE ref_value)
   1694 {
   1695     tBTA_DM_API_READ_SCAN_REPORTS  *p_msg;
   1696 
   1697     if ((p_msg = (tBTA_DM_API_READ_SCAN_REPORTS *)
   1698           GKI_getbuf(sizeof(tBTA_DM_API_READ_SCAN_REPORTS))) != NULL)
   1699     {
   1700         p_msg->hdr.event = BTA_DM_API_BLE_READ_SCAN_REPORTS_EVT;
   1701         p_msg->scan_type = scan_type;
   1702         p_msg->ref_value = ref_value;
   1703         bta_sys_sendmsg(p_msg);
   1704     }
   1705 }
   1706 
   1707 /*******************************************************************************
   1708 **
   1709 ** Function         BTA_DmBleTrackAdvertiser
   1710 **
   1711 ** Description      This function is called to track advertiser
   1712 **
   1713 ** Parameters       ref_value - Reference value
   1714 **                  p_track_adv_cback - Track ADV callback
   1715 **
   1716 ** Returns          None
   1717 **
   1718 *******************************************************************************/
   1719 BTA_API extern void BTA_DmBleTrackAdvertiser(tBTA_DM_BLE_REF_VALUE ref_value,
   1720                             tBTA_BLE_TRACK_ADV_CBACK *p_track_adv_cback)
   1721 {
   1722     tBTA_DM_API_TRACK_ADVERTISER  *p_msg;
   1723 
   1724     if ((p_msg = (tBTA_DM_API_TRACK_ADVERTISER *)
   1725          GKI_getbuf(sizeof(tBTA_DM_API_TRACK_ADVERTISER))) != NULL)
   1726     {
   1727         p_msg->hdr.event = BTA_DM_API_BLE_TRACK_ADVERTISER_EVT;
   1728         p_msg->p_track_adv_cback = p_track_adv_cback;
   1729         p_msg->ref_value = ref_value;
   1730         bta_sys_sendmsg(p_msg);
   1731     }
   1732 }
   1733 
   1734 /*******************************************************************************
   1735 **
   1736 ** Function         BTA_DmBleBroadcast
   1737 **
   1738 ** Description      This function starts or stops LE broadcasting.
   1739 **
   1740 ** Parameters       start: start or stop broadcast.
   1741 **
   1742 ** Returns          None
   1743 **
   1744 *******************************************************************************/
   1745 BTA_API extern void BTA_DmBleBroadcast (BOOLEAN start)
   1746 {
   1747     tBTA_DM_API_BLE_OBSERVE   *p_msg;
   1748 
   1749     APPL_TRACE_API("BTA_DmBleBroadcast: start = %d ", start);
   1750 
   1751     if ((p_msg = (tBTA_DM_API_BLE_OBSERVE *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_OBSERVE))) != NULL)
   1752     {
   1753         memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_OBSERVE));
   1754 
   1755         p_msg->hdr.event = BTA_DM_API_BLE_BROADCAST_EVT;
   1756         p_msg->start = start;
   1757 
   1758         bta_sys_sendmsg(p_msg);
   1759     }
   1760 }
   1761 
   1762 #endif
   1763 /*******************************************************************************
   1764 **
   1765 ** Function         BTA_DmBleSetBgConnType
   1766 **
   1767 ** Description      This function is called to set BLE connectable mode for a
   1768 **                  peripheral device.
   1769 **
   1770 ** Parameters       bg_conn_type: it can be auto connection, or selective connection.
   1771 **                  p_select_cback: callback function when selective connection procedure
   1772 **                              is being used.
   1773 **
   1774 ** Returns          void
   1775 **
   1776 *******************************************************************************/
   1777 void BTA_DmBleSetBgConnType(tBTA_DM_BLE_CONN_TYPE bg_conn_type, tBTA_DM_BLE_SEL_CBACK *p_select_cback)
   1778 {
   1779 #if BLE_INCLUDED == TRUE
   1780     tBTA_DM_API_BLE_SET_BG_CONN_TYPE    *p_msg;
   1781 
   1782     if ((p_msg = (tBTA_DM_API_BLE_SET_BG_CONN_TYPE *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_SET_BG_CONN_TYPE))) != NULL)
   1783     {
   1784         memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_SET_BG_CONN_TYPE));
   1785 
   1786         p_msg->hdr.event        = BTA_DM_API_BLE_SET_BG_CONN_TYPE;
   1787         p_msg->bg_conn_type     = bg_conn_type;
   1788         p_msg->p_select_cback   = p_select_cback;
   1789 
   1790         bta_sys_sendmsg(p_msg);
   1791     }
   1792 #endif
   1793 }
   1794 
   1795 /*******************************************************************************
   1796 **
   1797 ** Function         bta_dm_discover_send_msg
   1798 **
   1799 ** Description      This function send discover message to BTA task.
   1800 **
   1801 ** Returns          void
   1802 **
   1803 *******************************************************************************/
   1804 static void bta_dm_discover_send_msg(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services,
   1805                     tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search,
   1806                     tBTA_TRANSPORT transport)
   1807 {
   1808     tBTA_DM_API_DISCOVER    *p_msg;
   1809     UINT16  len = p_services ? (sizeof(tBTA_DM_API_DISCOVER) +
   1810                                 sizeof(tBT_UUID) * p_services->num_uuid) :
   1811                                 sizeof(tBTA_DM_API_DISCOVER);
   1812 
   1813     if ((p_msg = (tBTA_DM_API_DISCOVER *) GKI_getbuf(len)) != NULL)
   1814     {
   1815         memset(p_msg, 0, len);
   1816 
   1817         p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT;
   1818         bdcpy(p_msg->bd_addr, bd_addr);
   1819         p_msg->p_cback = p_cback;
   1820         p_msg->sdp_search = sdp_search;
   1821         p_msg->transport    = transport;
   1822 
   1823         if (p_services != NULL)
   1824         {
   1825 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
   1826             p_msg->services = p_services->srvc_mask;
   1827             p_msg->num_uuid = p_services->num_uuid;
   1828             if (p_services->num_uuid != 0)
   1829             {
   1830                 p_msg->p_uuid = (tBT_UUID *)(p_msg + 1);
   1831                 memcpy(p_msg->p_uuid, p_services->p_uuid, sizeof(tBT_UUID) * p_services->num_uuid);
   1832             }
   1833 #endif
   1834         }
   1835 
   1836         bta_sys_sendmsg(p_msg);
   1837     }
   1838 }
   1839 
   1840 /*******************************************************************************
   1841 **
   1842 ** Function         BTA_DmDiscoverByTransport
   1843 **
   1844 ** Description      This function does service discovery on particular transport
   1845 **                  for services of a
   1846 **                  peer device. When services.num_uuid is 0, it indicates all
   1847 **                  GATT based services are to be searched; otherwise a list of
   1848 **                  UUID of interested services should be provided through
   1849 **                  p_services->p_uuid.
   1850 **
   1851 ** Parameters       bd_addr: Bluetooth address of remote device
   1852 **                  p_services :bit mask of the list of services to be discovered
   1853 **                  p_cback : Callback on which result will be received
   1854 **                  sdp_search: if TRUE SDP search will be initiated, else services present in
   1855 **                                     EIR structure of remote device will be returned.
   1856 **                  transport : Physical transport BR/EDR or LE
   1857 ** Returns          void
   1858 **
   1859 *******************************************************************************/
   1860 
   1861 void BTA_DmDiscoverByTransport(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services,
   1862                     tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search,
   1863                     tBTA_TRANSPORT transport)
   1864 {
   1865     bta_dm_discover_send_msg(bd_addr, p_services, p_cback, sdp_search, transport);
   1866 }
   1867 
   1868 
   1869 /*******************************************************************************
   1870 **
   1871 ** Function         BTA_DmDiscoverExt
   1872 **
   1873 ** Description      This function does service discovery for services of a
   1874 **                  peer device. When services.num_uuid is 0, it indicates all
   1875 **                  GATT based services are to be searched; other wise a list of
   1876 **                  UUID of interested services should be provided through
   1877 **                  p_services->p_uuid.
   1878 **
   1879 ** Parameters       bd_addr: Bluetooth address of remote device
   1880 **                  p_services :bit mask of the list of services to be discovered
   1881 **                  p_cback : Callback on which result will be received
   1882 **                  sdp_search: if TRUE SDP search will be initiated, else services present in
   1883 **                                     EIR structure of remote device will be returned.
   1884 **
   1885 ** Returns          void
   1886 **
   1887 *******************************************************************************/
   1888 void BTA_DmDiscoverExt(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services,
   1889                     tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search)
   1890 {
   1891     bta_dm_discover_send_msg(bd_addr, p_services, p_cback, sdp_search, BTA_TRANSPORT_UNKNOWN);
   1892 
   1893 }
   1894 
   1895 /*******************************************************************************
   1896 **
   1897 ** Function         BTA_DmSearchExt
   1898 **
   1899 ** Description      This function searches for peer Bluetooth devices. It performs
   1900 **                  an inquiry and gets the remote name for devices. Service
   1901 **                  discovery is done if services is non zero
   1902 **
   1903 ** Parameters       p_dm_inq: inquiry conditions
   1904 **                  p_services: if service is not empty, service discovery will be done.
   1905 **                            for all GATT based service condition, put num_uuid, and
   1906 **                            p_uuid is the pointer to the list of UUID values.
   1907 **                  p_cback: callback functino when search is completed.
   1908 **
   1909 **
   1910 **
   1911 ** Returns          void
   1912 **
   1913 *******************************************************************************/
   1914 void BTA_DmSearchExt(tBTA_DM_INQ *p_dm_inq, tBTA_SERVICE_MASK_EXT *p_services, tBTA_DM_SEARCH_CBACK *p_cback)
   1915 {
   1916 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
   1917     tBTA_DM_API_SEARCH    *p_msg;
   1918     UINT16  len = p_services ? (sizeof(tBTA_DM_API_SEARCH) + sizeof(tBT_UUID) * p_services->num_uuid) :
   1919                     sizeof(tBTA_DM_API_SEARCH);
   1920 
   1921     if ((p_msg = (tBTA_DM_API_SEARCH *) GKI_getbuf(len)) != NULL)
   1922     {
   1923         memset(p_msg, 0, len);
   1924 
   1925         p_msg->hdr.event = BTA_DM_API_SEARCH_EVT;
   1926         memcpy(&p_msg->inq_params, p_dm_inq, sizeof(tBTA_DM_INQ));
   1927         p_msg->p_cback = p_cback;
   1928         p_msg->rs_res  = BTA_DM_RS_NONE;
   1929 
   1930 
   1931         if (p_services != NULL)
   1932         {
   1933             p_msg->services = p_services->srvc_mask;
   1934             p_msg->num_uuid = p_services->num_uuid;
   1935 
   1936             if (p_services->num_uuid != 0)
   1937             {
   1938                 p_msg->p_uuid = (tBT_UUID *)(p_msg + 1);
   1939                 memcpy(p_msg->p_uuid, p_services->p_uuid, sizeof(tBT_UUID) * p_services->num_uuid);
   1940             }
   1941             else
   1942                 p_msg->p_uuid = NULL;
   1943         }
   1944 
   1945         bta_sys_sendmsg(p_msg);
   1946     }
   1947 #else
   1948     UNUSED(p_dm_inq);
   1949     UNUSED(p_services);
   1950     UNUSED(p_cback);
   1951 #endif
   1952 }
   1953 
   1954 /*******************************************************************************
   1955 **
   1956 ** Function         BTA_DmBleEnableRemotePrivacy
   1957 **
   1958 ** Description      Enable/disable privacy on a remote device
   1959 **
   1960 ** Parameters:      bd_addr          - BD address of the peer
   1961 **                  privacy_enable   - enable/disabe privacy on remote device.
   1962 **
   1963 ** Returns          void
   1964 **
   1965 *******************************************************************************/
   1966 void BTA_DmBleEnableRemotePrivacy(BD_ADDR bd_addr, BOOLEAN privacy_enable)
   1967 {
   1968     UNUSED(bd_addr);
   1969     UNUSED(privacy_enable);
   1970 }
   1971 
   1972 
   1973 /*******************************************************************************
   1974 **
   1975 ** Function         BTA_DmBleConfigLocalPrivacy
   1976 **
   1977 ** Description      Enable/disable privacy on the local device
   1978 **
   1979 ** Parameters:      privacy_enable   - enable/disabe privacy on remote device.
   1980 **
   1981 ** Returns          void
   1982 **
   1983 *******************************************************************************/
   1984 void BTA_DmBleConfigLocalPrivacy(BOOLEAN privacy_enable)
   1985 {
   1986 #if BLE_INCLUDED == TRUE && BLE_PRIVACY_SPT == TRUE
   1987     tBTA_DM_API_LOCAL_PRIVACY *p_msg;
   1988 
   1989     if ((p_msg = (tBTA_DM_API_LOCAL_PRIVACY *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE_PRIVACY))) != NULL)
   1990     {
   1991         memset (p_msg, 0, sizeof(tBTA_DM_API_LOCAL_PRIVACY));
   1992 
   1993         p_msg->hdr.event = BTA_DM_API_LOCAL_PRIVACY_EVT;
   1994         p_msg->privacy_enable   = privacy_enable;
   1995 
   1996         bta_sys_sendmsg(p_msg);
   1997     }
   1998 #else
   1999     UNUSED (privacy_enable);
   2000 #endif
   2001 }
   2002 
   2003 #if BLE_INCLUDED == TRUE
   2004 /*******************************************************************************
   2005 **
   2006 ** Function         BTA_BleEnableAdvInstance
   2007 **
   2008 ** Description      This function enable a Multi-ADV instance with the specififed
   2009 **                  adv parameters
   2010 **
   2011 ** Parameters       p_params: pointer to the adv parameter structure.
   2012 **                  p_cback: callback function associated to this adv instance.
   2013 **                  p_ref: reference data pointer to this adv instance.
   2014 **
   2015 ** Returns          BTA_SUCCESS if command started sucessfully; otherwise failure.
   2016 **
   2017 *******************************************************************************/
   2018 void BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params,
   2019                                 tBTA_BLE_MULTI_ADV_CBACK *p_cback,
   2020                                 void *p_ref)
   2021 {
   2022     tBTA_DM_API_BLE_MULTI_ADV_ENB    *p_msg;
   2023     UINT16 len = sizeof(tBTA_BLE_ADV_PARAMS) + sizeof(tBTA_DM_API_BLE_MULTI_ADV_ENB);
   2024 
   2025     APPL_TRACE_API ("BTA_BleEnableAdvInstance");
   2026 
   2027     if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_ENB *) GKI_getbuf(len)) != NULL)
   2028     {
   2029         memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_ENB));
   2030 
   2031         p_msg->hdr.event     = BTA_DM_API_BLE_MULTI_ADV_ENB_EVT;
   2032         p_msg->p_cback      = (void *)p_cback;
   2033         if (p_params != NULL)
   2034         {
   2035             p_msg->p_params =  (void *)(p_msg + 1);
   2036             memcpy(p_msg->p_params, p_params, sizeof(tBTA_BLE_ADV_PARAMS));
   2037         }
   2038         p_msg->p_ref        = p_ref;
   2039 
   2040         bta_sys_sendmsg(p_msg);
   2041     }
   2042 }
   2043 
   2044 /*******************************************************************************
   2045 **
   2046 ** Function         BTA_BleUpdateAdvInstParam
   2047 **
   2048 ** Description      This function update a Multi-ADV instance with the specififed
   2049 **                  adv parameters.
   2050 **
   2051 ** Parameters       inst_id: Adv instance to update the parameter.
   2052 **                  p_params: pointer to the adv parameter structure.
   2053 **
   2054 ** Returns          BTA_SUCCESS if command started sucessfully; otherwise failure.
   2055 **
   2056 *******************************************************************************/
   2057 void BTA_BleUpdateAdvInstParam (UINT8 inst_id, tBTA_BLE_ADV_PARAMS *p_params)
   2058 {
   2059     tBTA_DM_API_BLE_MULTI_ADV_PARAM    *p_msg;
   2060     UINT16      len = sizeof(tBTA_BLE_ADV_PARAMS) + sizeof(tBTA_DM_API_BLE_MULTI_ADV_PARAM);
   2061 
   2062     APPL_TRACE_API ("BTA_BleUpdateAdvInstParam");
   2063      if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_PARAM *) GKI_getbuf(len)) != NULL)
   2064      {
   2065           memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_PARAM));
   2066           p_msg->hdr.event     = BTA_DM_API_BLE_MULTI_ADV_PARAM_UPD_EVT;
   2067           p_msg->inst_id        = inst_id;
   2068           p_msg->p_params =  (void *)(p_msg + 1);
   2069           memcpy(p_msg->p_params, p_params, sizeof(tBTA_BLE_ADV_PARAMS));
   2070 
   2071           bta_sys_sendmsg(p_msg);
   2072     }
   2073 }
   2074 
   2075 /*******************************************************************************
   2076 **
   2077 ** Function         BTA_BleCfgAdvInstData
   2078 **
   2079 ** Description      This function configure a Multi-ADV instance with the specififed
   2080 **                  adv data or scan response data.
   2081 **
   2082 ** Parameter        inst_id: Adv instance to configure the adv data or scan response.
   2083 **                  is_scan_rsp: is the data scan response or adv data.
   2084 **                  data_mask: adv data type as bit mask.
   2085 **                  p_data: pointer to the ADV data structure tBTA_BLE_ADV_DATA. This
   2086 **                  memory space can not be freed until BTA_BLE_MULTI_ADV_DATA_EVT
   2087 **                  is sent to application.
   2088 **
   2089 ** Returns          BTA_SUCCESS if command started sucessfully; otherwise failure.
   2090 **
   2091 *******************************************************************************/
   2092 void BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
   2093                             tBTA_BLE_AD_MASK data_mask,
   2094                             tBTA_BLE_ADV_DATA *p_data)
   2095 {
   2096     tBTA_DM_API_BLE_MULTI_ADV_DATA    *p_msg;
   2097     UINT16      len =  sizeof(tBTA_DM_API_BLE_MULTI_ADV_DATA) ;
   2098 
   2099     APPL_TRACE_API ("BTA_BleCfgAdvInstData");
   2100 
   2101     if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_DATA *) GKI_getbuf(len)) != NULL)
   2102     {
   2103           memset(p_msg, 0, len);
   2104           p_msg->hdr.event     = BTA_DM_API_BLE_MULTI_ADV_DATA_EVT;
   2105           p_msg->inst_id      = inst_id;
   2106           p_msg->is_scan_rsp  = is_scan_rsp;
   2107           p_msg->data_mask     = data_mask;
   2108           p_msg->p_data        = p_data;
   2109 
   2110           bta_sys_sendmsg(p_msg);
   2111     }
   2112 }
   2113 
   2114 /*******************************************************************************
   2115 **
   2116 ** Function         BTA_BleDisableAdvInstance
   2117 **
   2118 ** Description      This function disable a Multi-ADV instance.
   2119 **
   2120 ** Parameter        inst_id: instance ID to disable.
   2121 **
   2122 ** Returns          BTA_SUCCESS if command started sucessfully; otherwise failure.
   2123 **
   2124 *******************************************************************************/
   2125 void BTA_BleDisableAdvInstance (UINT8  inst_id)
   2126 {
   2127     tBTA_DM_API_BLE_MULTI_ADV_DISABLE    *p_msg;
   2128 
   2129     APPL_TRACE_API ("BTA_BleDisableAdvInstance: %d", inst_id);
   2130     if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_DISABLE *)
   2131           GKI_getbuf(sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE))) != NULL)
   2132     {
   2133          memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE));
   2134          p_msg->hdr.event    = BTA_DM_API_BLE_MULTI_ADV_DISABLE_EVT;
   2135          p_msg->inst_id      = inst_id;
   2136          bta_sys_sendmsg(p_msg);
   2137     }
   2138 }
   2139 
   2140 /*******************************************************************************
   2141 **
   2142 ** Function         BTA_DmBleCfgFilterCondition
   2143 **
   2144 ** Description      This function is called to configure the adv data payload filter
   2145 **                  condition.
   2146 **
   2147 ** Parameters       action: to read/write/clear
   2148 **                  cond_type: filter condition type
   2149 **                  filt_index - Filter index
   2150 **                  p_cond: filter condition parameter
   2151 **                  p_cmpl_back - Command completed callback
   2152 **                  ref_value - Reference value
   2153 **
   2154 ** Returns          void
   2155 **
   2156 *******************************************************************************/
   2157 void BTA_DmBleCfgFilterCondition(tBTA_DM_BLE_SCAN_COND_OP action,
   2158                                  tBTA_DM_BLE_PF_COND_TYPE cond_type,
   2159                                  tBTA_DM_BLE_PF_FILT_INDEX filt_index,
   2160                                  tBTA_DM_BLE_PF_COND_PARAM *p_cond,
   2161                                  tBTA_DM_BLE_PF_CFG_CBACK *p_cmpl_cback,
   2162                                  tBTA_DM_BLE_REF_VALUE ref_value)
   2163 {
   2164 #if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
   2165     tBTA_DM_API_CFG_FILTER_COND *p_msg;
   2166     APPL_TRACE_API ("BTA_DmBleCfgFilterCondition: %d, %d", action, cond_type);
   2167 
   2168     UINT16  len = sizeof(tBTA_DM_API_CFG_FILTER_COND) +
   2169                   sizeof(tBTA_DM_BLE_PF_COND_PARAM);
   2170     UINT8 *p;
   2171 
   2172     if (NULL != p_cond)
   2173     {
   2174         switch(cond_type)
   2175         {
   2176             case BTA_DM_BLE_PF_SRVC_DATA_PATTERN:
   2177             case BTA_DM_BLE_PF_MANU_DATA:
   2178                 /* Length of pattern and pattern mask and other elements in */
   2179                 /* tBTA_DM_BLE_PF_MANU_COND */
   2180                 len += ((p_cond->manu_data.data_len) * 2) +
   2181                         sizeof(UINT16) + sizeof(UINT16) + sizeof(UINT8);
   2182                 break;
   2183 
   2184             case BTA_DM_BLE_PF_LOCAL_NAME:
   2185                 len += ((p_cond->local_name.data_len) + sizeof(UINT8));
   2186                 break;
   2187 
   2188             case BTM_BLE_PF_SRVC_UUID:
   2189             case BTM_BLE_PF_SRVC_SOL_UUID:
   2190                 len += sizeof(tBLE_BD_ADDR) + sizeof(tBTA_DM_BLE_PF_COND_MASK);
   2191                 break;
   2192 
   2193             default:
   2194                 break;
   2195         }
   2196     }
   2197 
   2198     if ((p_msg = (tBTA_DM_API_CFG_FILTER_COND *) GKI_getbuf(len)) != NULL)
   2199     {
   2200         memset (p_msg, 0, len);
   2201         p_msg->hdr.event        = BTA_DM_API_CFG_FILTER_COND_EVT;
   2202         p_msg->action           = action;
   2203         p_msg->cond_type        = cond_type;
   2204         p_msg->filt_index       = filt_index;
   2205         p_msg->p_filt_cfg_cback = p_cmpl_cback;
   2206         p_msg->ref_value        = ref_value;
   2207 
   2208         if (p_cond)
   2209         {
   2210             p_msg->p_cond_param = (tBTA_DM_BLE_PF_COND_PARAM *)(p_msg + 1);
   2211             memcpy(p_msg->p_cond_param, p_cond, sizeof(tBTA_DM_BLE_PF_COND_PARAM));
   2212 
   2213             p = (UINT8 *)(p_msg->p_cond_param + 1);
   2214 
   2215             if (cond_type == BTA_DM_BLE_PF_SRVC_DATA_PATTERN ||
   2216                 cond_type == BTA_DM_BLE_PF_MANU_DATA)
   2217             {
   2218                 p_msg->p_cond_param->manu_data.p_pattern = p;
   2219                 p_msg->p_cond_param->manu_data.data_len = p_cond->manu_data.data_len;
   2220                 memcpy(p_msg->p_cond_param->manu_data.p_pattern, p_cond->manu_data.p_pattern,
   2221                     p_cond->manu_data.data_len);
   2222                 p += p_cond->manu_data.data_len;
   2223 
   2224                 if (cond_type == BTA_DM_BLE_PF_MANU_DATA)
   2225                 {
   2226                     p_msg->p_cond_param->manu_data.company_id_mask =
   2227                         p_cond->manu_data.company_id_mask;
   2228                     if ( p_cond->manu_data.p_pattern_mask != NULL)
   2229                     {
   2230                         p_msg->p_cond_param->manu_data.p_pattern_mask = p;
   2231                         memcpy(p_msg->p_cond_param->manu_data.p_pattern_mask,
   2232                             p_cond->manu_data.p_pattern_mask, p_cond->manu_data.data_len);
   2233                     }
   2234                 }
   2235             }
   2236             else if (cond_type == BTA_DM_BLE_PF_LOCAL_NAME)
   2237             {
   2238                 p_msg->p_cond_param->local_name.p_data = p;
   2239                 p_msg->p_cond_param->local_name.data_len =
   2240                     p_cond->local_name.data_len;
   2241                 memcpy(p_msg->p_cond_param->local_name.p_data,
   2242                     p_cond->local_name.p_data, p_cond->local_name.data_len);
   2243             }
   2244             else if ((cond_type == BTM_BLE_PF_SRVC_UUID
   2245                 || cond_type == BTM_BLE_PF_SRVC_SOL_UUID))
   2246             {
   2247                 if (p_cond->srvc_uuid.p_target_addr != NULL)
   2248                 {
   2249                     p_msg->p_cond_param->srvc_uuid.p_target_addr = (tBLE_BD_ADDR *)(p);
   2250                     p_msg->p_cond_param->srvc_uuid.p_target_addr->type =
   2251                         p_cond->srvc_uuid.p_target_addr->type;
   2252                     memcpy(p_msg->p_cond_param->srvc_uuid.p_target_addr->bda,
   2253                         p_cond->srvc_uuid.p_target_addr->bda, BD_ADDR_LEN);
   2254                     p = (UINT8*)( p_msg->p_cond_param->srvc_uuid.p_target_addr + 1);
   2255                 }
   2256                 if (p_cond->srvc_uuid.p_uuid_mask)
   2257                 {
   2258                     p_msg->p_cond_param->srvc_uuid.p_uuid_mask = (tBTA_DM_BLE_PF_COND_MASK *)p;
   2259                     memcpy(p_msg->p_cond_param->srvc_uuid.p_uuid_mask,
   2260                         p_cond->srvc_uuid.p_uuid_mask, sizeof(tBTA_DM_BLE_PF_COND_MASK));
   2261                 }
   2262             }
   2263         }
   2264 
   2265         bta_sys_sendmsg(p_msg);
   2266     }
   2267 #else
   2268     UNUSED(action);
   2269     UNUSED(cond_type);
   2270     UNUSED(filt_index);
   2271     UNUSED(p_cond);
   2272     UNUSED(p_cmpl_cback);
   2273     UNUSED(ref_value);
   2274 #endif
   2275 }
   2276 
   2277 /*******************************************************************************
   2278 **
   2279 ** Function         BTA_DmBleScanFilterSetup
   2280 **
   2281 ** Description      This function is called to setup the adv data payload filter param
   2282 **
   2283 ** Parameters       p_target: enable the filter condition on a target device; if NULL
   2284 **                  filt_index - Filter index
   2285 **                  p_filt_params -Filter parameters
   2286 **                  ref_value - Reference value
   2287 **                  action - Add, delete or clear
   2288 **                  p_cmpl_back - Command completed callback
   2289 **
   2290 ** Returns          void
   2291 **
   2292 *******************************************************************************/
   2293 void BTA_DmBleScanFilterSetup(UINT8 action, tBTA_DM_BLE_PF_FILT_INDEX filt_index,
   2294                                     tBTA_DM_BLE_PF_FILT_PARAMS *p_filt_params,
   2295                                     tBLE_BD_ADDR *p_target,
   2296                                     tBTA_DM_BLE_PF_PARAM_CBACK *p_cmpl_cback,
   2297                                     tBTA_DM_BLE_REF_VALUE ref_value)
   2298 {
   2299 #if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
   2300     tBTA_DM_API_SCAN_FILTER_PARAM_SETUP *p_msg;
   2301     APPL_TRACE_API ("BTA_DmBleScanFilterSetup: %d", action);
   2302 
   2303     UINT16  len = sizeof(tBTA_DM_API_SCAN_FILTER_PARAM_SETUP) + sizeof(tBLE_BD_ADDR);
   2304 
   2305     if ((p_msg = (tBTA_DM_API_SCAN_FILTER_PARAM_SETUP *) GKI_getbuf(len)) != NULL)
   2306     {
   2307         memset (p_msg, 0, len);
   2308 
   2309         p_msg->hdr.event        = BTA_DM_API_SCAN_FILTER_SETUP_EVT;
   2310         p_msg->action       = action;
   2311         p_msg->filt_index = filt_index;
   2312         p_msg->p_filt_params = p_filt_params;
   2313         p_msg->p_filt_param_cback = p_cmpl_cback;
   2314         p_msg->ref_value        = ref_value;
   2315 
   2316         if (p_target)
   2317         {
   2318             p_msg->p_target = (tBLE_BD_ADDR *)(p_msg + 1);
   2319             memcpy(p_msg->p_target, p_target, sizeof(tBLE_BD_ADDR));
   2320         }
   2321 
   2322         bta_sys_sendmsg(p_msg);
   2323     }
   2324 #else
   2325     UNUSED(action);
   2326     UNUSED(filt_index);
   2327     UNUSED(p_filt_params);
   2328     UNUSED(p_target);
   2329     UNUSED(p_cmpl_cback);
   2330     UNUSED(ref_value);
   2331 #endif
   2332 }
   2333 
   2334 /*******************************************************************************
   2335 **
   2336 ** Function         BTA_DmBleGetEnergyInfo
   2337 **
   2338 ** Description      This function is called to obtain the energy info
   2339 **
   2340 ** Parameters       p_cmpl_cback - Command complete callback
   2341 **
   2342 ** Returns          void
   2343 **
   2344 *******************************************************************************/
   2345 void BTA_DmBleGetEnergyInfo(tBTA_BLE_ENERGY_INFO_CBACK *p_cmpl_cback)
   2346 {
   2347     tBTA_DM_API_ENERGY_INFO *p_msg;
   2348     APPL_TRACE_API ("BTA_DmBleGetEnergyInfo");
   2349 
   2350     UINT16  len = sizeof(tBTA_DM_API_ENERGY_INFO) + sizeof(tBLE_BD_ADDR);
   2351 
   2352     if ((p_msg = (tBTA_DM_API_ENERGY_INFO *) GKI_getbuf(len)) != NULL)
   2353     {
   2354         memset (p_msg, 0, len);
   2355         p_msg->hdr.event        = BTA_DM_API_BLE_ENERGY_INFO_EVT;
   2356         p_msg->p_energy_info_cback = p_cmpl_cback;
   2357         bta_sys_sendmsg(p_msg);
   2358     }
   2359 }
   2360 
   2361 /*******************************************************************************
   2362 **
   2363 ** Function         BTA_DmEnableScanFilter
   2364 **
   2365 ** Description      This function is called to enable the adv data payload filter
   2366 **
   2367 ** Parameters       action - enable or disable the APCF feature
   2368 **                  p_cmpl_cback - Command completed callback
   2369 **                  ref_value - Reference value
   2370 **
   2371 ** Returns          void
   2372 **
   2373 *******************************************************************************/
   2374 void BTA_DmEnableScanFilter(UINT8 action, tBTA_DM_BLE_PF_STATUS_CBACK *p_cmpl_cback,
   2375                                     tBTA_DM_BLE_REF_VALUE ref_value)
   2376 {
   2377 #if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
   2378     tBTA_DM_API_ENABLE_SCAN_FILTER *p_msg;
   2379     APPL_TRACE_API ("BTA_DmEnableScanFilter: %d", action);
   2380 
   2381     UINT16  len = sizeof(tBTA_DM_API_ENABLE_SCAN_FILTER) + sizeof(tBLE_BD_ADDR);
   2382 
   2383     if ((p_msg = (tBTA_DM_API_ENABLE_SCAN_FILTER *) GKI_getbuf(len)) != NULL)
   2384     {
   2385         memset (p_msg, 0, len);
   2386 
   2387         p_msg->hdr.event        = BTA_DM_API_SCAN_FILTER_ENABLE_EVT;
   2388         p_msg->action       = action;
   2389         p_msg->ref_value    = ref_value;
   2390         p_msg->p_filt_status_cback = p_cmpl_cback;
   2391 
   2392         bta_sys_sendmsg(p_msg);
   2393     }
   2394 #else
   2395     UNUSED(action);
   2396     UNUSED(p_cmpl_cback);
   2397     UNUSED(ref_value);
   2398 #endif
   2399 }
   2400 
   2401 /*******************************************************************************
   2402 **
   2403 ** Function         BTA_DmBleUpdateConnectionParams
   2404 **
   2405 ** Description      Update connection parameters, can only be used when connection is up.
   2406 **
   2407 ** Parameters:      bd_addr   - BD address of the peer
   2408 **                  min_int   -     minimum connection interval, [0x0004~ 0x4000]
   2409 **                  max_int   -     maximum connection interval, [0x0004~ 0x4000]
   2410 **                  latency   -     slave latency [0 ~ 500]
   2411 **                  timeout   -     supervision timeout [0x000a ~ 0xc80]
   2412 **
   2413 ** Returns          void
   2414 **
   2415 *******************************************************************************/
   2416 void BTA_DmBleUpdateConnectionParams(BD_ADDR bd_addr, UINT16 min_int, UINT16 max_int,
   2417                                     UINT16 latency, UINT16 timeout)
   2418 {
   2419     tBTA_DM_API_UPDATE_CONN_PARAM *p_msg;
   2420 
   2421     if ((p_msg = (tBTA_DM_API_UPDATE_CONN_PARAM *) GKI_getbuf(sizeof(tBTA_DM_API_UPDATE_CONN_PARAM))) != NULL)
   2422     {
   2423         memset (p_msg, 0, sizeof(tBTA_DM_API_UPDATE_CONN_PARAM));
   2424 
   2425         p_msg->hdr.event = BTA_DM_API_UPDATE_CONN_PARAM_EVT;
   2426         bdcpy(p_msg->bd_addr, bd_addr);
   2427         p_msg->min_int   = min_int;
   2428         p_msg->max_int   = max_int;
   2429         p_msg->latency   = latency;
   2430         p_msg->timeout   = timeout;
   2431 
   2432         bta_sys_sendmsg(p_msg);
   2433     }
   2434 }
   2435 #endif
   2436 
   2437 /*******************************************************************************
   2438 **
   2439 ** Function         BTA_DmSetEncryption
   2440 **
   2441 ** Description      This function is called to ensure that connection is
   2442 **                  encrypted.  Should be called only on an open connection.
   2443 **                  Typically only needed for connections that first want to
   2444 **                  bring up unencrypted links, then later encrypt them.
   2445 **
   2446 ** Parameters:      bd_addr       - Address of the peer device
   2447 **                  transport     - transport of the link to be encruypted
   2448 **                  p_callback    - Pointer to callback function to indicat the
   2449 **                                  link encryption status
   2450 **                  sec_act       - This is the security action to indicate
   2451 **                                  what knid of BLE security level is required for
   2452 **                                  the BLE link if the BLE is supported
   2453 **                                  Note: This parameter is ignored for the BR/EDR link
   2454 **                                        or the BLE is not supported
   2455 **
   2456 ** Returns          void
   2457 **
   2458 *******************************************************************************/
   2459 void BTA_DmSetEncryption(BD_ADDR bd_addr, tBTA_TRANSPORT transport, tBTA_DM_ENCRYPT_CBACK *p_callback,
   2460                             tBTA_DM_BLE_SEC_ACT sec_act)
   2461 {
   2462     tBTA_DM_API_SET_ENCRYPTION   *p_msg;
   2463 
   2464     APPL_TRACE_API("BTA_DmSetEncryption"); //todo
   2465     if ((p_msg = (tBTA_DM_API_SET_ENCRYPTION *) GKI_getbuf(sizeof(tBTA_DM_API_SET_ENCRYPTION))) != NULL)
   2466     {
   2467         memset(p_msg, 0, sizeof(tBTA_DM_API_SET_ENCRYPTION));
   2468 
   2469         p_msg->hdr.event = BTA_DM_API_SET_ENCRYPTION_EVT;
   2470 
   2471         memcpy(p_msg->bd_addr, bd_addr, BD_ADDR_LEN);
   2472         p_msg->transport    = transport;
   2473         p_msg->p_callback      = p_callback;
   2474         p_msg->sec_act         = sec_act;
   2475 
   2476         bta_sys_sendmsg(p_msg);
   2477     }
   2478 }
   2479 
   2480 /*******************************************************************************
   2481 **
   2482 ** Function         BTA_DmCloseACL
   2483 **
   2484 ** Description      This function force to close an ACL connection and remove the
   2485 **                  device from the security database list of known devices.
   2486 **
   2487 ** Parameters:      bd_addr       - Address of the peer device
   2488 **                  remove_dev    - remove device or not after link down
   2489 **
   2490 ** Returns          void
   2491 **
   2492 *******************************************************************************/
   2493 void BTA_DmCloseACL(BD_ADDR bd_addr, BOOLEAN remove_dev, tBTA_TRANSPORT transport)
   2494 {
   2495     tBTA_DM_API_REMOVE_ACL   *p_msg;
   2496 
   2497     APPL_TRACE_API("BTA_DmCloseACL");
   2498 
   2499     if ((p_msg = (tBTA_DM_API_REMOVE_ACL *) GKI_getbuf(sizeof(tBTA_DM_API_REMOVE_ACL))) != NULL)
   2500     {
   2501         memset(p_msg, 0, sizeof(tBTA_DM_API_REMOVE_ACL));
   2502 
   2503         p_msg->hdr.event = BTA_DM_API_REMOVE_ACL_EVT;
   2504 
   2505         memcpy(p_msg->bd_addr, bd_addr, BD_ADDR_LEN);
   2506         p_msg->remove_dev      = remove_dev;
   2507         p_msg->transport       = transport;
   2508 
   2509         bta_sys_sendmsg(p_msg);
   2510     }
   2511 }
   2512 
   2513 #if BLE_INCLUDED == TRUE
   2514 /*******************************************************************************
   2515 **
   2516 ** Function         BTA_DmBleObserve
   2517 **
   2518 ** Description      This procedure keep the device listening for advertising
   2519 **                  events from a broadcast device.
   2520 **
   2521 ** Parameters       start: start or stop observe.
   2522 **
   2523 ** Returns          void
   2524 
   2525 **
   2526 ** Returns          void.
   2527 **
   2528 *******************************************************************************/
   2529 BTA_API extern void BTA_DmBleObserve(BOOLEAN start, UINT8 duration,
   2530                                      tBTA_DM_SEARCH_CBACK *p_results_cb)
   2531 {
   2532     tBTA_DM_API_BLE_OBSERVE   *p_msg;
   2533 
   2534     APPL_TRACE_API("BTA_DmBleObserve:start = %d ", start);
   2535 
   2536     if ((p_msg = (tBTA_DM_API_BLE_OBSERVE *) GKI_getbuf(sizeof(tBTA_DM_API_BLE_OBSERVE))) != NULL)
   2537     {
   2538         memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_OBSERVE));
   2539 
   2540         p_msg->hdr.event = BTA_DM_API_BLE_OBSERVE_EVT;
   2541         p_msg->start = start;
   2542         p_msg->duration = duration;
   2543         p_msg->p_cback = p_results_cb;
   2544 
   2545         bta_sys_sendmsg(p_msg);
   2546     }
   2547 }
   2548 
   2549 /*******************************************************************************
   2550 **
   2551 ** Function         BTA_VendorInit
   2552 **
   2553 ** Description      This function initializes vendor specific
   2554 **
   2555 ** Returns          void
   2556 **
   2557 *******************************************************************************/
   2558 void BTA_VendorInit (void)
   2559 {
   2560     APPL_TRACE_API("BTA_VendorInit");
   2561 }
   2562 
   2563 /*******************************************************************************
   2564 **
   2565 ** Function         BTA_VendorCleanup
   2566 **
   2567 ** Description      This function frees up Broadcom specific VS specific dynamic memory
   2568 **
   2569 ** Returns          void
   2570 **
   2571 *******************************************************************************/
   2572 void BTA_VendorCleanup (void)
   2573 {
   2574     tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
   2575     BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
   2576 
   2577 #if (BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE)
   2578     if (cmn_ble_vsc_cb.max_filter > 0)
   2579     {
   2580         btm_ble_adv_filter_cleanup();
   2581         btm_ble_vendor_cleanup();
   2582     }
   2583 
   2584     if (cmn_ble_vsc_cb.tot_scan_results_strg > 0)
   2585         btm_ble_batchscan_cleanup();
   2586 #endif
   2587 
   2588    if(cmn_ble_vsc_cb.adv_inst_max > 0)
   2589       btm_ble_multi_adv_cleanup();
   2590 }
   2591 
   2592 #endif
   2593