diff options
author | Satya Calloji <satyac@broadcom.com> | 2014-10-06 01:42:34 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-10-06 01:42:34 +0000 |
commit | 87b9ca2209c0ee8a9b436e20dfd147115783c05e (patch) | |
tree | 5c637807d926da82bdaea1345fbf64a090712f9e | |
parent | bf1b35201c1f60cebea6c0fc496b91a18ec3b280 (diff) | |
parent | d5aa24750c2202ce944560c2c27ead0214e8350d (diff) | |
download | bluedroid-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.c | 10 | ||||
-rw-r--r-- | stack/btm/btm_ble.c | 2 | ||||
-rw-r--r-- | stack/btm/btm_ble_gap.c | 13 | ||||
-rw-r--r-- | stack/l2cap/l2c_ble.c | 13 | ||||
-rw-r--r-- | vnd/ble/vendor_ble.c | 48 |
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 |