From 76356aee883af67898ddc1aa3b628195f396d42a Mon Sep 17 00:00:00 2001 From: VenkatRaghavan VijayaRaghavan Date: Tue, 21 Apr 2015 11:32:29 -0700 Subject: [PATCH] Bug fix PM changes and LE connectivity mode fixes Allow PM to support multiple delay timer for different profiles and power mode requests. And set correct connectivity mode. Bug: 22040710 Change-Id: Idabd9ea944f0c5a89ce542d85db9f103fa7d1816 --- bta/dm/bta_dm_act.c | 544 +++++++++++++++++++++++--------------------- bta/dm/bta_dm_api.c | 90 +++++--- bta/dm/bta_dm_cfg.c | 79 +++++-- bta/dm/bta_dm_int.h | 84 +++++-- bta/dm/bta_dm_main.c | 16 +- bta/dm/bta_dm_pm.c | 404 +++++++++++++++++++++++--------- bta/include/bta_api.h | 7 +- bta/sys/bta_sys.h | 1 + bta/sys/bta_sys_main.c | 19 ++ osi/include/alarm.h | 4 + osi/src/alarm.c | 7 + stack/btm/btm_ble_gap.c | 35 +++ stack/include/btm_api.h | 7 + stack/include/btm_ble_api.h | 29 ++- 14 files changed, 877 insertions(+), 449 deletions(-) diff --git a/bta/dm/bta_dm_act.c b/bta/dm/bta_dm_act.c index 444fabe57..6c2bc55d0 100644 --- a/bta/dm/bta_dm_act.c +++ b/bta/dm/bta_dm_act.c @@ -60,6 +60,20 @@ static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev static void bta_dm_local_name_cback(BD_ADDR bd_addr); static BOOLEAN bta_dm_check_av(UINT16 event); static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data); + + +#if BLE_INCLUDED == TRUE +static void bta_dm_acl_change_cback(BD_ADDR p_bda, DEV_CLASS p_dc, + BD_NAME p_bdn, UINT8 *features, + BOOLEAN is_new, UINT16 handle, + tBT_TRANSPORT transport); +#else +static void bta_dm_acl_change_cback(BD_ADDR p_bda, DEV_CLASS p_dc, + BD_NAME p_bdn, UINT8 *features, + BOOLEAN is_new); +#endif + + static void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr); /* Extended Inquiry Response */ @@ -72,7 +86,6 @@ static void bta_dm_eir_search_services( tBTM_INQ_RESULTS *p_result, tBTA_SERVICE_MASK *p_services_found); static void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle); -static void bta_dm_disable_timer_cback (TIMER_LIST_ENT *p_tle); static void bta_dm_disable_conn_down_timer_cback (TIMER_LIST_ENT *p_tle); static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr); static void bta_dm_adjust_roles(BOOLEAN delay_role_switch); @@ -83,11 +96,8 @@ static BOOLEAN bta_dm_read_remote_device_name (BD_ADDR bd_addr,tBT_TRANSPORT tra static void bta_dm_discover_device(BD_ADDR remote_bd_addr); static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status ); - -static BOOLEAN bta_dm_dev_blacklisted_for_switch (BD_ADDR remote_bd_addr); -static void bta_dm_delay_role_switch_cback (TIMER_LIST_ENT *p_tle); - static void bta_dm_disable_search_and_disc(void); + #if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE)) #if ((defined SMP_INCLUDED) && (SMP_INCLUDED == TRUE)) static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_DATA *p_data); @@ -95,13 +105,11 @@ static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_D static void bta_dm_ble_id_key_cback (UINT8 key_type, tBTM_BLE_LOCAL_KEYS *p_key); #if ((defined BTA_GATT_INCLUDED) && (BTA_GATT_INCLUDED == TRUE)) static void bta_dm_gattc_register(void); -static void btm_dm_start_gatt_discovery ( BD_ADDR bd_addr); +static void btm_dm_start_gatt_discovery(BD_ADDR bd_addr); static void bta_dm_cancel_gatt_discovery(BD_ADDR bd_addr); static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data); extern tBTA_DM_CONTRL_STATE bta_dm_pm_obtain_controller_state(void); #endif -static void bta_dm_observe_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir); -static void bta_dm_observe_cmpl_cb (void * p_result); #if BLE_VND_INCLUDED == TRUE static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result); @@ -111,9 +119,14 @@ static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result); #define BTA_DM_BLE_ADV_CHNL_MAP (BTM_BLE_ADV_CHNL_37|BTM_BLE_ADV_CHNL_38|BTM_BLE_ADV_CHNL_39) #endif #endif -static void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr); +static void bta_dm_remove_sec_dev_entry(BD_ADDR remote_bd_addr); +static void bta_dm_observe_results_cb(tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir); +static void bta_dm_observe_cmpl_cb(void * p_result); +static void bta_dm_delay_role_switch_cback(TIMER_LIST_ENT *p_tle); extern void sdpu_uuid16_to_uuid128(UINT16 uuid16, UINT8* p_uuid128); +static void bta_dm_disable_timer_cback(TIMER_LIST_ENT *p_tle); + const UINT16 bta_service_id_to_uuid_lkup_tbl [BTA_MAX_SERVICE_ID] = { @@ -217,20 +230,11 @@ const tBTM_APPL_INFO bta_security = }; -/* TBD... To be moved to some conf file..? */ -#define BTA_DM_MAX_ROLE_SWITCH_BLACKLIST_COUNT 5 -const tBTA_DM_LMP_VER_INFO bta_role_switch_blacklist[BTA_DM_MAX_ROLE_SWITCH_BLACKLIST_COUNT] = -{ - {0x000F,0x2000,0x04}, - {0x00,0x00,0x00}, - {0x00,0x00,0x00}, - {0x00,0x00,0x00}, - {0x00,0x00,0x00} -}; - #define MAX_DISC_RAW_DATA_BUF (4096) UINT8 g_disc_raw_data_buf[MAX_DISC_RAW_DATA_BUF]; +extern DEV_CLASS local_device_default_class; + /******************************************************************************* ** ** Function bta_dm_enable @@ -244,16 +248,16 @@ UINT8 g_disc_raw_data_buf[MAX_DISC_RAW_DATA_BUF]; void bta_dm_enable(tBTA_DM_MSG *p_data) { tBTA_SYS_HW_MSG *sys_enable_event; - tBTA_DM_SEC sec_event; + tBTA_DM_ENABLE enable_event; /* if already in use, return an error */ if( bta_dm_cb.is_bta_dm_active == TRUE ) { - APPL_TRACE_WARNING("bta_dm_enable - device already started by another application"); - memset(&sec_event.enable, 0, sizeof ( tBTA_DM_ENABLE )); - sec_event.enable.status = BTA_FAILURE; - if( p_data->enable.p_sec_cback != NULL ) - p_data->enable.p_sec_cback (BTA_DM_ENABLE_EVT, &sec_event); + APPL_TRACE_WARNING("%s Device already started by another application", __func__); + memset(&enable_event, 0, sizeof(tBTA_DM_ENABLE)); + enable_event.status = BTA_FAILURE; + if (p_data->enable.p_sec_cback != NULL) + p_data->enable.p_sec_cback(BTA_DM_ENABLE_EVT, (tBTA_DM_SEC *)&enable_event); return; } @@ -274,15 +278,9 @@ void bta_dm_enable(tBTA_DM_MSG *p_data) sys_enable_event->hw_module = BTA_SYS_HW_BLUETOOTH; bta_sys_sendmsg(sys_enable_event); - } - - - } - - /******************************************************************************* ** ** Function bta_dm_sys_hw_cback @@ -301,9 +299,9 @@ static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status ) UINT8 key_mask = 0; BT_OCTET16 er; tBTA_BLE_LOCAL_ID_KEYS id_key; - tBT_UUID app_uuid = {LEN_UUID_128,{0}}; #endif - APPL_TRACE_DEBUG(" bta_dm_sys_hw_cback with event: %i" , status ); + + APPL_TRACE_DEBUG("%s with event: %i", __func__, status); /* On H/W error evt, report to the registered DM application callback */ if (status == BTA_SYS_HW_ERROR_EVT) { @@ -311,6 +309,7 @@ static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status ) bta_dm_cb.p_sec_cback(BTA_DM_HW_ERROR_EVT, NULL); return; } + if( status == BTA_SYS_HW_OFF_EVT ) { if( bta_dm_cb.p_sec_cback != NULL ) @@ -344,7 +343,7 @@ static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status ) memset(&bta_dm_conn_srvcs, 0x00, sizeof(bta_dm_conn_srvcs)); memset(&bta_dm_di_cb, 0, sizeof(tBTA_DM_DI_CB)); - memcpy(dev_class, bta_dm_cfg.dev_class, sizeof(dev_class)); + memcpy(dev_class, p_bta_dm_cfg->dev_class, sizeof(dev_class)); BTM_SetDeviceClass (dev_class); #if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE) @@ -365,9 +364,9 @@ static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status ) #endif BTM_SecRegister((tBTM_APPL_INFO*)&bta_security); - BTM_SetDefaultLinkSuperTout(bta_dm_cfg.link_timeout); - BTM_WritePageTimeout(bta_dm_cfg.page_timeout); - bta_dm_cb.cur_policy = bta_dm_cfg.policy_settings; + BTM_SetDefaultLinkSuperTout(p_bta_dm_cfg->link_timeout); + BTM_WritePageTimeout(p_bta_dm_cfg->page_timeout); + bta_dm_cb.cur_policy = p_bta_dm_cfg->policy_settings; BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy); BTM_RegBusyLevelNotif (bta_dm_bl_change_cback, NULL, BTM_BL_UPDATE_MASK|BTM_BL_ROLE_CHG_MASK); @@ -390,7 +389,6 @@ static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status ) bta_sys_policy_register((tBTA_SYS_CONN_CBACK*)bta_dm_policy_cback); #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE) - memset (&app_uuid.uu.uuid128, 0x87, LEN_UUID_128); bta_dm_gattc_register(); #endif @@ -538,20 +536,44 @@ void bta_dm_set_dev_name (tBTA_DM_MSG *p_data) ** Returns void ** *******************************************************************************/ -void bta_dm_set_visibility (tBTA_DM_MSG *p_data) +void bta_dm_set_visibility(tBTA_DM_MSG *p_data) { - + UINT16 window, interval; + UINT16 le_disc_mode = BTM_BleReadDiscoverability(); + UINT16 disc_mode = BTM_ReadDiscoverability(&window, &interval); + UINT16 le_conn_mode = BTM_BleReadConnectability(); + UINT16 conn_mode = BTM_ReadConnectability(&window, &interval); /* set modes for Discoverability and connectability if not ignore */ - if (p_data->set_visibility.disc_mode != BTA_DM_IGNORE) - BTM_SetDiscoverability((UINT8)p_data->set_visibility.disc_mode, + if (p_data->set_visibility.disc_mode != (BTA_DM_IGNORE | BTA_DM_LE_IGNORE)) + { + if ((p_data->set_visibility.disc_mode & BTA_DM_LE_IGNORE) == BTA_DM_LE_IGNORE) + p_data->set_visibility.disc_mode = + ((p_data->set_visibility.disc_mode & ~BTA_DM_LE_IGNORE) | le_disc_mode); + + if ((p_data->set_visibility.disc_mode & BTA_DM_IGNORE) == BTA_DM_IGNORE) + p_data->set_visibility.disc_mode = + ((p_data->set_visibility.disc_mode & ~BTA_DM_IGNORE) | disc_mode); + + BTM_SetDiscoverability(p_data->set_visibility.disc_mode, bta_dm_cb.inquiry_scan_window, bta_dm_cb.inquiry_scan_interval); + } - if (p_data->set_visibility.conn_mode != BTA_DM_IGNORE) - BTM_SetConnectability((UINT8)p_data->set_visibility.conn_mode, + if (p_data->set_visibility.conn_mode != (BTA_DM_IGNORE | BTA_DM_LE_IGNORE)) + { + if ((p_data->set_visibility.conn_mode & BTA_DM_LE_IGNORE) == BTA_DM_LE_IGNORE) + p_data->set_visibility.conn_mode = + ((p_data->set_visibility.conn_mode & ~BTA_DM_LE_IGNORE) | le_conn_mode); + + if ((p_data->set_visibility.conn_mode & BTA_DM_IGNORE) == BTA_DM_IGNORE) + p_data->set_visibility.conn_mode = + ((p_data->set_visibility.conn_mode & ~BTA_DM_IGNORE) | conn_mode); + + BTM_SetConnectability(p_data->set_visibility.conn_mode, bta_dm_cb.page_scan_window, bta_dm_cb.page_scan_interval); + } /* Send False or True if not ignore */ if (p_data->set_visibility.pair_mode != BTA_DM_IGNORE ) @@ -765,24 +787,16 @@ void bta_dm_close_acl(tBTA_DM_MSG *p_data) { tBTA_DM_API_REMOVE_ACL *p_remove_acl = &p_data->remove_acl; UINT8 index; - tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; APPL_TRACE_DEBUG("bta_dm_close_acl"); - if ( BTM_IsAclConnectionUp(p_remove_acl->bd_addr, BT_TRANSPORT_LE) || - BTM_IsAclConnectionUp(p_remove_acl->bd_addr, BT_TRANSPORT_BR_EDR)) - + if (BTM_IsAclConnectionUp(p_remove_acl->bd_addr, p_remove_acl->transport)) { for (index = 0; index < bta_dm_cb.device_list.count; index ++) { if (!bdcmp( bta_dm_cb.device_list.peer_device[index].peer_bdaddr, p_remove_acl->bd_addr)) - { -#if defined (BLE_INCLUDED) && (BLE_INCLUDED == TRUE) - transport = bta_dm_cb.device_list.peer_device[index].transport; -#endif break; } - } if (index != bta_dm_cb.device_list.count) { if (p_remove_acl->remove_dev) @@ -793,7 +807,7 @@ void bta_dm_close_acl(tBTA_DM_MSG *p_data) APPL_TRACE_ERROR("unknown device, remove ACL failed"); } /* Disconnect the ACL link */ - btm_remove_acl(p_remove_acl->bd_addr, transport); + btm_remove_acl(p_remove_acl->bd_addr, p_remove_acl->transport); } /* if to remove the device from security database ? do it now */ else if (p_remove_acl->remove_dev) @@ -812,6 +826,39 @@ void bta_dm_close_acl(tBTA_DM_MSG *p_data) /* otherwise, no action needed */ } + +/******************************************************************************* +** +** Function bta_dm_remove_all_acl +** +** Description This function forces to close all the ACL links specified by link type +**** +*******************************************************************************/ +void bta_dm_remove_all_acl(tBTA_DM_MSG *p_data) +{ + const tBTA_DM_LINK_TYPE link_type = p_data->remove_all_acl.link_type; + tBT_TRANSPORT transport = BT_TRANSPORT_BR_EDR; + + APPL_TRACE_DEBUG("%s link type = %d", __func__, link_type); + + for (UINT8 i=0; i < bta_dm_cb.device_list.count; i++) + { + BD_ADDR addr = {0}; + bdcpy(addr, bta_dm_cb.device_list.peer_device[i].peer_bdaddr); +#if defined (BLE_INCLUDED) && (BLE_INCLUDED == TRUE) + transport = bta_dm_cb.device_list.peer_device[i].transport; +#endif + if ((link_type == BTA_DM_LINK_TYPE_ALL) || + ((link_type == BTA_DM_LINK_TYPE_LE) && (transport == BT_TRANSPORT_LE)) || + ((link_type == BTA_DM_LINK_TYPE_BR_EDR) && (transport == BT_TRANSPORT_BR_EDR))) + { + /* Disconnect the ACL link */ + btm_remove_acl(addr, transport); + } + } +} + + /******************************************************************************* ** ** Function bta_dm_bond @@ -1084,10 +1131,12 @@ void bta_dm_search_start (tBTA_DM_MSG *p_data) #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE) UINT16 len = (UINT16)(sizeof(tBT_UUID) * p_data->search.num_uuid); + bta_dm_gattc_register(); #endif - APPL_TRACE_DEBUG("bta_dm_search_start avoid_scatter=%d", bta_dm_cfg.avoid_scatter); - if (bta_dm_cfg.avoid_scatter && + APPL_TRACE_DEBUG("%s avoid_scatter=%d", __func__, p_bta_dm_cfg->avoid_scatter); + + if (p_bta_dm_cfg->avoid_scatter && (p_data->search.rs_res == BTA_DM_RS_NONE) && bta_dm_check_av(BTA_DM_API_SEARCH_EVT)) { memcpy(&bta_dm_cb.search_msg, &p_data->search, sizeof(tBTA_DM_API_SEARCH)); @@ -1107,14 +1156,14 @@ void bta_dm_search_start (tBTA_DM_MSG *p_data) { if ((bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len)) == NULL) { - APPL_TRACE_ERROR("bta_dm_search_start no resources"); + APPL_TRACE_ERROR("%s no resources", __func__); result.status = BTA_FAILURE; result.num_resp = 0; bta_dm_inq_cmpl_cb ((void *)&result); return; } -// bta_dm_search_cb.p_srvc_uuid = (tBT_UUID *)GKI_getbuf(len); + memcpy(bta_dm_search_cb.p_srvc_uuid, p_data->search.p_uuid, len); } #endif @@ -1122,13 +1171,12 @@ void bta_dm_search_start (tBTA_DM_MSG *p_data) bta_dm_inq_results_cb, (tBTM_CMPL_CB*) bta_dm_inq_cmpl_cb); - APPL_TRACE_EVENT("bta_dm_search_start status=%d", result.status); + APPL_TRACE_EVENT("%s status=%d", __func__, result.status); if (result.status != BTM_CMD_STARTED) { result.num_resp = 0; bta_dm_inq_cmpl_cb ((void *)&result); } - } /******************************************************************************* @@ -1146,16 +1194,21 @@ void bta_dm_search_cancel (tBTA_DM_MSG *p_data) UNUSED(p_data); tBTA_DM_MSG * p_msg; - if(BTM_IsInquiryActive()) + if (BTM_IsInquiryActive()) { - BTM_CancelInquiry(); - bta_dm_search_cancel_notify(NULL); - - if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) + if (BTM_CancelInquiry() != BTM_CMD_STARTED) { - p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; - p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; - bta_sys_sendmsg(p_msg); + bta_dm_search_cancel_notify(NULL); + p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG)); + if (p_msg != NULL) + { + p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; + p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; + bta_sys_sendmsg(p_msg); + } + } else { + /* flag a search cancel is pending */ + bta_dm_search_cb.cancel_pending = TRUE; } } /* If no Service Search going on then issue cancel remote name in case it is active */ @@ -1165,10 +1218,11 @@ void bta_dm_search_cancel (tBTA_DM_MSG *p_data) if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) { - p_msg->hdr.event = BTA_DM_REMT_NAME_EVT; + p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; bta_sys_sendmsg(p_msg); } + } else { if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) @@ -1209,6 +1263,7 @@ void bta_dm_discover (tBTA_DM_MSG *p_data) bta_dm_search_cb.services = p_data->discover.services; #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE + bta_dm_gattc_register(); utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid); if ((bta_dm_search_cb.num_uuid = p_data->discover.num_uuid) != 0 && p_data->discover.p_uuid != NULL) @@ -1303,34 +1358,11 @@ static void bta_dm_di_disc_callback(UINT16 result) static void bta_dm_disable_search_and_disc (void) { tBTA_DM_DI_DISC_CMPL di_disc; - tBTA_DM_MSG * p_msg; - - if(BTM_IsInquiryActive()||(bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE)) - { - BTM_CancelInquiry(); - bta_dm_search_cancel_notify(NULL); - if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) - { - p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; - p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; - bta_sys_sendmsg(p_msg); + if (bta_dm_search_cb.state != BTA_DM_SEARCH_IDLE) + bta_dm_search_cancel(NULL); - } - } - /* If no Service Search going on then issue cancel remote name in case it is active */ - else if (!bta_dm_search_cb.name_discover_done) - { - BTM_CancelRemoteDeviceName(); - - if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) - { - p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; - p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; - bta_sys_sendmsg(p_msg); - } - } - else if(bta_dm_di_cb.p_di_db != NULL) + if (bta_dm_di_cb.p_di_db != NULL) { memset(&di_disc, 0, sizeof(tBTA_DM_DI_DISC_CMPL)); bdcpy(di_disc.bd_addr, bta_dm_search_cb.peer_bdaddr); @@ -1339,13 +1371,6 @@ static void bta_dm_disable_search_and_disc (void) bta_dm_di_cb.p_di_db = NULL; bta_dm_search_cb.p_search_cback(BTA_DM_DI_DISC_CMPL_EVT, NULL); } - -#if (BLE_INCLUDED == TRUE) && (BTA_GATT_INCLUDED == TRUE) - if (bta_dm_search_cb.gatt_disc_active) - { - bta_dm_cancel_gatt_discovery(bta_dm_search_cb.peer_bdaddr); - } -#endif } /******************************************************************************* @@ -1616,24 +1641,24 @@ void bta_dm_sdp_result (tBTA_DM_MSG *p_data) else #endif { - /* SDP_DB_FULL means some records with the - required attributes were received */ - if(((p_data->sdp_event.sdp_result == SDP_DB_FULL) && - bta_dm_search_cb.services != BTA_ALL_SERVICE_MASK) || - (p_sdp_rec != NULL)) - { - if (service != UUID_SERVCLASS_PNP_INFORMATION) + /* SDP_DB_FULL means some records with the + required attributes were received */ + if (((p_data->sdp_event.sdp_result == SDP_DB_FULL) && + bta_dm_search_cb.services != BTA_ALL_SERVICE_MASK) || + (p_sdp_rec != NULL)) { - UINT16 tmp_svc = 0xFFFF; - bta_dm_search_cb.services_found |= - (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index-1)); - tmp_svc = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index-1]; - /* Add to the list of UUIDs */ - sdpu_uuid16_to_uuid128(tmp_svc, uuid_list[num_uuids]); - num_uuids++; + if (service != UUID_SERVCLASS_PNP_INFORMATION) + { + UINT16 tmp_svc = 0xFFFF; + bta_dm_search_cb.services_found |= + (tBTA_SERVICE_MASK)(BTA_SERVICE_ID_TO_SERVICE_MASK(bta_dm_search_cb.service_index-1)); + tmp_svc = bta_service_id_to_uuid_lkup_tbl[bta_dm_search_cb.service_index-1]; + /* Add to the list of UUIDs */ + sdpu_uuid16_to_uuid128(tmp_svc, uuid_list[num_uuids]); + num_uuids++; + } } } - } if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK && bta_dm_search_cb.services_to_search == 0) @@ -1656,7 +1681,8 @@ void bta_dm_sdp_result (tBTA_DM_MSG *p_data) // GKI_freebuf(bta_dm_search_cb.p_sdp_db); // bta_dm_search_cb.p_sdp_db = NULL; - APPL_TRACE_DEBUG("bta_dm_sdp_result services_found = %04x", bta_dm_search_cb.services_found); + APPL_TRACE_DEBUG("%s services_found = %04x", __FUNCTION__, + bta_dm_search_cb.services_found); /* Collect the 128-bit services here and put them into the list */ if(bta_dm_search_cb.services == BTA_ALL_SERVICE_MASK) @@ -1707,15 +1733,18 @@ void bta_dm_sdp_result (tBTA_DM_MSG *p_data) num_uuids*MAX_UUID_SIZE); } else { p_msg->disc_result.result.disc_res.num_uuids = 0; - APPL_TRACE_ERROR("%s: Unable to allocate memory for uuid_list", __FUNCTION__); + APPL_TRACE_ERROR("%s: Unable to allocate memory for uuid_list", __func__); } } //copy the raw_data to the discovery result structure // - APPL_TRACE_DEBUG("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); if ( bta_dm_search_cb.p_sdp_db != NULL && bta_dm_search_cb.p_sdp_db->raw_used != 0 && bta_dm_search_cb.p_sdp_db->raw_data != NULL) { + APPL_TRACE_DEBUG( + "%s raw_data used = 0x%x raw_data_ptr = 0x%x", __func__, + bta_dm_search_cb.p_sdp_db->raw_used, + bta_dm_search_cb.p_sdp_db->raw_data); p_msg->disc_result.result.disc_res.p_raw_data = GKI_getbuf(bta_dm_search_cb.p_sdp_db->raw_used); if ( NULL != p_msg->disc_result.result.disc_res.p_raw_data ) { @@ -1727,7 +1756,8 @@ void bta_dm_sdp_result (tBTA_DM_MSG *p_data) bta_dm_search_cb.p_sdp_db->raw_used; } else { - APPL_TRACE_DEBUG("bta_dm_sdp_result GKI Alloc failed to allocate %d bytes !!\r\n",bta_dm_search_cb.p_sdp_db->raw_used); + APPL_TRACE_DEBUG("%s GKI Alloc failed to allocate %d bytes !!", __func__, + bta_dm_search_cb.p_sdp_db->raw_used); } bta_dm_search_cb.p_sdp_db->raw_data = NULL; //no need to free this - it is a global assigned. @@ -1735,7 +1765,7 @@ void bta_dm_sdp_result (tBTA_DM_MSG *p_data) bta_dm_search_cb.p_sdp_db->raw_size = 0; } else { - APPL_TRACE_DEBUG("bta_dm_sdp_result raw data size is 0 or raw_data is null!!\r\n"); + APPL_TRACE_DEBUG("%s raw data size is 0 or raw_data is null!!", __func__); } /* Done with p_sdp_db. Free it */ bta_dm_free_sdp_db(NULL); @@ -1759,12 +1789,8 @@ void bta_dm_sdp_result (tBTA_DM_MSG *p_data) bta_sys_sendmsg(p_msg); } - } - - } - else - { + } else { /* conn failed. No need for timer */ if(p_data->sdp_event.sdp_result == SDP_CONN_FAILED || p_data->sdp_event.sdp_result == SDP_CONN_REJECTED || p_data->sdp_event.sdp_result == SDP_SECURITY_ERR) @@ -1804,7 +1830,7 @@ void bta_dm_sdp_result (tBTA_DM_MSG *p_data) *******************************************************************************/ void bta_dm_search_cmpl (tBTA_DM_MSG *p_data) { - APPL_TRACE_DEBUG("bta_dm_search_cmpl"); + APPL_TRACE_EVENT("%s", __func__); #if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE) utl_freebuf((void **)&bta_dm_search_cb.p_srvc_uuid); @@ -1827,9 +1853,7 @@ void bta_dm_search_cmpl (tBTA_DM_MSG *p_data) *******************************************************************************/ void bta_dm_disc_result (tBTA_DM_MSG *p_data) { - tBTA_DM_MSG * p_msg; - - APPL_TRACE_DEBUG("bta_dm_disc_result"); + APPL_TRACE_EVENT("%s", __func__); #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE /* if any BR/EDR service discovery has been done, report the event */ @@ -1837,8 +1861,10 @@ void bta_dm_disc_result (tBTA_DM_MSG *p_data) #endif bta_dm_search_cb.p_search_cback(BTA_DM_DISC_RES_EVT, &p_data->disc_result.result); + tBTA_DM_MSG *p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG)); + /* send a message to change state */ - if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) + if (p_msg != NULL) { p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; @@ -1857,7 +1883,7 @@ void bta_dm_disc_result (tBTA_DM_MSG *p_data) *******************************************************************************/ void bta_dm_search_result (tBTA_DM_MSG *p_data) { - APPL_TRACE_DEBUG("bta_dm_search_result searching:0x%04x, result:0x%04x", + APPL_TRACE_DEBUG("%s searching:0x%04x, result:0x%04x", __func__, bta_dm_search_cb.services, p_data->disc_result.result.disc_res.services); @@ -1899,7 +1925,7 @@ static void bta_dm_search_timer_cback (TIMER_LIST_ENT *p_tle) { UNUSED(p_tle); - APPL_TRACE_EVENT(" bta_dm_search_timer_cback "); + APPL_TRACE_EVENT("%s", __func__); bta_dm_search_cb.wait_disc = FALSE; /* proceed with next device */ @@ -1987,8 +2013,6 @@ void bta_dm_search_clear_queue (tBTA_DM_MSG *p_data) GKI_freebuf(bta_dm_search_cb.p_search_queue); bta_dm_search_cb.p_search_queue = NULL; } - - } /******************************************************************************* @@ -2279,8 +2303,8 @@ static void bta_dm_discover_device(BD_ADDR remote_bd_addr) bta_dm_search_cb.p_btm_inq_info, bta_dm_search_cb.state ); - if ( bta_dm_search_cb.p_btm_inq_info ) { - + if (bta_dm_search_cb.p_btm_inq_info) + { APPL_TRACE_DEBUG("bta_dm_discover_device appl_knows_rem_name %d", bta_dm_search_cb.p_btm_inq_info->appl_knows_rem_name ); @@ -2321,7 +2345,7 @@ static void bta_dm_discover_device(BD_ADDR remote_bd_addr) bta_dm_search_cb.uuid_to_search = bta_dm_search_cb.num_uuid; #endif if ((bta_dm_search_cb.p_btm_inq_info != NULL) && - bta_dm_search_cb.services != BTA_USER_SERVICE_MASK + bta_dm_search_cb.services != BTA_USER_SERVICE_MASK &&(bta_dm_search_cb.sdp_search == FALSE)) { /* check if EIR provides the information of supported services */ @@ -2370,10 +2394,9 @@ static void bta_dm_discover_device(BD_ADDR remote_bd_addr) else #endif { - bta_dm_search_cb.sdp_results = FALSE; - bta_dm_find_services(bta_dm_search_cb.peer_bdaddr); - - return; + bta_dm_search_cb.sdp_results = FALSE; + bta_dm_find_services(bta_dm_search_cb.peer_bdaddr); + return; } } } @@ -2486,19 +2509,30 @@ static void bta_dm_inq_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir) *******************************************************************************/ static void bta_dm_inq_cmpl_cb (void * p_result) { - tBTA_DM_MSG * p_msg; - APPL_TRACE_DEBUG("bta_dm_inq_cmpl_cb"); - if ((p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG))) != NULL) + if (bta_dm_search_cb.cancel_pending == FALSE) { - p_msg->inq_cmpl.hdr.event = BTA_DM_INQUIRY_CMPL_EVT; - p_msg->inq_cmpl.num = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp; - bta_sys_sendmsg(p_msg); - + APPL_TRACE_DEBUG("%s", __FUNCTION__); + p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG)); + if (p_msg != NULL) { + p_msg->inq_cmpl.hdr.event = BTA_DM_INQUIRY_CMPL_EVT; + p_msg->inq_cmpl.num = ((tBTM_INQUIRY_CMPL *)p_result)->num_resp; + bta_sys_sendmsg(p_msg); + } } + else + { + bta_dm_search_cb.cancel_pending = FALSE; + bta_dm_search_cancel_notify(NULL); - + p_msg = (tBTA_DM_MSG *) GKI_getbuf(sizeof(tBTA_DM_MSG)); + if (p_msg != NULL) { + p_msg->hdr.event = BTA_DM_SEARCH_CMPL_EVT; + p_msg->hdr.layer_specific = BTA_DM_API_DISCOVER_EVT; + bta_sys_sendmsg(p_msg); + } + } } /******************************************************************************* @@ -2583,9 +2617,10 @@ static void bta_dm_remname_cback (tBTM_REMOTE_DEV_NAME *p_remote_name) #if BLE_INCLUDED == TRUE if (bta_dm_search_cb.transport == BT_TRANSPORT_LE ) { - GAP_BleReadPeerPrefConnParams (bta_dm_search_cb.peer_bdaddr); + GAP_BleReadPeerPrefConnParams (bta_dm_search_cb.peer_bdaddr); } #endif + if ((p_msg = (tBTA_DM_REM_NAME *) GKI_getbuf(sizeof(tBTA_DM_REM_NAME))) != NULL) { bdcpy (p_msg->result.disc_res.bd_addr, bta_dm_search_cb.peer_bdaddr); @@ -2723,8 +2758,6 @@ static void bta_dm_pinname_cback (void *p_data) bta_dm_cb.p_sec_cback(event, &sec_event); } - - /******************************************************************************* ** ** Function bta_dm_pin_cback @@ -2902,6 +2935,7 @@ static UINT8 bta_dm_sp_cback (tBTM_SP_EVT event, tBTM_SP_EVT_DATA *p_data) sec_event.cfm_req.rmt_auth_req = p_data->cfm_req.rmt_auth_req; sec_event.cfm_req.loc_io_caps = p_data->cfm_req.loc_io_caps; sec_event.cfm_req.rmt_io_caps = p_data->cfm_req.rmt_io_caps; + /* continue to next case */ #if (BTM_LOCAL_IO_CAPS != BTM_IO_CAP_NONE) /* Passkey entry mode, mobile device with output capability is very @@ -3092,6 +3126,50 @@ static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data) } } + +/******************************************************************************* +** +** Function bta_dm_acl_change_cback +** +** Description Callback from btm when acl connection goes up or down +** +** +** Returns void +** +*******************************************************************************/ +#if BLE_INCLUDED == TRUE +static void bta_dm_acl_change_cback(BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn, + UINT8 *features, BOOLEAN is_new,UINT16 handle, + tBT_TRANSPORT transport) +#else +static void bta_dm_acl_change_cback(BD_ADDR p_bda, DEV_CLASS p_dc, BD_NAME p_bdn, + UINT8 *features, BOOLEAN is_new) +#endif +{ + tBTA_DM_ACL_CHANGE *p_msg = (tBTA_DM_ACL_CHANGE *) GKI_getbuf(sizeof(tBTA_DM_ACL_CHANGE)); + if (p_msg != NULL) + { + memset(p_msg, 0, sizeof(tBTA_DM_ACL_CHANGE)); + + bdcpy(p_msg->bd_addr, p_bda); + p_msg->is_new = is_new; +#if BLE_INCLUDED == TRUE + p_msg->handle = handle; + p_msg->transport = transport; +#endif + /* This is collision case */ + if (features != NULL) + { + if ((features[0] == 0xFF) && !is_new) + p_msg->event = BTM_BL_COLLISION_EVT; + } + + p_msg->hdr.event = BTA_DM_ACL_CHANGE_EVT; + bta_sys_sendmsg(p_msg); + } +} + + /******************************************************************************* ** ** Function bta_dm_rs_cback @@ -3219,7 +3297,7 @@ void bta_dm_acl_change(tBTA_DM_MSG *p_data) BTM_SwitchRole(p_bda, BTM_ROLE_MASTER, NULL); need_policy_change = TRUE; } - else if (bta_dm_cfg.avoid_scatter && (p_data->acl_change.new_role == HCI_ROLE_MASTER)) + else if (p_bta_dm_cfg->avoid_scatter && (p_data->acl_change.new_role == HCI_ROLE_MASTER)) { /* if the link updated to be master include AV activities, remove the switch policy */ need_policy_change = TRUE; @@ -3268,14 +3346,20 @@ void bta_dm_acl_change(tBTA_DM_MSG *p_data) if(i == bta_dm_cb.device_list.count) { - bdcpy(bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].peer_bdaddr, p_bda); - bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].link_policy = bta_dm_cb.cur_policy; - bta_dm_cb.device_list.count++; + if (bta_dm_cb.device_list.count < BTA_DM_NUM_PEER_DEVICE) + { + bdcpy(bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].peer_bdaddr, p_bda); + bta_dm_cb.device_list.peer_device[bta_dm_cb.device_list.count].link_policy = bta_dm_cb.cur_policy; + bta_dm_cb.device_list.count++; #if BLE_INCLUDED == TRUE - bta_dm_cb.device_list.peer_device[i].conn_handle = p_data->acl_change.handle; - if (p_data->acl_change.transport == BT_TRANSPORT_LE) - bta_dm_cb.device_list.le_count++; + bta_dm_cb.device_list.peer_device[i].conn_handle = p_data->acl_change.handle; + if (p_data->acl_change.transport == BT_TRANSPORT_LE) + bta_dm_cb.device_list.le_count++; #endif + } else { + APPL_TRACE_ERROR("%s max active connection reached, no resources", __func__); + return; + } } bta_dm_cb.device_list.peer_device[i].conn_state = BTA_DM_CONNECTED; @@ -3293,13 +3377,11 @@ void bta_dm_acl_change(tBTA_DM_MSG *p_data) /* both local and remote devices support SSR */ bta_dm_cb.device_list.peer_device[i].info = BTA_DM_DI_USE_SSR; } - APPL_TRACE_WARNING("info:x%x", bta_dm_cb.device_list.peer_device[i].info); - if( bta_dm_cb.p_sec_cback ) - bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_EVT, &conn); + APPL_TRACE_WARNING("%s info: 0x%x", __func__, bta_dm_cb.device_list.peer_device[i].info); - } - else - { + if (bta_dm_cb.p_sec_cback) + bta_dm_cb.p_sec_cback(BTA_DM_LINK_UP_EVT, (tBTA_DM_SEC *)&conn); + } else { for(i=0; iinfo |= BTA_DM_DI_AV_ACTIVE; /* AV calls bta_sys_conn_open with the A2DP stream count as app_id */ if(BTA_ID_AV == id) - bta_dm_cb.cur_av_count = app_id; + bta_dm_cb.cur_av_count = bta_dm_get_av_count(); } else if( status == BTA_SYS_CONN_IDLE) { if(p_dev) p_dev->info &= ~BTA_DM_DI_AV_ACTIVE; - /* AV calls bta_sys_conn_open with the A2DP stream count as app_id */ + + /* get cur_av_count from connected services */ if(BTA_ID_AV == id) - bta_dm_cb.cur_av_count = app_id; + bta_dm_cb.cur_av_count = bta_dm_get_av_count(); } APPL_TRACE_WARNING("bta_dm_rm_cback:%d, status:%d", bta_dm_cb.cur_av_count, status); } - else if ((status == BTA_SYS_CONN_BUSY) || (status == BTA_SYS_CONN_IDLE)) - { - /* Do not do role switch management for non-AV profiles when data flow starts/stops */ - return; - } bta_dm_adjust_roles(FALSE); - -} - -/******************************************************************************* -** -** Function bta_dm_dev_blacklisted_for_switch -** -** Description Checks if the device is blacklisted for immediate role switch after connection. -** -** Returns TRUE if dev is blacklisted else FALSE -** -*******************************************************************************/ -static BOOLEAN bta_dm_dev_blacklisted_for_switch (BD_ADDR remote_bd_addr) -{ - UINT16 manufacturer = 0; - UINT16 lmp_sub_version = 0; - UINT8 lmp_version = 0; - UINT8 i = 0; - - if (BTM_ReadRemoteVersion(remote_bd_addr, &lmp_version, - &manufacturer, &lmp_sub_version) == BTM_SUCCESS) - { - /* Check if this device version info matches with is - blacklisted versions for role switch */ - for (i = 0; i < BTA_DM_MAX_ROLE_SWITCH_BLACKLIST_COUNT; i++) - { - if ((bta_role_switch_blacklist[i].lmp_version == lmp_version) && - (bta_role_switch_blacklist[i].manufacturer == manufacturer)&& - ((bta_role_switch_blacklist[i].lmp_sub_version & lmp_sub_version) == - bta_role_switch_blacklist[i].lmp_sub_version)) - { - APPL_TRACE_EVENT("Black list F/W version matches.. Delay Role Switch..."); - return TRUE; - } - - } - } - return FALSE; } /******************************************************************************* @@ -3643,7 +3680,7 @@ static void bta_dm_adjust_roles(BOOLEAN delay_role_switch) } if((bta_dm_cb.device_list.peer_device[i].pref_role == BTA_MASTER_ROLE_ONLY) - || (br_count > 1)) + || (bta_dm_cb.device_list.count > 1)) { /* Initiating immediate role switch with certain remote devices @@ -3652,9 +3689,7 @@ static void bta_dm_adjust_roles(BOOLEAN delay_role_switch) versions are stored in a blacklist and role switch with these devices are delayed to avoid the collision with link encryption setup */ - if ((delay_role_switch == FALSE) || - (bta_dm_dev_blacklisted_for_switch( - bta_dm_cb.device_list.peer_device[i].peer_bdaddr) == FALSE)) + if (delay_role_switch == FALSE) { BTM_SwitchRole (bta_dm_cb.device_list.peer_device[i].peer_bdaddr, HCI_ROLE_MASTER, NULL); @@ -4187,6 +4222,7 @@ void bta_dm_execute_callback(tBTA_DM_MSG *p_data) p_data->exec_cback.p_exec_cback(p_data->exec_cback.p_param); } + /******************************************************************************* ** ** Function bta_dm_encrypt_cback @@ -4241,6 +4277,7 @@ void bta_dm_encrypt_cback(BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_ (*p_callback)(bd_addr, transport, bta_status); } } + /******************************************************************************* ** ** Function bta_dm_set_encryption @@ -4260,7 +4297,6 @@ void bta_dm_set_encryption (tBTA_DM_MSG *p_data) APPL_TRACE_ERROR("bta_dm_set_encryption callback is not provided"); return; } - for (i=0; iset_encryption.bd_addr) == 0 && @@ -4273,23 +4309,18 @@ void bta_dm_set_encryption (tBTA_DM_MSG *p_data) { APPL_TRACE_ERROR("earlier enc was not done for same device"); (*p_data->set_encryption.p_callback)(p_data->set_encryption.bd_addr, - p_data->set_encryption.transport, BTA_BUSY); + p_data->set_encryption.transport, + BTA_BUSY); return; } - if (BTM_SetEncryption(p_data->set_encryption.bd_addr, - p_data->set_encryption.transport, - bta_dm_encrypt_cback, - &p_data->set_encryption.sec_act) + if (BTM_SetEncryption(p_data->set_encryption.bd_addr, p_data->set_encryption.transport, + bta_dm_encrypt_cback, &p_data->set_encryption.sec_act) == BTM_CMD_STARTED) { bta_dm_cb.device_list.peer_device[i].p_encrypt_cback = p_data->set_encryption.p_callback; } } - else - { - APPL_TRACE_ERROR(" %s Device not found/not connected", __FUNCTION__); - } } #if (BLE_INCLUDED == TRUE) @@ -4315,6 +4346,7 @@ static void bta_dm_observe_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir) result.inq_res.ble_addr_type = p_inq->ble_addr_type; result.inq_res.inq_result_type = p_inq->inq_result_type; result.inq_res.device_type = p_inq->device_type; + result.inq_res.flag = p_inq->flag; /* application will parse EIR to find out remote device name */ result.inq_res.p_eir = p_eir; @@ -4415,6 +4447,7 @@ static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_D { sec_event.ble_req.bd_name[0] = 0; } + sec_event.ble_req.bd_name[BD_NAME_LEN] = 0; bta_dm_cb.p_sec_cback(BTA_DM_BLE_SEC_REQ_EVT, &sec_event); break; @@ -4430,9 +4463,10 @@ static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_D { sec_event.key_notif.bd_name[0] = 0; } - sec_event.key_notif.passkey = p_data->key_notif; - bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_NOTIF_EVT, &sec_event); - break; + sec_event.ble_req.bd_name[BD_NAME_LEN] = 0; + sec_event.key_notif.passkey = p_data->key_notif; + bta_dm_cb.p_sec_cback(BTA_DM_BLE_PASSKEY_NOTIF_EVT, &sec_event); + break; case BTM_LE_KEY_REQ_EVT: bdcpy(sec_event.ble_req.bd_addr, bda); @@ -4684,7 +4718,7 @@ void bta_dm_ble_set_conn_params (tBTA_DM_MSG *p_data) /******************************************************************************* ** -** Function bta_dm_ble_set_scan_params +** Function bta_dm_ble_set_conn_scan_params ** ** Description This function sets BLE scan parameters. ** @@ -4711,8 +4745,8 @@ void bta_dm_ble_set_scan_params(tBTA_DM_MSG *p_data) *******************************************************************************/ void bta_dm_ble_set_conn_scan_params (tBTA_DM_MSG *p_data) { - BTM_BleSetConnScanParams(p_data->ble_set_scan_params.scan_int, - p_data->ble_set_scan_params.scan_window); + BTM_BleSetConnScanParams(p_data->ble_set_conn_scan_params.scan_int, + p_data->ble_set_conn_scan_params.scan_window); } /******************************************************************************* ** @@ -4750,6 +4784,7 @@ void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data) BTM_BleConfigPrivacy (p_data->ble_local_privacy.privacy_enable); } #endif + /******************************************************************************* ** ** Function bta_dm_ble_observe @@ -5435,7 +5470,8 @@ static void bta_dm_gatt_disc_result(tBTA_GATT_ID service_id) if ( bta_dm_search_cb.ble_raw_used + sizeof(tBTA_GATT_ID) < bta_dm_search_cb.ble_raw_size ) { - APPL_TRACE_DEBUG("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); + APPL_TRACE_DEBUG("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); if(bta_dm_search_cb.p_ble_rawdata) { @@ -5499,6 +5535,8 @@ static void bta_dm_gatt_disc_complete(UINT16 conn_id, tBTA_GATT_STATUS status) { p_msg->hdr.event = BTA_DM_DISCOVERY_RESULT_EVT; p_msg->disc_result.result.disc_res.result = (status == BTA_GATT_OK) ? BTA_SUCCESS :BTA_FAILURE; + APPL_TRACE_DEBUG("%s service found: 0x%08x", __FUNCTION__, + bta_dm_search_cb.services_found); p_msg->disc_result.result.disc_res.services = bta_dm_search_cb.services_found; p_msg->disc_result.result.disc_res.num_uuids = 0; p_msg->disc_result.result.disc_res.p_uuid_list = NULL; @@ -5528,20 +5566,14 @@ static void bta_dm_gatt_disc_complete(UINT16 conn_id, tBTA_GATT_STATUS status) bta_sys_sendmsg(p_msg); } + if (conn_id != BTA_GATT_INVALID_CONN_ID) { - if (BTA_DM_GATT_CLOSE_DELAY_TOUT != 0) - { - bta_sys_start_timer(&bta_dm_search_cb.gatt_close_timer, BTA_DM_DISC_CLOSE_TOUT_EVT, - BTA_DM_GATT_CLOSE_DELAY_TOUT); - } - else - { - BTA_GATTC_Close(conn_id); - bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID; - } + /* start a GATT channel close delay timer */ + bta_sys_start_timer(&bta_dm_search_cb.gatt_close_timer, BTA_DM_DISC_CLOSE_TOUT_EVT, + BTA_DM_GATT_CLOSE_DELAY_TOUT); + bdcpy(bta_dm_search_cb.pending_close_bda, bta_dm_search_cb.peer_bdaddr); } - bta_dm_search_cb.gatt_disc_active = FALSE; } } @@ -5562,9 +5594,9 @@ void bta_dm_close_gatt_conn(tBTA_DM_MSG *p_data) if (bta_dm_search_cb.conn_id != BTA_GATT_INVALID_CONN_ID) BTA_GATTC_Close(bta_dm_search_cb.conn_id); + memset(bta_dm_search_cb.pending_close_bda, 0, BD_ADDR_LEN); bta_dm_search_cb.conn_id = BTA_GATT_INVALID_CONN_ID; } - /******************************************************************************* ** ** Function btm_dm_start_gatt_discovery diff --git a/bta/dm/bta_dm_api.c b/bta/dm/bta_dm_api.c index c9566e96f..061e7ff4a 100644 --- a/bta/dm/bta_dm_api.c +++ b/bta/dm/bta_dm_api.c @@ -182,7 +182,7 @@ void BTA_DmSetDeviceName(char *p_name) { p_msg->hdr.event = BTA_DM_API_SET_NAME_EVT; /* truncate the name if needed */ - BCM_STRNCPY_S((char *)p_msg->name, sizeof(p_msg->name), p_name, BD_NAME_LEN-1); + BCM_STRNCPY_S((char*)p_msg->name, sizeof(p_msg->name), p_name, BD_NAME_LEN-1); p_msg->name[BD_NAME_LEN-1]=0; bta_sys_sendmsg(p_msg); @@ -353,7 +353,16 @@ void BTA_DmDiscoverUUID(BD_ADDR bd_addr, tSDP_UUID *uuid, *******************************************************************************/ void BTA_DmBond(BD_ADDR bd_addr) { - BTA_DmBondByTransport (bd_addr, BTA_TRANSPORT_UNKNOWN); + tBTA_DM_API_BOND *p_msg; + + p_msg = (tBTA_DM_API_BOND *) GKI_getbuf(sizeof(tBTA_DM_API_BOND)); + if (p_msg != NULL) + { + p_msg->hdr.event = BTA_DM_API_BOND_EVT; + bdcpy(p_msg->bd_addr, bd_addr); + p_msg->transport = BTA_TRANSPORT_UNKNOWN; + bta_sys_sendmsg(p_msg); + } } /******************************************************************************* @@ -444,7 +453,10 @@ void BTA_DmPinReply(BD_ADDR bd_addr, BOOLEAN accept, UINT8 pin_len, UINT8 *p_pin ** Function BTA_DmLocalOob ** ** Description This function retrieves the OOB data from local controller. -** The result is reported by bta_dm_co_loc_oob(). +** The result is reported by: +** - bta_dm_co_loc_oob_ext() if device supports secure +** connections (SC) +** - bta_dm_co_loc_oob() if device doesn't support SC ** ** Returns void ** @@ -525,7 +537,7 @@ void BTA_DmAddDevice(BD_ADDR bd_addr, DEV_CLASS dev_class, LINK_KEY link_key, memcpy (p_msg->dc, dev_class, DEV_CLASS_LEN); } - memset (p_msg->bd_name, 0, BD_NAME_LEN); + memset (p_msg->bd_name, 0, BD_NAME_LEN + 1); memset (p_msg->features, 0, sizeof (p_msg->features)); p_msg->pin_length = pin_length; @@ -539,7 +551,7 @@ void BTA_DmAddDevice(BD_ADDR bd_addr, DEV_CLASS dev_class, LINK_KEY link_key, ** Function BTA_DmRemoveDevice ** ** Description This function removes a device fromthe security database list of -** peer device +** peer device. It manages unpairing even while connected. ** ** ** Returns void @@ -699,7 +711,8 @@ void bta_dmexecutecallback (tBTA_DM_EXEC_CBACK* p_callback, void * p_param) ** p_le_key - LE key values. ** key_type - LE SMP key type. ** -** Returns void +** Returns BTA_SUCCESS if successful +** BTA_FAIL if operation failed. ** *******************************************************************************/ void BTA_DmAddBleKey (BD_ADDR bd_addr, tBTA_LE_KEY_VALUE *p_le_key, tBTA_LE_KEY_TYPE key_type) @@ -1213,6 +1226,13 @@ extern void BTA_DmBleTrackAdvertiser(tBTA_DM_BLE_REF_VALUE ref_value, } } +#endif + +/******************************************************************************* +** BLE ADV data management API +********************************************************************************/ +#if BLE_INCLUDED == TRUE + /******************************************************************************* ** ** Function BTA_DmBleBroadcast @@ -1283,6 +1303,7 @@ void BTA_DmBleSetBgConnType(tBTA_DM_BLE_CONN_TYPE bg_conn_type, tBTA_DM_BLE_SEL_ ** Returns void ** *******************************************************************************/ +#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE static void bta_dm_discover_send_msg(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services, tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search, tBTA_TRANSPORT transport) @@ -1318,7 +1339,7 @@ static void bta_dm_discover_send_msg(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_s bta_sys_sendmsg(p_msg); } } - +#endif /******************************************************************************* ** ** Function BTA_DmDiscoverByTransport @@ -1330,21 +1351,18 @@ static void bta_dm_discover_send_msg(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_s ** UUID of interested services should be provided through ** p_services->p_uuid. ** -** Parameters bd_addr: Bluetooth address of remote device -** p_services :bit mask of the list of services to be discovered -** p_cback : Callback on which result will be received -** sdp_search: if TRUE SDP search will be initiated, else services present in -** EIR structure of remote device will be returned. -** transport : Physical transport BR/EDR or LE +** +** ** Returns void ** *******************************************************************************/ - void BTA_DmDiscoverByTransport(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services, tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search, tBTA_TRANSPORT transport) { +#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE bta_dm_discover_send_msg(bd_addr, p_services, p_cback, sdp_search, transport); +#endif } @@ -1358,11 +1376,7 @@ void BTA_DmDiscoverByTransport(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_service ** UUID of interested services should be provided through ** p_services->p_uuid. ** -** Parameters bd_addr: Bluetooth address of remote device -** p_services :bit mask of the list of services to be discovered -** p_cback : Callback on which result will be received -** sdp_search: if TRUE SDP search will be initiated, else services present in -** EIR structure of remote device will be returned. +** ** ** Returns void ** @@ -1370,7 +1384,9 @@ void BTA_DmDiscoverByTransport(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_service void BTA_DmDiscoverExt(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services, tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search) { +#if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE bta_dm_discover_send_msg(bd_addr, p_services, p_cback, sdp_search, BTA_TRANSPORT_UNKNOWN); +#endif } @@ -1432,26 +1448,44 @@ void BTA_DmSearchExt(tBTA_DM_INQ *p_dm_inq, tBTA_SERVICE_MASK_EXT *p_services, t UNUSED(p_cback); #endif } - /******************************************************************************* ** -** Function BTA_DmBleEnableRemotePrivacy +** Function BTA_DmBleUpdateConnectionParam ** -** Description Enable/disable privacy on a remote device +** Description Update connection parameters, can only be used when connection is up. ** ** Parameters: bd_addr - BD address of the peer -** privacy_enable - enable/disabe privacy on remote device. +** min_int - minimum connection interval, [0x0004~ 0x4000] +** max_int - maximum connection interval, [0x0004~ 0x4000] +** latency - slave latency [0 ~ 500] +** timeout - supervision timeout [0x000a ~ 0xc80] ** ** Returns void ** *******************************************************************************/ -void BTA_DmBleEnableRemotePrivacy(BD_ADDR bd_addr, BOOLEAN privacy_enable) +void BTA_DmBleUpdateConnectionParam(BD_ADDR bd_addr, UINT16 min_int, + UINT16 max_int, UINT16 latency, + UINT16 timeout) { - UNUSED(bd_addr); - UNUSED(privacy_enable); -} +#if BLE_INCLUDED == TRUE + tBTA_DM_API_UPDATE_CONN_PARAM *p_msg; + + p_msg = (tBTA_DM_API_UPDATE_CONN_PARAM *) GKI_getbuf(sizeof(tBTA_DM_API_UPDATE_CONN_PARAM)); + if (p_msg != NULL) + { + memset(p_msg, 0, sizeof(tBTA_DM_API_UPDATE_CONN_PARAM)); + p_msg->hdr.event = BTA_DM_API_UPDATE_CONN_PARAM_EVT; + bdcpy(p_msg->bd_addr, bd_addr); + p_msg->min_int = min_int; + p_msg->max_int = max_int; + p_msg->latency = latency; + p_msg->timeout = timeout; + bta_sys_sendmsg(p_msg); + } +#endif +} /******************************************************************************* ** ** Function BTA_DmBleConfigLocalPrivacy @@ -1680,13 +1714,13 @@ void BTA_DmBleCfgFilterCondition(tBTA_DM_BLE_SCAN_COND_OP action, if ((p_msg = (tBTA_DM_API_CFG_FILTER_COND *) GKI_getbuf(len)) != NULL) { memset (p_msg, 0, len); + p_msg->hdr.event = BTA_DM_API_CFG_FILTER_COND_EVT; p_msg->action = action; p_msg->cond_type = cond_type; p_msg->filt_index = filt_index; p_msg->p_filt_cfg_cback = p_cmpl_cback; p_msg->ref_value = ref_value; - if (p_cond) { p_msg->p_cond_param = (tBTA_DM_BLE_PF_COND_PARAM *)(p_msg + 1); diff --git a/bta/dm/bta_dm_cfg.c b/bta/dm/bta_dm_cfg.c index 8bd5a017d..2ebf932d8 100644 --- a/bta/dm/bta_dm_cfg.c +++ b/bta/dm/bta_dm_cfg.c @@ -112,11 +112,11 @@ tBTA_DM_CFG *p_bta_dm_cfg = (tBTA_DM_CFG *)&bta_dm_cfg; tBTA_DM_RM *p_bta_dm_rm_cfg = (tBTA_DM_RM *)&bta_dm_rm_cfg; #if BLE_INCLUDED == TRUE -# define BTA_DM_NUM_PM_ENTRY 22 /* number of entries in bta_dm_pm_cfg except the first */ -# define BTA_DM_NUM_PM_SPEC 14 /* number of entries in bta_dm_pm_spec */ +# define BTA_DM_NUM_PM_ENTRY 23 /* number of entries in bta_dm_pm_cfg except the first */ +# define BTA_DM_NUM_PM_SPEC 15 /* number of entries in bta_dm_pm_spec */ #else -# define BTA_DM_NUM_PM_ENTRY 20 /* number of entries in bta_dm_pm_cfg except the first */ -# define BTA_DM_NUM_PM_SPEC 12 /* number of entries in bta_dm_pm_spec */ +# define BTA_DM_NUM_PM_ENTRY 21 /* number of entries in bta_dm_pm_cfg except the first */ +# define BTA_DM_NUM_PM_SPEC 13 /* number of entries in bta_dm_pm_spec */ #endif tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_CFG bta_dm_pm_cfg[BTA_DM_NUM_PM_ENTRY + 1] = @@ -127,6 +127,7 @@ tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_CFG bta_dm_pm_cfg[BTA_DM_NUM_PM_ENTRY + 1] {BTA_ID_CG, BTA_ALL_APP_ID, 1}, /* cg resue ct spec table */ {BTA_ID_DG, BTA_ALL_APP_ID, 2}, /* dg spec table */ {BTA_ID_AV, BTA_ALL_APP_ID, 4}, /* av spec table */ + {BTA_ID_AVK, BTA_ALL_APP_ID, 13}, /* avk spec table */ {BTA_ID_FTC, BTA_ALL_APP_ID, 6}, /* ftc spec table */ {BTA_ID_FTS, BTA_ALL_APP_ID, 7}, /* fts spec table */ {BTA_ID_HD, BTA_ALL_APP_ID, 3}, /* hd spec table */ @@ -195,14 +196,14 @@ tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_SPEC bta_dm_pm_spec[BTA_DM_NUM_PM_SPEC] = (BTA_DM_PM_SSR2), /* the SSR entry */ #endif { - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */ + {{BTA_DM_PM_SNIFF, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open active */ {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + {{BTA_DM_PM_SNIFF, 1000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ } }, @@ -214,14 +215,14 @@ tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_SPEC bta_dm_pm_spec[BTA_DM_NUM_PM_SPEC] = (BTA_DM_PM_SSR3), /* the SSR entry */ #endif { - {{BTA_DM_PM_SNIFF_HD_ACTIVE_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */ - {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ + {{BTA_DM_PM_SNIFF_HD_ACTIVE_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ - {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ - {{BTA_DM_PM_SNIFF_HD_IDLE_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_SNIFF_HD_ACTIVE_IDX, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ + {{BTA_DM_PM_SNIFF2, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_SNIFF4, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ } }, @@ -258,8 +259,8 @@ tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_SPEC bta_dm_pm_spec[BTA_DM_NUM_PM_SPEC] = {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close, used for HH suspend */ - {{BTA_DM_PM_SNIFF_HH_IDLE_IDX, BTA_DM_PM_HH_IDLE_DELAY}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_SNIFF_HH_ACTIVE_IDX, BTA_DM_PM_HH_ACTIVE_DELAY}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + {{BTA_DM_PM_SNIFF2, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ } }, @@ -277,7 +278,7 @@ tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_SPEC bta_dm_pm_spec[BTA_DM_NUM_PM_SPEC] = {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ - {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_SNIFF, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ } @@ -334,12 +335,30 @@ tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_SPEC bta_dm_pm_spec[BTA_DM_NUM_PM_SPEC] = {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ - {{BTA_DM_PM_SNIFF_A2DP_IDX, 7000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_SNIFF, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ } }, + /* AVK : 13 */ + { + (BTA_DM_PM_SNIFF), /* allow sniff */ +#if (BTM_SSR_INCLUDED == TRUE) + (BTA_DM_PM_SSR2), /* the SSR entry */ +#endif + { + {{BTA_DM_PM_SNIFF, 3000}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn open sniff */ + {{BTA_DM_PM_NO_PREF, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* conn close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ + {{BTA_DM_PM_SNIFF4, 3000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ + } + }, /* NAP */ { (BTA_DM_PM_SNIFF), /* allow sniff */ @@ -353,8 +372,9 @@ tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_SPEC bta_dm_pm_spec[BTA_DM_NUM_PM_SPEC] = {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* app close */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco open */ {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* sco close */ - {{BTA_DM_PM_SNIFF_A2DP_IDX, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ - {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + {{BTA_DM_PM_SNIFF, 5000}, {BTA_DM_PM_NO_ACTION, 0}}, /* idle */ + {{BTA_DM_PM_ACTIVE, 0}, {BTA_DM_PM_NO_ACTION, 0}}, /* busy */ + {{BTA_DM_PM_NO_ACTION, 0}, {BTA_DM_PM_NO_ACTION, 0}} /* mode change retry */ } }, @@ -450,13 +470,24 @@ tBTA_DM_PM_TYPE_QUALIFIER tBTA_DM_PM_SPEC bta_dm_pm_spec[BTA_DM_NUM_PM_SPEC] = */ tBTA_DM_PM_TYPE_QUALIFIER tBTM_PM_PWR_MD bta_dm_pm_md[] = { +/* + * More sniff parameter entries can be added for + * BTA_DM_PM_SNIFF3 - BTA_DM_PM_SNIFF7, if needed. When entries are added or + * removed, BTA_DM_PM_PARK_IDX needs to be updated to reflect the actual index + * BTA_DM_PM_PARK_IDX is defined in bta_api.h and can be override by the + * bdroid_buildcfg.h settings. + * The SNIFF table entries must be in the order from highest latency (biggest + * interval) to lowest latency. If there's a conflict among the connected + * services, the setting with lowest latency wins. + */ /* sniff modes: max interval, min interval, attempt, timeout */ - {BTA_DM_PM_SNIFF_MAX, BTA_DM_PM_SNIFF_MIN, BTA_DM_PM_SNIFF_ATTEMPT, BTA_DM_PM_SNIFF_TIMEOUT, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF - A2DP */ - {BTA_DM_PM_SNIFF1_MAX, BTA_DM_PM_SNIFF1_MIN, BTA_DM_PM_SNIFF1_ATTEMPT, BTA_DM_PM_SNIFF1_TIMEOUT, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF1 */ - {BTA_DM_PM_SNIFF2_MAX, BTA_DM_PM_SNIFF2_MIN, BTA_DM_PM_SNIFF2_ATTEMPT, BTA_DM_PM_SNIFF2_TIMEOUT, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF2- HD idle */ - {BTA_DM_PM_SNIFF3_MAX, BTA_DM_PM_SNIFF3_MIN, BTA_DM_PM_SNIFF3_ATTEMPT, BTA_DM_PM_SNIFF3_TIMEOUT, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF3- SCO open */ - {BTA_DM_PM_SNIFF4_MAX, BTA_DM_PM_SNIFF4_MIN, BTA_DM_PM_SNIFF4_ATTEMPT, BTA_DM_PM_SNIFF4_TIMEOUT, BTM_PM_MD_SNIFF}, /*for BTA_DM_PM_SNIFF4- HD active*/ - {BTA_DM_PM_PARK_MAX, BTA_DM_PM_PARK_MIN, BTA_DM_PM_PARK_ATTEMPT, BTA_DM_PM_PARK_TIMEOUT, BTM_PM_MD_PARK} + {800, 400, 4, 1, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF - A2DP */ + {400, 200, 4, 1, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF1 */ + {180, 150, 4, 1, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF2- HD idle */ + {150, 50, 4, 1, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF3- SCO open */ + { 54, 30, 4, 1, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF4- HD active */ + { 36, 36, 2, 0, BTM_PM_MD_SNIFF}, /* for BTA_DM_PM_SNIFF5- HD active */ + {800, 400, 0, 0, BTM_PM_MD_PARK} #ifdef BTE_SIM_APP /* For Insight builds only */ /* Entries at the end of the bta_dm_pm_md table are user-defined (runtime configurable), diff --git a/bta/dm/bta_dm_int.h b/bta/dm/bta_dm_int.h index b7c85ddea..80b00f1ce 100644 --- a/bta/dm/bta_dm_int.h +++ b/bta/dm/bta_dm_int.h @@ -54,6 +54,7 @@ enum BTA_DM_API_DISABLE_EVT, BTA_DM_API_SET_NAME_EVT, BTA_DM_API_SET_VISIBILITY_EVT, + BTA_DM_ACL_CHANGE_EVT, BTA_DM_API_ADD_DEVICE_EVT, BTA_DM_API_REMOVE_ACL_EVT, @@ -72,14 +73,12 @@ enum BTA_DM_API_SET_ENCRYPTION_EVT, - #if (BTM_OOB_INCLUDED == TRUE) BTA_DM_API_LOC_OOB_EVT, BTA_DM_CI_IO_REQ_EVT, BTA_DM_CI_RMT_OOB_EVT, #endif /* BTM_OOB_INCLUDED */ - BTA_DM_API_REMOVE_DEVICE_EVT, #if BLE_INCLUDED == TRUE BTA_DM_API_ADD_BLEKEY_EVT, @@ -89,8 +88,8 @@ enum BTA_DM_API_BLE_SEC_GRANT_EVT, BTA_DM_API_BLE_SET_BG_CONN_TYPE, BTA_DM_API_BLE_CONN_PARAM_EVT, - BTA_DM_API_BLE_SCAN_PARAM_EVT, BTA_DM_API_BLE_CONN_SCAN_PARAM_EVT, + BTA_DM_API_BLE_SCAN_PARAM_EVT, BTA_DM_API_BLE_OBSERVE_EVT, BTA_DM_API_UPDATE_CONN_PARAM_EVT, #if BLE_PRIVACY_SPT == TRUE @@ -117,11 +116,14 @@ enum BTA_DM_API_BLE_READ_SCAN_REPORTS_EVT, BTA_DM_API_BLE_TRACK_ADVERTISER_EVT, BTA_DM_API_BLE_ENERGY_INFO_EVT, + #endif BTA_DM_API_ENABLE_TEST_MODE_EVT, BTA_DM_API_DISABLE_TEST_MODE_EVT, BTA_DM_API_EXECUTE_CBACK_EVT, + BTA_DM_API_REMOVE_ALL_ACL_EVT, + BTA_DM_API_REMOVE_DEVICE_EVT, BTA_DM_MAX_EVT }; @@ -140,6 +142,7 @@ enum BTA_DM_DISCOVERY_RESULT_EVT, BTA_DM_API_DI_DISCOVER_EVT, BTA_DM_DISC_CLOSE_TOUT_EVT + }; /* data type for BTA_DM_API_ENABLE_EVT */ @@ -337,7 +340,7 @@ typedef struct { BT_HDR hdr; BD_ADDR bd_addr; - + tBTA_DM_PM_ACTION pm_request; } tBTA_DM_PM_TIMER; @@ -463,6 +466,14 @@ typedef struct tBLE_SCAN_PARAM_SETUP_CBACK scan_param_setup_cback; }tBTA_DM_API_BLE_SCAN_PARAMS; +/* set scan parameter for BLE connections */ +typedef struct +{ + BT_HDR hdr; + UINT16 scan_int; + UINT16 scan_window; +} tBTA_DM_API_BLE_CONN_SCAN_PARAMS; + /* Data type for start/stop observe */ typedef struct { @@ -594,6 +605,14 @@ typedef struct tBTA_TRANSPORT transport; }tBTA_DM_API_REMOVE_ACL; + +/* data type for BTA_DM_API_REMOVE_ALL_ACL_EVT */ +typedef struct +{ + BT_HDR hdr; + tBTA_DM_LINK_TYPE link_type; + +} tBTA_DM_API_REMOVE_ALL_ACL; typedef struct { BT_HDR hdr; @@ -693,6 +712,7 @@ typedef union tBTA_DM_API_BLE_SEC_GRANT ble_sec_grant; tBTA_DM_API_BLE_SET_BG_CONN_TYPE ble_set_bd_conn_type; tBTA_DM_API_BLE_CONN_PARAMS ble_set_conn_params; + tBTA_DM_API_BLE_CONN_SCAN_PARAMS ble_set_conn_scan_params; tBTA_DM_API_BLE_SCAN_PARAMS ble_set_scan_params; tBTA_DM_API_BLE_OBSERVE ble_observe; tBTA_DM_API_ENABLE_PRIVACY ble_remote_privacy; @@ -721,6 +741,7 @@ typedef union #endif tBTA_DM_API_REMOVE_ACL remove_acl; + tBTA_DM_API_REMOVE_ALL_ACL remove_all_acl; } tBTA_DM_MSG; @@ -741,6 +762,12 @@ typedef UINT8 tBTA_DM_CONN_STATE; #define BTA_DM_DI_ACP_SNIFF 0x04 /* set this bit if peer init sniff */ typedef UINT8 tBTA_DM_DEV_INFO; +/* set power mode request type */ +#define BTA_DM_PM_RESTART 1 +#define BTA_DM_PM_NEW_REQ 2 +#define BTA_DM_PM_EXECUTE 3 +typedef UINT8 tBTA_DM_PM_REQ; + typedef struct { BD_ADDR peer_bdaddr; @@ -753,11 +780,13 @@ typedef struct #if (BTM_SSR_INCLUDED == TRUE) tBTM_PM_STATUS prev_low; /* previous low power mode used */ #endif - tBTA_DM_PM_ACTTION pm_mode_attempted; - tBTA_DM_PM_ACTTION pm_mode_failed; + tBTA_DM_PM_ACTION pm_mode_attempted; + tBTA_DM_PM_ACTION pm_mode_failed; BOOLEAN remove_dev_pending; +#if BLE_INCLUDED == TRUE UINT16 conn_handle; tBT_TRANSPORT transport; +#endif } tBTA_DM_PEER_DEVICE; @@ -780,11 +809,13 @@ typedef struct tBTA_SYS_ID id; UINT8 app_id; tBTA_SYS_CONN_STATUS state; - + BOOLEAN new_request; } tBTA_DM_SRVCS; -#define BTA_DM_NUM_CONN_SRVS 5 +#ifndef BTA_DM_NUM_CONN_SRVS +#define BTA_DM_NUM_CONN_SRVS 10 +#endif typedef struct { @@ -796,15 +827,27 @@ typedef struct typedef struct { - TIMER_LIST_ENT timer; +#define BTA_DM_PM_SNIFF_TIMER_IDX 0 +#define BTA_DM_PM_PARK_TIMER_IDX 1 +#define BTA_DM_PM_SUSPEND_TIMER_IDX 2 +#define BTA_DM_PM_MODE_TIMER_MAX 3 + /* + * Keep three different timers for PARK, SNIFF and SUSPEND if TBFC is + * supported. + */ + TIMER_LIST_ENT timer[BTA_DM_PM_MODE_TIMER_MAX]; + + UINT8 srvc_id[BTA_DM_PM_MODE_TIMER_MAX]; + UINT8 pm_action[BTA_DM_PM_MODE_TIMER_MAX]; + UINT8 active; /* number of active timer */ + BD_ADDR peer_bdaddr; BOOLEAN in_use; - } tBTA_PM_TIMER; extern tBTA_DM_CONNECTED_SRVCS bta_dm_conn_srvcs; -#define BTA_DM_NUM_PM_TIMER 3 +#define BTA_DM_NUM_PM_TIMER 7 /* DM control block */ typedef struct @@ -856,6 +899,8 @@ typedef struct #endif + + tBTA_DM_ENCRYPT_CBACK *p_encrypt_cback; TIMER_LIST_ENT switch_delay_timer; } tBTA_DM_CB; @@ -886,6 +931,7 @@ typedef struct tSDP_UUID uuid; UINT8 peer_scn; BOOLEAN sdp_search; + BOOLEAN cancel_pending; /* inquiry cancel is pending */ tBTA_TRANSPORT transport; #if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE)) tBTA_DM_SEARCH_CBACK * p_scan_cback; @@ -899,8 +945,8 @@ typedef struct UINT8 * p_ble_rawdata; UINT32 ble_raw_size; UINT32 ble_raw_used; - TIMER_LIST_ENT gatt_close_timer; - BD_ADDR pending_close_bda; + TIMER_LIST_ENT gatt_close_timer; /* GATT channel close delay timer */ + BD_ADDR pending_close_bda; /* pending GATT channel remote device address */ #endif #endif @@ -940,8 +986,6 @@ typedef struct extern const UINT32 bta_service_id_to_btm_srv_id_lkup_tbl[]; -extern const tBTA_DM_CFG bta_dm_cfg; - typedef struct { @@ -967,7 +1011,7 @@ typedef struct typedef struct { - tBTA_DM_PM_ACTTION power_mode; + tBTA_DM_PM_ACTION power_mode; UINT16 timeout; } tBTA_DM_PM_ACTN; @@ -1042,6 +1086,9 @@ extern void bta_dm_enable (tBTA_DM_MSG *p_data); extern void bta_dm_disable (tBTA_DM_MSG *p_data); extern void bta_dm_set_dev_name (tBTA_DM_MSG *p_data); extern void bta_dm_set_visibility (tBTA_DM_MSG *p_data); + +extern void bta_dm_set_scan_config(tBTA_DM_MSG *p_data); +extern void bta_dm_vendor_spec_command(tBTA_DM_MSG *p_data); extern void bta_dm_bond (tBTA_DM_MSG *p_data); extern void bta_dm_bond_cancel (tBTA_DM_MSG *p_data); extern void bta_dm_pin_reply (tBTA_DM_MSG *p_data); @@ -1063,7 +1110,7 @@ extern void bta_dm_ble_confirm_reply (tBTA_DM_MSG *p_data); extern void bta_dm_security_grant (tBTA_DM_MSG *p_data); extern void bta_dm_ble_set_bg_conn_type (tBTA_DM_MSG *p_data); extern void bta_dm_ble_set_conn_params (tBTA_DM_MSG *p_data); -extern void bta_dm_ble_set_scan_params (tBTA_DM_MSG *p_data); +extern void bta_dm_ble_set_scan_params(tBTA_DM_MSG *p_data); extern void bta_dm_ble_set_conn_scan_params (tBTA_DM_MSG *p_data); extern void bta_dm_close_gatt_conn(tBTA_DM_MSG *p_data); extern void bta_dm_ble_observe (tBTA_DM_MSG *p_data); @@ -1104,6 +1151,7 @@ extern void bta_dm_ci_rmt_oob_act(tBTA_DM_MSG *p_data); extern void bta_dm_init_pm(void); extern void bta_dm_disable_pm(void); +extern UINT8 bta_dm_get_av_count(void); extern void bta_dm_search_start (tBTA_DM_MSG *p_data); extern void bta_dm_search_cancel (tBTA_DM_MSG *p_data); extern void bta_dm_discover (tBTA_DM_MSG *p_data); @@ -1133,4 +1181,6 @@ extern void bta_dm_enable_test_mode(tBTA_DM_MSG *p_data); extern void bta_dm_disable_test_mode(tBTA_DM_MSG *p_data); extern void bta_dm_execute_callback(tBTA_DM_MSG *p_data); + +extern void bta_dm_remove_all_acl(tBTA_DM_MSG *p_data); #endif /* BTA_DM_INT_H */ diff --git a/bta/dm/bta_dm_main.c b/bta/dm/bta_dm_main.c index 27c4682ec..fc16bb6cd 100644 --- a/bta/dm/bta_dm_main.c +++ b/bta/dm/bta_dm_main.c @@ -54,7 +54,7 @@ const tBTA_DM_ACTION bta_dm_action[] = bta_dm_set_visibility, /* 3 BTA_DM_API_SET_VISIBILITY_EVT */ bta_dm_acl_change, /* 8 BTA_DM_ACL_CHANGE_EVT */ bta_dm_add_device, /* 9 BTA_DM_API_ADD_DEVICE_EVT */ - bta_dm_close_acl, /* 10 BTA_DM_API_ADD_DEVICE_EVT */ + bta_dm_close_acl, /* 10 BTA_DM_API_ADD_DEVICE_EVT */ /* security API events */ bta_dm_bond, /* 11 BTA_DM_API_BOND_EVT */ @@ -76,7 +76,6 @@ const tBTA_DM_ACTION bta_dm_action[] = bta_dm_ci_rmt_oob_act, /* 22 BTA_DM_CI_RMT_OOB_EVT */ #endif /* BTM_OOB_INCLUDED */ - bta_dm_remove_device, /* BTA_DM_API_REMOVE_DEVICE_EVT */ #if BLE_INCLUDED == TRUE bta_dm_add_blekey, /* BTA_DM_API_ADD_BLEKEY_EVT */ @@ -95,7 +94,7 @@ const tBTA_DM_ACTION bta_dm_action[] = #endif bta_dm_ble_set_adv_params, /* BTA_DM_API_BLE_ADV_PARAM_EVT */ bta_dm_ble_set_adv_config, /* BTA_DM_API_BLE_SET_ADV_CONFIG_EVT */ - bta_dm_ble_set_scan_rsp, /* BTA_DM_API_BLE_SET_SCAN_RSP_EVT */ + bta_dm_ble_set_scan_rsp, /* BTA_DM_API_BLE_SET_SCAN_RSPT */ bta_dm_ble_broadcast, /* BTA_DM_API_BLE_BROADCAST_EVT */ bta_dm_ble_set_data_length, /* BTA_DM_API_SET_DATA_LENGTH_EVT */ #if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE @@ -117,7 +116,10 @@ const tBTA_DM_ACTION bta_dm_action[] = bta_dm_enable_test_mode, /* BTA_DM_API_ENABLE_TEST_MODE_EVT */ bta_dm_disable_test_mode, /* BTA_DM_API_DISABLE_TEST_MODE_EVT */ - bta_dm_execute_callback, /* BTA_DM_API_EXECUTE_CBACK_EVT */ + bta_dm_execute_callback, /* BTA_DM_API_EXECUTE_CBACK_EVT */ + + bta_dm_remove_all_acl, /* BTA_DM_API_REMOVE_ALL_ACL_EVT */ + bta_dm_remove_device, /* BTA_DM_API_REMOVE_DEVICE_EVT */ }; @@ -202,7 +204,6 @@ const UINT8 bta_dm_search_idle_st_table[][BTA_DM_SEARCH_NUM_COLS] = #if BLE_INCLUDED == TRUE /* DISC_CLOSE_TOUT_EVT */ ,{BTA_DM_CLOSE_GATT_CONN, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE} #endif - }; const UINT8 bta_dm_search_search_active_st_table[][BTA_DM_SEARCH_NUM_COLS] = { @@ -217,9 +218,8 @@ const UINT8 bta_dm_search_search_active_st_table[][BTA_DM_SEARCH_NUM_COLS] = /* SEARCH_CMPL_EVT */ {BTA_DM_SEARCH_CMPL, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IDLE}, /* DISCV_RES_EVT */ {BTA_DM_SEARCH_RESULT, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE}, /* API_DI_DISCOVER_EVT */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE} - #if BLE_INCLUDED == TRUE -/* DISC_CLOSE_TOUT_EVT */ ,{BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE} +/* DISC_CLOSE_TOUT_EVT */ ,{BTA_DM_CLOSE_GATT_CONN, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_ACTIVE} #endif }; @@ -237,7 +237,6 @@ const UINT8 bta_dm_search_search_cancelling_st_table[][BTA_DM_SEARCH_NUM_COLS] = /* SEARCH_CMPL_EVT */ {BTA_DM_SEARCH_CANCEL_TRANSAC_CMPL, BTA_DM_SEARCH_CANCEL_CMPL, BTA_DM_SEARCH_IDLE}, /* DISCV_RES_EVT */ {BTA_DM_SEARCH_CANCEL_TRANSAC_CMPL, BTA_DM_SEARCH_CANCEL_CMPL, BTA_DM_SEARCH_IDLE}, /* API_DI_DISCOVER_EVT */ {BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_CANCELLING} - #if BLE_INCLUDED == TRUE /* DISC_CLOSE_TOUT_EVT */ ,{BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_CANCELLING} #endif @@ -261,7 +260,6 @@ const UINT8 bta_dm_search_disc_active_st_table[][BTA_DM_SEARCH_NUM_COLS] = #if BLE_INCLUDED == TRUE /* DISC_CLOSE_TOUT_EVT */ ,{BTA_DM_SEARCH_IGNORE, BTA_DM_SEARCH_IGNORE, BTA_DM_DISCOVER_ACTIVE} #endif - }; typedef const UINT8 (*tBTA_DM_ST_TBL)[BTA_DM_SEARCH_NUM_COLS]; diff --git a/bta/dm/bta_dm_pm.c b/bta/dm/bta_dm_pm.c index 43c9a5acc..b09402120 100644 --- a/bta/dm/bta_dm_pm.c +++ b/bta/dm/bta_dm_pm.c @@ -33,7 +33,8 @@ static void bta_dm_pm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr); -static void bta_dm_pm_set_mode(BD_ADDR peer_addr, BOOLEAN timed_out ); +static void bta_dm_pm_set_mode(BD_ADDR peer_addr, tBTA_DM_PM_ACTION pm_mode, + tBTA_DM_PM_REQ pm_req); static void bta_dm_pm_timer_cback(void *p_tle); static void bta_dm_pm_btm_cback(BD_ADDR bd_addr, tBTM_PM_STATUS status, UINT16 value, UINT8 hci_status); static BOOLEAN bta_dm_pm_park(BD_ADDR peer_addr); @@ -58,7 +59,7 @@ tBTA_DM_CONNECTED_SRVCS bta_dm_conn_srvcs; ** ** Function bta_dm_init_pm ** -** Description Initialises the BT low power manager +** Description Initializes the BT low power manager ** ** ** Returns void @@ -66,7 +67,6 @@ tBTA_DM_CONNECTED_SRVCS bta_dm_conn_srvcs; *******************************************************************************/ void bta_dm_init_pm(void) { - memset(&bta_dm_conn_srvcs, 0x00, sizeof(bta_dm_conn_srvcs)); /* if there are no power manger entries, so not register */ @@ -78,7 +78,12 @@ void bta_dm_init_pm(void) bta_dm_pm_btm_cback); } - + /* Need to initialize all PM timer service IDs */ + for (int i = 0; i < BTA_DM_NUM_PM_TIMER; i++) + { + for (int j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++) + bta_dm_cb.pm_timer[i].srvc_id[j] = BTA_ID_MAX; + } } @@ -94,18 +99,28 @@ void bta_dm_init_pm(void) *******************************************************************************/ void bta_dm_disable_pm(void) { - UINT8 i; - - bta_sys_pm_register(NULL); BTM_PmRegister( BTM_PM_DEREG, &bta_dm_cb.pm_id, NULL); + /* + * Deregister the PM callback from the system handling to prevent + * re-enabling the PM timers after this call if the callback is invoked. + */ + bta_sys_pm_register((tBTA_SYS_CONN_CBACK*)NULL); + /* Need to stop all active timers. */ - for(i=0; iin_use = TRUE; + p_timer->timer[timer_idx].p_cback = bta_dm_pm_timer_cback; + + if (p_timer->srvc_id[timer_idx] == BTA_ID_MAX) + p_timer->active++; + + if (p_timer->pm_action[timer_idx] < pm_action) + p_timer->pm_action[timer_idx] = pm_action; + + p_timer->srvc_id[timer_idx] = srvc_id; + + bta_sys_start_timer(&p_timer->timer[timer_idx], 0, timeout); +} + +UINT32 bta_dm_pm_get_remaining_ticks (TIMER_LIST_ENT *p_target_tle) +{ + return bta_sys_get_remaining_ticks(p_target_tle); +} + +/******************************************************************************* +** ** Function bta_dm_pm_cback ** ** Description Conn change callback from sys for low power management @@ -156,10 +317,11 @@ static void bta_dm_pm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, UINT8 i,j; UINT16 policy_setting; UINT8 *p = NULL; + tBTA_DM_PEER_DEVICE *p_dev; + #if (BTM_SSR_INCLUDED == TRUE) int index = BTA_DM_PM_SSR0; #endif - tBTA_DM_PEER_DEVICE *p_dev; APPL_TRACE_DEBUG("bta_dm_pm_cback: st(%d), id(%d), app(%d)", status, id, app_id); @@ -175,10 +337,11 @@ static void bta_dm_pm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, } - /* if no entries are there for the app_id and subystem in p_bta_dm_pm_spec*/ + /* if no entries are there for the app_id and subsystem in p_bta_dm_pm_spec*/ if(i> p_bta_dm_pm_cfg[0].app_id) return; + bta_dm_pm_stop_timer_by_srvc_id(peer_addr, id); /*p_dev = bta_dm_find_peer_device(peer_addr);*/ #if (BTM_SSR_INCLUDED == TRUE) @@ -204,7 +367,10 @@ static void bta_dm_pm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, if((bta_dm_conn_srvcs.conn_srvc[j].id == id) && (bta_dm_conn_srvcs.conn_srvc[j].app_id == app_id ) && !bdcmp(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr, peer_addr)) + { + bta_dm_conn_srvcs.conn_srvc[j].new_request = TRUE; break; + } } @@ -212,7 +378,6 @@ static void bta_dm_pm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, the cb */ if(p_bta_dm_pm_spec[p_bta_dm_pm_cfg[i].spec_idx].actn_tbl[status][0].power_mode == BTA_DM_PM_NO_PREF) { - if(j != bta_dm_conn_srvcs.count) { bta_dm_conn_srvcs.count--; @@ -242,6 +407,7 @@ static void bta_dm_pm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, /* fill in a new cb */ bta_dm_conn_srvcs.conn_srvc[j].id = id; bta_dm_conn_srvcs.conn_srvc[j].app_id = app_id; + bta_dm_conn_srvcs.conn_srvc[j].new_request = TRUE; bdcpy(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr, peer_addr); APPL_TRACE_WARNING("new conn_srvc id:%d, app_id:%d", id, app_id); @@ -293,7 +459,7 @@ static void bta_dm_pm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, } #endif - bta_dm_pm_set_mode(peer_addr, FALSE); + bta_dm_pm_set_mode(peer_addr, BTA_DM_PM_NO_ACTION, BTA_DM_PM_NEW_REQ); /* perform the HID link workaround if needed ** 1. If SCO up/down event is received OR @@ -326,21 +492,25 @@ static void bta_dm_pm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, ** Returns void ** *******************************************************************************/ -static void bta_dm_pm_set_mode(BD_ADDR peer_addr, BOOLEAN timed_out ) + +static void bta_dm_pm_set_mode(BD_ADDR peer_addr, tBTA_DM_PM_ACTION pm_request, + tBTA_DM_PM_REQ pm_req ) { - tBTA_DM_PM_ACTTION pm_action = BTA_DM_PM_NO_ACTION; + tBTA_DM_PM_ACTION pm_action = BTA_DM_PM_NO_ACTION; UINT16 timeout = 0; UINT8 i,j; - tBTA_DM_PM_ACTTION failed_pm = 0; + tBTA_DM_PM_ACTION failed_pm = 0; tBTA_DM_PEER_DEVICE *p_peer_device = NULL; - tBTA_DM_PM_ACTTION allowed_modes = 0; - tBTA_DM_PM_ACTTION pref_modes = 0; + tBTA_DM_PM_ACTION allowed_modes = 0; + tBTA_DM_PM_ACTION pref_modes = 0; tBTA_DM_PM_CFG *p_pm_cfg; tBTA_DM_PM_SPEC *p_pm_spec; tBTA_DM_PM_ACTN *p_act0, *p_act1; - tBTA_DM_SRVCS *p_srvcs; - + tBTA_DM_SRVCS *p_srvcs = NULL; + BOOLEAN timer_started = FALSE; + UINT8 timer_idx, available_timer = BTA_DM_PM_MODE_TIMER_MAX; + UINT32 remaining_ticks = 0; if(!bta_dm_cb.device_list.count) return; @@ -384,11 +554,15 @@ static void bta_dm_pm_set_mode(BD_ADDR peer_addr, BOOLEAN timed_out ) { pref_modes |= p_act0->power_mode; - if(p_act0->power_mode > pm_action) + if(p_act0->power_mode >= pm_action) { pm_action = p_act0->power_mode; - timeout = p_act0->timeout; + if (pm_req != BTA_DM_PM_NEW_REQ || p_srvcs->new_request) + { + p_srvcs->new_request = FALSE; + timeout = p_act0->timeout; + } } } /* if first preference has already failed, try second preference */ @@ -400,7 +574,6 @@ static void bta_dm_pm_set_mode(BD_ADDR peer_addr, BOOLEAN timed_out ) { pm_action = p_act1->power_mode; timeout = p_act1->timeout; - } } } @@ -408,7 +581,6 @@ static void bta_dm_pm_set_mode(BD_ADDR peer_addr, BOOLEAN timed_out ) if(pm_action & (BTA_DM_PM_PARK | BTA_DM_PM_SNIFF)) { - /* some service don't like the mode */ if(!(allowed_modes & pm_action)) { @@ -423,47 +595,64 @@ static void bta_dm_pm_set_mode(BD_ADDR peer_addr, BOOLEAN timed_out ) } } - - } - - if(!timed_out && timeout) + /* if need to start a timer */ + if((pm_req != BTA_DM_PM_EXECUTE) && timeout) { - for(i=0; iid, pm_action); + } + timer_started = TRUE; + } + break; + } + else if (!bta_dm_cb.pm_timer[i].in_use) + { + APPL_TRACE_DEBUG("%s dm_pm_timer:%d, %d", __func__, i, timeout); + if (available_timer == BTA_DM_PM_MODE_TIMER_MAX) + available_timer = i; } - } - - /* no more timers */ - if(i==BTA_DM_NUM_PM_TIMER) + /* new power mode for a new active connection */ + if (!timer_started) { - APPL_TRACE_WARNING("bta_dm_act dm_pm_timer no more"); - return; + if( available_timer != BTA_DM_PM_MODE_TIMER_MAX) + { + bdcpy(bta_dm_cb.pm_timer[available_timer].peer_bdaddr, peer_addr); + if ((timer_idx = bta_pm_action_to_timer_idx(pm_action)) != BTA_DM_PM_MODE_TIMER_MAX) + { + bta_dm_pm_start_timer(&bta_dm_cb.pm_timer[available_timer], timer_idx, timeout, p_srvcs->id, pm_action); + timer_started = TRUE; + } + } + /* no more timers */ + else + { + APPL_TRACE_WARNING("bta_dm_act dm_pm_timer no more"); + } } + return; } - - if(pm_action == BTA_DM_PM_NO_ACTION) + /* if pending power mode timer expires, and currecnt link is in a + lower power mode than current profile requirement, igonre it */ + if (pm_req == BTA_DM_PM_EXECUTE && pm_request < pm_action) { - - + APPL_TRACE_ERROR("Ignore the power mode request: %d", pm_request) + return; } - else if(pm_action == BTA_DM_PM_PARK) + if(pm_action == BTA_DM_PM_PARK) { p_peer_device->pm_mode_attempted = BTA_DM_PM_PARK; bta_dm_pm_park(peer_addr); - } else if(pm_action & BTA_DM_PM_SNIFF) { @@ -480,15 +669,9 @@ static void bta_dm_pm_set_mode(BD_ADDR peer_addr, BOOLEAN timed_out ) } else if(pm_action == BTA_DM_PM_ACTIVE) { - bta_dm_pm_active(peer_addr); - } - - } - - /******************************************************************************* ** ** Function bta_ag_pm_park @@ -515,7 +698,6 @@ static BOOLEAN bta_dm_pm_park(BD_ADDR peer_addr) } - /******************************************************************************* ** ** Function bta_ag_pm_sniff @@ -531,14 +713,17 @@ static BOOLEAN bta_dm_pm_sniff(tBTA_DM_PEER_DEVICE *p_peer_dev, UINT8 index) tBTM_PM_MODE mode = BTM_PM_STS_ACTIVE; tBTM_PM_PWR_MD pwr_md; tBTM_STATUS status; +#if (BTM_SSR_INCLUDED == TRUE) + UINT8 *p_rem_feat = NULL; +#endif BTM_ReadPowerMode(p_peer_dev->peer_bdaddr, &mode); - + p_rem_feat = BTM_ReadRemoteFeatures (p_peer_dev->peer_bdaddr); #if (BTM_SSR_INCLUDED == TRUE) APPL_TRACE_DEBUG("bta_dm_pm_sniff cur:%d, idx:%d, info:x%x", mode, index, p_peer_dev->info); if (mode != BTM_PM_MD_SNIFF || - (HCI_SNIFF_SUB_RATE_SUPPORTED(BTM_ReadLocalFeatures ()) && - HCI_SNIFF_SUB_RATE_SUPPORTED(BTM_ReadRemoteFeatures (p_peer_dev->peer_bdaddr)) && + (HCI_SNIFF_SUB_RATE_SUPPORTED(BTM_ReadLocalFeatures ()) && p_rem_feat && + HCI_SNIFF_SUB_RATE_SUPPORTED(p_rem_feat) && !(p_peer_dev->info & BTA_DM_DI_USE_SSR))) #else APPL_TRACE_DEBUG("bta_dm_pm_sniff cur:%d, idx:%d", mode, index); @@ -580,8 +765,6 @@ static BOOLEAN bta_dm_pm_sniff(tBTA_DM_PEER_DEVICE *p_peer_dev, UINT8 index) p_peer_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF|BTA_DM_DI_SET_SNIFF); } } - /* else already in sniff and is using SSR, do nothing */ - return TRUE; } @@ -712,38 +895,39 @@ static void bta_dm_pm_btm_cback(BD_ADDR bd_addr, tBTM_PM_STATUS status, UINT16 v *******************************************************************************/ static void bta_dm_pm_timer_cback(void *p_tle) { - tBTA_DM_PM_TIMER *p_buf; - UINT8 i; + UINT8 i, j; - APPL_TRACE_WARNING("dm_pm_timer expires"); - - for(i=0; ihdr.event = BTA_DM_PM_TIMER_EVT; + p_buf->pm_request = bta_dm_cb.pm_timer[i].pm_action[j]; bdcpy(p_buf->bd_addr, bta_dm_cb.pm_timer[i].peer_bdaddr); bta_sys_sendmsg(p_buf); } @@ -761,16 +945,13 @@ static void bta_dm_pm_timer_cback(void *p_tle) *******************************************************************************/ void bta_dm_pm_btm_status(tBTA_DM_MSG *p_data) { + APPL_TRACE_DEBUG("%s status: %d", __func__, p_data->pm_status.status); - tBTA_DM_PEER_DEVICE *p_dev; - tBTA_DM_DEV_INFO info; - - APPL_TRACE_DEBUG("bta_dm_pm_btm_status:%d", p_data->pm_status.status); - p_dev = bta_dm_find_peer_device(p_data->pm_status.bd_addr); - if(NULL == p_dev) + tBTA_DM_PEER_DEVICE *p_dev = bta_dm_find_peer_device(p_data->pm_status.bd_addr); + if (NULL == p_dev) return; - info = p_dev->info; + tBTA_DM_DEV_INFO info = p_dev->info; /* check new mode */ switch (p_data->pm_status.status) { @@ -779,15 +960,15 @@ void bta_dm_pm_btm_status(tBTA_DM_MSG *p_data) we should not try it again*/ if (p_data->pm_status.hci_status != 0) { - APPL_TRACE_ERROR("bta_dm_pm_btm_status hci_status=%d", p_data->pm_status.hci_status); + APPL_TRACE_ERROR("%s hci_status=%d", __func__, p_data->pm_status.hci_status); p_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF|BTA_DM_DI_SET_SNIFF); if(p_dev->pm_mode_attempted &(BTA_DM_PM_PARK | BTA_DM_PM_SNIFF)) { p_dev->pm_mode_failed |= ((BTA_DM_PM_PARK | BTA_DM_PM_SNIFF) & p_dev->pm_mode_attempted); - bta_dm_pm_stop_timer(p_data->pm_status.bd_addr); - bta_dm_pm_set_mode(p_data->pm_status.bd_addr, FALSE); + bta_dm_pm_stop_timer_by_mode(p_data->pm_status.bd_addr, p_dev->pm_mode_attempted); + bta_dm_pm_set_mode(p_data->pm_status.bd_addr, BTA_DM_PM_NO_ACTION, BTA_DM_PM_RESTART); } } else @@ -800,8 +981,9 @@ void bta_dm_pm_btm_status(tBTA_DM_MSG *p_data) } p_dev->prev_low = BTM_PM_STS_ACTIVE; #endif + /* link to active mode, need to restart the timer for next low power mode if needed */ bta_dm_pm_stop_timer(p_data->pm_status.bd_addr); - bta_dm_pm_set_mode(p_data->pm_status.bd_addr, FALSE); + bta_dm_pm_set_mode(p_data->pm_status.bd_addr, BTA_DM_PM_NO_ACTION, BTA_DM_PM_RESTART); } break; @@ -833,11 +1015,14 @@ void bta_dm_pm_btm_status(tBTA_DM_MSG *p_data) */ bta_dm_pm_stop_timer(p_data->pm_status.bd_addr); } - p_dev->info &= ~(BTA_DM_DI_SET_SNIFF|BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF); - if (info & BTA_DM_DI_SET_SNIFF) - p_dev->info |= BTA_DM_DI_INT_SNIFF; else - p_dev->info |= BTA_DM_DI_ACP_SNIFF; + { + p_dev->info &= ~(BTA_DM_DI_SET_SNIFF | BTA_DM_DI_INT_SNIFF | BTA_DM_DI_ACP_SNIFF); + if (info & BTA_DM_DI_SET_SNIFF) + p_dev->info |= BTA_DM_DI_INT_SNIFF; + else + p_dev->info |= BTA_DM_DI_ACP_SNIFF; + } break; case BTM_PM_STS_ERROR: @@ -864,11 +1049,8 @@ void bta_dm_pm_btm_status(tBTA_DM_MSG *p_data) *******************************************************************************/ void bta_dm_pm_timer(tBTA_DM_MSG *p_data) { - - APPL_TRACE_WARNING("proc dm_pm_timer expires"); - bta_dm_pm_set_mode(p_data->pm_status.bd_addr, TRUE); - - + APPL_TRACE_EVENT("%s", __func__); + bta_dm_pm_set_mode(p_data->pm_timer.bd_addr, p_data->pm_timer.pm_request, BTA_DM_PM_EXECUTE); } /******************************************************************************* @@ -883,9 +1065,8 @@ void bta_dm_pm_timer(tBTA_DM_MSG *p_data) tBTA_DM_PEER_DEVICE * bta_dm_find_peer_device(BD_ADDR peer_addr) { tBTA_DM_PEER_DEVICE *p_dev = NULL; - int i; - for(i=0; idata; + period_ms_t *p_remaining_ms = (period_ms_t*)context; + *p_remaining_ms += alarm_get_remaining_ms(alarm); + return true; +} + +UINT32 bta_sys_get_remaining_ticks(TIMER_LIST_ENT *p_target_tle) +{ + period_ms_t remaining_ms = 0; + pthread_mutex_lock(&bta_alarm_lock); + // Get the alarm for this p_tle + hash_map_foreach(bta_alarm_hash_map, hash_iter_ro_cb, &remaining_ms); + pthread_mutex_unlock(&bta_alarm_lock); + return remaining_ms; +} + + /******************************************************************************* ** ** Function bta_sys_stop_timer diff --git a/osi/include/alarm.h b/osi/include/alarm.h index 74a730209..f5b049256 100644 --- a/osi/include/alarm.h +++ b/osi/include/alarm.h @@ -52,5 +52,9 @@ void alarm_set_periodic(alarm_t *alarm, period_ms_t period, alarm_callback_t cb, // |alarm| may not be NULL. void alarm_cancel(alarm_t *alarm); +// Figure out how much time until next expiration. +// Returns 0 if not armed. +period_ms_t alarm_get_remaining_ms(alarm_t *alarm); + // Alarm-related state cleanup void alarm_cleanup(void); diff --git a/osi/src/alarm.c b/osi/src/alarm.c index a9cd4dd4c..e71065d85 100644 --- a/osi/src/alarm.c +++ b/osi/src/alarm.c @@ -127,6 +127,13 @@ void alarm_free(alarm_t *alarm) { osi_free(alarm); } +period_ms_t alarm_get_remaining_ms(alarm_t *alarm) { + assert(alarm != NULL); + if (alarm->deadline) + return (alarm->deadline - now()); + return 0; +} + void alarm_set(alarm_t *alarm, period_ms_t deadline, alarm_callback_t cb, void *data) { alarm_set_internal(alarm, deadline, cb, data, false); } diff --git a/stack/btm/btm_ble_gap.c b/stack/btm/btm_ble_gap.c index fde5f6dd6..4a1674f05 100644 --- a/stack/btm/btm_ble_gap.c +++ b/stack/btm/btm_ble_gap.c @@ -1288,6 +1288,41 @@ UINT8 *BTM_CheckAdvData( UINT8 *p_adv, UINT8 type, UINT8 *p_length) /******************************************************************************* ** +** Function BTM__BLEReadDiscoverability +** +** Description This function is called to read the current LE discoverability +** mode of the device. +** +** Returns BTM_BLE_NON_DISCOVERABLE ,BTM_BLE_LIMITED_DISCOVERABLE or +** BTM_BLE_GENRAL_DISCOVERABLE +** +*******************************************************************************/ +UINT16 BTM_BleReadDiscoverability() +{ + BTM_TRACE_API("%s", __FUNCTION__); + + return (btm_cb.ble_ctr_cb.inq_var.discoverable_mode); +} + +/******************************************************************************* +** +** Function BTM__BLEReadConnectability +** +** Description This function is called to read the current LE connectibility +** mode of the device. +** +** Returns BTM_BLE_NON_CONNECTABLE or BTM_BLE_CONNECTABLE +** +*******************************************************************************/ +UINT16 BTM_BleReadConnectability() +{ + BTM_TRACE_API ("%s", __FUNCTION__); + + return (btm_cb.ble_ctr_cb.inq_var.connectable_mode); +} + +/******************************************************************************* +** ** Function btm_ble_build_adv_data ** ** Description This function is called build the adv data and rsp data. diff --git a/stack/include/btm_api.h b/stack/include/btm_api.h index a7c3f9d01..d48bfa97c 100644 --- a/stack/include/btm_api.h +++ b/stack/include/btm_api.h @@ -629,6 +629,13 @@ typedef struct BOOLEAN appl_knows_rem_name; /* set by application if it knows the remote name of the peer device. This is later used by application to determine if remote name request is required to be done. Having the flag here avoid duplicate store of inquiry results */ +#if ( BLE_INCLUDED == TRUE) + UINT16 remote_name_len; + tBTM_BD_NAME remote_name; + UINT8 remote_name_state; + UINT8 remote_name_type; +#endif + } tBTM_INQ_INFO; diff --git a/stack/include/btm_ble_api.h b/stack/include/btm_ble_api.h index 23ec59a86..0a91d5f4a 100644 --- a/stack/include/btm_ble_api.h +++ b/stack/include/btm_ble_api.h @@ -198,11 +198,11 @@ typedef UINT8 tBTM_BLE_SFP; typedef UINT8 BLE_SIGNATURE[BTM_BLE_AUTH_SIGN_LEN]; /* Device address */ #ifndef BTM_BLE_HOST_SUPPORT -#define BTM_BLE_HOST_SUPPORT 0x01 +#define BTM_BLE_HOST_SUPPORT 0x01 #endif #ifndef BTM_BLE_SIMULTANEOUS_HOST -#define BTM_BLE_SIMULTANEOUS_HOST 0x01 +#define BTM_BLE_SIMULTANEOUS_HOST 0x01 #endif /* Appearance Values Reported with BTM_BLE_AD_TYPE_APPEARANCE */ @@ -1423,6 +1423,31 @@ extern UINT8 *BTM_CheckAdvData( UINT8 *p_adv, UINT8 type, UINT8 *p_length); /******************************************************************************* ** +** Function BTM__BLEReadDiscoverability +** +** Description This function is called to read the current LE discoverability +** mode of the device. +** +** Returns BTM_BLE_NON_DISCOVERABLE ,BTM_BLE_LIMITED_DISCOVERABLE or +** BTM_BLE_GENRAL_DISCOVERABLE +** +*******************************************************************************/ +UINT16 BTM_BleReadDiscoverability(); + +/******************************************************************************* +** +** Function BTM__BLEReadConnectability +** +** Description This function is called to read the current LE connectibility +** mode of the device. +** +** Returns BTM_BLE_NON_CONNECTABLE or BTM_BLE_CONNECTABLE +** +*******************************************************************************/ +extern UINT16 BTM_BleReadConnectability (); + +/******************************************************************************* +** ** Function BTM_ReadDevInfo ** ** Description This function is called to read the device/address type -- 2.11.0