l2c_ble.c revision 9c07b33b335dfa3b4357f9ee293e1c1c03a7389a
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2009-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  this file contains functions relating to BLE management.
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
275cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h"
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2cdefs.h"
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_int.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE)
357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#define L2CA_GET_UPD_ST(x)          ((x) & UPD_ST_MASK)
367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#define L2CA_SET_UPD_ST(x, y)      x = (((x) & ~UPD_ST_MASK) | (y))
377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
39ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
40ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang#include "vendor_ble.h"
41ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang#endif
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        L2CA_CancelBleConnectReq
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     Cancel a pending connection attempt to a BLE device.
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Parameters:     BD Address of remote
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return value:   TRUE if connection was cancelled
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN L2CA_CancelBleConnectReq (BD_ADDR rem_bda)
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB *p_lcb;
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There can be only one BLE connection request outstanding at a time */
586975b4d711142b885af479721cada448952c6b41Andre Eisenbach    if (btm_ble_get_conn_st() == BLE_CONN_IDLE)
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CAP_TRACE_WARNING0 ("L2CA_CancelBleConnectReq - no connection pending");
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (memcmp (rem_bda, l2cb.ble_connecting_bda, BD_ADDR_LEN))
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CAP_TRACE_WARNING4 ("L2CA_CancelBleConnectReq - different  BDA Connecting: %08x%04x  Cancel: %08x%04x",
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              (l2cb.ble_connecting_bda[0]<<24)+(l2cb.ble_connecting_bda[1]<<16)+(l2cb.ble_connecting_bda[2]<<8)+l2cb.ble_connecting_bda[3],
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              (l2cb.ble_connecting_bda[4]<<8)+l2cb.ble_connecting_bda[5],
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], (rem_bda[4]<<8)+rem_bda[5]);
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btsnd_hcic_ble_create_conn_cancel())
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE)) != NULL)
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_lcb->disc_reason = L2CAP_CONN_CANCEL;
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_release_lcb (p_lcb);
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
826975b4d711142b885af479721cada448952c6b41Andre Eisenbach        /* update state to be cancel, wait for connection cancel complete */
836975b4d711142b885af479721cada448952c6b41Andre Eisenbach        btm_ble_set_conn_st (BLE_CONN_CANCEL);
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(TRUE);
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9115d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu/*******************************************************************************
9215d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu**
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        L2CA_UpdateBleConnParams
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     Update BLE connection parameters.
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Parameters:     BD Address of remote
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return value:   TRUE if update started
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bda, UINT16 min_int, UINT16 max_int,
1037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                            UINT16 latency, UINT16 timeout)
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        tL2C_LCB            *p_lcb;
1067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        tACL_CONN           *p_acl_cb = btm_bda_to_acl(rem_bda, BT_TRANSPORT_LE);
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* See if we have a link control block for the remote device */
1097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE);
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* If we don't have one, create one and accept the connection. */
1127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (!p_lcb || !p_acl_cb)
1137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
1147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            L2CAP_TRACE_WARNING2 ("L2CA_UpdateBleConnParams - unknown BD_ADDR %08x%04x",
1157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                  (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
1167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                  (rem_bda[4]<<8)+rem_bda[5]);
1177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            return(FALSE);
1187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_lcb->transport != BT_TRANSPORT_LE)
1217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
1227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            L2CAP_TRACE_WARNING2 ("L2CA_UpdateBleConnParams - BD_ADDR %08x%04x not LE",
1237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                  (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
1247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                  (rem_bda[4]<<8)+rem_bda[5]);
1257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            return(FALSE);
1267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
1277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
1287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* if both 4.1 compliant */
1297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if ((HCI_LE_CONN_PARAM_REQ_SUPPORTED(btm_cb.devcb.local_le_features) &&
1307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         HCI_LE_CONN_PARAM_REQ_SUPPORTED(p_acl_cb->peer_le_features)))
1317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
1327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /* TODO: CE length selection ?? */
1337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btsnd_hcic_ble_upd_ll_conn_params (p_lcb->handle, min_int, max_int,
1347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            latency, timeout, 0, 0);
1357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
1367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
1377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* if either side does not support Connection Parameters Request
1387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        Link Layer Control Procedure,
1397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta           use Link Layer Connection Update procedure */
1407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
1417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
1427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (p_lcb->link_role == HCI_ROLE_MASTER)
1437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                btsnd_hcic_ble_upd_ll_conn_params (p_lcb->handle, min_int, max_int,
1447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                latency, timeout, 0, 0);
1457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            else
1467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                l2cu_send_peer_ble_par_req (p_lcb, min_int, max_int, latency, timeout);
1477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
1487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        L2CA_EnableUpdateBleConnParams
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     Enable or disable update based on the request from the peer
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Parameters:     BD Address of remote
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return value:   TRUE if update started
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN L2CA_EnableUpdateBleConnParams (BD_ADDR rem_bda, BOOLEAN enable)
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB            *p_lcb;
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* See if we have a link control block for the remote device */
1697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE);
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_lcb)
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CAP_TRACE_WARNING2 ("L2CA_EnableUpdateBleConnParams - unknown BD_ADDR %08x%04x",
1747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
1757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (rem_bda[4]<<8)+rem_bda[5]);
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    L2CAP_TRACE_API5 ("%s - BD_ADDR %08x%04x enable %d current upd state 0x%02x",__FUNCTION__,
1807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
1817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (rem_bda[4]<<8)+rem_bda[5], enable, p_lcb->conn_update_mask);
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_lcb->transport != BT_TRANSPORT_LE || (p_lcb->link_role != HCI_ROLE_MASTER))
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        L2CAP_TRACE_WARNING4 ("%s - BD_ADDR %08x%04x not LE or not master %d", __FUNCTION__,
1867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                              (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
1877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                              (rem_bda[4]<<8)+rem_bda[5], p_lcb->link_role);
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (enable)
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (L2CA_GET_UPD_ST (p_lcb->conn_update_mask) == UPD_DISABLED)
1947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
1957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_lcb->conn_param_enb.param = (TIMER_PARAM_TYPE)p_lcb;
1967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btu_start_timer (&p_lcb->conn_param_enb, BTU_TTYPE_L2CAP_END_CONN_UPD,
1977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                    L2CAP_BLE_ENB_CONN_PARAM_TOUT);
1987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            L2CA_SET_UPD_ST( p_lcb->conn_update_mask, UPD_ENB_TOUT);
1997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else if (L2CA_GET_UPD_ST (p_lcb->conn_update_mask) != UPD_DISABLED)
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btu_stop_timer(&p_lcb->conn_param_enb);
20415d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu
2057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (L2CA_GET_UPD_ST(p_lcb->conn_update_mask) == UPD_ENABLED)
2067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /*
2097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            application requests to disable parameters update.If parameters are already updated,
2107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            lets set them   up to what has been requested during connection establishement
2117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            */
2127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if ((p_lcb->conn_update_mask & UPD_REQUEST) != 0)
2137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            {
2147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                /* revert back to default */
2157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                btsnd_hcic_ble_upd_ll_conn_params (p_lcb->handle,
2167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                   BTM_BLE_CONN_INT_MIN_DEF,
2177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                   BTM_BLE_CONN_INT_MAX_DEF,
2187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                   BTM_BLE_CONN_SLAVE_LATENCY_DEF,
2197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                   BTM_BLE_CONN_TIMEOUT_DEF,
2207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                   0, 0);
2217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            }
2227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
2237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        L2CA_SET_UPD_ST( p_lcb->conn_update_mask, UPD_DISABLED);
22415d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu
22515d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu    }
22615d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu
2277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return (TRUE);
22815d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         L2CA_GetBleConnRole
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function returns the connection role.
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          link role.
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 L2CA_GetBleConnRole (BD_ADDR bd_addr)
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       role = HCI_ROLE_UNKNOWN;
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB *p_lcb;
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_LE)) != NULL)
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        role = p_lcb->link_role;
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return role;
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         L2CA_GetDisconnectReason
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function returns the disconnect reason code.
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          disconnect reason
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaUINT16 L2CA_GetDisconnectReason (BD_ADDR remote_bda, tBT_TRANSPORT transport)
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB            *p_lcb;
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              reason = 0;
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((p_lcb = l2cu_find_lcb_by_bd_addr (remote_bda, transport)) != NULL)
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        reason = p_lcb->disc_reason;
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CAP_TRACE_DEBUG1 ("L2CA_GetDisconnectReason=%d ",reason);
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return reason;
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2cble_scanner_conn_comp
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when an HCI Connection Complete
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event is received while we are a scanner (so we are master).
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
284ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid l2cble_scanner_conn_comp (UINT16 handle, BD_ADDR bda, tBLE_ADDR_TYPE type,
285ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                               UINT16 conn_interval, UINT16 conn_latency, UINT16 conn_timeout)
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB            *p_lcb;
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_or_alloc_dev (bda);
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CAP_TRACE_DEBUG5 ("l2cble_scanner_conn_comp: HANDLE=%d addr_type=%d conn_interval=%d slave_latency=%d supervision_tout=%d",
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        handle,  type, conn_interval, conn_latency, conn_timeout);
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2cb.is_ble_connecting = FALSE;
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* See if we have a link control block for the remote device */
2967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE);
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we don't have one, create one. this is auto connection complete. */
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_lcb)
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_lcb = l2cu_allocate_lcb (bda, FALSE, BT_TRANSPORT_LE);
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_lcb)
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION);
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            L2CAP_TRACE_ERROR0 ("l2cble_scanner_conn_comp - failed to allocate LCB");
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!l2cu_initialize_fixed_ccb (p_lcb, L2CAP_ATT_CID, &l2cb.fixed_reg[L2CAP_ATT_CID - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION);
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                L2CAP_TRACE_WARNING0 ("l2cble_scanner_conn_comp - LCB but no CCB");
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return ;
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_lcb->link_state != LST_CONNECTING)
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CAP_TRACE_ERROR1 ("L2CAP got BLE scanner conn_comp in bad state: %d", p_lcb->link_state);
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_stop_timer(&p_lcb->timer_entry);
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save the handle */
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_lcb->handle = handle;
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Connected OK. Change state to connected, we were scanning so we are master */
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_lcb->link_state = LST_CONNECTED;
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_lcb->link_role  = HCI_ROLE_MASTER;
3317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_lcb->transport  = BT_TRANSPORT_LE;
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there are any preferred connection parameters, set them now */
334ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ( (p_dev_rec->conn_params.min_conn_int     >= BTM_BLE_CONN_INT_MIN ) &&
335ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         (p_dev_rec->conn_params.min_conn_int     <= BTM_BLE_CONN_INT_MAX ) &&
336ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         (p_dev_rec->conn_params.max_conn_int     >= BTM_BLE_CONN_INT_MIN ) &&
337ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         (p_dev_rec->conn_params.max_conn_int     <= BTM_BLE_CONN_INT_MAX ) &&
338ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         (p_dev_rec->conn_params.slave_latency    <= BTM_BLE_CONN_LATENCY_MAX ) &&
339ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         (p_dev_rec->conn_params.supervision_tout >= BTM_BLE_CONN_SUP_TOUT_MIN) &&
340ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         (p_dev_rec->conn_params.supervision_tout <= BTM_BLE_CONN_SUP_TOUT_MAX) &&
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ((conn_interval < p_dev_rec->conn_params.min_conn_int &&
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project          p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ||
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project          (conn_interval > p_dev_rec->conn_params.max_conn_int) ||
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project          (conn_latency > p_dev_rec->conn_params.slave_latency) ||
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project          (conn_timeout > p_dev_rec->conn_params.supervision_tout)))
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CAP_TRACE_ERROR5 ("upd_ll_conn_params: HANDLE=%d min_conn_int=%d max_conn_int=%d slave_latency=%d supervision_tout=%d",
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            handle, p_dev_rec->conn_params.min_conn_int, p_dev_rec->conn_params.max_conn_int,
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->conn_params.slave_latency, p_dev_rec->conn_params.supervision_tout);
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_ble_upd_ll_conn_params (handle,
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_dev_rec->conn_params.min_conn_int,
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_dev_rec->conn_params.max_conn_int,
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_dev_rec->conn_params.slave_latency,
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_dev_rec->conn_params.supervision_tout,
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           0, 0);
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Tell BTM Acl management about the link */
3607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_acl_created (bda, NULL, p_dev_rec->sec_bd_name, handle, p_lcb->link_role, BT_TRANSPORT_LE);
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_lcb->peer_chnl_mask[0] = L2CAP_FIXED_CHNL_ATT_BIT | L2CAP_FIXED_CHNL_BLE_SIG_BIT | L2CAP_FIXED_CHNL_SMP_BIT;
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2cu_process_fixed_chnl_resp (p_lcb);
3657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
3667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_ble_set_conn_st(BLE_CONN_IDLE);
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2cble_advertiser_conn_comp
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when an HCI Connection Complete
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event is received while we are an advertiser (so we are slave).
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2cble_advertiser_conn_comp (UINT16 handle, BD_ADDR bda, tBLE_ADDR_TYPE type,
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  UINT16 conn_interval, UINT16 conn_latency, UINT16 conn_timeout)
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB            *p_lcb;
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC    *p_dev_rec;
3855cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(type);
3865cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(conn_interval);
3875cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(conn_latency);
3885cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(conn_timeout);
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* See if we have a link control block for the remote device */
3917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE);
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we don't have one, create one and accept the connection. */
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_lcb)
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_lcb = l2cu_allocate_lcb (bda, FALSE, BT_TRANSPORT_LE);
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_lcb)
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION);
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            L2CAP_TRACE_ERROR0 ("l2cble_advertiser_conn_comp - failed to allocate LCB");
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!l2cu_initialize_fixed_ccb (p_lcb, L2CAP_ATT_CID, &l2cb.fixed_reg[L2CAP_ATT_CID - L2CAP_FIRST_FIXED_CHNL].fixed_chnl_opts))
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION);
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                L2CAP_TRACE_WARNING0 ("l2cble_scanner_conn_comp - LCB but no CCB");
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return ;
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save the handle */
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_lcb->handle = handle;
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Connected OK. Change state to connected, we were advertising, so we are slave */
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_lcb->link_state = LST_CONNECTED;
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_lcb->link_role  = HCI_ROLE_SLAVE;
4207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_lcb->transport  = BT_TRANSPORT_LE;
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Tell BTM Acl management about the link */
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (bda);
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_acl_created (bda, NULL, p_dev_rec->sec_bd_name, handle, p_lcb->link_role, BT_TRANSPORT_LE);
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_lcb->peer_chnl_mask[0] = L2CAP_FIXED_CHNL_ATT_BIT | L2CAP_FIXED_CHNL_BLE_SIG_BIT | L2CAP_FIXED_CHNL_SMP_BIT;
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2cu_process_fixed_chnl_resp (p_lcb);
4307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
4317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* when adv and initiating are both active, cancel the direct connection */
4327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (l2cb.is_ble_connecting && memcmp(bda, l2cb.ble_connecting_bda, BD_ADDR_LEN) == 0)
4337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
4347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        L2CA_CancelBleConnectReq(bda);
4357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2cble_conn_comp
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when an HCI Connection Complete
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event is received.
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2cble_conn_comp(UINT16 handle, UINT8 role, BD_ADDR bda, tBLE_ADDR_TYPE type,
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      UINT16 conn_interval, UINT16 conn_latency, UINT16 conn_timeout)
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (role == HCI_ROLE_MASTER)
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cble_scanner_conn_comp(handle, bda, type, conn_interval, conn_latency, conn_timeout);
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cble_advertiser_conn_comp(handle, bda, type, conn_interval, conn_latency, conn_timeout);
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2cble_process_sig_cmd
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a signalling packet is received
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  on the BLE signalling CID
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2cble_process_sig_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len)
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p_pkt_end;
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           cmd_code, id;
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          cmd_len, rej_reason;
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          result;
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          min_interval, max_interval, latency, timeout;
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_pkt_end = p + pkt_len;
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8  (cmd_code, p);
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8  (id, p);
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT16 (cmd_len, p);
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check command length does not exceed packet length */
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p + cmd_len) > p_pkt_end)
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CAP_TRACE_WARNING3 ("L2CAP - LE - format error, pkt_len: %d  cmd_len: %d  code: %d", pkt_len, cmd_len, cmd_code);
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (cmd_code)
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CAP_CMD_REJECT:
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CAP_CMD_ECHO_RSP:
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CAP_CMD_INFO_RSP:
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16 (rej_reason, p);
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CAP_CMD_ECHO_REQ:
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CAP_CMD_INFO_REQ:
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0);
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CAP_CMD_BLE_UPDATE_REQ:
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16 (min_interval, p); /* 0x0006 - 0x0C80 */
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16 (max_interval, p); /* 0x0006 - 0x0C80 */
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16 (latency, p);  /* 0x0000 - 0x03E8 */
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16 (timeout, p);  /* 0x000A - 0x0C80 */
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If we are a master, the slave wants to update the parameters */
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_lcb->link_role == HCI_ROLE_MASTER)
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
511ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (min_interval < BTM_BLE_CONN_INT_MIN || min_interval > BTM_BLE_CONN_INT_MAX ||
512ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    max_interval < BTM_BLE_CONN_INT_MIN || max_interval > BTM_BLE_CONN_INT_MAX ||
513ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    latency  > BTM_BLE_CONN_LATENCY_MAX ||
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /*(timeout >= max_interval && latency > (timeout * 10/(max_interval * 1.25) - 1)) ||*/
515ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    timeout < BTM_BLE_CONN_SUP_TOUT_MIN || timeout > BTM_BLE_CONN_SUP_TOUT_MAX ||
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    max_interval < min_interval)
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
518ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    l2cu_send_peer_ble_par_rsp (p_lcb, L2CAP_CFG_UNACCEPTABLE_PARAMS, id);
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    l2cu_send_peer_ble_par_rsp (p_lcb, L2CAP_CFG_OK, id);
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     p_lcb->min_interval = min_interval;
5267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     p_lcb->max_interval = max_interval;
5277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     p_lcb->latency = latency;
5287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     p_lcb->timeout = timeout;
5297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     p_lcb->conn_update_mask |= UPD_REQUEST;
5307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
5317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     if (L2CA_GET_UPD_ST(p_lcb->conn_update_mask) == UPD_ENABLED)
5327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     {
5337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                         btsnd_hcic_ble_upd_ll_conn_params (p_lcb->handle, min_interval, max_interval,
5347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                             latency, timeout, 0, 0);
5357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     }
5367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     else
5377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     {
5387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                         L2CAP_TRACE_EVENT0 ("L2CAP - LE - update currently disabled");
5397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     }
5407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0);
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CAP_CMD_BLE_UPDATE_RSP:
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16 (result, p);
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            L2CAP_TRACE_WARNING1 ("L2CAP - LE - unknown cmd code: %d", cmd_code);
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0);
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
5587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
5597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         l2c_enable_conn_param_timeout
5607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
5617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      This function process the connection parameter enabling timeout
5627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
5637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          None.
5647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
5657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
5667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battavoid l2c_enable_conn_param_timeout(tL2C_LCB * p_lcb)
5677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
5687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_or_alloc_dev (p_lcb->remote_bd_addr);
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* application allows to do update, if we were delaying one do it now, otherwise
5727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    just mark lcb that updates are enabled */
5737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_lcb->conn_update_mask & UPD_REQUEST)
5747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
5757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btsnd_hcic_ble_upd_ll_conn_params (p_lcb->handle, p_lcb->min_interval, p_lcb->max_interval,
5767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                           p_lcb->latency, p_lcb->timeout, 0, 0);
5777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
5787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else
5797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
5807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* if preferred number has been set, set to preferred conn parameter */
5817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_dev_rec && p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF)
5827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
5837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btsnd_hcic_ble_upd_ll_conn_params (p_lcb->handle,
5847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (UINT16)((p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
5857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                p_dev_rec->conn_params.min_conn_int : BTM_BLE_CONN_INT_MIN_DEF),
5867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (UINT16)((p_dev_rec->conn_params.max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
5877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                p_dev_rec->conn_params.max_conn_int : BTM_BLE_CONN_INT_MAX_DEF),
5887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (UINT16)((p_dev_rec->conn_params.slave_latency != BTM_BLE_CONN_PARAM_UNDEF) ?
5897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                p_dev_rec->conn_params.slave_latency : BTM_BLE_CONN_SLAVE_LATENCY_DEF),
5907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (UINT16) ((p_dev_rec->conn_params.supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) ?
5917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                p_dev_rec->conn_params.supervision_tout : BTM_BLE_CONN_TIMEOUT_DEF),
5927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                0, 0);
5937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
5947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
5957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    L2CA_SET_UPD_ST( p_lcb->conn_update_mask, UPD_ENABLED);
5967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
5977fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
600ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         l2cble_init_direct_conn
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
602ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function is to initate a direct connection
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
604ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          TRUE connection initiated, FALSE otherwise.
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
607ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN l2cble_init_direct_conn (tL2C_LCB *p_lcb)
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_or_alloc_dev (p_lcb->remote_bd_addr);
610ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_BLE_CB         *p_cb = &btm_cb.ble_ctr_cb;
611ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT16               scan_int, scan_win;
612ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BD_ADDR         init_addr;
613ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           init_addr_type = BLE_ADDR_PUBLIC,
614ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    own_addr_type = BLE_ADDR_PUBLIC;
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There can be only one BLE connection request outstanding at a time */
617ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_dev_rec == NULL)
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        L2CAP_TRACE_WARNING0 ("unknown device, can not initate connection");
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
623ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    scan_int = (p_cb->scan_int == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_FAST_INT : p_cb->scan_int;
624ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    scan_win = (p_cb->scan_win == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_FAST_WIN : p_cb->scan_win;
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
626ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    init_addr_type = p_lcb->ble_addr_type;
627ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    memcpy(init_addr, p_lcb->remote_bd_addr, BD_ADDR_LEN);
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_PRIVACY_SPT == TRUE
6308b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    if (p_dev_rec->ble.active_addr_type == BTM_BLE_ADDR_RRA)
6318b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    {
6328b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu        init_addr_type = BLE_ADDR_RANDOM;
63366988a022d219f5385b3f76e3ae26566ad80fb86Nitin Arora        //memcpy(init_addr, p_dev_rec->ble.cur_rand_addr, BD_ADDR_LEN);
6348b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    }
6357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* if privacy is on and current do not consider using reconnection address */
6367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (btm_cb.ble_ctr_cb.privacy ) /* && p_dev_rec->ble.use_reconn_addr */
6377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        own_addr_type = BLE_ADDR_RANDOM;
6388b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif
6398b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu
6407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (!btm_ble_topology_check(BTM_BLE_STATE_INIT))
6417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
6427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        l2cu_release_lcb (p_lcb);
6437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        L2CAP_TRACE_ERROR0("initate direct connection fail, topology limitation");
6447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return FALSE;
6457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
646ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang#if BLE_PRIVACY_SPT == TRUE
647845c2601ece4c2323a03c6d705cd16545f6df08aAdam Hampson#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
648ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang    extern tBTM_STATUS BTM_BleEnableIRKFeature(BOOLEAN enable);
649ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang    if (btm_ble_vendor_irk_list_load_dev(p_dev_rec))
650ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang        BTM_BleEnableIRKFeature(TRUE);
651ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang
652ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang    btm_random_pseudo_to_public(init_addr, &init_addr_type);
653ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang#endif
654ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang#endif
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!btsnd_hcic_ble_create_ll_conn (scan_int,/* UINT16 scan_int      */
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        scan_win, /* UINT16 scan_win      */
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        FALSE,                   /* UINT8 white_list     */
6586975b4d711142b885af479721cada448952c6b41Andre Eisenbach                                        init_addr_type,          /* UINT8 addr_type_peer */
6596975b4d711142b885af479721cada448952c6b41Andre Eisenbach                                        init_addr,               /* BD_ADDR bda_peer     */
6606975b4d711142b885af479721cada448952c6b41Andre Eisenbach                                        own_addr_type,         /* UINT8 addr_type_own  */
6613dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu        (UINT16) ((p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
6623dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu        p_dev_rec->conn_params.min_conn_int : BTM_BLE_CONN_INT_MIN_DEF),  /* conn_int_min  */
6633dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu        (UINT16) ((p_dev_rec->conn_params.max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
6643dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu        p_dev_rec->conn_params.max_conn_int : BTM_BLE_CONN_INT_MAX_DEF),  /* conn_int_max  */
6653dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu        (UINT16) ((p_dev_rec->conn_params.slave_latency != BTM_BLE_CONN_PARAM_UNDEF) ?
6669c07b33b335dfa3b4357f9ee293e1c1c03a7389aSteve Paik        p_dev_rec->conn_params.slave_latency : BTM_BLE_CONN_SLAVE_LATENCY_DEF), /* UINT16 conn_latency  */
6673dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu        (UINT16) ((p_dev_rec->conn_params.supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) ?
6689c07b33b335dfa3b4357f9ee293e1c1c03a7389aSteve Paik        p_dev_rec->conn_params.supervision_tout : BTM_BLE_CONN_TIMEOUT_DEF), /* conn_timeout */
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        0,                       /* UINT16 min_len       */
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        0))                      /* UINT16 max_len       */
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_lcb (p_lcb);
673ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        L2CAP_TRACE_ERROR0("initate direct connection fail, no resources");
674ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return (FALSE);
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
677ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
678ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_lcb->link_state = LST_CONNECTING;
6796975b4d711142b885af479721cada448952c6b41Andre Eisenbach        l2cb.is_ble_connecting = TRUE;
680ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        memcpy (l2cb.ble_connecting_bda, p_lcb->remote_bd_addr, BD_ADDR_LEN);
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_BLE_LINK_CONNECT_TOUT);
682ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        btm_ble_set_conn_st (BLE_DIR_CONN);
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
684ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return (TRUE);
685ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
686ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
687ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
688ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
689ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
690ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         l2cble_create_conn
691ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
692ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function initiates an acl connection via HCI
693ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
694ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          TRUE if successful, FALSE if connection not started.
695ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
696ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
697ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN l2cble_create_conn (tL2C_LCB *p_lcb)
698ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
699ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_BLE_CONN_ST     conn_st = btm_ble_get_conn_st();
700ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN         rt = FALSE;
701ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
702ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* There can be only one BLE connection request outstanding at a time */
703ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (conn_st == BLE_CONN_IDLE)
704ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
705ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        rt = l2cble_init_direct_conn(p_lcb);
706ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
707ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    else
708ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
709ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        L2CAP_TRACE_WARNING1 ("L2CAP - LE - cannot start new connection at conn st: %d", conn_st);
710ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
711ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        btm_ble_enqueue_direct_conn_req(p_lcb);
712ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
713ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (conn_st == BLE_BG_CONN)
714ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            btm_ble_suspend_bg_conn();
715ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
716ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        rt = TRUE;
717ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
718ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return rt;
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_link_processs_ble_num_bufs
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a "controller buffer size"
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event is first received from the controller. It updates
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the L2CAP values.
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2c_link_processs_ble_num_bufs (UINT16 num_lm_ble_bufs)
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7340082e027d5ae3f45a3a613ed720c31e35f61d0ebAndre Eisenbach    if (num_lm_ble_bufs == 0)
73512c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach    {
73612c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach        num_lm_ble_bufs = L2C_DEF_NUM_BLE_BUF_SHARED;
73712c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach        l2cb.num_lm_acl_bufs -= L2C_DEF_NUM_BLE_BUF_SHARED;
73812c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach    }
73912c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2cb.num_lm_ble_bufs = l2cb.controller_le_xmit_window = num_lm_ble_bufs;
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
7447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
7457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
7467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         l2cble_process_rc_param_request_evt
7477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
7487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      process LE Remote Connection Parameter Request Event.
7497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
7507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          void
7517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
7527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
7537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battavoid l2cble_process_rc_param_request_evt(UINT16 handle, UINT16 int_min, UINT16 int_max,
7547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                     UINT16 latency, UINT16 timeout)
7557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
7567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tL2C_LCB    *p_lcb = l2cu_find_lcb_by_handle (handle);
7577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
7587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_lcb != NULL)
7597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
7607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_lcb->min_interval = int_min;
7617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_lcb->max_interval = int_max;
7627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_lcb->latency = latency;
7637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_lcb->timeout = timeout;
7647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_lcb->conn_update_mask |= UPD_REQUEST;
7657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
7667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* TODO: revisit: if update is enabled, always accept connection parameter update */
7677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (L2CA_GET_UPD_ST(p_lcb->conn_update_mask) == UPD_ENABLED)
7687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
7697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btsnd_hcic_ble_rc_param_req_reply(handle, int_min, int_max, latency, timeout, 0, 0);
7707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
7717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
7727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
7737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            L2CAP_TRACE_EVENT0 ("L2CAP - LE - update currently disabled");
7747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btsnd_hcic_ble_rc_param_req_neg_reply (handle,HCI_ERR_UNACCEPT_CONN_INTERVAL);
7757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
7767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
7777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
7787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else
7797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
7807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        L2CAP_TRACE_WARNING0("No link to update connection parameter")
7817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
7827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
7837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
7847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
7857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* (BLE_INCLUDED == TRUE) */
787