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

Commit a451e1c6 authored by Zhihai Xu's avatar Zhihai Xu Committed by Android (Google) Code Review
Browse files

Merge "BLE stack doesn't handle multiple l2cap_conn_update requests"

parents 9f912008 d53094d9
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -2266,7 +2266,16 @@ static void btu_ble_ll_conn_complete_evt ( UINT8 *p, UINT16 evt_len)

static void btu_ble_ll_conn_param_upd_evt (UINT8 *p, UINT16 evt_len)
{
/* This is empty until an upper layer cares about returning event */
    /* LE connection update has completed successfully as a master. */
    /* We can enable the update request if the result is a success. */
    /* extract the HCI handle first */
    UINT8   status;
    UINT16  handle;
    BT_TRACE_0(TRACE_LAYER_HCI, TRACE_TYPE_EVENT, "btu_ble_ll_conn_param_upd_evt");

    STREAM_TO_UINT8  (status, p);
    STREAM_TO_UINT16 (handle, p);
    L2CA_HandleConnUpdateEvent(handle, status);
}

static void btu_ble_read_remote_feat_evt (UINT8 *p, UINT16 evt_len)
+12 −0
Original line number Diff line number Diff line
@@ -1144,6 +1144,18 @@ L2C_API extern BOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bdRa, UINT16 min_in
*******************************************************************************/
L2C_API extern BOOLEAN L2CA_EnableUpdateBleConnParams (BD_ADDR rem_bda, BOOLEAN enable);

/*******************************************************************************
**
** Function         L2CA_HandleConnUpdateEvent
**
** Description      This function enables the connection update request from remote
**                  after a successful connection update response is received.
**
** Returns          void
**
*******************************************************************************/
L2C_API void L2CA_HandleConnUpdateEvent (UINT16 handle, UINT8 status);

