gap_conn.c revision 5fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cd
18372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/****************************************************************************** 28372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz * 38372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz * Copyright (C) 2009-2013 Broadcom Corporation 48372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz * 58372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz * Licensed under the Apache License, Version 2.0 (the "License"); 68372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz * you may not use this file except in compliance with the License. 78372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz * You may obtain a copy of the License at: 88372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz * 98372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz * http://www.apache.org/licenses/LICENSE-2.0 108372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz * 118372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz * Unless required by applicable law or agreed to in writing, software 128372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz * distributed under the License is distributed on an "AS IS" BASIS, 138372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 148372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz * See the License for the specific language governing permissions and 158372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz * limitations under the License. 168372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz * 178372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz ******************************************************************************/ 188372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 198372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 208372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#include "bt_target.h" 218372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#include "bt_utils.h" 228372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#include "btu.h" 238372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#include "gap_int.h" 248372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#include "l2cdefs.h" 258372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#include "l2c_int.h" 268372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#include <string.h> 271eb1ea0cf2da992a3193506806e571dcbe3ec947Pavlin Radoslavov#include "osi/include/mutex.h" 288372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#if GAP_CONN_INCLUDED == TRUE 298372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#include "btm_int.h" 308372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 318372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/********************************************************************************/ 328372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/* L O C A L F U N C T I O N P R O T O T Y P E S */ 338372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/********************************************************************************/ 348372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic void gap_connect_ind (BD_ADDR bd_addr, UINT16 l2cap_cid, UINT16 psm, UINT8 l2cap_id); 358372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic void gap_connect_cfm (UINT16 l2cap_cid, UINT16 result); 368372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic void gap_config_ind (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg); 378372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic void gap_config_cfm (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg); 388372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic void gap_disconnect_ind (UINT16 l2cap_cid, BOOLEAN ack_needed); 398372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic void gap_data_ind (UINT16 l2cap_cid, BT_HDR *p_msg); 408372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic void gap_congestion_ind (UINT16 lcid, BOOLEAN is_congested); 418372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 428372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic tGAP_CCB *gap_find_ccb_by_cid (UINT16 cid); 438372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic tGAP_CCB *gap_find_ccb_by_handle (UINT16 handle); 448372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic tGAP_CCB *gap_allocate_ccb (void); 458372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic void gap_release_ccb (tGAP_CCB *p_ccb); 468372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 478372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 488372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 498372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function gap_conn_init 508372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 518372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description This function is called to initialize GAP connection management 528372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 538372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns void 548372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 558372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 568372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzvoid gap_conn_init (void) 578372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 588372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#if AMP_INCLUDED == TRUE 598372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pAMP_ConnectInd_Cb = gap_connect_ind; 608372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pAMP_ConnectCfm_Cb = gap_connect_cfm; 618372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pAMP_ConnectPnd_Cb = NULL; 628372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pAMP_ConfigInd_Cb = gap_config_ind; 638372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pAMP_ConfigCfm_Cb = gap_config_cfm; 648372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pAMP_DisconnectInd_Cb = gap_disconnect_ind; 658372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pAMP_DisconnectCfm_Cb = NULL; 668372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pAMP_QoSViolationInd_Cb = NULL; 678372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pAMP_DataInd_Cb = gap_data_ind; 688372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pAMP_CongestionStatus_Cb = gap_congestion_ind; 698372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pAMP_TxComplete_Cb = NULL; 708372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pAMP_MoveInd_Cb = NULL; 718372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pAMP_MoveRsp_Cb = NULL; 728372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pAMP_MoveCfm_Cb = NULL; //gap_move_cfm 738372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pAMP_MoveCfmRsp_Cb = NULL; //gap_move_cfm_rsp 748372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 758372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#else 768372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pL2CA_ConnectInd_Cb = gap_connect_ind; 778372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pL2CA_ConnectCfm_Cb = gap_connect_cfm; 788372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pL2CA_ConnectPnd_Cb = NULL; 798372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pL2CA_ConfigInd_Cb = gap_config_ind; 808372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pL2CA_ConfigCfm_Cb = gap_config_cfm; 818372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pL2CA_DisconnectInd_Cb = gap_disconnect_ind; 828372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pL2CA_DisconnectCfm_Cb = NULL; 838372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pL2CA_QoSViolationInd_Cb = NULL; 848372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pL2CA_DataInd_Cb = gap_data_ind; 858372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pL2CA_CongestionStatus_Cb = gap_congestion_ind; 868372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pL2CA_TxComplete_Cb = NULL; 878372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#endif 888372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 898372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 908372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 918372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 928372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 938372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function GAP_ConnOpen 948372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 958372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description This function is called to open an L2CAP connection. 968372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 978372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Parameters: is_server - If TRUE, the connection is not created 988372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** but put into a "listen" mode waiting for 998372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** the remote side to connect. 1008372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 1018372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** service_id - Unique service ID from 1028372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** BTM_SEC_SERVICE_FIRST_EMPTY (6) 1038372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** to BTM_SEC_MAX_SERVICE_RECORDS (32) 1048372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 1058372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** p_rem_bda - Pointer to remote BD Address. 1068372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** If a server, and we don't care about the 1078372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** remote BD Address, then NULL should be passed. 1088372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 1098372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** psm - the PSM used for the connection 1108372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 1118372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** p_config - Optional pointer to configuration structure. 1128372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** If NULL, the default GAP configuration will 1138372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** be used. 1148372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 1158372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** security - security flags 1168372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** chan_mode_mask - (GAP_FCR_CHAN_OPT_BASIC, GAP_FCR_CHAN_OPT_ERTM, 1178372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** GAP_FCR_CHAN_OPT_STREAM) 1188372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 1198372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** p_cb - Pointer to callback function for events. 1208372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 1218372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns handle of the connection if successful, else GAP_INVALID_HANDLE 1228372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 1238372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 1248372aa5fa535ee4f09c09981b6125b54ace31fe2Kim SchulzUINT16 GAP_ConnOpen (char *p_serv_name, UINT8 service_id, BOOLEAN is_server, 1258372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz BD_ADDR p_rem_bda, UINT16 psm, tL2CAP_CFG_INFO *p_cfg, 1268372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tL2CAP_ERTM_INFO *ertm_info, UINT16 security, UINT8 chan_mode_mask, 1278372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CONN_CALLBACK *p_cb) 1288372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 1298372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb; 1308372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz UINT16 cid; 1318372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 1328372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_EVENT ("GAP_CONN - Open Request"); 1338372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 1348372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Allocate a new CCB. Return if none available. */ 1358372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((p_ccb = gap_allocate_ccb()) == NULL) 1368372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_INVALID_HANDLE); 1378372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 1388372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* If caller specified a BD address, save it */ 1398372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_rem_bda) 1408372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 1418372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* the bd addr is not BT_BD_ANY, then a bd address was specified */ 1428372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (memcmp (p_rem_bda, BT_BD_ANY, BD_ADDR_LEN)) 1438372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->rem_addr_specified = TRUE; 1448372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 1458372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz memcpy (&p_ccb->rem_dev_address[0], p_rem_bda, BD_ADDR_LEN); 1468372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 1478372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else if (!is_server) 1488372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 1498372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* remore addr is not specified and is not a server -> bad */ 1508372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_INVALID_HANDLE); 1518372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 1528372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 1538372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* A client MUST have specified a bd addr to connect with */ 1548372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (!p_ccb->rem_addr_specified && !is_server) 1558372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 1568372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_release_ccb (p_ccb); 1578372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_ERROR ("GAP ERROR: Client must specify a remote BD ADDR to connect to!"); 1588372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_INVALID_HANDLE); 1598372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 1608372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 1618372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Check if configuration was specified */ 1628372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_cfg) 1638372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->cfg = *p_cfg; 1648372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 1658372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->p_callback = p_cb; 1668372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 1678372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* If originator, use a dynamic PSM */ 1688372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#if AMP_INCLUDED == TRUE 1698372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (!is_server) 1708372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pAMP_ConnectInd_Cb = NULL; 1718372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else 1728372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pAMP_ConnectInd_Cb = gap_connect_ind; 1738372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#else 1748372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (!is_server) 1758372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pL2CA_ConnectInd_Cb = NULL; 1768372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else 1778372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_cb.conn.reg_info.pL2CA_ConnectInd_Cb = gap_connect_ind; 1788372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#endif 1798372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 1808372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Register the PSM with L2CAP */ 1818372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((p_ccb->psm = L2CA_REGISTER (psm, &gap_cb.conn.reg_info, 1828372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz AMP_AUTOSWITCH_ALLOWED|AMP_USE_AMP_IF_POSSIBLE)) == 0) 1838372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 1848372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_ERROR ("GAP_ConnOpen: Failure registering PSM 0x%04x", psm); 1858372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_release_ccb (p_ccb); 1868372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_INVALID_HANDLE); 1878372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 1888372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 1898372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Register with Security Manager for the specific security level */ 1908372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->service_id = service_id; 1918372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (!BTM_SetSecurityLevel ((UINT8)!is_server, p_serv_name, 1928372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->service_id, security, p_ccb->psm, 0, 0)) 1938372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 1948372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_ERROR ("GAP_CONN - Security Error"); 1958372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_release_ccb (p_ccb); 1968372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_INVALID_HANDLE); 1978372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 1988372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 1998372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Fill in eL2CAP parameter data */ 2008372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if( p_ccb->cfg.fcr_present ) 2018372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 2028372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if(ertm_info == NULL) { 2038372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->ertm_info.preferred_mode = p_ccb->cfg.fcr.mode; 2041d5b85924df3a114efe6588e857d0de3eb47b1d2Pavlin Radoslavov p_ccb->ertm_info.user_rx_buf_size = GAP_DATA_BUF_SIZE; 2051d5b85924df3a114efe6588e857d0de3eb47b1d2Pavlin Radoslavov p_ccb->ertm_info.user_tx_buf_size = GAP_DATA_BUF_SIZE; 2061d5b85924df3a114efe6588e857d0de3eb47b1d2Pavlin Radoslavov p_ccb->ertm_info.fcr_rx_buf_size = L2CAP_INVALID_ERM_BUF_SIZE; 2071d5b85924df3a114efe6588e857d0de3eb47b1d2Pavlin Radoslavov p_ccb->ertm_info.fcr_tx_buf_size = L2CAP_INVALID_ERM_BUF_SIZE; 2088372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } else { 2098372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->ertm_info = *ertm_info; 2108372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 2118372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 2128372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 2138372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* optional FCR channel modes */ 2148372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if(ertm_info != NULL) { 2158372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->ertm_info.allowed_modes = 2168372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz (chan_mode_mask) ? chan_mode_mask : (UINT8)L2CAP_FCR_CHAN_OPT_BASIC; 2178372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 2188372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 2198372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (is_server) 2208372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 2218372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->con_flags |= GAP_CCB_FLAGS_SEC_DONE; /* assume btm/l2cap would handle it */ 2228372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->con_state = GAP_CCB_STATE_LISTENING; 2238372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (p_ccb->gap_handle); 2248372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 2258372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else 2268372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 2278372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* We are the originator of this connection */ 2288372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->con_flags = GAP_CCB_FLAGS_IS_ORIG; 2298372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 2308372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Transition to the next appropriate state, waiting for connection confirm. */ 2318372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->con_state = GAP_CCB_STATE_CONN_SETUP; 2328372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 2338372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* mark security done flag, when security is not required */ 2348372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((security & (BTM_SEC_OUT_AUTHORIZE | BTM_SEC_OUT_AUTHENTICATE | BTM_SEC_OUT_ENCRYPT) ) == 0) 2358372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->con_flags |= GAP_CCB_FLAGS_SEC_DONE; 2368372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 2378372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Check if L2CAP started the connection process */ 238cab5fc179730ce6910989307680b275195876c4dArman Uguray if (p_rem_bda && ((cid = L2CA_CONNECT_REQ (p_ccb->psm, p_rem_bda, &p_ccb->ertm_info)) != 0)) 2398372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 2408372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->connection_id = cid; 2418372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (p_ccb->gap_handle); 2428372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 2438372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else 2448372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 2458372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_release_ccb (p_ccb); 2468372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_INVALID_HANDLE); 2478372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 2488372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 2498372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 2508372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 2518372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 2528372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 2538372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 2548372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function GAP_ConnClose 2558372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 2568372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description This function is called to close a connection. 2578372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 2588372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Parameters: handle - Handle of the connection returned by GAP_ConnOpen 2598372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 2608372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns BT_PASS - closed OK 2618372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** GAP_ERR_BAD_HANDLE - invalid handle 2628372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 2638372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 2648372aa5fa535ee4f09c09981b6125b54ace31fe2Kim SchulzUINT16 GAP_ConnClose (UINT16 gap_handle) 2658372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 2668372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle); 2678372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 2688372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_EVENT ("GAP_CONN - close handle: 0x%x", gap_handle); 2698372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 2708372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_ccb) 2718372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 2728372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Check if we have a connection ID */ 2738372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_ccb->con_state != GAP_CCB_STATE_LISTENING) 2748372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz L2CA_DISCONNECT_REQ (p_ccb->connection_id); 2758372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 2768372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_release_ccb (p_ccb); 2778372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 2788372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (BT_PASS); 2798372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 2808372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 2818372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_ERR_BAD_HANDLE); 2828372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 2838372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 2848372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 2858372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 2868372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 2878372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 2888372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function GAP_ConnReadData 2898372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 2908372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description Normally not GKI aware application will call this function 2918372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** after receiving GAP_EVT_RXDATA event. 2928372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 2938372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Parameters: handle - Handle of the connection returned in the Open 2948372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** p_data - Data area 2958372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** max_len - Byte count requested 2968372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** p_len - Byte count received 2978372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 2988372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns BT_PASS - data read 2998372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** GAP_ERR_BAD_HANDLE - invalid handle 3008372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** GAP_NO_DATA_AVAIL - no data available 3018372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 3028372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 3038372aa5fa535ee4f09c09981b6125b54ace31fe2Kim SchulzUINT16 GAP_ConnReadData (UINT16 gap_handle, UINT8 *p_data, UINT16 max_len, UINT16 *p_len) 3048372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 3058372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle); 3068372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz UINT16 copy_len; 3078372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 3088372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (!p_ccb) 3098372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_ERR_BAD_HANDLE); 3108372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 3118372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz *p_len = 0; 3128372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 3131a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov if (fixed_queue_is_empty(p_ccb->rx_queue)) 3148372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_NO_DATA_AVAIL); 3158372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 3161eb1ea0cf2da992a3193506806e571dcbe3ec947Pavlin Radoslavov mutex_global_lock(); 3178372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 3181a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov while (max_len) 3198372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 3201a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov BT_HDR *p_buf = fixed_queue_try_peek_first(p_ccb->rx_queue); 3211a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov if (p_buf == NULL) 3221a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov break; 3231a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov 3248372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz copy_len = (p_buf->len > max_len)?max_len:p_buf->len; 3258372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz max_len -= copy_len; 3268372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz *p_len += copy_len; 3278372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_data) 3288372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 3298372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz memcpy (p_data, (UINT8 *)(p_buf + 1) + p_buf->offset, copy_len); 3308372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_data += copy_len; 3318372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 3328372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 3338372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_buf->len > copy_len) 3348372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 3358372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_buf->offset += copy_len; 3368372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_buf->len -= copy_len; 3378372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz break; 3388372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 339abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(fixed_queue_try_dequeue(p_ccb->rx_queue)); 3408372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 3418372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 3428372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->rx_queue_size -= *p_len; 3438372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 3441eb1ea0cf2da992a3193506806e571dcbe3ec947Pavlin Radoslavov mutex_global_unlock(); 3458372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 3468372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_EVENT ("GAP_ConnReadData - rx_queue_size left=%d, *p_len=%d", 3478372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->rx_queue_size, *p_len); 3488372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 3498372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (BT_PASS); 3508372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 3518372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 3528372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 3538372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 3548372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function GAP_GetRxQueueCnt 3558372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 3568372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description This function return number of bytes on the rx queue. 3578372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 3588372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Parameters: handle - Handle returned in the GAP_ConnOpen 3598372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** p_rx_queue_count - Pointer to return queue count in. 3608372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 3618372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 3628372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 3638372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzint GAP_GetRxQueueCnt (UINT16 handle, UINT32 *p_rx_queue_count) 3648372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 3658372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb; 3668372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz int rc = BT_PASS; 3678372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 3688372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Check that handle is valid */ 3698372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (handle < GAP_MAX_CONNECTIONS) 3708372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 3718372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb = &gap_cb.conn.ccb_pool[handle]; 3728372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 3738372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_ccb->con_state == GAP_CCB_STATE_CONNECTED) 3748372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 3758372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz *p_rx_queue_count = p_ccb->rx_queue_size; 3768372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 3778372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else 3788372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz rc = GAP_INVALID_HANDLE; 3798372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 3808372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else 3818372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz rc = GAP_INVALID_HANDLE; 3828372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 3838372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_EVENT ("GAP_GetRxQueueCnt - rc = 0x%04x, rx_queue_count=%d", 3848372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz rc , *p_rx_queue_count); 3858372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 3868372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (rc); 3878372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 3888372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 3898372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 3908372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 3918372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function GAP_ConnBTRead 3928372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 3938372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description Bluetooth aware applications will call this function after receiving 3948372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** GAP_EVT_RXDATA event. 3958372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 3968372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Parameters: handle - Handle of the connection returned in the Open 3978372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** pp_buf - pointer to address of buffer with data, 3988372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 3998372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns BT_PASS - data read 4008372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** GAP_ERR_BAD_HANDLE - invalid handle 4018372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** GAP_NO_DATA_AVAIL - no data available 4028372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 4038372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 4048372aa5fa535ee4f09c09981b6125b54ace31fe2Kim SchulzUINT16 GAP_ConnBTRead (UINT16 gap_handle, BT_HDR **pp_buf) 4058372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 4068372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle); 4078372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz BT_HDR *p_buf; 4088372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 4098372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (!p_ccb) 4108372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_ERR_BAD_HANDLE); 4118372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 4121a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov p_buf = (BT_HDR *)fixed_queue_try_dequeue(p_ccb->rx_queue); 4138372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 4148372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_buf) 4158372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 4168372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz *pp_buf = p_buf; 4178372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 4188372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->rx_queue_size -= p_buf->len; 4198372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (BT_PASS); 4208372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 4218372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else 4228372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 4238372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz *pp_buf = NULL; 4248372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_NO_DATA_AVAIL); 4258372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 4268372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 4278372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 4288372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 4298372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 4308372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 4318372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function GAP_ConnBTWrite 4328372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 4338372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description Bluetooth Aware applications can call this function to write data. 4348372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 4358372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Parameters: handle - Handle of the connection returned in the Open 4368372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** p_buf - pointer to address of buffer with data, 4378372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 4388372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns BT_PASS - data read 4398372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** GAP_ERR_BAD_HANDLE - invalid handle 4408372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** GAP_ERR_BAD_STATE - connection not established 4418372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** GAP_INVALID_BUF_OFFSET - buffer offset is invalid 4428372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 4438372aa5fa535ee4f09c09981b6125b54ace31fe2Kim SchulzUINT16 GAP_ConnBTWrite (UINT16 gap_handle, BT_HDR *p_buf) 4448372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 4458372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle); 4468372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 4478372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (!p_ccb) 4488372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 449abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_buf); 4508372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_ERR_BAD_HANDLE); 4518372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 4528372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 4538372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_ccb->con_state != GAP_CCB_STATE_CONNECTED) 4548372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 455abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_buf); 4568372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_ERR_BAD_STATE); 4578372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 4588372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 4598372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_buf->offset < L2CAP_MIN_OFFSET) 4608372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 461abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_buf); 4628372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_ERR_BUF_OFFSET); 4638372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 4648372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 4651a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov fixed_queue_enqueue(p_ccb->tx_queue, p_buf); 4668372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 4678372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_ccb->is_congested) 4688372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 4698372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (BT_PASS); 4708372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 4718372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 4728372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Send the buffer through L2CAP */ 4738372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#if (GAP_CONN_POST_EVT_INCLUDED == TRUE) 4748372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_send_event (gap_handle); 4758372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#else 4761a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov while ((p_buf = (BT_HDR *)fixed_queue_try_dequeue(p_ccb->tx_queue)) != NULL) 4778372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 4788372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz UINT8 status = L2CA_DATA_WRITE (p_ccb->connection_id, p_buf); 4798372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 4808372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (status == L2CAP_DW_CONGESTED) 4818372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 4828372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->is_congested = TRUE; 4838372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz break; 4848372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 4858372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else if (status != L2CAP_DW_SUCCESS) 4868372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_ERR_BAD_STATE); 4878372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 4888372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#endif 4898372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (BT_PASS); 4908372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 4918372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 4928372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 4938372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 4948372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 4958372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function GAP_ConnWriteData 4968372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 4978372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description Normally not GKI aware application will call this function 4988372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** to send data to the connection. 4998372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 5008372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Parameters: handle - Handle of the connection returned in the Open 5018372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** p_data - Data area 5028372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** max_len - Byte count requested 5038372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** p_len - Byte count received 5048372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 5058372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns BT_PASS - data read 5068372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** GAP_ERR_BAD_HANDLE - invalid handle 5078372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** GAP_ERR_BAD_STATE - connection not established 5088372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** GAP_CONGESTION - system is congested 5098372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 5108372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 5118372aa5fa535ee4f09c09981b6125b54ace31fe2Kim SchulzUINT16 GAP_ConnWriteData (UINT16 gap_handle, UINT8 *p_data, UINT16 max_len, UINT16 *p_len) 5128372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 5138372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle); 5148372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz BT_HDR *p_buf; 5158372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 5168372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz *p_len = 0; 5178372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 5188372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (!p_ccb) 5198372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_ERR_BAD_HANDLE); 5208372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 5218372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_ccb->con_state != GAP_CCB_STATE_CONNECTED) 5228372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_ERR_BAD_STATE); 5238372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 5248372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz while (max_len) 5258372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 5268372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_ccb->cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) 527abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov p_buf = (BT_HDR *)osi_malloc(L2CAP_FCR_ERTM_BUF_SIZE); 5288372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else 529abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov p_buf = (BT_HDR *)osi_malloc(GAP_DATA_BUF_SIZE); 5308372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 5318372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_buf->offset = L2CAP_MIN_OFFSET; 5328372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_buf->len = (p_ccb->rem_mtu_size < max_len) ? p_ccb->rem_mtu_size : max_len; 5338372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_buf->event = BT_EVT_TO_BTU_SP_DATA; 5348372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 5358372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz memcpy ((UINT8 *)(p_buf + 1) + p_buf->offset, p_data, p_buf->len); 5368372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 5378372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz *p_len += p_buf->len; 5388372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz max_len -= p_buf->len; 5398372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_data += p_buf->len; 5408372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 5418372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_EVENT ("GAP_WriteData %d bytes", p_buf->len); 5428372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 5431a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov fixed_queue_enqueue(p_ccb->tx_queue, p_buf); 5448372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 5458372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 5468372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_ccb->is_congested) 5478372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 5488372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (BT_PASS); 5498372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 5508372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 5518372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Send the buffer through L2CAP */ 5528372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#if (GAP_CONN_POST_EVT_INCLUDED == TRUE) 5538372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_send_event (gap_handle); 5548372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#else 5551a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov while ((p_buf = (BT_HDR *)fixed_queue_try_dequeue(p_ccb->tx_queue)) != NULL) 5568372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 5578372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz UINT8 status = L2CA_DATA_WRITE (p_ccb->connection_id, p_buf); 5588372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 5598372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (status == L2CAP_DW_CONGESTED) 5608372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 5618372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->is_congested = TRUE; 5628372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz break; 5638372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 5648372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else if (status != L2CAP_DW_SUCCESS) 5658372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_ERR_BAD_STATE); 5668372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 5678372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#endif 5688372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (BT_PASS); 5698372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 5708372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 5718372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 5728372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 5738372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 5748372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function GAP_ConnReconfig 5758372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 5768372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description Applications can call this function to reconfigure the connection. 5778372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 5788372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Parameters: handle - Handle of the connection 5798372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** p_cfg - Pointer to new configuration 5808372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 5818372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns BT_PASS - config process started 5828372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** GAP_ERR_BAD_HANDLE - invalid handle 5838372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 5848372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 5858372aa5fa535ee4f09c09981b6125b54ace31fe2Kim SchulzUINT16 GAP_ConnReconfig (UINT16 gap_handle, tL2CAP_CFG_INFO *p_cfg) 5868372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 5878372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle); 5888372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 5898372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (!p_ccb) 5908372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_ERR_BAD_HANDLE); 5918372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 5928372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->cfg = *p_cfg; 5938372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 5948372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_ccb->con_state == GAP_CCB_STATE_CONNECTED) 5958372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz L2CA_CONFIG_REQ (p_ccb->connection_id, p_cfg); 5968372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 5978372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (BT_PASS); 5988372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 5998372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 6008372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 6018372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 6028372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 6038372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 6048372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function GAP_ConnSetIdleTimeout 6058372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 6068372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description Higher layers call this function to set the idle timeout for 6078372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** a connection, or for all future connections. The "idle timeout" 6088372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** is the amount of time that a connection can remain up with 6098372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** no L2CAP channels on it. A timeout of zero means that the 6108372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** connection will be torn down immediately when the last channel 6118372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** is removed. A timeout of 0xFFFF means no timeout. Values are 6128372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** in seconds. 6138372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 6148372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Parameters: handle - Handle of the connection 6158372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** timeout - in secs 6168372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 0 = immediate disconnect when last channel is removed 6178372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 0xFFFF = no idle timeout 6188372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 6198372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns BT_PASS - config process started 6208372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** GAP_ERR_BAD_HANDLE - invalid handle 6218372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 6228372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 6238372aa5fa535ee4f09c09981b6125b54ace31fe2Kim SchulzUINT16 GAP_ConnSetIdleTimeout (UINT16 gap_handle, UINT16 timeout) 6248372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 6258372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb; 6268372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 6278372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((p_ccb = gap_find_ccb_by_handle (gap_handle)) == NULL) 6288372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_ERR_BAD_HANDLE); 6298372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 6308372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (L2CA_SetIdleTimeout (p_ccb->connection_id, timeout, FALSE)) 6318372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (BT_PASS); 6328372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else 6338372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (GAP_ERR_BAD_HANDLE); 6348372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 6358372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 6368372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 6378372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 6388372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 6398372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 6408372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function GAP_ConnGetRemoteAddr 6418372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 6428372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description This function is called to get the remote BD address 6438372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** of a connection. 6448372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 6458372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Parameters: handle - Handle of the connection returned by GAP_ConnOpen 6468372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 6478372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns BT_PASS - closed OK 6488372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** GAP_ERR_BAD_HANDLE - invalid handle 6498372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 6508372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 6518372aa5fa535ee4f09c09981b6125b54ace31fe2Kim SchulzUINT8 *GAP_ConnGetRemoteAddr (UINT16 gap_handle) 6528372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 6538372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb = gap_find_ccb_by_handle (gap_handle); 6548372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 6558372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_EVENT ("GAP_ConnGetRemoteAddr gap_handle = %d", gap_handle); 6568372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 6578372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((p_ccb) && (p_ccb->con_state > GAP_CCB_STATE_LISTENING)) 6588372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 6598372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_EVENT("GAP_ConnGetRemoteAddr bda :0x%02x:0x%02x:0x%02x:0x%02x:0x%02x:0x%02x\n", \ 6608372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->rem_dev_address[0],p_ccb->rem_dev_address[1],p_ccb->rem_dev_address[2], 6618372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->rem_dev_address[3],p_ccb->rem_dev_address[4],p_ccb->rem_dev_address[5]); 6628372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (p_ccb->rem_dev_address); 6638372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 6648372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else 6658372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 6668372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_EVENT ("GAP_ConnGetRemoteAddr return Error "); 6678372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (NULL); 6688372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 6698372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 6708372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 6718372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 6728372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 6738372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 6748372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function GAP_ConnGetRemMtuSize 6758372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 6768372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description Returns the remote device's MTU size 6778372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 6788372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Parameters: handle - Handle of the connection 6798372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 6808372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns UINT16 - maximum size buffer that can be transmitted to the peer 6818372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 6828372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 6838372aa5fa535ee4f09c09981b6125b54ace31fe2Kim SchulzUINT16 GAP_ConnGetRemMtuSize (UINT16 gap_handle) 6848372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 6858372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb; 6868372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 6878372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((p_ccb = gap_find_ccb_by_handle (gap_handle)) == NULL) 6888372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (0); 6898372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 6908372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (p_ccb->rem_mtu_size); 6918372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 6928372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 6938372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 6948372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 6958372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function GAP_ConnGetL2CAPCid 6968372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 6978372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description Returns the L2CAP channel id 6988372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 6998372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Parameters: handle - Handle of the connection 7008372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 7018372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns UINT16 - The L2CAP channel id 7028372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 0, if error 7038372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 7048372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 7058372aa5fa535ee4f09c09981b6125b54ace31fe2Kim SchulzUINT16 GAP_ConnGetL2CAPCid (UINT16 gap_handle) 7068372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 7078372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb; 7088372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 7098372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((p_ccb = gap_find_ccb_by_handle (gap_handle)) == NULL) 7108372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (0); 7118372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 7128372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (p_ccb->connection_id); 7138372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 7148372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 7158372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 7168372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 7178372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 7188372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function gap_connect_ind 7198372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 7208372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description This function handles an inbound connection indication 7218372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** from L2CAP. This is the case where we are acting as a 7228372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** server. 7238372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 7248372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns void 7258372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 7268372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 7278372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic void gap_connect_ind (BD_ADDR bd_addr, UINT16 l2cap_cid, UINT16 psm, UINT8 l2cap_id) 7288372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 7298372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz UINT16 xx; 7308372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb; 7318372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 7328372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* See if we have a CCB listening for the connection */ 7338372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz for (xx = 0, p_ccb = gap_cb.conn.ccb_pool; xx < GAP_MAX_CONNECTIONS; xx++, p_ccb++) 7348372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 7358372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((p_ccb->con_state == GAP_CCB_STATE_LISTENING) 7368372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz && (p_ccb->psm == psm) 7378372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz && ((p_ccb->rem_addr_specified == FALSE) 7388372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz || (!memcmp (bd_addr, p_ccb->rem_dev_address, BD_ADDR_LEN)))) 7398372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz break; 7408372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 7418372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 7428372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (xx == GAP_MAX_CONNECTIONS) 7438372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 7448372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_WARNING("*******"); 7458372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_WARNING("WARNING: GAP Conn Indication for Unexpected Bd Addr...Disconnecting"); 7468372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_WARNING("*******"); 7478372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 7488372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Disconnect because it is an unexpected connection */ 7498372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz L2CA_DISCONNECT_REQ (l2cap_cid); 7508372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return; 7518372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 7528372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 7538372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Transition to the next appropriate state, waiting for config setup. */ 7548372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->con_state = GAP_CCB_STATE_CFG_SETUP; 7558372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 7568372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Save the BD Address and Channel ID. */ 7578372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz memcpy (&p_ccb->rem_dev_address[0], bd_addr, BD_ADDR_LEN); 7588372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->connection_id = l2cap_cid; 7598372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 7608372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Send response to the L2CAP layer. */ 761cab5fc179730ce6910989307680b275195876c4dArman Uguray L2CA_CONNECT_RSP (bd_addr, l2cap_id, l2cap_cid, L2CAP_CONN_OK, L2CAP_CONN_OK, &p_ccb->ertm_info); 7628372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 7638372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_EVENT("GAP_CONN - Rcvd L2CAP conn ind, CID: 0x%x", p_ccb->connection_id); 7648372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 7658372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Send a Configuration Request. */ 7668372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz L2CA_CONFIG_REQ (l2cap_cid, &p_ccb->cfg); 7678372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 7688372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 7698372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 7708372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 7718372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function gap_checks_con_flags 7728372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 7738372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description This function processes the L2CAP configuration indication 7748372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** event. 7758372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 7768372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns void 7778372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 7788372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 7798372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic void gap_checks_con_flags (tGAP_CCB *p_ccb) 7808372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 7818372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_EVENT ("gap_checks_con_flags conn_flags:0x%x, ", p_ccb->con_flags); 7828372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* if all the required con_flags are set, report the OPEN event now */ 7838372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((p_ccb->con_flags & GAP_CCB_FLAGS_CONN_DONE) == GAP_CCB_FLAGS_CONN_DONE) 7848372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 7858372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->con_state = GAP_CCB_STATE_CONNECTED; 7868372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 7878372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->p_callback (p_ccb->gap_handle, GAP_EVT_CONN_OPENED); 7888372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 7898372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 7908372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 7918372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 7928372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 7938372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function gap_sec_check_complete 7948372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 7958372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description The function called when Security Manager finishes 7968372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** verification of the service side connection 7978372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 7988372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns void 7998372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 8008372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 8018372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic void gap_sec_check_complete (BD_ADDR bd_addr, tBT_TRANSPORT transport, void *p_ref_data, UINT8 res) 8028372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 8038372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb = (tGAP_CCB *)p_ref_data; 8048372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz UNUSED(bd_addr); 8058372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz UNUSED (transport); 8068372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 8078372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_EVENT ("gap_sec_check_complete conn_state:%d, conn_flags:0x%x, status:%d", 8088372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->con_state, p_ccb->con_flags, res); 8098372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_ccb->con_state == GAP_CCB_STATE_IDLE) 8108372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return; 8118372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 8128372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (res == BTM_SUCCESS) 8138372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 8148372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->con_flags |= GAP_CCB_FLAGS_SEC_DONE; 8158372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_checks_con_flags (p_ccb); 8168372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 8178372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else 8188372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 8198372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* security failed - disconnect the channel */ 8208372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz L2CA_DISCONNECT_REQ (p_ccb->connection_id); 8218372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 8228372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 8238372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 8248372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 8258372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 8268372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function gap_connect_cfm 8278372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 8288372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description This function handles the connect confirm events 8298372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** from L2CAP. This is the case when we are acting as a 8308372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** client and have sent a connect request. 8318372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 8328372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns void 8338372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 8348372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 8358372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic void gap_connect_cfm (UINT16 l2cap_cid, UINT16 result) 8368372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 8378372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb; 8388372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 8398372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Find CCB based on CID */ 8408372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) 8418372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return; 8428372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 8438372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* initiate security process, if needed */ 8448372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ( (p_ccb->con_flags & GAP_CCB_FLAGS_SEC_DONE) == 0) 8458372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 8468372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz btm_sec_mx_access_request (p_ccb->rem_dev_address, p_ccb->psm, TRUE, 8478372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 0, 0, &gap_sec_check_complete, p_ccb); 8488372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 8498372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 8508372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* If the connection response contains success status, then */ 8518372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Transition to the next state and startup the timer. */ 8528372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((result == L2CAP_CONN_OK) && (p_ccb->con_state == GAP_CCB_STATE_CONN_SETUP)) 8538372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 8548372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->con_state = GAP_CCB_STATE_CFG_SETUP; 8558372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 8568372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Send a Configuration Request. */ 8578372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz L2CA_CONFIG_REQ (l2cap_cid, &p_ccb->cfg); 8588372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 8598372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else 8608372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 8618372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Tell the user if he has a callback */ 8628372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_ccb->p_callback) 8638372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz (*p_ccb->p_callback) (p_ccb->gap_handle, GAP_EVT_CONN_CLOSED); 8648372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 8658372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_release_ccb (p_ccb); 8668372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 8678372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 8688372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 8698372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 8708372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 8718372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function gap_config_ind 8728372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 8738372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description This function processes the L2CAP configuration indication 8748372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** event. 8758372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 8768372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns void 8778372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 8788372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 8798372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic void gap_config_ind (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg) 8808372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 8818372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb; 8828372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz UINT16 local_mtu_size; 8838372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 8848372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Find CCB based on CID */ 8858372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) 8868372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return; 8878372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 8888372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Remember the remote MTU size */ 8898372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 8908372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_ccb->cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) 8918372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 8921d5b85924df3a114efe6588e857d0de3eb47b1d2Pavlin Radoslavov local_mtu_size = p_ccb->ertm_info.user_tx_buf_size 8938372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz - sizeof(BT_HDR) - L2CAP_MIN_OFFSET; 8948372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 8958372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else 8968372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz local_mtu_size = L2CAP_MTU_SIZE; 8978372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 8988372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((!p_cfg->mtu_present)||(p_cfg->mtu > local_mtu_size)) 8998372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 9008372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->rem_mtu_size = local_mtu_size; 9018372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 9028372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else 9038372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->rem_mtu_size = p_cfg->mtu; 9048372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9058372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* For now, always accept configuration from the other side */ 9068372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_cfg->flush_to_present = FALSE; 9078372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_cfg->mtu_present = FALSE; 9088372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_cfg->result = L2CAP_CFG_OK; 9098372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_cfg->fcs_present = FALSE; 9108372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9118372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz L2CA_CONFIG_RSP (l2cap_cid, p_cfg); 9128372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9138372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->con_flags |= GAP_CCB_FLAGS_HIS_CFG_DONE; 9148372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9158372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_checks_con_flags (p_ccb); 9168372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 9178372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9188372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9198372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 9208372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 9218372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function gap_config_cfm 9228372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 9238372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description This function processes the L2CAP configuration confirmation 9248372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** event. 9258372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 9268372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns void 9278372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 9288372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 9298372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic void gap_config_cfm (UINT16 l2cap_cid, tL2CAP_CFG_INFO *p_cfg) 9308372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 9318372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb; 9328372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9338372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Find CCB based on CID */ 9348372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) 9358372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return; 9368372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9378372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_cfg->result == L2CAP_CFG_OK) 9388372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 9398372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->con_flags |= GAP_CCB_FLAGS_MY_CFG_DONE; 9408372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9418372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9428372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_ccb->cfg.fcr_present) 9438372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->cfg.fcr.mode = p_cfg->fcr.mode; 9448372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else 9458372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->cfg.fcr.mode = L2CAP_FCR_BASIC_MODE; 9468372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9478372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_checks_con_flags (p_ccb); 9488372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 9498372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else 9508372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 9518372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->p_callback (p_ccb->gap_handle, GAP_EVT_CONN_CLOSED); 9528372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_release_ccb (p_ccb); 9538372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 9548372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 9558372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9568372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9578372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 9588372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 9598372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function gap_disconnect_ind 9608372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 9618372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description This function handles a disconnect event from L2CAP. If 9628372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** requested to, we ack the disconnect before dropping the CCB 9638372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 9648372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns void 9658372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 9668372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 9678372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic void gap_disconnect_ind (UINT16 l2cap_cid, BOOLEAN ack_needed) 9688372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 9698372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb; 9708372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9718372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_EVENT ("GAP_CONN - Rcvd L2CAP disc, CID: 0x%x", l2cap_cid); 9728372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9738372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Find CCB based on CID */ 9748372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) 9758372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return; 9768372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9778372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (ack_needed) 9788372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz L2CA_DISCONNECT_RSP (l2cap_cid); 9798372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9808372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->p_callback (p_ccb->gap_handle, GAP_EVT_CONN_CLOSED); 9818372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz gap_release_ccb (p_ccb); 9828372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 9838372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9848372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9858372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 9868372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 9878372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function gap_data_ind 9888372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 9898372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description This function is called when data is received from L2CAP. 9908372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 9918372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns void 9928372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 9938372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 9948372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic void gap_data_ind (UINT16 l2cap_cid, BT_HDR *p_msg) 9958372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 9968372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb; 9978372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 9988372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Find CCB based on CID */ 9998372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((p_ccb = gap_find_ccb_by_cid (l2cap_cid)) == NULL) 10008372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 1001abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_msg); 10028372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return; 10038372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 10048372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 10058372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_ccb->con_state == GAP_CCB_STATE_CONNECTED) 10068372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 10071a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov fixed_queue_enqueue(p_ccb->rx_queue, p_msg); 10088372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 10098372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->rx_queue_size += p_msg->len; 10108372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* 10118372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_EVENT ("gap_data_ind - rx_queue_size=%d, msg len=%d", 10128372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->rx_queue_size, p_msg->len); 10138372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz */ 10148372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 10158372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->p_callback (p_ccb->gap_handle, GAP_EVT_CONN_DATA_AVAIL); 10168372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 10178372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else 10188372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 1019abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_msg); 10208372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 10218372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 10228372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 10238372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 10248372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 10258372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 10268372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function gap_congestion_ind 10278372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 10288372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description This is a callback function called by L2CAP when 10298372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** data L2CAP congestion status changes 10308372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 10318372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 10328372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic void gap_congestion_ind (UINT16 lcid, BOOLEAN is_congested) 10338372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 10348372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb; 10358372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz UINT16 event; 10368372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz BT_HDR *p_buf; 10378372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz UINT8 status; 10388372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 10398372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz GAP_TRACE_EVENT ("GAP_CONN - Rcvd L2CAP Is Congested (%d), CID: 0x%x", 10408372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz is_congested, lcid); 10418372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 10428372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Find CCB based on CID */ 10438372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((p_ccb = gap_find_ccb_by_cid (lcid)) == NULL) 10448372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return; 10458372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 10468372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->is_congested = is_congested; 10478372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 10488372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz event = (is_congested) ? GAP_EVT_CONN_CONGESTED : GAP_EVT_CONN_UNCONGESTED; 10498372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->p_callback (p_ccb->gap_handle, event); 10508372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 10518372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (!is_congested) 10528372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 10531a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov while ((p_buf = (BT_HDR *)fixed_queue_try_dequeue(p_ccb->tx_queue)) != NULL) 10548372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 10558372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz status = L2CA_DATA_WRITE (p_ccb->connection_id, p_buf); 10568372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 10578372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (status == L2CAP_DW_CONGESTED) 10588372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 10598372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->is_congested = TRUE; 10608372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz break; 10618372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 10628372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else if (status != L2CAP_DW_SUCCESS) 10638372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz break; 10648372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 10658372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 10668372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 10678372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 10688372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 10698372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 10708372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 10718372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function gap_find_ccb_by_cid 10728372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 10738372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description This function searches the CCB table for an entry with the 10748372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** passed CID. 10758372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 10768372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns the CCB address, or NULL if not found. 10778372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 10788372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 10798372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic tGAP_CCB *gap_find_ccb_by_cid (UINT16 cid) 10808372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 10818372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz UINT16 xx; 10828372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb; 10838372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 10848372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Look through each connection control block */ 10858372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz for (xx = 0, p_ccb = gap_cb.conn.ccb_pool; xx < GAP_MAX_CONNECTIONS; xx++, p_ccb++) 10868372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 10878372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((p_ccb->con_state != GAP_CCB_STATE_IDLE) && (p_ccb->connection_id == cid)) 10888372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (p_ccb); 10898372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 10908372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 10918372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* If here, not found */ 10928372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (NULL); 10938372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 10948372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 10958372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 10968372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 10978372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 10988372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function gap_find_ccb_by_handle 10998372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 11008372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description This function searches the CCB table for an entry with the 11018372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** passed handle. 11028372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 11038372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns the CCB address, or NULL if not found. 11048372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 11058372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 11068372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic tGAP_CCB *gap_find_ccb_by_handle (UINT16 handle) 11078372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 11088372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb; 11098372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 11108372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Check that handle is valid */ 11118372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (handle < GAP_MAX_CONNECTIONS) 11128372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 11138372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb = &gap_cb.conn.ccb_pool[handle]; 11148372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 11158372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_ccb->con_state != GAP_CCB_STATE_IDLE) 11168372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (p_ccb); 11178372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 11188372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 11198372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* If here, handle points to invalid connection */ 11208372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (NULL); 11218372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 11228372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 11238372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 11248372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 11258372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 11268372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function gap_allocate_ccb 11278372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 11288372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description This function allocates a new CCB. 11298372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 11308372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns CCB address, or NULL if none available. 11318372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 11328372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 11338372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic tGAP_CCB *gap_allocate_ccb (void) 11348372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 11358372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz UINT16 xx; 11368372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb; 11378372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 11388372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Look through each connection control block for a free one */ 11398372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz for (xx = 0, p_ccb = gap_cb.conn.ccb_pool; xx < GAP_MAX_CONNECTIONS; xx++, p_ccb++) 11408372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 11418372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_ccb->con_state == GAP_CCB_STATE_IDLE) 11428372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 11438372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz memset (p_ccb, 0, sizeof (tGAP_CCB)); 11441a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov p_ccb->tx_queue = fixed_queue_new(SIZE_MAX); 11451a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov p_ccb->rx_queue = fixed_queue_new(SIZE_MAX); 11468372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 11478372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->gap_handle = xx; 11488372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->rem_mtu_size = L2CAP_MTU_SIZE; 11498372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 11508372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (p_ccb); 11518372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 11528372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 11538372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 11548372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* If here, no free CCB found */ 11558372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return (NULL); 11568372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 11578372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 11588372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 11598372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 11608372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 11618372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function gap_release_ccb 11628372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 11638372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description This function releases a CCB. 11648372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 11658372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns void 11668372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 11678372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 11688372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzstatic void gap_release_ccb (tGAP_CCB *p_ccb) 11698372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 11708372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz UINT16 xx; 11718372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz UINT16 psm = p_ccb->psm; 11728372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz UINT8 service_id = p_ccb->service_id; 11738372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 11748372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Drop any buffers we may be holding */ 11758372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->rx_queue_size = 0; 11768372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 11771a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov while (!fixed_queue_is_empty(p_ccb->rx_queue)) 1178abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(fixed_queue_try_dequeue(p_ccb->rx_queue)); 11791a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov fixed_queue_free(p_ccb->rx_queue, NULL); 11801a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov p_ccb->rx_queue = NULL; 11818372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 11821a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov while (!fixed_queue_is_empty(p_ccb->tx_queue)) 1183abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(fixed_queue_try_dequeue(p_ccb->tx_queue)); 11841a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov fixed_queue_free(p_ccb->tx_queue, NULL); 11851a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov p_ccb->tx_queue = NULL; 11868372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 11878372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->con_state = GAP_CCB_STATE_IDLE; 11888372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 11898372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* If no-one else is using the PSM, deregister from L2CAP */ 11908372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz for (xx = 0, p_ccb = gap_cb.conn.ccb_pool; xx < GAP_MAX_CONNECTIONS; xx++, p_ccb++) 11918372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 11928372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if ((p_ccb->con_state != GAP_CCB_STATE_IDLE) && (p_ccb->psm == psm)) 11938372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return; 11948372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 11958372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 11968372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Free the security record for this PSM */ 11978372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz BTM_SecClrService(service_id); 11988372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz L2CA_DEREGISTER (psm); 11998372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 12008372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 12018372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#if (GAP_CONN_POST_EVT_INCLUDED == TRUE) 12028372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 12038372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 12048372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 12058372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function gap_send_event 12068372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 12078372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description Send BT_EVT_TO_GAP_MSG event to BTU task 12088372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 12098372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns None 12108372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 12118372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 12128372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzvoid gap_send_event (UINT16 gap_handle) 12138372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 12145fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov BT_HDR *p_msg = (BT_HDR *)osi_malloc(BT_HDR_SIZE); 12158372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 12165fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_msg->event = BT_EVT_TO_GAP_MSG; 12175fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_msg->len = 0; 12185fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_msg->offset = 0; 12195fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_msg->layer_specific = gap_handle; 12208372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 12215fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov GKI_send_msg(BTU_TASK, BTU_HCI_RCV_MBOX, p_msg); 12228372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 12238372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 12248372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz/******************************************************************************* 12258372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 12268372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Function gap_proc_btu_event 12278372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 12288372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Description Event handler for BT_EVT_TO_GAP_MSG event from BTU task 12298372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 12308372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** Returns None 12318372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz** 12328372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz*******************************************************************************/ 12338372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulzvoid gap_proc_btu_event(BT_HDR *p_msg) 12348372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz{ 12358372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz tGAP_CCB *p_ccb = gap_find_ccb_by_handle (p_msg->layer_specific); 12368372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz UINT8 status; 12378372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz BT_HDR *p_buf; 12388372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 12398372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (!p_ccb) 12408372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 12418372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return; 12428372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 12438372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 12448372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_ccb->con_state != GAP_CCB_STATE_CONNECTED) 12458372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 12468372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return; 12478372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 12488372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 12498372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (p_ccb->is_congested) 12508372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 12518372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz return; 12528372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 12538372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 12548372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz /* Send the buffer through L2CAP */ 12558372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 12561a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov while ((p_buf = (BT_HDR *)fixed_queue_try_dequeue(&p_ccb->tx_queue)) != NULL) 12578372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 12588372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz status = L2CA_DATA_WRITE (p_ccb->connection_id, p_buf); 12598372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 12608372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz if (status == L2CAP_DW_CONGESTED) 12618372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz { 12628372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz p_ccb->is_congested = TRUE; 12638372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz break; 12648372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 12658372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz else if (status != L2CAP_DW_SUCCESS) 12668372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz break; 12678372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz } 12688372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz 12698372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz} 12708372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#endif /* (GAP_CONN_POST_EVT_INCLUDED == TRUE) */ 12718372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz#endif /* GAP_CONN_INCLUDED */ 1272