Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cfbef47a authored by Satya Calloji's avatar Satya Calloji Committed by Andre Eisenbach
Browse files

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>
parent 23183955
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -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,6 +710,10 @@ void btif_disable_bluetooth_evt(void)
    bte_main_enable_lpm(FALSE);
#endif

#if (BLE_INCLUDED == TRUE)
     BTA_VendorCleanup();
#endif

     bte_main_disable();

    /* update local state */
+1 −1
Original line number Diff line number Diff line
@@ -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);
        }
+5 −8
Original line number Diff line number Diff line
@@ -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,7 +1718,6 @@ 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);
#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
}

/*******************************************************************************
+6 −7
Original line number Diff line number Diff line
@@ -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      */
+38 −10
Original line number Diff line number Diff line
@@ -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,6 +665,11 @@ tBTM_STATUS btm_ble_vendor_enable_irk_feature(BOOLEAN enable)
    tBTM_STATUS     st = BTM_WRONG_MODE;
    tBTM_BLE_PF_COUNT *p_bda_filter;

    if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz == 0)
        return BTM_MODE_UNSUPPORTED;

    if (btm_ble_vendor_cb.enable != enable)
    {
        p = param;
        memset(param, 0, 20);

@@ -655,6 +680,9 @@ tBTM_STATUS btm_ble_vendor_enable_irk_feature(BOOLEAN enable)
        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
    return BTM_MODE_UNSUPPORTED;