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