l2c_ble.c revision 5e61112a98712c872560a1c7aa2f6ab7102c4da4
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" 3379ecab5d0418fde77e9afcdd451bd713af73e180Chris Manton#include "device/include/controller.h" 34d129b9430042a81c20cb21ad54657695b77dfb9eNitin Arora#include "stack_config.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE) 3778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 3878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovextern fixed_queue_t *btu_general_alarm_queue; 3978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 4097e75b73a57602b7d9771f28216630ba32fd702aChaojing Sunstatic void l2cble_start_conn_update (tL2C_LCB *p_lcb); 417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 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 { 60a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING ("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 { 66a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING ("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 { 766564ea6af8263d7290845d3209a70ee96cf8b9e2Nitin Arora p_lcb = l2cu_find_lcb_by_bd_addr(rem_bda, BT_TRANSPORT_LE); 776564ea6af8263d7290845d3209a70ee96cf8b9e2Nitin Arora /* Do not remove lcb if an LE link is already up as a peripheral */ 786564ea6af8263d7290845d3209a70ee96cf8b9e2Nitin Arora if (p_lcb != NULL && 796564ea6af8263d7290845d3209a70ee96cf8b9e2Nitin Arora !(p_lcb->link_role == HCI_ROLE_SLAVE && BTM_ACL_IS_CONNECTED(rem_bda))) 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_lcb->disc_reason = L2CAP_CONN_CANCEL; 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_release_lcb (p_lcb); 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 846975b4d711142b885af479721cada448952c6b41Andre Eisenbach /* update state to be cancel, wait for connection cancel complete */ 856975b4d711142b885af479721cada448952c6b41Andre Eisenbach btm_ble_set_conn_st (BLE_CONN_CANCEL); 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9315d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu/******************************************************************************* 9415d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu** 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function L2CA_UpdateBleConnParams 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Update BLE connection parameters. 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: BD Address of remote 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Return value: TRUE if update started 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bda, UINT16 min_int, UINT16 max_int, 1057fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT16 latency, UINT16 timeout) 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach tL2C_LCB *p_lcb; 10801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach tACL_CONN *p_acl_cb = btm_bda_to_acl(rem_bda, BT_TRANSPORT_LE); 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach /* See if we have a link control block for the remote device */ 11101a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE); 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11301a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach /* If we don't have one, create one and accept the connection. */ 11401a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach if (!p_lcb || !p_acl_cb) 11501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach { 11601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach L2CAP_TRACE_WARNING ("L2CA_UpdateBleConnParams - unknown BD_ADDR %08x%04x", 11701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], 11801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach (rem_bda[4]<<8)+rem_bda[5]); 11901a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach return(FALSE); 12001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach } 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12201a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach if (p_lcb->transport != BT_TRANSPORT_LE) 12301a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach { 12401a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach L2CAP_TRACE_WARNING ("L2CA_UpdateBleConnParams - BD_ADDR %08x%04x not LE", 12501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], 12601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach (rem_bda[4]<<8)+rem_bda[5]); 12701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach return(FALSE); 12801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach } 12997e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 13001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->min_interval = min_int; 13101a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->max_interval = max_int; 13201a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->latency = latency; 13301a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->timeout = timeout; 13401a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->conn_update_mask |= L2C_BLE_NEW_CONN_PARAM; 13597e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 13601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach l2cble_start_conn_update(p_lcb); 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach return(TRUE); 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function L2CA_EnableUpdateBleConnParams 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Enable or disable update based on the request from the peer 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: BD Address of remote 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Return value: TRUE if update started 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN L2CA_EnableUpdateBleConnParams (BD_ADDR rem_bda, BOOLEAN enable) 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 155d129b9430042a81c20cb21ad54657695b77dfb9eNitin Arora if (stack_config_get_interface()->get_pts_conn_updates_disabled()) 156d129b9430042a81c20cb21ad54657695b77dfb9eNitin Arora return false; 157d129b9430042a81c20cb21ad54657695b77dfb9eNitin Arora 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2C_LCB *p_lcb; 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* See if we have a link control block for the remote device */ 1617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE); 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_lcb) 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 165a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING ("L2CA_EnableUpdateBleConnParams - unknown BD_ADDR %08x%04x", 1667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], 1677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (rem_bda[4]<<8)+rem_bda[5]); 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (FALSE); 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 171a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_API ("%s - BD_ADDR %08x%04x enable %d current upd state 0x%02x",__FUNCTION__, 1727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], 1737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (rem_bda[4]<<8)+rem_bda[5], enable, p_lcb->conn_update_mask); 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach if (p_lcb->transport != BT_TRANSPORT_LE) 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach L2CAP_TRACE_WARNING ("%s - BD_ADDR %08x%04x not LE (link role %d)", __FUNCTION__, 1787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], 1797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (rem_bda[4]<<8)+rem_bda[5], p_lcb->link_role); 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (FALSE); 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (enable) 18497e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun p_lcb->conn_update_mask &= ~L2C_BLE_CONN_UPDATE_DISABLE; 18597e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun else 18697e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun p_lcb->conn_update_mask |= L2C_BLE_CONN_UPDATE_DISABLE; 18715d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu 18897e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun l2cble_start_conn_update(p_lcb); 18915d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu 1907fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return (TRUE); 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1937fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function L2CA_GetBleConnRole 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function returns the connection role. 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns link role. 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 L2CA_GetBleConnRole (BD_ADDR bd_addr) 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 role = HCI_ROLE_UNKNOWN; 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2C_LCB *p_lcb; 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2097fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_LE)) != NULL) 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project role = p_lcb->link_role; 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return role; 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function L2CA_GetDisconnectReason 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function returns the disconnect reason code. 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns disconnect reason 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaUINT16 L2CA_GetDisconnectReason (BD_ADDR remote_bda, tBT_TRANSPORT transport) 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2C_LCB *p_lcb; 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 reason = 0; 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_lcb = l2cu_find_lcb_by_bd_addr (remote_bda, transport)) != NULL) 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = p_lcb->disc_reason; 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 231a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_DEBUG ("L2CA_GetDisconnectReason=%d ",reason); 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return reason; 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23695075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowskivoid l2cble_use_preferred_conn_params(BD_ADDR bda) { 23795075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE); 23895075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (bda); 23995075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski 24095075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski /* If there are any preferred connection parameters, set them now */ 24195075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski if ( (p_dev_rec->conn_params.min_conn_int >= BTM_BLE_CONN_INT_MIN ) && 24295075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski (p_dev_rec->conn_params.min_conn_int <= BTM_BLE_CONN_INT_MAX ) && 24395075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski (p_dev_rec->conn_params.max_conn_int >= BTM_BLE_CONN_INT_MIN ) && 24495075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski (p_dev_rec->conn_params.max_conn_int <= BTM_BLE_CONN_INT_MAX ) && 24595075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski (p_dev_rec->conn_params.slave_latency <= BTM_BLE_CONN_LATENCY_MAX ) && 24695075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski (p_dev_rec->conn_params.supervision_tout >= BTM_BLE_CONN_SUP_TOUT_MIN) && 24795075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski (p_dev_rec->conn_params.supervision_tout <= BTM_BLE_CONN_SUP_TOUT_MAX) && 24895075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski ((p_lcb->min_interval < p_dev_rec->conn_params.min_conn_int && 24995075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) || 25095075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski (p_lcb->min_interval > p_dev_rec->conn_params.max_conn_int) || 25195075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski (p_lcb->latency > p_dev_rec->conn_params.slave_latency) || 25295075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski (p_lcb->timeout > p_dev_rec->conn_params.supervision_tout))) 25395075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski { 25495075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski L2CAP_TRACE_DEBUG ("%s: HANDLE=%d min_conn_int=%d max_conn_int=%d slave_latency=%d supervision_tout=%d", __func__, 25595075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski p_lcb->handle, p_dev_rec->conn_params.min_conn_int, p_dev_rec->conn_params.max_conn_int, 25695075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski p_dev_rec->conn_params.slave_latency, p_dev_rec->conn_params.supervision_tout); 25795075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski 25895075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski p_lcb->min_interval = p_dev_rec->conn_params.min_conn_int; 25995075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski p_lcb->max_interval = p_dev_rec->conn_params.max_conn_int; 26095075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski p_lcb->timeout = p_dev_rec->conn_params.supervision_tout; 26195075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski p_lcb->latency = p_dev_rec->conn_params.slave_latency; 26295075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski 26395075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski btsnd_hcic_ble_upd_ll_conn_params (p_lcb->handle, 26495075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski p_dev_rec->conn_params.min_conn_int, 26595075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski p_dev_rec->conn_params.max_conn_int, 26695075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski p_dev_rec->conn_params.slave_latency, 26795075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski p_dev_rec->conn_params.supervision_tout, 26895075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski 0, 0); 26995075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski } 27095075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski} 27195075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2749c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera** Function l2cble_notify_le_connection 2759c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera** 2769c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera** Description This function notifiy the l2cap connection to the app layer 2779c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera** 2789c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera** Returns none 2799c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera** 2809c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera*******************************************************************************/ 2819c29d08bc7c6da33db5cfc777404354c6dca845cPriti Agheravoid l2cble_notify_le_connection (BD_ADDR bda) 2829c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera{ 2839c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE); 2847ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham tACL_CONN *p_acl = btm_bda_to_acl(bda, BT_TRANSPORT_LE) ; 285ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar tL2C_CCB *p_ccb; 2869c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera 2877ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham if (p_lcb != NULL && p_acl != NULL && p_lcb->link_state != LST_CONNECTED) 2887ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham { 2897ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham /* update link status */ 2907ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham btm_establish_continue(p_acl); 2917ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham /* update l2cap link status and send callback */ 2927ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham p_lcb->link_state = LST_CONNECTED; 2939c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera l2cu_process_fixed_chnl_resp (p_lcb); 2947ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham } 295ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 2965e61112a98712c872560a1c7aa2f6ab7102c4da4Jakub Pawlowski if (p_lcb != NULL) { 2975e61112a98712c872560a1c7aa2f6ab7102c4da4Jakub Pawlowski /* For all channels, send the event through their FSMs */ 2985e61112a98712c872560a1c7aa2f6ab7102c4da4Jakub Pawlowski for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb) 2995e61112a98712c872560a1c7aa2f6ab7102c4da4Jakub Pawlowski { 3005e61112a98712c872560a1c7aa2f6ab7102c4da4Jakub Pawlowski if (p_ccb->chnl_state == CST_CLOSED) 3015e61112a98712c872560a1c7aa2f6ab7102c4da4Jakub Pawlowski l2c_csm_execute (p_ccb, L2CEVT_LP_CONNECT_CFM, NULL); 3025e61112a98712c872560a1c7aa2f6ab7102c4da4Jakub Pawlowski } 303ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 30495075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski 30595075be6e95e9021c1ddd834bcf9e3771c57c217Jakub Pawlowski l2cble_use_preferred_conn_params(bda); 3069c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera} 3079c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera 3089c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera/******************************************************************************* 3099c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera** 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function l2cble_scanner_conn_comp 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when an HCI Connection Complete 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event is received while we are a scanner (so we are master). 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 318ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid l2cble_scanner_conn_comp (UINT16 handle, BD_ADDR bda, tBLE_ADDR_TYPE type, 319ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 conn_interval, UINT16 conn_latency, UINT16 conn_timeout) 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2C_LCB *p_lcb; 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (bda); 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 324a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_DEBUG ("l2cble_scanner_conn_comp: HANDLE=%d addr_type=%d conn_interval=%d slave_latency=%d supervision_tout=%d", 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle, type, conn_interval, conn_latency, conn_timeout); 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cb.is_ble_connecting = FALSE; 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* See if we have a link control block for the remote device */ 3307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE); 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we don't have one, create one. this is auto connection complete. */ 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_lcb) 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb = l2cu_allocate_lcb (bda, FALSE, BT_TRANSPORT_LE); 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_lcb) 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION); 339a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_ERROR ("l2cble_scanner_conn_comp - failed to allocate LCB"); 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3445738f83aeb59361a0a2eda2460113f6dc919427The 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)) 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION); 347a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING ("l2cble_scanner_conn_comp - LCB but no CCB"); 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ; 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_lcb->link_state != LST_CONNECTING) 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 354a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_ERROR ("L2CAP got BLE scanner conn_comp in bad state: %d", p_lcb->link_state); 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 35778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(p_lcb->l2c_lcb_timer); 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save the handle */ 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_lcb->handle = handle; 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Connected OK. Change state to connected, we were scanning so we are master */ 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_lcb->link_role = HCI_ROLE_MASTER; 3647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->transport = BT_TRANSPORT_LE; 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach /* update link parameter, set slave link as non-spec default upon link up */ 36701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->min_interval = p_lcb->max_interval = conn_interval; 36801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->timeout = conn_timeout; 36901a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->latency = conn_latency; 37001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->conn_update_mask = L2C_BLE_NOT_DEFAULT_PARAM; 37101a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach 3720766eff0085452888626e4f83e5a322dd3f87700Jakub Pawlowski /* Tell BTM Acl management about the link */ 3730766eff0085452888626e4f83e5a322dd3f87700Jakub Pawlowski btm_acl_created (bda, NULL, p_dev_rec->sec_bd_name, handle, p_lcb->link_role, BT_TRANSPORT_LE); 3740766eff0085452888626e4f83e5a322dd3f87700Jakub Pawlowski 3750766eff0085452888626e4f83e5a322dd3f87700Jakub Pawlowski p_lcb->peer_chnl_mask[0] = L2CAP_FIXED_CHNL_ATT_BIT | L2CAP_FIXED_CHNL_BLE_SIG_BIT | L2CAP_FIXED_CHNL_SMP_BIT; 3760766eff0085452888626e4f83e5a322dd3f87700Jakub Pawlowski 3770766eff0085452888626e4f83e5a322dd3f87700Jakub Pawlowski btm_ble_set_conn_st(BLE_CONN_IDLE); 3780766eff0085452888626e4f83e5a322dd3f87700Jakub Pawlowski 3790766eff0085452888626e4f83e5a322dd3f87700Jakub Pawlowski#if BLE_PRIVACY_SPT == TRUE 3800766eff0085452888626e4f83e5a322dd3f87700Jakub Pawlowski btm_ble_disable_resolving_list(BTM_BLE_RL_INIT, TRUE); 3810766eff0085452888626e4f83e5a322dd3f87700Jakub Pawlowski#endif 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function l2cble_advertiser_conn_comp 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when an HCI Connection Complete 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event is received while we are an advertiser (so we are slave). 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2cble_advertiser_conn_comp (UINT16 handle, BD_ADDR bda, tBLE_ADDR_TYPE type, 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 conn_interval, UINT16 conn_latency, UINT16 conn_timeout) 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2C_LCB *p_lcb; 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 4005cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(type); 4015cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(conn_interval); 4025cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(conn_latency); 4035cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(conn_timeout); 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* See if we have a link control block for the remote device */ 4067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE); 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we don't have one, create one and accept the connection. */ 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_lcb) 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb = l2cu_allocate_lcb (bda, FALSE, BT_TRANSPORT_LE); 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_lcb) 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION); 415a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_ERROR ("l2cble_advertiser_conn_comp - failed to allocate LCB"); 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4205738f83aeb59361a0a2eda2460113f6dc919427The 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)) 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION); 423a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING ("l2cble_scanner_conn_comp - LCB but no CCB"); 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ; 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save the handle */ 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_lcb->handle = handle; 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Connected OK. Change state to connected, we were advertising, so we are slave */ 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_lcb->link_role = HCI_ROLE_SLAVE; 4347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->transport = BT_TRANSPORT_LE; 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach /* update link parameter, set slave link as non-spec default upon link up */ 43701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->min_interval = p_lcb->max_interval = conn_interval; 43801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->timeout = conn_timeout; 43901a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->latency = conn_latency; 44001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->conn_update_mask = L2C_BLE_NOT_DEFAULT_PARAM; 44101a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell BTM Acl management about the link */ 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (bda); 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_acl_created (bda, NULL, p_dev_rec->sec_bd_name, handle, p_lcb->link_role, BT_TRANSPORT_LE); 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 447a021a12987c4257d137437c6de9438b3344c6f6bAndre Eisenbach#if BLE_PRIVACY_SPT == TRUE 44870b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji btm_ble_disable_resolving_list(BTM_BLE_RL_ADV, TRUE); 449a021a12987c4257d137437c6de9438b3344c6f6bAndre Eisenbach#endif 45070b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji 4515738f83aeb59361a0a2eda2460113f6dc919427The 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; 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson if (!HCI_LE_SLAVE_INIT_FEAT_EXC_SUPPORTED(controller_get_interface()->get_features_ble()->as_array)) 4549c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera { 4557ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham p_lcb->link_state = LST_CONNECTED; 4569c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera l2cu_process_fixed_chnl_resp (p_lcb); 4579c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera } 4587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 4597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* when adv and initiating are both active, cancel the direct connection */ 4607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (l2cb.is_ble_connecting && memcmp(bda, l2cb.ble_connecting_bda, BD_ADDR_LEN) == 0) 4617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 4627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta L2CA_CancelBleConnectReq(bda); 4637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function l2cble_conn_comp 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when an HCI Connection Complete 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event is received. 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2cble_conn_comp(UINT16 handle, UINT8 role, BD_ADDR bda, tBLE_ADDR_TYPE type, 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 conn_interval, UINT16 conn_latency, UINT16 conn_timeout) 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 479444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_ble_update_link_topology_mask(role, TRUE); 480444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (role == HCI_ROLE_MASTER) 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cble_scanner_conn_comp(handle, bda, type, conn_interval, conn_latency, conn_timeout); 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cble_advertiser_conn_comp(handle, bda, type, conn_interval, conn_latency, conn_timeout); 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 49097e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 49197e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun/******************************************************************************* 49297e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** 49397e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** Function l2cble_start_conn_update 49497e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** 49597e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** Description start BLE connection parameter update process based on status 49697e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** 49797e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** Parameters: lcb : l2cap link control block 49897e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** 49997e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** Return value: none 50097e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** 50197e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun*******************************************************************************/ 50297e75b73a57602b7d9771f28216630ba32fd702aChaojing Sunstatic void l2cble_start_conn_update (tL2C_LCB *p_lcb) 50397e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun{ 50401a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach UINT16 min_conn_int, max_conn_int, slave_latency, supervision_tout; 50501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach tACL_CONN *p_acl_cb = btm_bda_to_acl(p_lcb->remote_bd_addr, BT_TRANSPORT_LE); 50697e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 507cab5fc179730ce6910989307680b275195876c4dArman Uguray // TODO(armansito): The return value of this call wasn't being used but the 508cab5fc179730ce6910989307680b275195876c4dArman Uguray // logic of this function might be depending on its side effects. We should 509cab5fc179730ce6910989307680b275195876c4dArman Uguray // verify if this call is needed at all and remove it otherwise. 510cab5fc179730ce6910989307680b275195876c4dArman Uguray btm_find_or_alloc_dev(p_lcb->remote_bd_addr); 511cab5fc179730ce6910989307680b275195876c4dArman Uguray 51297e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun if (p_lcb->conn_update_mask & L2C_BLE_UPDATE_PENDING) return; 51397e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 51497e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun if (p_lcb->conn_update_mask & L2C_BLE_CONN_UPDATE_DISABLE) 51597e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun { 51697e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun /* application requests to disable parameters update. 51797e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun If parameters are already updated, lets set them 51897e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun up to what has been requested during connection establishement */ 51901a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach if (p_lcb->conn_update_mask & L2C_BLE_NOT_DEFAULT_PARAM && 52001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach /* current connection interval is greater than default min */ 52101a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->min_interval > BTM_BLE_CONN_INT_MIN) 52297e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun { 52301a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach /* use 7.5 ms as fast connection parameter, 0 slave latency */ 52401a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach min_conn_int = max_conn_int = BTM_BLE_CONN_INT_MIN; 52501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach slave_latency = BTM_BLE_CONN_SLAVE_LATENCY_DEF; 52601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach supervision_tout = BTM_BLE_CONN_TIMEOUT_DEF; 52701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach 52801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach /* if both side 4.1, or we are master device, send HCI command */ 52901a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach if (p_lcb->link_role == HCI_ROLE_MASTER 53001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE) 53130e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson || (HCI_LE_CONN_PARAM_REQ_SUPPORTED(controller_get_interface()->get_features_ble()->as_array) && 53201a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach HCI_LE_CONN_PARAM_REQ_SUPPORTED(p_acl_cb->peer_le_features)) 53301a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach#endif 53401a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach ) 53501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach { 53601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach btsnd_hcic_ble_upd_ll_conn_params(p_lcb->handle, min_conn_int, max_conn_int, 53701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach slave_latency, supervision_tout, 0, 0); 53801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->conn_update_mask |= L2C_BLE_UPDATE_PENDING; 53901a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach } 54001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach else 54101a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach { 54201a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach l2cu_send_peer_ble_par_req (p_lcb, min_conn_int, max_conn_int, slave_latency, supervision_tout); 54301a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach } 54497e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun p_lcb->conn_update_mask &= ~L2C_BLE_NOT_DEFAULT_PARAM; 54501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->conn_update_mask |= L2C_BLE_NEW_CONN_PARAM; 54601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach } 54797e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun } 54897e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun else 54997e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun { 55097e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun /* application allows to do update, if we were delaying one do it now */ 55197e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun if (p_lcb->conn_update_mask & L2C_BLE_NEW_CONN_PARAM) 55297e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun { 55301a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach /* if both side 4.1, or we are master device, send HCI command */ 55401a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach if (p_lcb->link_role == HCI_ROLE_MASTER 55501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE) 55630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson || (HCI_LE_CONN_PARAM_REQ_SUPPORTED(controller_get_interface()->get_features_ble()->as_array) && 55701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach HCI_LE_CONN_PARAM_REQ_SUPPORTED(p_acl_cb->peer_le_features)) 55801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach#endif 55901a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach ) 56001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach { 56101a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach btsnd_hcic_ble_upd_ll_conn_params(p_lcb->handle, p_lcb->min_interval, 56201a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->max_interval, p_lcb->latency, p_lcb->timeout, 0, 0); 56301a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->conn_update_mask |= L2C_BLE_UPDATE_PENDING; 56401a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach } 56501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach else 56601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach { 56701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach l2cu_send_peer_ble_par_req (p_lcb, p_lcb->min_interval, p_lcb->max_interval, 56801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->latency, p_lcb->timeout); 56901a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach } 57097e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun p_lcb->conn_update_mask &= ~L2C_BLE_NEW_CONN_PARAM; 57101a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->conn_update_mask |= L2C_BLE_NOT_DEFAULT_PARAM; 57297e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun } 57397e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun } 57497e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun} 57597e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 57697e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun/******************************************************************************* 57797e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** 57897e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** Function l2cble_process_conn_update_evt 57997e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** 58097e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** Description This function enables the connection update request from remote 58197e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** after a successful connection update response is received. 58297e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** 58397e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** Returns void 58497e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** 58597e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun*******************************************************************************/ 586e5bed64926d6ae45501617052f90932287da135bMudumba Ananthvoid l2cble_process_conn_update_evt (UINT16 handle, UINT8 status, 587e5bed64926d6ae45501617052f90932287da135bMudumba Ananth UINT16 interval, UINT16 latency, UINT16 timeout) 58897e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun{ 589e5bed64926d6ae45501617052f90932287da135bMudumba Ananth L2CAP_TRACE_DEBUG("%s", __func__); 59097e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 59197e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun /* See if we have a link control block for the remote device */ 592e5bed64926d6ae45501617052f90932287da135bMudumba Ananth tL2C_LCB *p_lcb = l2cu_find_lcb_by_handle(handle); 59397e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun if (!p_lcb) 59497e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun { 595e5bed64926d6ae45501617052f90932287da135bMudumba Ananth L2CAP_TRACE_WARNING("%s: Invalid handle: %d", __func__, handle); 59697e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun return; 59797e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun } 59897e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 59997e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun p_lcb->conn_update_mask &= ~L2C_BLE_UPDATE_PENDING; 60097e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 60197e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun if (status != HCI_SUCCESS) 60297e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun { 603e5bed64926d6ae45501617052f90932287da135bMudumba Ananth L2CAP_TRACE_WARNING("%s: Error status: %d", __func__, status); 60497e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun } 60597e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 60697e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun l2cble_start_conn_update(p_lcb); 60797e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 608e5bed64926d6ae45501617052f90932287da135bMudumba Ananth L2CAP_TRACE_DEBUG("%s: conn_update_mask=%d", __func__, p_lcb->conn_update_mask); 60997e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun} 610e5bed64926d6ae45501617052f90932287da135bMudumba Ananth 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function l2cble_process_sig_cmd 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when a signalling packet is received 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** on the BLE signalling CID 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2cble_process_sig_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_pkt_end; 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 cmd_code, id; 625f1c764fab01c929f71e185b97433bf40938026d3Sharvil Nanavati UINT16 cmd_len; 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 min_interval, max_interval, latency, timeout; 627ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar tL2C_CONN_INFO con_info; 628ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar UINT16 lcid = 0, rcid = 0, mtu = 0, mps = 0, initial_credit = 0; 629ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar tL2C_CCB *p_ccb = NULL, *temp_p_ccb = NULL; 630ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar tL2C_RCB *p_rcb; 631ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar UINT16 credit; 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_pkt_end = p + pkt_len; 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (cmd_code, p); 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (id, p); 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16 (cmd_len, p); 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check command length does not exceed packet length */ 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p + cmd_len) > p_pkt_end) 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 641a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING ("L2CAP - LE - format error, pkt_len: %d cmd_len: %d code: %d", pkt_len, cmd_len, cmd_code); 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (cmd_code) 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case L2CAP_CMD_REJECT: 648f1c764fab01c929f71e185b97433bf40938026d3Sharvil Nanavati p += 2; 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6503de5d04affdfde2a067e62784de265779e8c4dfaVenkata Jagadeesh 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case L2CAP_CMD_ECHO_REQ: 6523de5d04affdfde2a067e62784de265779e8c4dfaVenkata Jagadeesh case L2CAP_CMD_ECHO_RSP: 6533de5d04affdfde2a067e62784de265779e8c4dfaVenkata Jagadeesh case L2CAP_CMD_INFO_RSP: 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case L2CAP_CMD_INFO_REQ: 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0); 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case L2CAP_CMD_BLE_UPDATE_REQ: 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16 (min_interval, p); /* 0x0006 - 0x0C80 */ 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16 (max_interval, p); /* 0x0006 - 0x0C80 */ 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16 (latency, p); /* 0x0000 - 0x03E8 */ 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16 (timeout, p); /* 0x000A - 0x0C80 */ 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we are a master, the slave wants to update the parameters */ 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_lcb->link_role == HCI_ROLE_MASTER) 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 66671334dcd2c58564a195dade1f862f052ecd07b50Andre Eisenbach if (min_interval < BTM_BLE_CONN_INT_MIN_LIMIT) 66771334dcd2c58564a195dade1f862f052ecd07b50Andre Eisenbach min_interval = BTM_BLE_CONN_INT_MIN_LIMIT; 66871334dcd2c58564a195dade1f862f052ecd07b50Andre Eisenbach 669ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (min_interval < BTM_BLE_CONN_INT_MIN || min_interval > BTM_BLE_CONN_INT_MAX || 670ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta max_interval < BTM_BLE_CONN_INT_MIN || max_interval > BTM_BLE_CONN_INT_MAX || 671ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta latency > BTM_BLE_CONN_LATENCY_MAX || 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /*(timeout >= max_interval && latency > (timeout * 10/(max_interval * 1.25) - 1)) ||*/ 673ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta timeout < BTM_BLE_CONN_SUP_TOUT_MIN || timeout > BTM_BLE_CONN_SUP_TOUT_MAX || 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_interval < min_interval) 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 676ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta l2cu_send_peer_ble_par_rsp (p_lcb, L2CAP_CFG_UNACCEPTABLE_PARAMS, id); 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_send_peer_ble_par_rsp (p_lcb, L2CAP_CFG_OK, id); 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->min_interval = min_interval; 6847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->max_interval = max_interval; 6857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->latency = latency; 6867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->timeout = timeout; 68797e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun p_lcb->conn_update_mask |= L2C_BLE_NEW_CONN_PARAM; 6887fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 68997e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun l2cble_start_conn_update(p_lcb); 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0); 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case L2CAP_CMD_BLE_UPDATE_RSP: 697f1c764fab01c929f71e185b97433bf40938026d3Sharvil Nanavati p += 2; 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 700ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar case L2CAP_CMD_BLE_CREDIT_BASED_CONN_REQ: 701ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar STREAM_TO_UINT16 (con_info.psm, p); 702ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar STREAM_TO_UINT16 (rcid, p); 703ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar STREAM_TO_UINT16 (mtu, p); 704ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar STREAM_TO_UINT16 (mps, p); 705ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar STREAM_TO_UINT16 (initial_credit, p); 706ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 707ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_DEBUG ("Recv L2CAP_CMD_BLE_CREDIT_BASED_CONN_REQ with " 708ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar "mtu = %d, " 709ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar "mps = %d, " 710ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar "initial credit = %d", mtu, mps, initial_credit); 711ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 712ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if ((p_rcb = l2cu_find_ble_rcb_by_psm (con_info.psm)) == NULL) 713ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 714ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_WARNING ("L2CAP - rcvd conn req for unknown PSM: 0x%04x", con_info.psm); 715ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar l2cu_reject_ble_connection (p_lcb, id, L2CAP_LE_NO_PSM); 716ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar break; 717ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 718ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar else 719ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 720ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (!p_rcb->api.pL2CA_ConnectInd_Cb) 721ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 722ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_WARNING ("L2CAP - rcvd conn req for outgoing-only connection PSM: %d", con_info.psm); 723ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar l2cu_reject_ble_connection (p_lcb, id, L2CAP_CONN_NO_PSM); 724ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar break; 725ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 726ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 727ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 728ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar /* Allocate a ccb for this.*/ 729ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if ((p_ccb = l2cu_allocate_ccb (p_lcb, 0)) == NULL) 730ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 731ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_ERROR ("L2CAP - unable to allocate CCB"); 732ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar l2cu_reject_ble_connection (p_lcb, id, L2CAP_CONN_NO_RESOURCES); 733ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar break; 734ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 735ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 736ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar /* validate the parameters */ 737ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (mtu < L2CAP_LE_MIN_MTU || mps < L2CAP_LE_MIN_MPS || mps > L2CAP_LE_MAX_MPS) 738ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 739ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_ERROR ("L2CAP don't like the params"); 740ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar l2cu_reject_ble_connection (p_lcb, id, L2CAP_CONN_NO_RESOURCES); 741ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar break; 742ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 743ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 744ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->remote_id = id; 745ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->p_rcb = p_rcb; 746ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->remote_cid = rcid; 747ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 748ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->peer_conn_cfg.mtu = mtu; 749ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->peer_conn_cfg.mps = mps; 750ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->peer_conn_cfg.credits = initial_credit; 751ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 752ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->tx_mps = mps; 753ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->ble_sdu = NULL; 754ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->ble_sdu_length = 0; 755ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->is_first_seg = TRUE; 756ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->peer_cfg.fcr.mode = L2CAP_FCR_LE_COC_MODE; 757ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 758ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar l2c_csm_execute(p_ccb, L2CEVT_L2CAP_CONNECT_REQ, &con_info); 759ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar break; 760ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 761ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar case L2CAP_CMD_BLE_CREDIT_BASED_CONN_RES: 762ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_DEBUG ("Recv L2CAP_CMD_BLE_CREDIT_BASED_CONN_RES"); 763ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar /* For all channels, see whose identifier matches this id */ 764ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar for (temp_p_ccb = p_lcb->ccb_queue.p_first_ccb; temp_p_ccb; temp_p_ccb = temp_p_ccb->p_next_ccb) 765ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 766ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (temp_p_ccb->local_id == id) 767ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 768ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb = temp_p_ccb; 769ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar break; 770ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 771ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 772ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (p_ccb) 773ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 774ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_DEBUG ("I remember the connection req"); 775ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar STREAM_TO_UINT16 (p_ccb->remote_cid, p); 776ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar STREAM_TO_UINT16 (p_ccb->peer_conn_cfg.mtu, p); 777ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar STREAM_TO_UINT16 (p_ccb->peer_conn_cfg.mps, p); 778ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar STREAM_TO_UINT16 (p_ccb->peer_conn_cfg.credits, p); 779ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar STREAM_TO_UINT16 (con_info.l2cap_result, p); 780ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar con_info.remote_cid = p_ccb->remote_cid; 781ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 782ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_DEBUG ("remote_cid = %d, " 783ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar "mtu = %d, " 784ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar "mps = %d, " 785ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar "initial_credit = %d, " 786ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar "con_info.l2cap_result = %d", 787ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->remote_cid, p_ccb->peer_conn_cfg.mtu, p_ccb->peer_conn_cfg.mps, 788ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->peer_conn_cfg.credits, con_info.l2cap_result); 789ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 790ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar /* validate the parameters */ 791ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (p_ccb->peer_conn_cfg.mtu < L2CAP_LE_MIN_MTU || 792ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->peer_conn_cfg.mps < L2CAP_LE_MIN_MPS || 793ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->peer_conn_cfg.mps > L2CAP_LE_MAX_MPS) 794ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 795ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_ERROR ("L2CAP don't like the params"); 796ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar con_info.l2cap_result = L2CAP_LE_NO_RESOURCES; 797ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar l2c_csm_execute(p_ccb, L2CEVT_L2CAP_CONNECT_RSP_NEG, &con_info); 798ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar break; 799ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 800ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 801ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->tx_mps = p_ccb->peer_conn_cfg.mps; 802ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->ble_sdu = NULL; 803ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->ble_sdu_length = 0; 804ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->is_first_seg = TRUE; 805ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->peer_cfg.fcr.mode = L2CAP_FCR_LE_COC_MODE; 806ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 807ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (con_info.l2cap_result == L2CAP_LE_CONN_OK) 808ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar l2c_csm_execute(p_ccb, L2CEVT_L2CAP_CONNECT_RSP, &con_info); 809ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar else 810ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar l2c_csm_execute(p_ccb, L2CEVT_L2CAP_CONNECT_RSP_NEG, &con_info); 811ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 812ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar else 813ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 814ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_DEBUG ("I DO NOT remember the connection req"); 815ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar con_info.l2cap_result = L2CAP_LE_INVALID_SOURCE_CID; 816ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar l2c_csm_execute(p_ccb, L2CEVT_L2CAP_CONNECT_RSP_NEG, &con_info); 817ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 818ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar break; 819ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 820ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar case L2CAP_CMD_BLE_FLOW_CTRL_CREDIT: 821ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar STREAM_TO_UINT16(lcid, p); 822ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if((p_ccb = l2cu_find_ccb_by_remote_cid(p_lcb, lcid)) == NULL) 823ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 824ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_DEBUG ("%s Credit received for unknown channel id %d", __func__, lcid); 825ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar break; 826ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 827ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 828ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar STREAM_TO_UINT16(credit ,p); 829ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar l2c_csm_execute(p_ccb, L2CEVT_L2CAP_RECV_FLOW_CONTROL_CREDIT, &credit); 830ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_DEBUG ("%s Credit received", __func__); 831ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar break; 832ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 833ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar case L2CAP_CMD_DISC_REQ: 834ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar STREAM_TO_UINT16 (lcid, p); 835ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar STREAM_TO_UINT16 (rcid, p); 836ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 837ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) != NULL) 838ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 839ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (p_ccb->remote_cid == rcid) 840ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 841ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_ccb->remote_id = id; 842ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar l2c_csm_execute (p_ccb, L2CEVT_L2CAP_DISCONNECT_REQ, NULL); 843ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 844ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 845ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar else 846ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar l2cu_send_peer_disc_rsp (p_lcb, id, lcid, rcid); 847ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 848ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar break; 849ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 850ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar case L2CAP_CMD_DISC_RSP: 851ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar STREAM_TO_UINT16 (rcid, p); 852ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar STREAM_TO_UINT16 (lcid, p); 853ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 854ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if ((p_ccb = l2cu_find_ccb_by_cid (p_lcb, lcid)) != NULL) 855ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 856ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if ((p_ccb->remote_cid == rcid) && (p_ccb->local_id == id)) 857ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar l2c_csm_execute (p_ccb, L2CEVT_L2CAP_DISCONNECT_RSP, NULL); 858ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 859ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar break; 860ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 862a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING ("L2CAP - LE - unknown cmd code: %d", cmd_code); 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0); 864ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar break; 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 870ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function l2cble_init_direct_conn 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 872ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function is to initate a direct connection 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 874ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns TRUE connection initiated, FALSE otherwise. 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 877ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN l2cble_init_direct_conn (tL2C_LCB *p_lcb) 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 879444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_lcb->remote_bd_addr); 880444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; 881444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT16 scan_int; 882444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT16 scan_win; 883444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BD_ADDR peer_addr; 884444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 peer_addr_type = BLE_ADDR_PUBLIC; 885444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 own_addr_type = BLE_ADDR_PUBLIC; 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There can be only one BLE connection request outstanding at a time */ 888ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev_rec == NULL) 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 890a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING ("unknown device, can not initate connection"); 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 89470b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji scan_int = (p_cb->scan_int == BTM_BLE_SCAN_PARAM_UNDEF) ? BTM_BLE_SCAN_FAST_INT : p_cb->scan_int; 89570b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji scan_win = (p_cb->scan_win == BTM_BLE_SCAN_PARAM_UNDEF) ? BTM_BLE_SCAN_FAST_WIN : p_cb->scan_win; 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 897444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji peer_addr_type = p_lcb->ble_addr_type; 898444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(peer_addr, p_lcb->remote_bd_addr, BD_ADDR_LEN); 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 900444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if ( (defined BLE_PRIVACY_SPT) && (BLE_PRIVACY_SPT == TRUE)) 901444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji own_addr_type = btm_cb.ble_ctr_cb.privacy_mode ? BLE_ADDR_RANDOM : BLE_ADDR_PUBLIC; 902444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) 9038b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu { 904444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btm_cb.ble_ctr_cb.privacy_mode >= BTM_PRIVACY_1_2) 905444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji own_addr_type |= BLE_ADDR_TYPE_ID_BIT; 906444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 90770b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji btm_ble_enable_resolving_list(BTM_BLE_RL_INIT); 908444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji btm_random_pseudo_to_identity_addr(peer_addr, &peer_addr_type); 9090fa8cd4645d75f35ca66f395f272cd072f38a4d0Sharvil Nanavati } else { 91070b9598970e5b18ba53c282319e68faea6eb5681Satya Calloji btm_ble_disable_resolving_list(BTM_BLE_RL_INIT, TRUE); 9110fa8cd4645d75f35ca66f395f272cd072f38a4d0Sharvil Nanavati 9120fa8cd4645d75f35ca66f395f272cd072f38a4d0Sharvil Nanavati // If we have a current RPA, use that instead. 9130fa8cd4645d75f35ca66f395f272cd072f38a4d0Sharvil Nanavati if (!bdaddr_is_empty((const bt_bdaddr_t *)p_dev_rec->ble.cur_rand_addr)) { 9140fa8cd4645d75f35ca66f395f272cd072f38a4d0Sharvil Nanavati memcpy(peer_addr, p_dev_rec->ble.cur_rand_addr, BD_ADDR_LEN); 9150fa8cd4645d75f35ca66f395f272cd072f38a4d0Sharvil Nanavati } 9160fa8cd4645d75f35ca66f395f272cd072f38a4d0Sharvil Nanavati } 9178b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif 9188b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu 9197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (!btm_ble_topology_check(BTM_BLE_STATE_INIT)) 9207fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 9217fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta l2cu_release_lcb (p_lcb); 922a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_ERROR("initate direct connection fail, topology limitation"); 9237fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return FALSE; 9247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 92516fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_create_ll_conn (scan_int,/* UINT16 scan_int */ 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project scan_win, /* UINT16 scan_win */ 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FALSE, /* UINT8 white_list */ 929444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji peer_addr_type, /* UINT8 addr_type_peer */ 930444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji peer_addr, /* BD_ADDR bda_peer */ 9316975b4d711142b885af479721cada448952c6b41Andre Eisenbach own_addr_type, /* UINT8 addr_type_own */ 9323dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu (UINT16) ((p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ? 93301a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_dev_rec->conn_params.min_conn_int : BTM_BLE_CONN_INT_MIN_DEF), /* UINT16 conn_int_min */ 9343dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu (UINT16) ((p_dev_rec->conn_params.max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ? 93501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_dev_rec->conn_params.max_conn_int : BTM_BLE_CONN_INT_MAX_DEF), /* UINT16 conn_int_max */ 9363dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu (UINT16) ((p_dev_rec->conn_params.slave_latency != BTM_BLE_CONN_PARAM_UNDEF) ? 9379c07b33b335dfa3b4357f9ee293e1c1c03a7389aSteve Paik p_dev_rec->conn_params.slave_latency : BTM_BLE_CONN_SLAVE_LATENCY_DEF), /* UINT16 conn_latency */ 9383dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu (UINT16) ((p_dev_rec->conn_params.supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) ? 9399c07b33b335dfa3b4357f9ee293e1c1c03a7389aSteve Paik p_dev_rec->conn_params.supervision_tout : BTM_BLE_CONN_TIMEOUT_DEF), /* conn_timeout */ 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* UINT16 min_len */ 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0)) /* UINT16 max_len */ 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_release_lcb (p_lcb); 944a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_ERROR("initate direct connection fail, no resources"); 945ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (FALSE); 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 948ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 949ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_lcb->link_state = LST_CONNECTING; 9506975b4d711142b885af479721cada448952c6b41Andre Eisenbach l2cb.is_ble_connecting = TRUE; 951ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memcpy (l2cb.ble_connecting_bda, p_lcb->remote_bd_addr, BD_ADDR_LEN); 95278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_set_on_queue(p_lcb->l2c_lcb_timer, 95378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov L2CAP_BLE_LINK_CONNECT_TIMEOUT_MS, 95478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov l2c_lcb_timer_timeout, p_lcb, 95578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btu_general_alarm_queue); 956ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btm_ble_set_conn_st (BLE_DIR_CONN); 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 958ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (TRUE); 959ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 960ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 961ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 962ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 963ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 964ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function l2cble_create_conn 965ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 966ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function initiates an acl connection via HCI 967ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 968ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns TRUE if successful, FALSE if connection not started. 969ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 970ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 971ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN l2cble_create_conn (tL2C_LCB *p_lcb) 972ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 973ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_BLE_CONN_ST conn_st = btm_ble_get_conn_st(); 974ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BOOLEAN rt = FALSE; 975ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 976ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* There can be only one BLE connection request outstanding at a time */ 977ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (conn_st == BLE_CONN_IDLE) 978ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 979ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta rt = l2cble_init_direct_conn(p_lcb); 980ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 981ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 982ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 983a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING ("L2CAP - LE - cannot start new connection at conn st: %d", conn_st); 984ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 985ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btm_ble_enqueue_direct_conn_req(p_lcb); 986ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 987ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (conn_st == BLE_BG_CONN) 988ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btm_ble_suspend_bg_conn(); 989ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 990ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta rt = TRUE; 991ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 992ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return rt; 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function l2c_link_processs_ble_num_bufs 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when a "controller buffer size" 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event is first received from the controller. It updates 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the L2CAP values. 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2c_link_processs_ble_num_bufs (UINT16 num_lm_ble_bufs) 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10080082e027d5ae3f45a3a613ed720c31e35f61d0ebAndre Eisenbach if (num_lm_ble_bufs == 0) 100912c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach { 101012c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach num_lm_ble_bufs = L2C_DEF_NUM_BLE_BUF_SHARED; 101112c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach l2cb.num_lm_acl_bufs -= L2C_DEF_NUM_BLE_BUF_SHARED; 101212c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach } 101312c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cb.num_lm_ble_bufs = l2cb.controller_le_xmit_window = num_lm_ble_bufs; 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 101792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth/******************************************************************************* 101892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** 101992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** Function l2c_ble_link_adjust_allocation 102092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** 102192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** Description This function is called when a link is created or removed 102292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** to calculate the amount of packets each link may send to 102392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** the HCI without an ack coming back. 102492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** 102592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** Currently, this is a simple allocation, dividing the 102692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** number of Controller Packets by the number of links. In 102792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** the future, QOS configuration should be examined. 102892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** 102992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** Returns void 103092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** 103192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth*******************************************************************************/ 103292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananthvoid l2c_ble_link_adjust_allocation (void) 103392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth{ 103492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth UINT16 qq, yy, qq_remainder; 103592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth tL2C_LCB *p_lcb; 103692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth UINT16 hi_quota, low_quota; 103792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth UINT16 num_lowpri_links = 0; 103892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth UINT16 num_hipri_links = 0; 103992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth UINT16 controller_xmit_quota = l2cb.num_lm_ble_bufs; 104092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth UINT16 high_pri_link_quota = L2CAP_HIGH_PRI_MIN_XMIT_QUOTA_A; 104192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 104292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* If no links active, reset buffer quotas and controller buffers */ 104392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth if (l2cb.num_ble_links_active == 0) 104492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 104592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth l2cb.controller_le_xmit_window = l2cb.num_lm_ble_bufs; 104692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth l2cb.ble_round_robin_quota = l2cb.ble_round_robin_unacked = 0; 104792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth return; 104892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 104992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 105092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* First, count the links */ 105192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth for (yy = 0, p_lcb = &l2cb.lcb_pool[0]; yy < MAX_L2CAP_LINKS; yy++, p_lcb++) 105292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 105392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth if (p_lcb->in_use && p_lcb->transport == BT_TRANSPORT_LE) 105492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 105592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth if (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH) 105692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth num_hipri_links++; 105792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth else 105892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth num_lowpri_links++; 105992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 106092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 106192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 106292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* now adjust high priority link quota */ 106392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth low_quota = num_lowpri_links ? 1 : 0; 106492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth while ( (num_hipri_links * high_pri_link_quota + low_quota) > controller_xmit_quota ) 106592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth high_pri_link_quota--; 106692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 106792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 106892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* Work out the xmit quota and buffer quota high and low priorities */ 106992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth hi_quota = num_hipri_links * high_pri_link_quota; 107092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth low_quota = (hi_quota < controller_xmit_quota) ? controller_xmit_quota - hi_quota : 1; 107192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 107292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* Work out and save the HCI xmit quota for each low priority link */ 107392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 107492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* If each low priority link cannot have at least one buffer */ 107592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth if (num_lowpri_links > low_quota) 107692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 107792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth l2cb.ble_round_robin_quota = low_quota; 1078444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji qq = qq_remainder = 0; 107992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 108092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* If each low priority link can have at least one buffer */ 108192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth else if (num_lowpri_links > 0) 108292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 108392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth l2cb.ble_round_robin_quota = 0; 108492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth l2cb.ble_round_robin_unacked = 0; 108592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth qq = low_quota / num_lowpri_links; 108692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth qq_remainder = low_quota % num_lowpri_links; 108792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 108892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* If no low priority link */ 108992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth else 109092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 109192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth l2cb.ble_round_robin_quota = 0; 109292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth l2cb.ble_round_robin_unacked = 0; 1093444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji qq = qq_remainder = 0; 109492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 109592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth L2CAP_TRACE_EVENT ("l2c_ble_link_adjust_allocation num_hipri: %u num_lowpri: %u low_quota: %u round_robin_quota: %u qq: %u", 109692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth num_hipri_links, num_lowpri_links, low_quota, 109792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth l2cb.ble_round_robin_quota, qq); 109892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 109992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* Now, assign the quotas to each link */ 110092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth for (yy = 0, p_lcb = &l2cb.lcb_pool[0]; yy < MAX_L2CAP_LINKS; yy++, p_lcb++) 110192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 110292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth if (p_lcb->in_use && p_lcb->transport == BT_TRANSPORT_LE) 110392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 110492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth if (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH) 110592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 110692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth p_lcb->link_xmit_quota = high_pri_link_quota; 110792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 110892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth else 110992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 111092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* Safety check in case we switched to round-robin with something outstanding */ 111192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* if sent_not_acked is added into round_robin_unacked then don't add it again */ 111292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* l2cap keeps updating sent_not_acked for exiting from round robin */ 111392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth if (( p_lcb->link_xmit_quota > 0 )&&( qq == 0 )) 111492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth l2cb.ble_round_robin_unacked += p_lcb->sent_not_acked; 111592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 111692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth p_lcb->link_xmit_quota = qq; 111792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth if (qq_remainder > 0) 111892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 111992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth p_lcb->link_xmit_quota++; 112092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth qq_remainder--; 112192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 112292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 112392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 112492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth L2CAP_TRACE_EVENT("l2c_ble_link_adjust_allocation LCB %d Priority: %d XmitQuota: %d", 112592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth yy, p_lcb->acl_priority, p_lcb->link_xmit_quota); 112692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 112792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth L2CAP_TRACE_EVENT(" SentNotAcked: %d RRUnacked: %d", 112892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth p_lcb->sent_not_acked, l2cb.round_robin_unacked); 112992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 113092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* There is a special case where we have readjusted the link quotas and */ 113192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* this link may have sent anything but some other link sent packets so */ 113292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* so we may need a timer to kick off this link's transmissions. */ 113392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth if ( (p_lcb->link_state == LST_CONNECTED) 11346c303aeca25783453333172d0b29e5472f1b1c93Chris Manton && (!list_is_empty(p_lcb->link_xmit_data_q)) 113578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota) ) { 113678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_set_on_queue(p_lcb->l2c_lcb_timer, 113778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov L2CAP_LINK_FLOW_CONTROL_TIMEOUT_MS, 113878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov l2c_lcb_timer_timeout, p_lcb, 113978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btu_general_alarm_queue); 114078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov } 114192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 114292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 114392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth} 114492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 11457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE) 11467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 11477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11487fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function l2cble_process_rc_param_request_evt 11497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description process LE Remote Connection Parameter Request Event. 11517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns void 11537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 11547fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 11557fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battavoid l2cble_process_rc_param_request_evt(UINT16 handle, UINT16 int_min, UINT16 int_max, 11567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT16 latency, UINT16 timeout) 11577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 11587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tL2C_LCB *p_lcb = l2cu_find_lcb_by_handle (handle); 11597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 11607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_lcb != NULL) 11617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 11627fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->min_interval = int_min; 11637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->max_interval = int_max; 11647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->latency = latency; 11657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->timeout = timeout; 11667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 116797e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun /* if update is enabled, always accept connection parameter update */ 116897e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun if ((p_lcb->conn_update_mask & L2C_BLE_CONN_UPDATE_DISABLE) == 0) 11697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 11707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btsnd_hcic_ble_rc_param_req_reply(handle, int_min, int_max, latency, timeout, 0, 0); 11717fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 11727fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 11737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1174a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_EVENT ("L2CAP - LE - update currently disabled"); 117501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->conn_update_mask |= L2C_BLE_NEW_CONN_PARAM; 11767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btsnd_hcic_ble_rc_param_req_neg_reply (handle,HCI_ERR_UNACCEPT_CONN_INTERVAL); 11777fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 11787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 11797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 11807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 11817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 1182a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING("No link to update connection parameter") 11837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 11847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 11857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 11867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1187636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera/******************************************************************************* 1188636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** 1189636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** Function l2cble_update_data_length 1190636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** 1191636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** Description This function update link tx data length if applicable 1192636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** 1193636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** Returns void 1194636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** 1195636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera*******************************************************************************/ 1196636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Agheravoid l2cble_update_data_length(tL2C_LCB *p_lcb) 1197636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera{ 1198636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera UINT16 tx_mtu = 0; 1199636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera UINT16 i = 0; 1200636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 1201636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera L2CAP_TRACE_DEBUG("%s", __FUNCTION__); 1202636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 1203636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera /* See if we have a link control block for the connection */ 1204636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera if (p_lcb == NULL) 1205636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera return; 1206636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 1207636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera for (i = 0; i < L2CAP_NUM_FIXED_CHNLS; i++) 1208636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera { 1209636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera if (i + L2CAP_FIRST_FIXED_CHNL != L2CAP_BLE_SIGNALLING_CID) 1210636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera { 1211636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera if ((p_lcb->p_fixed_ccbs[i] != NULL) && 1212636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera (tx_mtu < (p_lcb->p_fixed_ccbs[i]->tx_data_len + L2CAP_PKT_OVERHEAD))) 1213636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera tx_mtu = p_lcb->p_fixed_ccbs[i]->tx_data_len + L2CAP_PKT_OVERHEAD; 1214636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera } 1215636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera } 1216636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 1217636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera if (tx_mtu > BTM_BLE_DATA_SIZE_MAX) 1218636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera tx_mtu = BTM_BLE_DATA_SIZE_MAX; 1219636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 1220636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera /* update TX data length if changed */ 1221636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera if (p_lcb->tx_data_len != tx_mtu) 1222636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera BTM_SetBleDataLength(p_lcb->remote_bd_addr, tx_mtu); 1223636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 1224636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera} 1225636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 1226636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera/******************************************************************************* 1227636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** 1228636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** Function l2cble_process_data_length_change_evt 1229636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** 1230636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** Description This function process the data length change event 1231636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** 1232636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** Returns void 1233636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** 1234636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera*******************************************************************************/ 1235636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Agheravoid l2cble_process_data_length_change_event(UINT16 handle, UINT16 tx_data_len, UINT16 rx_data_len) 1236636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera{ 1237636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera tL2C_LCB *p_lcb = l2cu_find_lcb_by_handle(handle); 1238636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 1239636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera L2CAP_TRACE_DEBUG("%s TX data len = %d", __FUNCTION__, tx_data_len); 1240636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera if (p_lcb == NULL) 1241636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera return; 1242636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 1243636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera if (tx_data_len > 0) 1244636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera p_lcb->tx_data_len = tx_data_len; 1245636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 1246636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera /* ignore rx_data len for now */ 1247636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera} 1248636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 1249636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera/******************************************************************************* 1250636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** 1251636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** Function l2cble_set_fixed_channel_tx_data_length 1252636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** 1253636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** Description This function update max fixed channel tx data length if applicable 1254636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** 1255636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** Returns void 1256636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera** 1257636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera*******************************************************************************/ 1258636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Agheravoid l2cble_set_fixed_channel_tx_data_length(BD_ADDR remote_bda, UINT16 fix_cid, UINT16 tx_mtu) 1259636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera{ 1260636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr(remote_bda, BT_TRANSPORT_LE); 1261636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera UINT16 cid = fix_cid - L2CAP_FIRST_FIXED_CHNL; 1262636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 1263636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera L2CAP_TRACE_DEBUG("%s TX MTU = %d", __FUNCTION__, tx_mtu); 1264636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 1265636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera if (!controller_get_interface()->supports_ble_packet_extension()) 1266636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera { 1267636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera L2CAP_TRACE_WARNING("%s, request not supported", __FUNCTION__); 1268636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera return; 1269636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera } 1270636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 1271636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera /* See if we have a link control block for the connection */ 1272636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera if (p_lcb == NULL) 1273636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera return; 1274636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 1275636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera if (p_lcb->p_fixed_ccbs[cid] != NULL) 1276636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera { 1277636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera if (tx_mtu > BTM_BLE_DATA_SIZE_MAX) 1278636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera tx_mtu = BTM_BLE_DATA_SIZE_MAX; 1279636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 1280636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera p_lcb->p_fixed_ccbs[cid]->tx_data_len = tx_mtu; 1281636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera } 1282636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera 1283636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera l2cble_update_data_length(p_lcb); 1284636d6714a4c08dd99d2147dcce05dc3892e804b4Priti Aghera} 12857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1286ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar/******************************************************************************* 1287ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1288ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** Function l2cble_credit_based_conn_req 1289ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1290ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** Description This function sends LE Credit Based Connection Request for 1291ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** LE connection oriented channels. 1292ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1293ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** Returns void 1294ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1295ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar*******************************************************************************/ 1296ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kocharvoid l2cble_credit_based_conn_req (tL2C_CCB *p_ccb) 1297ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar{ 1298ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (!p_ccb) 1299ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return; 1300ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1301ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (p_ccb->p_lcb && p_ccb->p_lcb->transport != BT_TRANSPORT_LE) 1302ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 1303ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_WARNING ("LE link doesn't exist"); 1304ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return; 1305ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 1306ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1307ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar l2cu_send_peer_ble_credit_based_conn_req (p_ccb); 1308ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return; 1309ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar} 1310ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1311ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar/******************************************************************************* 1312ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1313ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** Function l2cble_credit_based_conn_res 1314ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1315ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** Description This function sends LE Credit Based Connection Response for 1316ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** LE connection oriented channels. 1317ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1318ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** Returns void 1319ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1320ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar*******************************************************************************/ 1321ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kocharvoid l2cble_credit_based_conn_res (tL2C_CCB *p_ccb, UINT16 result) 1322ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar{ 1323ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (!p_ccb) 1324ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return; 1325ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1326ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (p_ccb->p_lcb && p_ccb->p_lcb->transport != BT_TRANSPORT_LE) 1327ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 1328ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_WARNING ("LE link doesn't exist"); 1329ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return; 1330ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 1331ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1332ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar l2cu_send_peer_ble_credit_based_conn_res (p_ccb, result); 1333ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return; 1334ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar} 1335ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1336ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar/******************************************************************************* 1337ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1338ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** Function l2cble_send_flow_control_credit 1339ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1340ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** Description This function sends flow control credits for 1341ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** LE connection oriented channels. 1342ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1343ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** Returns void 1344ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1345ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar*******************************************************************************/ 1346ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kocharvoid l2cble_send_flow_control_credit(tL2C_CCB *p_ccb, UINT16 credit_value) 1347ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar{ 1348ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (!p_ccb) 1349ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return; 1350ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1351ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (p_ccb->p_lcb && p_ccb->p_lcb->transport != BT_TRANSPORT_LE) 1352ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 1353ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_WARNING ("LE link doesn't exist"); 1354ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return; 1355ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 1356ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1357ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar l2cu_send_peer_ble_flow_control_credit(p_ccb, credit_value); 1358ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return; 1359ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1360ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar} 1361ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1362ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar/******************************************************************************* 1363ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1364ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** Function l2cble_send_peer_disc_req 1365ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1366ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** Description This function sends disconnect request 1367ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** to the peer LE device 1368ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1369ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** Returns void 1370ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1371ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar*******************************************************************************/ 1372ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kocharvoid l2cble_send_peer_disc_req(tL2C_CCB *p_ccb) 1373ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar{ 1374ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_DEBUG ("%s",__func__); 1375ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (!p_ccb) 1376ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return; 1377ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1378ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (p_ccb->p_lcb && p_ccb->p_lcb->transport != BT_TRANSPORT_LE) 1379ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 1380ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_WARNING ("LE link doesn't exist"); 1381ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return; 1382ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 1383ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1384ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar l2cu_send_peer_ble_credit_based_disconn_req(p_ccb); 1385ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return; 1386ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar} 1387ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1388ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar/******************************************************************************* 1389ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1390ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** Function l2cble_sec_comp 1391ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1392ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** Description This function is called when security procedure for an LE COC 1393ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** link is done 1394ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1395ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** Returns void 1396ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1397ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar*******************************************************************************/ 1398ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kocharvoid l2cble_sec_comp(BD_ADDR p_bda, tBT_TRANSPORT transport, void *p_ref_data, UINT8 status) 1399ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar{ 1400ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr(p_bda, BT_TRANSPORT_LE); 1401ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar tL2CAP_SEC_DATA *p_buf = NULL; 1402ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar UINT8 sec_flag; 1403ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar UINT8 sec_act; 1404ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1405ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (!p_lcb) 1406ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 1407ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_WARNING ("%s security complete for unknown device", __func__); 1408ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return; 1409ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 1410ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1411ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar sec_act = p_lcb->sec_act; 1412ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_lcb->sec_act = 0; 1413ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1414ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (!fixed_queue_is_empty(p_lcb->le_sec_pending_q)) 1415ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 1416ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_buf = (tL2CAP_SEC_DATA*) fixed_queue_dequeue(p_lcb->le_sec_pending_q); 1417ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (!p_buf) 1418ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 1419ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_WARNING ("%s Security complete for request not initiated from L2CAP", 1420ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar __func__); 1421ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return; 1422ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 1423ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1424ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (status != BTM_SUCCESS) 1425ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 1426ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar (*(p_buf->p_callback))(p_bda, BT_TRANSPORT_LE, p_buf->p_ref_data, status); 1427ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 1428ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar else 1429ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 1430ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (sec_act == BTM_SEC_ENCRYPT_MITM) 1431ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 1432ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar BTM_GetSecurityFlagsByTransport(p_bda, &sec_flag, transport); 1433ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (sec_flag & BTM_SEC_FLAG_LKEY_AUTHED) 1434ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar (*(p_buf->p_callback))(p_bda, BT_TRANSPORT_LE, p_buf->p_ref_data, status); 1435ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar else 1436ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 1437ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_DEBUG ("%s MITM Protection Not present", __func__); 1438ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar (*(p_buf->p_callback))(p_bda, BT_TRANSPORT_LE, p_buf->p_ref_data, 1439ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar BTM_FAILED_ON_SECURITY); 1440ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 1441ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 1442ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar else 1443ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 1444ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_DEBUG ("%s MITM Protection not required sec_act = %d", 1445ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar __func__, p_lcb->sec_act); 1446ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1447ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar (*(p_buf->p_callback))(p_bda, BT_TRANSPORT_LE, p_buf->p_ref_data, status); 1448ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 1449ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 1450ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 1451ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar else 1452ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 1453ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_WARNING ("%s Security complete for request not initiated from L2CAP", __func__); 1454ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return; 1455ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 1456ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar osi_free(p_buf); 1457ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1458ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar while (!fixed_queue_is_empty(p_lcb->le_sec_pending_q)) 1459ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 1460ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_buf = (tL2CAP_SEC_DATA*) fixed_queue_dequeue(p_lcb->le_sec_pending_q); 1461ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1462ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (status != BTM_SUCCESS) 1463ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar (*(p_buf->p_callback))(p_bda, BT_TRANSPORT_LE, p_buf->p_ref_data, status); 1464ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar else 1465ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar l2ble_sec_access_req(p_bda, p_buf->psm, p_buf->is_originator, 1466ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_buf->p_callback, p_buf->p_ref_data); 1467ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1468ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar osi_free(p_buf); 1469ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 1470ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar} 1471ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1472ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar/******************************************************************************* 1473ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1474ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** Function l2ble_sec_access_req 1475ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1476ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** Description This function is called by LE COC link to meet the 1477ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** security requirement for the link 1478ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1479ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** Returns TRUE - security procedures are started 1480ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** FALSE - failure 1481ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar** 1482ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar*******************************************************************************/ 1483ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin KocharBOOLEAN l2ble_sec_access_req(BD_ADDR bd_addr, UINT16 psm, BOOLEAN is_originator, tL2CAP_SEC_CBACK *p_callback, void *p_ref_data) 1484ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar{ 1485ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_DEBUG ("%s", __func__); 1486ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar BOOLEAN status; 1487ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar tL2C_LCB *p_lcb = NULL; 1488ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1489ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (!p_callback) 1490ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 1491ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_ERROR("%s No callback function", __func__); 1492ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return FALSE; 1493ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 1494ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1495ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_LE); 1496ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1497ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (!p_lcb) 1498ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 1499ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar L2CAP_TRACE_ERROR ("%s Security check for unknown device", __func__); 1500ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_callback(bd_addr, BT_TRANSPORT_LE, p_ref_data, BTM_UNKNOWN_ADDR); 1501ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return FALSE; 1502ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 1503ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1504ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar tL2CAP_SEC_DATA *p_buf = (tL2CAP_SEC_DATA*) osi_malloc((UINT16)sizeof(tL2CAP_SEC_DATA)); 1505ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar if (!p_buf) 1506ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar { 1507ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_callback(bd_addr, BT_TRANSPORT_LE, p_ref_data, BTM_NO_RESOURCES); 1508ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return FALSE; 1509ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar } 1510ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1511ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_buf->psm = psm; 1512ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_buf->is_originator = is_originator; 1513ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_buf->p_callback = p_callback; 1514ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar p_buf->p_ref_data = p_ref_data; 1515ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar fixed_queue_enqueue(p_lcb->le_sec_pending_q, p_buf); 1516ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar status = btm_ble_start_sec_check(bd_addr, psm, is_originator, &l2cble_sec_comp, p_ref_data); 1517ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar 1518ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar return status; 1519ab99638f9a05ae7ed04ab0a75d48cbd1d78b36e8Navin Kochar} 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* (BLE_INCLUDED == TRUE) */ 1521