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