summaryrefslogtreecommitdiffstats
path: root/vnd
diff options
context:
space:
mode:
authorSatya Calloji <satyac@broadcom.com>2014-09-23 18:27:09 -0700
committerAndre Eisenbach <eisenbach@google.com>2014-10-05 18:18:23 -0700
commitd5aa24750c2202ce944560c2c27ead0214e8350d (patch)
treeaa05fed27fd92fb8c14b7da7b6453ef1cf6687f8 /vnd
parent4baec1a8b7987f6d46351ea17d359e23d0e17eb2 (diff)
downloadandroid_system_bt-d5aa24750c2202ce944560c2c27ead0214e8350d.tar.gz
android_system_bt-d5aa24750c2202ce944560c2c27ead0214e8350d.tar.bz2
android_system_bt-d5aa24750c2202ce944560c2c27ead0214e8350d.zip
LE: Peer device's latest RPA is not being applied
The latest discovered address is not used when reconnecting to devices using resolvable private addresses, if RPA resolution offloadin is not supported in the controller. This patch also address the exception case where BT off is memseting all control value while the IRK list is still being cleaned up. Bug: 17187661 Change-Id: Ifeb5b8297e7eadb0e34ec1afbd41f46bdd836cf3 Author: Chaojing Sun <cjsun@broadcom.com>
Diffstat (limited to 'vnd')
-rw-r--r--vnd/ble/vendor_ble.c48
1 files changed, 38 insertions, 10 deletions
diff --git a/vnd/ble/vendor_ble.c b/vnd/ble/vendor_ble.c
index be436a777..61d678009 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