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