/*******************************************************************************
**
** Function         L2CA_GetBleConnRole
+103 −44
Original line number Diff line number Diff line
@@ -81,6 +81,56 @@ BOOLEAN L2CA_CancelBleConnectReq (BD_ADDR rem_bda)
        return(FALSE);
}

/*******************************************************************************
**
**  Function        L2CA_InternalBleConnUpdate
**
**  Description     update BLE connection based on status
**
**  Parameters:     lcb
**
**  Return value:   none
**
*******************************************************************************/
static void L2CA_InternalBleConnUpdate (tL2C_LCB *p_lcb)
{
    if (p_lcb->upd_status & L2C_BLE_UPDATE_PENDING) return;

    if (p_lcb->upd_status & L2C_BLE_CONN_UPDATE_DISABLE)
    {
        /* application requests to disable parameters update.
           If parameters are already updated, lets set them
           up to what has been requested during connection establishement */
        if (p_lcb->upd_status & L2C_BLE_NOT_DEFAULT_PARAM)
        {
            tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev(p_lcb->remote_bd_addr);

            btsnd_hcic_ble_upd_ll_conn_params(p_lcb->handle,
                (UINT16)((p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
                         p_dev_rec->conn_params.min_conn_int : BTM_BLE_CONN_INT_MIN_DEF),
                (UINT16)((p_dev_rec->conn_params.max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
                         p_dev_rec->conn_params.max_conn_int : BTM_BLE_CONN_INT_MAX_DEF),
                (UINT16)((p_dev_rec->conn_params.slave_latency != BTM_BLE_CONN_PARAM_UNDEF) ?
                         p_dev_rec->conn_params.slave_latency : BTM_BLE_CONN_SLAVE_LATENCY_DEF),
                (UINT16)((p_dev_rec->conn_params.supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) ?
                         p_dev_rec->conn_params.supervision_tout : BTM_BLE_CONN_TIMEOUT_DEF),
                0, 0);
            p_lcb->upd_status &= ~L2C_BLE_NOT_DEFAULT_PARAM;
            p_lcb->upd_status |= (L2C_BLE_UPDATE_PENDING | L2C_BLE_NEW_CONN_PARAM);
        }
    }
    else
    {
        /* application allows to do update, if we were delaying one do it now */
        if (p_lcb->upd_status & L2C_BLE_NEW_CONN_PARAM)
        {
            btsnd_hcic_ble_upd_ll_conn_params(p_lcb->handle, p_lcb->min_interval,
                p_lcb->max_interval, p_lcb->latency, p_lcb->timeout, 0, 0);
            p_lcb->upd_status &= ~L2C_BLE_NEW_CONN_PARAM;
            p_lcb->upd_status |= (L2C_BLE_UPDATE_PENDING | L2C_BLE_NOT_DEFAULT_PARAM);
        }
    }
}

/*******************************************************************************
**
@@ -116,7 +166,14 @@ BOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bda, UINT16 min_int, UINT16 max_in
    }

    if (p_lcb->link_role == HCI_ROLE_MASTER)
        btsnd_hcic_ble_upd_ll_conn_params (p_lcb->handle, min_int, max_int, latency, timeout, 0, 0);
    {
        p_lcb->min_interval = min_int;
        p_lcb->max_interval = max_int;
        p_lcb->latency = latency;
        p_lcb->timeout = timeout;
        p_lcb->upd_status |= L2C_BLE_NEW_CONN_PARAM;
        L2CA_InternalBleConnUpdate(p_lcb);
    }
    else
        l2cu_send_peer_ble_par_req (p_lcb, min_int, max_int, latency, timeout);

@@ -150,8 +207,9 @@ BOOLEAN L2CA_EnableUpdateBleConnParams (BD_ADDR rem_bda, BOOLEAN enable)
        return (FALSE);
    }

    L2CAP_TRACE_API4 ("L2CA_EnableUpdateBleConnParams - BD_ADDR %08x%04x enable %d current upd state %d",
        (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5], enable, p_lcb->upd_disabled);
    L2CAP_TRACE_API4 ("L2CA_EnableUpdateBleConnParams - BD_ADDR %08x%04x enable %d upd state %d",
        (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5],
        enable, p_lcb->upd_status);

    if (!p_lcb->is_ble_link || (p_lcb->link_role != HCI_ROLE_MASTER))
    {
@@ -162,42 +220,52 @@ BOOLEAN L2CA_EnableUpdateBleConnParams (BD_ADDR rem_bda, BOOLEAN enable)

    if (enable)
    {
        /* application allows to do update, if we were delaying one do it now, otherwise
        just mark lcb that updates are enabled */
        if (p_lcb->upd_disabled == UPD_PENDING)
        {
            btsnd_hcic_ble_upd_ll_conn_params (p_lcb->handle, p_lcb->min_interval, p_lcb->max_interval,
                                               p_lcb->latency, p_lcb->timeout, 0, 0);
            p_lcb->upd_disabled = UPD_UPDATED;
        p_lcb->upd_status &= ~L2C_BLE_CONN_UPDATE_DISABLE;
    }
    else
    {
            p_lcb->upd_disabled = UPD_ENABLED;
        p_lcb->upd_status |= L2C_BLE_CONN_UPDATE_DISABLE;
    }

    L2CA_InternalBleConnUpdate(p_lcb);

    return (TRUE);
}
    else
    {
        /* application requests to disable parameters update.  If parameters are already updated, lets set them
        up to what has been requested during connection establishement */
        if (p_lcb->upd_disabled == UPD_UPDATED)

/*******************************************************************************
**
** Function         L2CA_HandleConnUpdateEvent
**
** Description      This function enables the connection update request from remote
**                  after a successful connection update response is received.
**
** Returns          void
**
*******************************************************************************/
void L2CA_HandleConnUpdateEvent (UINT16 handle, UINT8 status)
{
            tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_or_alloc_dev (rem_bda);
    tL2C_LCB *p_lcb;

            btsnd_hcic_ble_upd_ll_conn_params (p_lcb->handle,
                (UINT16)((p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ? p_dev_rec->conn_params.min_conn_int : BTM_BLE_CONN_INT_MIN_DEF),
                (UINT16)((p_dev_rec->conn_params.max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ? p_dev_rec->conn_params.max_conn_int : BTM_BLE_CONN_INT_MAX_DEF),
                (UINT16)((p_dev_rec->conn_params.slave_latency != BTM_BLE_CONN_PARAM_UNDEF) ? p_dev_rec->conn_params.slave_latency : BTM_BLE_CONN_SLAVE_LATENCY_DEF),
                (UINT16) ((p_dev_rec->conn_params.supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) ? p_dev_rec->conn_params.supervision_tout : BTM_BLE_CONN_TIMEOUT_DEF),
                0, 0);
        }
    L2CAP_TRACE_DEBUG0("L2CA_HandleConnUpdateEvent");

        if (p_lcb->upd_disabled != UPD_PENDING)
    /* See if we have a link control block for the remote device */
    p_lcb = l2cu_find_lcb_by_handle(handle);
    if (!p_lcb)
    {
            p_lcb->upd_disabled = UPD_DISABLED;
        L2CAP_TRACE_WARNING1("L2CA_EnableUpdateBleConnParams: Invalid handle: %d", handle);
        return;
    }

    p_lcb->upd_status &= ~L2C_BLE_UPDATE_PENDING;

    if (status != HCI_SUCCESS)
    {
        L2CAP_TRACE_WARNING1("L2CA_EnableUpdateBleConnParams: Error status: %d", status);
    }

    return (TRUE);
    L2CA_InternalBleConnUpdate(p_lcb);

    L2CAP_TRACE_DEBUG1("L2CA_HandleConnUpdateEvent: upd_status=%d", p_lcb->upd_status);
}

/*******************************************************************************
@@ -325,6 +393,7 @@ void l2cble_scanner_conn_comp (UINT16 handle, BD_ADDR bda, tBLE_ADDR_TYPE type,
                                           p_dev_rec->conn_params.slave_latency,
                                           p_dev_rec->conn_params.supervision_tout,
                                           0, 0);
        p_lcb->upd_status |= L2C_BLE_UPDATE_PENDING;
    }

    /* Tell BTM Acl management about the link */
@@ -491,18 +560,8 @@ void l2cble_process_sig_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len)
                    p_lcb->max_interval = max_interval;
                    p_lcb->latency = latency;
                    p_lcb->timeout = timeout;

                    if (p_lcb->upd_disabled == UPD_ENABLED)
                    {
                        btsnd_hcic_ble_upd_ll_conn_params (p_lcb->handle, min_interval, max_interval,
                                                            latency, timeout, 0, 0);
                        p_lcb->upd_disabled = UPD_UPDATED;
                    }
                    else
                    {
                        L2CAP_TRACE_EVENT0 ("L2CAP - LE - update currently disabled");
                        p_lcb->upd_disabled = UPD_PENDING;
                    }
                    p_lcb->upd_status |= L2C_BLE_NEW_CONN_PARAM;
                    L2CA_InternalBleConnUpdate(p_lcb);
                }
            }
            else
+5 −5
Original line number Diff line number Diff line
@@ -435,11 +435,11 @@ typedef struct t_l2c_linkcb
    BOOLEAN             is_ble_link;
    tBLE_ADDR_TYPE      ble_addr_type;

#define UPD_ENABLED     0  /* If peer requests update, we will change params */
#define UPD_DISABLED    1  /* application requested not to update */
#define UPD_PENDING     2  /* while updates are disabled, peer requested new parameters */
#define UPD_UPDATED     3  /* peer updated connection parameters */
    UINT8               upd_disabled;
#define L2C_BLE_CONN_UPDATE_DISABLE 0x1  /* disable update connection parameters */
#define L2C_BLE_NEW_CONN_PARAM      0x2  /* new connection parameter to be set */
#define L2C_BLE_UPDATE_PENDING      0x4  /* waiting for connection update finished */
#define L2C_BLE_NOT_DEFAULT_PARAM   0x8  /* not using default connection parameters */
    UINT8               upd_status;

    UINT16              min_interval; /* parameters as requested by peripheral */
    UINT16              max_interval;