summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVenkatRaghavan VijayaRaghavan <venkatrv@broadcom.com>2015-04-21 11:32:29 -0700
committerAndre Eisenbach <eisenbach@google.com>2015-07-14 22:38:16 -0700
commit76356aee883af67898ddc1aa3b628195f396d42a (patch)
tree06e1d9aeafd715ee046bd0c20edf62796ea49604
parent21331c62310dda2f523712c536da3e65afce0f38 (diff)
downloadandroid_system_bt-76356aee883af67898ddc1aa3b628195f396d42a.tar.gz
android_system_bt-76356aee883af67898ddc1aa3b628195f396d42a.tar.bz2
android_system_bt-76356aee883af67898ddc1aa3b628195f396d42a.zip
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
-rw-r--r--bta/dm/bta_dm_act.c544
-rw-r--r--bta/dm/bta_dm_api.c90
-rw-r--r--bta/dm/bta_dm_cfg.c79
-rw-r--r--bta/dm/bta_dm_int.h84
-rw-r--r--bta/dm/bta_dm_main.c16
-rw-r--r--bta/dm/bta_dm_pm.c404
-rw-r--r--bta/include/bta_api.h7
-rw-r--r--bta/sys/bta_sys.h1
-rw-r--r--bta/sys/bta_sys_main.c19
-rw-r--r--osi/include/alarm.h4
-rw-r--r--osi/src/alarm.c7
-rw-r--r--stack/btm/btm_ble_gap.c35
-rw-r--r--stack/include/btm_api.h7
-rw-r--r--stack/include/btm_ble_api.h29
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; i<bta_dm_cb.device_list.count; i++)
{
if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_bda)
@@ -3312,13 +3394,9 @@ void bta_dm_acl_change(tBTA_DM_MSG *p_data)
if( bta_dm_cb.device_list.peer_device[i].conn_state == BTA_DM_UNPAIRING )
{
if (BTM_SecDeleteDevice(bta_dm_cb.device_list.peer_device[i].peer_bdaddr))
- {
-#if (BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE)
- /* remove all cached GATT information */
- BTA_GATTC_Refresh(p_bda);
-#endif
issue_unpair_cb = TRUE;
- }
+
+ APPL_TRACE_DEBUG("%s: Unpairing: issue unpair CB = %d ",__FUNCTION__, issue_unpair_cb);
}
conn.link_down.is_removed = bta_dm_cb.device_list.peer_device[i].remove_dev_pending;
@@ -3357,7 +3435,10 @@ void bta_dm_acl_change(tBTA_DM_MSG *p_data)
{
bta_sys_stop_timer(&bta_dm_cb.disable_timer);
bta_dm_cb.disable_timer.p_cback = (TIMER_CBACK*)&bta_dm_disable_conn_down_timer_cback;
- /* start a timer to make sure that the profiles get the disconnect event */
+ /*
+ * Start a timer to make sure that the profiles
+ * get the disconnect event.
+ */
bta_sys_start_timer(&bta_dm_cb.disable_timer, 0, 1000);
}
}
@@ -3459,9 +3540,7 @@ static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id,
break;
}
}
-
}
-
}
if((BTA_ID_AV == id)||(BTA_ID_AVK ==id))
@@ -3472,63 +3551,21 @@ static void bta_dm_rm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id,
p_dev->info |= 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; i<bta_dm_cb.device_list.count; i++)
{
if (bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, p_data->set_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; i<BTA_DM_NUM_PM_TIMER; i++)
+ for (int i = 0; i < BTA_DM_NUM_PM_TIMER; i++)
{
- if(bta_dm_cb.pm_timer[i].in_use)
+ if (bta_dm_cb.pm_timer[i].in_use)
{
- APPL_TRACE_DEBUG("stop dm_pm_timer:%d", i);
- bta_sys_stop_timer(&bta_dm_cb.pm_timer[i].timer);
+ APPL_TRACE_DEBUG("%s stopping dm_pm_timer: %d", __func__, i);
+ for (int j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++)
+ {
+ bta_sys_stop_timer(&bta_dm_cb.pm_timer[i].timer[j]);
+ bta_dm_cb.pm_timer[i].srvc_id[j] = BTA_ID_MAX;
+ bta_dm_cb.pm_timer[i].pm_action[j] = 0;
+ }
+
+ bta_dm_cb.pm_timer[i].active = 0;
bta_dm_cb.pm_timer[i].in_use = FALSE;
}
}
@@ -113,6 +128,27 @@ void bta_dm_disable_pm(void)
/*******************************************************************************
**
+** Function bta_dm_get_av_count
+**
+** Description Get the number of connected AV
+**
+**
+** Returns number of av connections
+**
+*******************************************************************************/
+UINT8 bta_dm_get_av_count(void)
+{
+ UINT8 count = 0;
+ for (int i = 0; i < bta_dm_conn_srvcs.count; i++)
+ {
+ if (bta_dm_conn_srvcs.conn_srvc[i].id == BTA_ID_AV)
+ ++count;
+ }
+ return count;
+}
+
+/*******************************************************************************
+**
** Function bta_dm_pm_stop_timer
**
** Description stop a PM timer
@@ -123,25 +159,150 @@ void bta_dm_disable_pm(void)
*******************************************************************************/
static void bta_dm_pm_stop_timer(BD_ADDR peer_addr)
{
- UINT8 i;
APPL_TRACE_DEBUG("%s: ", __func__);
- for(i=0; i<BTA_DM_NUM_PM_TIMER; i++)
+ for(int i=0; i<BTA_DM_NUM_PM_TIMER; i++)
{
-
- if(bta_dm_cb.pm_timer[i].in_use && !bdcmp(bta_dm_cb.pm_timer[i].peer_bdaddr, peer_addr))
+ if (bta_dm_cb.pm_timer[i].in_use && !bdcmp(bta_dm_cb.pm_timer[i].peer_bdaddr, peer_addr))
{
- APPL_TRACE_DEBUG("stop dm_pm_timer:%d", i);
- bta_sys_stop_timer(&bta_dm_cb.pm_timer[i].timer);
+ for (int j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++)
+ {
+ APPL_TRACE_DEBUG("%s, Stopping BD address timer_index: [%d][%d]", __func__, i, j);
+ bta_sys_stop_timer(&bta_dm_cb.pm_timer[i].timer[j]);
+ }
bta_dm_cb.pm_timer[i].in_use = FALSE;
break;
}
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_pm_action_to_timer_idx
+**
+** Description convert power mode into timer index for each connected device
+**
+**
+** Returns index of the power mode delay timer
+**
+*******************************************************************************/
+static UINT8 bta_pm_action_to_timer_idx(UINT8 pm_action)
+{
+ if (pm_action == BTA_DM_PM_SUSPEND)
+ return BTA_DM_PM_SUSPEND_TIMER_IDX;
+ else if (pm_action == BTA_DM_PM_PARK)
+ return BTA_DM_PM_PARK_TIMER_IDX;
+ else if ((pm_action & BTA_DM_PM_SNIFF) == BTA_DM_PM_SNIFF)
+ return BTA_DM_PM_SNIFF_TIMER_IDX;
+
+ /* Active, no preference, no action and retry */
+ return BTA_DM_PM_MODE_TIMER_MAX;
+}
+/*******************************************************************************
+**
+** Function bta_dm_pm_stop_timer_by_mode
+**
+** Description stop a PM timer
+**
+**
+** Returns void
+**
+*******************************************************************************/
+static void bta_dm_pm_stop_timer_by_mode(BD_ADDR peer_addr, UINT8 power_mode)
+{
+ const UINT8 timer_idx = bta_pm_action_to_timer_idx(power_mode);
+ if (timer_idx == BTA_DM_PM_MODE_TIMER_MAX)
+ return;
+
+ for (int i = 0; i < BTA_DM_NUM_PM_TIMER; i++)
+ {
+ if (bta_dm_cb.pm_timer[i].in_use && !bdcmp(bta_dm_cb.pm_timer[i].peer_bdaddr, peer_addr))
+ {
+ bta_sys_stop_timer(&bta_dm_cb.pm_timer[i].timer[timer_idx]);
+
+ if (bta_dm_cb.pm_timer[i].srvc_id[timer_idx] != BTA_ID_MAX)
+ {
+ bta_dm_cb.pm_timer[i].srvc_id[timer_idx] = BTA_ID_MAX;
+ bta_dm_cb.pm_timer[i].pm_action[timer_idx] = power_mode;
+ bta_dm_cb.pm_timer[i].active--;
+
+ if (bta_dm_cb.pm_timer[i].active == 0)
+ bta_dm_cb.pm_timer[i].in_use = FALSE;
+ }
+ break;
+ }
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_dm_pm_stop_timer_by_srvc_id
+**
+** Description stop all timer started by the service ID.
+**
+**
+** Returns index of the power mode delay timer
+**
+*******************************************************************************/
+static void bta_dm_pm_stop_timer_by_srvc_id(BD_ADDR peer_addr, UINT8 srvc_id)
+{
+ for (int i = 0; i < BTA_DM_NUM_PM_TIMER; i++)
+ {
+ if (bta_dm_cb.pm_timer[i].in_use && !bdcmp(bta_dm_cb.pm_timer[i].peer_bdaddr, peer_addr))
+ {
+ for (int j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++)
+ {
+ if (bta_dm_cb.pm_timer[i].srvc_id[j] == srvc_id)
+ {
+ bta_sys_stop_timer(&bta_dm_cb.pm_timer[i].timer[j]);
+ bta_dm_cb.pm_timer[i].active--;
+ bta_dm_cb.pm_timer[i].pm_action[j] = BTA_DM_PM_NO_ACTION;
+ bta_dm_cb.pm_timer[i].srvc_id[j] = BTA_ID_MAX;
+
+ if (bta_dm_cb.pm_timer[i].active == 0)
+ bta_dm_cb.pm_timer[i].in_use = FALSE;
+ break;
+ }
+ }
+ }
}
}
/*******************************************************************************
**
+** Function bta_dm_pm_start_timer
+**
+** Description start a PM timer
+**
+**
+** Returns void
+**
+*******************************************************************************/
+static void bta_dm_pm_start_timer(tBTA_PM_TIMER *p_timer, UINT8 timer_idx,
+ INT32 timeout, UINT8 srvc_id, UINT8 pm_action)
+{
+ p_timer->in_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; i<BTA_DM_NUM_PM_TIMER; i++)
{
-
- if(!bta_dm_cb.pm_timer[i].in_use)
+ if(bta_dm_cb.pm_timer[i].in_use && bdcmp(bta_dm_cb.pm_timer[i].peer_bdaddr, peer_addr) == 0)
{
- bta_dm_cb.pm_timer[i].in_use = TRUE;
- bdcpy(bta_dm_cb.pm_timer[i].peer_bdaddr, peer_addr);
- bta_dm_cb.pm_timer[i].timer.p_cback = bta_dm_pm_timer_cback;
- bta_sys_start_timer(&bta_dm_cb.pm_timer[i].timer, 0, timeout);
- APPL_TRACE_DEBUG("start dm_pm_timer:%d, %d", i, timeout);
- return;
-
+ if ((timer_idx = bta_pm_action_to_timer_idx(pm_action)) != BTA_DM_PM_MODE_TIMER_MAX)
+ {
+ remaining_ticks = bta_dm_pm_get_remaining_ticks(&bta_dm_cb.pm_timer[i].timer[timer_idx]);
+ if (remaining_ticks < timeout)
+ {
+ bta_sys_stop_timer(&bta_dm_cb.pm_timer[i].timer[timer_idx]);
+ bta_dm_pm_start_timer(&bta_dm_cb.pm_timer[i], timer_idx, timeout, p_srvcs->id, 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; i<BTA_DM_NUM_PM_TIMER; i++)
+ for (i=0; i<BTA_DM_NUM_PM_TIMER; i++)
{
-
- if(bta_dm_cb.pm_timer[i].in_use)
+ APPL_TRACE_DEBUG("dm_pm_timer[%d] in use? %d", i, bta_dm_cb.pm_timer[i].in_use);
+ if (bta_dm_cb.pm_timer[i].in_use)
{
-
- if(&bta_dm_cb.pm_timer[i].timer == (TIMER_LIST_ENT*) p_tle)
+ for (j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++)
{
- APPL_TRACE_WARNING("dm_pm_timer expires %d", i);
+ if(&bta_dm_cb.pm_timer[i].timer[j] == (TIMER_LIST_ENT*) p_tle)
+ {
+ bta_dm_cb.pm_timer[i].active --;
+ bta_dm_cb.pm_timer[i].srvc_id[j] = BTA_ID_MAX;
+ APPL_TRACE_DEBUG("dm_pm_timer[%d] expires, timer_idx=%d", i, j);
+ break;
+ }
+ }
+ if (bta_dm_cb.pm_timer[i].active == 0)
bta_dm_cb.pm_timer[i].in_use = FALSE;
+ if (j < BTA_DM_PM_MODE_TIMER_MAX)
break;
- }
-
}
-
}
-
/* no more timers */
- if(i==BTA_DM_NUM_PM_TIMER)
- {
+ if (i==BTA_DM_NUM_PM_TIMER)
return;
- }
- if ((p_buf = (tBTA_DM_PM_TIMER *) GKI_getbuf(sizeof(tBTA_DM_PM_TIMER))) != NULL)
+ tBTA_DM_PM_TIMER *p_buf = (tBTA_DM_PM_TIMER *) GKI_getbuf(sizeof(tBTA_DM_PM_TIMER));
+ if (p_buf != NULL)
{
p_buf->hdr.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; i<bta_dm_cb.device_list.count; i++)
+ for (int i=0; i<bta_dm_cb.device_list.count; i++)
{
if(!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, peer_addr))
{
@@ -952,7 +1133,8 @@ static void bta_dm_pm_hid_check(BOOLEAN bScoActive)
/* if we had disabled link policy, seems like the hid device stop retrying SNIFF after a few tries. force sniff if needed */
if (!bScoActive)
- bta_dm_pm_set_mode(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr, FALSE);
+ bta_dm_pm_set_mode(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr, BTA_DM_PM_NO_ACTION,
+ BTA_DM_PM_RESTART);
}
}
diff --git a/bta/include/bta_api.h b/bta/include/bta_api.h
index 4bc4d7567..5d71b412c 100644
--- a/bta/include/bta_api.h
+++ b/bta/include/bta_api.h
@@ -176,8 +176,10 @@ typedef struct
typedef UINT16 tBTA_SEC;
/* Ignore for Discoverable, Connectable, Pairable and Connectable Paired only device modes */
+#define BTA_DM_IGNORE 0x00FF
-#define BTA_DM_IGNORE 0xFF
+/* Ignore for Discoverable, Connectable only for LE modes */
+#define BTA_DM_LE_IGNORE 0xFF00
#define BTA_ALL_APP_ID 0xFF
@@ -1188,9 +1190,10 @@ typedef UINT16 tBTA_DM_LP_MASK;
#define BTA_DM_PM_SNIFF_USER1 0x29 /* prefers user-defined sniff1 mode (testtool only) */
#define BTA_DM_PM_ACTIVE 0x40 /* prefers active mode */
#define BTA_DM_PM_RETRY 0x80 /* retry power mode based on current settings */
+#define BTA_DM_PM_SUSPEND 0x04 /* prefers suspend mode */
#define BTA_DM_PM_NO_PREF 0x01 /* service has no prefernce on power mode setting. eg. connection to service got closed */
-typedef UINT8 tBTA_DM_PM_ACTTION;
+typedef UINT8 tBTA_DM_PM_ACTION;
/* index to bta_dm_ssr_spec */
#define BTA_DM_PM_SSR0 0
diff --git a/bta/sys/bta_sys.h b/bta/sys/bta_sys.h
index 4146f9830..8eacd3a9c 100644
--- a/bta/sys/bta_sys.h
+++ b/bta/sys/bta_sys.h
@@ -230,6 +230,7 @@ extern void bta_sys_sendmsg(void *p_msg);
extern void bta_sys_start_timer(TIMER_LIST_ENT *p_tle, UINT16 type, INT32 timeout_ms);
extern void bta_sys_stop_timer(TIMER_LIST_ENT *p_tle);
extern void bta_sys_disable(tBTA_SYS_HW_MODULE module);
+extern UINT32 bta_sys_get_remaining_ticks(TIMER_LIST_ENT *p_target_tle);
extern void bta_sys_hw_register( tBTA_SYS_HW_MODULE module, tBTA_SYS_HW_CBACK *cback);
extern void bta_sys_hw_unregister( tBTA_SYS_HW_MODULE module );
diff --git a/bta/sys/bta_sys_main.c b/bta/sys/bta_sys_main.c
index b03c2d115..d2940ed2b 100644
--- a/bta/sys/bta_sys_main.c
+++ b/bta/sys/bta_sys_main.c
@@ -638,6 +638,25 @@ void bta_sys_start_timer(TIMER_LIST_ENT *p_tle, UINT16 type, INT32 timeout_ms) {
alarm_set(alarm, (period_ms_t)timeout_ms, bta_alarm_cb, p_tle);
}
+bool hash_iter_ro_cb(hash_map_entry_t *hash_map_entry, void *context)
+{
+ alarm_t *alarm = (alarm_t *)hash_map_entry->data;
+ 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