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

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

LE Privacy 1.2 and LE secure connections

Bug: 19816438
Original author: Chaojing Sun <cjsun@broadcom.com>
Change-Id: I5951f4d4e038f8348a62aa6d19b2111bae0b3ecc
parent b2337fea
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -684,7 +684,7 @@ void bta_ag_start_close(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
{
    /* Take the link out of sniff and set L2C idle time to 0 */
    bta_dm_pm_active(p_scb->peer_addr);
    L2CA_SetIdleTimeoutByBdAddr(p_scb->peer_addr, 0);
    L2CA_SetIdleTimeoutByBdAddr(p_scb->peer_addr, 0, BT_TRANSPORT_BR_EDR);

    /* if SCO is open close SCO and wait on RFCOMM close */
    if (bta_ag_sco_is_open(p_scb))
+37 −21
Original line number Diff line number Diff line
@@ -413,7 +413,8 @@ void bta_dm_disable (tBTA_DM_MSG *p_data)
    UNUSED(p_data);

    /* Set l2cap idle timeout to 0 (so BTE immediately disconnects ACL link after last channel is closed) */
    L2CA_SetIdleTimeoutByBdAddr((UINT8 *)BT_BD_ANY, 0);
    L2CA_SetIdleTimeoutByBdAddr((UINT8 *)BT_BD_ANY, 0, BT_TRANSPORT_BR_EDR);
    L2CA_SetIdleTimeoutByBdAddr((UINT8 *)BT_BD_ANY, 0, BT_TRANSPORT_LE);

    /* disable all active subsystems */
    bta_sys_disable(BTA_SYS_HW_BLUETOOTH);
@@ -4303,8 +4304,7 @@ static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_D
    tBTA_DM_SEC sec_event;
    char *p_name = NULL;
    UINT8 i;

    APPL_TRACE_DEBUG("bta_dm_ble_smp_cback");
    tBT_DEVICE_TYPE dev_type;

    if (!bta_dm_cb.p_sec_cback)
        return BTM_NOT_AUTHORIZED;
@@ -4371,31 +4371,24 @@ static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_D
            bta_dm_cb.p_sec_cback(BTA_DM_BLE_OOB_REQ_EVT, &sec_event);
            break;

        case BTM_LE_NC_REQ_EVT:
            bdcpy(sec_event.key_notif.bd_addr, bda);
            BCM_STRNCPY_S((char*)sec_event.key_notif.bd_name, sizeof(BD_NAME), bta_dm_get_remname(), (BD_NAME_LEN));
            sec_event.ble_req.bd_name[BD_NAME_LEN] = 0;
            sec_event.key_notif.passkey = p_data->key_notif;
            bta_dm_cb.p_sec_cback(BTA_DM_BLE_NC_REQ_EVT, &sec_event);
            break;

        case BTM_LE_KEY_EVT:
            bdcpy(sec_event.ble_key.bd_addr, bda);
            sec_event.ble_key.key_type = p_data->key.key_type;

            if (p_data->key.key_type == BTM_LE_KEY_PID)
            {
                for (i=0; i<BT_OCTET16_LEN; i++ )
                {
                    sec_event.ble_key.key_value.pid_key.irk[i] = p_data->key.p_key_value->pid_key.irk[i];
                }
                sec_event.ble_key.key_value.pid_key.addr_type = p_data->key.p_key_value->pid_key.addr_type;
                memcpy( &(sec_event.ble_key.key_value.pid_key.static_addr),
                        &(p_data->key.p_key_value->pid_key.static_addr),
                        sizeof (BD_ADDR));
            }
            else
            {
                memcpy(&sec_event.ble_key.key_value, p_data->key.p_key_value, sizeof(tBTM_LE_KEY_VALUE));
            }
            // memcpy(&sec_event.ble_key.key_value, p_data->key.p_key_value, sizeof(tBTM_LE_KEY_VALUE)); todo will crash
            sec_event.ble_key.p_key_value = p_data->key.p_key_value;
            bta_dm_cb.p_sec_cback(BTA_DM_BLE_KEY_EVT, &sec_event);
            break;

        case BTM_LE_COMPLT_EVT:
            bdcpy(sec_event.auth_cmpl.bd_addr, bda);
            BTM_ReadDevInfo(bda, &dev_type, &sec_event.auth_cmpl.addr_type);
            p_name = BTM_SecReadDevName(bda);
            if (p_name != NULL)
            {
@@ -4417,6 +4410,7 @@ static UINT8 bta_dm_ble_smp_cback (tBTM_LE_EVT event, BD_ADDR bda, tBTM_LE_EVT_D
                sec_event.auth_cmpl.success = TRUE;
                GATT_ConfigServiceChangeCCC(bda, TRUE, BT_TRANSPORT_LE);
            }

            if (bta_dm_cb.p_sec_cback)
            {
                //bta_dm_cb.p_sec_cback(BTA_DM_AUTH_CMPL_EVT, &sec_event);
@@ -4543,6 +4537,28 @@ void bta_dm_ble_passkey_reply (tBTA_DM_MSG *p_data)

}

/*******************************************************************************
**
** Function         bta_dm_ble_confirm_reply
**
** Description      This is response to SM numeric comparison request submitted
**                  to application.
**
** Parameters:
**
*******************************************************************************/
void bta_dm_ble_confirm_reply (tBTA_DM_MSG *p_data)
{
    if (p_data->confirm.accept)
    {
        BTM_BleConfirmReply(p_data->confirm.bd_addr, BTM_SUCCESS);
    }
    else
    {
        BTM_BleConfirmReply(p_data->ble_passkey_reply.bd_addr, BTM_NOT_AUTHORIZED);
    }
}

/*******************************************************************************
**
** Function         bta_dm_security_grant
+28 −2
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@
#include "btm_int.h"
#include <string.h>
#include "utl.h"
#include "vendor_ble.h"

/*****************************************************************************
**  Constants
@@ -791,6 +790,31 @@ void BTA_DmBlePasskeyReply(BD_ADDR bd_addr, BOOLEAN accept, UINT32 passkey)
    }
#endif
}
/*******************************************************************************
**
** Function         BTA_DmBleConfirmReply
**
** Description      Send BLE SMP SC user confirmation reply.
**
** Parameters:      bd_addr          - BD address of the peer
**                  accept           - numbers to compare are the same or different.
**
** Returns          void
**
*******************************************************************************/
void BTA_DmBleConfirmReply(BD_ADDR bd_addr, BOOLEAN accept)
{
    tBTA_DM_API_CONFIRM *p_msg = (tBTA_DM_API_CONFIRM *)GKI_getbuf(sizeof(tBTA_DM_API_CONFIRM));
    if (p_msg != NULL)
    {
        memset(p_msg, 0, sizeof(tBTA_DM_API_CONFIRM));
        p_msg->hdr.event = BTA_DM_API_BLE_CONFIRM_REPLY_EVT;
        bdcpy(p_msg->bd_addr, bd_addr);
        p_msg->accept = accept;
        bta_sys_sendmsg(p_msg);
    }
}

/*******************************************************************************
**
** Function         BTA_DmBleSecurityGrant
@@ -2004,7 +2028,9 @@ void BTA_VendorCleanup (void)
    if (cmn_ble_vsc_cb.max_filter > 0)
    {
        btm_ble_adv_filter_cleanup();
        btm_ble_vendor_cleanup();
#if BLE_PRIVACY_SPT == TRUE
        btm_ble_resolving_list_cleanup ();
#endif
    }

    if (cmn_ble_vsc_cb.tot_scan_results_strg > 0)
+2 −2
Original line number Diff line number Diff line
@@ -85,6 +85,7 @@ enum
    BTA_DM_API_ADD_BLEKEY_EVT,
    BTA_DM_API_ADD_BLEDEVICE_EVT,
    BTA_DM_API_BLE_PASSKEY_REPLY_EVT,
    BTA_DM_API_BLE_CONFIRM_REPLY_EVT,
    BTA_DM_API_BLE_SEC_GRANT_EVT,
    BTA_DM_API_BLE_SET_BG_CONN_TYPE,
    BTA_DM_API_BLE_CONN_PARAM_EVT,
@@ -1043,6 +1044,7 @@ extern void bta_dm_add_ampkey (tBTA_DM_MSG *p_data);
extern void bta_dm_add_blekey (tBTA_DM_MSG *p_data);
extern void bta_dm_add_ble_device (tBTA_DM_MSG *p_data);
extern void bta_dm_ble_passkey_reply (tBTA_DM_MSG *p_data);
extern void bta_dm_ble_confirm_reply (tBTA_DM_MSG *p_data);
extern void bta_dm_security_grant (tBTA_DM_MSG *p_data);
extern void bta_dm_ble_set_bg_conn_type (tBTA_DM_MSG *p_data);
extern void bta_dm_ble_set_conn_params (tBTA_DM_MSG *p_data);
@@ -1106,8 +1108,6 @@ extern void bta_dm_search_cancel_transac_cmpl(tBTA_DM_MSG *p_data);
extern void bta_dm_disc_rmt_name (tBTA_DM_MSG *p_data);
extern tBTA_DM_PEER_DEVICE * bta_dm_find_peer_device(BD_ADDR peer_addr);

extern void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data);

extern void bta_dm_pm_active(BD_ADDR peer_addr);

void bta_dm_eir_update_uuid(UINT16 uuid16, BOOLEAN adding);
+1 −0
Original line number Diff line number Diff line
@@ -82,6 +82,7 @@ const tBTA_DM_ACTION bta_dm_action[] =
    bta_dm_add_blekey,          /*  BTA_DM_API_ADD_BLEKEY_EVT           */
    bta_dm_add_ble_device,      /*  BTA_DM_API_ADD_BLEDEVICE_EVT        */
    bta_dm_ble_passkey_reply,   /*  BTA_DM_API_BLE_PASSKEY_REPLY_EVT    */
    bta_dm_ble_confirm_reply,   /*  BTA_DM_API_BLE_CONFIRM_REPLY_EVT    */
    bta_dm_security_grant,
    bta_dm_ble_set_bg_conn_type,
    bta_dm_ble_set_conn_params,      /* BTA_DM_API_BLE_CONN_PARAM_EVT */
Loading