Home | History | Annotate | Download | only in dm
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2003-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  This file contains the action functions for device manager state
     22  *  machine.
     23  *
     24  ******************************************************************************/
     25 
     26 #include "bt_types.h"
     27 #include "gki.h"
     28 #include "bd.h"
     29 #include "bta_sys.h"
     30 #include "bta_api.h"
     31 #include "bta_dm_int.h"
     32 #include "bta_dm_co.h"
     33 #include "btm_api.h"
     34 #include "btm_int.h"
     35 #include "btu.h"
     36 #include "sdp_api.h"
     37 #include "l2c_api.h"
     38 #include "wbt_api.h"
     39 #include "utl.h"
     40 #include <string.h>
     41 
     42 static void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir);
     43 static void bta_dm_inq_cmpl_cb (void * p_result);
     44 static void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, BD_NAME bd_name);
     45 static void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name);
     46 static void bta_dm_find_services ( BD_ADDR bd_addr);
     47 static void bta_dm_discover_next_device(void);
     48 static void bta_dm_sdp_callback (UINT16 sdp_status);
     49 static UINT8 bta_dm_authorize_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, UINT8 *service_name, UINT8 service_id, BOOLEAN is_originator);
     50 static UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name);
     51 static UINT8 bta_dm_link_key_request_cback (BD_ADDR bd_addr, LINK_KEY key);
     52 static UINT8 bta_dm_new_link_key_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, LINK_KEY key, UINT8 key_type);
     53 static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,BD_NAME bd_name, int result);
     54 static void bta_dm_local_name_cback(BD_ADDR bd_addr);
     55 static BOOLEAN bta_dm_check_av(UINT16 event);
     56 #if (BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
     57 static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data);
     58 #else
     59 static void bta_dm_acl_change_cback (BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn, UINT8 *features, BOOLEAN is_new);
     60 #endif
     61 static void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr);
     62 
     63 /* Extended Inquiry Response */
     64 static UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data);
     65 
     66 #if (BTM_EIR_SERVER_INCLUDED == TRUE)
     67 static void bta_dm_set_eir (char *local_name);
     68 #endif /* BTM_EIR_SERVER_INCLUDED */
     69 
     70 #if (BTM_EIR_CLIENT_INCLUDED == TRUE)
     71 static void bta_dm_eir_search_services( tBTM_INQ_RESULTS  *p_result,
     72                                         tBTA_SERVICE_MASK *p_services_to_search,
     73                                         tBTA_SERVICE_MASK *p_services_found);
     74 #endif /* BTM_EIR_CLIENT_INCLUDED */
     75 
     76 static void bta_dm_rssi_cback (tBTM_RSSI_RESULTS *p_result);
     77 static void bta_dm_signal_strength_timer_cback (TIMER_LIST_ENT *p_tle);
     78 static void bta_dm_link_quality_cback (tBTM_LINK_QUALITY_RESULTS *p_result);
     79 static void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle);
     80 static void bta_dm_disable_timer_cback (TIMER_LIST_ENT *p_tle);
     81 static void bta_dm_disable_conn_down_timer_cback (TIMER_LIST_ENT *p_tle);
     82 static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr);
     83 static void bta_dm_adjust_roles(BOOLEAN delay_role_switch);
     84 static char *bta_dm_get_remname(void);
     85 static void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result);
     86 
     87 static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr);
     88 static void bta_dm_discover_device(BD_ADDR remote_bd_addr);
     89 
     90 static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status );
     91 
     92 static BOOLEAN bta_dm_dev_blacklisted_for_switch (BD_ADDR remote_bd_addr);
     93 static void bta_dm_delay_role_switch_cback (TIMER_LIST_ENT *p_tle);
     94 
     95 static void bta_dm_disable_search_and_disc(void);
     96 #if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
     97     #if ((defined SMP_INCLUDED) && (SMP_INCLUDED == TRUE))
     98 static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DATA *p_data);
     99     #endif
    100 static void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key);
    101     #if ((defined BTA_GATT_INCLUDED) &&  (BTA_GATT_INCLUDED == TRUE))
    102 static void bta_dm_gattc_register(void);
    103 static void btm_dm_start_gatt_discovery ( BD_ADDR bd_addr);
    104 static void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr);
    105 static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data);
    106     #endif
    107 static void bta_dm_observe_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir);
    108 static void bta_dm_observe_cmpl_cb (void * p_result);
    109 
    110 #ifndef BTA_DM_BLE_ADV_CHNL_MAP
    111 #define BTA_DM_BLE_ADV_CHNL_MAP (BTM_BLE_ADV_CHNL_37|BTM_BLE_ADV_CHNL_38|BTM_BLE_ADV_CHNL_39)
    112 #endif
    113 #endif
    114 static void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr);
    115 
    116 extern void sdpu_uuid16_to_uuid128(UINT16 uuid16, UINT8* p_uuid128);
    117 
    118 const UINT16 bta_service_id_to_uuid_lkup_tbl [BTA_MAX_SERVICE_ID] =
    119 {
    120     UUID_SERVCLASS_PNP_INFORMATION,         /* Reserved */
    121     UUID_SERVCLASS_SERIAL_PORT,             /* BTA_SPP_SERVICE_ID */
    122     UUID_SERVCLASS_DIALUP_NETWORKING,       /* BTA_DUN_SERVICE_ID */
    123     UUID_SERVCLASS_AUDIO_SOURCE,            /* BTA_A2DP_SOURCE_SERVICE_ID */
    124     UUID_SERVCLASS_LAN_ACCESS_USING_PPP,    /* BTA_LAP_SERVICE_ID */
    125     UUID_SERVCLASS_HEADSET,                 /* BTA_HSP_HS_SERVICE_ID */
    126     UUID_SERVCLASS_HF_HANDSFREE,            /* BTA_HFP_HS_SERVICE_ID */
    127     UUID_SERVCLASS_OBEX_OBJECT_PUSH,        /* BTA_OPP_SERVICE_ID */
    128     UUID_SERVCLASS_OBEX_FILE_TRANSFER,      /* BTA_FTP_SERVICE_ID */
    129     UUID_SERVCLASS_CORDLESS_TELEPHONY,      /* BTA_CTP_SERVICE_ID */
    130     UUID_SERVCLASS_INTERCOM,                /* BTA_ICP_SERVICE_ID */
    131     UUID_SERVCLASS_IRMC_SYNC,               /* BTA_SYNC_SERVICE_ID */
    132     UUID_SERVCLASS_DIRECT_PRINTING,         /* BTA_BPP_SERVICE_ID */
    133     UUID_SERVCLASS_IMAGING_RESPONDER,       /* BTA_BIP_SERVICE_ID */
    134     UUID_SERVCLASS_PANU,                    /* BTA_PANU_SERVICE_ID */
    135     UUID_SERVCLASS_NAP,                     /* BTA_NAP_SERVICE_ID */
    136     UUID_SERVCLASS_GN,                      /* BTA_GN_SERVICE_ID */
    137     UUID_SERVCLASS_SAP,                     /* BTA_SAP_SERVICE_ID */
    138     UUID_SERVCLASS_AUDIO_SINK,              /* BTA_A2DP_SERVICE_ID */
    139     UUID_SERVCLASS_AV_REMOTE_CONTROL,       /* BTA_AVRCP_SERVICE_ID */
    140     UUID_SERVCLASS_HUMAN_INTERFACE,         /* BTA_HID_SERVICE_ID */
    141     UUID_SERVCLASS_VIDEO_SINK,              /* BTA_VDP_SERVICE_ID */
    142     UUID_SERVCLASS_PBAP_PSE,                /* BTA_PBAP_SERVICE_ID */
    143     UUID_SERVCLASS_HEADSET_AUDIO_GATEWAY,   /* BTA_HSP_SERVICE_ID */
    144     UUID_SERVCLASS_AG_HANDSFREE,            /* BTA_HFP_SERVICE_ID */
    145     UUID_SERVCLASS_MESSAGE_ACCESS,          /* BTA_MAP_SERVICE_ID */
    146     UUID_SERVCLASS_MESSAGE_NOTIFICATION,    /* BTA_MN_SERVICE_ID */
    147     UUID_SERVCLASS_HDP_PROFILE,             /* BTA_HDP_SERVICE_ID */
    148     UUID_SERVCLASS_PBAP_PCE                 /* BTA_PCE_SERVICE_ID */
    149 #if BLE_INCLUDED && BTA_GATT_INCLUDED
    150     ,UUID_PROTOCOL_ATT                       /* BTA_GATT_SERVICE_ID */
    151 #endif
    152 };
    153 
    154 /*
    155  * NOTE : The number of element in bta_service_id_to_btm_srv_id_lkup_tbl should be matching with
    156  *        the value BTA_MAX_SERVICE_ID in bta_api.h
    157  *
    158  *        i.e., If you add new Service ID for BTA, the correct security ID of the new service
    159  *              from Security service definitions (btm_api.h) should be added to this lookup table.
    160  */
    161 const UINT32 bta_service_id_to_btm_srv_id_lkup_tbl [BTA_MAX_SERVICE_ID] =
    162 {
    163     0,                                      /* Reserved */
    164     BTM_SEC_SERVICE_SERIAL_PORT,            /* BTA_SPP_SERVICE_ID */
    165     BTM_SEC_SERVICE_DUN,                    /* BTA_DUN_SERVICE_ID */
    166     BTM_SEC_SERVICE_AVDTP,                  /* BTA_AUDIO_SOURCE_SERVICE_ID */
    167     BTM_SEC_SERVICE_LAN_ACCESS,             /* BTA_LAP_SERVICE_ID */
    168     BTM_SEC_SERVICE_HEADSET_AG,             /* BTA_HSP_SERVICE_ID */
    169     BTM_SEC_SERVICE_AG_HANDSFREE,           /* BTA_HFP_SERVICE_ID */
    170     BTM_SEC_SERVICE_OBEX,                   /* BTA_OPP_SERVICE_ID */
    171     BTM_SEC_SERVICE_OBEX_FTP,               /* BTA_FTP_SERVICE_ID */
    172     BTM_SEC_SERVICE_CORDLESS,               /* BTA_CTP_SERVICE_ID */
    173     BTM_SEC_SERVICE_INTERCOM,               /* BTA_ICP_SERVICE_ID */
    174     BTM_SEC_SERVICE_IRMC_SYNC,              /* BTA_SYNC_SERVICE_ID */
    175     BTM_SEC_SERVICE_BPP_JOB,                /* BTA_BPP_SERVICE_ID */
    176     BTM_SEC_SERVICE_BIP,                    /* BTA_BIP_SERVICE_ID */
    177     BTM_SEC_SERVICE_BNEP_PANU,              /* BTA_PANU_SERVICE_ID */
    178     BTM_SEC_SERVICE_BNEP_NAP,               /* BTA_NAP_SERVICE_ID */
    179     BTM_SEC_SERVICE_BNEP_GN,                /* BTA_GN_SERVICE_ID */
    180     BTM_SEC_SERVICE_SAP,                    /* BTA_SAP_SERVICE_ID */
    181     BTM_SEC_SERVICE_AVDTP,                  /* BTA_A2DP_SERVICE_ID */
    182     BTM_SEC_SERVICE_AVCTP,                  /* BTA_AVRCP_SERVICE_ID */
    183     BTM_SEC_SERVICE_HIDH_SEC_CTRL,          /* BTA_HID_SERVICE_ID */
    184     BTM_SEC_SERVICE_AVDTP,                  /* BTA_VDP_SERVICE_ID */
    185     BTM_SEC_SERVICE_PBAP,                   /* BTA_PBAP_SERVICE_ID */
    186     BTM_SEC_SERVICE_HEADSET,                /* BTA_HSP_HS_SERVICE_ID */
    187     BTM_SEC_SERVICE_HF_HANDSFREE,           /* BTA_HFP_HS_SERVICE_ID */
    188     BTM_SEC_SERVICE_MAP,                    /* BTA_MAP_SERVICE_ID */
    189     BTM_SEC_SERVICE_MAP,                    /* BTA_MN_SERVICE_ID */
    190     BTM_SEC_SERVICE_HDP_SNK,                /* BTA_HDP_SERVICE_ID */
    191     BTM_SEC_SERVICE_PBAP                    /* BTA_PCE_SERVICE_ID */
    192 #if BLE_INCLUDED && BTA_GATT_INCLUDED
    193     ,BTM_SEC_SERVICE_ATT                    /* BTA_GATT_SERVICE_ID */
    194 #endif
    195 
    196 };
    197 
    198 /* bta security callback */
    199 const tBTM_APPL_INFO bta_security =
    200 {
    201     &bta_dm_authorize_cback,
    202     &bta_dm_pin_cback,
    203     &bta_dm_new_link_key_cback,
    204     &bta_dm_link_key_request_cback,
    205     &bta_dm_authentication_complete_cback,
    206     NULL,
    207     &bta_dm_bond_cancel_complete_cback,
    208 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
    209     &bta_dm_sp_cback
    210 #else
    211     NULL
    212 #endif
    213 #if BLE_INCLUDED == TRUE
    214 #if SMP_INCLUDED == TRUE
    215     ,&bta_dm_ble_smp_cback
    216 #endif
    217     ,&bta_dm_ble_id_key_cback
    218 #endif
    219 
    220 };
    221 
    222 /* TBD... To be moved to some conf file..? */
    223 #define BTA_DM_MAX_ROLE_SWITCH_BLACKLIST_COUNT   5
    224 const tBTA_DM_LMP_VER_INFO bta_role_switch_blacklist[BTA_DM_MAX_ROLE_SWITCH_BLACKLIST_COUNT] =
    225 {
    226         {0x000F,0x2000,0x04},
    227         {0x00,0x00,0x00},
    228         {0x00,0x00,0x00},
    229         {0x00,0x00,0x00},
    230         {0x00,0x00,0x00}
    231 };
    232 
    233 #define MAX_DISC_RAW_DATA_BUF       (4096)
    234 UINT8 g_disc_raw_data_buf[MAX_DISC_RAW_DATA_BUF];
    235 
    236 /*******************************************************************************
    237 **
    238 ** Function         bta_dm_app_ready_timer_cback
    239 **
    240 ** Description      allow sending EIR to controller
    241 **
    242 **
    243 ** Returns          void
    244 **
    245 *******************************************************************************/
    246 #if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&(BTA_EIR_CANNED_UUID_LIST != TRUE)
    247 static void bta_dm_app_ready_timer_cback (TIMER_LIST_ENT *p_tle)
    248 {
    249     bta_dm_set_eir (NULL);
    250 }
    251 #else
    252 #define bta_dm_app_ready_timer_cback (x)
    253 #endif
    254 
    255 /*******************************************************************************
    256 **
    257 ** Function         bta_dm_enable
    258 **
    259 ** Description      Initialises the BT device manager
    260 **
    261 **
    262 ** Returns          void
    263 **
    264 *******************************************************************************/
    265 void bta_dm_enable(tBTA_DM_MSG *p_data)
    266 {
    267     tBTA_SYS_HW_MSG *sys_enable_event;
    268     tBTA_DM_SEC sec_event;
    269 
    270     /* if already in use, return an error */
    271     if( bta_dm_cb.is_bta_dm_active == TRUE  )
    272     {
    273         APPL_TRACE_WARNING0("bta_dm_enable - device already started by another application");
    274         memset(&sec_event.enable, 0, sizeof ( tBTA_DM_ENABLE ));
    275         sec_event.enable.status = BTA_FAILURE;
    276         if( p_data->enable.p_sec_cback != NULL  )
    277             p_data->enable.p_sec_cback (BTA_DM_ENABLE_EVT, &sec_event);
    278         return;
    279     }
    280 
    281     /* first, register our callback to SYS HW manager */
    282     bta_sys_hw_register( BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback );
    283 
    284     /* make sure security callback is saved - if no callback, do not erase the previous one,
    285     it could be an error recovery mechanism */
    286     if( p_data->enable.p_sec_cback != NULL  )
    287     bta_dm_cb.p_sec_cback = p_data->enable.p_sec_cback;
    288     /* notify BTA DM is now active */
    289     bta_dm_cb.is_bta_dm_active = TRUE;
    290 
    291     /* send a message to BTA SYS */
    292     if ((sys_enable_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL)
    293     {
    294         sys_enable_event->hdr.event = BTA_SYS_API_ENABLE_EVT;
    295         sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH;
    296 
    297         bta_sys_sendmsg(sys_enable_event);
    298 
    299     }
    300 
    301 
    302 
    303 }
    304 
    305 
    306 
    307 /*******************************************************************************
    308 **
    309 ** Function         bta_dm_sys_hw_cback
    310 **
    311 ** Description     callback register to SYS to get HW status updates
    312 **
    313 **
    314 ** Returns          void
    315 **
    316 *******************************************************************************/
    317 static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status )
    318 {
    319     DEV_CLASS   dev_class;
    320     tBTA_DM_SEC_CBACK           *temp_cback;
    321 #if BLE_INCLUDED == TRUE
    322     UINT8                   key_mask = 0;
    323     BT_OCTET16              er;
    324     tBTA_BLE_LOCAL_ID_KEYS  id_key;
    325     tBT_UUID                app_uuid = {LEN_UUID_128,{0}};
    326 #endif
    327     APPL_TRACE_DEBUG1(" bta_dm_sys_hw_cback with event: %i" , status );
    328 
    329     /* On H/W error evt, report to the registered DM application callback */
    330     if (status == BTA_SYS_HW_ERROR_EVT) {
    331           if( bta_dm_cb.p_sec_cback != NULL )
    332                 bta_dm_cb.p_sec_cback(BTA_DM_HW_ERROR_EVT, NULL);
    333           return;
    334     }
    335     if( status == BTA_SYS_HW_OFF_EVT )
    336     {
    337         if( bta_dm_cb.p_sec_cback != NULL )
    338             bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL);
    339 
    340         /* reinitialize the control block */
    341         memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
    342 
    343         /* unregister from SYS */
    344         bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH );
    345         /* notify BTA DM is now unactive */
    346         bta_dm_cb.is_bta_dm_active = FALSE;
    347     }
    348     else
    349     if( status == BTA_SYS_HW_ON_EVT )
    350     {
    351         /* FIXME: We should not unregister as the SYS shall invoke this callback on a H/W error.
    352         * We need to revisit when this platform has more than one BLuetooth H/W chip */
    353         //bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH);
    354 
    355         /* save security callback */
    356         temp_cback = bta_dm_cb.p_sec_cback;
    357         /* make sure the control block is properly initialized */
    358         memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
    359         /* and retrieve the callback */
    360         bta_dm_cb.p_sec_cback=temp_cback;
    361         bta_dm_cb.is_bta_dm_active = TRUE;
    362 
    363         /* hw is ready, go on with BTA DM initialization */
    364         memset(&bta_dm_search_cb, 0x00, sizeof(bta_dm_search_cb));
    365         memset(&bta_dm_conn_srvcs, 0x00, sizeof(bta_dm_conn_srvcs));
    366         memset(&bta_dm_di_cb, 0, sizeof(tBTA_DM_DI_CB));
    367 
    368         memcpy(dev_class, bta_dm_cfg.dev_class, sizeof(dev_class));
    369         BTM_SetDeviceClass (dev_class);
    370 
    371 #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
    372         /* load BLE local information: ID keys, ER if available */
    373         bta_dm_co_ble_load_local_keys(&key_mask, er, &id_key);
    374 
    375         if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ER)
    376         {
    377             BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ER, (tBTM_BLE_LOCAL_KEYS *)&er);
    378         }
    379         if (key_mask & BTA_BLE_LOCAL_KEY_TYPE_ID)
    380         {
    381             BTM_BleLoadLocalKeys(BTA_BLE_LOCAL_KEY_TYPE_ID, (tBTM_BLE_LOCAL_KEYS *)&id_key);
    382         }
    383         bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID;
    384 #endif
    385 
    386         BTM_SecRegister((tBTM_APPL_INFO*)&bta_security);
    387         BTM_SetDefaultLinkSuperTout(bta_dm_cfg.link_timeout);
    388         BTM_WritePageTimeout(bta_dm_cfg.page_timeout);
    389         bta_dm_cb.cur_policy = bta_dm_cfg.policy_settings;
    390         BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
    391 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
    392         BTM_RegBusyLevelNotif (bta_dm_bl_change_cback, NULL, BTM_BL_UPDATE_MASK|BTM_BL_ROLE_CHG_MASK);
    393 #else
    394         BTM_AclRegisterForChanges(bta_dm_acl_change_cback);
    395 #endif
    396         /* Earlier, we used to invoke BTM_ReadLocalAddr which was just copying the bd_addr
    397            from the control block and invoking the callback which was sending the DM_ENABLE_EVT.
    398            But then we have a few HCI commands being invoked above which were still in progress
    399            when the ENABLE_EVT was sent. So modified this to fetch the local name which forces
    400            the DM_ENABLE_EVT to be sent only after all the init steps are complete */
    401         BTM_ReadLocalDeviceNameFromController((tBTM_CMPL_CB *)bta_dm_local_name_cback);
    402 
    403         bta_sys_rm_register((tBTA_SYS_CONN_CBACK*)bta_dm_rm_cback);
    404 
    405         /* initialize bluetooth low power manager */
    406         bta_dm_init_pm();
    407 
    408         bta_sys_policy_register((tBTA_SYS_CONN_CBACK*)bta_dm_policy_cback);
    409 
    410 
    411         // BLUEDROID REMOVE ??
    412 #if 0
    413 #if 1
    414         /* Create broadcom primary DI record */
    415         if(WBT_ExtCreateRecord())
    416         {
    417 #if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE )
    418             /* while app_ready_timer is running, BTA DM doesn't send EIR to controller */
    419             bta_dm_cb.app_ready_timer.p_cback = (TIMER_CBACK*)&bta_dm_app_ready_timer_cback;
    420             bta_sys_start_timer(&bta_dm_cb.app_ready_timer, 0, 100);
    421 
    422             bta_sys_add_uuid(UUID_SERVCLASS_PNP_INFORMATION);
    423 #endif
    424             bta_dm_di_cb.di_handle[bta_dm_di_cb.di_num] = 0;    /* primary DI record */
    425             bta_dm_di_cb.di_num ++;
    426         }
    427 #else   /* Eventually implement pin code */
    428         if (WBT_ExtCreateRecord())
    429             WBT_ExtAddPinCode();
    430 #endif
    431 #endif
    432 #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
    433         memset (&app_uuid.uu.uuid128, 0x87, LEN_UUID_128);
    434         bta_dm_gattc_register();
    435 #endif
    436 
    437     }
    438     else
    439         APPL_TRACE_DEBUG0(" --- ignored event");
    440 
    441 }
    442 
    443 
    444 /*******************************************************************************
    445 **
    446 ** Function         bta_dm_disable
    447 **
    448 ** Description      Disables the BT device manager
    449 **
    450 **
    451 ** Returns          void
    452 **
    453 *******************************************************************************/
    454 void bta_dm_disable (tBTA_DM_MSG *p_data)
    455 {
    456     /* Set l2cap idle timeout to 0 (so BTE immediately disconnects ACL link after last channel is closed) */
    457     L2CA_SetIdleTimeoutByBdAddr((UINT8 *)BT_BD_ANY, 0);
    458 
    459     /* disable all active subsystems */
    460     bta_sys_disable(BTA_SYS_HW_BLUETOOTH);
    461 
    462     BTM_SetDiscoverability(BTM_NON_DISCOVERABLE, 0, 0);
    463     BTM_SetConnectability(BTM_NON_CONNECTABLE, 0, 0);
    464 
    465     bta_dm_disable_pm();
    466     bta_dm_disable_search_and_disc();
    467     bta_dm_cb.disabling = TRUE;
    468 
    469 
    470     if(BTM_GetNumAclLinks()==0)
    471     {
    472 #if (defined(BTA_DISABLE_DELAY) && BTA_DISABLE_DELAY > 0)
    473         /* If BTA_DISABLE_DELAY is defined and greater than zero, then delay the shutdown by
    474          * BTA_DISABLE_DELAY milliseconds
    475          */
    476         APPL_TRACE_WARNING2("%s BTA_DISABLE_DELAY set to %d ms",
    477                             __FUNCTION__, BTA_DISABLE_DELAY);
    478         bta_sys_stop_timer(&bta_dm_cb.disable_timer);
    479         bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_conn_down_timer_cback;
    480         bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, BTA_DISABLE_DELAY);
    481 #else
    482         bta_dm_disable_conn_down_timer_cback(NULL);
    483 #endif
    484     }
    485     else
    486     {
    487         bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_timer_cback;
    488         bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 5000);
    489     }
    490 
    491 }
    492 
    493 /*******************************************************************************
    494 **
    495 ** Function         bta_dm_disable_timer_cback
    496 **
    497 ** Description      Called if the disable timer expires
    498 **                  Used to close ACL connections which are still active
    499 **
    500 **
    501 **
    502 ** Returns          void
    503 **
    504 *******************************************************************************/
    505 static void bta_dm_disable_timer_cback (TIMER_LIST_ENT *p_tle)
    506 {
    507 
    508     UINT8 i;
    509 
    510     APPL_TRACE_EVENT0(" bta_dm_disable_timer_cback  ");
    511 
    512     if(BTM_GetNumAclLinks())
    513     {
    514         for(i=0; i<bta_dm_cb.device_list.count; i++)
    515         {
    516             btm_remove_acl(bta_dm_cb.device_list.peer_device[i].peer_bdaddr);
    517 
    518         }
    519 
    520     }
    521     else
    522     {
    523         bta_dm_cb.disabling = FALSE;
    524 
    525         bta_sys_remove_uuid(UUID_SERVCLASS_PNP_INFORMATION);
    526         bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL);
    527     }
    528 }
    529 
    530 
    531 
    532 
    533 /*******************************************************************************
    534 **
    535 ** Function         bta_dm_set_dev_name
    536 **
    537 ** Description      Sets local device name
    538 **
    539 **
    540 ** Returns          void
    541 **
    542 *******************************************************************************/
    543 void bta_dm_set_dev_name (tBTA_DM_MSG *p_data)
    544 {
    545 
    546     BTM_SetLocalDeviceName((char*)p_data->set_name.name);
    547 #if (BTM_EIR_SERVER_INCLUDED == TRUE)
    548     bta_dm_set_eir ((char*)p_data->set_name.name);
    549 #endif
    550 }
    551 
    552 /*******************************************************************************
    553 **
    554 ** Function         bta_dm_set_visibility
    555 **
    556 ** Description      Sets discoverability, connectability and pairability
    557 **
    558 **
    559 ** Returns          void
    560 **
    561 *******************************************************************************/
    562 void bta_dm_set_visibility (tBTA_DM_MSG *p_data)
    563 {
    564 
    565 
    566     /* set modes for Discoverability and connectability if not ignore */
    567     if (p_data->set_visibility.disc_mode != BTA_DM_IGNORE)
    568         BTM_SetDiscoverability((UINT8)p_data->set_visibility.disc_mode,
    569                                 bta_dm_cb.inquiry_scan_window,
    570                                 bta_dm_cb.inquiry_scan_interval);
    571 
    572     if (p_data->set_visibility.conn_mode != BTA_DM_IGNORE)
    573         BTM_SetConnectability((UINT8)p_data->set_visibility.conn_mode,
    574                                 bta_dm_cb.page_scan_window,
    575                                 bta_dm_cb.page_scan_interval);
    576 
    577     /* Send False or True if not ignore */
    578     if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE )
    579     {
    580 
    581         if (p_data->set_visibility.pair_mode == BTA_DM_NON_PAIRABLE)
    582             bta_dm_cb.disable_pair_mode = TRUE;
    583         else
    584             bta_dm_cb.disable_pair_mode = FALSE;
    585 
    586     }
    587 
    588     /* Send False or True if not ignore */
    589     if (p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE)
    590     {
    591 
    592         if (p_data->set_visibility.conn_paired_only == BTA_DM_CONN_ALL)
    593             bta_dm_cb.conn_paired_only = FALSE;
    594         else
    595             bta_dm_cb.conn_paired_only = TRUE;
    596 
    597     }
    598 
    599     /* Change mode if either mode is not ignore */
    600     if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE || p_data->set_visibility.conn_paired_only != BTA_DM_IGNORE)
    601         BTM_SetPairableMode((BOOLEAN)(!(bta_dm_cb.disable_pair_mode)),bta_dm_cb.conn_paired_only);
    602 
    603 }
    604 
    605 
    606 /*******************************************************************************
    607 **
    608 ** Function         bta_dm_set_afhchannels
    609 **
    610 ** Description      This function sets the AFH first and
    611 **                  last disable channel, so channels within
    612 **                  that range are disabled.
    613 **
    614 **
    615 ** Returns          void
    616 **
    617 *******************************************************************************/
    618 void bta_dm_set_afhchannels (tBTA_DM_MSG *p_data)
    619 {
    620     BTM_SetAfhChannels(p_data->set_afhchannels.first,p_data->set_afhchannels.last);
    621 
    622 }
    623 
    624 
    625 /*******************************************************************************
    626 **
    627 ** Function         bta_dm_vendor_spec_command
    628 **
    629 ** Description      Send a vendor specific command to the controller
    630 **
    631 **
    632 ** Returns          void
    633 **
    634 *******************************************************************************/
    635 void bta_dm_vendor_spec_command (tBTA_DM_MSG *p_data)
    636 {
    637     tBTM_STATUS status;
    638 
    639     status = BTM_VendorSpecificCommand(p_data->vendor_command.opcode,p_data->vendor_command.param_len,p_data->vendor_command.p_param_buf, p_data->vendor_command.p_cback);
    640 
    641 }
    642 
    643 
    644 /*******************************************************************************
    645 **
    646 ** Function         bta_dm_tx_inqpower
    647 **
    648 ** Description      write inquiry tx power.
    649 **
    650 **
    651 ** Returns          void
    652 **
    653 *******************************************************************************/
    654 void bta_dm_tx_inqpower(tBTA_DM_MSG *p_data)
    655 {
    656     if (BTM_WriteInquiryTxPower (p_data->tx_inq_pwr.tx_power) == BTM_ILLEGAL_VALUE)
    657     {
    658         APPL_TRACE_ERROR1("Invalid Inquiry Tx Power: %d", p_data->tx_inq_pwr.tx_power);
    659     }
    660     return;
    661 }
    662 
    663 /*******************************************************************************
    664 **
    665 ** Function         bta_dm_remove_device
    666 **
    667 ** Description      Removes device, Disconnects ACL link if required.
    668 ****
    669 *******************************************************************************/
    670 void bta_dm_remove_device (tBTA_DM_MSG *p_data)
    671 {
    672     tBTA_DM_API_REMOVE_DEVICE *p_dev = &p_data->remove_dev;
    673     int i;
    674     tBTA_DM_SEC sec_event;
    675 
    676 #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
    677     /* need to remove all pending background connection before unpair */
    678     BTA_GATTC_CancelOpen(0, p_dev->bd_addr, FALSE);
    679 #endif
    680 
    681     if (BTM_IsAclConnectionUp(p_dev->bd_addr))
    682     {
    683         /* Take the link down first, and mark the device for removal when disconnected */
    684         btm_remove_acl( p_dev->bd_addr) ;
    685 
    686         for(i=0; i<bta_dm_cb.device_list.count; i++)
    687         {
    688             if(!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_dev->bd_addr))
    689             break;
    690         }
    691 
    692         if(i < bta_dm_cb.device_list.count)
    693         {
    694             bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_UNPAIRING;
    695         }
    696     }
    697     else    /* Ok to remove the device in application layer */
    698     {
    699         BTM_SecDeleteDevice(p_dev->bd_addr);
    700 #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
    701         /* remove all cached GATT information */
    702         BTA_GATTC_Refresh(p_dev->bd_addr);
    703 #endif
    704 
    705         if( bta_dm_cb.p_sec_cback )
    706         {
    707             bdcpy(sec_event.link_down.bd_addr, p_dev->bd_addr);
    708             /* No connection, set status to success (acl disc code not valid) */
    709             sec_event.link_down.status = HCI_SUCCESS;
    710             bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &sec_event);
    711         }
    712     }
    713 }
    714 
    715 /*******************************************************************************
    716 **
    717 ** Function         bta_dm_add_device
    718 **
    719 ** Description      This function adds a Link Key to an security database entry.
    720 **                  It is normally called during host startup to restore all required information
    721 **                  stored in the NVRAM.
    722 ****
    723 *******************************************************************************/
    724 void bta_dm_add_device (tBTA_DM_MSG *p_data)
    725 {
    726     tBTA_DM_API_ADD_DEVICE *p_dev = &p_data->add_dev;
    727     UINT8   *p_dc = NULL;
    728     UINT8   *p_lc = NULL;
    729     UINT32  trusted_services_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
    730     UINT8   index = 0;
    731     UINT8   btm_mask_index = 0;
    732 
    733     memset (trusted_services_mask, 0, sizeof(trusted_services_mask));
    734 
    735     /* If not all zeros, the device class has been specified */
    736     if (p_dev->dc_known)
    737         p_dc = (UINT8 *)p_dev->dc;
    738 
    739     if (p_dev->link_key_known)
    740         p_lc = (UINT8 *)p_dev->link_key;
    741 
    742     if (p_dev->is_trusted)
    743     {
    744         /* covert BTA service mask to BTM mask */
    745         while (p_dev->tm && (index < BTA_MAX_SERVICE_ID))
    746         {
    747             if (p_dev->tm & (UINT32)(1<<index))
    748             {
    749 
    750                 btm_mask_index =  bta_service_id_to_btm_srv_id_lkup_tbl[index] / BTM_SEC_ARRAY_BITS;
    751                 trusted_services_mask[btm_mask_index] |= (UINT32)(1 << (bta_service_id_to_btm_srv_id_lkup_tbl[index] - (UINT32)(btm_mask_index * 32)));
    752 
    753                 p_dev->tm &= (UINT32)(~(1<<index));
    754 
    755             }
    756             index++;
    757         }
    758     }
    759 
    760     if (!BTM_SecAddDevice (p_dev->bd_addr, p_dc, p_dev->bd_name, p_dev->features,
    761                            trusted_services_mask, p_lc, p_dev->key_type, p_dev->io_cap))
    762     {
    763         APPL_TRACE_ERROR2 ("BTA_DM: Error adding device %08x%04x",
    764                 (p_dev->bd_addr[0]<<24)+(p_dev->bd_addr[1]<<16)+(p_dev->bd_addr[2]<<8)+p_dev->bd_addr[3],
    765                 (p_dev->bd_addr[4]<<8)+p_dev->bd_addr[5]);
    766     }
    767 }
    768 
    769 /*******************************************************************************
    770 **
    771 ** Function         bta_dm_close_acl
    772 **
    773 ** Description      This function forces to close the connection to a remote device
    774 **                  and optionaly remove the device from security database if
    775 **                  required.
    776 ****
    777 *******************************************************************************/
    778 void bta_dm_close_acl(tBTA_DM_MSG *p_data)
    779 {
    780     tBTA_DM_API_REMOVE_ACL *p_remove_acl = &p_data->remove_acl;
    781     UINT8   index;
    782 
    783     APPL_TRACE_DEBUG0("bta_dm_close_acl");
    784 
    785     if (BTM_IsAclConnectionUp(p_remove_acl->bd_addr))
    786     {
    787         for (index = 0; index < bta_dm_cb.device_list.count; index ++)
    788         {
    789             if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, p_remove_acl->bd_addr))
    790                 break;
    791         }
    792         if (index != bta_dm_cb.device_list.count)
    793         {
    794             if (p_remove_acl->remove_dev)
    795                 bta_dm_cb.device_list.peer_device[index].remove_dev_pending = TRUE;
    796         }
    797         else
    798         {
    799             APPL_TRACE_ERROR0("unknown device, remove ACL failed");
    800         }
    801         /* Disconnect the ACL link */
    802         btm_remove_acl(p_remove_acl->bd_addr);
    803     }
    804     /* if to remove the device from security database ? do it now */
    805     else if (p_remove_acl->remove_dev)
    806     {
    807         if (!BTM_SecDeleteDevice(p_remove_acl->bd_addr))
    808         {
    809             APPL_TRACE_ERROR0("delete device from security database failed.");
    810         }
    811 #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
    812         /* need to remove all pending background connection if any */
    813         BTA_GATTC_CancelOpen(0, p_remove_acl->bd_addr, FALSE);
    814         /* remove all cached GATT information */
    815         BTA_GATTC_Refresh(p_remove_acl->bd_addr);
    816 #endif
    817     }
    818     /* otherwise, no action needed */
    819 
    820 }
    821 /*******************************************************************************
    822 **
    823 ** Function         bta_dm_bond
    824 **
    825 ** Description      Bonds with peer device
    826 **
    827 **
    828 ** Returns          void
    829 **
    830 *******************************************************************************/
    831 void bta_dm_bond (tBTA_DM_MSG *p_data)
    832 {
    833     tBTM_STATUS status;
    834     tBTA_DM_SEC sec_event;
    835     char        *p_name;
    836 
    837     status = BTM_SecBond ( p_data->bond.bd_addr, 0, NULL, 0 );
    838 
    839     if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED))
    840     {
    841 
    842         p_name = BTM_SecReadDevName(p_data->bond.bd_addr);
    843         if (!p_name)
    844             p_name = "";
    845 
    846         memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
    847         bdcpy(sec_event.auth_cmpl.bd_addr, p_data->bond.bd_addr);
    848         memcpy(sec_event.auth_cmpl.bd_name, p_name, (BD_NAME_LEN-1));
    849         sec_event.auth_cmpl.bd_name[BD_NAME_LEN-1] = 0;
    850 
    851 /*      taken care of by memset [above]
    852         sec_event.auth_cmpl.key_present = FALSE;
    853         sec_event.auth_cmpl.success = FALSE;
    854 */
    855         sec_event.auth_cmpl.fail_reason = HCI_ERR_ILLEGAL_COMMAND;
    856         if (status == BTM_SUCCESS)
    857         {
    858             sec_event.auth_cmpl.success = TRUE;
    859         }
    860         else
    861         {
    862             /* delete this device entry from Sec Dev DB */
    863             bta_dm_remove_sec_dev_entry(p_data->bond.bd_addr);
    864         }
    865         bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
    866     }
    867 
    868 }
    869 
    870 /*******************************************************************************
    871 **
    872 ** Function         bta_dm_bond_cancel
    873 **
    874 ** Description      Cancels bonding with a peer device
    875 **
    876 **
    877 ** Returns          void
    878 **
    879 *******************************************************************************/
    880 void bta_dm_bond_cancel (tBTA_DM_MSG *p_data)
    881 {
    882     tBTM_STATUS status;
    883     tBTA_DM_SEC sec_event;
    884 
    885     APPL_TRACE_EVENT0(" bta_dm_bond_cancel ");
    886     status = BTM_SecBondCancel ( p_data->bond_cancel.bd_addr );
    887 
    888     if (bta_dm_cb.p_sec_cback && (status != BTM_CMD_STARTED && status != BTM_SUCCESS))
    889     {
    890         sec_event.bond_cancel_cmpl.result = BTA_FAILURE;
    891 
    892         bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event);
    893     }
    894 
    895 }
    896 
    897 /*******************************************************************************
    898 **
    899 ** Function         bta_dm_pin_reply
    900 **
    901 ** Description      Send the pin_reply to a request from BTM
    902 **
    903 **
    904 ** Returns          void
    905 **
    906 *******************************************************************************/
    907 void bta_dm_pin_reply (tBTA_DM_MSG *p_data)
    908 {
    909     UINT32  trusted_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
    910     UINT32  * current_trusted_mask;
    911 
    912     current_trusted_mask = BTM_ReadTrustedMask(p_data->pin_reply.bd_addr);
    913 
    914     if(current_trusted_mask)
    915     {
    916         memcpy(trusted_mask, current_trusted_mask, sizeof(trusted_mask));
    917     }
    918     else
    919     {
    920         memset(trusted_mask, 0, sizeof(trusted_mask));
    921     }
    922 
    923     if(p_data->pin_reply.accept)
    924     {
    925 
    926         BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_SUCCESS, p_data->pin_reply.pin_len, p_data->pin_reply.p_pin, trusted_mask );
    927     }
    928     else
    929     {
    930         BTM_PINCodeReply(p_data->pin_reply.bd_addr, BTM_NOT_AUTHORIZED, 0, NULL, trusted_mask );
    931     }
    932 
    933 }
    934 
    935 /*******************************************************************************
    936 **
    937 ** Function         bta_dm_link_policy
    938 **
    939 ** Description      remove/set link policy mask.
    940 **                  wake the link, is sniff/park is removed
    941 **
    942 ** Returns          void
    943 **
    944 *******************************************************************************/
    945 void bta_dm_link_policy (tBTA_DM_MSG *p_data)
    946 {
    947     tBTA_DM_PEER_DEVICE *p_dev;
    948 
    949     p_dev = bta_dm_find_peer_device(p_data->link_policy.bd_addr);
    950     if(!p_dev)
    951         return;
    952 
    953     APPL_TRACE_DEBUG2(" bta_dm_link_policy set:%d, policy:0x%x",
    954         p_data->link_policy.set, p_data->link_policy.policy_mask);
    955     if(p_data->link_policy.set)
    956     {
    957         /* restore the default link policy */
    958         p_dev->link_policy |= p_data->link_policy.policy_mask;
    959         BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
    960     }
    961     else
    962     {
    963         /* clear the policy from the default link policy */
    964         p_dev->link_policy &= (~p_data->link_policy.policy_mask);
    965         BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
    966 
    967         if(p_data->link_policy.policy_mask & (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_PARK_MODE))
    968         {
    969             /* if clearing sniff/park, wake the link */
    970             bta_dm_pm_active(p_dev->peer_bdaddr);
    971         }
    972     }
    973 }
    974 
    975 /*******************************************************************************
    976 **
    977 ** Function         bta_dm_policy_cback
    978 **
    979 ** Description      process the link policy changes
    980 **
    981 ** Returns          void
    982 **
    983 *******************************************************************************/
    984 static void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
    985 {
    986     tBTA_DM_PEER_DEVICE *p_dev = NULL;
    987     UINT16  policy = app_id;
    988     UINT32  mask = (UINT32)(1 << id);
    989 
    990     if(peer_addr)
    991         p_dev = bta_dm_find_peer_device(peer_addr);
    992 
    993     APPL_TRACE_DEBUG2(" bta_dm_policy_cback cmd:%d, policy:0x%x",
    994         status, policy);
    995     switch(status)
    996     {
    997     case BTA_SYS_PLCY_SET:
    998         if(!p_dev)
    999             return;
   1000         /* restore the default link policy */
   1001         p_dev->link_policy |= policy;
   1002         BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
   1003         break;
   1004 
   1005     case BTA_SYS_PLCY_CLR:
   1006         if(!p_dev)
   1007             return;
   1008         /* clear the policy from the default link policy */
   1009         p_dev->link_policy &= (~policy);
   1010         BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
   1011 
   1012         if(policy & (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_PARK_MODE))
   1013         {
   1014             /* if clearing sniff/park, wake the link */
   1015             bta_dm_pm_active(p_dev->peer_bdaddr);
   1016         }
   1017         break;
   1018 
   1019     case BTA_SYS_PLCY_DEF_SET:
   1020         /* want to restore/set the role switch policy */
   1021         bta_dm_cb.role_policy_mask &= ~mask;
   1022         if(0 == bta_dm_cb.role_policy_mask)
   1023         {
   1024             /* if nobody wants to insist on the role */
   1025             bta_dm_cb.cur_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH;
   1026             BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
   1027         }
   1028         break;
   1029 
   1030     case BTA_SYS_PLCY_DEF_CLR:
   1031         /* want to remove the role switch policy */
   1032         bta_dm_cb.role_policy_mask |= mask;
   1033         bta_dm_cb.cur_policy &= ~HCI_ENABLE_MASTER_SLAVE_SWITCH;
   1034         BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
   1035         break;
   1036     }
   1037 }
   1038 
   1039 
   1040 /*******************************************************************************
   1041 **
   1042 ** Function         bta_dm_auth_reply
   1043 **
   1044 ** Description      Send the authorization reply to a request from BTM
   1045 **
   1046 **
   1047 ** Returns          void
   1048 **
   1049 *******************************************************************************/
   1050 void bta_dm_auth_reply (tBTA_DM_MSG *p_data)
   1051 {
   1052 
   1053     UINT32  trusted_mask[BTM_SEC_SERVICE_ARRAY_SIZE];
   1054     UINT8   btm_mask_index = 0;
   1055     UINT32  * current_trusted_mask;
   1056 
   1057     current_trusted_mask = BTM_ReadTrustedMask(p_data->auth_reply.bd_addr);
   1058 
   1059     if(current_trusted_mask)
   1060     {
   1061         memcpy(trusted_mask, current_trusted_mask, sizeof(trusted_mask));
   1062     }
   1063     else
   1064     {
   1065         memset(trusted_mask, 0, sizeof(trusted_mask));
   1066     }
   1067 
   1068     if(p_data->auth_reply.response != BTA_DM_NOT_AUTH)
   1069     {
   1070         if(p_data->auth_reply.response == BTA_DM_AUTH_PERM)
   1071         {
   1072             if(p_data->auth_reply.service < BTA_MAX_SERVICE_ID)
   1073             {
   1074                 /* convert BTA service id to BTM mask */
   1075                 btm_mask_index =  bta_service_id_to_btm_srv_id_lkup_tbl[p_data->auth_reply.service] / 32;
   1076                 trusted_mask[btm_mask_index] |= (UINT32)(1 << (bta_service_id_to_btm_srv_id_lkup_tbl[p_data->auth_reply.service] - (UINT32)(btm_mask_index * 32)));
   1077 
   1078             }
   1079         }
   1080         BTM_DeviceAuthorized (p_data->auth_reply.bd_addr, BTM_SUCCESS,trusted_mask);
   1081     }
   1082     else
   1083     {
   1084         BTM_DeviceAuthorized (p_data->auth_reply.bd_addr, BTM_NOT_AUTHORIZED,trusted_mask);
   1085     }
   1086 
   1087 }
   1088 
   1089 /*******************************************************************************
   1090 **
   1091 ** Function         bta_dm_confirm
   1092 **
   1093 ** Description      Send the user confirm request reply in response to a
   1094 **                  request from BTM
   1095 **
   1096 ** Returns          void
   1097 **
   1098 *******************************************************************************/
   1099 void bta_dm_confirm(tBTA_DM_MSG *p_data)
   1100 {
   1101     tBTM_STATUS res = BTM_NOT_AUTHORIZED;
   1102 
   1103     if(p_data->confirm.accept == TRUE)
   1104         res = BTM_SUCCESS;
   1105     BTM_ConfirmReqReply(res, p_data->confirm.bd_addr);
   1106 }
   1107 
   1108 /*******************************************************************************
   1109 **
   1110 ** Function         bta_dm_passkey_cancel
   1111 **
   1112 ** Description      Send the passkey cancel from SP initiator by sending a negative
   1113 **                  passkey request replyreply.
   1114 ** Returns          void
   1115 **
   1116 *******************************************************************************/
   1117 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
   1118 void bta_dm_passkey_cancel(tBTA_DM_MSG *p_data)
   1119 {
   1120     BTM_PasskeyReqReply(BTM_NOT_AUTHORIZED, p_data->passkey_cancel.bd_addr, 0);
   1121 }
   1122 #endif
   1123 
   1124 /*******************************************************************************
   1125 **
   1126 ** Function         bta_dm_loc_oob
   1127 **
   1128 ** Description      Retrieve the OOB data from the local LM
   1129 **
   1130 ** Returns          void
   1131 **
   1132 *******************************************************************************/
   1133 #if (BTM_OOB_INCLUDED == TRUE)
   1134 void bta_dm_loc_oob(tBTA_DM_MSG *p_data)
   1135 {
   1136     BTM_ReadLocalOobData();
   1137 }
   1138 
   1139 /*******************************************************************************
   1140 **
   1141 ** Function         bta_dm_ci_io_req_act
   1142 **
   1143 ** Description      respond to the IO capabilities request from BTM
   1144 **
   1145 ** Returns          void
   1146 **
   1147 *******************************************************************************/
   1148 void bta_dm_ci_io_req_act(tBTA_DM_MSG *p_data)
   1149 {
   1150     tBTM_AUTH_REQ   auth_req = BTM_AUTH_AP_NO;
   1151     if(p_data->ci_io_req.auth_req)
   1152         auth_req = BTM_AUTH_AP_YES;
   1153     BTM_IoCapRsp(p_data->ci_io_req.bd_addr, p_data->ci_io_req.io_cap,
   1154         p_data->ci_io_req.oob_data, auth_req);
   1155 }
   1156 
   1157 /*******************************************************************************
   1158 **
   1159 ** Function         bta_dm_ci_rmt_oob_act
   1160 **
   1161 ** Description      respond to the OOB data request for the remote device from BTM
   1162 **
   1163 **
   1164 ** Returns          void
   1165 **
   1166 *******************************************************************************/
   1167 void bta_dm_ci_rmt_oob_act(tBTA_DM_MSG *p_data)
   1168 {
   1169     tBTM_STATUS res = BTM_NOT_AUTHORIZED;
   1170 
   1171     if(p_data->ci_rmt_oob.accept == TRUE)
   1172         res = BTM_SUCCESS;
   1173     BTM_RemoteOobDataReply(res, p_data->ci_rmt_oob.bd_addr,
   1174         p_data->ci_rmt_oob.c, p_data->ci_rmt_oob.r );
   1175 }
   1176 #endif /* BTM_OOB_INCLUDED */
   1177 
   1178 /*******************************************************************************
   1179 **
   1180 ** Function         bta_dm_search_start
   1181 **
   1182 ** Description      Starts an inquiry
   1183 **
   1184 **
   1185 ** Returns          void
   1186 **
   1187 *******************************************************************************/
   1188 void bta_dm_search_start (tBTA_DM_MSG *p_data)
   1189 {
   1190     tBTM_INQUIRY_CMPL result;
   1191 
   1192 #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
   1193     UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->search.num_uuid);
   1194 #endif
   1195 
   1196     APPL_TRACE_DEBUG1("bta_dm_search_start avoid_scatter=%d", bta_dm_cfg.avoid_scatter);
   1197     if (bta_dm_cfg.avoid_scatter &&
   1198         (p_data->search.rs_res == BTA_DM_RS_NONE) && bta_dm_check_av(BTA_DM_API_SEARCH_EVT))
   1199     {
   1200         memcpy(&bta_dm_cb.search_msg, &p_data->search, sizeof(tBTA_DM_API_SEARCH));
   1201         return;
   1202     }
   1203 
   1204     BTM_ClearInqDb(NULL);
   1205     /* save search params */
   1206     bta_dm_search_cb.p_search_cback = p_data->search.p_cback;
   1207     bta_dm_search_cb.services = p_data->search.services;
   1208 
   1209 #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
   1210     utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
   1211 
   1212     if ((bta_dm_search_cb.num_uuid = p_data->search.num_uuid) != 0 &&
   1213          p_data->search.p_uuid != NULL)
   1214     {
   1215         if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL)
   1216         {
   1217             APPL_TRACE_ERROR0("bta_dm_search_start no resources");
   1218 
   1219             result.status = BTA_FAILURE;
   1220             result.num_resp = 0;
   1221             bta_dm_inq_cmpl_cb ((void *)&result);
   1222             return;
   1223         }
   1224 //        bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len);
   1225         memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->search.p_uuid, len);
   1226     }
   1227 #endif
   1228     result.status = BTM_StartInquiry(   (tBTM_INQ_PARMS*)&p_data->search.inq_params,
   1229                         bta_dm_inq_results_cb,
   1230                         (tBTM_CMPL_CB*) bta_dm_inq_cmpl_cb);
   1231 
   1232     APPL_TRACE_EVENT1("bta_dm_search_start status=%d", result.status);
   1233     if (result.status != BTM_CMD_STARTED)
   1234     {
   1235         result.num_resp = 0;
   1236         bta_dm_inq_cmpl_cb ((void *)&result);
   1237     }
   1238 
   1239 }
   1240 
   1241 /*******************************************************************************
   1242 **
   1243 ** Function         bta_dm_search_cancel
   1244 **
   1245 ** Description      Cancels an ongoing search for devices
   1246 **
   1247 **
   1248 ** Returns          void
   1249 **
   1250 *******************************************************************************/
   1251 void bta_dm_search_cancel (tBTA_DM_MSG *p_data)
   1252 {
   1253 
   1254     tBTA_DM_MSG * p_msg;
   1255 
   1256     if(BTM_IsInquiryActive())
   1257     {
   1258         BTM_CancelInquiry();
   1259         bta_dm_search_cancel_notify(NULL);
   1260 
   1261         if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
   1262         {
   1263             p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
   1264             p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
   1265             bta_sys_sendmsg(p_msg);
   1266 
   1267         }
   1268     }
   1269     /* If no Service Search going on then issue cancel remote name in case it is active */
   1270     else if (!bta_dm_search_cb.name_discover_done)
   1271     {
   1272         BTM_CancelRemoteDeviceName();
   1273     }
   1274 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
   1275     if (bta_dm_search_cb.gatt_disc_active)
   1276     {
   1277         bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
   1278     }
   1279 #endif
   1280 }
   1281 
   1282 /*******************************************************************************
   1283 **
   1284 ** Function         bta_dm_discover
   1285 **
   1286 ** Description      Discovers services on a remote device
   1287 **
   1288 **
   1289 ** Returns          void
   1290 **
   1291 *******************************************************************************/
   1292 void bta_dm_discover (tBTA_DM_MSG *p_data)
   1293 {
   1294 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
   1295     UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->discover.num_uuid);
   1296 #endif
   1297     APPL_TRACE_EVENT2("bta_dm_discover services_to_search=0x%04X, sdp_search=%d",
   1298                       p_data->discover.services, p_data->discover.sdp_search);
   1299 
   1300     /* save the search condition */
   1301     bta_dm_search_cb.services = p_data->discover.services;
   1302 
   1303 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
   1304     utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
   1305     if ((bta_dm_search_cb.num_uuid = p_data->discover.num_uuid) != 0 &&
   1306         p_data->discover.p_uuid != NULL)
   1307     {
   1308         if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL)
   1309         {
   1310             p_data->discover.p_cback(BTA_DM_DISC_CMPL_EVT, NULL);
   1311             return;
   1312         }
   1313         memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->discover.p_uuid, len);
   1314     }
   1315     bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid;
   1316 #endif
   1317 
   1318     bta_dm_search_cb.p_search_cback = p_data->discover.p_cback;
   1319     bta_dm_search_cb.sdp_search = p_data->discover.sdp_search;
   1320     bta_dm_search_cb.services_to_search = bta_dm_search_cb.services;
   1321     bta_dm_search_cb.service_index = 0;
   1322     bta_dm_search_cb.services_found = 0;
   1323     bta_dm_search_cb.peer_name[0] = 0;
   1324     bta_dm_search_cb.sdp_search = p_data->discover.sdp_search;
   1325     bta_dm_search_cb.p_btm_inq_info = BTM_InqDbRead (p_data->discover.bd_addr);
   1326 
   1327     bta_dm_search_cb.name_discover_done = FALSE;
   1328     memcpy(&bta_dm_search_cb.uuid, &p_data->discover.uuid, sizeof(tSDP_UUID));
   1329     bta_dm_discover_device(p_data->discover.bd_addr);
   1330 }
   1331 
   1332 /*******************************************************************************
   1333 **
   1334 ** Function         bta_dm_di_disc_cmpl
   1335 **
   1336 ** Description      Sends event to application when DI discovery complete
   1337 **
   1338 ** Returns          void
   1339 **
   1340 *******************************************************************************/
   1341 void bta_dm_di_disc_cmpl(tBTA_DM_MSG *p_data)
   1342 {
   1343     tBTA_DM_DI_DISC_CMPL    di_disc;
   1344 
   1345     memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL));
   1346     bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr);
   1347 
   1348     if((p_data->hdr.offset == SDP_SUCCESS)
   1349         || (p_data->hdr.offset == SDP_DB_FULL))
   1350     {
   1351         di_disc.num_record  = SDP_GetNumDiRecords(bta_dm_di_cb.p_di_db);
   1352     }
   1353     else
   1354         di_disc.result      = BTA_FAILURE;
   1355 
   1356     bta_dm_di_cb.p_di_db = NULL;
   1357     bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, (tBTA_DM_SEARCH *) &di_disc);
   1358 }
   1359 
   1360 /*******************************************************************************
   1361 **
   1362 ** Function         bta_dm_di_disc_callback
   1363 **
   1364 ** Description      This function queries a remote device for DI information.
   1365 **
   1366 **
   1367 ** Returns          void
   1368 **
   1369 *******************************************************************************/
   1370 static void bta_dm_di_disc_callback(UINT16 result)
   1371 {
   1372     tBTA_DM_MSG * p_msg;
   1373 
   1374     if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
   1375     {
   1376         p_msg->hdr.event            = BTA_DM_SEARCH_CMPL_EVT;
   1377         p_msg->hdr.layer_specific   = BTA_DM_API_DI_DISCOVER_EVT;
   1378         p_msg->hdr.offset           = result;
   1379         bta_sys_sendmsg(p_msg);
   1380     }
   1381 }
   1382 
   1383 /*******************************************************************************
   1384 **
   1385 ** Function         bta_dm_disable_search_and_disc
   1386 **
   1387 ** Description      Cancels an ongoing search or discovery for devices in case of
   1388 **                  a Bluetooth disable
   1389 **
   1390 **
   1391 ** Returns          void
   1392 **
   1393 *******************************************************************************/
   1394 static void bta_dm_disable_search_and_disc (void)
   1395 {
   1396     tBTA_DM_DI_DISC_CMPL    di_disc;
   1397     tBTA_DM_MSG * p_msg;
   1398 
   1399     if(BTM_IsInquiryActive()||(bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE))
   1400     {
   1401         BTM_CancelInquiry();
   1402         bta_dm_search_cancel_notify(NULL);
   1403 
   1404         if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
   1405         {
   1406             p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
   1407             p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
   1408             bta_sys_sendmsg(p_msg);
   1409 
   1410         }
   1411     }
   1412     /* If no Service Search going on then issue cancel remote name in case it is active */
   1413     else if (!bta_dm_search_cb.name_discover_done)
   1414     {
   1415         BTM_CancelRemoteDeviceName();
   1416 
   1417         if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
   1418         {
   1419             p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
   1420             p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
   1421             bta_sys_sendmsg(p_msg);
   1422         }
   1423     }
   1424     else if(bta_dm_di_cb.p_di_db != NULL)
   1425     {
   1426         memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL));
   1427         bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr);
   1428         di_disc.result      = BTA_FAILURE;
   1429 
   1430         bta_dm_di_cb.p_di_db = NULL;
   1431         bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, NULL);
   1432     }
   1433 
   1434 #if (BLE_INCLUDED == TRUE) && (BTA_GATT_INCLUDED == TRUE)
   1435     if (bta_dm_search_cb.gatt_disc_active)
   1436     {
   1437         bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
   1438     }
   1439 #endif
   1440 }
   1441 
   1442 /*******************************************************************************
   1443 **
   1444 ** Function         bta_dm_di_disc
   1445 **
   1446 ** Description      This function queries a remote device for DI information.
   1447 **
   1448 **
   1449 ** Returns          void
   1450 **
   1451 *******************************************************************************/
   1452 void bta_dm_di_disc (tBTA_DM_MSG *p_data)
   1453 {
   1454     UINT16  result = BTA_FAILURE;
   1455     tBTA_DM_MSG *p_msg;
   1456 
   1457     bta_dm_search_cb.p_search_cback = p_data->di_disc.p_cback;
   1458     bdcpy(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.bd_addr);
   1459     bta_dm_di_cb.p_di_db = p_data->di_disc.p_sdp_db;
   1460 
   1461     if((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_DM_SDP_DB_SIZE)) != NULL)
   1462     {
   1463         if ( SDP_DiDiscover(bta_dm_search_cb.peer_bdaddr, p_data->di_disc.p_sdp_db,
   1464                     p_data->di_disc.len, bta_dm_di_disc_callback) == SDP_SUCCESS)
   1465         {
   1466             result = BTA_SUCCESS;
   1467         }
   1468     }
   1469     else
   1470     {
   1471         APPL_TRACE_ERROR0("No buffer to start DI discovery");
   1472     }
   1473 
   1474     if ( result == BTA_FAILURE &&
   1475         (p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
   1476     {
   1477         p_msg->hdr.event            = BTA_DM_SEARCH_CMPL_EVT;
   1478         p_msg->hdr.layer_specific   = BTA_DM_API_DI_DISCOVER_EVT;
   1479         p_data->hdr.offset          = result;
   1480         bta_sys_sendmsg(p_msg);
   1481     }
   1482 }
   1483 
   1484 /*******************************************************************************
   1485 **
   1486 ** Function         bta_dm_read_remote_device_name
   1487 **
   1488 ** Description      Initiate to get remote device name
   1489 **
   1490 ** Returns          TRUE if started to get remote name
   1491 **
   1492 *******************************************************************************/
   1493 static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr)
   1494 {
   1495     tBTM_STATUS  btm_status;
   1496 
   1497     APPL_TRACE_DEBUG0("bta_dm_read_remote_device_name");
   1498 
   1499     bdcpy(bta_dm_search_cb.peer_bdaddr, bd_addr);
   1500     bta_dm_search_cb.peer_name[0] = 0;
   1501 
   1502     btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr,
   1503                                            (tBTM_CMPL_CB *) bta_dm_remname_cback);
   1504 
   1505     if ( btm_status == BTM_CMD_STARTED )
   1506     {
   1507         APPL_TRACE_DEBUG0("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is started");
   1508 
   1509         return (TRUE);
   1510     }
   1511     else if ( btm_status == BTM_BUSY )
   1512     {
   1513         APPL_TRACE_DEBUG0("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName is busy");
   1514 
   1515         /* Remote name discovery is on going now so BTM cannot notify through "bta_dm_remname_cback" */
   1516         /* adding callback to get notified that current reading remore name done */
   1517         BTM_SecAddRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
   1518 
   1519         return (TRUE);
   1520     }
   1521     else
   1522     {
   1523         APPL_TRACE_WARNING1("bta_dm_read_remote_device_name: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status);
   1524 
   1525         return (FALSE);
   1526     }
   1527 }
   1528 
   1529 /*******************************************************************************
   1530 **
   1531 ** Function         bta_dm_inq_cmpl
   1532 **
   1533 ** Description      Process the inquiry complete event from BTM
   1534 **
   1535 ** Returns          void
   1536 **
   1537 *******************************************************************************/
   1538 void bta_dm_inq_cmpl (tBTA_DM_MSG *p_data)
   1539 {
   1540     tBTA_DM_MSG * p_msg;
   1541     tBTA_DM_SEARCH  data;
   1542 
   1543     APPL_TRACE_DEBUG0("bta_dm_inq_cmpl");
   1544 
   1545     data.inq_cmpl.num_resps = p_data->inq_cmpl.num;
   1546     bta_dm_search_cb.p_search_cback(BTA_DM_INQ_CMPL_EVT, &data);
   1547 
   1548     if((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbFirst()) != NULL)
   1549     {
   1550         /* start name and service discovery from the first device on inquiry result */
   1551         bta_dm_search_cb.name_discover_done = FALSE;
   1552         bta_dm_search_cb.peer_name[0]       = 0;
   1553         bta_dm_discover_device(bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr);
   1554     }
   1555     else
   1556     {
   1557         /* no devices, search complete */
   1558         bta_dm_search_cb.services = 0;
   1559 
   1560         if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
   1561         {
   1562             p_msg->hdr.event          = BTA_DM_SEARCH_CMPL_EVT;
   1563             p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
   1564             bta_sys_sendmsg(p_msg);
   1565         }
   1566         }
   1567     }
   1568 
   1569 /*******************************************************************************
   1570 **
   1571 ** Function         bta_dm_rmt_name
   1572 **
   1573 ** Description      Process the remote name result from BTM
   1574 **
   1575 ** Returns          void
   1576 **
   1577 *******************************************************************************/
   1578 void bta_dm_rmt_name (tBTA_DM_MSG *p_data)
   1579 {
   1580     APPL_TRACE_DEBUG0("bta_dm_rmt_name");
   1581 
   1582     if( p_data->rem_name.result.disc_res.bd_name[0] && bta_dm_search_cb.p_btm_inq_info)
   1583     {
   1584         bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name = TRUE;
   1585     }
   1586 
   1587     bta_dm_discover_device(bta_dm_search_cb.peer_bdaddr);
   1588 }
   1589 
   1590 /*******************************************************************************
   1591 **
   1592 ** Function         bta_dm_disc_rmt_name
   1593 **
   1594 ** Description      Process the remote name result from BTM when application
   1595 **                  wants to find the name for a bdaddr
   1596 **
   1597 ** Returns          void
   1598 **
   1599 *******************************************************************************/
   1600 void bta_dm_disc_rmt_name (tBTA_DM_MSG *p_data)
   1601 {
   1602     tBTM_INQ_INFO *p_btm_inq_info;
   1603 
   1604     APPL_TRACE_DEBUG0("bta_dm_disc_rmt_name");
   1605 
   1606     p_btm_inq_info = BTM_InqDbRead (p_data->rem_name.result.disc_res.bd_addr);
   1607     if( p_btm_inq_info )
   1608     {
   1609         if( p_data->rem_name.result.disc_res.bd_name[0] )
   1610         {
   1611             p_btm_inq_info->appl_knows_rem_name = TRUE;
   1612         }
   1613     }
   1614 
   1615     bta_dm_discover_device(p_data->rem_name.result.disc_res.bd_addr);
   1616 }
   1617 
   1618 /*******************************************************************************
   1619 **
   1620 ** Function         bta_dm_sdp_result
   1621 **
   1622 ** Description      Process the discovery result from sdp
   1623 **
   1624 ** Returns          void
   1625 **
   1626 *******************************************************************************/
   1627 void bta_dm_sdp_result (tBTA_DM_MSG *p_data)
   1628 {
   1629 
   1630     tSDP_DISC_REC   *p_sdp_rec = NULL;
   1631     tBTA_DM_MSG     *p_msg;
   1632     BOOLEAN          service_found = FALSE;
   1633     BOOLEAN          scn_found = FALSE;
   1634     UINT16           service = 0xFFFF;
   1635     tSDP_PROTOCOL_ELEM  pe;
   1636 
   1637 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
   1638     tBT_UUID           *p_uuid = bta_dm_search_cb.p_srvc_uuid;
   1639     tBTA_DM_SEARCH      result;
   1640     tBT_UUID            service_uuid;
   1641 #endif
   1642 
   1643     UINT32 num_uuids = 0;
   1644     UINT8  uuid_list[32][MAX_UUID_SIZE]; // assuming a max of 32 services
   1645 
   1646     if((p_data->sdp_event.sdp_result == SDP_SUCCESS)
   1647         || (p_data->sdp_event.sdp_result == SDP_NO_RECS_MATCH)
   1648         || (p_data->sdp_event.sdp_result == SDP_DB_FULL))
   1649     {
   1650         APPL_TRACE_DEBUG1("sdp_result::0x%x", p_data->sdp_event.sdp_result);
   1651         do
   1652         {
   1653 
   1654             service_found = FALSE;
   1655             p_sdp_rec = NULL;
   1656             if( bta_dm_search_cb.service_index == (BTA_USER_SERVICE_ID+1) )
   1657             {
   1658                 p_sdp_rec = SDP_FindServiceUUIDInDb(bta_dm_search_cb.p_sdp_db, &bta_dm_search_cb.uuid, p_sdp_rec);
   1659 
   1660                 if (p_sdp_rec && SDP_FindProtocolListElemInRec(p_sdp_rec, UUID_PROTOCOL_RFCOMM, &pe))
   1661                 {
   1662                     bta_dm_search_cb.peer_scn = (UINT8) pe.params[0];
   1663                     scn_found = TRUE;
   1664                 }
   1665             }
   1666             else
   1667             {
   1668                 service = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index-1];
   1669                 p_sdp_rec = SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db, service, p_sdp_rec);
   1670             }
   1671 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
   1672             /* finished with BR/EDR services, now we check the result for GATT based service UUID */
   1673             if (bta_dm_search_cb.service_index == BTA_MAX_SERVICE_ID)
   1674             {
   1675                 if (bta_dm_search_cb.uuid_to_search != 0 && p_uuid != NULL)
   1676                 {
   1677                     p_uuid +=  (bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search);
   1678                     /* only support 16 bits UUID for now */
   1679                     service = p_uuid->uu.uuid16;
   1680 
   1681                 }
   1682                 /* all GATT based services */
   1683                 do
   1684                 {
   1685                     /* find a service record, report it */
   1686                     p_sdp_rec = SDP_FindServiceInDb(bta_dm_search_cb.p_sdp_db,
   1687                                                 0, p_sdp_rec);
   1688                     if (p_sdp_rec)
   1689                     {
   1690                         if (SDP_FindServiceUUIDInRec(p_sdp_rec, &service_uuid))
   1691                         {
   1692                             /* send result back to app now, one by one */
   1693                             bdcpy (result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
   1694                             BCM_STRNCPY_S((char*)result.disc_ble_res.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN));
   1695                             result.disc_ble_res.bd_name[BD_NAME_LEN] = 0;
   1696                             result.disc_ble_res.service.len = service_uuid.len;
   1697                             result.disc_ble_res.service.uu.uuid16 = service_uuid.uu.uuid16;
   1698 
   1699                             bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result);
   1700                         }
   1701                     }
   1702 
   1703                     if (bta_dm_search_cb.uuid_to_search > 0)
   1704                         break;
   1705 
   1706                 } while (p_sdp_rec);
   1707             }
   1708             else
   1709 #endif
   1710             {
   1711             /* SDP_DB_FULL means some records with the
   1712                required attributes were received */
   1713             if(((p_data->sdp_event.sdp_result == SDP_DB_FULL) &&
   1714                     bta_dm_search_cb.services != BTA_ALL_SERVICE_MASK) ||
   1715                     (p_sdp_rec  != NULL))
   1716             {
   1717                 /* If Plug and Play service record, check to see if Broadcom stack */
   1718                 if (service == UUID_SERVCLASS_PNP_INFORMATION)
   1719                 {
   1720                     if (p_sdp_rec)
   1721                     {
   1722                         if (SDP_FindAttributeInRec (p_sdp_rec, ATTR_ID_EXT_BRCM_VERSION))
   1723                         {
   1724                             service_found = TRUE;
   1725                         }
   1726                     }
   1727                 }
   1728                 else
   1729                 {
   1730                     service_found = TRUE;
   1731                 }
   1732 
   1733                 if (service_found)
   1734                 {
   1735                     UINT16 tmp_svc = 0xFFFF;
   1736                     bta_dm_search_cb.services_found |=
   1737                         (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index-1));
   1738                     tmp_svc = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index-1];
   1739                     /* Add to the list of UUIDs */
   1740                     sdpu_uuid16_to_uuid128(tmp_svc, uuid_list[num_uuids]);
   1741                     num_uuids++;
   1742                 }
   1743             }
   1744             }
   1745 
   1746             if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK &&
   1747                 bta_dm_search_cb.services_to_search == 0)
   1748             {
   1749 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
   1750                 if ( bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID &&
   1751                     bta_dm_search_cb.uuid_to_search > 0)
   1752                     bta_dm_search_cb.uuid_to_search --;
   1753 
   1754                 if (bta_dm_search_cb.uuid_to_search == 0 ||
   1755                     bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID)
   1756 #endif
   1757                     bta_dm_search_cb.service_index++;
   1758             }
   1759             else /* regular one service per search or PNP search */
   1760                 break;
   1761 
   1762         }
   1763         while(bta_dm_search_cb.service_index <= BTA_MAX_SERVICE_ID);
   1764 
   1765 //        GKI_freebuf(bta_dm_search_cb.p_sdp_db);
   1766 //        bta_dm_search_cb.p_sdp_db = NULL;
   1767         APPL_TRACE_DEBUG1("bta_dm_sdp_result services_found = %04x", bta_dm_search_cb.services_found);
   1768 
   1769         /* Collect the 128-bit services here and put them into the list */
   1770         if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK)
   1771         {
   1772             p_sdp_rec = NULL;
   1773             do
   1774             {
   1775                 tBT_UUID temp_uuid;
   1776                 /* find a service record, report it */
   1777                 p_sdp_rec = SDP_FindServiceInDb_128bit(bta_dm_search_cb.p_sdp_db, p_sdp_rec);
   1778                 if (p_sdp_rec)
   1779                 {
   1780                     if (SDP_FindServiceUUIDInRec_128bit(p_sdp_rec, &temp_uuid))
   1781                     {
   1782                         memcpy(uuid_list[num_uuids], temp_uuid.uu.uuid128, MAX_UUID_SIZE);
   1783                         num_uuids++;
   1784                     }
   1785                 }
   1786             } while (p_sdp_rec);
   1787         }
   1788         /* if there are more services to search for */
   1789         if(bta_dm_search_cb.services_to_search)
   1790         {
   1791             /* Free up the p_sdp_db before checking the next one */
   1792             bta_dm_free_sdp_db(NULL);
   1793             bta_dm_find_services(bta_dm_search_cb.peer_bdaddr);
   1794         }
   1795         else
   1796         {
   1797             /* callbacks */
   1798             /* start next bd_addr if necessary */
   1799 
   1800             BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
   1801 
   1802 
   1803             if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
   1804             {
   1805                 p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
   1806                 p_msg->disc_result.result.disc_res.result = BTA_SUCCESS;
   1807                 p_msg->disc_result.result.disc_res.p_raw_data = NULL;
   1808                 p_msg->disc_result.result.disc_res.raw_data_size = 0;
   1809                 p_msg->disc_result.result.disc_res.num_uuids = num_uuids;
   1810                 p_msg->disc_result.result.disc_res.p_uuid_list = NULL;
   1811                 if (num_uuids > 0) {
   1812                     p_msg->disc_result.result.disc_res.p_uuid_list = (UINT8*)GKI_getbuf(num_uuids*MAX_UUID_SIZE);
   1813                     if (p_msg->disc_result.result.disc_res.p_uuid_list) {
   1814                         memcpy(p_msg->disc_result.result.disc_res.p_uuid_list, uuid_list,
   1815                                num_uuids*MAX_UUID_SIZE);
   1816                     } else {
   1817                        p_msg->disc_result.result.disc_res.num_uuids = 0;
   1818                        APPL_TRACE_ERROR1("%s: Unable to allocate memory for uuid_list", __FUNCTION__);
   1819                     }
   1820                 }
   1821                 //copy the raw_data to the discovery result  structure
   1822                 //
   1823                 APPL_TRACE_DEBUG2("bta_dm_sdp_result (raw_data used = 0x%x raw_data_ptr = 0x%x)\r\n",bta_dm_search_cb.p_sdp_db->raw_used, bta_dm_search_cb.p_sdp_db->raw_data);
   1824 
   1825                 if (  bta_dm_search_cb.p_sdp_db != NULL && bta_dm_search_cb.p_sdp_db->raw_used != 0   &&
   1826                     bta_dm_search_cb.p_sdp_db->raw_data != NULL) {
   1827 
   1828                     p_msg->disc_result.result.disc_res.p_raw_data = GKI_getbuf(bta_dm_search_cb.p_sdp_db->raw_used);
   1829                     if ( NULL != p_msg->disc_result.result.disc_res.p_raw_data  ) {
   1830                         memcpy(     p_msg->disc_result.result.disc_res.p_raw_data,
   1831                                     bta_dm_search_cb.p_sdp_db->raw_data,
   1832                                     bta_dm_search_cb.p_sdp_db->raw_used );
   1833 
   1834                         p_msg->disc_result.result.disc_res.raw_data_size =
   1835                             bta_dm_search_cb.p_sdp_db->raw_used;
   1836 
   1837                     } else {
   1838                         APPL_TRACE_DEBUG1("bta_dm_sdp_result GKI Alloc failed to allocate %d bytes !!\r\n",bta_dm_search_cb.p_sdp_db->raw_used);
   1839                     }
   1840 
   1841                     bta_dm_search_cb.p_sdp_db->raw_data = NULL;     //no need to free this - it is a global assigned.
   1842                     bta_dm_search_cb.p_sdp_db->raw_used = 0;
   1843                     bta_dm_search_cb.p_sdp_db->raw_size = 0;
   1844                 }
   1845                 else {
   1846                     APPL_TRACE_DEBUG0("bta_dm_sdp_result raw data size is 0 or raw_data is null!!\r\n");
   1847                 }
   1848                 /* Done with p_sdp_db. Free it */
   1849                 bta_dm_free_sdp_db(NULL);
   1850                 p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
   1851 
   1852                 //Piggy back the SCN over result field
   1853                 if( scn_found )
   1854                 {
   1855                   p_msg->disc_result.result.disc_res.result = (3 + bta_dm_search_cb.peer_scn);
   1856                   p_msg->disc_result.result.disc_res.services |= BTA_USER_SERVICE_MASK;
   1857 
   1858                   APPL_TRACE_EVENT1(" Piggy back the SCN over result field  SCN=%d", bta_dm_search_cb.peer_scn);
   1859 
   1860                 }
   1861                 bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
   1862                 BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
   1863                         bta_dm_get_remname(), (BD_NAME_LEN-1));
   1864 
   1865                 /* make sure the string is null terminated */
   1866                 p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
   1867 
   1868                 bta_sys_sendmsg(p_msg);
   1869             }
   1870 
   1871         }
   1872 
   1873     }
   1874     else
   1875     {
   1876         /* conn failed. No need for timer */
   1877         if(p_data->sdp_event.sdp_result == SDP_CONN_FAILED || p_data->sdp_event.sdp_result == SDP_CONN_REJECTED
   1878            || p_data->sdp_event.sdp_result == SDP_SECURITY_ERR)
   1879             bta_dm_search_cb.wait_disc = FALSE;
   1880 
   1881         /* not able to connect go to next device */
   1882         GKI_freebuf(bta_dm_search_cb.p_sdp_db);
   1883         bta_dm_search_cb.p_sdp_db = NULL;
   1884 
   1885         BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
   1886 
   1887         if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
   1888         {
   1889             p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
   1890             p_msg->disc_result.result.disc_res.result = BTA_FAILURE;
   1891             p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
   1892             bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
   1893             BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
   1894                     bta_dm_get_remname(), (BD_NAME_LEN-1));
   1895 
   1896             /* make sure the string is null terminated */
   1897             p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
   1898 
   1899             bta_sys_sendmsg(p_msg);
   1900         }
   1901     }
   1902 }
   1903 
   1904 /*******************************************************************************
   1905 **
   1906 ** Function         bta_dm_search_cmpl
   1907 **
   1908 ** Description      Sends event to application
   1909 **
   1910 ** Returns          void
   1911 **
   1912 *******************************************************************************/
   1913 void bta_dm_search_cmpl (tBTA_DM_MSG *p_data)
   1914 {
   1915     APPL_TRACE_DEBUG0("bta_dm_search_cmpl");
   1916 
   1917 #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
   1918     utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid);
   1919 #endif
   1920 
   1921     if (p_data->hdr.layer_specific == BTA_DM_API_DI_DISCOVER_EVT)
   1922         bta_dm_di_disc_cmpl(p_data);
   1923     else
   1924         bta_dm_search_cb.p_search_cback(BTA_DM_DISC_CMPL_EVT, NULL);
   1925 }
   1926 
   1927 /*******************************************************************************
   1928 **
   1929 ** Function         bta_dm_disc_result
   1930 **
   1931 ** Description      Service discovery result when discovering services on a device
   1932 **
   1933 ** Returns          void
   1934 **
   1935 *******************************************************************************/
   1936 void bta_dm_disc_result (tBTA_DM_MSG *p_data)
   1937 {
   1938     tBTA_DM_MSG *      p_msg;
   1939 
   1940     APPL_TRACE_DEBUG0("bta_dm_disc_result");
   1941 
   1942 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
   1943     /* if any BR/EDR service discovery has been done, report the event */
   1944     if ((bta_dm_search_cb.services & ((BTA_ALL_SERVICE_MASK | BTA_USER_SERVICE_MASK ) & ~BTA_BLE_SERVICE_MASK)))
   1945 #endif
   1946     bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result);
   1947 
   1948     /* send a message to change state */
   1949     if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
   1950     {
   1951         p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT;
   1952         p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
   1953         bta_sys_sendmsg(p_msg);
   1954     }
   1955 }
   1956 
   1957 /*******************************************************************************
   1958 **
   1959 ** Function         bta_dm_search_result
   1960 **
   1961 ** Description      Service discovery result while searching for devices
   1962 **
   1963 ** Returns          void
   1964 **
   1965 *******************************************************************************/
   1966 void bta_dm_search_result (tBTA_DM_MSG *p_data)
   1967 {
   1968     APPL_TRACE_DEBUG2("bta_dm_search_result searching:0x%04x, result:0x%04x",
   1969                        bta_dm_search_cb.services,
   1970                        p_data->disc_result.result.disc_res.services);
   1971 
   1972     /* call back if application wants name discovery or found services that application is searching */
   1973     if (( !bta_dm_search_cb.services )
   1974       ||(( bta_dm_search_cb.services ) && ( p_data->disc_result.result.disc_res.services )))
   1975     {
   1976         bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result);
   1977     }
   1978 
   1979     /* if searching did not initiate to create link */
   1980     if(!bta_dm_search_cb.wait_disc )
   1981     {
   1982 #if ( BTM_EIR_CLIENT_INCLUDED == TRUE )
   1983         /* if service searching is done with EIR, don't search next device */
   1984         if( bta_dm_search_cb.p_btm_inq_info )
   1985 #endif
   1986         bta_dm_discover_next_device();
   1987     }
   1988     else
   1989     {
   1990         /* wait until link is disconnected or timeout */
   1991         bta_dm_search_cb.sdp_results = TRUE;
   1992         bta_dm_search_cb.search_timer.p_cback = (TIMER_CBACK*)&bta_dm_search_timer_cback;
   1993         bta_sys_start_timer(&bta_dm_search_cb.search_timer, 0, 1000*(L2CAP_LINK_INACTIVITY_TOUT+1) );
   1994     }
   1995 
   1996 }
   1997 
   1998 /*******************************************************************************
   1999 **
   2000 ** Function         bta_dm_search_timer_cback
   2001 **
   2002 ** Description      Called when ACL disconnect time is over
   2003 **
   2004 **
   2005 ** Returns          void
   2006 **
   2007 *******************************************************************************/
   2008 static void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle)
   2009 {
   2010 
   2011     APPL_TRACE_EVENT0(" bta_dm_search_timer_cback  ");
   2012     bta_dm_search_cb.wait_disc = FALSE;
   2013 
   2014     /* proceed with next device */
   2015     bta_dm_discover_next_device();
   2016 
   2017 }
   2018 
   2019 
   2020 /*******************************************************************************
   2021 **
   2022 ** Function         bta_dm_free_sdp_db
   2023 **
   2024 ** Description      Frees SDP data base
   2025 **
   2026 ** Returns          void
   2027 **
   2028 *******************************************************************************/
   2029 void bta_dm_free_sdp_db (tBTA_DM_MSG *p_data)
   2030 {
   2031     if(bta_dm_search_cb.p_sdp_db)
   2032     {
   2033         GKI_freebuf(bta_dm_search_cb.p_sdp_db);
   2034         bta_dm_search_cb.p_sdp_db = NULL;
   2035     }
   2036 
   2037 }
   2038 
   2039 /*******************************************************************************
   2040 **
   2041 ** Function         bta_dm_queue_search
   2042 **
   2043 ** Description      Queues search command while search is being cancelled
   2044 **
   2045 ** Returns          void
   2046 **
   2047 *******************************************************************************/
   2048 void bta_dm_queue_search (tBTA_DM_MSG *p_data)
   2049 {
   2050     if(bta_dm_search_cb.p_search_queue)
   2051     {
   2052         GKI_freebuf(bta_dm_search_cb.p_search_queue);
   2053     }
   2054 
   2055     bta_dm_search_cb.p_search_queue = (tBTA_DM_MSG *)GKI_getbuf(sizeof(tBTA_DM_API_SEARCH));
   2056     memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_SEARCH));
   2057 
   2058 }
   2059 
   2060 /*******************************************************************************
   2061 **
   2062 ** Function         bta_dm_queue_disc
   2063 **
   2064 ** Description      Queues discovery command while search is being cancelled
   2065 **
   2066 ** Returns          void
   2067 **
   2068 *******************************************************************************/
   2069 void bta_dm_queue_disc (tBTA_DM_MSG *p_data)
   2070 {
   2071     if(bta_dm_search_cb.p_search_queue)
   2072     {
   2073         GKI_freebuf(bta_dm_search_cb.p_search_queue);
   2074     }
   2075 
   2076     bta_dm_search_cb.p_search_queue = (tBTA_DM_MSG *)GKI_getbuf(sizeof(tBTA_DM_API_DISCOVER));
   2077     memcpy(bta_dm_search_cb.p_search_queue, p_data, sizeof(tBTA_DM_API_DISCOVER));
   2078 
   2079 }
   2080 
   2081 /*******************************************************************************
   2082 **
   2083 ** Function         bta_dm_search_clear_queue
   2084 **
   2085 ** Description      Clears the queue if API search cancel is called
   2086 **
   2087 ** Returns          void
   2088 **
   2089 *******************************************************************************/
   2090 void bta_dm_search_clear_queue (tBTA_DM_MSG *p_data)
   2091 {
   2092 
   2093     if(bta_dm_search_cb.p_search_queue)
   2094     {
   2095         GKI_freebuf(bta_dm_search_cb.p_search_queue);
   2096         bta_dm_search_cb.p_search_queue = NULL;
   2097     }
   2098 
   2099 
   2100 }
   2101 
   2102 /*******************************************************************************
   2103 **
   2104 ** Function         bta_dm_search_cancel_cmpl
   2105 **
   2106 ** Description      Search cancel is complete
   2107 **
   2108 ** Returns          void
   2109 **
   2110 *******************************************************************************/
   2111 void bta_dm_search_cancel_cmpl (tBTA_DM_MSG *p_data)
   2112 {
   2113 
   2114     if(bta_dm_search_cb.p_search_queue)
   2115     {
   2116         bta_sys_sendmsg(bta_dm_search_cb.p_search_queue);
   2117         bta_dm_search_cb.p_search_queue = NULL;
   2118     }
   2119 
   2120 }
   2121 
   2122 /*******************************************************************************
   2123 **
   2124 ** Function         bta_dm_search_cancel_transac_cmpl
   2125 **
   2126 ** Description      Current Service Discovery or remote name procedure is
   2127 **                  completed after search cancellation
   2128 **
   2129 ** Returns          void
   2130 **
   2131 *******************************************************************************/
   2132 void bta_dm_search_cancel_transac_cmpl(tBTA_DM_MSG *p_data)
   2133 {
   2134 
   2135     if(bta_dm_search_cb.p_sdp_db)
   2136     {
   2137         GKI_freebuf(bta_dm_search_cb.p_sdp_db);
   2138         bta_dm_search_cb.p_sdp_db = NULL;
   2139     }
   2140 
   2141     bta_dm_search_cancel_notify(NULL);
   2142 }
   2143 
   2144 
   2145 /*******************************************************************************
   2146 **
   2147 ** Function         bta_dm_search_cancel_notify
   2148 **
   2149 ** Description      Notify application that search has been cancelled
   2150 **
   2151 ** Returns          void
   2152 **
   2153 *******************************************************************************/
   2154 void bta_dm_search_cancel_notify (tBTA_DM_MSG *p_data)
   2155 {
   2156     if (bta_dm_search_cb.p_search_cback)
   2157     {
   2158         bta_dm_search_cb.p_search_cback(BTA_DM_SEARCH_CANCEL_CMPL_EVT, NULL);
   2159     }
   2160     if (!bta_dm_search_cb.name_discover_done)
   2161     {
   2162         BTM_CancelRemoteDeviceName();
   2163     }
   2164 #if (BLE_INCLUDED == TRUE) && (BTA_GATT_INCLUDED == TRUE)
   2165     if (bta_dm_search_cb.gatt_disc_active)
   2166     {
   2167         bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
   2168     }
   2169 #endif
   2170 
   2171 }
   2172 
   2173 /*******************************************************************************
   2174 **
   2175 ** Function         bta_dm_find_services
   2176 **
   2177 ** Description      Starts discovery on a device
   2178 **
   2179 ** Returns          void
   2180 **
   2181 *******************************************************************************/
   2182 static void bta_dm_find_services ( BD_ADDR bd_addr)
   2183 {
   2184 
   2185     tSDP_UUID    uuid;
   2186     UINT16       attr_list[] = {ATTR_ID_SERVICE_CLASS_ID_LIST, ATTR_ID_EXT_BRCM_VERSION};
   2187     UINT16       num_attrs = 1;
   2188     tBTA_DM_MSG *p_msg;
   2189 
   2190     memset (&uuid, 0, sizeof(tSDP_UUID));
   2191 
   2192     while(bta_dm_search_cb.service_index < BTA_MAX_SERVICE_ID)
   2193     {
   2194         if( bta_dm_search_cb.services_to_search
   2195             & (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)))
   2196         {
   2197             if((bta_dm_search_cb.p_sdp_db = (tSDP_DISCOVERY_DB *)GKI_getbuf(BTA_DM_SDP_DB_SIZE)) != NULL)
   2198             {
   2199                 APPL_TRACE_DEBUG1("bta_dm_search_cb.services = %04x***********", bta_dm_search_cb.services);
   2200                 /* try to search all services by search based on L2CAP UUID */
   2201                 if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK )
   2202                 {
   2203                     APPL_TRACE_ERROR1("services_to_search = %08x",bta_dm_search_cb.services_to_search);
   2204                     if (bta_dm_search_cb.services_to_search & BTA_RES_SERVICE_MASK)
   2205                     {
   2206                         uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[0];
   2207                         bta_dm_search_cb.services_to_search &= ~BTA_RES_SERVICE_MASK;
   2208                     }
   2209                     else
   2210                     {
   2211                         uuid.uu.uuid16 = UUID_PROTOCOL_L2CAP;
   2212                         bta_dm_search_cb.services_to_search = 0;
   2213                     }
   2214                 }
   2215                 else
   2216                 {
   2217 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
   2218                     /* for LE only profile */
   2219                     if (bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID)
   2220                     {
   2221                         if (bta_dm_search_cb.uuid_to_search > 0 && bta_dm_search_cb.p_srvc_uuid)
   2222                         {
   2223                             memcpy(&uuid,
   2224                                    (const void *)(bta_dm_search_cb.p_srvc_uuid + \
   2225                                                   bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search),
   2226                                    sizeof(tBT_UUID));
   2227 
   2228                             bta_dm_search_cb.uuid_to_search -- ;
   2229                         }
   2230                         else
   2231                             uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index];
   2232 
   2233                         /* last one? clear the BLE service bit if all discovery has been done */
   2234                         if (bta_dm_search_cb.uuid_to_search == 0)
   2235                             bta_dm_search_cb.services_to_search &=
   2236                             (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)));
   2237 
   2238                     }
   2239                     else
   2240 #endif
   2241                     {
   2242                         /* remove the service from services to be searched  */
   2243                         bta_dm_search_cb.services_to_search &=
   2244                         (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index)));
   2245                         uuid.uu.uuid16 = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index];
   2246                     }
   2247                 }
   2248 
   2249                 if (uuid.len == 0)
   2250                 uuid.len = LEN_UUID_16;
   2251 
   2252 #if 0
   2253                 if (uuid.uu.uuid16 == UUID_SERVCLASS_PNP_INFORMATION)
   2254                 {
   2255                     num_attrs = 2;
   2256                 }
   2257 #endif
   2258 
   2259                 if (bta_dm_search_cb.service_index == BTA_USER_SERVICE_ID)
   2260                 {
   2261                     memcpy(&uuid, &bta_dm_search_cb.uuid, sizeof(tSDP_UUID));
   2262                 }
   2263 
   2264 
   2265                 APPL_TRACE_ERROR1("****************search UUID = %04x***********", uuid.uu.uuid16);
   2266                 //SDP_InitDiscoveryDb (bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1, &uuid, num_attrs, attr_list);
   2267                 SDP_InitDiscoveryDb (bta_dm_search_cb.p_sdp_db, BTA_DM_SDP_DB_SIZE, 1, &uuid, 0, NULL);
   2268 
   2269 
   2270                 memset(g_disc_raw_data_buf, 0, sizeof(g_disc_raw_data_buf));
   2271                 bta_dm_search_cb.p_sdp_db->raw_data = g_disc_raw_data_buf;
   2272 
   2273                 bta_dm_search_cb.p_sdp_db->raw_size = MAX_DISC_RAW_DATA_BUF;
   2274 
   2275                 if (!SDP_ServiceSearchAttributeRequest (bd_addr, bta_dm_search_cb.p_sdp_db, &bta_dm_sdp_callback))
   2276                 {
   2277                     /* if discovery not successful with this device
   2278                     proceed to next one */
   2279                     GKI_freebuf(bta_dm_search_cb.p_sdp_db);
   2280                     bta_dm_search_cb.p_sdp_db = NULL;
   2281                     bta_dm_search_cb.service_index = BTA_MAX_SERVICE_ID;
   2282 
   2283                 }
   2284                 else
   2285                 {
   2286 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
   2287                     if ((bta_dm_search_cb.service_index == BTA_BLE_SERVICE_ID &&
   2288                          bta_dm_search_cb.uuid_to_search == 0) ||
   2289                          bta_dm_search_cb.service_index != BTA_BLE_SERVICE_ID)
   2290 #endif
   2291                     bta_dm_search_cb.service_index++;
   2292                     return;
   2293                 }
   2294             }
   2295             else
   2296             {
   2297                 APPL_TRACE_ERROR0("#### Failed to allocate SDP DB buffer! ####");
   2298             }
   2299         }
   2300 
   2301         bta_dm_search_cb.service_index++;
   2302     }
   2303 
   2304     /* no more services to be discovered */
   2305     if(bta_dm_search_cb.service_index >= BTA_MAX_SERVICE_ID)
   2306     {
   2307         if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
   2308         {
   2309             p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
   2310             p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
   2311             bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
   2312             BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
   2313                     bta_dm_get_remname(), (BD_NAME_LEN-1));
   2314 
   2315             /* make sure the string is terminated */
   2316             p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
   2317 
   2318             bta_sys_sendmsg(p_msg);
   2319         }
   2320     }
   2321 }
   2322 
   2323 /*******************************************************************************
   2324 **
   2325 ** Function         bta_dm_discover_next_device
   2326 **
   2327 ** Description      Starts discovery on the next device in Inquiry data base
   2328 **
   2329 ** Returns          void
   2330 **
   2331 *******************************************************************************/
   2332 static void bta_dm_discover_next_device(void)
   2333 {
   2334 
   2335     tBTA_DM_MSG * p_msg;
   2336 
   2337     APPL_TRACE_DEBUG0("bta_dm_discover_next_device");
   2338 
   2339     /* searching next device on inquiry result */
   2340     if((bta_dm_search_cb.p_btm_inq_info = BTM_InqDbNext(bta_dm_search_cb.p_btm_inq_info)) != NULL)
   2341     {
   2342         bta_dm_search_cb.name_discover_done = FALSE;
   2343         bta_dm_search_cb.peer_name[0]       = 0;
   2344         bta_dm_discover_device(bta_dm_search_cb.p_btm_inq_info->results.remote_bd_addr);
   2345     }
   2346     else
   2347     {
   2348         /* no devices, search complete */
   2349         bta_dm_search_cb.services = 0;
   2350 
   2351         if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
   2352         {
   2353             p_msg->hdr.event          = BTA_DM_SEARCH_CMPL_EVT;
   2354             p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT;
   2355             bta_sys_sendmsg(p_msg);
   2356         }
   2357     }
   2358 }
   2359 
   2360 /*******************************************************************************
   2361 **
   2362 ** Function         bta_dm_discover_device
   2363 **
   2364 ** Description      Starts name and service discovery on the device
   2365 **
   2366 ** Returns          void
   2367 **
   2368 *******************************************************************************/
   2369 static void bta_dm_discover_device(BD_ADDR remote_bd_addr)
   2370 {
   2371     tBTA_DM_MSG * p_msg;
   2372 
   2373     APPL_TRACE_DEBUG6("bta_dm_discover_device, BDA:0x%02X%02X%02X%02X%02X%02X",
   2374                         remote_bd_addr[0],remote_bd_addr[1],
   2375                         remote_bd_addr[2],remote_bd_addr[3],
   2376                         remote_bd_addr[4],remote_bd_addr[5]);
   2377 
   2378     bdcpy(bta_dm_search_cb.peer_bdaddr, remote_bd_addr);
   2379 
   2380     APPL_TRACE_DEBUG2("bta_dm_discover_device name_discover_done = %d p_btm_inq_info 0x%x ",
   2381                         bta_dm_search_cb.name_discover_done,
   2382                         bta_dm_search_cb.p_btm_inq_info
   2383                         );
   2384     if ( bta_dm_search_cb.p_btm_inq_info ) {
   2385 
   2386         APPL_TRACE_DEBUG1("bta_dm_discover_device appl_knows_rem_name %d",
   2387                             bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name
   2388                             );
   2389     }
   2390 
   2391     /* if name discovery is not done and application needs remote name */
   2392     if ((!bta_dm_search_cb.name_discover_done)
   2393        && (( bta_dm_search_cb.p_btm_inq_info == NULL )
   2394             ||(bta_dm_search_cb.p_btm_inq_info && (!bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name))))
   2395     {
   2396         if( bta_dm_read_remote_device_name(bta_dm_search_cb.peer_bdaddr) == TRUE )
   2397         {
   2398             return;
   2399         }
   2400         else
   2401         {
   2402             /* starting name discovery failed */
   2403             bta_dm_search_cb.name_discover_done = TRUE;
   2404         }
   2405     }
   2406 
   2407     /* if application wants to discover service */
   2408     if ( bta_dm_search_cb.services )
   2409     {
   2410         /* initialize variables */
   2411         bta_dm_search_cb.service_index      = 0;
   2412         bta_dm_search_cb.services_found     = 0;
   2413         bta_dm_search_cb.services_to_search = bta_dm_search_cb.services;
   2414 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
   2415         bta_dm_search_cb.uuid_to_search     = bta_dm_search_cb.num_uuid;
   2416 #endif
   2417 #if ( BTM_EIR_CLIENT_INCLUDED == TRUE )
   2418         if ((bta_dm_search_cb.p_btm_inq_info != NULL) &&
   2419 			bta_dm_search_cb.services != BTA_USER_SERVICE_MASK
   2420             &&(bta_dm_search_cb.sdp_search == FALSE))
   2421         {
   2422             /* check if EIR provides the information of supported services */
   2423             bta_dm_eir_search_services( &bta_dm_search_cb.p_btm_inq_info->results,
   2424                                         &bta_dm_search_cb.services_to_search,
   2425                                         &bta_dm_search_cb.services_found );
   2426         }
   2427 
   2428         /* if seaching with EIR is not completed */
   2429         if(bta_dm_search_cb.services_to_search)
   2430 #endif
   2431         {
   2432             /* check whether connection already exists to the device
   2433                if connection exists, we don't have to wait for ACL
   2434                link to go down to start search on next device */
   2435             if(BTM_IsAclConnectionUp(bta_dm_search_cb.peer_bdaddr))
   2436                 bta_dm_search_cb.wait_disc = FALSE;
   2437             else
   2438                 bta_dm_search_cb.wait_disc = TRUE;
   2439 
   2440 #if (BLE_INCLUDED == TRUE && (defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE))
   2441             if ( bta_dm_search_cb.p_btm_inq_info )
   2442             {
   2443                 APPL_TRACE_DEBUG3("bta_dm_discover_device p_btm_inq_info 0x%x results.device_type 0x%x services_to_search 0x%x",
   2444                                     bta_dm_search_cb.p_btm_inq_info,
   2445                                     bta_dm_search_cb.p_btm_inq_info->results.device_type,
   2446                                     bta_dm_search_cb.services_to_search
   2447                                     );
   2448             }
   2449             if (BTM_UseLeLink(bta_dm_search_cb.peer_bdaddr))
   2450             /*
   2451             if ( bta_dm_search_cb.p_btm_inq_info != NULL &&
   2452                  bta_dm_search_cb.p_btm_inq_info->results.device_type == BT_DEVICE_TYPE_BLE &&
   2453                  (bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK))*/
   2454             {
   2455                 if (bta_dm_search_cb.services_to_search & BTA_BLE_SERVICE_MASK)
   2456                 {
   2457                     //set the raw data buffer here
   2458                     memset(g_disc_raw_data_buf, 0, sizeof(g_disc_raw_data_buf));
   2459                     bta_dm_search_cb.p_ble_rawdata = g_disc_raw_data_buf;
   2460 
   2461                     bta_dm_search_cb.ble_raw_size = MAX_DISC_RAW_DATA_BUF;
   2462                     bta_dm_search_cb.ble_raw_used = 0;
   2463 
   2464                     /* start GATT for service discovery */
   2465                     btm_dm_start_gatt_discovery(bta_dm_search_cb.peer_bdaddr);
   2466                     return;
   2467                 }
   2468             }
   2469             else
   2470 #endif
   2471             {
   2472             bta_dm_search_cb.sdp_results = FALSE;
   2473             bta_dm_find_services(bta_dm_search_cb.peer_bdaddr);
   2474 
   2475             return;
   2476             }
   2477         }
   2478     }
   2479 
   2480     /* name discovery and service discovery are done for this device */
   2481     if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
   2482     {
   2483         p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
   2484         /* initialize the data structure - includes p_raw_data and raw_data_size */
   2485         memset(&(p_msg->disc_result.result), 0, sizeof(tBTA_DM_DISC_RES));
   2486         p_msg->disc_result.result.disc_res.result = BTA_SUCCESS;
   2487         p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
   2488         bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
   2489         BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name,  sizeof(BD_NAME),
   2490                       (char*)bta_dm_search_cb.peer_name, (BD_NAME_LEN-1));
   2491 
   2492         /* make sure the string is terminated */
   2493         p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
   2494 
   2495         bta_sys_sendmsg(p_msg);
   2496     }
   2497 }
   2498 
   2499 /*******************************************************************************
   2500 **
   2501 ** Function         bta_dm_sdp_callback
   2502 **
   2503 ** Description      Callback from sdp with discovery status
   2504 **
   2505 ** Returns          void
   2506 **
   2507 *******************************************************************************/
   2508 static void bta_dm_sdp_callback (UINT16 sdp_status)
   2509 {
   2510 
   2511     tBTA_DM_SDP_RESULT * p_msg;
   2512 
   2513     if ((p_msg = (tBTA_DM_SDP_RESULT *) GKI_getbuf(sizeof(tBTA_DM_SDP_RESULT))) != NULL)
   2514     {
   2515         p_msg->hdr.event = BTA_DM_SDP_RESULT_EVT;
   2516         p_msg->sdp_result = sdp_status;
   2517         bta_sys_sendmsg(p_msg);
   2518 
   2519     }
   2520 }
   2521 
   2522 /*******************************************************************************
   2523 **
   2524 ** Function         bta_dm_inq_results_cb
   2525 **
   2526 ** Description      Inquiry results callback from BTM
   2527 **
   2528 ** Returns          void
   2529 **
   2530 *******************************************************************************/
   2531 static void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir)
   2532 {
   2533 
   2534     tBTA_DM_SEARCH     result;
   2535     tBTM_INQ_INFO      *p_inq_info;
   2536     UINT16             service_class;
   2537 
   2538     bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr);
   2539     memcpy(result.inq_res.dev_class, p_inq->dev_class, DEV_CLASS_LEN);
   2540     BTM_COD_SERVICE_CLASS(service_class, p_inq->dev_class);
   2541     result.inq_res.is_limited = (service_class & BTM_COD_SERVICE_LMTD_DISCOVER)?TRUE:FALSE;
   2542     result.inq_res.rssi = p_inq->rssi;
   2543 
   2544 #if (BLE_INCLUDED == TRUE)
   2545     result.inq_res.ble_addr_type    = p_inq->ble_addr_type;
   2546     result.inq_res.inq_result_type  = p_inq->inq_result_type;
   2547     result.inq_res.device_type      = p_inq->device_type;
   2548 
   2549 #endif
   2550 
   2551     /* application will parse EIR to find out remote device name */
   2552     result.inq_res.p_eir = p_eir;
   2553 
   2554     if((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL)
   2555     {
   2556         /* initialize remt_name_not_required to FALSE so that we get the name by default */
   2557         result.inq_res.remt_name_not_required = FALSE;
   2558 
   2559     }
   2560 
   2561     if(bta_dm_search_cb.p_search_cback)
   2562         bta_dm_search_cb.p_search_cback(BTA_DM_INQ_RES_EVT, &result);
   2563 
   2564     if(p_inq_info)
   2565     {
   2566         /* application indicates if it knows the remote name, inside the callback
   2567          copy that to the inquiry data base*/
   2568         if(result.inq_res.remt_name_not_required)
   2569             p_inq_info->appl_knows_rem_name = TRUE;
   2570 
   2571     }
   2572 
   2573 
   2574 }
   2575 
   2576 
   2577 /*******************************************************************************
   2578 **
   2579 ** Function         bta_dm_inq_cmpl_cb
   2580 **
   2581 ** Description      Inquiry complete callback from BTM
   2582 **
   2583 ** Returns          void
   2584 **
   2585 *******************************************************************************/
   2586 static void bta_dm_inq_cmpl_cb (void * p_result)
   2587 {
   2588 
   2589     tBTA_DM_MSG * p_msg;
   2590 
   2591     APPL_TRACE_DEBUG0("bta_dm_inq_cmpl_cb");
   2592     if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
   2593     {
   2594         p_msg->inq_cmpl.hdr.event = BTA_DM_INQUIRY_CMPL_EVT;
   2595         p_msg->inq_cmpl.num = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp;
   2596         bta_sys_sendmsg(p_msg);
   2597 
   2598     }
   2599 
   2600 
   2601 }
   2602 
   2603 /*******************************************************************************
   2604 **
   2605 ** Function         bta_dm_service_search_remname_cback
   2606 **
   2607 ** Description      Remote name call back from BTM during service discovery
   2608 **
   2609 ** Returns          void
   2610 **
   2611 *******************************************************************************/
   2612 static void bta_dm_service_search_remname_cback (BD_ADDR bd_addr, DEV_CLASS dc, BD_NAME bd_name)
   2613 {
   2614     tBTM_REMOTE_DEV_NAME    rem_name;
   2615     tBTM_STATUS             btm_status;
   2616 
   2617     APPL_TRACE_DEBUG1("bta_dm_service_search_remname_cback name=<%s>", bd_name);
   2618 
   2619     /* if this is what we are looking for */
   2620     if (!bdcmp( bta_dm_search_cb.peer_bdaddr, bd_addr))
   2621     {
   2622         rem_name.length = strlen((char*)bd_name);
   2623         if (rem_name.length > (BD_NAME_LEN-1))
   2624         {
   2625             rem_name.length = (BD_NAME_LEN-1);
   2626             rem_name.remote_bd_name[(BD_NAME_LEN-1)] = 0;
   2627         }
   2628         BCM_STRNCPY_S((char*)rem_name.remote_bd_name,  sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1));
   2629         rem_name.status = BTM_SUCCESS;
   2630 
   2631         bta_dm_remname_cback(&rem_name);
   2632     }
   2633     else
   2634     {
   2635         /* get name of device */
   2636         btm_status = BTM_ReadRemoteDeviceName (bta_dm_search_cb.peer_bdaddr,
   2637                                                 (tBTM_CMPL_CB *) bta_dm_remname_cback);
   2638         if ( btm_status == BTM_BUSY )
   2639         {
   2640             /* wait for next chance(notification of remote name discovery done) */
   2641             APPL_TRACE_DEBUG0("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName is busy");
   2642         }
   2643         else if ( btm_status != BTM_CMD_STARTED )
   2644         {
   2645             /* if failed to start getting remote name then continue */
   2646             APPL_TRACE_WARNING1("bta_dm_service_search_remname_cback: BTM_ReadRemoteDeviceName returns 0x%02X", btm_status);
   2647 
   2648             rem_name.length = 0;
   2649             rem_name.remote_bd_name[0] = 0;
   2650             rem_name.status = btm_status;
   2651             bta_dm_remname_cback(&rem_name);
   2652         }
   2653     }
   2654 }
   2655 
   2656 
   2657 /*******************************************************************************
   2658 **
   2659 ** Function         bta_dm_remname_cback
   2660 **
   2661 ** Description      Remote name complete call back from BTM
   2662 **
   2663 ** Returns          void
   2664 **
   2665 *******************************************************************************/
   2666 static void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name)
   2667 {
   2668     tBTA_DM_REM_NAME * p_msg;
   2669 
   2670     APPL_TRACE_DEBUG2("bta_dm_remname_cback len = %d name=<%s>", p_remote_name->length,
   2671                       p_remote_name->remote_bd_name);
   2672 
   2673     /* remote name discovery is done but it could be failed */
   2674     bta_dm_search_cb.name_discover_done = TRUE;
   2675     BCM_STRNCPY_S((char*)bta_dm_search_cb.peer_name, sizeof(BD_NAME), (char*)p_remote_name->remote_bd_name, (BD_NAME_LEN));
   2676     bta_dm_search_cb.peer_name[BD_NAME_LEN]=0;
   2677 
   2678     BTM_SecDeleteRmtNameNotifyCallback(&bta_dm_service_search_remname_cback);
   2679 #if BLE_INCLUDED == TRUE
   2680     if (BTM_UseLeLink(bta_dm_search_cb.peer_bdaddr))
   2681         GAP_BleReadPeerPrefConnParams (bta_dm_search_cb.peer_bdaddr);
   2682 #endif
   2683     if ((p_msg = (tBTA_DM_REM_NAME *) GKI_getbuf(sizeof(tBTA_DM_REM_NAME))) != NULL)
   2684     {
   2685         bdcpy (p_msg->result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
   2686         BCM_STRNCPY_S((char*)p_msg->result.disc_res.bd_name, sizeof(BD_NAME), (char*)p_remote_name->remote_bd_name, (BD_NAME_LEN));
   2687 
   2688         /* make sure the string is null terminated */
   2689         p_msg->result.disc_res.bd_name[BD_NAME_LEN] = 0;
   2690 
   2691         p_msg->hdr.event = BTA_DM_REMT_NAME_EVT;
   2692         bta_sys_sendmsg(p_msg);
   2693 
   2694     }
   2695 }
   2696 
   2697 /*******************************************************************************
   2698 **
   2699 ** Function         bta_dm_authorize_cback
   2700 **
   2701 ** Description      cback requesting authorization
   2702 **
   2703 ** Returns          void
   2704 **
   2705 *******************************************************************************/
   2706 static UINT8 bta_dm_authorize_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name,
   2707                                      UINT8 *service_name, UINT8 service_id, BOOLEAN is_originator)
   2708 {
   2709     tBTA_DM_SEC sec_event;
   2710     UINT8       index = 1;
   2711 
   2712     bdcpy(sec_event.authorize.bd_addr, bd_addr);
   2713     memcpy(sec_event.authorize.dev_class, dev_class, DEV_CLASS_LEN);
   2714 
   2715     BCM_STRNCPY_S((char*)sec_event.authorize.bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1));
   2716 
   2717     /* make sure the string is null terminated */
   2718     sec_event.authorize.bd_name[BD_NAME_LEN-1] = 0;
   2719 
   2720 #if ( defined(BTA_JV_INCLUDED) && BTA_JV_INCLUDED == TRUE )
   2721     sec_event.authorize.service = service_id;
   2722 #endif
   2723 
   2724     while(index < BTA_MAX_SERVICE_ID)
   2725     {
   2726         /* get the BTA service id corresponding to BTM id */
   2727         if(bta_service_id_to_btm_srv_id_lkup_tbl[index] == service_id)
   2728         {
   2729             sec_event.authorize.service = index;
   2730             break;
   2731         }
   2732         index++;
   2733     }
   2734 
   2735 
   2736     /* if supported service callback otherwise not authorized */
   2737     if(bta_dm_cb.p_sec_cback && (index < BTA_MAX_SERVICE_ID
   2738 #if ( defined(BTA_JV_INCLUDED) && BTA_JV_INCLUDED == TRUE )
   2739         /* pass through JV service ID */
   2740         || (service_id >= BTA_FIRST_JV_SERVICE_ID && service_id <= BTA_LAST_JV_SERVICE_ID)
   2741 #endif
   2742         ))
   2743     {
   2744         bta_dm_cb.p_sec_cback(BTA_DM_AUTHORIZE_EVT, &sec_event);
   2745         return BTM_CMD_STARTED;
   2746     }
   2747     else
   2748     {
   2749         return BTM_NOT_AUTHORIZED;
   2750     }
   2751 }
   2752 
   2753 
   2754 
   2755 
   2756 
   2757 /*******************************************************************************
   2758 **
   2759 ** Function         bta_dm_pinname_cback
   2760 **
   2761 ** Description      Callback requesting pin_key
   2762 **
   2763 ** Returns          void
   2764 **
   2765 *******************************************************************************/
   2766 static void bta_dm_pinname_cback (void *p_data)
   2767 {
   2768     tBTM_REMOTE_DEV_NAME *p_result = (tBTM_REMOTE_DEV_NAME *)p_data;
   2769     tBTA_DM_SEC           sec_event;
   2770     UINT32                bytes_to_copy;
   2771     tBTA_DM_SEC_EVT       event = bta_dm_cb.pin_evt;
   2772 
   2773     if (BTA_DM_SP_CFM_REQ_EVT == event)
   2774     {
   2775         /* Retrieved saved device class and bd_addr */
   2776         bdcpy(sec_event.cfm_req.bd_addr, bta_dm_cb.pin_bd_addr);
   2777         BTA_COPY_DEVICE_CLASS(sec_event.cfm_req.dev_class, bta_dm_cb.pin_dev_class);
   2778 
   2779         if (p_result && p_result->status == BTM_SUCCESS)
   2780         {
   2781             bytes_to_copy = (p_result->length < (BD_NAME_LEN-1))
   2782             ? p_result->length : (BD_NAME_LEN-1);
   2783             memcpy(sec_event.cfm_req.bd_name, p_result->remote_bd_name, bytes_to_copy);
   2784             sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0;
   2785         }
   2786         else    /* No name found */
   2787             sec_event.cfm_req.bd_name[0] = 0;
   2788 
   2789         sec_event.key_notif.passkey    = bta_dm_cb.num_val; /* get PIN code numeric number */
   2790 
   2791         /* 1 additional event data fields for this event */
   2792         sec_event.cfm_req.just_works = bta_dm_cb.just_works;
   2793     }
   2794     else
   2795     {
   2796         /* Retrieved saved device class and bd_addr */
   2797         bdcpy(sec_event.pin_req.bd_addr, bta_dm_cb.pin_bd_addr);
   2798         BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, bta_dm_cb.pin_dev_class);
   2799 
   2800         if (p_result && p_result->status == BTM_SUCCESS)
   2801         {
   2802             bytes_to_copy = (p_result->length < (BD_NAME_LEN-1))
   2803             ? p_result->length : (BD_NAME_LEN-1);
   2804             memcpy(sec_event.pin_req.bd_name, p_result->remote_bd_name, bytes_to_copy);
   2805             sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0;
   2806         }
   2807         else    /* No name found */
   2808             sec_event.pin_req.bd_name[0] = 0;
   2809 
   2810         event = bta_dm_cb.pin_evt;
   2811         sec_event.key_notif.passkey    = bta_dm_cb.num_val; /* get PIN code numeric number */
   2812     }
   2813 
   2814     if( bta_dm_cb.p_sec_cback )
   2815         bta_dm_cb.p_sec_cback(event, &sec_event);
   2816 }
   2817 
   2818 
   2819 
   2820 /*******************************************************************************
   2821 **
   2822 ** Function         bta_dm_pin_cback
   2823 **
   2824 ** Description      Callback requesting pin_key
   2825 **
   2826 ** Returns          void
   2827 **
   2828 *******************************************************************************/
   2829 static UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name)
   2830 {
   2831     tBTA_DM_SEC sec_event;
   2832 
   2833     if (!bta_dm_cb.p_sec_cback)
   2834         return BTM_NOT_AUTHORIZED;
   2835 
   2836     /* If the device name is not known, save bdaddr and devclass and initiate a name request */
   2837     if (bd_name[0] == 0)
   2838     {
   2839         bta_dm_cb.pin_evt = BTA_DM_PIN_REQ_EVT;
   2840         bdcpy(bta_dm_cb.pin_bd_addr, bd_addr);
   2841         BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, dev_class);
   2842         if ((BTM_ReadRemoteDeviceName(bd_addr, bta_dm_pinname_cback)) == BTM_CMD_STARTED)
   2843             return BTM_CMD_STARTED;
   2844 
   2845         APPL_TRACE_WARNING0(" bta_dm_pin_cback() -> Failed to start Remote Name Request  ");
   2846     }
   2847 
   2848     bdcpy(sec_event.pin_req.bd_addr, bd_addr);
   2849     BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, dev_class);
   2850     BCM_STRNCPY_S((char*)sec_event.pin_req.bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1));
   2851     sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0;
   2852 
   2853     bta_dm_cb.p_sec_cback(BTA_DM_PIN_REQ_EVT, &sec_event);
   2854     return BTM_CMD_STARTED;
   2855 }
   2856 
   2857 
   2858 
   2859 /*******************************************************************************
   2860 **
   2861 ** Function         bta_dm_link_key_request_cback
   2862 **
   2863 ** Description      Callback requesting linkkey
   2864 **
   2865 ** Returns          void
   2866 **
   2867 *******************************************************************************/
   2868 static UINT8  bta_dm_link_key_request_cback (BD_ADDR bd_addr, LINK_KEY key)
   2869 {
   2870     /* Application passes all link key to
   2871     BTM during initialization using add_device
   2872     API. If BTM doesn't have the link key in it's
   2873     data base, that's because application doesn't
   2874     it */
   2875 
   2876     return BTM_NOT_AUTHORIZED;
   2877 }
   2878 
   2879 
   2880 
   2881 
   2882 
   2883 /*******************************************************************************
   2884 **
   2885 ** Function         bta_dm_new_link_key_cback
   2886 **
   2887 ** Description      Callback from BTM to notify new link key
   2888 **
   2889 ** Returns          void
   2890 **
   2891 *******************************************************************************/
   2892 static UINT8  bta_dm_new_link_key_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,
   2893                                         BD_NAME bd_name, LINK_KEY key, UINT8 key_type)
   2894 {
   2895     tBTA_DM_SEC sec_event;
   2896     tBTA_DM_AUTH_CMPL *p_auth_cmpl;
   2897     UINT8             event;
   2898 
   2899     memset (&sec_event, 0, sizeof(tBTA_DM_SEC));
   2900 
   2901     /* Not AMP Key type */
   2902     if (key_type != HCI_LKEY_TYPE_AMP_WIFI && key_type != HCI_LKEY_TYPE_AMP_UWB)
   2903     {
   2904         event = BTA_DM_AUTH_CMPL_EVT;
   2905         p_auth_cmpl = &sec_event.auth_cmpl;
   2906 
   2907         bdcpy(p_auth_cmpl->bd_addr, bd_addr);
   2908 
   2909         memcpy(p_auth_cmpl->bd_name, bd_name, (BD_NAME_LEN-1));
   2910         p_auth_cmpl->bd_name[BD_NAME_LEN-1] = 0;
   2911 
   2912         p_auth_cmpl->key_present = TRUE;
   2913         p_auth_cmpl->key_type = key_type;
   2914         p_auth_cmpl->success = TRUE;
   2915 
   2916         memcpy(p_auth_cmpl->key, key, LINK_KEY_LEN);
   2917         sec_event.auth_cmpl.fail_reason = HCI_SUCCESS;
   2918 
   2919         if(bta_dm_cb.p_sec_cback)
   2920         {
   2921             bta_dm_cb.p_sec_cback(event, &sec_event);
   2922         }
   2923     }
   2924     else
   2925     {
   2926         APPL_TRACE_WARNING0(" bta_dm_new_link_key_cback() Received AMP Key??  ");
   2927     }
   2928 
   2929     return BTM_CMD_STARTED;
   2930 }
   2931 
   2932 
   2933 /*******************************************************************************
   2934 **
   2935 ** Function         bta_dm_authentication_complete_cback
   2936 **
   2937 ** Description      Authentication complete callback from BTM
   2938 **
   2939 ** Returns          void
   2940 **
   2941 *******************************************************************************/
   2942 static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,BD_NAME bd_name, int result)
   2943 {
   2944 
   2945     tBTA_DM_SEC sec_event;
   2946 
   2947     if(result != BTM_SUCCESS)
   2948     {
   2949         memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
   2950         bdcpy(sec_event.auth_cmpl.bd_addr, bd_addr);
   2951 
   2952         memcpy(sec_event.auth_cmpl.bd_name, bd_name, (BD_NAME_LEN-1));
   2953         sec_event.auth_cmpl.bd_name[BD_NAME_LEN-1] = 0;
   2954 
   2955 /*      taken care of by memset [above]
   2956         sec_event.auth_cmpl.key_present = FALSE;
   2957         sec_event.auth_cmpl.success = FALSE;
   2958 */
   2959         sec_event.auth_cmpl.fail_reason = (UINT8)result;
   2960         if(bta_dm_cb.p_sec_cback)
   2961         {
   2962             bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
   2963         }
   2964         /* delete this device entry from Sec Dev DB */
   2965         bta_dm_remove_sec_dev_entry(bd_addr);
   2966 
   2967     }
   2968 
   2969     return BTM_SUCCESS;
   2970 }
   2971 
   2972 /*******************************************************************************
   2973 **
   2974 ** Function         bta_dm_sp_cback
   2975 **
   2976 ** Description      simple pairing callback from BTM
   2977 **
   2978 ** Returns          void
   2979 **
   2980 *******************************************************************************/
   2981 static UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data)
   2982 {
   2983     tBTM_STATUS status = BTM_CMD_STARTED;
   2984     tBTA_DM_SEC sec_event;
   2985     tBTA_DM_SEC_EVT pin_evt = BTA_DM_SP_KEY_NOTIF_EVT;
   2986 
   2987     APPL_TRACE_EVENT1("bta_dm_sp_cback: %d", event);
   2988     if (!bta_dm_cb.p_sec_cback)
   2989         return BTM_NOT_AUTHORIZED;
   2990 
   2991     /* TODO_SP */
   2992     switch(event)
   2993     {
   2994     case BTM_SP_IO_REQ_EVT:
   2995 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
   2996         /* translate auth_req */
   2997         bta_dm_co_io_req(p_data->io_req.bd_addr, &p_data->io_req.io_cap,
   2998             &p_data->io_req.oob_data, &p_data->io_req.auth_req, p_data->io_req.is_orig);
   2999 #endif
   3000 #if BTM_OOB_INCLUDED == FALSE
   3001         status = BTM_SUCCESS;
   3002 #endif
   3003 
   3004         APPL_TRACE_EVENT2("io mitm: %d oob_data:%d", p_data->io_req.auth_req, p_data->io_req.oob_data);
   3005         break;
   3006     case BTM_SP_IO_RSP_EVT:
   3007 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
   3008         bta_dm_co_io_rsp(p_data->io_rsp.bd_addr, p_data->io_rsp.io_cap,
   3009                          p_data->io_rsp.oob_data, p_data->io_rsp.auth_req );
   3010 #endif
   3011         break;
   3012 
   3013     case BTM_SP_CFM_REQ_EVT:
   3014         pin_evt = BTA_DM_SP_CFM_REQ_EVT;
   3015         bta_dm_cb.just_works = sec_event.cfm_req.just_works = p_data->cfm_req.just_works;
   3016         sec_event.cfm_req.loc_auth_req = p_data->cfm_req.loc_auth_req;
   3017         sec_event.cfm_req.rmt_auth_req = p_data->cfm_req.rmt_auth_req;
   3018         sec_event.cfm_req.loc_io_caps = p_data->cfm_req.loc_io_caps;
   3019         sec_event.cfm_req.rmt_io_caps = p_data->cfm_req.rmt_io_caps;
   3020         /* continue to next case */
   3021 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
   3022     /* Passkey entry mode, mobile device with output capability is very
   3023         unlikely to receive key request, so skip this event */
   3024     /*case BTM_SP_KEY_REQ_EVT: */
   3025     case BTM_SP_KEY_NOTIF_EVT:
   3026 #endif
   3027         bta_dm_cb.num_val = sec_event.key_notif.passkey = p_data->key_notif.passkey;
   3028         /* If the device name is not known, save bdaddr and devclass and initiate a name request */
   3029         if (p_data->key_notif.bd_name[0] == 0)
   3030         {
   3031             bta_dm_cb.pin_evt = pin_evt;
   3032             bdcpy(bta_dm_cb.pin_bd_addr, p_data->key_notif.bd_addr);
   3033             BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->key_notif.dev_class);
   3034             if ((BTM_ReadRemoteDeviceName(p_data->key_notif.bd_addr, bta_dm_pinname_cback)) == BTM_CMD_STARTED)
   3035                 return BTM_CMD_STARTED;
   3036 
   3037             APPL_TRACE_WARNING0(" bta_dm_sp_cback() -> Failed to start Remote Name Request  ");
   3038         }
   3039         bdcpy(sec_event.key_notif.bd_addr, p_data->key_notif.bd_addr);
   3040         BTA_COPY_DEVICE_CLASS(sec_event.key_notif.dev_class, p_data->key_notif.dev_class);
   3041             BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME), (char*)p_data->key_notif.bd_name, (BD_NAME_LEN-1));
   3042             sec_event.key_notif.bd_name[BD_NAME_LEN-1] = 0;
   3043 
   3044         bta_dm_cb.p_sec_cback(pin_evt, &sec_event);
   3045 
   3046         break;
   3047 
   3048 #if BTM_OOB_INCLUDED == TRUE
   3049     case BTM_SP_LOC_OOB_EVT:
   3050         bta_dm_co_loc_oob((BOOLEAN)(p_data->loc_oob.status == BTM_SUCCESS),
   3051             p_data->loc_oob.c, p_data->loc_oob.r);
   3052         break;
   3053 
   3054     case BTM_SP_RMT_OOB_EVT:
   3055         /* If the device name is not known, save bdaddr and devclass and initiate a name request */
   3056         if (p_data->rmt_oob.bd_name[0] == 0)
   3057         {
   3058             bta_dm_cb.pin_evt = BTA_DM_SP_RMT_OOB_EVT;
   3059             bdcpy(bta_dm_cb.pin_bd_addr, p_data->rmt_oob.bd_addr);
   3060             BTA_COPY_DEVICE_CLASS(bta_dm_cb.pin_dev_class, p_data->rmt_oob.dev_class);
   3061             if ((BTM_ReadRemoteDeviceName(p_data->rmt_oob.bd_addr, bta_dm_pinname_cback)) == BTM_CMD_STARTED)
   3062                 return BTM_CMD_STARTED;
   3063 
   3064             APPL_TRACE_WARNING0(" bta_dm_sp_cback() -> Failed to start Remote Name Request  ");
   3065         }
   3066         bdcpy(sec_event.rmt_oob.bd_addr, p_data->rmt_oob.bd_addr);
   3067         BTA_COPY_DEVICE_CLASS(sec_event.rmt_oob.dev_class, p_data->rmt_oob.dev_class);
   3068             BCM_STRNCPY_S((char*)sec_event.rmt_oob.bd_name, sizeof(BD_NAME), (char*)p_data->rmt_oob.bd_name, (BD_NAME_LEN-1));
   3069             sec_event.rmt_oob.bd_name[BD_NAME_LEN-1] = 0;
   3070 
   3071         bta_dm_cb.p_sec_cback(BTA_DM_SP_RMT_OOB_EVT, &sec_event);
   3072 
   3073         bta_dm_co_rmt_oob(p_data->rmt_oob.bd_addr);
   3074         break;
   3075 #endif
   3076     case BTM_SP_COMPLT_EVT:
   3077         /* do not report this event - handled by link_key_callback or auth_complete_callback */
   3078         break;
   3079 
   3080     case BTM_SP_KEYPRESS_EVT:
   3081         memcpy(&sec_event.key_press, &p_data->key_press, sizeof(tBTM_SP_KEYPRESS));
   3082         bta_dm_cb.p_sec_cback(BTA_DM_SP_KEYPRESS_EVT, &sec_event);
   3083         break;
   3084 
   3085     case BTM_SP_UPGRADE_EVT:
   3086         bta_dm_co_lk_upgrade(p_data->upgrade.bd_addr, &p_data->upgrade.upgrade );
   3087         break;
   3088 
   3089     default:
   3090         status = BTM_NOT_AUTHORIZED;
   3091         break;
   3092     }
   3093     APPL_TRACE_EVENT1("dm status: %d", status);
   3094     return status;
   3095 }
   3096 
   3097 /*******************************************************************************
   3098 **
   3099 ** Function         bta_dm_local_name_cback
   3100 **
   3101 ** Description      Callback from btm after local name is read
   3102 **
   3103 **
   3104 ** Returns          void
   3105 **
   3106 *******************************************************************************/
   3107 static void bta_dm_local_name_cback(UINT8 *p_name)
   3108 {
   3109     tBTA_DM_SEC sec_event;
   3110 
   3111     BTM_GetLocalDeviceAddr(sec_event.enable.bd_addr);
   3112     sec_event.enable.status = BTA_SUCCESS;
   3113 
   3114     if(bta_dm_cb.p_sec_cback)
   3115         bta_dm_cb.p_sec_cback(BTA_DM_ENABLE_EVT, &sec_event);
   3116 }
   3117 
   3118 /*******************************************************************************
   3119 **
   3120 ** Function         bta_dm_signal_strength
   3121 **
   3122 ** Description      Callback from btm after local bdaddr is read
   3123 **
   3124 **
   3125 ** Returns          void
   3126 **
   3127 *******************************************************************************/
   3128 void bta_dm_signal_strength(tBTA_DM_MSG *p_data)
   3129 {
   3130 
   3131     if(p_data->sig_strength.start)
   3132     {
   3133         bta_dm_cb.signal_strength_mask = p_data->sig_strength.mask;
   3134         bta_dm_cb.signal_strength_period = p_data->sig_strength.period;
   3135         bta_dm_signal_strength_timer_cback(NULL);
   3136     }
   3137     else
   3138     {
   3139         bta_sys_stop_timer(&bta_dm_cb.signal_strength_timer);
   3140     }
   3141 
   3142 }
   3143 /*******************************************************************************
   3144 **
   3145 ** Function         bta_dm_signal_strength_timer_cback
   3146 **
   3147 ** Description      Periodic timer callback to read signal strength
   3148 **
   3149 **
   3150 ** Returns          void
   3151 **
   3152 *******************************************************************************/
   3153 static void bta_dm_signal_strength_timer_cback (TIMER_LIST_ENT *p_tle)
   3154 {
   3155 
   3156     UINT8 i;
   3157 
   3158     if(bta_dm_cb.signal_strength_mask & BTA_SIG_STRENGTH_RSSI_MASK)
   3159     {
   3160         for(i=0; i<bta_dm_cb.device_list.count; i++)
   3161         {
   3162             BTM_ReadRSSI (bta_dm_cb.device_list.peer_device[i].peer_bdaddr, (tBTM_CMPL_CB *)bta_dm_rssi_cback);
   3163 
   3164         }
   3165     }
   3166     if(bta_dm_cb.signal_strength_mask & BTA_SIG_STRENGTH_LINK_QUALITY_MASK)
   3167     {
   3168 
   3169         for(i=0; i<bta_dm_cb.device_list.count; i++)
   3170         {
   3171             BTM_ReadLinkQuality (bta_dm_cb.device_list.peer_device[i].peer_bdaddr, (tBTM_CMPL_CB *)bta_dm_link_quality_cback);
   3172         }
   3173 
   3174     }
   3175 
   3176     if(bta_dm_cb.signal_strength_period)
   3177     {
   3178         bta_dm_cb.signal_strength_timer.p_cback = (TIMER_CBACK*)&bta_dm_signal_strength_timer_cback;
   3179         bta_sys_start_timer(&bta_dm_cb.signal_strength_timer, 0, (UINT32)1000*bta_dm_cb.signal_strength_period);
   3180     }
   3181 }
   3182 
   3183 
   3184 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
   3185 /*******************************************************************************
   3186 **
   3187 ** Function         bta_dm_bl_change_cback
   3188 **
   3189 ** Description      Callback from btm when acl connection goes up or down
   3190 **
   3191 **
   3192 ** Returns          void
   3193 **
   3194 *******************************************************************************/
   3195 static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data)
   3196 {
   3197     tBTA_DM_ACL_CHANGE * p_msg;
   3198 
   3199     if ((p_msg = (tBTA_DM_ACL_CHANGE *) GKI_getbuf(sizeof(tBTA_DM_ACL_CHANGE))) != NULL)
   3200     {
   3201         p_msg->event = p_data->event;
   3202         p_msg->is_new = FALSE;
   3203 
   3204         switch(p_msg->event)
   3205         {
   3206         case BTM_BL_CONN_EVT:
   3207             p_msg->is_new = TRUE;
   3208             bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
   3209             break;
   3210         case BTM_BL_DISCN_EVT:
   3211             bdcpy(p_msg->bd_addr, p_data->discn.p_bda);
   3212             break;
   3213         case BTM_BL_UPDATE_EVT:
   3214             p_msg->busy_level = p_data->update.busy_level;
   3215             p_msg->busy_level_flags = p_data->update.busy_level_flags;
   3216             break;
   3217         case BTM_BL_ROLE_CHG_EVT:
   3218             p_msg->new_role = p_data->role_chg.new_role;
   3219             p_msg->hci_status = p_data->role_chg.hci_status;
   3220             bdcpy(p_msg->bd_addr, p_data->role_chg.p_bda);
   3221             break;
   3222             case BTM_BL_COLLISION_EVT:
   3223                 bdcpy(p_msg->bd_addr, p_data->conn.p_bda);
   3224                 break;;
   3225         }
   3226 
   3227         p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT;
   3228         bta_sys_sendmsg(p_msg);
   3229 
   3230     }
   3231 
   3232 }
   3233 #else
   3234 
   3235 /*******************************************************************************
   3236 **
   3237 ** Function         bta_dm_acl_change_cback
   3238 **
   3239 ** Description      Callback from btm when acl connection goes up or down
   3240 **
   3241 **
   3242 ** Returns          void
   3243 **
   3244 *******************************************************************************/
   3245 static void bta_dm_acl_change_cback (BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn,
   3246                                      UINT8 *features, BOOLEAN is_new)
   3247 {
   3248 
   3249     tBTA_DM_ACL_CHANGE * p_msg;
   3250 
   3251     if ((p_msg = (tBTA_DM_ACL_CHANGE *) GKI_getbuf(sizeof(tBTA_DM_ACL_CHANGE))) != NULL)
   3252     {
   3253         bdcpy (p_msg->bd_addr, p_bda);
   3254         p_msg->is_new = is_new;
   3255 
   3256         /* This is collision case */
   3257         if (features != NULL)
   3258         {
   3259             if ((features[0] == 0xFF) && !is_new)
   3260                 p_msg->event = BTM_BL_COLLISION_EVT;
   3261         }
   3262 
   3263         p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT;
   3264         bta_sys_sendmsg(p_msg);
   3265 
   3266     }
   3267 
   3268 }
   3269 #endif
   3270 /*******************************************************************************
   3271 **
   3272 ** Function         bta_dm_rs_cback
   3273 **
   3274 ** Description      Receives the role switch complete event
   3275 **
   3276 ** Returns
   3277 **
   3278 *******************************************************************************/
   3279 static void bta_dm_rs_cback (tBTM_ROLE_SWITCH_CMPL *p1)
   3280 {
   3281     APPL_TRACE_WARNING1("bta_dm_rs_cback:%d", bta_dm_cb.rs_event);
   3282     if(bta_dm_cb.rs_event == BTA_DM_API_SEARCH_EVT)
   3283     {
   3284         bta_dm_cb.search_msg.rs_res = BTA_DM_RS_OK; /* do not care about the result for now */
   3285         bta_dm_cb.rs_event = 0;
   3286         bta_dm_search_start((tBTA_DM_MSG *)&bta_dm_cb.search_msg);
   3287     }
   3288 }
   3289 
   3290 /*******************************************************************************
   3291 **
   3292 ** Function         bta_dm_check_av
   3293 **
   3294 ** Description      This function checks if AV is active
   3295 **                  if yes, make sure the AV link is master
   3296 **
   3297 ** Returns          BOOLEAN - TRUE, if switch is in progress
   3298 **
   3299 *******************************************************************************/
   3300 static BOOLEAN bta_dm_check_av(UINT16 event)
   3301 {
   3302     BOOLEAN avoid_roleswitch = FALSE;
   3303     BOOLEAN switching = FALSE;
   3304     UINT8 i;
   3305     tBTA_DM_PEER_DEVICE *p_dev;
   3306 
   3307 #if defined(BTA_DM_AVOID_A2DP_ROLESWITCH_ON_INQUIRY) && (BTA_DM_AVOID_A2DP_ROLESWITCH_ON_INQUIRY == TRUE)
   3308 
   3309     /* avoid role switch upon inquiry if a2dp is actively streaming as it
   3310        introduces an audioglitch due to FW scheduling delays (unavoidable) */
   3311     if (event == BTA_DM_API_SEARCH_EVT)
   3312     {
   3313         avoid_roleswitch = TRUE;
   3314     }
   3315 #endif
   3316 
   3317     APPL_TRACE_WARNING1("bta_dm_check_av:%d", bta_dm_cb.cur_av_count);
   3318     if(bta_dm_cb.cur_av_count)
   3319     {
   3320         for(i=0; i<bta_dm_cb.device_list.count; i++)
   3321         {
   3322             p_dev = &bta_dm_cb.device_list.peer_device[i];
   3323             APPL_TRACE_WARNING4("[%d]: state:%d, info:x%x, avoid_rs %d",
   3324                                 i, p_dev->conn_state, p_dev->info, avoid_roleswitch);
   3325             if((p_dev->conn_state == BTA_DM_CONNECTED) && (p_dev->info & BTA_DM_DI_AV_ACTIVE) &&
   3326                (avoid_roleswitch == FALSE))
   3327             {
   3328                 /* make master and take away the role switch policy */
   3329                 if(BTM_CMD_STARTED == BTM_SwitchRole (p_dev->peer_bdaddr, HCI_ROLE_MASTER, (tBTM_CMPL_CB *)bta_dm_rs_cback))
   3330                 {
   3331                     /* the role switch command is actually sent */
   3332                     bta_dm_cb.rs_event = event;
   3333                     switching = TRUE;
   3334                 }
   3335                 /* else either already master or can not switch for some reasons */
   3336                 bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr);
   3337                 break;
   3338             }
   3339         }
   3340     }
   3341     return switching;
   3342 }
   3343 
   3344 /*******************************************************************************
   3345 **
   3346 ** Function         bta_dm_acl_change
   3347 **
   3348 ** Description      Process BTA_DM_ACL_CHANGE_EVT
   3349 **
   3350 **
   3351 ** Returns          void
   3352 **
   3353 *******************************************************************************/
   3354 void bta_dm_acl_change(tBTA_DM_MSG *p_data)
   3355 {
   3356 
   3357     UINT8 i;
   3358     UINT8 *p;
   3359     tBTA_DM_SEC conn;
   3360     BOOLEAN is_new = p_data->acl_change.is_new;
   3361     BD_ADDR_PTR     p_bda = p_data->acl_change.bd_addr;
   3362     BOOLEAN         need_policy_change = FALSE;
   3363     BOOLEAN         issue_unpair_cb = FALSE;
   3364 
   3365 #if (defined(BTM_BUSY_LEVEL_CHANGE_INCLUDED) && BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE)
   3366     tBTA_DM_PEER_DEVICE *p_dev;
   3367 
   3368     switch(p_data->acl_change.event)
   3369     {
   3370     case BTM_BL_UPDATE_EVT:     /* busy level update */
   3371         if( bta_dm_cb.p_sec_cback )
   3372         {
   3373             conn.busy_level.level = p_data->acl_change.busy_level;
   3374             conn.busy_level.level_flags = p_data->acl_change.busy_level_flags;
   3375             bta_dm_cb.p_sec_cback(BTA_DM_BUSY_LEVEL_EVT, &conn);
   3376         }
   3377         return;
   3378 
   3379     case BTM_BL_ROLE_CHG_EVT:   /* role change event */
   3380         p_dev = bta_dm_find_peer_device(p_bda);
   3381         if(p_dev)
   3382         {
   3383             APPL_TRACE_DEBUG3("bta_dm_acl_change role chg info:x%x new_role:%d dev count:%d",
   3384                 p_dev->info, p_data->acl_change.new_role, bta_dm_cb.device_list.count);
   3385             if(p_dev->info & BTA_DM_DI_AV_ACTIVE)
   3386             {
   3387                 /* there's AV activity on this link */
   3388                 if(p_data->acl_change.new_role == HCI_ROLE_SLAVE && bta_dm_cb.device_list.count > 1
   3389                     && p_data->acl_change.hci_status == HCI_SUCCESS)
   3390                 {
   3391                     /* more than one connections and the AV connection is role switched to slave
   3392                      * switch it back to master and remove the switch policy */
   3393                     BTM_SwitchRole(p_bda, BTM_ROLE_MASTER, NULL);
   3394                     need_policy_change = TRUE;
   3395                 }
   3396                 else if (bta_dm_cfg.avoid_scatter && (p_data->acl_change.new_role == HCI_ROLE_MASTER))
   3397                 {
   3398                     /* if the link updated to be master include AV activities, remove the switch policy */
   3399                     need_policy_change = TRUE;
   3400                 }
   3401 
   3402                 if(need_policy_change)
   3403                 {
   3404                     bta_dm_policy_cback(BTA_SYS_PLCY_CLR, 0, HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr);
   3405                 }
   3406             }
   3407             else
   3408             {
   3409                 /* there's AV no activity on this link and role switch happened
   3410                  * check if AV is active
   3411                  * if so, make sure the AV link is master */
   3412                 bta_dm_check_av(0);
   3413             }
   3414             bta_sys_notify_role_chg(p_data->acl_change.bd_addr, p_data->acl_change.new_role, p_data->acl_change.hci_status);
   3415             bdcpy(conn.role_chg.bd_addr, p_bda);
   3416             conn.role_chg.new_role = (UINT8) p_data->acl_change.new_role;
   3417             if( bta_dm_cb.p_sec_cback )
   3418                 bta_dm_cb.p_sec_cback(BTA_DM_ROLE_CHG_EVT, &conn);
   3419         }
   3420         return;
   3421     }
   3422 #endif
   3423 
   3424     /* Collision report from Stack: Notify profiles */
   3425     if (p_data->acl_change.event == BTM_BL_COLLISION_EVT)
   3426     {
   3427         bta_sys_notify_collision (p_bda);
   3428         return;
   3429     }
   3430 
   3431     if(is_new)
   3432     {
   3433         for(i=0; i<bta_dm_cb.device_list.count; i++)
   3434         {
   3435             if(!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda))
   3436                 break;
   3437 
   3438         }
   3439 
   3440         if(i == bta_dm_cb.device_list.count)
   3441         {
   3442             bdcpy(bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].peer_bdaddr, p_bda);
   3443             bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].link_policy = bta_dm_cb.cur_policy;
   3444             bta_dm_cb.device_list.count++;
   3445         }
   3446 
   3447         bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_CONNECTED;
   3448         bta_dm_cb.device_list.peer_device[i].pref_role = BTA_ANY_ROLE;
   3449         bdcpy(conn.link_up.bd_addr, p_bda);
   3450         bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_NONE;
   3451         if( ((NULL != (p = BTM_ReadLocalFeatures ())) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) &&
   3452             ((NULL != (p = BTM_ReadRemoteFeatures (p_bda))) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) )
   3453         {
   3454             /* both local and remote devices support SSR */
   3455             bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_USE_SSR;
   3456         }
   3457         APPL_TRACE_WARNING1("info:x%x", bta_dm_cb.device_list.peer_device[i].info);
   3458         if( bta_dm_cb.p_sec_cback )
   3459             bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_EVT, &conn);
   3460 
   3461     }
   3462     else
   3463     {
   3464         for(i=0; i<bta_dm_cb.device_list.count; i++)
   3465         {
   3466             if(bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda))
   3467                 continue;
   3468 
   3469             if( bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_UNPAIRING )
   3470             {
   3471                 BTM_SecDeleteDevice(bta_dm_cb.device_list.peer_device[i].peer_bdaddr);
   3472 #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
   3473                 /* remove all cached GATT information */
   3474                 BTA_GATTC_Refresh(p_bda);
   3475 #endif
   3476                 issue_unpair_cb = TRUE;
   3477             }
   3478 
   3479             conn.link_down.is_removed = bta_dm_cb.device_list.peer_device[i].remove_dev_pending;
   3480 
   3481             for(; i<bta_dm_cb.device_list.count ; i++)
   3482             {
   3483                 memcpy(&bta_dm_cb.device_list.peer_device[i], &bta_dm_cb.device_list.peer_device[i+1], sizeof(bta_dm_cb.device_list.peer_device[i]));
   3484             }
   3485             break;
   3486         }
   3487         if(bta_dm_cb.device_list.count)
   3488             bta_dm_cb.device_list.count--;
   3489 
   3490         if(bta_dm_search_cb.wait_disc && !bdcmp(bta_dm_search_cb.peer_bdaddr, p_bda))
   3491         {
   3492             bta_dm_search_cb.wait_disc = FALSE;
   3493 
   3494             if(bta_dm_search_cb.sdp_results)
   3495             {
   3496                 APPL_TRACE_EVENT0(" timer stopped  ");
   3497                 bta_sys_stop_timer(&bta_dm_search_cb.search_timer);
   3498                 bta_dm_discover_next_device();
   3499             }
   3500 
   3501         }
   3502 
   3503         if(bta_dm_cb.disabling)
   3504         {
   3505             if(!BTM_GetNumAclLinks())
   3506             {
   3507                 bta_sys_stop_timer(&bta_dm_cb.disable_timer);
   3508                 bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_conn_down_timer_cback;
   3509                 /* start a timer to make sure that the profiles get the disconnect event */
   3510                 bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 1000);
   3511             }
   3512         }
   3513         if (conn.link_down.is_removed)
   3514         {
   3515             BTM_SecDeleteDevice(p_bda);
   3516 #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
   3517             /* need to remove all pending background connection */
   3518             BTA_GATTC_CancelOpen(0, p_bda, FALSE);
   3519             /* remove all cached GATT information */
   3520             BTA_GATTC_Refresh(p_bda);
   3521 #endif
   3522          }
   3523 
   3524         bdcpy(conn.link_down.bd_addr, p_bda);
   3525         conn.link_down.status = (UINT8) btm_get_acl_disc_reason_code();
   3526         if( bta_dm_cb.p_sec_cback )
   3527         {
   3528             bta_dm_cb.p_sec_cback(BTA_DM_LINK_DOWN_EVT, &conn);
   3529             if( issue_unpair_cb )
   3530                 bta_dm_cb.p_sec_cback(BTA_DM_DEV_UNPAIRED_EVT, &conn);
   3531         }
   3532     }
   3533 
   3534     bta_dm_adjust_roles(TRUE);
   3535 }
   3536 
   3537 /*******************************************************************************
   3538 **
   3539 ** Function         bta_dm_disable_conn_down_timer_cback
   3540 **
   3541 ** Description      Sends disable event to application
   3542 **
   3543 **
   3544 ** Returns          void
   3545 **
   3546 *******************************************************************************/
   3547 static void bta_dm_disable_conn_down_timer_cback (TIMER_LIST_ENT *p_tle)
   3548 {
   3549     tBTA_SYS_HW_MSG *sys_enable_event;
   3550 
   3551     /* disable the power managment module */
   3552     bta_dm_disable_pm();
   3553 
   3554     /* register our callback to SYS HW manager */
   3555     bta_sys_hw_register( BTA_SYS_HW_BLUETOOTH, bta_dm_sys_hw_cback );
   3556 
   3557     /* send a message to BTA SYS */
   3558     if ((sys_enable_event = (tBTA_SYS_HW_MSG *) GKI_getbuf(sizeof(tBTA_SYS_HW_MSG))) != NULL)
   3559     {
   3560         sys_enable_event->hdr.event = BTA_SYS_API_DISABLE_EVT;
   3561         sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH;
   3562         bta_sys_sendmsg(sys_enable_event);
   3563     }
   3564 
   3565     bta_dm_cb.disabling = FALSE;
   3566 
   3567 }
   3568 
   3569 /*******************************************************************************
   3570 **
   3571 ** Function         bta_dm_rssi_cback
   3572 **
   3573 ** Description      Callback from btm with rssi values
   3574 **
   3575 **
   3576 ** Returns          void
   3577 **
   3578 *******************************************************************************/
   3579 static void bta_dm_rssi_cback (tBTM_RSSI_RESULTS *p_result)
   3580 {
   3581     tBTA_DM_SEC sec_event;
   3582 
   3583     if(p_result->status == BTM_SUCCESS)
   3584     {
   3585 
   3586         bdcpy(sec_event.sig_strength.bd_addr, p_result->rem_bda);
   3587         sec_event.sig_strength.mask = BTA_SIG_STRENGTH_RSSI_MASK;
   3588         sec_event.sig_strength.rssi_value = p_result->rssi;
   3589         if( bta_dm_cb.p_sec_cback!= NULL )
   3590             bta_dm_cb.p_sec_cback(BTA_DM_SIG_STRENGTH_EVT, &sec_event);
   3591 
   3592     }
   3593 }
   3594 
   3595 /*******************************************************************************
   3596 **
   3597 ** Function         bta_dm_link_quality_cback
   3598 **
   3599 ** Description      Callback from btm with link quality value
   3600 **
   3601 **
   3602 ** Returns          void
   3603 **
   3604 *******************************************************************************/
   3605 static void bta_dm_link_quality_cback (tBTM_LINK_QUALITY_RESULTS *p_result)
   3606 {
   3607 
   3608     tBTA_DM_SEC sec_event;
   3609 
   3610     if(p_result->status == BTM_SUCCESS)
   3611     {
   3612 
   3613         bdcpy(sec_event.sig_strength.bd_addr, p_result->rem_bda);
   3614         sec_event.sig_strength.mask = BTA_SIG_STRENGTH_LINK_QUALITY_MASK;
   3615         sec_event.sig_strength.link_quality_value = p_result->link_quality;
   3616         if( bta_dm_cb.p_sec_cback!= NULL )
   3617             bta_dm_cb.p_sec_cback(BTA_DM_SIG_STRENGTH_EVT, &sec_event);
   3618 
   3619     }
   3620 }
   3621 
   3622 /*******************************************************************************
   3623 **
   3624 ** Function         bta_dm_rm_cback
   3625 **
   3626 ** Description      Role management callback from sys
   3627 **
   3628 **
   3629 ** Returns          void
   3630 **
   3631 *******************************************************************************/
   3632 static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
   3633 {
   3634 
   3635     UINT8 j;
   3636     tBTA_PREF_ROLES role;
   3637     tBTA_DM_PEER_DEVICE *p_dev;
   3638 
   3639     p_dev = bta_dm_find_peer_device(peer_addr);
   3640     if( status == BTA_SYS_CONN_OPEN)
   3641     {
   3642         if(p_dev)
   3643         {
   3644             /* Do not set to connected if we are in the middle of unpairing. When AV stream is
   3645              * started it fakes out a SYS_CONN_OPEN to potentially trigger a role switch command.
   3646              * But this should not be done if we are in the middle of unpairing.
   3647              */
   3648             if (p_dev->conn_state != BTA_DM_UNPAIRING)
   3649                 p_dev->conn_state = BTA_DM_CONNECTED;
   3650 
   3651             for(j=1; j<= p_bta_dm_rm_cfg[0].app_id; j++)
   3652             {
   3653                 if(((p_bta_dm_rm_cfg[j].app_id == app_id) || (p_bta_dm_rm_cfg[j].app_id == BTA_ALL_APP_ID))
   3654                     && (p_bta_dm_rm_cfg[j].id == id))
   3655                 {
   3656                     role = p_bta_dm_rm_cfg[j].cfg;
   3657 
   3658                     if(role > p_dev->pref_role )
   3659                         p_dev->pref_role = role;
   3660                     break;
   3661                 }
   3662             }
   3663 
   3664         }
   3665 
   3666     }
   3667 
   3668     if((BTA_ID_AV == id)||(BTA_ID_AVK ==id))
   3669     {
   3670         if( status == BTA_SYS_CONN_BUSY)
   3671         {
   3672             if(p_dev)
   3673                 p_dev->info |= BTA_DM_DI_AV_ACTIVE;
   3674             /* AV calls bta_sys_conn_open with the A2DP stream count as app_id */
   3675             if(BTA_ID_AV == id)
   3676                 bta_dm_cb.cur_av_count = app_id;
   3677         }
   3678         else if( status == BTA_SYS_CONN_IDLE)
   3679         {
   3680             if(p_dev)
   3681                 p_dev->info &= ~BTA_DM_DI_AV_ACTIVE;
   3682             /* AV calls bta_sys_conn_open with the A2DP stream count as app_id */
   3683             if(BTA_ID_AV == id)
   3684                 bta_dm_cb.cur_av_count = app_id;
   3685         }
   3686         APPL_TRACE_WARNING2("bta_dm_rm_cback:%d, status:%d", bta_dm_cb.cur_av_count, status);
   3687     }
   3688     else if ((status == BTA_SYS_CONN_BUSY) || (status == BTA_SYS_CONN_IDLE))
   3689     {
   3690         /* Do not do role switch management for non-AV profiles when data flow starts/stops */
   3691         return;
   3692     }
   3693 
   3694     bta_dm_adjust_roles(FALSE);
   3695 
   3696 }
   3697 
   3698 /*******************************************************************************
   3699 **
   3700 ** Function         bta_dm_dev_blacklisted_for_switch
   3701 **
   3702 ** Description      Checks if the device is blacklisted for immediate role switch after connection.
   3703 **
   3704 ** Returns          TRUE if dev is blacklisted else FALSE
   3705 **
   3706 *******************************************************************************/
   3707 static BOOLEAN bta_dm_dev_blacklisted_for_switch (BD_ADDR remote_bd_addr)
   3708 {
   3709     UINT16 manufacturer = 0;
   3710     UINT16  lmp_sub_version = 0;
   3711     UINT8 lmp_version = 0;
   3712     UINT8 i = 0;
   3713 
   3714     if (BTM_ReadRemoteVersion(remote_bd_addr, &lmp_version,
   3715         &manufacturer, &lmp_sub_version) == BTM_SUCCESS)
   3716     {
   3717         /* Check if this device version info matches with is
   3718            blacklisted versions for role switch  */
   3719         for (i = 0; i < BTA_DM_MAX_ROLE_SWITCH_BLACKLIST_COUNT; i++)
   3720         {
   3721              if ((bta_role_switch_blacklist[i].lmp_version == lmp_version) &&
   3722                  (bta_role_switch_blacklist[i].manufacturer == manufacturer)&&
   3723                  ((bta_role_switch_blacklist[i].lmp_sub_version & lmp_sub_version) ==
   3724                      bta_role_switch_blacklist[i].lmp_sub_version))
   3725                 {
   3726                     APPL_TRACE_EVENT0("Black list F/W version matches.. Delay Role Switch...");
   3727                     return TRUE;
   3728                 }
   3729 
   3730         }
   3731     }
   3732     return FALSE;
   3733 }
   3734 
   3735 /*******************************************************************************
   3736 **
   3737 ** Function         bta_dm_delay_role_switch_cback
   3738 **
   3739 ** Description      Callback from btm to delay a role switch
   3740 **
   3741 ** Returns          void
   3742 **
   3743 *******************************************************************************/
   3744 static void bta_dm_delay_role_switch_cback(TIMER_LIST_ENT *p_tle)
   3745 {
   3746     APPL_TRACE_EVENT0("bta_dm_delay_role_switch_cback: initiating Delayed RS");
   3747     bta_dm_adjust_roles (FALSE);
   3748 }
   3749 
   3750 /*******************************************************************************
   3751 **
   3752 ** Function         bta_dm_remove_sec_dev_entry
   3753 **
   3754 ** Description      Removes device entry from Security device DB if ACL connection with
   3755 **                  remtoe device does not exist, else schedule for dev entry removal upon
   3756                      ACL close
   3757 **
   3758 ** Returns          void
   3759 **
   3760 *******************************************************************************/
   3761 static void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr)
   3762 {
   3763     UINT16 index = 0;
   3764     if (BTM_IsAclConnectionUp(remote_bd_addr))
   3765     {
   3766          APPL_TRACE_DEBUG1("%s ACL is not down. Schedule for  Dev Removal when ACL closes",
   3767                             __FUNCTION__);
   3768         for (index = 0; index < bta_dm_cb.device_list.count; index ++)
   3769         {
   3770             if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, remote_bd_addr))
   3771                 break;
   3772         }
   3773         if (index != bta_dm_cb.device_list.count)
   3774         {
   3775             bta_dm_cb.device_list.peer_device[index].remove_dev_pending = TRUE;
   3776         }
   3777         else
   3778         {
   3779             APPL_TRACE_ERROR1(" %s Device does not exist in DB", __FUNCTION__);
   3780         }
   3781     }
   3782     else
   3783     {
   3784         BTM_SecDeleteDevice (remote_bd_addr);
   3785 #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
   3786         /* need to remove all pending background connection */
   3787         BTA_GATTC_CancelOpen(0, remote_bd_addr, FALSE);
   3788         /* remove all cached GATT information */
   3789         BTA_GATTC_Refresh(remote_bd_addr);
   3790 #endif
   3791     }
   3792 }
   3793 
   3794 
   3795 /*******************************************************************************
   3796 **
   3797 ** Function         bta_dm_adjust_roles
   3798 **
   3799 ** Description      Adjust roles
   3800 **
   3801 **
   3802 ** Returns          void
   3803 **
   3804 *******************************************************************************/
   3805 static void bta_dm_adjust_roles(BOOLEAN delay_role_switch)
   3806 {
   3807 
   3808     UINT8 i;
   3809     BOOLEAN set_master_role = FALSE;
   3810 
   3811     if(bta_dm_cb.device_list.count)
   3812     {
   3813 
   3814         /* the configuration is no scatternet
   3815          * or AV connection exists and there are more than one ACL link */
   3816         if( (p_bta_dm_rm_cfg[0].cfg == BTA_DM_NO_SCATTERNET) ||
   3817             (bta_dm_cb.cur_av_count && bta_dm_cb.device_list.count > 1) )
   3818         {
   3819 
   3820             L2CA_SetDesireRole (HCI_ROLE_MASTER);
   3821             set_master_role = TRUE;
   3822 
   3823         }
   3824 
   3825         for(i=0; i<bta_dm_cb.device_list.count; i++)
   3826         {
   3827             if(bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_CONNECTED)
   3828             {
   3829                 if(!set_master_role && (bta_dm_cb.device_list.peer_device[i].pref_role != BTA_ANY_ROLE)
   3830                     && (p_bta_dm_rm_cfg[0].cfg == BTA_DM_PARTIAL_SCATTERNET))
   3831                 {
   3832                     L2CA_SetDesireRole (HCI_ROLE_MASTER);
   3833                     set_master_role = TRUE;
   3834                 }
   3835 
   3836                 if((bta_dm_cb.device_list.peer_device[i].pref_role == BTA_MASTER_ROLE_ONLY)
   3837                     || (bta_dm_cb.device_list.count > 1))
   3838                 {
   3839 
   3840                 /* Initiating immediate role switch with certain remote devices
   3841                   has caused issues due to role  switch colliding with link encryption setup and
   3842                   causing encryption (and in turn the link) to fail .  These device . Firmware
   3843                   versions are stored in a blacklist and role switch with these devices are
   3844                   delayed to avoid the collision with link encryption setup */
   3845 
   3846                     if ((delay_role_switch == FALSE) ||
   3847                        (bta_dm_dev_blacklisted_for_switch(
   3848                                        bta_dm_cb.device_list.peer_device[i].peer_bdaddr) == FALSE))
   3849                     {
   3850                         BTM_SwitchRole (bta_dm_cb.device_list.peer_device[i].peer_bdaddr,
   3851                                         HCI_ROLE_MASTER, NULL);
   3852                     }
   3853                     else
   3854                     {
   3855                         bta_dm_cb.switch_delay_timer.p_cback =
   3856                             (TIMER_CBACK*)&bta_dm_delay_role_switch_cback;
   3857                         bta_sys_start_timer(&bta_dm_cb.switch_delay_timer, 0, 500);
   3858                     }
   3859                 }
   3860 
   3861             }
   3862         }
   3863 
   3864 
   3865         if(!set_master_role)
   3866         {
   3867 
   3868             L2CA_SetDesireRole (L2CAP_DESIRED_LINK_ROLE);
   3869 
   3870         }
   3871 
   3872     }
   3873     else
   3874     {
   3875         L2CA_SetDesireRole (L2CAP_DESIRED_LINK_ROLE);
   3876     }
   3877 
   3878 
   3879 }
   3880 
   3881 /*******************************************************************************
   3882 **
   3883 ** Function         bta_dm_get_remname
   3884 **
   3885 ** Description      Returns a pointer to the remote name stored in the DM control
   3886 **                  block if it exists, or from the BTM memory.
   3887 **
   3888 ** Returns          char * - Pointer to the remote device name
   3889 *******************************************************************************/
   3890 static char *bta_dm_get_remname(void)
   3891 {
   3892     char *p_name = (char *)bta_dm_search_cb.peer_name;
   3893     char *p_temp;
   3894 
   3895     /* If the name isn't already stored, try retrieving from BTM */
   3896     if (*p_name == '\0')
   3897         if ((p_temp = BTM_SecReadDevName(bta_dm_search_cb.peer_bdaddr)) != NULL)
   3898             p_name = p_temp;
   3899 
   3900     return p_name;
   3901 }
   3902 
   3903 /*******************************************************************************
   3904 **
   3905 ** Function         bta_dm_bond_cancel_complete_cback
   3906 **
   3907 ** Description      Authentication complete callback from BTM
   3908 **
   3909 ** Returns          void
   3910 **
   3911 *******************************************************************************/
   3912 static void bta_dm_bond_cancel_complete_cback(tBTM_STATUS result)
   3913 {
   3914 
   3915     tBTA_DM_SEC sec_event;
   3916 
   3917     if (result == BTM_SUCCESS)
   3918         sec_event.bond_cancel_cmpl.result = BTA_SUCCESS;
   3919     else
   3920         sec_event.bond_cancel_cmpl.result = BTA_FAILURE;
   3921 
   3922     if(bta_dm_cb.p_sec_cback)
   3923     {
   3924         bta_dm_cb.p_sec_cback(BTA_DM_BOND_CANCEL_CMPL_EVT, &sec_event);
   3925     }
   3926 }
   3927 
   3928 #if ( BTM_EIR_SERVER_INCLUDED == TRUE )
   3929     #if ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
   3930 /*******************************************************************************
   3931 **
   3932 ** Function         bta_dm_update_eir_uuid
   3933 **
   3934 ** Description
   3935 **
   3936 **
   3937 *******************************************************************************/
   3938 void bta_dm_update_eir_uuid (tBTA_DM_MSG *p_data)
   3939 {
   3940     tBTA_DM_API_UPDATE_EIR_UUID *p_msg = (tBTA_DM_API_UPDATE_EIR_UUID *)p_data;
   3941     UINT8 xx;
   3942     UINT8 empty_slot = BTA_EIR_SERVER_NUM_CUSTOM_UUID;
   3943     UINT8 match_slot = BTA_EIR_SERVER_NUM_CUSTOM_UUID;
   3944 
   3945     for (xx = 0; xx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; xx++)
   3946     {
   3947         if (bta_dm_cb.custom_uuid[xx].len == 0)
   3948         {
   3949             if (empty_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
   3950                 empty_slot = xx;
   3951         }
   3952         else if (match_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
   3953         {
   3954             if (!memcmp (bta_dm_cb.custom_uuid[xx].uu.uuid128, p_msg->uuid.uu.uuid128, p_msg->uuid.len))
   3955             {
   3956                 match_slot = xx;;
   3957             }
   3958         }
   3959     }
   3960 
   3961     if (p_msg->is_add)
   3962     {
   3963         if (match_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
   3964         {
   3965             if (empty_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
   3966             {
   3967                 APPL_TRACE_ERROR0("No space to add UUID for EIR");
   3968                 return;
   3969             }
   3970             else
   3971             {
   3972                 memcpy (&(bta_dm_cb.custom_uuid[empty_slot]), &(p_msg->uuid), sizeof(tBT_UUID));
   3973             }
   3974         }
   3975         else
   3976         {
   3977             APPL_TRACE_ERROR0("UUID is already added for EIR");
   3978             return;
   3979         }
   3980     }
   3981     else
   3982     {
   3983         if (match_slot == BTA_EIR_SERVER_NUM_CUSTOM_UUID)
   3984         {
   3985             APPL_TRACE_ERROR0("UUID is not found for EIR");
   3986             return;
   3987         }
   3988         else
   3989         {
   3990             memset (&(bta_dm_cb.custom_uuid[match_slot]), 0, sizeof(tBT_UUID));
   3991         }
   3992     }
   3993 
   3994     bta_dm_set_eir (NULL);
   3995 }
   3996     #endif
   3997 
   3998 /*******************************************************************************
   3999 **
   4000 ** Function         bta_dm_set_eir_config
   4001 **
   4002 ** Description
   4003 **
   4004 **
   4005 *******************************************************************************/
   4006 void bta_dm_set_eir_config (tBTA_DM_MSG *p_data)
   4007 {
   4008     if (p_data->set_eir_cfg.p_eir_cfg)
   4009     {
   4010         /* User defined config */
   4011         p_bta_dm_eir_cfg = p_data->set_eir_cfg.p_eir_cfg;
   4012     }
   4013     else
   4014     {
   4015         /* Back to default config */
   4016         p_bta_dm_eir_cfg = (tBTA_DM_EIR_CONF*)&bta_dm_eir_cfg;
   4017     }
   4018 
   4019     bta_dm_set_eir (NULL);
   4020 }
   4021 
   4022 /*******************************************************************************
   4023 **
   4024 ** Function         bta_dm_set_eir
   4025 **
   4026 ** Description      This function creates EIR tagged data and writes it to controller.
   4027 **
   4028 ** Returns          None
   4029 **
   4030 *******************************************************************************/
   4031 static void bta_dm_set_eir (char *local_name)
   4032 {
   4033     BT_HDR   *p_buf;
   4034     UINT8    *p;
   4035     UINT8    *p_length;
   4036 #if (BTA_EIR_CANNED_UUID_LIST != TRUE)
   4037     UINT8    *p_type;
   4038     UINT8    max_num_uuid;
   4039 #if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
   4040     UINT8    custom_uuid_idx;
   4041 #endif
   4042 #endif
   4043 #if (BTM_EIR_DEFAULT_FEC_REQUIRED == FALSE)
   4044     UINT8    free_eir_length = HCI_EXT_INQ_RESPONSE_LEN;
   4045 #else
   4046     UINT8    free_eir_length = HCI_DM5_PACKET_SIZE;
   4047 #endif
   4048     UINT8    num_uuid;
   4049     UINT8    data_type;
   4050     UINT8    local_name_len;
   4051 
   4052     /* wait until complete to disable */
   4053     if (bta_dm_cb.disable_timer.in_use)
   4054         return;
   4055 
   4056 #if ( BTA_EIR_CANNED_UUID_LIST != TRUE )
   4057     /* wait until App is ready */
   4058     if (bta_dm_cb.app_ready_timer.in_use)
   4059         return;
   4060 
   4061     /* if local name is not provided, get it from controller */
   4062     if( local_name == NULL )
   4063     {
   4064         if( BTM_ReadLocalDeviceName( &local_name ) != BTM_SUCCESS )
   4065         {
   4066             APPL_TRACE_ERROR0("Fail to read local device name for EIR");
   4067         }
   4068     }
   4069 #endif
   4070 
   4071     /* Allocate a buffer to hold HCI command */
   4072     if ((p_buf = (BT_HDR *)GKI_getpoolbuf(BTM_CMD_POOL_ID)) == NULL)
   4073     {
   4074         APPL_TRACE_ERROR0("bta_dm_set_eir couldn't allocate buffer");
   4075         return;
   4076     }
   4077     p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET;
   4078 
   4079     memset(p, 0x00, HCI_EXT_INQ_RESPONSE_LEN );
   4080 
   4081     APPL_TRACE_DEBUG0("BTA is generating EIR");
   4082 
   4083     if( local_name )
   4084         local_name_len = strlen( local_name );
   4085     else
   4086         local_name_len = 0;
   4087 
   4088     data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
   4089     /* if local name is longer than minimum length of shortened name */
   4090     /* check whether it needs to be shortened or not */
   4091     if( local_name_len > p_bta_dm_eir_cfg->bta_dm_eir_min_name_len )
   4092     {
   4093         /* get number of UUID 16-bit list */
   4094 #if (BTA_EIR_CANNED_UUID_LIST == TRUE)
   4095         num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len/LEN_UUID_16;
   4096 #else
   4097         max_num_uuid = (free_eir_length - 2)/LEN_UUID_16;
   4098         data_type = BTM_GetEirSupportedServices( bta_dm_cb.eir_uuid, &p,
   4099                                                  max_num_uuid, &num_uuid );
   4100         p = (UINT8 *)p_buf + BTM_HCI_EIR_OFFSET; /* reset p */
   4101 #endif
   4102 
   4103         /* if UUID doesn't fit remaing space, shorten local name */
   4104         if ( local_name_len > (free_eir_length - 4 - num_uuid*LEN_UUID_16))
   4105         {
   4106             APPL_TRACE_WARNING0("BTA EIR: local name is shortened");
   4107             local_name_len = p_bta_dm_eir_cfg->bta_dm_eir_min_name_len;
   4108             data_type = BTM_EIR_SHORTENED_LOCAL_NAME_TYPE;
   4109         }
   4110         else
   4111             data_type = BTM_EIR_COMPLETE_LOCAL_NAME_TYPE;
   4112     }
   4113 
   4114     UINT8_TO_STREAM(p, local_name_len + 1);
   4115     UINT8_TO_STREAM(p, data_type);
   4116 
   4117     if (local_name != NULL)
   4118     {
   4119         memcpy(p, local_name, local_name_len);
   4120         p += local_name_len;
   4121     }
   4122     free_eir_length -= local_name_len + 2;
   4123 
   4124 #if (BTA_EIR_CANNED_UUID_LIST == TRUE)
   4125     /* if UUID list is provided as static data in configuration */
   4126     if(( p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len > 0 )
   4127         &&(p_bta_dm_eir_cfg->bta_dm_eir_uuid16))
   4128     {
   4129         if( free_eir_length > LEN_UUID_16 + 2)
   4130         {
   4131             free_eir_length -= 2;
   4132 
   4133             if( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len)
   4134             {
   4135                 num_uuid = p_bta_dm_eir_cfg->bta_dm_eir_uuid16_len / LEN_UUID_16;
   4136                 data_type = BTM_EIR_COMPLETE_16BITS_UUID_TYPE;
   4137             }
   4138             else /* not enough room for all UUIDs */
   4139             {
   4140                 APPL_TRACE_WARNING0("BTA EIR: UUID 16-bit list is truncated");
   4141                 num_uuid = free_eir_length / LEN_UUID_16;
   4142                 data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
   4143             }
   4144             UINT8_TO_STREAM(p, num_uuid * LEN_UUID_16 + 1);
   4145             UINT8_TO_STREAM(p, data_type);
   4146             memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_uuid16, num_uuid * LEN_UUID_16 );
   4147             p += num_uuid * LEN_UUID_16;
   4148             free_eir_length -= num_uuid * LEN_UUID_16;
   4149         }
   4150     }
   4151 #else /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */
   4152     /* if UUID list is dynamic */
   4153     if ( free_eir_length >= 2)
   4154     {
   4155         p_length = p++;
   4156         p_type   = p++;
   4157         num_uuid = 0;
   4158 
   4159         max_num_uuid = (free_eir_length - 2)/LEN_UUID_16;
   4160         data_type = BTM_GetEirSupportedServices( bta_dm_cb.eir_uuid, &p, max_num_uuid, &num_uuid );
   4161 
   4162         if( data_type == BTM_EIR_MORE_16BITS_UUID_TYPE )
   4163         {
   4164             APPL_TRACE_WARNING0("BTA EIR: UUID 16-bit list is truncated");
   4165         }
   4166 #if (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
   4167         else
   4168         {
   4169             for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++)
   4170             {
   4171                 if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_16)
   4172                 {
   4173                     if ( num_uuid < max_num_uuid )
   4174                     {
   4175                         UINT16_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid16);
   4176                         num_uuid++;
   4177                     }
   4178                     else
   4179                     {
   4180                         data_type = BTM_EIR_MORE_16BITS_UUID_TYPE;
   4181                         APPL_TRACE_WARNING0("BTA EIR: UUID 16-bit list is truncated");
   4182                         break;
   4183                     }
   4184                 }
   4185             }
   4186         }
   4187 #endif /* (BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */
   4188 
   4189         UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_16 + 1);
   4190         UINT8_TO_STREAM(p_type, data_type);
   4191         free_eir_length -= num_uuid * LEN_UUID_16 + 2;
   4192     }
   4193 #endif /* (BTA_EIR_CANNED_UUID_LIST == TRUE) */
   4194 
   4195 #if ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
   4196     /* Adding 32-bit UUID list */
   4197     if ( free_eir_length >= 2)
   4198     {
   4199         p_length = p++;
   4200         p_type   = p++;
   4201         num_uuid = 0;
   4202         data_type = BTM_EIR_COMPLETE_32BITS_UUID_TYPE;
   4203 
   4204         max_num_uuid = (free_eir_length - 2)/LEN_UUID_32;
   4205 
   4206         for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++)
   4207         {
   4208             if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_32)
   4209             {
   4210                 if ( num_uuid < max_num_uuid )
   4211                 {
   4212                     UINT32_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid32);
   4213                     num_uuid++;
   4214                 }
   4215                 else
   4216                 {
   4217                     data_type = BTM_EIR_MORE_32BITS_UUID_TYPE;
   4218                     APPL_TRACE_WARNING0("BTA EIR: UUID 32-bit list is truncated");
   4219                     break;
   4220                 }
   4221             }
   4222         }
   4223 
   4224         UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_32 + 1);
   4225         UINT8_TO_STREAM(p_type, data_type);
   4226         free_eir_length -= num_uuid * LEN_UUID_32 + 2;
   4227     }
   4228 
   4229     /* Adding 128-bit UUID list */
   4230     if ( free_eir_length >= 2)
   4231     {
   4232         p_length = p++;
   4233         p_type   = p++;
   4234         num_uuid = 0;
   4235         data_type = BTM_EIR_COMPLETE_128BITS_UUID_TYPE;
   4236 
   4237         max_num_uuid = (free_eir_length - 2)/LEN_UUID_128;
   4238 
   4239         for (custom_uuid_idx = 0; custom_uuid_idx < BTA_EIR_SERVER_NUM_CUSTOM_UUID; custom_uuid_idx++)
   4240         {
   4241             if (bta_dm_cb.custom_uuid[custom_uuid_idx].len == LEN_UUID_128)
   4242             {
   4243                 if ( num_uuid < max_num_uuid )
   4244                 {
   4245                     ARRAY16_TO_STREAM(p, bta_dm_cb.custom_uuid[custom_uuid_idx].uu.uuid128);
   4246                     num_uuid++;
   4247                 }
   4248                 else
   4249                 {
   4250                     data_type = BTM_EIR_MORE_128BITS_UUID_TYPE;
   4251                     APPL_TRACE_WARNING0("BTA EIR: UUID 128-bit list is truncated");
   4252                     break;
   4253                 }
   4254             }
   4255         }
   4256 
   4257         UINT8_TO_STREAM(p_length, num_uuid * LEN_UUID_128 + 1);
   4258         UINT8_TO_STREAM(p_type, data_type);
   4259         free_eir_length -= num_uuid * LEN_UUID_128 + 2;
   4260     }
   4261 #endif /* ( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0) */
   4262 
   4263     /* if Flags are provided in configuration */
   4264     if(( p_bta_dm_eir_cfg->bta_dm_eir_flag_len > 0 )
   4265      &&( p_bta_dm_eir_cfg->bta_dm_eir_flags )
   4266      &&( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2 ))
   4267     {
   4268         UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 1);
   4269         UINT8_TO_STREAM(p, BTM_EIR_FLAGS_TYPE);
   4270         memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_flags,
   4271                p_bta_dm_eir_cfg->bta_dm_eir_flag_len);
   4272         p += p_bta_dm_eir_cfg->bta_dm_eir_flag_len;
   4273         free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_flag_len + 2;
   4274     }
   4275 
   4276     /* if Manufacturer Specific are provided in configuration */
   4277     if(( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len > 0 )
   4278      &&( p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec )
   4279      &&( free_eir_length >= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2 ))
   4280     {
   4281         p_length = p;
   4282 
   4283         UINT8_TO_STREAM(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 1);
   4284         UINT8_TO_STREAM(p, BTM_EIR_MANUFACTURER_SPECIFIC_TYPE);
   4285         memcpy(p, p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec,
   4286                p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len);
   4287         p += p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len;
   4288         free_eir_length -= p_bta_dm_eir_cfg->bta_dm_eir_manufac_spec_len + 2;
   4289 
   4290     }
   4291     else
   4292     {
   4293         p_length = NULL;
   4294     }
   4295 
   4296     /* if Inquiry Tx Resp Power compiled */
   4297     if ((p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power) &&
   4298         (free_eir_length >= 3))
   4299     {
   4300         UINT8_TO_STREAM(p, 2);      /* Length field */
   4301         UINT8_TO_STREAM(p, BTM_EIR_TX_POWER_LEVEL_TYPE);
   4302         UINT8_TO_STREAM(p, *(p_bta_dm_eir_cfg->bta_dm_eir_inq_tx_power));
   4303         free_eir_length -= 3;
   4304     }
   4305 
   4306     if( free_eir_length )
   4307         UINT8_TO_STREAM(p, 0); /* terminator of significant part */
   4308 
   4309     BTM_WriteEIR( p_buf );
   4310 
   4311 }
   4312 #endif
   4313 
   4314 #if ( BTM_EIR_CLIENT_INCLUDED == TRUE )
   4315 /*******************************************************************************
   4316 **
   4317 ** Function         bta_dm_eir_search_services
   4318 **
   4319 ** Description      This function searches services in received EIR
   4320 **
   4321 ** Returns          None
   4322 **
   4323 *******************************************************************************/
   4324 static void bta_dm_eir_search_services( tBTM_INQ_RESULTS  *p_result,
   4325                                         tBTA_SERVICE_MASK *p_services_to_search,
   4326                                         tBTA_SERVICE_MASK *p_services_found)
   4327 {
   4328     tBTA_SERVICE_MASK       service_index = 0;
   4329     tBTM_EIR_SEARCH_RESULT  result;
   4330 
   4331     APPL_TRACE_DEBUG6("BTA searching services in EIR of BDA:0x%02X%02X%02X%02X%02X%02X",
   4332                         p_result->remote_bd_addr[0],p_result->remote_bd_addr[1],
   4333                         p_result->remote_bd_addr[2],p_result->remote_bd_addr[3],
   4334                         p_result->remote_bd_addr[4],p_result->remote_bd_addr[5]);
   4335 
   4336     APPL_TRACE_DEBUG1("    with services_to_search=0x%08X", *p_services_to_search);
   4337 
   4338 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE
   4339     /* always do GATT based service discovery by SDP instead of from EIR    */
   4340     /* if GATT based service is also to be put in EIR, need to modify this  */
   4341     while (service_index < (BTA_MAX_SERVICE_ID - 1))
   4342 #else
   4343     while(service_index < BTA_MAX_SERVICE_ID)
   4344 #endif
   4345     {
   4346         if( *p_services_to_search
   4347            & (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)))
   4348         {
   4349             result = BTM_HasInquiryEirService( p_result,
   4350                                                bta_service_id_to_uuid_lkup_tbl[service_index] );
   4351 
   4352             /* Searching for HSP v1.2 only device */
   4353             if ((result != BTM_EIR_FOUND) &&
   4354                 (bta_service_id_to_uuid_lkup_tbl[service_index] == UUID_SERVCLASS_HEADSET))
   4355             {
   4356                 result = BTM_HasInquiryEirService (p_result, UUID_SERVCLASS_HEADSET_HS);
   4357             }
   4358 
   4359             if( result == BTM_EIR_FOUND )
   4360             {
   4361                 /* If Plug and Play service record, need to check to see if Broadcom stack */
   4362                 /* However, EIR data doesn't have EXT_BRCM_VERSION so just skip it */
   4363                 if( bta_service_id_to_uuid_lkup_tbl[service_index]
   4364                     != UUID_SERVCLASS_PNP_INFORMATION )
   4365                 {
   4366 
   4367                     *p_services_found |=
   4368                        (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index));
   4369                     /* remove the service from services to be searched  */
   4370                     *p_services_to_search &=
   4371                        (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)));
   4372                 }
   4373             }
   4374             else if( result == BTM_EIR_NOT_FOUND )
   4375             {
   4376                 /* remove the service from services to be searched  */
   4377                 *p_services_to_search &=
   4378                        (tBTA_SERVICE_MASK)(~(BTA_SERVICE_ID_TO_SERVICE_MASK(service_index)));
   4379             }
   4380         }
   4381 
   4382         service_index++;
   4383     }
   4384 
   4385     APPL_TRACE_ERROR2("BTA EIR search result, services_to_search=0x%08X, services_found=0x%08X",
   4386                         *p_services_to_search, *p_services_found);
   4387 }
   4388 #endif
   4389 
   4390 #if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&(BTA_EIR_CANNED_UUID_LIST != TRUE)
   4391 /*******************************************************************************
   4392 **
   4393 ** Function         bta_dm_eir_update_uuid
   4394 **
   4395 ** Description      This function adds or removes service UUID in EIR database.
   4396 **
   4397 ** Returns          None
   4398 **
   4399 *******************************************************************************/
   4400 void bta_dm_eir_update_uuid(UINT16 uuid16, BOOLEAN adding)
   4401 {
   4402     /* if this UUID is not advertised in EIR */
   4403     if( !BTM_HasEirService( p_bta_dm_eir_cfg->uuid_mask, uuid16 ))
   4404         return;
   4405 
   4406     if( adding )
   4407     {
   4408         APPL_TRACE_EVENT1("Adding UUID=0x%04X into EIR", uuid16);
   4409 
   4410         BTM_AddEirService( bta_dm_cb.eir_uuid, uuid16 );
   4411     }
   4412     else
   4413     {
   4414         APPL_TRACE_EVENT1("Removing UUID=0x%04X from EIR", uuid16);
   4415 
   4416         BTM_RemoveEirService( bta_dm_cb.eir_uuid, uuid16 );
   4417     }
   4418 
   4419     bta_dm_set_eir (NULL);
   4420 
   4421     APPL_TRACE_EVENT2("bta_dm_eir_update_uuid UUID bit mask=0x%08X %08X",
   4422                        bta_dm_cb.eir_uuid[1], bta_dm_cb.eir_uuid[0] );
   4423 }
   4424 #endif
   4425 
   4426 /*******************************************************************************
   4427 **
   4428 ** Function         bta_dm_enable_test_mode
   4429 **
   4430 ** Description      enable test mode
   4431 **
   4432 **
   4433 ** Returns          void
   4434 **
   4435 *******************************************************************************/
   4436 void bta_dm_enable_test_mode(tBTA_DM_MSG *p_data)
   4437 {
   4438     BTM_EnableTestMode();
   4439 }
   4440 
   4441 /*******************************************************************************
   4442 **
   4443 ** Function         bta_dm_disable_test_mode
   4444 **
   4445 ** Description      disable test mode
   4446 **
   4447 **
   4448 ** Returns          void
   4449 **
   4450 *******************************************************************************/
   4451 void bta_dm_disable_test_mode(tBTA_DM_MSG *p_data)
   4452 {
   4453     BTM_DeviceReset(NULL);
   4454 }
   4455 
   4456 /*******************************************************************************
   4457 **
   4458 ** Function         bta_dm_execute_callback
   4459 **
   4460 ** Description      Just execute a generic call back in the context of the BTU/BTA tack
   4461 **
   4462 **
   4463 ** Returns          void
   4464 **
   4465 *******************************************************************************/
   4466 void bta_dm_execute_callback(tBTA_DM_MSG *p_data)
   4467 {
   4468     /* sanity check */
   4469     if(p_data->exec_cback.p_exec_cback == NULL)
   4470     {
   4471         return;
   4472     }
   4473 
   4474     p_data->exec_cback.p_exec_cback(p_data->exec_cback.p_param);
   4475 }
   4476 /*******************************************************************************
   4477 **
   4478 ** Function         bta_dm_encrypt_cback
   4479 **
   4480 ** Description      link encryption complete callback.
   4481 **
   4482 ** Returns         None
   4483 **
   4484 *******************************************************************************/
   4485 void bta_dm_encrypt_cback(BD_ADDR bd_addr, void *p_ref_data, tBTM_STATUS result)
   4486 {
   4487     tBTA_STATUS   bta_status = BTA_SUCCESS;
   4488     tBTA_DM_ENCRYPT_CBACK *p_callback = bta_dm_cb.p_encrypt_cback;
   4489 
   4490     bta_dm_cb.p_encrypt_cback = NULL;
   4491     switch (result)
   4492     {
   4493         case BTM_SUCCESS:
   4494             break;
   4495         case BTM_WRONG_MODE:
   4496             bta_status = BTA_WRONG_MODE;
   4497             break;
   4498         case BTM_NO_RESOURCES:
   4499             bta_status = BTA_NO_RESOURCES;
   4500             break;
   4501         case BTM_BUSY:
   4502             bta_status = BTA_BUSY;
   4503             break;
   4504         default:
   4505             bta_status = BTA_FAILURE;
   4506             break;
   4507     }
   4508 
   4509     APPL_TRACE_DEBUG2("bta_dm_encrypt_cback status =%d p_callback=0x%x", bta_status, p_callback);
   4510 
   4511     if (p_callback)
   4512     {
   4513         (*p_callback)(bd_addr, bta_status);
   4514     }
   4515 }
   4516 /*******************************************************************************
   4517 **
   4518 ** Function         bta_dm_set_encryption
   4519 **
   4520 ** Description      This function to encrypt the link
   4521 **
   4522 ** Returns          None
   4523 **
   4524 *******************************************************************************/
   4525 void bta_dm_set_encryption (tBTA_DM_MSG *p_data)
   4526 {
   4527 
   4528     APPL_TRACE_DEBUG0("bta_dm_set_encryption"); //todo
   4529     if (!p_data->set_encryption.p_callback)
   4530     {
   4531         APPL_TRACE_ERROR0("bta_dm_set_encryption callback is not provided");
   4532         return;
   4533     }
   4534 
   4535     if (bta_dm_cb.p_encrypt_cback)
   4536     {
   4537         (*p_data->set_encryption.p_callback)(p_data->set_encryption.bd_addr, BTA_BUSY);
   4538         return;
   4539     }
   4540 
   4541 
   4542     bta_dm_cb.p_encrypt_cback = p_data->set_encryption.p_callback;
   4543     bta_dm_cb.sec_act         = p_data->set_encryption.sec_act;
   4544     BTM_SetEncryption(p_data->set_encryption.bd_addr, bta_dm_encrypt_cback, &bta_dm_cb.sec_act);
   4545 }
   4546 
   4547 /*******************************************************************************
   4548 **
   4549 ** Function         bta_dm_set_afh_channels
   4550 **
   4551 ** Description      set afh channels
   4552 **
   4553 **
   4554 ** Returns          void
   4555 **
   4556 *******************************************************************************/
   4557 void bta_dm_set_afh_channels(tBTA_DM_MSG * p_data)
   4558 {
   4559 
   4560     BTM_SetAfhChannels(p_data->set_afhchannels.first,p_data->set_afhchannels.last);
   4561 }
   4562 
   4563 /*******************************************************************************
   4564 **
   4565 ** Function         bta_dm_set_afh_channel_assesment
   4566 **
   4567 ** Description      set afh channel assesment
   4568 **
   4569 **
   4570 ** Returns          void
   4571 **
   4572 *******************************************************************************/
   4573 
   4574 void bta_dm_set_afh_channel_assesment (tBTA_DM_MSG * p_data)
   4575 {
   4576     BTM_SetAfhChannelAssessment(p_data->set_afh_channel_assessment.enable_or_disable);
   4577 }
   4578 
   4579 #if (BLE_INCLUDED == TRUE)
   4580 /*******************************************************************************
   4581 **
   4582 ** Function         bta_dm_observe_results_cb
   4583 **
   4584 ** Description      Callback for BLE Observe result
   4585 **
   4586 **
   4587 ** Returns          void
   4588 **
   4589 *******************************************************************************/
   4590 static void bta_dm_observe_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir)
   4591 {
   4592 ;
   4593     tBTA_DM_SEARCH     result;
   4594     tBTM_INQ_INFO      *p_inq_info;
   4595     UINT16             service_class;
   4596     APPL_TRACE_DEBUG0("bta_dm_observe_results_cb")
   4597 
   4598     bdcpy(result.inq_res.bd_addr, p_inq->remote_bd_addr);
   4599     result.inq_res.rssi = p_inq->rssi;
   4600     result.inq_res.ble_addr_type    = p_inq->ble_addr_type;
   4601     result.inq_res.inq_result_type  = p_inq->inq_result_type;
   4602     result.inq_res.device_type      = p_inq->device_type;
   4603 
   4604     /* application will parse EIR to find out remote device name */
   4605     result.inq_res.p_eir = p_eir;
   4606 
   4607     if((p_inq_info = BTM_InqDbRead(p_inq->remote_bd_addr)) != NULL)
   4608     {
   4609         /* initialize remt_name_not_required to FALSE so that we get the name by default */
   4610         result.inq_res.remt_name_not_required = FALSE;
   4611     }
   4612 
   4613     if(bta_dm_search_cb.p_scan_cback)
   4614         bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_RES_EVT, &result);
   4615 
   4616     if(p_inq_info)
   4617     {
   4618         /* application indicates if it knows the remote name, inside the callback
   4619          copy that to the inquiry data base*/
   4620         if(result.inq_res.remt_name_not_required)
   4621             p_inq_info->appl_knows_rem_name = TRUE;
   4622     }
   4623 }
   4624 
   4625 /*******************************************************************************
   4626 **
   4627 ** Function         bta_dm_observe_cmpl_cb
   4628 **
   4629 ** Description      Callback for BLE Observe complete
   4630 **
   4631 **
   4632 ** Returns          void
   4633 **
   4634 *******************************************************************************/
   4635 static void bta_dm_observe_cmpl_cb (void * p_result)
   4636 {
   4637     tBTA_DM_SEARCH  data;
   4638 
   4639     APPL_TRACE_DEBUG0("bta_dm_observe_cmpl_cb");
   4640 
   4641     data.inq_cmpl.num_resps = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp;
   4642     if (bta_dm_search_cb.p_scan_cback)
   4643     {
   4644         bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data);
   4645     }
   4646 }
   4647 
   4648 #if (SMP_INCLUDED == TRUE)
   4649 /*******************************************************************************
   4650 **
   4651 ** Function         bta_dm_ble_smp_cback
   4652 **
   4653 ** Description      Callback for BLE SMP
   4654 **
   4655 **
   4656 ** Returns          void
   4657 **
   4658 *******************************************************************************/
   4659 static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DATA *p_data)
   4660 {
   4661     tBTM_STATUS status = BTM_SUCCESS;
   4662     tBTA_DM_SEC sec_event;
   4663     char* p_name = NULL;
   4664     UINT8 i;
   4665 
   4666     APPL_TRACE_DEBUG0("bta_dm_ble_smp_cback");
   4667 
   4668     if (!bta_dm_cb.p_sec_cback)
   4669         return BTM_NOT_AUTHORIZED;
   4670 
   4671     memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
   4672     switch (event)
   4673     {
   4674         case BTM_LE_IO_REQ_EVT:
   4675 #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE)
   4676 
   4677             bta_dm_co_ble_io_req(bda,
   4678                                  &p_data->io_req.io_cap,
   4679                                  &p_data->io_req.oob_data,
   4680                                  &p_data->io_req.auth_req,
   4681                                  &p_data->io_req.max_key_size,
   4682                                  &p_data->io_req.init_keys,
   4683                                  &p_data->io_req.resp_keys);
   4684 #endif
   4685 #if BTM_OOB_INCLUDED == FALSE
   4686             status = BTM_SUCCESS;
   4687 #endif
   4688             APPL_TRACE_EVENT2("io mitm: %d oob_data:%d", p_data->io_req.auth_req, p_data->io_req.oob_data);
   4689 
   4690             break;
   4691 
   4692         case BTM_LE_SEC_REQUEST_EVT:
   4693             bdcpy(sec_event.ble_req.bd_addr, bda);
   4694             p_name = BTM_SecReadDevName(bda);
   4695             if (p_name != NULL)
   4696             {
   4697                 BCM_STRNCPY_S((char*)sec_event.ble_req.bd_name,
   4698                                sizeof(BD_NAME), p_name, (BD_NAME_LEN));
   4699             }
   4700             else
   4701             {
   4702                 sec_event.ble_req.bd_name[0] = 0;
   4703             }
   4704             bta_dm_cb.p_sec_cback(BTA_DM_BLE_SEC_REQ_EVT, &sec_event);
   4705             break;
   4706 
   4707         case BTM_LE_KEY_NOTIF_EVT:
   4708             bdcpy(sec_event.key_notif.bd_addr, bda);
   4709             p_name = BTM_SecReadDevName(bda);
   4710             if (p_name != NULL)
   4711             {
   4712                 BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name,
   4713                                sizeof(BD_NAME), p_name, (BD_NAME_LEN));
   4714             }
   4715             else
   4716             {
   4717                 sec_event.key_notif.bd_name[0] = 0;
   4718             }
   4719            sec_event.key_notif.passkey = p_data->key_notif;
   4720            bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_NOTIF_EVT, &sec_event);
   4721            break;
   4722 
   4723         case BTM_LE_KEY_REQ_EVT:
   4724             bdcpy(sec_event.ble_req.bd_addr, bda);
   4725             bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_REQ_EVT, &sec_event);
   4726             break;
   4727 
   4728         case BTM_LE_OOB_REQ_EVT:
   4729             bdcpy(sec_event.ble_req.bd_addr, bda);
   4730             bta_dm_cb.p_sec_cback(BTA_DM_BLE_OOB_REQ_EVT, &sec_event);
   4731             break;
   4732 
   4733         case BTM_LE_KEY_EVT:
   4734             bdcpy(sec_event.ble_key.bd_addr, bda);
   4735             sec_event.ble_key.key_type = p_data->key.key_type;
   4736 
   4737             if (p_data->key.key_type == BTM_LE_KEY_PID)
   4738             {
   4739                 for (i=0; i<BT_OCTET16_LEN; i++ )
   4740                 {
   4741                     sec_event.ble_key.key_value.pid_key.irk[i] = p_data->key.p_key_value->pid_key.irk[i];
   4742                 }
   4743                 sec_event.ble_key.key_value.pid_key.addr_type = p_data->key.p_key_value->pid_key.addr_type;
   4744                 memcpy( &(sec_event.ble_key.key_value.pid_key.static_addr),
   4745                         &(p_data->key.p_key_value->pid_key.static_addr),
   4746                         sizeof (BD_ADDR));
   4747             }
   4748             else
   4749             {
   4750                 memcpy(&sec_event.ble_key.key_value, p_data->key.p_key_value, sizeof(tBTM_LE_KEY_VALUE));
   4751             }
   4752             // memcpy(&sec_event.ble_key.key_value, p_data->key.p_key_value, sizeof(tBTM_LE_KEY_VALUE)); todo will crash
   4753             bta_dm_cb.p_sec_cback(BTA_DM_BLE_KEY_EVT, &sec_event);
   4754             break;
   4755 
   4756         case BTM_LE_COMPLT_EVT:
   4757             bdcpy(sec_event.auth_cmpl.bd_addr, bda);
   4758             p_name = BTM_SecReadDevName(bda);
   4759             if (p_name != NULL)
   4760             {
   4761                 BCM_STRNCPY_S((char*)sec_event.auth_cmpl.bd_name,
   4762                                sizeof(BD_NAME), p_name, (BD_NAME_LEN));
   4763             }
   4764             else
   4765             {
   4766                 sec_event.auth_cmpl.bd_name[0] = 0;
   4767             }
   4768             if (p_data->complt.reason != 0)
   4769             {
   4770                 sec_event.auth_cmpl.fail_reason = BTA_DM_AUTH_CONVERT_SMP_CODE(((UINT8)p_data->complt.reason));
   4771                 /* delete this device entry from Sec Dev DB */
   4772                 bta_dm_remove_sec_dev_entry (bda);
   4773             }
   4774             else
   4775             {
   4776                 sec_event.auth_cmpl.success = TRUE;
   4777             }
   4778             sec_event.auth_cmpl.privacy_enabled = p_data->complt.privacy_supported;
   4779             if (bta_dm_cb.p_sec_cback)
   4780             {
   4781                 //bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
   4782                 bta_dm_cb.p_sec_cback(BTA_DM_BLE_AUTH_CMPL_EVT, &sec_event);
   4783             }
   4784 
   4785             break;
   4786 
   4787         default:
   4788             status = BTM_NOT_AUTHORIZED;
   4789             break;
   4790     }
   4791     return status;
   4792 }
   4793 #endif  /* SMP_INCLUDED == TRUE */
   4794 
   4795 /*******************************************************************************
   4796 **
   4797 ** Function         bta_dm_ble_id_key_cback
   4798 **
   4799 ** Description      Callback for BLE local ID keys
   4800 **
   4801 **
   4802 ** Returns          void
   4803 **
   4804 *******************************************************************************/
   4805 static void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key)
   4806 {
   4807     UINT8   evt;
   4808     tBTA_DM_SEC dm_key;
   4809 
   4810     switch (key_type)
   4811     {
   4812         case BTM_BLE_KEY_TYPE_ID:
   4813         case BTM_BLE_KEY_TYPE_ER:
   4814             if (bta_dm_cb.p_sec_cback)
   4815             {
   4816                 memcpy(&dm_key.ble_id_keys, p_key, sizeof(tBTM_BLE_LOCAL_KEYS));
   4817 
   4818                 evt = (key_type == BTM_BLE_KEY_TYPE_ID) ? BTA_DM_BLE_LOCAL_IR_EVT :\
   4819                       BTA_DM_BLE_LOCAL_ER_EVT;
   4820                 bta_dm_cb.p_sec_cback(evt, &dm_key);
   4821             }
   4822             break;
   4823 
   4824         default:
   4825             APPL_TRACE_DEBUG1("Unknown key type %d", key_type);
   4826             break;
   4827     }
   4828     return;
   4829 
   4830 }
   4831 
   4832 /*******************************************************************************
   4833 **
   4834 ** Function         bta_dm_add_blekey
   4835 **
   4836 ** Description      This function adds an BLE Key to an security database entry.
   4837 **                  This function shall only be called AFTER BTA_DmAddBleDevice has been called.
   4838 **                  It is normally called during host startup to restore all required information
   4839 **                  stored in the NVRAM.
   4840 **
   4841 ** Parameters:
   4842 **
   4843 *******************************************************************************/
   4844 void bta_dm_add_blekey (tBTA_DM_MSG *p_data)
   4845 {
   4846     if (!BTM_SecAddBleKey (p_data->add_ble_key.bd_addr,
   4847                            (tBTM_LE_KEY_VALUE *)&p_data->add_ble_key.blekey,
   4848                            p_data->add_ble_key.key_type))
   4849     {
   4850         APPL_TRACE_ERROR2 ("BTA_DM: Error adding BLE Key for device %08x%04x",
   4851                            (p_data->add_ble_key.bd_addr[0]<<24)+(p_data->add_ble_key.bd_addr[1]<<16)+\
   4852                            (p_data->add_ble_key.bd_addr[2]<<8)+p_data->add_ble_key.bd_addr[3],
   4853                            (p_data->add_ble_key.bd_addr[4]<<8)+p_data->add_ble_key.bd_addr[5]);
   4854     }
   4855 }
   4856 
   4857 /*******************************************************************************
   4858 **
   4859 ** Function         bta_dm_add_ble_device
   4860 **
   4861 ** Description      This function adds an BLE device to an security database entry.
   4862 **                  It is normally called during host startup to restore all required information
   4863 **                  stored in the NVRAM.
   4864 **
   4865 ** Parameters:
   4866 **
   4867 *******************************************************************************/
   4868 void bta_dm_add_ble_device (tBTA_DM_MSG *p_data)
   4869 {
   4870     if (!BTM_SecAddBleDevice (p_data->add_ble_device.bd_addr, NULL,
   4871                               p_data->add_ble_device.dev_type  ,
   4872                               p_data->add_ble_device.addr_type))
   4873     {
   4874         APPL_TRACE_ERROR2 ("BTA_DM: Error adding BLE Device for device %08x%04x",
   4875                            (p_data->add_ble_device.bd_addr[0]<<24)+(p_data->add_ble_device.bd_addr[1]<<16)+ \
   4876                            (p_data->add_ble_device.bd_addr[2]<<8)+p_data->add_ble_device.bd_addr[3],
   4877                            (p_data->add_ble_device.bd_addr[4]<<8)+p_data->add_ble_device.bd_addr[5]);
   4878     }
   4879 }
   4880 
   4881 /*******************************************************************************
   4882 **
   4883 ** Function         bta_dm_add_ble_device
   4884 **
   4885 ** Description      This function adds an BLE device to an security database entry.
   4886 **                  It is normally called during host startup to restore all required information
   4887 **                  stored in the NVRAM.
   4888 **
   4889 ** Parameters:
   4890 **
   4891 *******************************************************************************/
   4892 void bta_dm_ble_passkey_reply (tBTA_DM_MSG *p_data)
   4893 {
   4894     if (p_data->pin_reply.accept)
   4895     {
   4896 
   4897         BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_SUCCESS, p_data->ble_passkey_reply.passkey);
   4898     }
   4899     else
   4900     {
   4901         BTM_BlePasskeyReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED, p_data->ble_passkey_reply.passkey);
   4902     }
   4903 
   4904 }
   4905 
   4906 /*******************************************************************************
   4907 **
   4908 ** Function         bta_dm_security_grant
   4909 **
   4910 ** Description      This function grant SMP security request access.
   4911 **
   4912 ** Parameters:
   4913 **
   4914 *******************************************************************************/
   4915 void bta_dm_security_grant (tBTA_DM_MSG *p_data)
   4916 {
   4917     BTM_SecurityGrant(p_data->ble_sec_grant.bd_addr, p_data->ble_sec_grant.res);
   4918 }
   4919 
   4920 /*******************************************************************************
   4921 **
   4922 ** Function         bta_dm_ble_set_bg_conn_type
   4923 **
   4924 ** Description      This function set the BLE background connection type
   4925 **
   4926 ** Parameters:
   4927 **
   4928 *******************************************************************************/
   4929 void bta_dm_ble_set_bg_conn_type (tBTA_DM_MSG *p_data)
   4930 {
   4931     BTM_BleSetBgConnType(p_data->ble_set_bd_conn_type.bg_conn_type,
   4932                          p_data->ble_set_bd_conn_type.p_select_cback);
   4933 }
   4934 
   4935 /*******************************************************************************
   4936 **
   4937 ** Function         bta_dm_ble_set_conn_params
   4938 **
   4939 ** Description      This function set the preferred connection parameters.
   4940 **
   4941 ** Parameters:
   4942 **
   4943 *******************************************************************************/
   4944 void bta_dm_ble_set_conn_params (tBTA_DM_MSG *p_data)
   4945 {
   4946     BTM_BleSetPrefConnParams(p_data->ble_set_conn_params.peer_bda,
   4947                              p_data->ble_set_conn_params.conn_int_min,
   4948                              p_data->ble_set_conn_params.conn_int_max,
   4949                              p_data->ble_set_conn_params.slave_latency,
   4950                              p_data->ble_set_conn_params.supervision_tout);
   4951 }
   4952 
   4953 /*******************************************************************************
   4954 **
   4955 ** Function         bta_dm_ble_set_scan_params
   4956 **
   4957 ** Description      This function set the preferred connection scan parameters.
   4958 **
   4959 ** Parameters:
   4960 **
   4961 *******************************************************************************/
   4962 void bta_dm_ble_set_scan_params (tBTA_DM_MSG *p_data)
   4963 {
   4964     BTM_BleSetConnScanParams(p_data->ble_set_scan_params.scan_int,
   4965                              p_data->ble_set_scan_params.scan_window);
   4966 }
   4967 
   4968 
   4969 /*******************************************************************************
   4970 **
   4971 ** Function         bta_dm_ble_observe
   4972 **
   4973 ** Description      This function set the preferred connection scan parameters.
   4974 **
   4975 ** Parameters:
   4976 **
   4977 *******************************************************************************/
   4978 void bta_dm_ble_observe (tBTA_DM_MSG *p_data)
   4979 {
   4980 
   4981     tBTM_STATUS status;
   4982     if (p_data->ble_observe.start)
   4983     {
   4984         /*Save the  callback to be called when a scan results are available */
   4985         bta_dm_search_cb.p_scan_cback = p_data->ble_observe.p_cback;
   4986         if ((status = BTM_BleObserve(TRUE, p_data->ble_observe.duration,
   4987                                 bta_dm_observe_results_cb, bta_dm_observe_cmpl_cb))!= BTM_SUCCESS)
   4988         {
   4989             tBTA_DM_SEARCH  data;
   4990             APPL_TRACE_WARNING2(" %s BTM_BleObserve  failed. status %d",__FUNCTION__,status);
   4991             data.inq_cmpl.num_resps = 0;
   4992             if (bta_dm_search_cb.p_scan_cback)
   4993             {
   4994                 bta_dm_search_cb.p_scan_cback(BTA_DM_INQ_CMPL_EVT, &data);
   4995             }
   4996         }
   4997     }
   4998     else
   4999     {
   5000         bta_dm_search_cb.p_scan_cback = NULL;
   5001         BTM_BleObserve(FALSE, 0, NULL,NULL );
   5002     }
   5003 }
   5004 /*******************************************************************************
   5005 **
   5006 ** Function         bta_dm_ble_set_scan_params
   5007 **
   5008 ** Description      This function set the adv parameters.
   5009 **
   5010 ** Parameters:
   5011 **
   5012 *******************************************************************************/
   5013 void bta_dm_ble_set_adv_params (tBTA_DM_MSG *p_data)
   5014 {
   5015     BTM_BleSetAdvParams(p_data->ble_set_adv_params.adv_int_min,
   5016                         p_data->ble_set_adv_params.adv_int_max,
   5017                         p_data->ble_set_adv_params.p_dir_bda,
   5018                         BTA_DM_BLE_ADV_CHNL_MAP);
   5019 }
   5020 
   5021 /*******************************************************************************
   5022 **
   5023 ** Function         bta_dm_ble_set_adv_config
   5024 **
   5025 ** Description      This function set the customized ADV data configuration
   5026 **
   5027 ** Parameters:
   5028 **
   5029 *******************************************************************************/
   5030 void bta_dm_ble_set_adv_config (tBTA_DM_MSG *p_data)
   5031 {
   5032     BTM_BleWriteAdvData(p_data->ble_set_adv_data.data_mask,
   5033                         (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg);
   5034 }
   5035 
   5036 /*******************************************************************************
   5037 **
   5038 ** Function         bta_dm_ble_set_scan_rsp
   5039 **
   5040 ** Description      This function set the customized ADV scan resp. configuration
   5041 **
   5042 ** Parameters:
   5043 **
   5044 *******************************************************************************/
   5045 void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data)
   5046 {
   5047     BTM_BleWriteScanRsp(p_data->ble_set_adv_data.data_mask,
   5048                         (tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg);
   5049 }
   5050 
   5051 /*******************************************************************************
   5052 **
   5053 ** Function         bta_dm_ble_broadcast
   5054 **
   5055 ** Description      Starts or stops LE broadcasts
   5056 **
   5057 ** Parameters:
   5058 **
   5059 *******************************************************************************/
   5060 void bta_dm_ble_broadcast (tBTA_DM_MSG *p_data)
   5061 {
   5062     BTM_BleBroadcast(p_data->ble_observe.start);
   5063 }
   5064 
   5065 #if ((defined BTA_GATT_INCLUDED) &&  (BTA_GATT_INCLUDED == TRUE))
   5066 #ifndef BTA_DM_GATT_CLOSE_DELAY_TOUT
   5067 #define BTA_DM_GATT_CLOSE_DELAY_TOUT    1000
   5068 #endif
   5069 
   5070 /*******************************************************************************
   5071 **
   5072 ** Function         bta_dm_gattc_register
   5073 **
   5074 ** Description      Register with GATTC in DM if BLE is needed.
   5075 **
   5076 **
   5077 ** Returns          void
   5078 **
   5079 *******************************************************************************/
   5080 static void bta_dm_gattc_register(void)
   5081 {
   5082     tBT_UUID                app_uuid = {LEN_UUID_128,{0}};
   5083 
   5084     if (bta_dm_search_cb.client_if == BTA_GATTS_INVALID_IF)
   5085     {
   5086         memset (&app_uuid.uu.uuid128, 0x87, LEN_UUID_128);
   5087         BTA_GATTC_AppRegister(&app_uuid, bta_dm_gattc_callback);
   5088     }
   5089 }
   5090 
   5091 /*******************************************************************************
   5092 **
   5093 ** Function         btm_dm_start_disc_gatt_services
   5094 **
   5095 ** Description      This function starts a GATT service search request.
   5096 **
   5097 ** Parameters:
   5098 **
   5099 *******************************************************************************/
   5100 static void btm_dm_start_disc_gatt_services (UINT16 conn_id)
   5101 {
   5102     tBT_UUID    *p_uuid = bta_dm_search_cb.p_srvc_uuid +
   5103                           bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search;
   5104 
   5105     p_uuid = bta_dm_search_cb.p_srvc_uuid +
   5106              bta_dm_search_cb.num_uuid - bta_dm_search_cb.uuid_to_search;
   5107 
   5108     /* always search for all services */
   5109     BTA_GATTC_ServiceSearchRequest(conn_id, p_uuid);
   5110 }
   5111 
   5112 /*******************************************************************************
   5113 **
   5114 ** Function         bta_dm_gatt_disc_result
   5115 **
   5116 ** Description      This function process the GATT service search result.
   5117 **
   5118 ** Parameters:
   5119 **
   5120 *******************************************************************************/
   5121 static void bta_dm_gatt_disc_result(tBTA_GATT_ID service_id)
   5122 {
   5123     tBTA_DM_SEARCH   result;
   5124 
   5125     /*
   5126         * This logic will not work for gatt case.  We are checking against the bluetooth profiles here
   5127         * just copy the GATTID in raw data field and send it across.
   5128         */
   5129 
   5130 
   5131     if ( bta_dm_search_cb.ble_raw_used + sizeof(tBTA_GATT_ID) < bta_dm_search_cb.ble_raw_size )
   5132     {
   5133         APPL_TRACE_DEBUG3("ADDING BLE SERVICE uuid=0x%x, ble_ptr = 0x%x, ble_raw_used = 0x%x", service_id.uuid.uu.uuid16,bta_dm_search_cb.p_ble_rawdata,bta_dm_search_cb.ble_raw_used);
   5134 
   5135         if(bta_dm_search_cb.p_ble_rawdata)
   5136         {
   5137             memcpy((bta_dm_search_cb.p_ble_rawdata + bta_dm_search_cb.ble_raw_used), &service_id,
   5138                    sizeof(service_id) );
   5139 
   5140             bta_dm_search_cb.ble_raw_used += sizeof(service_id);
   5141         }
   5142         else
   5143         {
   5144             APPL_TRACE_ERROR0("p_ble_rawdata is NULL");
   5145         }
   5146 
   5147     }
   5148     else
   5149     {
   5150         APPL_TRACE_ERROR3("%s out of room to accomodate more service ids ble_raw_size = %d ble_raw_used = %d", __FUNCTION__,bta_dm_search_cb.ble_raw_size, bta_dm_search_cb.ble_raw_used );
   5151     }
   5152 
   5153     APPL_TRACE_ERROR1("bta_dm_gatt_disc_result serivce_id len=%d ", service_id.uuid.len);
   5154     if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE)
   5155     {
   5156 
   5157         /* send result back to app now, one by one */
   5158         bdcpy (result.disc_ble_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
   5159         BCM_STRNCPY_S((char*)result.disc_ble_res.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN-1));
   5160         result.disc_ble_res.bd_name[BD_NAME_LEN] = 0;
   5161         memcpy(&result.disc_ble_res.service, &service_id.uuid, sizeof(tBT_UUID));
   5162 
   5163         bta_dm_search_cb.p_search_cback(BTA_DM_DISC_BLE_RES_EVT, &result);
   5164     }
   5165 }
   5166 
   5167 /*******************************************************************************
   5168 **
   5169 ** Function         bta_dm_gatt_disc_complete
   5170 **
   5171 ** Description      This function process the GATT service search complete.
   5172 **
   5173 ** Parameters:
   5174 **
   5175 *******************************************************************************/
   5176 static void bta_dm_gatt_disc_complete(UINT16 conn_id, tBTA_GATT_STATUS status)
   5177 {
   5178     tBTA_DM_MSG *p_msg;
   5179 
   5180     APPL_TRACE_DEBUG1("bta_dm_gatt_disc_complete conn_id = %d",conn_id);
   5181 
   5182     if (bta_dm_search_cb.uuid_to_search > 0) bta_dm_search_cb.uuid_to_search --;
   5183 
   5184     if (status == BTA_GATT_OK && bta_dm_search_cb.uuid_to_search > 0)
   5185     {
   5186         btm_dm_start_disc_gatt_services(conn_id);
   5187     }
   5188     else
   5189     {
   5190         bta_dm_search_cb.uuid_to_search = 0;
   5191 
   5192         /* no more services to be discovered */
   5193         if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL)
   5194         {
   5195             p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT;
   5196             p_msg->disc_result.result.disc_res.result = (status == BTA_GATT_OK) ? BTA_SUCCESS :BTA_FAILURE;
   5197             p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found;
   5198             p_msg->disc_result.result.disc_res.num_uuids = 0;
   5199             p_msg->disc_result.result.disc_res.p_uuid_list = NULL;
   5200             bdcpy (p_msg->disc_result.result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr);
   5201             BCM_STRNCPY_S((char*)p_msg->disc_result.result.disc_res.bd_name, sizeof(BD_NAME),
   5202                     bta_dm_get_remname(), (BD_NAME_LEN-1));
   5203 
   5204             /* make sure the string is terminated */
   5205             p_msg->disc_result.result.disc_res.bd_name[BD_NAME_LEN-1] = 0;
   5206 
   5207             p_msg->disc_result.result.disc_res.device_type = BT_DEVICE_TYPE_BLE;
   5208             if ( bta_dm_search_cb.ble_raw_used > 0 )
   5209             {
   5210                 p_msg->disc_result.result.disc_res.p_raw_data = GKI_getbuf(bta_dm_search_cb.ble_raw_used);
   5211 
   5212                 memcpy( p_msg->disc_result.result.disc_res.p_raw_data,
   5213                             bta_dm_search_cb.p_ble_rawdata,
   5214                             bta_dm_search_cb.ble_raw_used );
   5215 
   5216                 p_msg->disc_result.result.disc_res.raw_data_size = bta_dm_search_cb.ble_raw_used;
   5217             }
   5218             else
   5219             {
   5220                 p_msg->disc_result.result.disc_res.p_raw_data = NULL;
   5221                 bta_dm_search_cb.p_ble_rawdata = 0;
   5222             }
   5223 
   5224             bta_sys_sendmsg(p_msg);
   5225         }
   5226         if (conn_id != BTA_GATT_INVALID_CONN_ID)
   5227         {
   5228             if (BTA_DM_GATT_CLOSE_DELAY_TOUT != 0)
   5229             {
   5230                 bta_sys_start_timer(&bta_dm_search_cb.gatt_close_timer, BTA_DM_DISC_CLOSE_TOUT_EVT,
   5231                                      BTA_DM_GATT_CLOSE_DELAY_TOUT);
   5232             }
   5233             else
   5234             {
   5235                 BTA_GATTC_Close(conn_id);
   5236                 bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID;
   5237             }
   5238         }
   5239 
   5240         bta_dm_search_cb.gatt_disc_active = FALSE;
   5241     }
   5242 }
   5243 
   5244 /*******************************************************************************
   5245 **
   5246 ** Function         bta_dm_close_gatt_conn
   5247 **
   5248 ** Description      This function close the GATT connection after delay timeout.
   5249 **
   5250 ** Parameters:
   5251 **
   5252 *******************************************************************************/
   5253 void bta_dm_close_gatt_conn(tBTA_DM_MSG *p_data)
   5254 {
   5255     if (bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID)
   5256         BTA_GATTC_Close(bta_dm_search_cb.conn_id);
   5257 
   5258     bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID;
   5259 }
   5260 
   5261 /*******************************************************************************
   5262 **
   5263 ** Function         btm_dm_start_gatt_discovery
   5264 **
   5265 ** Description      This is GATT initiate the service search by open a GATT connection
   5266 **                  first.
   5267 **
   5268 ** Parameters:
   5269 **
   5270 *******************************************************************************/
   5271 void btm_dm_start_gatt_discovery (BD_ADDR bd_addr)
   5272 {
   5273     bta_dm_search_cb.gatt_disc_active = TRUE;
   5274 
   5275     /* connection is already open */
   5276     if (bdcmp(bta_dm_search_cb.pending_close_bda, bd_addr) == 0 &&
   5277         bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID)
   5278     {
   5279         memset(bta_dm_search_cb.pending_close_bda, 0, BD_ADDR_LEN);
   5280         bta_sys_stop_timer(&bta_dm_search_cb.gatt_close_timer);
   5281         btm_dm_start_disc_gatt_services(bta_dm_search_cb.conn_id);
   5282     }
   5283     else
   5284         BTA_GATTC_Open(bta_dm_search_cb.client_if, bd_addr, TRUE);
   5285 }
   5286 
   5287 /*******************************************************************************
   5288 **
   5289 ** Function         bta_dm_cancel_gatt_discovery
   5290 **
   5291 ** Description      This is GATT cancel the GATT service search.
   5292 **
   5293 ** Parameters:
   5294 **
   5295 *******************************************************************************/
   5296 static void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr)
   5297 {
   5298     if (bta_dm_search_cb.conn_id == BTA_GATT_INVALID_CONN_ID)
   5299     {
   5300         BTA_GATTC_CancelOpen(bta_dm_search_cb.client_if, bd_addr, TRUE);
   5301     }
   5302 
   5303     bta_dm_gatt_disc_complete(bta_dm_search_cb.conn_id, (tBTA_GATT_STATUS) BTA_GATT_ERROR);
   5304 }
   5305 
   5306 /*******************************************************************************
   5307 **
   5308 ** Function         bta_dm_proc_open_evt
   5309 **
   5310 ** Description      process BTA_GATTC_OPEN_EVT in DM.
   5311 **
   5312 ** Parameters:
   5313 **
   5314 *******************************************************************************/
   5315 void bta_dm_proc_open_evt(tBTA_GATTC_OPEN *p_data)
   5316 {
   5317     UINT8           *p1;
   5318     UINT8           *p2;
   5319 
   5320     p1 = bta_dm_search_cb.peer_bdaddr;
   5321     p2 = p_data->remote_bda;
   5322 
   5323     APPL_TRACE_DEBUG5("DM Search state= %d search_cb.peer_dbaddr: [%08x%04x] connected_bda= [%08x%04x] ",
   5324                       bta_dm_search_cb.state,
   5325                       ((p1[0])<<24)+((p1[1])<<16)+((p1[2])<<8)+(p1[3]),
   5326                       ((p1[4])<<8)+ p1[5],
   5327                       ((p2[0])<<24)+((p2[1])<<16)+((p2[2])<<8)+(p2[3]),
   5328                       ((p2[4])<<8)+ p2[5]);
   5329 
   5330     APPL_TRACE_DEBUG3("BTA_GATTC_OPEN_EVT conn_id = %d client_if=%d status = %d" ,
   5331                       p_data->conn_id,
   5332                       p_data->client_if,
   5333                       p_data->status);
   5334 
   5335     bta_dm_search_cb.conn_id = p_data->conn_id;
   5336 
   5337     if (p_data->status == BTA_GATT_OK)
   5338     {
   5339         btm_dm_start_disc_gatt_services(p_data->conn_id);
   5340     }
   5341     else
   5342     {
   5343         bta_dm_gatt_disc_complete(BTA_GATT_INVALID_CONN_ID, p_data->status);
   5344     }
   5345 }
   5346 
   5347 /*******************************************************************************
   5348 **
   5349 ** Function         bta_dm_gattc_callback
   5350 **
   5351 ** Description      This is GATT client callback function used in DM.
   5352 **
   5353 ** Parameters:
   5354 **
   5355 *******************************************************************************/
   5356 static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data)
   5357 {
   5358     APPL_TRACE_DEBUG1("bta_dm_gattc_callback event = %d", event);
   5359 
   5360     switch (event)
   5361     {
   5362         case BTA_GATTC_REG_EVT:
   5363             APPL_TRACE_DEBUG1("BTA_GATTC_REG_EVT client_if = %d",  p_data->reg_oper.client_if);
   5364             if (p_data->reg_oper.status == BTA_GATT_OK)
   5365                 bta_dm_search_cb.client_if = p_data->reg_oper.client_if;
   5366             else
   5367                 bta_dm_search_cb.client_if = BTA_GATTS_INVALID_IF;
   5368             break;
   5369 
   5370         case BTA_GATTC_OPEN_EVT:
   5371             bta_dm_proc_open_evt(&p_data->open);
   5372             break;
   5373 
   5374         case BTA_GATTC_SEARCH_RES_EVT:
   5375             bta_dm_gatt_disc_result(p_data->srvc_res.service_uuid.id);
   5376             break;
   5377 
   5378         case BTA_GATTC_SEARCH_CMPL_EVT:
   5379             if ( bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE)
   5380                 bta_dm_gatt_disc_complete(p_data->search_cmpl.conn_id, p_data->search_cmpl.status);
   5381             break;
   5382 
   5383         case BTA_GATTC_CLOSE_EVT:
   5384             APPL_TRACE_DEBUG1("BTA_GATTC_CLOSE_EVT reason = %d", p_data->close.reason);
   5385             /* in case of disconnect before search is completed */
   5386             if ( (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) &&
   5387                  !memcmp(p_data->close.remote_bda, bta_dm_search_cb.peer_bdaddr, BD_ADDR_LEN))
   5388             {
   5389                 bta_dm_gatt_disc_complete((UINT16)BTA_GATT_INVALID_CONN_ID,  (tBTA_GATT_STATUS) BTA_GATT_ERROR);
   5390             }
   5391             break;
   5392 
   5393         default:
   5394             break;
   5395     }
   5396 }
   5397 
   5398 #endif /* BTA_GATT_INCLUDED */
   5399 #endif  /* BLE_INCLUDED */
   5400