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