From 06d4a42ac29e2cee4563a3f22969041a788f4fad Mon Sep 17 00:00:00 2001 From: Chao Quan Date: Fri, 11 Aug 2017 11:30:59 +0800 Subject: [PATCH] Refactor btm_ble_resolving_list_load_dev Test: compilation Change-Id: I69fd4d9df63801bcc8b529d95bee74fd06c86249 --- stack/btm/btm_ble_privacy.cc | 145 ++++++++++++++++++++++--------------------- 1 file changed, 75 insertions(+), 70 deletions(-) diff --git a/stack/btm/btm_ble_privacy.cc b/stack/btm/btm_ble_privacy.cc index eed370a4b..ee98a8c6f 100644 --- a/stack/btm/btm_ble_privacy.cc +++ b/stack/btm/btm_ble_privacy.cc @@ -681,85 +681,90 @@ bool btm_ble_disable_resolving_list(uint8_t rl_mask, bool to_resume) { * ******************************************************************************/ bool btm_ble_resolving_list_load_dev(tBTM_SEC_DEV_REC* p_dev_rec) { - bool rt = false; - uint8_t rl_mask = btm_cb.ble_ctr_cb.rl_state; - - BTM_TRACE_DEBUG("%s btm_cb.ble_ctr_cb.privacy_mode = %d", __func__, - btm_cb.ble_ctr_cb.privacy_mode); + const uint8_t rl_state = btm_cb.ble_ctr_cb.rl_state; - /* if controller does not support RPA offloading or privacy 1.2, skip */ - if (controller_get_interface()->get_ble_resolving_list_max_size() == 0) + if (controller_get_interface()->get_ble_resolving_list_max_size() == 0) { + BTM_TRACE_DEBUG( + "%s: Controller does not support RPA offloading or privacy 1.2", + __func__); return false; + } - BTM_TRACE_DEBUG("%s btm_cb.ble_ctr_cb.privacy_mode = %d", __func__, + BTM_TRACE_DEBUG("%s: btm_cb.ble_ctr_cb.privacy_mode = %d", __func__, btm_cb.ble_ctr_cb.privacy_mode); + if (!p_dev_rec) { + BTM_TRACE_DEBUG("%s: No device security record", __func__); + return false; + } + /* only add RPA enabled device into resolving list */ - if (p_dev_rec != NULL && /* RPA is being used and PID is known */ - ((p_dev_rec->ble.key_type & BTM_LE_KEY_PID) != 0 || - (p_dev_rec->ble.key_type & BTM_LE_KEY_LID) != 0)) { - if (!(p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) && - btm_ble_brcm_find_resolving_pending_entry( - p_dev_rec->bd_addr, BTM_BLE_META_ADD_IRK_ENTRY) == false) { - if (btm_cb.ble_ctr_cb.resolving_list_avail_size > 0) { - if (rl_mask) { - if (!btm_ble_disable_resolving_list(rl_mask, false)) return false; - } - - btm_ble_update_resolving_list(p_dev_rec->bd_addr, true); - if (controller_get_interface()->supports_ble_privacy()) { - uint8_t* peer_irk = p_dev_rec->ble.keys.irk; - uint8_t* local_irk = btm_cb.devcb.id_keys.irk; - - if (p_dev_rec->ble.static_addr.IsEmpty()) { - p_dev_rec->ble.static_addr = p_dev_rec->bd_addr; - p_dev_rec->ble.static_addr_type = p_dev_rec->ble.ble_addr_type; - } - - BTM_TRACE_DEBUG("%s:adding device to controller resolving list", - __func__); - // use identical IRK for now - btsnd_hcic_ble_add_device_resolving_list( - p_dev_rec->ble.static_addr_type, p_dev_rec->ble.static_addr, - peer_irk, local_irk); - - if (controller_get_interface()->supports_ble_set_privacy_mode()) { - BTM_TRACE_DEBUG("%s: adding device privacy mode", __func__); - btsnd_hcic_ble_set_privacy_mode(p_dev_rec->ble.static_addr_type, - p_dev_rec->ble.static_addr, 0x01); - } - } else { - uint8_t param[40] = {0}; - uint8_t* p = param; - - UINT8_TO_STREAM(p, BTM_BLE_META_ADD_IRK_ENTRY); - ARRAY_TO_STREAM(p, p_dev_rec->ble.keys.irk, BT_OCTET16_LEN); - UINT8_TO_STREAM(p, p_dev_rec->ble.static_addr_type); - BDADDR_TO_STREAM(p, p_dev_rec->ble.static_addr); - - BTM_VendorSpecificCommand(HCI_VENDOR_BLE_RPA_VSC, - BTM_BLE_META_ADD_IRK_LEN, param, - btm_ble_resolving_list_vsc_op_cmpl); - } - - rt = true; - btm_ble_enq_resolving_list_pending(p_dev_rec->bd_addr, - BTM_BLE_META_ADD_IRK_ENTRY); - - /* if resolving list has been turned on, re-enable it */ - if (rl_mask) - btm_ble_enable_resolving_list(rl_mask); - else - btm_ble_enable_resolving_list(BTM_BLE_RL_INIT); - } - } else { - BTM_TRACE_ERROR("Device already in Resolving list"); - rt = true; + if ((p_dev_rec->ble.key_type & (BTM_LE_KEY_PID | BTM_LE_KEY_LID)) == 0) { + BTM_TRACE_DEBUG("%s: Device not a RPA enabled device", __func__); + return false; + } + + if ((p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) || + btm_ble_brcm_find_resolving_pending_entry(p_dev_rec->bd_addr, + BTM_BLE_META_ADD_IRK_ENTRY)) { + BTM_TRACE_ERROR("%s: Device already in Resolving list", __func__); + return true; + } + + if (btm_cb.ble_ctr_cb.resolving_list_avail_size == 0) { + return false; + } + + if (rl_state && !btm_ble_disable_resolving_list(rl_state, false)) { + return false; + } + + btm_ble_update_resolving_list(p_dev_rec->bd_addr, true); + if (controller_get_interface()->supports_ble_privacy()) { + uint8_t* peer_irk = p_dev_rec->ble.keys.irk; + uint8_t* local_irk = btm_cb.devcb.id_keys.irk; + + if (p_dev_rec->ble.static_addr.IsEmpty()) { + p_dev_rec->ble.static_addr = p_dev_rec->bd_addr; + p_dev_rec->ble.static_addr_type = p_dev_rec->ble.ble_addr_type; + } + + BTM_TRACE_DEBUG("%s: adding device %s to controller resolving list", + __func__, p_dev_rec->ble.static_addr.ToString().c_str()); + + // use identical IRK for now + btsnd_hcic_ble_add_device_resolving_list(p_dev_rec->ble.static_addr_type, + p_dev_rec->ble.static_addr, + peer_irk, local_irk); + + if (controller_get_interface()->supports_ble_set_privacy_mode()) { + BTM_TRACE_DEBUG("%s: adding device privacy mode", __func__); + btsnd_hcic_ble_set_privacy_mode(p_dev_rec->ble.static_addr_type, + p_dev_rec->ble.static_addr, 0x01); } } else { - BTM_TRACE_DEBUG("Device not a RPA enabled device"); + uint8_t param[40] = {0}; + uint8_t* p = param; + + UINT8_TO_STREAM(p, BTM_BLE_META_ADD_IRK_ENTRY); + ARRAY_TO_STREAM(p, p_dev_rec->ble.keys.irk, BT_OCTET16_LEN); + UINT8_TO_STREAM(p, p_dev_rec->ble.static_addr_type); + BDADDR_TO_STREAM(p, p_dev_rec->ble.static_addr); + + BTM_VendorSpecificCommand(HCI_VENDOR_BLE_RPA_VSC, BTM_BLE_META_ADD_IRK_LEN, + param, btm_ble_resolving_list_vsc_op_cmpl); } - return rt; + + btm_ble_enq_resolving_list_pending(p_dev_rec->bd_addr, + BTM_BLE_META_ADD_IRK_ENTRY); + + /* if resolving list has been turned on, re-enable it */ + if (rl_state) + btm_ble_enable_resolving_list(rl_state); + else + btm_ble_enable_resolving_list(BTM_BLE_RL_INIT); + + return true; } /******************************************************************************* -- 2.11.0