15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2009-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * this file contains functions relating to BLE management. 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 275cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "bt_utils.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2cdefs.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_int.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE) 3597e75b73a57602b7d9771f28216630ba32fd702aChaojing Sunstatic void l2cble_start_conn_update (tL2C_LCB *p_lcb); 367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 37ed534e330bf63c72e778fc8daae09ddd63c395b2Wei Wang#include "vendor_ble.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function L2CA_CancelBleConnectReq 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Cancel a pending connection attempt to a BLE device. 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: BD Address of remote 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Return value: TRUE if connection was cancelled 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN L2CA_CancelBleConnectReq (BD_ADDR rem_bda) 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2C_LCB *p_lcb; 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There can be only one BLE connection request outstanding at a time */ 546975b4d711142b885af479721cada448952c6b41Andre Eisenbach if (btm_ble_get_conn_st() == BLE_CONN_IDLE) 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 56a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING ("L2CA_CancelBleConnectReq - no connection pending"); 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (memcmp (rem_bda, l2cb.ble_connecting_bda, BD_ADDR_LEN)) 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 62a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING ("L2CA_CancelBleConnectReq - different BDA Connecting: %08x%04x Cancel: %08x%04x", 635738f83aeb59361a0a2eda2460113f6dc919427The 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], 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (l2cb.ble_connecting_bda[4]<<8)+l2cb.ble_connecting_bda[5], 655738f83aeb59361a0a2eda2460113f6dc919427The 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]); 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btsnd_hcic_ble_create_conn_cancel()) 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE)) != NULL) 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_lcb->disc_reason = L2CAP_CONN_CANCEL; 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_release_lcb (p_lcb); 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 786975b4d711142b885af479721cada448952c6b41Andre Eisenbach /* update state to be cancel, wait for connection cancel complete */ 796975b4d711142b885af479721cada448952c6b41Andre Eisenbach btm_ble_set_conn_st (BLE_CONN_CANCEL); 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8715d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu/******************************************************************************* 8815d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu** 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function L2CA_UpdateBleConnParams 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Update BLE connection parameters. 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: BD Address of remote 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Return value: TRUE if update started 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 987fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaBOOLEAN L2CA_UpdateBleConnParams (BD_ADDR rem_bda, UINT16 min_int, UINT16 max_int, 997fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT16 latency, UINT16 timeout) 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10101a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach tL2C_LCB *p_lcb; 10201a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach tACL_CONN *p_acl_cb = btm_bda_to_acl(rem_bda, BT_TRANSPORT_LE); 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10401a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach /* See if we have a link control block for the remote device */ 10501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE); 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach /* If we don't have one, create one and accept the connection. */ 10801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach if (!p_lcb || !p_acl_cb) 10901a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach { 11001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach L2CAP_TRACE_WARNING ("L2CA_UpdateBleConnParams - unknown BD_ADDR %08x%04x", 11101a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], 11201a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach (rem_bda[4]<<8)+rem_bda[5]); 11301a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach return(FALSE); 11401a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach } 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach if (p_lcb->transport != BT_TRANSPORT_LE) 11701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach { 11801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach L2CAP_TRACE_WARNING ("L2CA_UpdateBleConnParams - BD_ADDR %08x%04x not LE", 11901a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], 12001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach (rem_bda[4]<<8)+rem_bda[5]); 12101a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach return(FALSE); 12201a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach } 12397e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 12401a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->min_interval = min_int; 12501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->max_interval = max_int; 12601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->latency = latency; 12701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->timeout = timeout; 12801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->conn_update_mask |= L2C_BLE_NEW_CONN_PARAM; 12997e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 13001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach l2cble_start_conn_update(p_lcb); 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13201a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach return(TRUE); 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function L2CA_EnableUpdateBleConnParams 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Enable or disable update based on the request from the peer 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters: BD Address of remote 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Return value: TRUE if update started 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN L2CA_EnableUpdateBleConnParams (BD_ADDR rem_bda, BOOLEAN enable) 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2C_LCB *p_lcb; 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* See if we have a link control block for the remote device */ 1527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb = l2cu_find_lcb_by_bd_addr (rem_bda, BT_TRANSPORT_LE); 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_lcb) 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 156a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING ("L2CA_EnableUpdateBleConnParams - unknown BD_ADDR %08x%04x", 1577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], 1587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (rem_bda[4]<<8)+rem_bda[5]); 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (FALSE); 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 162a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_API ("%s - BD_ADDR %08x%04x enable %d current upd state 0x%02x",__FUNCTION__, 1637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], 1647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (rem_bda[4]<<8)+rem_bda[5], enable, p_lcb->conn_update_mask); 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach if (p_lcb->transport != BT_TRANSPORT_LE) 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach L2CAP_TRACE_WARNING ("%s - BD_ADDR %08x%04x not LE (link role %d)", __FUNCTION__, 1697fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (rem_bda[0]<<24)+(rem_bda[1]<<16)+(rem_bda[2]<<8)+rem_bda[3], 1707fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta (rem_bda[4]<<8)+rem_bda[5], p_lcb->link_role); 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (FALSE); 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (enable) 17597e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun p_lcb->conn_update_mask &= ~L2C_BLE_CONN_UPDATE_DISABLE; 17697e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun else 17797e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun p_lcb->conn_update_mask |= L2C_BLE_CONN_UPDATE_DISABLE; 17815d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu 17997e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun l2cble_start_conn_update(p_lcb); 18015d0a0c580ba8940133b2d0977176e8e30ffe6a5Zhihai Xu 1817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return (TRUE); 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function L2CA_GetBleConnRole 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function returns the connection role. 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns link role. 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 L2CA_GetBleConnRole (BD_ADDR bd_addr) 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 role = HCI_ROLE_UNKNOWN; 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2C_LCB *p_lcb; 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2007fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_lcb = l2cu_find_lcb_by_bd_addr (bd_addr, BT_TRANSPORT_LE)) != NULL) 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project role = p_lcb->link_role; 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return role; 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function L2CA_GetDisconnectReason 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function returns the disconnect reason code. 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns disconnect reason 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2147fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattaUINT16 L2CA_GetDisconnectReason (BD_ADDR remote_bda, tBT_TRANSPORT transport) 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2C_LCB *p_lcb; 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 reason = 0; 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2197fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if ((p_lcb = l2cu_find_lcb_by_bd_addr (remote_bda, transport)) != NULL) 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reason = p_lcb->disc_reason; 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 222a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_DEBUG ("L2CA_GetDisconnectReason=%d ",reason); 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return reason; 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2299c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera** Function l2cble_notify_le_connection 2309c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera** 2319c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera** Description This function notifiy the l2cap connection to the app layer 2329c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera** 2339c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera** Returns none 2349c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera** 2359c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera*******************************************************************************/ 2369c29d08bc7c6da33db5cfc777404354c6dca845cPriti Agheravoid l2cble_notify_le_connection (BD_ADDR bda) 2379c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera{ 2389c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE); 2397ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham tACL_CONN *p_acl = btm_bda_to_acl(bda, BT_TRANSPORT_LE) ; 2409c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera 2417ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham if (p_lcb != NULL && p_acl != NULL && p_lcb->link_state != LST_CONNECTED) 2427ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham { 2437ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham /* update link status */ 2447ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham btm_establish_continue(p_acl); 2457ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham /* update l2cap link status and send callback */ 2467ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham p_lcb->link_state = LST_CONNECTED; 2479c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera l2cu_process_fixed_chnl_resp (p_lcb); 2487ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham } 2499c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera} 2509c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera 2519c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera/******************************************************************************* 2529c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera** 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function l2cble_scanner_conn_comp 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when an HCI Connection Complete 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event is received while we are a scanner (so we are master). 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 261ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid l2cble_scanner_conn_comp (UINT16 handle, BD_ADDR bda, tBLE_ADDR_TYPE type, 262ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 conn_interval, UINT16 conn_latency, UINT16 conn_timeout) 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2C_LCB *p_lcb; 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (bda); 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 267a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_DEBUG ("l2cble_scanner_conn_comp: HANDLE=%d addr_type=%d conn_interval=%d slave_latency=%d supervision_tout=%d", 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle, type, conn_interval, conn_latency, conn_timeout); 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cb.is_ble_connecting = FALSE; 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* See if we have a link control block for the remote device */ 2737fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE); 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we don't have one, create one. this is auto connection complete. */ 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_lcb) 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2787fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb = l2cu_allocate_lcb (bda, FALSE, BT_TRANSPORT_LE); 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_lcb) 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION); 282a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_ERROR ("l2cble_scanner_conn_comp - failed to allocate LCB"); 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2875738f83aeb59361a0a2eda2460113f6dc919427The 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)) 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION); 290a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING ("l2cble_scanner_conn_comp - LCB but no CCB"); 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ; 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (p_lcb->link_state != LST_CONNECTING) 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 297a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_ERROR ("L2CAP got BLE scanner conn_comp in bad state: %d", p_lcb->link_state); 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer(&p_lcb->timer_entry); 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save the handle */ 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_lcb->handle = handle; 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Connected OK. Change state to connected, we were scanning so we are master */ 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_lcb->link_role = HCI_ROLE_MASTER; 3077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->transport = BT_TRANSPORT_LE; 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30901a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach /* update link parameter, set slave link as non-spec default upon link up */ 31001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->min_interval = p_lcb->max_interval = conn_interval; 31101a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->timeout = conn_timeout; 31201a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->latency = conn_latency; 31301a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->conn_update_mask = L2C_BLE_NOT_DEFAULT_PARAM; 31401a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there are any preferred connection parameters, set them now */ 316ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ( (p_dev_rec->conn_params.min_conn_int >= BTM_BLE_CONN_INT_MIN ) && 317ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (p_dev_rec->conn_params.min_conn_int <= BTM_BLE_CONN_INT_MAX ) && 318ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (p_dev_rec->conn_params.max_conn_int >= BTM_BLE_CONN_INT_MIN ) && 319ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (p_dev_rec->conn_params.max_conn_int <= BTM_BLE_CONN_INT_MAX ) && 320ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (p_dev_rec->conn_params.slave_latency <= BTM_BLE_CONN_LATENCY_MAX ) && 321ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (p_dev_rec->conn_params.supervision_tout >= BTM_BLE_CONN_SUP_TOUT_MIN) && 322ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (p_dev_rec->conn_params.supervision_tout <= BTM_BLE_CONN_SUP_TOUT_MAX) && 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((conn_interval < p_dev_rec->conn_params.min_conn_int && 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) || 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (conn_interval > p_dev_rec->conn_params.max_conn_int) || 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (conn_latency > p_dev_rec->conn_params.slave_latency) || 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (conn_timeout > p_dev_rec->conn_params.supervision_tout))) 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 329a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_ERROR ("upd_ll_conn_params: HANDLE=%d min_conn_int=%d max_conn_int=%d slave_latency=%d supervision_tout=%d", 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project handle, p_dev_rec->conn_params.min_conn_int, p_dev_rec->conn_params.max_conn_int, 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->conn_params.slave_latency, p_dev_rec->conn_params.supervision_tout); 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 33301a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->min_interval = p_dev_rec->conn_params.min_conn_int; 33401a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->max_interval = p_dev_rec->conn_params.max_conn_int; 33501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->timeout = p_dev_rec->conn_params.supervision_tout; 33601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->latency = p_dev_rec->conn_params.slave_latency; 33701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btsnd_hcic_ble_upd_ll_conn_params (handle, 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->conn_params.min_conn_int, 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->conn_params.max_conn_int, 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->conn_params.slave_latency, 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec->conn_params.supervision_tout, 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, 0); 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell BTM Acl management about the link */ 3477fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_acl_created (bda, NULL, p_dev_rec->sec_bd_name, handle, p_lcb->link_role, BT_TRANSPORT_LE); 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3495738f83aeb59361a0a2eda2460113f6dc919427The 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; 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_ble_set_conn_st(BLE_CONN_IDLE); 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function l2cble_advertiser_conn_comp 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when an HCI Connection Complete 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event is received while we are an advertiser (so we are slave). 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2cble_advertiser_conn_comp (UINT16 handle, BD_ADDR bda, tBLE_ADDR_TYPE type, 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 conn_interval, UINT16 conn_latency, UINT16 conn_timeout) 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tL2C_LCB *p_lcb; 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 3705cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(type); 3715cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(conn_interval); 3725cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(conn_latency); 3735cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(conn_timeout); 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* See if we have a link control block for the remote device */ 3767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb = l2cu_find_lcb_by_bd_addr (bda, BT_TRANSPORT_LE); 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we don't have one, create one and accept the connection. */ 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_lcb) 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb = l2cu_allocate_lcb (bda, FALSE, BT_TRANSPORT_LE); 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_lcb) 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION); 385a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_ERROR ("l2cble_advertiser_conn_comp - failed to allocate LCB"); 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3905738f83aeb59361a0a2eda2460113f6dc919427The 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)) 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_sec_disconnect (handle, HCI_ERR_NO_CONNECTION); 393a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING ("l2cble_scanner_conn_comp - LCB but no CCB"); 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ; 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save the handle */ 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_lcb->handle = handle; 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Connected OK. Change state to connected, we were advertising, so we are slave */ 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_lcb->link_role = HCI_ROLE_SLAVE; 4047fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->transport = BT_TRANSPORT_LE; 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach /* update link parameter, set slave link as non-spec default upon link up */ 40701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->min_interval = p_lcb->max_interval = conn_interval; 40801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->timeout = conn_timeout; 40901a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->latency = conn_latency; 41001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->conn_update_mask = L2C_BLE_NOT_DEFAULT_PARAM; 41101a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Tell BTM Acl management about the link */ 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev_rec = btm_find_or_alloc_dev (bda); 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4157fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btm_acl_created (bda, NULL, p_dev_rec->sec_bd_name, handle, p_lcb->link_role, BT_TRANSPORT_LE); 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4175738f83aeb59361a0a2eda2460113f6dc919427The 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; 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4199c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera if (!HCI_LE_SLAVE_INIT_FEAT_EXC_SUPPORTED(btm_cb.devcb.local_le_features)) 4209c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera { 4217ae25156f4250af9d0e8cd8d559d916cfb847febPrerepa Viswanadham p_lcb->link_state = LST_CONNECTED; 4229c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera l2cu_process_fixed_chnl_resp (p_lcb); 4239c29d08bc7c6da33db5cfc777404354c6dca845cPriti Aghera } 4247fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 4257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* when adv and initiating are both active, cancel the direct connection */ 4267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (l2cb.is_ble_connecting && memcmp(bda, l2cb.ble_connecting_bda, BD_ADDR_LEN) == 0) 4277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 4287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta L2CA_CancelBleConnectReq(bda); 4297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function l2cble_conn_comp 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when an HCI Connection Complete 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event is received. 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2cble_conn_comp(UINT16 handle, UINT8 role, BD_ADDR bda, tBLE_ADDR_TYPE type, 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 conn_interval, UINT16 conn_latency, UINT16 conn_timeout) 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (role == HCI_ROLE_MASTER) 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cble_scanner_conn_comp(handle, bda, type, conn_interval, conn_latency, conn_timeout); 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cble_advertiser_conn_comp(handle, bda, type, conn_interval, conn_latency, conn_timeout); 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 45497e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 45597e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun/******************************************************************************* 45697e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** 45797e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** Function l2cble_start_conn_update 45897e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** 45997e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** Description start BLE connection parameter update process based on status 46097e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** 46197e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** Parameters: lcb : l2cap link control block 46297e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** 46397e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** Return value: none 46497e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** 46597e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun*******************************************************************************/ 46697e75b73a57602b7d9771f28216630ba32fd702aChaojing Sunstatic void l2cble_start_conn_update (tL2C_LCB *p_lcb) 46797e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun{ 46801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach UINT16 min_conn_int, max_conn_int, slave_latency, supervision_tout; 46997e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev(p_lcb->remote_bd_addr); 47001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach tACL_CONN *p_acl_cb = btm_bda_to_acl(p_lcb->remote_bd_addr, BT_TRANSPORT_LE); 47197e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 47297e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun if (p_lcb->conn_update_mask & L2C_BLE_UPDATE_PENDING) return; 47397e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 47497e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun if (p_lcb->conn_update_mask & L2C_BLE_CONN_UPDATE_DISABLE) 47597e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun { 47697e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun /* application requests to disable parameters update. 47797e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun If parameters are already updated, lets set them 47897e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun up to what has been requested during connection establishement */ 47901a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach if (p_lcb->conn_update_mask & L2C_BLE_NOT_DEFAULT_PARAM && 48001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach /* current connection interval is greater than default min */ 48101a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->min_interval > BTM_BLE_CONN_INT_MIN) 48297e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun { 48301a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach /* use 7.5 ms as fast connection parameter, 0 slave latency */ 48401a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach min_conn_int = max_conn_int = BTM_BLE_CONN_INT_MIN; 48501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach slave_latency = BTM_BLE_CONN_SLAVE_LATENCY_DEF; 48601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach supervision_tout = BTM_BLE_CONN_TIMEOUT_DEF; 48701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach 48801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach /* if both side 4.1, or we are master device, send HCI command */ 48901a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach if (p_lcb->link_role == HCI_ROLE_MASTER 49001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE) 49101a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach || (HCI_LE_CONN_PARAM_REQ_SUPPORTED(btm_cb.devcb.local_le_features) && 49201a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach HCI_LE_CONN_PARAM_REQ_SUPPORTED(p_acl_cb->peer_le_features)) 49301a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach#endif 49401a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach ) 49501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach { 49601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach btsnd_hcic_ble_upd_ll_conn_params(p_lcb->handle, min_conn_int, max_conn_int, 49701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach slave_latency, supervision_tout, 0, 0); 49801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->conn_update_mask |= L2C_BLE_UPDATE_PENDING; 49901a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach } 50001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach else 50101a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach { 50201a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach l2cu_send_peer_ble_par_req (p_lcb, min_conn_int, max_conn_int, slave_latency, supervision_tout); 50301a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach } 50497e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun p_lcb->conn_update_mask &= ~L2C_BLE_NOT_DEFAULT_PARAM; 50501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->conn_update_mask |= L2C_BLE_NEW_CONN_PARAM; 50601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach } 50797e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun } 50897e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun else 50997e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun { 51097e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun /* application allows to do update, if we were delaying one do it now */ 51197e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun if (p_lcb->conn_update_mask & L2C_BLE_NEW_CONN_PARAM) 51297e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun { 51301a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach /* if both side 4.1, or we are master device, send HCI command */ 51401a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach if (p_lcb->link_role == HCI_ROLE_MASTER 51501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE) 51601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach || (HCI_LE_CONN_PARAM_REQ_SUPPORTED(btm_cb.devcb.local_le_features) && 51701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach HCI_LE_CONN_PARAM_REQ_SUPPORTED(p_acl_cb->peer_le_features)) 51801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach#endif 51901a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach ) 52001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach { 52101a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach btsnd_hcic_ble_upd_ll_conn_params(p_lcb->handle, p_lcb->min_interval, 52201a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->max_interval, p_lcb->latency, p_lcb->timeout, 0, 0); 52301a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->conn_update_mask |= L2C_BLE_UPDATE_PENDING; 52401a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach } 52501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach else 52601a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach { 52701a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach l2cu_send_peer_ble_par_req (p_lcb, p_lcb->min_interval, p_lcb->max_interval, 52801a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->latency, p_lcb->timeout); 52901a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach } 53097e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun p_lcb->conn_update_mask &= ~L2C_BLE_NEW_CONN_PARAM; 53101a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->conn_update_mask |= L2C_BLE_NOT_DEFAULT_PARAM; 53297e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun } 53397e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun } 53497e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun} 53597e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 53697e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun/******************************************************************************* 53797e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** 53897e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** Function l2cble_process_conn_update_evt 53997e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** 54097e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** Description This function enables the connection update request from remote 54197e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** after a successful connection update response is received. 54297e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** 54397e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** Returns void 54497e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun** 54597e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun*******************************************************************************/ 54697e75b73a57602b7d9771f28216630ba32fd702aChaojing Sunvoid l2cble_process_conn_update_evt (UINT16 handle, UINT8 status) 54797e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun{ 54897e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun tL2C_LCB *p_lcb; 54997e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 55097e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun L2CAP_TRACE_DEBUG("l2cble_process_conn_update_evt"); 55197e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 55297e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun /* See if we have a link control block for the remote device */ 55397e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun p_lcb = l2cu_find_lcb_by_handle(handle); 55497e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun if (!p_lcb) 55597e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun { 55697e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun L2CAP_TRACE_WARNING("l2cble_process_conn_update_evt: Invalid handle: %d", handle); 55797e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun return; 55897e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun } 55997e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 56097e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun p_lcb->conn_update_mask &= ~L2C_BLE_UPDATE_PENDING; 56197e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 56297e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun if (status != HCI_SUCCESS) 56397e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun { 56497e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun L2CAP_TRACE_WARNING("l2cble_process_conn_update_evt: Error status: %d", status); 56597e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun } 56697e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 56797e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun l2cble_start_conn_update(p_lcb); 56897e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun 56997e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun L2CAP_TRACE_DEBUG("l2cble_process_conn_update_evt: conn_update_mask=%d", p_lcb->conn_update_mask); 57097e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun} 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function l2cble_process_sig_cmd 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when a signalling packet is received 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** on the BLE signalling CID 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2cble_process_sig_cmd (tL2C_LCB *p_lcb, UINT8 *p, UINT16 pkt_len) 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_pkt_end; 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 cmd_code, id; 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 cmd_len, rej_reason; 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 result; 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 min_interval, max_interval, latency, timeout; 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_pkt_end = p + pkt_len; 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (cmd_code, p); 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT8 (id, p); 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16 (cmd_len, p); 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check command length does not exceed packet length */ 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p + cmd_len) > p_pkt_end) 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 598a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING ("L2CAP - LE - format error, pkt_len: %d cmd_len: %d code: %d", pkt_len, cmd_len, cmd_code); 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (cmd_code) 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case L2CAP_CMD_REJECT: 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case L2CAP_CMD_ECHO_RSP: 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case L2CAP_CMD_INFO_RSP: 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16 (rej_reason, p); 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case L2CAP_CMD_ECHO_REQ: 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case L2CAP_CMD_INFO_REQ: 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0); 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case L2CAP_CMD_BLE_UPDATE_REQ: 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16 (min_interval, p); /* 0x0006 - 0x0C80 */ 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16 (max_interval, p); /* 0x0006 - 0x0C80 */ 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16 (latency, p); /* 0x0000 - 0x03E8 */ 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16 (timeout, p); /* 0x000A - 0x0C80 */ 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If we are a master, the slave wants to update the parameters */ 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_lcb->link_role == HCI_ROLE_MASTER) 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 622ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (min_interval < BTM_BLE_CONN_INT_MIN || min_interval > BTM_BLE_CONN_INT_MAX || 623ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta max_interval < BTM_BLE_CONN_INT_MIN || max_interval > BTM_BLE_CONN_INT_MAX || 624ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta latency > BTM_BLE_CONN_LATENCY_MAX || 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /*(timeout >= max_interval && latency > (timeout * 10/(max_interval * 1.25) - 1)) ||*/ 626ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta timeout < BTM_BLE_CONN_SUP_TOUT_MIN || timeout > BTM_BLE_CONN_SUP_TOUT_MAX || 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project max_interval < min_interval) 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 629ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta l2cu_send_peer_ble_par_rsp (p_lcb, L2CAP_CFG_UNACCEPTABLE_PARAMS, id); 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_send_peer_ble_par_rsp (p_lcb, L2CAP_CFG_OK, id); 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->min_interval = min_interval; 6377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->max_interval = max_interval; 6387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->latency = latency; 6397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->timeout = timeout; 64097e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun p_lcb->conn_update_mask |= L2C_BLE_NEW_CONN_PARAM; 6417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 64297e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun l2cble_start_conn_update(p_lcb); 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_NOT_UNDERSTOOD, id, 0, 0); 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case L2CAP_CMD_BLE_UPDATE_RSP: 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16 (result, p); 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 654a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING ("L2CAP - LE - unknown cmd code: %d", cmd_code); 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 return; 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 662ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function l2cble_init_direct_conn 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 664ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function is to initate a direct connection 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 666ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns TRUE connection initiated, FALSE otherwise. 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 669ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN l2cble_init_direct_conn (tL2C_LCB *p_lcb) 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec = btm_find_or_alloc_dev (p_lcb->remote_bd_addr); 672ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; 673ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 scan_int, scan_win; 674ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BD_ADDR init_addr; 675ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 init_addr_type = BLE_ADDR_PUBLIC, 676ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta own_addr_type = BLE_ADDR_PUBLIC; 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* There can be only one BLE connection request outstanding at a time */ 679ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_dev_rec == NULL) 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 681a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING ("unknown device, can not initate connection"); 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 685ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta scan_int = (p_cb->scan_int == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_FAST_INT : p_cb->scan_int; 686ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta scan_win = (p_cb->scan_win == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_SCAN_FAST_WIN : p_cb->scan_win; 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 688ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta init_addr_type = p_lcb->ble_addr_type; 689ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memcpy(init_addr, p_lcb->remote_bd_addr, BD_ADDR_LEN); 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6917fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if BLE_PRIVACY_SPT == TRUE 692d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji /* if RPA offloading supported */ 693d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji if (btm_ble_vendor_irk_list_load_dev(p_dev_rec)) 694d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji btm_random_pseudo_to_public(init_addr, &init_addr_type); 695d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji /* otherwise, if remote is RPA enabled, use latest RPA */ 696d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji else if (p_dev_rec->ble.active_addr_type == BTM_BLE_ADDR_RRA) 6978b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu { 6988b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu init_addr_type = BLE_ADDR_RANDOM; 699d5aa24750c2202ce944560c2c27ead0214e8350dSatya Calloji memcpy(init_addr, p_dev_rec->ble.cur_rand_addr, BD_ADDR_LEN); 7008b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu } 7017fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta /* if privacy is on and current do not consider using reconnection address */ 7027fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (btm_cb.ble_ctr_cb.privacy ) /* && p_dev_rec->ble.use_reconn_addr */ 7037fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta own_addr_type = BLE_ADDR_RANDOM; 7048b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu#endif 7058b35b3fccc065730e6f0ee1050d3e4528e58ea37Zhihai Xu 7067fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (!btm_ble_topology_check(BTM_BLE_STATE_INIT)) 7077fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 7087fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta l2cu_release_lcb (p_lcb); 709a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_ERROR("initate direct connection fail, topology limitation"); 7107fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta return FALSE; 7117fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 71216fe0822ccd3eb6f66d3afd9965d25a0a0cb4c30Prerepa Viswanadham 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_create_ll_conn (scan_int,/* UINT16 scan_int */ 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project scan_win, /* UINT16 scan_win */ 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FALSE, /* UINT8 white_list */ 7166975b4d711142b885af479721cada448952c6b41Andre Eisenbach init_addr_type, /* UINT8 addr_type_peer */ 7176975b4d711142b885af479721cada448952c6b41Andre Eisenbach init_addr, /* BD_ADDR bda_peer */ 7186975b4d711142b885af479721cada448952c6b41Andre Eisenbach own_addr_type, /* UINT8 addr_type_own */ 7193dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu (UINT16) ((p_dev_rec->conn_params.min_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ? 72001a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_dev_rec->conn_params.min_conn_int : BTM_BLE_CONN_INT_MIN_DEF), /* UINT16 conn_int_min */ 7213dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu (UINT16) ((p_dev_rec->conn_params.max_conn_int != BTM_BLE_CONN_PARAM_UNDEF) ? 72201a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_dev_rec->conn_params.max_conn_int : BTM_BLE_CONN_INT_MAX_DEF), /* UINT16 conn_int_max */ 7233dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu (UINT16) ((p_dev_rec->conn_params.slave_latency != BTM_BLE_CONN_PARAM_UNDEF) ? 7249c07b33b335dfa3b4357f9ee293e1c1c03a7389aSteve Paik p_dev_rec->conn_params.slave_latency : BTM_BLE_CONN_SLAVE_LATENCY_DEF), /* UINT16 conn_latency */ 7253dc5945f1d62f9d30c7fcd4b1fe4077a3ba2f605Zhihai Xu (UINT16) ((p_dev_rec->conn_params.supervision_tout != BTM_BLE_CONN_PARAM_UNDEF) ? 7269c07b33b335dfa3b4357f9ee293e1c1c03a7389aSteve Paik p_dev_rec->conn_params.supervision_tout : BTM_BLE_CONN_TIMEOUT_DEF), /* conn_timeout */ 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, /* UINT16 min_len */ 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0)) /* UINT16 max_len */ 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cu_release_lcb (p_lcb); 731a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_ERROR("initate direct connection fail, no resources"); 732ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (FALSE); 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 735ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 736ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_lcb->link_state = LST_CONNECTING; 7376975b4d711142b885af479721cada448952c6b41Andre Eisenbach l2cb.is_ble_connecting = TRUE; 738ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memcpy (l2cb.ble_connecting_bda, p_lcb->remote_bd_addr, BD_ADDR_LEN); 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_BLE_LINK_CONNECT_TOUT); 740ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btm_ble_set_conn_st (BLE_DIR_CONN); 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 742ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (TRUE); 743ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 744ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 745ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 746ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 747ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 748ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function l2cble_create_conn 749ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 750ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function initiates an acl connection via HCI 751ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 752ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns TRUE if successful, FALSE if connection not started. 753ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 754ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 755ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN l2cble_create_conn (tL2C_LCB *p_lcb) 756ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 757ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBTM_BLE_CONN_ST conn_st = btm_ble_get_conn_st(); 758ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BOOLEAN rt = FALSE; 759ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 760ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* There can be only one BLE connection request outstanding at a time */ 761ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (conn_st == BLE_CONN_IDLE) 762ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 763ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta rt = l2cble_init_direct_conn(p_lcb); 764ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 765ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 766ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 767a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING ("L2CAP - LE - cannot start new connection at conn st: %d", conn_st); 768ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 769ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btm_ble_enqueue_direct_conn_req(p_lcb); 770ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 771ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (conn_st == BLE_BG_CONN) 772ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btm_ble_suspend_bg_conn(); 773ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 774ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta rt = TRUE; 775ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 776ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return rt; 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function l2c_link_processs_ble_num_bufs 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when a "controller buffer size" 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event is first received from the controller. It updates 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the L2CAP values. 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid l2c_link_processs_ble_num_bufs (UINT16 num_lm_ble_bufs) 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7920082e027d5ae3f45a3a613ed720c31e35f61d0ebAndre Eisenbach if (num_lm_ble_bufs == 0) 79312c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach { 79412c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach num_lm_ble_bufs = L2C_DEF_NUM_BLE_BUF_SHARED; 79512c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach l2cb.num_lm_acl_bufs -= L2C_DEF_NUM_BLE_BUF_SHARED; 79612c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach } 79712c3f496c3612472a22cbb0afd89812b154b4186Andre Eisenbach 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project l2cb.num_lm_ble_bufs = l2cb.controller_le_xmit_window = num_lm_ble_bufs; 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 80192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth/******************************************************************************* 80292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** 80392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** Function l2c_ble_link_adjust_allocation 80492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** 80592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** Description This function is called when a link is created or removed 80692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** to calculate the amount of packets each link may send to 80792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** the HCI without an ack coming back. 80892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** 80992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** Currently, this is a simple allocation, dividing the 81092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** number of Controller Packets by the number of links. In 81192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** the future, QOS configuration should be examined. 81292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** 81392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** Returns void 81492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth** 81592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth*******************************************************************************/ 81692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananthvoid l2c_ble_link_adjust_allocation (void) 81792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth{ 81892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth UINT16 qq, yy, qq_remainder; 81992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth tL2C_LCB *p_lcb; 82092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth UINT16 hi_quota, low_quota; 82192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth UINT16 num_lowpri_links = 0; 82292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth UINT16 num_hipri_links = 0; 82392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth UINT16 controller_xmit_quota = l2cb.num_lm_ble_bufs; 82492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth UINT16 high_pri_link_quota = L2CAP_HIGH_PRI_MIN_XMIT_QUOTA_A; 82592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 82692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* If no links active, reset buffer quotas and controller buffers */ 82792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth if (l2cb.num_ble_links_active == 0) 82892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 82992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth l2cb.controller_le_xmit_window = l2cb.num_lm_ble_bufs; 83092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth l2cb.ble_round_robin_quota = l2cb.ble_round_robin_unacked = 0; 83192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth return; 83292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 83392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 83492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* First, count the links */ 83592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth for (yy = 0, p_lcb = &l2cb.lcb_pool[0]; yy < MAX_L2CAP_LINKS; yy++, p_lcb++) 83692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 83792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth if (p_lcb->in_use && p_lcb->transport == BT_TRANSPORT_LE) 83892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 83992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth if (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH) 84092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth num_hipri_links++; 84192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth else 84292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth num_lowpri_links++; 84392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 84492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 84592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 84692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* now adjust high priority link quota */ 84792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth low_quota = num_lowpri_links ? 1 : 0; 84892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth while ( (num_hipri_links * high_pri_link_quota + low_quota) > controller_xmit_quota ) 84992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth high_pri_link_quota--; 85092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 85192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 85292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* Work out the xmit quota and buffer quota high and low priorities */ 85392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth hi_quota = num_hipri_links * high_pri_link_quota; 85492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth low_quota = (hi_quota < controller_xmit_quota) ? controller_xmit_quota - hi_quota : 1; 85592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 85692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* Work out and save the HCI xmit quota for each low priority link */ 85792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 85892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* If each low priority link cannot have at least one buffer */ 85992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth if (num_lowpri_links > low_quota) 86092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 86192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth l2cb.ble_round_robin_quota = low_quota; 862472c2a7bb0ac070e596084f9422157f7872c6dcaPrerepa Viswanadham qq = qq_remainder = 1; 86392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 86492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* If each low priority link can have at least one buffer */ 86592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth else if (num_lowpri_links > 0) 86692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 86792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth l2cb.ble_round_robin_quota = 0; 86892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth l2cb.ble_round_robin_unacked = 0; 86992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth qq = low_quota / num_lowpri_links; 87092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth qq_remainder = low_quota % num_lowpri_links; 87192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 87292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* If no low priority link */ 87392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth else 87492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 87592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth l2cb.ble_round_robin_quota = 0; 87692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth l2cb.ble_round_robin_unacked = 0; 877472c2a7bb0ac070e596084f9422157f7872c6dcaPrerepa Viswanadham qq = qq_remainder = 1; 87892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 87992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth L2CAP_TRACE_EVENT ("l2c_ble_link_adjust_allocation num_hipri: %u num_lowpri: %u low_quota: %u round_robin_quota: %u qq: %u", 88092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth num_hipri_links, num_lowpri_links, low_quota, 88192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth l2cb.ble_round_robin_quota, qq); 88292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 88392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* Now, assign the quotas to each link */ 88492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth for (yy = 0, p_lcb = &l2cb.lcb_pool[0]; yy < MAX_L2CAP_LINKS; yy++, p_lcb++) 88592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 88692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth if (p_lcb->in_use && p_lcb->transport == BT_TRANSPORT_LE) 88792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 88892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth if (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH) 88992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 89092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth p_lcb->link_xmit_quota = high_pri_link_quota; 89192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 89292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth else 89392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 89492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* Safety check in case we switched to round-robin with something outstanding */ 89592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* if sent_not_acked is added into round_robin_unacked then don't add it again */ 89692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* l2cap keeps updating sent_not_acked for exiting from round robin */ 89792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth if (( p_lcb->link_xmit_quota > 0 )&&( qq == 0 )) 89892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth l2cb.ble_round_robin_unacked += p_lcb->sent_not_acked; 89992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 90092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth p_lcb->link_xmit_quota = qq; 90192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth if (qq_remainder > 0) 90292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth { 90392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth p_lcb->link_xmit_quota++; 90492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth qq_remainder--; 90592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 90692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 90792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 90892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth L2CAP_TRACE_EVENT("l2c_ble_link_adjust_allocation LCB %d Priority: %d XmitQuota: %d", 90992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth yy, p_lcb->acl_priority, p_lcb->link_xmit_quota); 91092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 91192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth L2CAP_TRACE_EVENT(" SentNotAcked: %d RRUnacked: %d", 91292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth p_lcb->sent_not_acked, l2cb.round_robin_unacked); 91392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 91492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* There is a special case where we have readjusted the link quotas and */ 91592ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* this link may have sent anything but some other link sent packets so */ 91692ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth /* so we may need a timer to kick off this link's transmissions. */ 91792ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth if ( (p_lcb->link_state == LST_CONNECTED) 91892ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth && (p_lcb->link_xmit_data_q.count) 91992ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth && (p_lcb->sent_not_acked < p_lcb->link_xmit_quota) ) 92092ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth btu_start_timer (&p_lcb->timer_entry, BTU_TTYPE_L2CAP_LINK, L2CAP_LINK_FLOW_CONTROL_TOUT); 92192ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 92292ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth } 92392ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth} 92492ac2d8919f8e38a091903270eb5500073d67d4bMudumba Ananth 9257fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#if (defined BLE_LLT_INCLUDED) && (BLE_LLT_INCLUDED == TRUE) 9267fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta/******************************************************************************* 9277fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 9287fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Function l2cble_process_rc_param_request_evt 9297fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 9307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Description process LE Remote Connection Parameter Request Event. 9317fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 9327fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** Returns void 9337fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta** 9347fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta*******************************************************************************/ 9357fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Battavoid l2cble_process_rc_param_request_evt(UINT16 handle, UINT16 int_min, UINT16 int_max, 9367fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta UINT16 latency, UINT16 timeout) 9377fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta{ 9387fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta tL2C_LCB *p_lcb = l2cu_find_lcb_by_handle (handle); 9397fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 9407fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta if (p_lcb != NULL) 9417fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 9427fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->min_interval = int_min; 9437fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->max_interval = int_max; 9447fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->latency = latency; 9457fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta p_lcb->timeout = timeout; 9467fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 94797e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun /* if update is enabled, always accept connection parameter update */ 94897e75b73a57602b7d9771f28216630ba32fd702aChaojing Sun if ((p_lcb->conn_update_mask & L2C_BLE_CONN_UPDATE_DISABLE) == 0) 9497fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 9507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btsnd_hcic_ble_rc_param_req_reply(handle, int_min, int_max, latency, timeout, 0, 0); 9517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 9527fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 9537fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 954a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_EVENT ("L2CAP - LE - update currently disabled"); 95501a069a228cb63988e502aed01a73a2a1d8a59ebAndre Eisenbach p_lcb->conn_update_mask |= L2C_BLE_NEW_CONN_PARAM; 9567fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta btsnd_hcic_ble_rc_param_req_neg_reply (handle,HCI_ERR_UNACCEPT_CONN_INTERVAL); 9577fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 9587fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 9597fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 9607fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta else 9617fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta { 962a51c9d9d225e41fe36a0133f1c17fd981ea59c1dSharvil Nanavati L2CAP_TRACE_WARNING("No link to update connection parameter") 9637fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta } 9647fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta} 9657fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta#endif 9667fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 9677fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* (BLE_INCLUDED == TRUE) */ 969