l2c_ble.c revision 7fa4fba6f59f97df00aff07dbe8fb21b114b3c2c
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
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        L2CA_CancelBleConnectReq
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     Cancel a pending connection attempt to a BLE device.
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Parameters:     BD Address of remote
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return value:   TRUE if connection was cancelled
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN L2CA_CancelBleConnectReq (BD_ADDR rem_bda)
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB *p_lcb;
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There can be only one BLE connection request outstanding at a time */
556975b4d711142b885af479721cada448952c6b41Andre Eisenbach    if (btm_ble_get_conn_st() == BLE_CONN_IDLE)
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CAP_TRACE_WARNING0 ("L2CA_CancelBleConnectReq - no connection pending");
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (memcmp (rem_bda, l2cb.ble_connecting_bda, BD_ADDR_LEN))
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CAP_TRACE_WARNING4 ("L2CA_CancelBleConnectReq - different  BDA Connecting: %08x%04x  Cancel: %08x%04x",
645738f83aeb59361a0a2eda2460113f6dc919427The 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],
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              (l2cb.ble_connecting_bda[4]<<8)+l2cb.ble_connecting_bda[5],
665738f83aeb59361a0a2eda2460113f6dc919427The 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]);
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btsnd_hcic_ble_create_conn_cancel())
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE)) != NULL)
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_lcb->disc_reason = L2CAP_CONN_CANCEL;
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_release_lcb (p_lcb);
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
796975b4d711142b885af479721cada448952c6b41Andre Eisenbach        /* update state to be cancel, wait for connection cancel complete */
806975b4d711142b885af479721cada448952c6b41Andre Eisenbach        btm_ble_set_conn_st (BLE_CONN_CANCEL);
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(TRUE);
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8815d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu/*******************************************************************************
8915d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu**
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        L2CA_UpdateBleConnParams
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     Update BLE connection parameters.
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Parameters:     BD Address of remote
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return value:   TRUE if update started
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bda, UINT16 min_int, UINT16 max_int,
1007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                            UINT16 latency, UINT16 timeout)
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        tL2C_LCB            *p_lcb;
1037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        tACL_CONN           *p_acl_cb = btm_bda_to_acl(rem_bda, BT_TRANSPORT_LE);
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* See if we have a link control block for the remote device */
1067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE);
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* If we don't have one, create one and accept the connection. */
1097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (!p_lcb || !p_acl_cb)
1107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
1117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            L2CAP_TRACE_WARNING2 ("L2CA_UpdateBleConnParams - unknown BD_ADDR %08x%04x",
1127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                  (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
1137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                  (rem_bda[4]<<8)+rem_bda[5]);
1147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            return(FALSE);
1157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_lcb->transport != BT_TRANSPORT_LE)
1187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
1197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            L2CAP_TRACE_WARNING2 ("L2CA_UpdateBleConnParams - BD_ADDR %08x%04x not LE",
1207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                  (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
1217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                  (rem_bda[4]<<8)+rem_bda[5]);
1227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            return(FALSE);
1237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
1247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
1257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* if both 4.1 compliant */
1267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if ((HCI_LE_CONN_PARAM_REQ_SUPPORTED(btm_cb.devcb.local_le_features) &&
1277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta         HCI_LE_CONN_PARAM_REQ_SUPPORTED(p_acl_cb->peer_le_features)))
1287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
1297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /* TODO: CE length selection ?? */
1307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btsnd_hcic_ble_upd_ll_conn_params (p_lcb->handle, min_int, max_int,
1317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            latency, timeout, 0, 0);
1327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
1337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
1347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* if either side does not support Connection Parameters Request
1357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        Link Layer Control Procedure,
1367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta           use Link Layer Connection Update procedure */
1377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
1387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
1397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if (p_lcb->link_role == HCI_ROLE_MASTER)
1407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                btsnd_hcic_ble_upd_ll_conn_params (p_lcb->handle, min_int, max_int,
1417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                latency, timeout, 0, 0);
1427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            else
1437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                l2cu_send_peer_ble_par_req (p_lcb, min_int, max_int, latency, timeout);
1447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
1457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return(TRUE);
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Function        L2CA_EnableUpdateBleConnParams
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Description     Enable or disable update based on the request from the peer
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Parameters:     BD Address of remote
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Return value:   TRUE if update started
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN L2CA_EnableUpdateBleConnParams (BD_ADDR rem_bda, BOOLEAN enable)
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB            *p_lcb;
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* See if we have a link control block for the remote device */
1667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE);
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_lcb)
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CAP_TRACE_WARNING2 ("L2CA_EnableUpdateBleConnParams - unknown BD_ADDR %08x%04x",
1717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
1727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            (rem_bda[4]<<8)+rem_bda[5]);
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    L2CAP_TRACE_API5 ("%s - BD_ADDR %08x%04x enable %d current upd state 0x%02x",__FUNCTION__,
1777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
1787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        (rem_bda[4]<<8)+rem_bda[5], enable, p_lcb->conn_update_mask);
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_lcb->transport != BT_TRANSPORT_LE || (p_lcb->link_role != HCI_ROLE_MASTER))
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        L2CAP_TRACE_WARNING4 ("%s - BD_ADDR %08x%04x not LE or not master %d", __FUNCTION__,
1837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                              (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3],
1847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                              (rem_bda[4]<<8)+rem_bda[5], p_lcb->link_role);
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (enable)
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (L2CA_GET_UPD_ST (p_lcb->conn_update_mask) == UPD_DISABLED)
1917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
1927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_lcb->conn_param_enb.param = (TIMER_PARAM_TYPE)p_lcb;
1937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btu_start_timer (&p_lcb->conn_param_enb, BTU_TTYPE_L2CAP_END_CONN_UPD,
1947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                    L2CAP_BLE_ENB_CONN_PARAM_TOUT);
1957fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            L2CA_SET_UPD_ST( p_lcb->conn_update_mask, UPD_ENB_TOUT);
1967fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else if (L2CA_GET_UPD_ST (p_lcb->conn_update_mask) != UPD_DISABLED)
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btu_stop_timer(&p_lcb->conn_param_enb);
20115d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu
2027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (L2CA_GET_UPD_ST(p_lcb->conn_update_mask) == UPD_ENABLED)
2037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /*
2067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            application requests to disable parameters update.If parameters are already updated,
2077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            lets set them   up to what has been requested during connection establishement
2087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            */
2097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            if ((p_lcb->conn_update_mask & UPD_REQUEST) != 0)
2107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            {
2117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                /* revert back to default */
2127fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                btsnd_hcic_ble_upd_ll_conn_params (p_lcb->handle,
2137fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                   BTM_BLE_CONN_INT_MIN_DEF,
2147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                   BTM_BLE_CONN_INT_MAX_DEF,
2157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                   BTM_BLE_CONN_SLAVE_LATENCY_DEF,
2167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                   BTM_BLE_CONN_TIMEOUT_DEF,
2177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                   0, 0);
2187fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            }
2197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
2207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        L2CA_SET_UPD_ST( p_lcb->conn_update_mask, UPD_DISABLED);
22115d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu
22215d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu    }
22315d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu
2247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    return (TRUE);
22515d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         L2CA_GetBleConnRole
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function returns the connection role.
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          link role.
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 L2CA_GetBleConnRole (BD_ADDR bd_addr)
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       role = HCI_ROLE_UNKNOWN;
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB *p_lcb;
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_LE)) != NULL)
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        role = p_lcb->link_role;
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return role;
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         L2CA_GetDisconnectReason
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function returns the disconnect reason code.
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          disconnect reason
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaUINT16 L2CA_GetDisconnectReason (BD_ADDR remote_bda, tBT_TRANSPORT transport)
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB            *p_lcb;
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              reason = 0;
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if ((p_lcb = l2cu_find_lcb_by_bd_addr (remote_bda, transport)) != NULL)
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        reason = p_lcb->disc_reason;
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    L2CAP_TRACE_DEBUG1 ("L2CA_GetDisconnectReason=%d ",reason);
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return reason;
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2cble_scanner_conn_comp
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when an HCI Connection Complete
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event is received while we are a scanner (so we are master).
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
281ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid l2cble_scanner_conn_comp (UINT16 handle, BD_ADDR bda, tBLE_ADDR_TYPE type,
282ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                               UINT16 conn_interval, UINT16 conn_latency, UINT16 conn_timeout)
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB            *p_lcb;
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_or_alloc_dev (bda);
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2875738f83aeb59361a0a2eda2460113f6dc919427The 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",
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        handle,  type, conn_interval, conn_latency, conn_timeout);
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2cb.is_ble_connecting = FALSE;
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* See if we have a link control block for the remote device */
2937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE);
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we don't have one, create one. this is auto connection complete. */
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_lcb)
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_lcb = l2cu_allocate_lcb (bda, FALSE, BT_TRANSPORT_LE);
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_lcb)
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION);
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            L2CAP_TRACE_ERROR0 ("l2cble_scanner_conn_comp - failed to allocate LCB");
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3075738f83aeb59361a0a2eda2460113f6dc919427The 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))
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION);
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                L2CAP_TRACE_WARNING0 ("l2cble_scanner_conn_comp - LCB but no CCB");
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return ;
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_lcb->link_state != LST_CONNECTING)
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        L2CAP_TRACE_ERROR1 ("L2CAP got BLE scanner conn_comp in bad state: %d", p_lcb->link_state);
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_stop_timer(&p_lcb->timer_entry);
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save the handle */
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_lcb->handle = handle;
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Connected OK. Change state to connected, we were scanning so we are master */
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_lcb->link_state = LST_CONNECTED;
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_lcb->link_role  = HCI_ROLE_MASTER;
3287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_lcb->transport  = BT_TRANSPORT_LE;
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If there are any preferred connection parameters, set them now */
331ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ( (p_dev_rec->conn_params.min_conn_int     >= BTM_BLE_CONN_INT_MIN ) &&
332ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         (p_dev_rec->conn_params.min_conn_int     <= BTM_BLE_CONN_INT_MAX ) &&
333ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         (p_dev_rec->conn_params.max_conn_int     >= BTM_BLE_CONN_INT_MIN ) &&
334ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         (p_dev_rec->conn_params.max_conn_int     <= BTM_BLE_CONN_INT_MAX ) &&
335ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         (p_dev_rec->conn_params.slave_latency    <= BTM_BLE_CONN_LATENCY_MAX ) &&
336ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         (p_dev_rec->conn_params.supervision_tout >= BTM_BLE_CONN_SUP_TOUT_MIN) &&
337ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         (p_dev_rec->conn_params.supervision_tout <= BTM_BLE_CONN_SUP_TOUT_MAX) &&
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ((conn_interval < p_dev_rec->conn_params.min_conn_int &&
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project          p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ||
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project          (conn_interval > p_dev_rec->conn_params.max_conn_int) ||
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project          (conn_latency > p_dev_rec->conn_params.slave_latency) ||
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project          (conn_timeout > p_dev_rec->conn_params.supervision_tout)))
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3445738f83aeb59361a0a2eda2460113f6dc919427The 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",
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            handle, p_dev_rec->conn_params.min_conn_int, p_dev_rec->conn_params.max_conn_int,
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            p_dev_rec->conn_params.slave_latency, p_dev_rec->conn_params.supervision_tout);
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_ble_upd_ll_conn_params (handle,
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_dev_rec->conn_params.min_conn_int,
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_dev_rec->conn_params.max_conn_int,
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_dev_rec->conn_params.slave_latency,
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           p_dev_rec->conn_params.supervision_tout,
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           0, 0);
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Tell BTM Acl management about the link */
3577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_acl_created (bda, NULL, p_dev_rec->sec_bd_name, handle, p_lcb->link_role, BT_TRANSPORT_LE);
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3595738f83aeb59361a0a2eda2460113f6dc919427The 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;
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2cu_process_fixed_chnl_resp (p_lcb);
3627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
3637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_ble_set_conn_st(BLE_CONN_IDLE);
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2cble_advertiser_conn_comp
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when an HCI Connection Complete
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event is received while we are an advertiser (so we are slave).
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2cble_advertiser_conn_comp (UINT16 handle, BD_ADDR bda, tBLE_ADDR_TYPE type,
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  UINT16 conn_interval, UINT16 conn_latency, UINT16 conn_timeout)
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tL2C_LCB            *p_lcb;
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC    *p_dev_rec;
3825cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(type);
3835cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(conn_interval);
3845cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(conn_latency);
3855cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(conn_timeout);
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* See if we have a link control block for the remote device */
3887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE);
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we don't have one, create one and accept the connection. */
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_lcb)
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_lcb = l2cu_allocate_lcb (bda, FALSE, BT_TRANSPORT_LE);
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_lcb)
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION);
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            L2CAP_TRACE_ERROR0 ("l2cble_advertiser_conn_comp - failed to allocate LCB");
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4025738f83aeb59361a0a2eda2460113f6dc919427The 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))
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION);
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                L2CAP_TRACE_WARNING0 ("l2cble_scanner_conn_comp - LCB but no CCB");
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return ;
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save the handle */
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_lcb->handle = handle;
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Connected OK. Change state to connected, we were advertising, so we are slave */
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_lcb->link_state = LST_CONNECTED;
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_lcb->link_role  = HCI_ROLE_SLAVE;
4177fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    p_lcb->transport  = BT_TRANSPORT_LE;
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Tell BTM Acl management about the link */
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev_rec = btm_find_or_alloc_dev (bda);
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    btm_acl_created (bda, NULL, p_dev_rec->sec_bd_name, handle, p_lcb->link_role, BT_TRANSPORT_LE);
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4245738f83aeb59361a0a2eda2460113f6dc919427The 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;
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2cu_process_fixed_chnl_resp (p_lcb);
4277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
4287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* when adv and initiating are both active, cancel the direct connection */
4297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (l2cb.is_ble_connecting && memcmp(bda, l2cb.ble_connecting_bda, BD_ADDR_LEN) == 0)
4307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
4317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        L2CA_CancelBleConnectReq(bda);
4327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2cble_conn_comp
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when an HCI Connection Complete
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event is received.
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2cble_conn_comp(UINT16 handle, UINT8 role, BD_ADDR bda, tBLE_ADDR_TYPE type,
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      UINT16 conn_interval, UINT16 conn_latency, UINT16 conn_timeout)
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (role == HCI_ROLE_MASTER)
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cble_scanner_conn_comp(handle, bda, type, conn_interval, conn_latency, conn_timeout);
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cble_advertiser_conn_comp(handle, bda, type, conn_interval, conn_latency, conn_timeout);
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2cble_process_sig_cmd
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a signalling packet is received
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  on the BLE signalling CID
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2cble_process_sig_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len)
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           *p_pkt_end;
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8           cmd_code, id;
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          cmd_len, rej_reason;
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          result;
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16          min_interval, max_interval, latency, timeout;
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_pkt_end = p + pkt_len;
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8  (cmd_code, p);
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8  (id, p);
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT16 (cmd_len, p);
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check command length does not exceed packet length */
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p + cmd_len) > p_pkt_end)
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4845738f83aeb59361a0a2eda2460113f6dc919427The 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);
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (cmd_code)
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CAP_CMD_REJECT:
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CAP_CMD_ECHO_RSP:
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CAP_CMD_INFO_RSP:
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16 (rej_reason, p);
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CAP_CMD_ECHO_REQ:
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CAP_CMD_INFO_REQ:
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0);
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CAP_CMD_BLE_UPDATE_REQ:
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16 (min_interval, p); /* 0x0006 - 0x0C80 */
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16 (max_interval, p); /* 0x0006 - 0x0C80 */
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16 (latency, p);  /* 0x0000 - 0x03E8 */
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16 (timeout, p);  /* 0x000A - 0x0C80 */
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If we are a master, the slave wants to update the parameters */
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_lcb->link_role == HCI_ROLE_MASTER)
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
508ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (min_interval < BTM_BLE_CONN_INT_MIN || min_interval > BTM_BLE_CONN_INT_MAX ||
509ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    max_interval < BTM_BLE_CONN_INT_MIN || max_interval > BTM_BLE_CONN_INT_MAX ||
510ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    latency  > BTM_BLE_CONN_LATENCY_MAX ||
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /*(timeout >= max_interval && latency > (timeout * 10/(max_interval * 1.25) - 1)) ||*/
512ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    timeout < BTM_BLE_CONN_SUP_TOUT_MIN || timeout > BTM_BLE_CONN_SUP_TOUT_MAX ||
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    max_interval < min_interval)
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
515ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    l2cu_send_peer_ble_par_rsp (p_lcb, L2CAP_CFG_UNACCEPTABLE_PARAMS, id);
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    l2cu_send_peer_ble_par_rsp (p_lcb, L2CAP_CFG_OK, id);
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5227fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     p_lcb->min_interval = min_interval;
5237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     p_lcb->max_interval = max_interval;
5247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     p_lcb->latency = latency;
5257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     p_lcb->timeout = timeout;
5267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     p_lcb->conn_update_mask |= UPD_REQUEST;
5277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
5287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     if (L2CA_GET_UPD_ST(p_lcb->conn_update_mask) == UPD_ENABLED)
5297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     {
5307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                         btsnd_hcic_ble_upd_ll_conn_params (p_lcb->handle, min_interval, max_interval,
5317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                             latency, timeout, 0, 0);
5327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     }
5337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     else
5347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     {
5357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                         L2CAP_TRACE_EVENT0 ("L2CAP - LE - update currently disabled");
5367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                     }
5377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0);
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case L2CAP_CMD_BLE_UPDATE_RSP:
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16 (result, p);
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            L2CAP_TRACE_WARNING1 ("L2CAP - LE - unknown cmd code: %d", cmd_code);
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0);
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
5557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
5567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         l2c_enable_conn_param_timeout
5577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
5587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      This function process the connection parameter enabling timeout
5597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
5607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          None.
5617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
5627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
5637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battavoid l2c_enable_conn_param_timeout(tL2C_LCB * p_lcb)
5647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
5657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_or_alloc_dev (p_lcb->remote_bd_addr);
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* application allows to do update, if we were delaying one do it now, otherwise
5697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    just mark lcb that updates are enabled */
5707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_lcb->conn_update_mask & UPD_REQUEST)
5717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
5727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        btsnd_hcic_ble_upd_ll_conn_params (p_lcb->handle, p_lcb->min_interval, p_lcb->max_interval,
5737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                           p_lcb->latency, p_lcb->timeout, 0, 0);
5747fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
5757fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else
5767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
5777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* if preferred number has been set, set to preferred conn parameter */
5787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (p_dev_rec && p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF)
5797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
5807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btsnd_hcic_ble_upd_ll_conn_params (p_lcb->handle,
5817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (UINT16)((p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
5827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                p_dev_rec->conn_params.min_conn_int : BTM_BLE_CONN_INT_MIN_DEF),
5837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (UINT16)((p_dev_rec->conn_params.max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
5847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                p_dev_rec->conn_params.max_conn_int : BTM_BLE_CONN_INT_MAX_DEF),
5857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (UINT16)((p_dev_rec->conn_params.slave_latency != BTM_BLE_CONN_PARAM_UNDEF) ?
5867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                p_dev_rec->conn_params.slave_latency : BTM_BLE_CONN_SLAVE_LATENCY_DEF),
5877fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                (UINT16) ((p_dev_rec->conn_params.supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) ?
5887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                p_dev_rec->conn_params.supervision_tout : BTM_BLE_CONN_TIMEOUT_DEF),
5897fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                0, 0);
5907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
5917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
5927fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    L2CA_SET_UPD_ST( p_lcb->conn_update_mask, UPD_ENABLED);
5937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
5947fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
597ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         l2cble_init_direct_conn
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
599ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function is to initate a direct connection
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
601ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          TRUE connection initiated, FALSE otherwise.
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
604ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN l2cble_init_direct_conn (tL2C_LCB *p_lcb)
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_or_alloc_dev (p_lcb->remote_bd_addr);
607ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_BLE_CB         *p_cb = &btm_cb.ble_ctr_cb;
608ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT16               scan_int, scan_win;
609ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BD_ADDR         init_addr;
610ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8           init_addr_type = BLE_ADDR_PUBLIC,
611ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    own_addr_type = BLE_ADDR_PUBLIC;
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* There can be only one BLE connection request outstanding at a time */
614ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_dev_rec == NULL)
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6167fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        L2CAP_TRACE_WARNING0 ("unknown device, can not initate connection");
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(FALSE);
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
620ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    scan_int = (p_cb->scan_int == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_FAST_INT : p_cb->scan_int;
621ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    scan_win = (p_cb->scan_win == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_FAST_WIN : p_cb->scan_win;
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
623ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    init_addr_type = p_lcb->ble_addr_type;
624ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    memcpy(init_addr, p_lcb->remote_bd_addr, BD_ADDR_LEN);
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_PRIVACY_SPT == TRUE
6278b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    if (p_dev_rec->ble.active_addr_type == BTM_BLE_ADDR_RRA)
6288b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    {
6298b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu        init_addr_type = BLE_ADDR_RANDOM;
6308b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu        memcpy(init_addr, p_dev_rec->ble.cur_rand_addr, BD_ADDR_LEN);
6318b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu    }
6327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    /* if privacy is on and current do not consider using reconnection address */
6337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (btm_cb.ble_ctr_cb.privacy ) /* && p_dev_rec->ble.use_reconn_addr */
6347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        own_addr_type = BLE_ADDR_RANDOM;
6358b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif
6368b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu
6377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (!btm_ble_topology_check(BTM_BLE_STATE_INIT))
6387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
6397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        l2cu_release_lcb (p_lcb);
6407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        L2CAP_TRACE_ERROR0("initate direct connection fail, topology limitation");
6417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        return FALSE;
6427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!btsnd_hcic_ble_create_ll_conn (scan_int,/* UINT16 scan_int      */
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        scan_win, /* UINT16 scan_win      */
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        FALSE,                   /* UINT8 white_list     */
6466975b4d711142b885af479721cada448952c6b41Andre Eisenbach                                        init_addr_type,          /* UINT8 addr_type_peer */
6476975b4d711142b885af479721cada448952c6b41Andre Eisenbach                                        init_addr,               /* BD_ADDR bda_peer     */
6486975b4d711142b885af479721cada448952c6b41Andre Eisenbach                                        own_addr_type,         /* UINT8 addr_type_own  */
6493dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu        (UINT16) ((p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
6503dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu        p_dev_rec->conn_params.min_conn_int : BTM_BLE_CONN_INT_MIN_DEF),  /* conn_int_min  */
6513dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu        (UINT16) ((p_dev_rec->conn_params.max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ?
6523dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu        p_dev_rec->conn_params.max_conn_int : BTM_BLE_CONN_INT_MAX_DEF),  /* conn_int_max  */
6533dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu        (UINT16) ((p_dev_rec->conn_params.slave_latency != BTM_BLE_CONN_PARAM_UNDEF) ?
6543dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu        p_dev_rec->conn_params.slave_latency : 0), /* UINT16 conn_latency  */
6553dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu        (UINT16) ((p_dev_rec->conn_params.supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) ?
6563dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu        p_dev_rec->conn_params.supervision_tout : BTM_BLE_CONN_SUP_TOUT_DEF), /* conn_timeout */
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        0,                       /* UINT16 min_len       */
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        0))                      /* UINT16 max_len       */
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        l2cu_release_lcb (p_lcb);
661ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        L2CAP_TRACE_ERROR0("initate direct connection fail, no resources");
662ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return (FALSE);
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
665ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
666ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_lcb->link_state = LST_CONNECTING;
6676975b4d711142b885af479721cada448952c6b41Andre Eisenbach        l2cb.is_ble_connecting = TRUE;
668ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        memcpy (l2cb.ble_connecting_bda, p_lcb->remote_bd_addr, BD_ADDR_LEN);
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_BLE_LINK_CONNECT_TOUT);
670ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        btm_ble_set_conn_st (BLE_DIR_CONN);
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
672ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return (TRUE);
673ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
674ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
675ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
676ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
677ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
678ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         l2cble_create_conn
679ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
680ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function initiates an acl connection via HCI
681ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
682ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          TRUE if successful, FALSE if connection not started.
683ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
684ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
685ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN l2cble_create_conn (tL2C_LCB *p_lcb)
686ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
687ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_BLE_CONN_ST     conn_st = btm_ble_get_conn_st();
688ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BOOLEAN         rt = FALSE;
689ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
690ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* There can be only one BLE connection request outstanding at a time */
691ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (conn_st == BLE_CONN_IDLE)
692ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
693ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        rt = l2cble_init_direct_conn(p_lcb);
694ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
695ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    else
696ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
697ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        L2CAP_TRACE_WARNING1 ("L2CAP - LE - cannot start new connection at conn st: %d", conn_st);
698ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
699ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        btm_ble_enqueue_direct_conn_req(p_lcb);
700ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
701ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (conn_st == BLE_BG_CONN)
702ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            btm_ble_suspend_bg_conn();
703ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
704ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        rt = TRUE;
705ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
706ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return rt;
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         l2c_link_processs_ble_num_bufs
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a "controller buffer size"
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  event is first received from the controller. It updates
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the L2CAP values.
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2c_link_processs_ble_num_bufs (UINT16 num_lm_ble_bufs)
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7220082e027d5ae3f45a3a613ed720c31e35f61d0ebAndre Eisenbach    if (num_lm_ble_bufs == 0)
72312c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach    {
72412c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach        num_lm_ble_bufs = L2C_DEF_NUM_BLE_BUF_SHARED;
72512c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach        l2cb.num_lm_acl_bufs -= L2C_DEF_NUM_BLE_BUF_SHARED;
72612c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach    }
72712c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    l2cb.num_lm_ble_bufs = l2cb.controller_le_xmit_window = num_lm_ble_bufs;
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE)
7327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/*******************************************************************************
7337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
7347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function         l2cble_process_rc_param_request_evt
7357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
7367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description      process LE Remote Connection Parameter Request Event.
7377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
7387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns          void
7397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta**
7407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/
7417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battavoid l2cble_process_rc_param_request_evt(UINT16 handle, UINT16 int_min, UINT16 int_max,
7427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                     UINT16 latency, UINT16 timeout)
7437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{
7447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    tL2C_LCB    *p_lcb = l2cu_find_lcb_by_handle (handle);
7457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
7467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (p_lcb != NULL)
7477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
7487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_lcb->min_interval = int_min;
7497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_lcb->max_interval = int_max;
7507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_lcb->latency = latency;
7517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_lcb->timeout = timeout;
7527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        p_lcb->conn_update_mask |= UPD_REQUEST;
7537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
7547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        /* TODO: revisit: if update is enabled, always accept connection parameter update */
7557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if (L2CA_GET_UPD_ST(p_lcb->conn_update_mask) == UPD_ENABLED)
7567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
7577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btsnd_hcic_ble_rc_param_req_reply(handle, int_min, int_max, latency, timeout, 0, 0);
7587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
7597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        else
7607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
7617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            L2CAP_TRACE_EVENT0 ("L2CAP - LE - update currently disabled");
7627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            btsnd_hcic_ble_rc_param_req_neg_reply (handle,HCI_ERR_UNACCEPT_CONN_INTERVAL);
7637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
7647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
7657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
7667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    else
7677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    {
7687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        L2CAP_TRACE_WARNING0("No link to update connection parameter")
7697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    }
7707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta}
7717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif
7727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
7737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* (BLE_INCLUDED == TRUE) */
775