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