1ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/****************************************************************************** 2ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * 3ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Copyright (C) 2009-2013 Broadcom Corporation 4ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * 5ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Licensed under the Apache License, Version 2.0 (the "License"); 6ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * you may not use this file except in compliance with the License. 7ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * You may obtain a copy of the License at: 8ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * 9ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * http://www.apache.org/licenses/LICENSE-2.0 10ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * 11ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * Unless required by applicable law or agreed to in writing, software 12ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * distributed under the License is distributed on an "AS IS" BASIS, 13ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * See the License for the specific language governing permissions and 15ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * limitations under the License. 16ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta * 17ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ******************************************************************************/ 18ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 19ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 20ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "bt_target.h" 21ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "btu.h" 22ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "gap_int.h" 23ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "l2cdefs.h" 24ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "l2c_int.h" 25ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include <string.h> 26ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if GAP_CONN_INCLUDED == TRUE 27ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "btm_int.h" 28ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 29ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/********************************************************************************/ 30ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/* L O C A L F U N C T I O N P R O T O T Y P E S */ 31ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/********************************************************************************/ 32ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gap_connect_ind (BD_ADDR bd_addr, UINT16 l2cap_cid, UINT16 psm, UINT8 l2cap_id); 33ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gap_connect_cfm (UINT16 l2cap_cid, UINT16 result); 34ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gap_config_ind (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg); 35ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gap_config_cfm (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg); 36ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gap_disconnect_ind (UINT16 l2cap_cid, BOOLEAN ack_needed); 37ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gap_data_ind (UINT16 l2cap_cid, BT_HDR *p_msg); 38ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gap_congestion_ind (UINT16 lcid, BOOLEAN is_congested); 39ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 40ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic tGAP_CCB *gap_find_ccb_by_cid (UINT16 cid); 41ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic tGAP_CCB *gap_find_ccb_by_handle (UINT16 handle); 42ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic tGAP_CCB *gap_allocate_ccb (void); 43ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gap_release_ccb (tGAP_CCB *p_ccb); 44ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 45ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 46ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 47ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gap_conn_init 48ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 49ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function is called to initialize GAP connection management 50ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 51ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void 52ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 53ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 54ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid gap_conn_init (void) 55ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 56ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if AMP_INCLUDED == TRUE 57ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pAMP_ConnectInd_Cb = gap_connect_ind; 58ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pAMP_ConnectCfm_Cb = gap_connect_cfm; 59ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pAMP_ConnectPnd_Cb = NULL; 60ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pAMP_ConfigInd_Cb = gap_config_ind; 61ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pAMP_ConfigCfm_Cb = gap_config_cfm; 62ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pAMP_DisconnectInd_Cb = gap_disconnect_ind; 63ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pAMP_DisconnectCfm_Cb = NULL; 64ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pAMP_QoSViolationInd_Cb = NULL; 65ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pAMP_DataInd_Cb = gap_data_ind; 66ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pAMP_CongestionStatus_Cb = gap_congestion_ind; 67ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pAMP_TxComplete_Cb = NULL; 68ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pAMP_MoveInd_Cb = NULL; 69ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pAMP_MoveRsp_Cb = NULL; 70ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pAMP_MoveCfm_Cb = NULL; //gap_move_cfm 71ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pAMP_MoveCfmRsp_Cb = NULL; //gap_move_cfm_rsp 72ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 73ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#else 74ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pL2CA_ConnectInd_Cb = gap_connect_ind; 75ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pL2CA_ConnectCfm_Cb = gap_connect_cfm; 76ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pL2CA_ConnectPnd_Cb = NULL; 77ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pL2CA_ConfigInd_Cb = gap_config_ind; 78ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pL2CA_ConfigCfm_Cb = gap_config_cfm; 79ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pL2CA_DisconnectInd_Cb = gap_disconnect_ind; 80ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pL2CA_DisconnectCfm_Cb = NULL; 81ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pL2CA_QoSViolationInd_Cb = NULL; 82ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pL2CA_DataInd_Cb = gap_data_ind; 83ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pL2CA_CongestionStatus_Cb = gap_congestion_ind; 84ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pL2CA_TxComplete_Cb = NULL; 85ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 86ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 87ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 88ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 89ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 90ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 91ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function GAP_ConnOpen 92ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 93ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function is called to open an L2CAP connection. 94ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 95ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters: is_server - If TRUE, the connection is not created 96ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** but put into a "listen" mode waiting for 97ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** the remote side to connect. 98ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 99ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** service_id - Unique service ID from 100ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** BTM_SEC_SERVICE_FIRST_EMPTY (6) 101ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** to BTM_SEC_MAX_SERVICE_RECORDS (32) 102ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 103ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** p_rem_bda - Pointer to remote BD Address. 104ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** If a server, and we don't care about the 105ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** remote BD Address, then NULL should be passed. 106ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 107ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** psm - the PSM used for the connection 108ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 109ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** p_config - Optional pointer to configuration structure. 110ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** If NULL, the default GAP configuration will 111ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** be used. 112ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 113ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** security - security flags 114ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** chan_mode_mask - (GAP_FCR_CHAN_OPT_BASIC, GAP_FCR_CHAN_OPT_ERTM, GAP_FCR_CHAN_OPT_STREAM) 115ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 116ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** p_cb - Pointer to callback function for events. 117ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 118ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns handle of the connection if successful, else GAP_INVALID_HANDLE 119ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 120ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 121ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaUINT16 GAP_ConnOpen (char *p_serv_name, UINT8 service_id, BOOLEAN is_server, 122ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BD_ADDR p_rem_bda, UINT16 psm, tL2CAP_CFG_INFO *p_cfg, 123ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 security, UINT8 chan_mode_mask, tGAP_CONN_CALLBACK *p_cb) 124ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 125ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb; 126ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 cid; 127ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBT_UUID bt_uuid = {2, {GAP_PROTOCOL_ID}}; 128ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 129ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_EVENT0 ("GAP_CONN - Open Request"); 130ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 131ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Allocate a new CCB. Return if none available. */ 132ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_ccb = gap_allocate_ccb()) == NULL) 133ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_INVALID_HANDLE); 134ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 135ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* If caller specified a BD address, save it */ 136ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_rem_bda) 137ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 138ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* the bd addr is not BT_BD_ANY, then a bd address was specified */ 139ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (memcmp (p_rem_bda, BT_BD_ANY, BD_ADDR_LEN)) 140ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->rem_addr_specified = TRUE; 141ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 142ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memcpy (&p_ccb->rem_dev_address[0], p_rem_bda, BD_ADDR_LEN); 143ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 144ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else if (!is_server) 145ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 146ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* remore addr is not specified and is not a server -> bad */ 147ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_INVALID_HANDLE); 148ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 149ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 150ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* A client MUST have specified a bd addr to connect with */ 151ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!p_ccb->rem_addr_specified && !is_server) 152ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 153ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_release_ccb (p_ccb); 154ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_ERROR0 ("GAP ERROR: Client must specify a remote BD ADDR to connect to!"); 155ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_INVALID_HANDLE); 156ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 157ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 158ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Check if configuration was specified */ 159ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_cfg) 160ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->cfg = *p_cfg; 161ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 162ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->p_callback = p_cb; 163ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 164ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* If originator, use a dynamic PSM */ 165ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if AMP_INCLUDED == TRUE 166ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!is_server) 167ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pAMP_ConnectInd_Cb = NULL; 168ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 169ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pAMP_ConnectInd_Cb = gap_connect_ind; 170ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#else 171ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!is_server) 172ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pL2CA_ConnectInd_Cb = NULL; 173ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 174ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_cb.conn.reg_info.pL2CA_ConnectInd_Cb = gap_connect_ind; 175ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 176ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 177ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Register the PSM with L2CAP */ 178ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_ccb->psm = L2CA_REGISTER (psm, &gap_cb.conn.reg_info, AMP_AUTOSWITCH_ALLOWED|AMP_USE_AMP_IF_POSSIBLE)) == 0) 179ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 180ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_ERROR1 ("GAP_ConnOpen: Failure registering PSM 0x%04x", psm); 181ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_release_ccb (p_ccb); 182ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_INVALID_HANDLE); 183ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 184ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 185ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Register with Security Manager for the specific security level */ 186ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->service_id = service_id; 187ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!BTM_SetSecurityLevel ((UINT8)!is_server, p_serv_name, p_ccb->service_id, security, p_ccb->psm, 0, 0)) 188ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 189ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_ERROR0 ("GAP_CONN - Security Error"); 190ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_release_ccb (p_ccb); 191ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_INVALID_HANDLE); 192ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 193ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 194ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Fill in eL2CAP parameter data */ 195ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if( p_ccb->cfg.fcr_present ) 196ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 197ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->ertm_info.preferred_mode = p_ccb->cfg.fcr.mode; 198ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->ertm_info.user_rx_pool_id = GAP_DATA_POOL_ID; 199ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->ertm_info.user_tx_pool_id = GAP_DATA_POOL_ID; 200ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->ertm_info.fcr_rx_pool_id = L2CAP_DEFAULT_ERM_POOL_ID; 201ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->ertm_info.fcr_tx_pool_id = L2CAP_DEFAULT_ERM_POOL_ID; 202ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 203ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 204ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* optional FCR channel modes */ 205ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->ertm_info.allowed_modes = (chan_mode_mask) ? chan_mode_mask : (UINT8)L2CAP_FCR_CHAN_OPT_BASIC; 206ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 207ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (is_server) 208ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 209ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->con_flags |= GAP_CCB_FLAGS_SEC_DONE; /* assume btm/l2cap would handle it */ 210ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->con_state = GAP_CCB_STATE_LISTENING; 211ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (p_ccb->gap_handle); 212ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 213ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 214ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 215ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* We are the originator of this connection */ 216ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->con_flags = GAP_CCB_FLAGS_IS_ORIG; 217ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 218ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Transition to the next appropriate state, waiting for connection confirm. */ 219ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->con_state = GAP_CCB_STATE_CONN_SETUP; 220ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 221ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* mark security done flag, when security is not required */ 222ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((security & (BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT) ) == 0) 223ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->con_flags |= GAP_CCB_FLAGS_SEC_DONE; 224ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 225ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Check if L2CAP started the connection process */ 226ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_rem_bda && ((cid = L2CA_CONNECT_REQ (p_ccb->psm, p_rem_bda, &p_ccb->ertm_info, &bt_uuid)) != 0)) 227ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 228ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->connection_id = cid; 229ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (p_ccb->gap_handle); 230ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 231ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 232ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 233ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_release_ccb (p_ccb); 234ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_INVALID_HANDLE); 235ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 236ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 237ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 238ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 239ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 240ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 241ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 242ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function GAP_ConnClose 243ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 244ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function is called to close a connection. 245ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 246ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters: handle - Handle of the connection returned by GAP_ConnOpen 247ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 248ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns BT_PASS - closed OK 249ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** GAP_ERR_BAD_HANDLE - invalid handle 250ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 251ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 252ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaUINT16 GAP_ConnClose (UINT16 gap_handle) 253ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 254ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle); 255ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 256ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_EVENT1 ("GAP_CONN - close handle: 0x%x", gap_handle); 257ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 258ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_ccb) 259ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 260ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Check if we have a connection ID */ 261ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_ccb->con_state != GAP_CCB_STATE_LISTENING) 262ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta L2CA_DISCONNECT_REQ (p_ccb->connection_id); 263ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 264ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_release_ccb (p_ccb); 265ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 266ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (BT_PASS); 267ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 268ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 269ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_ERR_BAD_HANDLE); 270ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 271ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 272ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 273ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 274ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 275ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 276ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function GAP_ConnReadData 277ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 278ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Normally not GKI aware application will call this function 279ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** after receiving GAP_EVT_RXDATA event. 280ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 281ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters: handle - Handle of the connection returned in the Open 282ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** p_data - Data area 283ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** max_len - Byte count requested 284ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** p_len - Byte count received 285ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 286ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns BT_PASS - data read 287ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** GAP_ERR_BAD_HANDLE - invalid handle 288ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** GAP_NO_DATA_AVAIL - no data available 289ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 290ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 291ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaUINT16 GAP_ConnReadData (UINT16 gap_handle, UINT8 *p_data, UINT16 max_len, UINT16 *p_len) 292ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 293ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle); 294ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BT_HDR *p_buf; 295ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 copy_len; 296ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 297ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!p_ccb) 298ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_ERR_BAD_HANDLE); 299ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 300ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *p_len = 0; 301ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 302ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_buf = (BT_HDR *)GKI_getfirst (&p_ccb->rx_queue); 303ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!p_buf) 304ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_NO_DATA_AVAIL); 305ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 306ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_disable(); 307ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 308ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta while (max_len && p_buf) 309ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 310ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta copy_len = (p_buf->len > max_len)?max_len:p_buf->len; 311ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta max_len -= copy_len; 312ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *p_len += copy_len; 313ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_data) 314ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 315ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memcpy (p_data, (UINT8 *)(p_buf + 1) + p_buf->offset, copy_len); 316ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_data += copy_len; 317ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 318ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 319ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_buf->len > copy_len) 320ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 321ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_buf->offset += copy_len; 322ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_buf->len -= copy_len; 323ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 324ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 325ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 326ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 327ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (max_len) 328ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 329ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_buf = (BT_HDR *)GKI_getnext (p_buf); 330ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 331ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_freebuf (GKI_dequeue (&p_ccb->rx_queue)); 332ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 333ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 334ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 335ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->rx_queue_size -= *p_len; 336ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 337ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_enable(); 338ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 339ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_EVENT2 ("GAP_ConnReadData - rx_queue_size left=%d, *p_len=%d", 340ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->rx_queue_size, *p_len); 341ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 342ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (BT_PASS); 343ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 344ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 345ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 346ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 347ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function GAP_GetRxQueueCnt 348ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 349ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function return number of bytes on the rx queue. 350ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 351ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters: handle - Handle returned in the GAP_ConnOpen 352ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** p_rx_queue_count - Pointer to return queue count in. 353ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 354ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 355ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 356ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battaint GAP_GetRxQueueCnt (UINT16 handle, UINT32 *p_rx_queue_count) 357ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 358ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb; 359ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta int rc = BT_PASS; 360ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 361ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Check that handle is valid */ 362ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (handle < GAP_MAX_CONNECTIONS) 363ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 364ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb = &gap_cb.conn.ccb_pool[handle]; 365ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 366ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_ccb->con_state == GAP_CCB_STATE_CONNECTED) 367ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 368ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *p_rx_queue_count = p_ccb->rx_queue_size; 369ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 370ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 371ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta rc = GAP_INVALID_HANDLE; 372ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 373ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 374ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta rc = GAP_INVALID_HANDLE; 375ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 376ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_EVENT2 ("GAP_GetRxQueueCnt - rc = 0x%04x, rx_queue_count=%d", 377ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta rc , *p_rx_queue_count); 378ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 379ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (rc); 380ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 381ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 382ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 383ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 384ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function GAP_ConnBTRead 385ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 386ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Bluetooth aware applications will call this function after receiving 387ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** GAP_EVT_RXDATA event. 388ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 389ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters: handle - Handle of the connection returned in the Open 390ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** pp_buf - pointer to address of buffer with data, 391ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 392ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns BT_PASS - data read 393ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** GAP_ERR_BAD_HANDLE - invalid handle 394ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** GAP_NO_DATA_AVAIL - no data available 395ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 396ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 397ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaUINT16 GAP_ConnBTRead (UINT16 gap_handle, BT_HDR **pp_buf) 398ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 399ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle); 400ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BT_HDR *p_buf; 401ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 402ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!p_ccb) 403ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_ERR_BAD_HANDLE); 404ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 405ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->rx_queue); 406ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 407ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_buf) 408ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 409ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *pp_buf = p_buf; 410ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 411ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->rx_queue_size -= p_buf->len; 412ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (BT_PASS); 413ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 414ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 415ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 416ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *pp_buf = NULL; 417ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_NO_DATA_AVAIL); 418ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 419ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 420ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 421ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 422ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 423ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 424ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function GAP_ConnBTWrite 425ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 426ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Bluetooth Aware applications can call this function to write data. 427ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 428ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters: handle - Handle of the connection returned in the Open 429ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** p_buf - pointer to address of buffer with data, 430ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 431ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns BT_PASS - data read 432ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** GAP_ERR_BAD_HANDLE - invalid handle 433ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** GAP_ERR_BAD_STATE - connection not established 434ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** GAP_INVALID_BUF_OFFSET - buffer offset is invalid 435ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 436ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaUINT16 GAP_ConnBTWrite (UINT16 gap_handle, BT_HDR *p_buf) 437ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 438ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle); 439ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 440ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!p_ccb) 441ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 442ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_freebuf (p_buf); 443ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_ERR_BAD_HANDLE); 444ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 445ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 446ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_ccb->con_state != GAP_CCB_STATE_CONNECTED) 447ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 448ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_freebuf (p_buf); 449ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_ERR_BAD_STATE); 450ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 451ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 452ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_buf->offset < L2CAP_MIN_OFFSET) 453ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 454ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_freebuf (p_buf); 455ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_ERR_BUF_OFFSET); 456ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 457ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 458ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_enqueue (&p_ccb->tx_queue, p_buf); 459ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 460ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_ccb->is_congested) 461ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 462ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (BT_PASS); 463ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 464ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 465ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Send the buffer through L2CAP */ 466ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (GAP_CONN_POST_EVT_INCLUDED == TRUE) 467ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_send_event (gap_handle); 468ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#else 469ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta while ((p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->tx_queue)) != NULL) 470ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 471ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 status = L2CA_DATA_WRITE (p_ccb->connection_id, p_buf); 472ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 473ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (status == L2CAP_DW_CONGESTED) 474ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 475ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->is_congested = TRUE; 476ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 477ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 478ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else if (status != L2CAP_DW_SUCCESS) 479ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_ERR_BAD_STATE); 480ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 481ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 482ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (BT_PASS); 483ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 484ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 485ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 486ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 487ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 488ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function GAP_ConnWriteData 489ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 490ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Normally not GKI aware application will call this function 491ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** to send data to the connection. 492ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 493ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters: handle - Handle of the connection returned in the Open 494ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** p_data - Data area 495ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** max_len - Byte count requested 496ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** p_len - Byte count received 497ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 498ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns BT_PASS - data read 499ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** GAP_ERR_BAD_HANDLE - invalid handle 500ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** GAP_ERR_BAD_STATE - connection not established 501ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** GAP_CONGESTION - system is congested 502ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 503ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 504ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaUINT16 GAP_ConnWriteData (UINT16 gap_handle, UINT8 *p_data, UINT16 max_len, UINT16 *p_len) 505ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 506ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle); 507ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BT_HDR *p_buf; 508ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 509ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *p_len = 0; 510ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 511ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!p_ccb) 512ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_ERR_BAD_HANDLE); 513ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 514ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_ccb->con_state != GAP_CCB_STATE_CONNECTED) 515ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_ERR_BAD_STATE); 516ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 517ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta while (max_len) 518ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 519ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_ccb->cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) 520ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 521ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_buf = (BT_HDR *)GKI_getpoolbuf (p_ccb->ertm_info.user_tx_pool_id)) == NULL) 522ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_ERR_CONGESTED); 523ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 524ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 525ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 526ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_buf = (BT_HDR *)GKI_getpoolbuf (GAP_DATA_POOL_ID)) == NULL) 527ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_ERR_CONGESTED); 528ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 529ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 530ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_buf->offset = L2CAP_MIN_OFFSET; 531ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_buf->len = (p_ccb->rem_mtu_size < max_len) ? p_ccb->rem_mtu_size : max_len; 532ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_buf->event = BT_EVT_TO_BTU_SP_DATA; 533ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 534ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memcpy ((UINT8 *)(p_buf + 1) + p_buf->offset, p_data, p_buf->len); 535ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 536ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta *p_len += p_buf->len; 537ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta max_len -= p_buf->len; 538ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_data += p_buf->len; 539ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 540ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_EVENT1 ("GAP_WriteData %d bytes", p_buf->len); 541ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 542ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_enqueue (&p_ccb->tx_queue, p_buf); 543ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 544ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 545ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_ccb->is_congested) 546ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 547ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (BT_PASS); 548ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 549ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 550ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Send the buffer through L2CAP */ 551ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (GAP_CONN_POST_EVT_INCLUDED == TRUE) 552ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_send_event (gap_handle); 553ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#else 554ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta while ((p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->tx_queue)) != NULL) 555ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 556ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 status = L2CA_DATA_WRITE (p_ccb->connection_id, p_buf); 557ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 558ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (status == L2CAP_DW_CONGESTED) 559ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 560ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->is_congested = TRUE; 561ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 562ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 563ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else if (status != L2CAP_DW_SUCCESS) 564ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_ERR_BAD_STATE); 565ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 566ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 567ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (BT_PASS); 568ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 569ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 570ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 571ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 572ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 573ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function GAP_ConnReconfig 574ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 575ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Applications can call this function to reconfigure the connection. 576ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 577ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters: handle - Handle of the connection 578ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** p_cfg - Pointer to new configuration 579ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 580ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns BT_PASS - config process started 581ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** GAP_ERR_BAD_HANDLE - invalid handle 582ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 583ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 584ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaUINT16 GAP_ConnReconfig (UINT16 gap_handle, tL2CAP_CFG_INFO *p_cfg) 585ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 586ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle); 587ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 588ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!p_ccb) 589ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_ERR_BAD_HANDLE); 590ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 591ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->cfg = *p_cfg; 592ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 593ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_ccb->con_state == GAP_CCB_STATE_CONNECTED) 594ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta L2CA_CONFIG_REQ (p_ccb->connection_id, p_cfg); 595ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 596ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (BT_PASS); 597ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 598ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 599ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 600ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 601ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 602ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 603ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function GAP_ConnSetIdleTimeout 604ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 605ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Higher layers call this function to set the idle timeout for 606ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** a connection, or for all future connections. The "idle timeout" 607ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** is the amount of time that a connection can remain up with 608ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** no L2CAP channels on it. A timeout of zero means that the 609ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** connection will be torn down immediately when the last channel 610ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** is removed. A timeout of 0xFFFF means no timeout. Values are 611ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** in seconds. 612ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 613ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters: handle - Handle of the connection 614ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** timeout - in secs 615ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 0 = immediate disconnect when last channel is removed 616ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 0xFFFF = no idle timeout 617ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 618ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns BT_PASS - config process started 619ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** GAP_ERR_BAD_HANDLE - invalid handle 620ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 621ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 622ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaUINT16 GAP_ConnSetIdleTimeout (UINT16 gap_handle, UINT16 timeout) 623ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 624ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb; 625ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 626ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_ccb = gap_find_ccb_by_handle (gap_handle)) == NULL) 627ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_ERR_BAD_HANDLE); 628ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 629ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (L2CA_SetIdleTimeout (p_ccb->connection_id, timeout, FALSE)) 630ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (BT_PASS); 631ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 632ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (GAP_ERR_BAD_HANDLE); 633ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 634ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 635ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 636ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 637ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 638ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 639ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function GAP_ConnGetRemoteAddr 640ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 641ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function is called to get the remote BD address 642ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** of a connection. 643ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 644ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters: handle - Handle of the connection returned by GAP_ConnOpen 645ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 646ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns BT_PASS - closed OK 647ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** GAP_ERR_BAD_HANDLE - invalid handle 648ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 649ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 650ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaUINT8 *GAP_ConnGetRemoteAddr (UINT16 gap_handle) 651ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 652ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle); 653ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 654ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_EVENT1 ("GAP_ConnGetRemoteAddr gap_handle = %d", gap_handle); 655ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 656ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_ccb) && (p_ccb->con_state > GAP_CCB_STATE_LISTENING)) 657ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 658ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_EVENT6("GAP_ConnGetRemoteAddr bda :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", \ 659ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->rem_dev_address[0],p_ccb->rem_dev_address[1],p_ccb->rem_dev_address[2], 660ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->rem_dev_address[3],p_ccb->rem_dev_address[4],p_ccb->rem_dev_address[5]); 661ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (p_ccb->rem_dev_address); 662ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 663ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 664ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 665ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_EVENT0 ("GAP_ConnGetRemoteAddr return Error "); 666ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (NULL); 667ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 668ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 669ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 670ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 671ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 672ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 673ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function GAP_ConnGetRemMtuSize 674ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 675ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Returns the remote device's MTU size 676ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 677ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters: handle - Handle of the connection 678ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 679ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns UINT16 - maximum size buffer that can be transmitted to the peer 680ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 681ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 682ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaUINT16 GAP_ConnGetRemMtuSize (UINT16 gap_handle) 683ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 684ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb; 685ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 686ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_ccb = gap_find_ccb_by_handle (gap_handle)) == NULL) 687ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (0); 688ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 689ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (p_ccb->rem_mtu_size); 690ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 691ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 692ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 693ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 694ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function GAP_ConnGetL2CAPCid 695ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 696ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Returns the L2CAP channel id 697ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 698ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameters: handle - Handle of the connection 699ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 700ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns UINT16 - The L2CAP channel id 701ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 0, if error 702ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 703ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 704ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaUINT16 GAP_ConnGetL2CAPCid (UINT16 gap_handle) 705ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 706ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb; 707ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 708ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_ccb = gap_find_ccb_by_handle (gap_handle)) == NULL) 709ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (0); 710ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 711ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (p_ccb->connection_id); 712ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 713ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 714ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 715ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 716ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 717ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gap_connect_ind 718ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 719ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function handles an inbound connection indication 720ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** from L2CAP. This is the case where we are acting as a 721ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** server. 722ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 723ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void 724ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 725ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 726ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gap_connect_ind (BD_ADDR bd_addr, UINT16 l2cap_cid, UINT16 psm, UINT8 l2cap_id) 727ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 728ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 xx; 729ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb; 730ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBT_UUID bt_uuid = {2, {GAP_PROTOCOL_ID}}; 731ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 732ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* See if we have a CCB listening for the connection */ 733ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (xx = 0, p_ccb = gap_cb.conn.ccb_pool; xx < GAP_MAX_CONNECTIONS; xx++, p_ccb++) 734ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 735ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_ccb->con_state == GAP_CCB_STATE_LISTENING) 736ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta && (p_ccb->psm == psm) 737ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta && ((p_ccb->rem_addr_specified == FALSE) 738ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta || (!memcmp (bd_addr, p_ccb->rem_dev_address, BD_ADDR_LEN)))) 739ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 740ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 741ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 742ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (xx == GAP_MAX_CONNECTIONS) 743ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 744ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_WARNING0("*******"); 745ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_WARNING0("WARNING: GAP Conn Indication for Unexpected Bd Addr...Disconnecting"); 746ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_WARNING0("*******"); 747ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 748ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Disconnect because it is an unexpected connection */ 749ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta L2CA_DISCONNECT_REQ (l2cap_cid); 750ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 751ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 752ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 753ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Transition to the next appropriate state, waiting for config setup. */ 754ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->con_state = GAP_CCB_STATE_CFG_SETUP; 755ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 756ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Save the BD Address and Channel ID. */ 757ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memcpy (&p_ccb->rem_dev_address[0], bd_addr, BD_ADDR_LEN); 758ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->connection_id = l2cap_cid; 759ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 760ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Send response to the L2CAP layer. */ 761ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta L2CA_CONNECT_RSP (bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_OK, L2CAP_CONN_OK, &p_ccb->ertm_info, &bt_uuid); 762ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 763ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_EVENT1("GAP_CONN - Rcvd L2CAP conn ind, CID: 0x%x", p_ccb->connection_id); 764ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 765ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Send a Configuration Request. */ 766ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta L2CA_CONFIG_REQ (l2cap_cid, &p_ccb->cfg); 767ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 768ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 769ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 770ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 771ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gap_checks_con_flags 772ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 773ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function processes the L2CAP configuration indication 774ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** event. 775ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 776ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void 777ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 778ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 779ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gap_checks_con_flags (tGAP_CCB *p_ccb) 780ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 781ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_EVENT1 ("gap_checks_con_flags conn_flags:0x%x, ", p_ccb->con_flags); 782ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* if all the required con_flags are set, report the OPEN event now */ 783ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_ccb->con_flags & GAP_CCB_FLAGS_CONN_DONE) == GAP_CCB_FLAGS_CONN_DONE) 784ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 785ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->con_state = GAP_CCB_STATE_CONNECTED; 786ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 787ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->p_callback (p_ccb->gap_handle, GAP_EVT_CONN_OPENED); 788ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 789ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 790ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 791ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 792ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 793ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gap_sec_check_complete 794ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 795ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description The function called when Security Manager finishes 796ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** verification of the service side connection 797ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 798ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void 799ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 800ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 801ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gap_sec_check_complete (BD_ADDR bd_addr, void *p_ref_data, UINT8 res) 802ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 803ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb = (tGAP_CCB *)p_ref_data; 804ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 805ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_EVENT3 ("gap_sec_check_complete conn_state:%d, conn_flags:0x%x, status:%d", 806ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->con_state, p_ccb->con_flags, res); 807ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_ccb->con_state == GAP_CCB_STATE_IDLE) 808ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 809ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 810ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (res == BTM_SUCCESS) 811ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 812ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->con_flags |= GAP_CCB_FLAGS_SEC_DONE; 813ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_checks_con_flags (p_ccb); 814ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 815ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 816ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 817ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* security failed - disconnect the channel */ 818ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta L2CA_DISCONNECT_REQ (p_ccb->connection_id); 819ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 820ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 821ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 822ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 823ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 824ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gap_connect_cfm 825ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 826ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function handles the connect confirm events 827ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** from L2CAP. This is the case when we are acting as a 828ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** client and have sent a connect request. 829ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 830ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void 831ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 832ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 833ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gap_connect_cfm (UINT16 l2cap_cid, UINT16 result) 834ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 835ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb; 836ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 837ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Find CCB based on CID */ 838ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) 839ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 840ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 841ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* initiate security process, if needed */ 842ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ( (p_ccb->con_flags & GAP_CCB_FLAGS_SEC_DONE) == 0) 843ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 844ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta btm_sec_mx_access_request (p_ccb->rem_dev_address, p_ccb->psm, TRUE, 845ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 0, 0, &gap_sec_check_complete, p_ccb); 846ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 847ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 848ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* If the connection response contains success status, then */ 849ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Transition to the next state and startup the timer. */ 850ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((result == L2CAP_CONN_OK) && (p_ccb->con_state == GAP_CCB_STATE_CONN_SETUP)) 851ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 852ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->con_state = GAP_CCB_STATE_CFG_SETUP; 853ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 854ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Send a Configuration Request. */ 855ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta L2CA_CONFIG_REQ (l2cap_cid, &p_ccb->cfg); 856ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 857ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 858ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 859ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Tell the user if he has a callback */ 860ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_ccb->p_callback) 861ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (*p_ccb->p_callback) (p_ccb->gap_handle, GAP_EVT_CONN_CLOSED); 862ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 863ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_release_ccb (p_ccb); 864ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 865ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 866ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 867ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 868ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 869ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gap_config_ind 870ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 871ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function processes the L2CAP configuration indication 872ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** event. 873ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 874ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void 875ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 876ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 877ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gap_config_ind (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg) 878ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 879ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb; 880ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 local_mtu_size; 881ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 882ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Find CCB based on CID */ 883ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) 884ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 885ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 886ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Remember the remote MTU size */ 887ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 888ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_ccb->cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) 889ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 890ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta local_mtu_size = GKI_get_pool_bufsize (p_ccb->ertm_info.user_tx_pool_id) 891ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta - sizeof(BT_HDR) - L2CAP_MIN_OFFSET; 892ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 893ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 894ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta local_mtu_size = L2CAP_MTU_SIZE; 895ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 896ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((!p_cfg->mtu_present)||(p_cfg->mtu > local_mtu_size)) 897ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 898ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->rem_mtu_size = local_mtu_size; 899ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 900ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 901ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->rem_mtu_size = p_cfg->mtu; 902ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 903ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* For now, always accept configuration from the other side */ 904ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cfg->flush_to_present = FALSE; 905ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cfg->mtu_present = FALSE; 906ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cfg->result = L2CAP_CFG_OK; 907ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_cfg->fcs_present = FALSE; 908ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 909ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta L2CA_CONFIG_RSP (l2cap_cid, p_cfg); 910ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 911ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->con_flags |= GAP_CCB_FLAGS_HIS_CFG_DONE; 912ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 913ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_checks_con_flags (p_ccb); 914ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 915ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 916ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 917ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 918ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 919ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gap_config_cfm 920ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 921ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function processes the L2CAP configuration confirmation 922ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** event. 923ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 924ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void 925ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 926ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 927ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gap_config_cfm (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg) 928ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 929ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb; 930ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 931ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Find CCB based on CID */ 932ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) 933ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 934ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 935ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_cfg->result == L2CAP_CFG_OK) 936ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 937ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->con_flags |= GAP_CCB_FLAGS_MY_CFG_DONE; 938ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 939ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 940ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_ccb->cfg.fcr_present) 941ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->cfg.fcr.mode = p_cfg->fcr.mode; 942ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 943ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->cfg.fcr.mode = L2CAP_FCR_BASIC_MODE; 944ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 945ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_checks_con_flags (p_ccb); 946ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 947ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 948ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 949ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->p_callback (p_ccb->gap_handle, GAP_EVT_CONN_CLOSED); 950ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_release_ccb (p_ccb); 951ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 952ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 953ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 954ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 955ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 956ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 957ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gap_disconnect_ind 958ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 959ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function handles a disconnect event from L2CAP. If 960ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** requested to, we ack the disconnect before dropping the CCB 961ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 962ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void 963ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 964ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 965ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gap_disconnect_ind (UINT16 l2cap_cid, BOOLEAN ack_needed) 966ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 967ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb; 968ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 969ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_EVENT1 ("GAP_CONN - Rcvd L2CAP disc, CID: 0x%x", l2cap_cid); 970ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 971ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Find CCB based on CID */ 972ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) 973ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 974ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 975ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (ack_needed) 976ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta L2CA_DISCONNECT_RSP (l2cap_cid); 977ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 978ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->p_callback (p_ccb->gap_handle, GAP_EVT_CONN_CLOSED); 979ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta gap_release_ccb (p_ccb); 980ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 981ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 982ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 983ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 984ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 985ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gap_data_ind 986ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 987ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function is called when data is received from L2CAP. 988ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 989ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void 990ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 991ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 992ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gap_data_ind (UINT16 l2cap_cid, BT_HDR *p_msg) 993ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 994ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb; 995ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 996ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Find CCB based on CID */ 997ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) 998ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 999ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_freebuf (p_msg); 1000ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 1001ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1002ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1003ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_ccb->con_state == GAP_CCB_STATE_CONNECTED) 1004ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1005ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_enqueue (&p_ccb->rx_queue, p_msg); 1006ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1007ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->rx_queue_size += p_msg->len; 1008ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* 1009ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_EVENT2 ("gap_data_ind - rx_queue_size=%d, msg len=%d", 1010ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->rx_queue_size, p_msg->len); 1011ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta */ 1012ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1013ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->p_callback (p_ccb->gap_handle, GAP_EVT_CONN_DATA_AVAIL); 1014ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1015ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 1016ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1017ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_freebuf (p_msg); 1018ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1019ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 1020ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1021ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1022ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 1023ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1024ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gap_congestion_ind 1025ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1026ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This is a callback function called by L2CAP when 1027ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** data L2CAP congestion status changes 1028ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1029ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 1030ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gap_congestion_ind (UINT16 lcid, BOOLEAN is_congested) 1031ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 1032ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb; 1033ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 event; 1034ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BT_HDR *p_buf; 1035ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 status; 1036ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1037ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_EVENT2 ("GAP_CONN - Rcvd L2CAP Is Congested (%d), CID: 0x%x", 1038ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta is_congested, lcid); 1039ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1040ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Find CCB based on CID */ 1041ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_ccb = gap_find_ccb_by_cid (lcid)) == NULL) 1042ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 1043ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1044ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->is_congested = is_congested; 1045ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1046ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta event = (is_congested) ? GAP_EVT_CONN_CONGESTED : GAP_EVT_CONN_UNCONGESTED; 1047ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->p_callback (p_ccb->gap_handle, event); 1048ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1049ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!is_congested) 1050ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1051ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta while ((p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->tx_queue)) != NULL) 1052ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1053ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta status = L2CA_DATA_WRITE (p_ccb->connection_id, p_buf); 1054ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1055ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (status == L2CAP_DW_CONGESTED) 1056ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1057ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->is_congested = TRUE; 1058ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 1059ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1060ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else if (status != L2CAP_DW_SUCCESS) 1061ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 1062ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1063ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1064ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 1065ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1066ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1067ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 1068ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1069ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gap_find_ccb_by_cid 1070ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1071ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function searches the CCB table for an entry with the 1072ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** passed CID. 1073ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1074ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns the CCB address, or NULL if not found. 1075ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1076ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 1077ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic tGAP_CCB *gap_find_ccb_by_cid (UINT16 cid) 1078ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 1079ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 xx; 1080ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb; 1081ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1082ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Look through each connection control block */ 1083ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (xx = 0, p_ccb = gap_cb.conn.ccb_pool; xx < GAP_MAX_CONNECTIONS; xx++, p_ccb++) 1084ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1085ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_ccb->con_state != GAP_CCB_STATE_IDLE) && (p_ccb->connection_id == cid)) 1086ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (p_ccb); 1087ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1088ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1089ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* If here, not found */ 1090ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (NULL); 1091ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 1092ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1093ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1094ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 1095ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1096ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gap_find_ccb_by_handle 1097ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1098ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function searches the CCB table for an entry with the 1099ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** passed handle. 1100ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1101ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns the CCB address, or NULL if not found. 1102ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1103ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 1104ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic tGAP_CCB *gap_find_ccb_by_handle (UINT16 handle) 1105ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 1106ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb; 1107ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1108ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Check that handle is valid */ 1109ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (handle < GAP_MAX_CONNECTIONS) 1110ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1111ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb = &gap_cb.conn.ccb_pool[handle]; 1112ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1113ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_ccb->con_state != GAP_CCB_STATE_IDLE) 1114ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (p_ccb); 1115ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1116ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1117ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* If here, handle points to invalid connection */ 1118ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (NULL); 1119ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 1120ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1121ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1122ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 1123ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1124ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gap_allocate_ccb 1125ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1126ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function allocates a new CCB. 1127ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1128ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns CCB address, or NULL if none available. 1129ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1130ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 1131ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic tGAP_CCB *gap_allocate_ccb (void) 1132ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 1133ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 xx; 1134ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb; 1135ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1136ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Look through each connection control block for a free one */ 1137ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (xx = 0, p_ccb = gap_cb.conn.ccb_pool; xx < GAP_MAX_CONNECTIONS; xx++, p_ccb++) 1138ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1139ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_ccb->con_state == GAP_CCB_STATE_IDLE) 1140ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1141ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta memset (p_ccb, 0, sizeof (tGAP_CCB)); 1142ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1143ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->gap_handle = xx; 1144ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->rem_mtu_size = L2CAP_MTU_SIZE; 1145ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1146ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (p_ccb); 1147ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1148ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1149ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1150ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* If here, no free CCB found */ 1151ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return (NULL); 1152ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 1153ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1154ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1155ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 1156ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1157ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gap_release_ccb 1158ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1159ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description This function releases a CCB. 1160ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1161ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns void 1162ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1163ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 1164ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic void gap_release_ccb (tGAP_CCB *p_ccb) 1165ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 1166ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 xx; 1167ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT16 psm = p_ccb->psm; 1168ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 service_id = p_ccb->service_id; 1169ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1170ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Drop any buffers we may be holding */ 1171ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->rx_queue_size = 0; 1172ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1173ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta while (p_ccb->rx_queue.p_first) 1174ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_freebuf (GKI_dequeue (&p_ccb->rx_queue)); 1175ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1176ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta while (p_ccb->tx_queue.p_first) 1177ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_freebuf (GKI_dequeue (&p_ccb->tx_queue)); 1178ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1179ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->con_state = GAP_CCB_STATE_IDLE; 1180ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1181ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* If no-one else is using the PSM, deregister from L2CAP */ 1182ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta for (xx = 0, p_ccb = gap_cb.conn.ccb_pool; xx < GAP_MAX_CONNECTIONS; xx++, p_ccb++) 1183ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1184ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_ccb->con_state != GAP_CCB_STATE_IDLE) && (p_ccb->psm == psm)) 1185ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 1186ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1187ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1188ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Free the security record for this PSM */ 1189ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_SecClrService(service_id); 1190ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta L2CA_DEREGISTER (psm); 1191ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 1192ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1193ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (GAP_CONN_POST_EVT_INCLUDED == TRUE) 1194ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1195ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 1196ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1197ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gap_send_event 1198ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1199ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Send BT_EVT_TO_GAP_MSG event to BTU task 1200ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1201ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns None 1202ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1203ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 1204ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid gap_send_event (UINT16 gap_handle) 1205ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 1206ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BT_HDR *p_msg; 1207ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1208ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_msg = (BT_HDR*)GKI_getbuf(BT_HDR_SIZE)) != NULL) 1209ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1210ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_msg->event = BT_EVT_TO_GAP_MSG; 1211ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_msg->len = 0; 1212ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_msg->offset = 0; 1213ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_msg->layer_specific = gap_handle; 1214ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1215ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GKI_send_msg(BTU_TASK, BTU_HCI_RCV_MBOX, p_msg); 1216ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1217ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else 1218ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1219ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta GAP_TRACE_ERROR0("Unable to allocate message buffer for event."); 1220ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1221ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 1222ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1223ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 1224ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1225ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function gap_proc_btu_event 1226ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1227ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Event handler for BT_EVT_TO_GAP_MSG event from BTU task 1228ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1229ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns None 1230ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 1231ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 1232ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid gap_proc_btu_event(BT_HDR *p_msg) 1233ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 1234ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tGAP_CCB *p_ccb = gap_find_ccb_by_handle (p_msg->layer_specific); 1235ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 status; 1236ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BT_HDR *p_buf; 1237ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1238ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!p_ccb) 1239ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1240ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 1241ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1242ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1243ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_ccb->con_state != GAP_CCB_STATE_CONNECTED) 1244ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1245ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 1246ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1247ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1248ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_ccb->is_congested) 1249ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1250ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 1251ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1252ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1253ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Send the buffer through L2CAP */ 1254ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1255ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta while ((p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->tx_queue)) != NULL) 1256ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1257ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta status = L2CA_DATA_WRITE (p_ccb->connection_id, p_buf); 1258ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1259ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (status == L2CAP_DW_CONGESTED) 1260ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 1261ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta p_ccb->is_congested = TRUE; 1262ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 1263ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1264ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta else if (status != L2CAP_DW_SUCCESS) 1265ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta break; 1266ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1267ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 1268ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 1269ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif /* (GAP_CONN_POST_EVT_INCLUDED == TRUE) */ 1270ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif /* GAP_CONN_INCLUDED */ 1271