summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSatya Calloji <satyac@broadcom.com>2014-10-06 01:42:34 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-10-06 01:42:34 +0000
commit87b9ca2209c0ee8a9b436e20dfd147115783c05e (patch)
tree5c637807d926da82bdaea1345fbf64a090712f9e
parentbf1b35201c1f60cebea6c0fc496b91a18ec3b280 (diff)
parentd5aa24750c2202ce944560c2c27ead0214e8350d (diff)
downloadbluedroid-87b9ca2209c0ee8a9b436e20dfd147115783c05e.tar.gz
am d5aa2475: LE: Peer device\'s latest RPA is not being applied
* commit 'd5aa24750c2202ce944560c2c27ead0214e8350d': LE: Peer device's latest RPA is not being applied
-rw-r--r--btif/src/btif_core.c10
-rw-r--r--stack/btm/btm_ble.c2
-rw-r--r--stack/btm/btm_ble_gap.c13
-rw-r--r--stack/l2cap/l2c_ble.c13
-rw-r--r--vnd/ble/vendor_ble.c48
5 files changed, 55 insertions, 31 deletions
diff --git a/btif/src/btif_core.c b/btif/src/btif_core.c
index 4f7e908..8964f5c 100644
--- a/btif/src/btif_core.c
+++ b/btif/src/btif_core.c
@@ -678,10 +678,6 @@ bt_status_t btif_disable_bluetooth(void)
btif_config_flush();
-#if (BLE_INCLUDED == TRUE)
- BTA_VendorCleanup();
-#endif
-
if (status != BTA_SUCCESS)
{
BTIF_TRACE_ERROR("disable bt failed (%d)", status);
@@ -714,7 +710,11 @@ void btif_disable_bluetooth_evt(void)
bte_main_enable_lpm(FALSE);
#endif
- bte_main_disable();
+#if (BLE_INCLUDED == TRUE)
+ BTA_VendorCleanup();
+#endif
+
+ bte_main_disable();
/* update local state */
btif_core_state = BTIF_CORE_STATE_DISABLED;
diff --git a/stack/btm/btm_ble.c b/stack/btm/btm_ble.c
index a40fc9e..9b8a7bb 100644
--- a/stack/btm/btm_ble.c
+++ b/stack/btm/btm_ble.c
@@ -1660,7 +1660,7 @@ void btm_ble_conn_complete(UINT8 *p, UINT16 evt_len)
/* possiblly receive connection complete with resolvable random on
slave role while the device has been paired */
- if (!match && role == HCI_ROLE_SLAVE && BTM_BLE_IS_RESOLVE_BDA(bda))
+ if (!match && /*role == HCI_ROLE_SLAVE && */BTM_BLE_IS_RESOLVE_BDA(bda))
{
btm_ble_resolve_random_addr(bda, btm_ble_resolve_random_addr_on_conn_cmpl, p_data);
}
diff --git a/stack/btm/btm_ble_gap.c b/stack/btm/btm_ble_gap.c
index 23a8745..a51b569 100644
--- a/stack/btm/btm_ble_gap.c
+++ b/stack/btm/btm_ble_gap.c
@@ -466,6 +466,10 @@ static void btm_ble_vendor_capability_vsc_cmpl_cback (tBTM_VSC_CMPL *p_vcs_cplt_
if (btm_cb.cmn_ble_vsc_cb.max_filter > 0)
{
btm_ble_adv_filter_init();
+ }
+
+ if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz > 0)
+ {
btm_ble_vendor_init(btm_cb.cmn_ble_vsc_cb.max_irk_list_sz);
}
@@ -1714,8 +1718,7 @@ tBTM_STATUS btm_ble_start_inquiry (UINT8 mode, UINT8 duration)
#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
/* enable IRK list */
- if (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE)
- btm_ble_vendor_irk_list_known_dev (TRUE);
+ btm_ble_vendor_irk_list_known_dev (TRUE);
#endif
status = btm_ble_start_scan(BTM_BLE_DUPLICATE_DISABLE);
}
@@ -3039,12 +3042,6 @@ void btm_ble_write_adv_enable_complete(UINT8 * p)
/* toggle back the adv mode */
p_cb->adv_mode = !p_cb->adv_mode;
}
-
-#if (BLE_PRIVACY_SPT == TRUE)
- if ((p_cb->adv_mode == BTM_BLE_ADV_DISABLE) &&
- (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE))
- btm_ble_vendor_disable_irk_list();
-#endif
}
/*******************************************************************************
diff --git a/stack/l2cap/l2c_ble.c b/stack/l2cap/l2c_ble.c
index 2b933e8..1bafe67 100644
--- a/stack/l2cap/l2c_ble.c
+++ b/stack/l2cap/l2c_ble.c
@@ -648,9 +648,14 @@ BOOLEAN l2cble_init_direct_conn (tL2C_LCB *p_lcb)
memcpy(init_addr, p_lcb->remote_bd_addr, BD_ADDR_LEN);
#if BLE_PRIVACY_SPT == TRUE
- if (p_dev_rec->ble.active_addr_type == BTM_BLE_ADDR_RRA)
+ /* if RPA offloading supported */
+ if (btm_ble_vendor_irk_list_load_dev(p_dev_rec))
+ btm_random_pseudo_to_public(init_addr, &init_addr_type);
+ /* otherwise, if remote is RPA enabled, use latest RPA */
+ else if (p_dev_rec->ble.active_addr_type == BTM_BLE_ADDR_RRA)
{
init_addr_type = BLE_ADDR_RANDOM;
+ memcpy(init_addr, p_dev_rec->ble.cur_rand_addr, BD_ADDR_LEN);
}
/* if privacy is on and current do not consider using reconnection address */
if (btm_cb.ble_ctr_cb.privacy ) /* && p_dev_rec->ble.use_reconn_addr */
@@ -663,12 +668,6 @@ BOOLEAN l2cble_init_direct_conn (tL2C_LCB *p_lcb)
L2CAP_TRACE_ERROR("initate direct connection fail, topology limitation");
return FALSE;
}
- if (btm_ble_vendor_irk_list_load_dev(p_dev_rec) &&
- (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE ))
- {
- btm_ble_vendor_enable_irk_feature(TRUE);
- btm_random_pseudo_to_public(init_addr, &init_addr_type);
- }
if (!btsnd_hcic_ble_create_ll_conn (scan_int,/* UINT16 scan_int */
scan_win, /* UINT16 scan_win */
diff --git a/vnd/ble/vendor_ble.c b/vnd/ble/vendor_ble.c
index be436a7..61d6780 100644
--- a/vnd/ble/vendor_ble.c
+++ b/vnd/ble/vendor_ble.c
@@ -68,7 +68,7 @@ void btm_ble_vendor_enq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_bda, UINT
p_q->irk_q_action[p_q->q_next] = to_add;
p_q->q_next ++;
- p_q->q_next %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz;;
+ p_q->q_next %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz;
#endif
return ;
}
@@ -389,6 +389,9 @@ tBTM_STATUS btm_ble_remove_irk_entry(tBTM_SEC_DEV_REC *p_dev_rec)
tBTM_STATUS st;
tBTM_BLE_VENDOR_CB *p_cb = &btm_ble_vendor_cb;
+ if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+ return BTM_MODE_UNSUPPORTED;
+
p = param;
memset(param, 0, 20);
@@ -427,6 +430,9 @@ tBTM_STATUS btm_ble_vendor_clear_irk_list(void)
UINT8 param[20], *p;
tBTM_STATUS st;
+ if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+ return BTM_MODE_UNSUPPORTED;
+
p = param;
memset(param, 0, 20);
@@ -457,9 +463,12 @@ tBTM_STATUS btm_ble_read_irk_entry(BD_ADDR target_bda)
#if BLE_PRIVACY_SPT == TRUE
UINT8 param[20], *p;
tBTM_STATUS st = BTM_UNKNOWN_ADDR;
- tBTM_BLE_IRK_ENTRY *p_entry = btm_ble_vendor_find_irk_entry(target_bda);
+ tBTM_BLE_IRK_ENTRY *p_entry;
- if (p_entry == NULL)
+ if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+ return BTM_MODE_UNSUPPORTED;
+
+ if ((p_entry = btm_ble_vendor_find_irk_entry(target_bda)) == NULL)
return st;
p = param;
@@ -498,6 +507,9 @@ void btm_ble_vendor_irk_list_known_dev(BOOLEAN enable)
UINT8 count = 0;
tBTM_SEC_DEV_REC *p_dev_rec = &btm_cb.sec_dev_rec[0];
+ if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+ return;
+
/* add all known device with random address into IRK list */
for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i ++, p_dev_rec ++)
{
@@ -534,6 +546,9 @@ BOOLEAN btm_ble_vendor_irk_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec)
BTM_TRACE_DEBUG ("btm_ble_vendor_irk_list_load_dev:max_irk_size=%d", p_cb->irk_avail_size);
memset(param, 0, 40);
+ if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+ return FALSE;
+
if (p_dev_rec != NULL && /* RPA is being used and PID is known */
(p_dev_rec->ble.key_type & BTM_LE_KEY_PID) != 0)
{
@@ -560,6 +575,8 @@ BOOLEAN btm_ble_vendor_irk_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec)
btm_ble_vendor_enq_irk_pending(p_dev_rec->ble.static_addr, p_dev_rec->bd_addr, TRUE);
p_cb->irk_list_size ++;
rt = TRUE;
+
+ btm_ble_vendor_enable_irk_feature(TRUE);
}
}
}
@@ -594,6 +611,9 @@ void btm_ble_vendor_irk_list_remove_dev(tBTM_SEC_DEV_REC *p_dev_rec)
tBTM_BLE_VENDOR_CB *p_cs_cb = &btm_ble_vendor_cb;
tBTM_BLE_IRK_ENTRY *p_irk_entry;
+ if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+ return;
+
if ((p_irk_entry = btm_ble_vendor_find_irk_entry_by_psuedo_addr(p_dev_rec->bd_addr)) != NULL &&
btm_ble_vendor_find_irk_pending_entry(p_dev_rec->bd_addr, FALSE) == FALSE)
{
@@ -645,15 +665,23 @@ tBTM_STATUS btm_ble_vendor_enable_irk_feature(BOOLEAN enable)
tBTM_STATUS st = BTM_WRONG_MODE;
tBTM_BLE_PF_COUNT *p_bda_filter;
- p = param;
- memset(param, 0, 20);
+ if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
+ return BTM_MODE_UNSUPPORTED;
- /* select feature based on control block settings */
- UINT8_TO_STREAM(p, BTM_BLE_META_IRK_ENABLE);
- UINT8_TO_STREAM(p, enable ? 0x01 : 0x00);
+ if (btm_ble_vendor_cb.enable != enable)
+ {
+ p = param;
+ memset(param, 0, 20);
- st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC, BTM_BLE_IRK_ENABLE_LEN,
- param, btm_ble_vendor_irk_vsc_op_cmpl);
+ /* select feature based on control block settings */
+ UINT8_TO_STREAM(p, BTM_BLE_META_IRK_ENABLE);
+ UINT8_TO_STREAM(p, enable ? 0x01 : 0x00);
+
+ st = BTM_VendorSpecificCommand (HCI_VENDOR_BLE_RPA_VSC, BTM_BLE_IRK_ENABLE_LEN,
+ param, btm_ble_vendor_irk_vsc_op_cmpl);
+
+ btm_ble_vendor_cb.enable = enable;
+ }
return st;
#endif