llcp_api.cc revision e9df6ba5a8fcccf306a80b1670b423be8fe7746
1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Copyright (C) 2010-2012 Broadcom Corporation
4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  you may not use this file except in compliance with the License.
7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  You may obtain a copy of the License at:
8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  See the License for the specific language governing permissions and
15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  limitations under the License.
16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  This file contains the LLCP API code
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h"
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_target.h"
28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "bt_types.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llcp_api.h"
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llcp_int.h"
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llcp_defs.h"
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (LLCP_TEST_INCLUDED == TRUE) /* this is for LLCP testing */
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttLLCP_TEST_PARAMS llcp_test_params =
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_VERSION_VALUE,
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    0,                             /* not override */
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_SetTestParams
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set test parameters for LLCP
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid LLCP_SetTestParams (UINT8 version, UINT16 wks)
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API2 ("LLCP_SetTestParams () version:0x%02X, wks:0x%04X",
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     version, wks);
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (version != 0xFF)
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_test_params.version = version;
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (wks != 0xFFFF)
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_test_params.wks = wks;
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_RegisterDtaCback
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Register callback function for LLCP DTA testing
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid LLCP_RegisterDtaCback (tLLCP_DTA_CBACK *p_dta_cback)
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API0 ("LLCP_RegisterDtaCback ()");
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.p_dta_cback = p_dta_cback;
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_SetConfig
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set configuration parameters for LLCP
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Local Link MIU
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Option parameter
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Response Waiting Time Index
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Local Link Timeout
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Inactivity Timeout as initiator role
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Inactivity Timeout as target role
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Delay SYMM response
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Data link connection timeout
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Delay timeout to send first PDU as initiator
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid LLCP_SetConfig (UINT16 link_miu,
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     UINT8  opt,
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     UINT8  wt,
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     UINT16 link_timeout,
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     UINT16 inact_timeout_init,
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     UINT16 inact_timeout_target,
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     UINT16 symm_delay,
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     UINT16 data_link_timeout,
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     UINT16 delay_first_pdu_timeout)
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API4 ("LLCP_SetConfig () link_miu:%d, opt:0x%02X, wt:%d, link_timeout:%d",
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     link_miu, opt, wt, link_timeout);
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API4 ("                 inact_timeout (init:%d,target:%d), symm_delay:%d, data_link_timeout:%d",
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     inact_timeout_init, inact_timeout_target, symm_delay, data_link_timeout);
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API1 ("                 delay_first_pdu_timeout:%d", delay_first_pdu_timeout);
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (link_miu < LLCP_DEFAULT_MIU)
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR1 ("LLCP_SetConfig (): link_miu shall not be smaller than LLCP_DEFAULT_MIU (%d)",
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            LLCP_DEFAULT_MIU);
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        link_miu = LLCP_DEFAULT_MIU;
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (link_miu > LLCP_MAX_MIU)
122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR1 ("LLCP_SetConfig (): link_miu shall not be bigger than LLCP_MAX_MIU (%d)",
124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            LLCP_MAX_MIU);
125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        link_miu = LLCP_MAX_MIU;
126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if Link MIU is bigger than GKI buffer */
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (link_miu > LLCP_MIU)
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR1 ("LLCP_SetConfig (): link_miu shall not be bigger than LLCP_MIU (%d)",
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            LLCP_MIU);
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.local_link_miu = LLCP_MIU;
134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.local_link_miu = link_miu;
137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.lcb.local_opt = opt;
139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.lcb.local_wt  = wt;
140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (link_timeout < LLCP_LTO_UNIT)
142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR1 ("LLCP_SetConfig (): link_timeout shall not be smaller than LLCP_LTO_UNIT (%d ms)",
144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            LLCP_LTO_UNIT);
145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.local_lto = LLCP_DEFAULT_LTO_IN_MS;
146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (link_timeout > LLCP_MAX_LTO_IN_MS)
148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR1 ("LLCP_SetConfig (): link_timeout shall not be bigger than LLCP_MAX_LTO_IN_MS (%d ms)",
150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            LLCP_MAX_LTO_IN_MS);
151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.local_lto = LLCP_MAX_LTO_IN_MS;
152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.local_lto = link_timeout;
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.lcb.inact_timeout_init   = inact_timeout_init;
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.lcb.inact_timeout_target = inact_timeout_target;
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.lcb.symm_delay           = symm_delay;
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.lcb.data_link_timeout    = data_link_timeout;
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.lcb.delay_first_pdu_timeout = delay_first_pdu_timeout;
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_GetConfig
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Get configuration parameters for LLCP
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Local Link MIU
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Option parameter
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Response Waiting Time Index
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Local Link Timeout
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Inactivity Timeout as initiator role
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Inactivity Timeout as target role
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Delay SYMM response
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Data link connection timeout
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Delay timeout to send first PDU as initiator
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid LLCP_GetConfig (UINT16 *p_link_miu,
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     UINT8  *p_opt,
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     UINT8  *p_wt,
184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     UINT16 *p_link_timeout,
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     UINT16 *p_inact_timeout_init,
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     UINT16 *p_inact_timeout_target,
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     UINT16 *p_symm_delay,
188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     UINT16 *p_data_link_timeout,
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     UINT16 *p_delay_first_pdu_timeout)
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_link_miu             = llcp_cb.lcb.local_link_miu;
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_opt                  = llcp_cb.lcb.local_opt;
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_wt                   = llcp_cb.lcb.local_wt;
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_link_timeout         = llcp_cb.lcb.local_lto;
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_inact_timeout_init   = llcp_cb.lcb.inact_timeout_init;
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_inact_timeout_target = llcp_cb.lcb.inact_timeout_target;
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_symm_delay           = llcp_cb.lcb.symm_delay;
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_data_link_timeout    = llcp_cb.lcb.data_link_timeout;
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_delay_first_pdu_timeout = llcp_cb.lcb.delay_first_pdu_timeout;
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API4 ("LLCP_GetConfig () link_miu:%d, opt:0x%02X, wt:%d, link_timeout:%d",
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     *p_link_miu, *p_opt, *p_wt, *p_link_timeout);
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API4 ("                 inact_timeout (init:%d, target:%d), symm_delay:%d, data_link_timeout:%d",
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     *p_inact_timeout_init, *p_inact_timeout_target, *p_symm_delay, *p_data_link_timeout);
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API1 ("                 delay_first_pdu_timeout:%d", *p_delay_first_pdu_timeout);
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_GetDiscoveryConfig
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Returns discovery config for ISO 18092 MAC link activation
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  This function is called to get general bytes for NFC_PMID_ATR_REQ_GEN_BYTES
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  or NFC_PMID_ATR_RES_GEN_BYTES before starting discovery.
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  wt:Waiting time 0 - 8, only for listen
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  p_gen_bytes: pointer to store LLCP magic number and paramters
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  p_gen_bytes_len: length of buffer for gen bytes as input
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                                   (NOTE:it must be bigger than LLCP_MIN_GEN_BYTES)
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                                   actual gen bytes size as output
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Restrictions on the use of ISO 18092
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  1. The DID features shall not be used.
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  2. the NAD features shall not be used.
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  3. Frame waiting time extentions (WTX) shall not be used.
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid LLCP_GetDiscoveryConfig (UINT8 *p_wt,
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                              UINT8 *p_gen_bytes,
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                              UINT8 *p_gen_bytes_len)
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8      *p = p_gen_bytes;
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API0 ("LLCP_GetDiscoveryConfig ()");
237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (*p_gen_bytes_len < LLCP_MIN_GEN_BYTES)
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR1 ("LLCP_GetDiscoveryConfig (): GenBytes length shall not be smaller than LLCP_MIN_GEN_BYTES (%d)",
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            LLCP_MIN_GEN_BYTES);
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *p_gen_bytes_len = 0;
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return;
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_wt = llcp_cb.lcb.local_wt;
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_MAGIC_NUMBER_BYTE0);
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_MAGIC_NUMBER_BYTE1);
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_MAGIC_NUMBER_BYTE2);
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (LLCP_TEST_INCLUDED == TRUE) /* this is for LLCP testing */
253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_VERSION_TYPE);
254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_VERSION_LEN);
255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, llcp_test_params.version);
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_MIUX_TYPE);
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_MIUX_LEN);
259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, (llcp_cb.lcb.local_link_miu - LLCP_DEFAULT_MIU));
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_WKS_TYPE);
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_WKS_LEN);
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_test_params.wks == 0)  /* not override */
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_BE_STREAM (p, llcp_cb.lcb.wks);
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        UINT16_TO_BE_STREAM (p, llcp_test_params.wks);
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_VERSION_TYPE);
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_VERSION_LEN);
274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_VERSION_VALUE);
275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_MIUX_TYPE);
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_MIUX_LEN);
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, (llcp_cb.lcb.local_link_miu - LLCP_DEFAULT_MIU));
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_WKS_TYPE);
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_WKS_LEN);
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16_TO_BE_STREAM (p, llcp_cb.lcb.wks);
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_LTO_TYPE);
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_LTO_LEN);
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, (llcp_cb.lcb.local_lto/LLCP_LTO_UNIT));
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_OPT_TYPE);
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, LLCP_OPT_LEN);
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8_TO_BE_STREAM (p, llcp_cb.lcb.local_opt);
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_gen_bytes_len = (UINT8) (p - p_gen_bytes);
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_ActivateLink
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function will activate LLCP link with LR, WT and Gen Bytes
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  in activation NTF from NFCC.
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_LINK_ACTIVATION_COMPLETE_EVT will be returned through
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  callback function if successful.
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Otherwise, LLCP_LINK_ACTIVATION_FAILED_EVT will be returned.
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttLLCP_STATUS LLCP_ActivateLink (tLLCP_ACTIVATE_CONFIG config,
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                tLLCP_LINK_CBACK     *p_link_cback)
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API1 ("LLCP_ActivateLink () link_state = %d", llcp_cb.lcb.link_state);
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (llcp_cb.lcb.link_state == LLCP_LINK_STATE_DEACTIVATED)
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&(p_link_cback)  )
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.p_link_cback = p_link_cback;
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (llcp_link_activate (&config));
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_FAIL;
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_DeactivateLink
328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Deactivate LLCP link
330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_LINK_DEACTIVATED_EVT will be returned through callback
332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  when LLCP link is deactivated. Then NFC link may be deactivated.
333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttLLCP_STATUS LLCP_DeactivateLink (void)
338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API1 ("LLCP_DeactivateLink () link_state = %d", llcp_cb.lcb.link_state);
340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.lcb.link_state != LLCP_LINK_STATE_DEACTIVATED)
342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_link_deactivate (LLCP_LINK_LOCAL_INITIATED);
344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_SUCCESS;
345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_FAIL;
348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_RegisterServer
353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Register server and callback function
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  reg_sap : Well-Known SAP except LM and SDP (0x02 - 0x0F)
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                            Advertized by SDP (0x10 - 0x1F)
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                            LLCP_INVALID_SAP, LLCP will allocate between 0x10 and 0x1F
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  link_type : LLCP_LINK_TYPE_LOGICAL_DATA_LINK
360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                              and/or LLCP_LINK_TYPE_DATA_LINK_CONNECTION
361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  p_service_name : Null-terminated string up to LLCP_MAX_SN_LEN
362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          SAP between 0x02 and 0x1F, if success
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_INVALID_SAP, otherwise
365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 LLCP_RegisterServer (UINT8           reg_sap,
368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                           UINT8           link_type,
369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                           char            *p_service_name,
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                           tLLCP_APP_CBACK *p_app_cback)
371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8  sap;
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16 length;
374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_APP_CB *p_app_cb;
375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API3 ("LLCP_RegisterServer (): SAP:0x%x, link_type:0x%x, ServiceName:<%s>",
377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     reg_sap, link_type, ((p_service_name == NULL) ? "" : p_service_name));
378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!p_app_cback)
380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_RegisterServer (): Callback must be provided");
382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_INVALID_SAP;
383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (  ((link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) == 0x00)
385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             &&((link_type & LLCP_LINK_TYPE_DATA_LINK_CONNECTION) == 0x00)  )
386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR1 ("LLCP_RegisterServer (): link type (0x%x) must be specified", link_type);
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_INVALID_SAP;
389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (reg_sap == LLCP_INVALID_SAP)
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* allocate a SAP between 0x10 and 0x1F */
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        for (sap = 0; sap <= LLCP_MAX_SERVER; sap++)
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (llcp_cb.server_cb[sap].p_app_cback == NULL)
397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_app_cb = &llcp_cb.server_cb[sap];
399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                reg_sap  = LLCP_LOWER_BOUND_SDP_SAP + sap;
400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                break;
401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (reg_sap == LLCP_INVALID_SAP)
405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            LLCP_TRACE_ERROR0 ("LLCP_RegisterServer (): out of resource");
407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return LLCP_INVALID_SAP;
408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (reg_sap == LLCP_SAP_LM)
411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR1 ("LLCP_RegisterServer (): SAP (0x%x) is for link manager", reg_sap);
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_INVALID_SAP;
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (reg_sap <= LLCP_UPPER_BOUND_WK_SAP)
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (reg_sap >= LLCP_MAX_WKS)
418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            LLCP_TRACE_ERROR1 ("LLCP_RegisterServer (): out of resource for SAP (0x%x)", reg_sap);
420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return LLCP_INVALID_SAP;
421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (llcp_cb.wks_cb[reg_sap].p_app_cback)
423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            LLCP_TRACE_ERROR1 ("LLCP_RegisterServer (): SAP (0x%x) is already registered", reg_sap);
425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return LLCP_INVALID_SAP;
426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_app_cb = &llcp_cb.wks_cb[reg_sap];
430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (reg_sap <= LLCP_UPPER_BOUND_SDP_SAP)
433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (reg_sap - LLCP_LOWER_BOUND_SDP_SAP >= LLCP_MAX_SERVER)
435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            LLCP_TRACE_ERROR1 ("LLCP_RegisterServer (): out of resource for SAP (0x%x)", reg_sap);
437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return LLCP_INVALID_SAP;
438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (llcp_cb.server_cb[reg_sap - LLCP_LOWER_BOUND_SDP_SAP].p_app_cback)
440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            LLCP_TRACE_ERROR1 ("LLCP_RegisterServer (): SAP (0x%x) is already registered", reg_sap);
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return LLCP_INVALID_SAP;
443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_app_cb = &llcp_cb.server_cb[reg_sap - LLCP_LOWER_BOUND_SDP_SAP];
447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (reg_sap >= LLCP_LOWER_BOUND_LOCAL_SAP)
450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR2 ("LLCP_RegisterServer (): SAP (0x%x) must be less than 0x%x",
452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            reg_sap, LLCP_LOWER_BOUND_LOCAL_SAP);
453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_INVALID_SAP;
454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memset (p_app_cb, 0x00, sizeof (tLLCP_APP_CB));
457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_service_name)
459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        length = (UINT8) strlen (p_service_name);
461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (length > LLCP_MAX_SN_LEN)
462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            LLCP_TRACE_ERROR1 ("LLCP_RegisterServer (): Service Name (%d bytes) is too long", length);
464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return LLCP_INVALID_SAP;
465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_app_cb->p_service_name = (UINT8 *) GKI_getbuf ((UINT16) (length + 1));
468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_app_cb->p_service_name == NULL)
469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            LLCP_TRACE_ERROR0 ("LLCP_RegisterServer (): Out of resource");
471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return LLCP_INVALID_SAP;
472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        BCM_STRNCPY_S ((char *) p_app_cb->p_service_name, length + 1, (char *) p_service_name, length + 1);
475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_app_cb->p_service_name[length] = 0;
476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_app_cb->p_service_name = NULL;
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_app_cb->p_app_cback = p_app_cback;
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_app_cb->link_type   = link_type;
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (reg_sap <= LLCP_UPPER_BOUND_WK_SAP)
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.wks |= (1 << reg_sap);
486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_DEBUG1 ("LLCP_RegisterServer (): Registered SAP = 0x%02X", reg_sap);
489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK)
491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.num_logical_data_link++;
493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_util_adjust_ll_congestion ();
494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return reg_sap;
497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_RegisterClient
502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Register client and callback function
504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  link_type : LLCP_LINK_TYPE_LOGICAL_DATA_LINK
506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                              and/or LLCP_LINK_TYPE_DATA_LINK_CONNECTION
507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          SAP between 0x20 and 0x3F, if success
509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_INVALID_SAP, otherwise
510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 LLCP_RegisterClient (UINT8           link_type,
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                           tLLCP_APP_CBACK *p_app_cback)
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 reg_sap = LLCP_INVALID_SAP;
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 sap;
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_APP_CB *p_app_cb;
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API1 ("LLCP_RegisterClient (): link_type = 0x%x", link_type);
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!p_app_cback)
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_RegisterClient (): Callback must be provided");
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_INVALID_SAP;
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (  ((link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) == 0x00)
527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             &&((link_type & LLCP_LINK_TYPE_DATA_LINK_CONNECTION) == 0x00)  )
528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR1 ("LLCP_RegisterClient (): link type (0x%x) must be specified", link_type);
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_INVALID_SAP;
531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* allocate a SAP between 0x20 and 0x3F */
534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (sap = 0; sap <= LLCP_MAX_CLIENT; sap++)
535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (llcp_cb.client_cb[sap].p_app_cback == NULL)
537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_app_cb = &llcp_cb.client_cb[sap];
539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            memset (p_app_cb, 0x00, sizeof (tLLCP_APP_CB));
540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            reg_sap = LLCP_LOWER_BOUND_LOCAL_SAP + sap;
541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            break;
542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (reg_sap == LLCP_INVALID_SAP)
546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_RegisterClient (): out of resource");
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_INVALID_SAP;
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_app_cb->p_app_cback    = p_app_cback;
552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_app_cb->p_service_name = NULL;
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_app_cb->link_type      = link_type;
554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_DEBUG1 ("LLCP_RegisterClient (): Registered SAP = 0x%02X", reg_sap);
556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK)
558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.num_logical_data_link++;
560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_util_adjust_ll_congestion ();
561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return reg_sap;
564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_Deregister
569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Deregister server or client
571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttLLCP_STATUS LLCP_Deregister (UINT8 local_sap)
577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8 idx;
579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_APP_CB *p_app_cb;
580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API1 ("LLCP_Deregister () SAP:0x%x", local_sap);
582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_app_cb = llcp_util_get_app_cb (local_sap);
584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((!p_app_cb) || (p_app_cb->p_app_cback == NULL))
586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR1 ("LLCP_Deregister (): SAP (0x%x) is not registered", local_sap);
588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_FAIL;
589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_app_cb->p_service_name)
592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_app_cb->p_service_name);
593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* update WKS bit map */
595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (local_sap <= LLCP_UPPER_BOUND_WK_SAP)
596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.lcb.wks &= ~ (1 << local_sap);
598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* discard any received UI PDU on this SAP */
601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_FlushLogicalLinkRxData (local_sap);
602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_cb.total_rx_ui_pdu = 0;
603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* deallocate any data link connection on this SAP */
605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (idx = 0; idx < LLCP_MAX_DATA_LINK; idx++)
606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (llcp_cb.dlcb[idx].state != LLCP_DLC_STATE_IDLE)
608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(llcp_cb.dlcb[idx].local_sap == local_sap)  )
609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_util_deallocate_data_link (&llcp_cb.dlcb[idx]);
611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_app_cb->p_app_cback = NULL;
615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* discard any pending tx UI PDU from this SAP */
617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (p_app_cb->ui_xmit_q.p_first)
618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (GKI_dequeue (&p_app_cb->ui_xmit_q));
620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.total_tx_ui_pdu--;
621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK)
624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_cb.num_logical_data_link--;
626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_util_adjust_ll_congestion ();
627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* check rx congestion status */
630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    llcp_util_check_rx_congested_status ();
631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return LLCP_STATUS_SUCCESS;
633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_IsLogicalLinkCongested
638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Check if logical link is congested
640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if congested
643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN LLCP_IsLogicalLinkCongested (UINT8 local_sap,
646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                     UINT8 num_pending_ui_pdu,
647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                     UINT8 total_pending_ui_pdu,
648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                     UINT8 total_pending_i_pdu)
649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_APP_CB *p_app_cb;
651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API4 ("LLCP_IsLogicalLinkCongested () Local SAP:0x%x, pending = (%d, %d, %d)",
653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     local_sap, num_pending_ui_pdu, total_pending_ui_pdu, total_pending_i_pdu);
654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_app_cb = llcp_util_get_app_cb (local_sap);
656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (llcp_cb.lcb.link_state != LLCP_LINK_STATE_ACTIVATED)
658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||(p_app_cb == NULL)
659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||(p_app_cb->p_app_cback == NULL)
660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||((p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) == 0)
661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||(p_app_cb->is_ui_tx_congested)  )
662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (TRUE);
664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (  (num_pending_ui_pdu + p_app_cb->ui_xmit_q.count >= llcp_cb.ll_tx_congest_start)
666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             ||(total_pending_ui_pdu + llcp_cb.total_tx_ui_pdu >= llcp_cb.max_num_ll_tx_buff)
667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             ||(total_pending_ui_pdu + total_pending_i_pdu + llcp_cb.total_tx_ui_pdu + llcp_cb.total_tx_i_pdu >= llcp_cb.max_num_tx_buff)  )
668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* set flag so LLCP can notify uncongested status later */
670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_app_cb->is_ui_tx_congested = TRUE;
671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (TRUE);
673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (FALSE);
675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_SendUI
680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send connnectionless data to DSAP
682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_STATUS_CONGESTED if logical link is congested
686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_STATUS_FAIL, otherwise
687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttLLCP_STATUS LLCP_SendUI (UINT8   ssap,
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          UINT8   dsap,
691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                          BT_HDR *p_buf)
692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_STATUS status = LLCP_STATUS_FAIL;
694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_APP_CB *p_app_cb;
695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API2 ("LLCP_SendUI () SSAP=0x%x, DSAP=0x%x", ssap, dsap);
697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_app_cb = llcp_util_get_app_cb (ssap);
699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (p_app_cb == NULL)
701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||(p_app_cb->p_app_cback == NULL)  )
702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR1 ("LLCP_SendUI (): SSAP (0x%x) is not registered", ssap);
704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if ((p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) == 0)
706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR1 ("LLCP_SendUI (): Logical link on SSAP (0x%x) is not enabled", ssap);
708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (llcp_cb.lcb.link_state != LLCP_LINK_STATE_ACTIVATED)
710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_SendUI (): LLCP link is not activated");
712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (  (llcp_cb.lcb.peer_opt == LLCP_LSC_UNKNOWN)
714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project             ||(llcp_cb.lcb.peer_opt & LLCP_LSC_1)  )
715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_buf->len <= llcp_cb.lcb.peer_miu)
717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_buf->offset >= LLCP_MIN_OFFSET)
719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                status = llcp_util_send_ui (ssap, dsap, p_app_cb, p_buf);
721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                LLCP_TRACE_ERROR2 ("LLCP_SendUI (): offset (%d) must be %d at least",
725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    p_buf->offset, LLCP_MIN_OFFSET );
726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            LLCP_TRACE_ERROR0 ("LLCP_SendUI (): Data length shall not be bigger than peer's link MIU");
731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_SendUI (): Peer doesn't support connectionless link");
736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status == LLCP_STATUS_FAIL)
739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_buf);
741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_ReadLogicalLinkData
749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Read information of UI PDU for local SAP
751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Remote SAP who sent UI PDU is returned.
753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Information of UI PDU up to max_data_len is copied into p_data.
754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Information of next UI PDU is not concatenated.
755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Recommended max_data_len is link MIU of local device
756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if more information of UI PDU or more UI PDU in queue
758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN LLCP_ReadLogicalLinkData (UINT8  local_sap,
761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                  UINT32 max_data_len,
762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                  UINT8  *p_remote_sap,
763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                  UINT32 *p_data_len,
764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                  UINT8  *p_data)
765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_APP_CB *p_app_cb;
767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR       *p_buf;
768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8        *p_ui_pdu;
769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16       pdu_hdr, ui_pdu_length;
770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API1 ("LLCP_ReadLogicalLinkData () Local SAP:0x%x", local_sap);
772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_data_len = 0;
774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_app_cb = llcp_util_get_app_cb (local_sap);
776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if application is registered */
778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_app_cb) && (p_app_cb->p_app_cback))
779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if any UI PDU in rx queue */
781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_app_cb->ui_rx_q.p_first)
782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_buf    = (BT_HDR *) p_app_cb->ui_rx_q.p_first;
784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_ui_pdu = (UINT8*) (p_buf + 1) + p_buf->offset;
785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* get length of UI PDU */
787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            BE_STREAM_TO_UINT16 (ui_pdu_length, p_ui_pdu);
788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* get remote SAP from LLCP header */
790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            BE_STREAM_TO_UINT16 (pdu_hdr, p_ui_pdu);
791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            *p_remote_sap = LLCP_GET_SSAP (pdu_hdr);
792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* layer_specific has the offset to read within UI PDU */
794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_ui_pdu += p_buf->layer_specific;
795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* copy data up to max_data_len */
797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (max_data_len >= (UINT32) (ui_pdu_length - LLCP_PDU_HEADER_SIZE - p_buf->layer_specific))
798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* copy information without LLCP header */
800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                *p_data_len = (UINT32) (ui_pdu_length - LLCP_PDU_HEADER_SIZE - p_buf->layer_specific);
801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* move to next UI PDU if any */
803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_buf->layer_specific = 0;  /* reset offset to read from the first byte of next UI PDU */
804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_buf->offset += LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length;
805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_buf->len    -= LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length;
806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                *p_data_len = max_data_len;
810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* update offset to read from remaining UI PDU next time */
812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_buf->layer_specific += max_data_len;
813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            memcpy (p_data, p_ui_pdu, *p_data_len);
816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* if read all of UI PDU */
818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_buf->len == 0)
819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                GKI_dequeue (&p_app_cb->ui_rx_q);
821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                GKI_freebuf (p_buf);
822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* decrease number of received UI PDU in in all of ui_rx_q and check rx congestion status */
824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_cb.total_rx_ui_pdu--;
825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_util_check_rx_congested_status ();
826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if there is more UI PDU in rx queue */
830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_app_cb->ui_rx_q.p_first)
831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return (TRUE);
833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return (FALSE);
837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR1 ("LLCP_ReadLogicalLinkData (): Unregistered SAP:0x%x", local_sap);
842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (FALSE);
844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_FlushLogicalLinkRxData
850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Discard received data in logical data link of local SAP
852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          length of data flushed
855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT32 LLCP_FlushLogicalLinkRxData (UINT8 local_sap)
858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR       *p_buf;
860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT32       flushed_length = 0;
861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_APP_CB *p_app_cb;
862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8        *p_ui_pdu;
863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16       ui_pdu_length;
864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API1 ("LLCP_FlushLogicalLinkRxData () Local SAP:0x%x", local_sap);
866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_app_cb = llcp_util_get_app_cb (local_sap);
868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if application is registered */
870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_app_cb) && (p_app_cb->p_app_cback))
871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if any UI PDU in rx queue */
873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        while (p_app_cb->ui_rx_q.p_first)
874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_buf    = (BT_HDR *) p_app_cb->ui_rx_q.p_first;
876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_ui_pdu = (UINT8*) (p_buf + 1) + p_buf->offset;
877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* get length of UI PDU */
879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            BE_STREAM_TO_UINT16 (ui_pdu_length, p_ui_pdu);
880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            flushed_length += (UINT32) (ui_pdu_length - LLCP_PDU_HEADER_SIZE - p_buf->layer_specific);
882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* move to next UI PDU if any */
884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_buf->layer_specific = 0;  /* offset */
885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_buf->offset += LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length;
886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_buf->len    -= LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length;
887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* if read all of UI PDU */
889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_buf->len == 0)
890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                GKI_dequeue (&p_app_cb->ui_rx_q);
892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                GKI_freebuf (p_buf);
893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_cb.total_rx_ui_pdu--;
894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* number of received UI PDU is decreased so check rx congestion status */
898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_util_check_rx_congested_status ();
899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR1 ("LLCP_FlushLogicalLinkRxData (): Unregistered SAP:0x%x", local_sap);
903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (flushed_length);
906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_ConnectReq
911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Create data link connection between registered SAP and DSAP
913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  in peer LLCP,
914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_STATUS_FAIL, otherwise
918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttLLCP_STATUS LLCP_ConnectReq (UINT8                    reg_sap,
921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                              UINT8                    dsap,
922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                              tLLCP_CONNECTION_PARAMS *p_params)
923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_DLCB   *p_dlcb;
925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_STATUS status;
926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_APP_CB *p_app_cb;
927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API2 ("LLCP_ConnectReq () reg_sap=0x%x, DSAP=0x%x", reg_sap, dsap);
929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (llcp_cb.lcb.peer_opt != LLCP_LSC_UNKNOWN)
931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        &&((llcp_cb.lcb.peer_opt & LLCP_LSC_2) == 0)  )
932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_ConnectReq (): Peer doesn't support connection-oriented link");
934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_FAIL;
935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_app_cb = llcp_util_get_app_cb (reg_sap);
938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if application is registered */
940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (p_app_cb == NULL)
941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||(p_app_cb->p_app_cback == NULL)  )
942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR1 ("LLCP_ConnectReq (): SSAP (0x%x) is not registered", reg_sap);
944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_FAIL;
945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (dsap == LLCP_SAP_LM)
948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR1 ("LLCP_ConnectReq (): DSAP (0x%x) must not be link manager SAP", dsap);
950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_FAIL;
951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (dsap == LLCP_SAP_SDP)
954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (strlen (p_params->sn) > LLCP_MAX_SN_LEN)
956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            LLCP_TRACE_ERROR1 ("LLCP_ConnectReq (): Service Name (%d bytes) is too long",
958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                               strlen (p_params->sn));
959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return LLCP_STATUS_FAIL;
960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_params) && (p_params->miu > llcp_cb.lcb.local_link_miu))
964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_ConnectReq (): Data link MIU shall not be bigger than local link MIU");
966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_FAIL;
967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* check if any pending connection request on this reg_sap */
970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_dlcb = llcp_dlc_find_dlcb_by_sap (reg_sap, LLCP_INVALID_SAP);
971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_dlcb)
972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /*
974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ** Accepting LLCP may change SAP in CC, so we cannot find right data link connection
975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ** if there is multiple pending connection request on the same local SAP.
976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        */
977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_ConnectReq (): There is pending connect request on this reg_sap");
978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_FAIL;
979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_dlcb = llcp_util_allocate_data_link (reg_sap, dsap);
982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_dlcb)
984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = llcp_dlsm_execute (p_dlcb, LLCP_DLC_EVENT_API_CONNECT_REQ, p_params);
986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (status != LLCP_STATUS_SUCCESS)
987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            LLCP_TRACE_ERROR0 ("LLCP_ConnectReq (): Error in state machine");
989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_util_deallocate_data_link (p_dlcb);
990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return LLCP_STATUS_FAIL;
991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_FAIL;
996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return LLCP_STATUS_SUCCESS;
999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_ConnectCfm
1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Accept connection request from peer LLCP
1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_STATUS_FAIL, otherwise
1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttLLCP_STATUS LLCP_ConnectCfm (UINT8                    local_sap,
1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                              UINT8                    remote_sap,
1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                              tLLCP_CONNECTION_PARAMS *p_params)
1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_STATUS  status;
1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_DLCB   *p_dlcb;
1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API2 ("LLCP_ConnectCfm () Local SAP:0x%x, Remote SAP:0x%x)",
1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     local_sap, remote_sap);
1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((p_params) && (p_params->miu > llcp_cb.lcb.local_link_miu))
1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_ConnectCfm (): Data link MIU shall not be bigger than local link MIU");
1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_FAIL;
1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_dlcb = llcp_dlc_find_dlcb_by_sap (local_sap, remote_sap);
1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_dlcb)
1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = llcp_dlsm_execute (p_dlcb, LLCP_DLC_EVENT_API_CONNECT_CFM, p_params);
1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_ConnectCfm (): No data link");
1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = LLCP_STATUS_FAIL;
1038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_ConnectReject
1046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Reject connection request from peer LLCP
1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  reason : LLCP_SAP_DM_REASON_APP_REJECTED
1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                           LLCP_SAP_DM_REASON_PERM_REJECT_THIS
1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                           LLCP_SAP_DM_REASON_PERM_REJECT_ANY
1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                           LLCP_SAP_DM_REASON_TEMP_REJECT_THIS
1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                           LLCP_SAP_DM_REASON_TEMP_REJECT_ANY
1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_STATUS_FAIL, otherwise
1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttLLCP_STATUS LLCP_ConnectReject (UINT8 local_sap,
1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                 UINT8 remote_sap,
1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                 UINT8 reason)
1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_STATUS  status;
1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_DLCB   *p_dlcb;
1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API3 ("LLCP_ConnectReject () Local SAP:0x%x, Remote SAP:0x%x, reason:0x%x",
1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     local_sap, remote_sap, reason);
1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_dlcb = llcp_dlc_find_dlcb_by_sap (local_sap, remote_sap);
1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_dlcb)
1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = llcp_dlsm_execute (p_dlcb, LLCP_DLC_EVENT_API_CONNECT_REJECT, &reason);
1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_util_deallocate_data_link (p_dlcb);
1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_ConnectReject (): No data link");
1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = LLCP_STATUS_FAIL;
1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_IsDataLinkCongested
1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Check if data link connection is congested
1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if congested
1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN LLCP_IsDataLinkCongested (UINT8 local_sap,
1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                  UINT8 remote_sap,
1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                  UINT8 num_pending_i_pdu,
1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                  UINT8 total_pending_ui_pdu,
1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                  UINT8 total_pending_i_pdu)
1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_DLCB   *p_dlcb;
1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API5 ("LLCP_IsDataLinkCongested () Local SAP:0x%x, Remote SAP:0x%x, pending = (%d, %d, %d)",
1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     local_sap, remote_sap, num_pending_i_pdu, total_pending_ui_pdu, total_pending_i_pdu);
1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_dlcb = llcp_dlc_find_dlcb_by_sap (local_sap, remote_sap);
1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_dlcb)
1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (p_dlcb->is_tx_congested)
1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            ||(p_dlcb->remote_busy)  )
1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return (TRUE);
1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else if (  (num_pending_i_pdu + p_dlcb->i_xmit_q.count >= p_dlcb->remote_rw)
1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                 ||(total_pending_ui_pdu + total_pending_i_pdu + llcp_cb.total_tx_ui_pdu + llcp_cb.total_tx_i_pdu >= llcp_cb.max_num_tx_buff)  )
1117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* set flag so LLCP can notify uncongested status later */
1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_dlcb->is_tx_congested = TRUE;
1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return (TRUE);
1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (FALSE);
1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (TRUE);
1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_SendData
1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send connection-oriented data
1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_STATUS_CONGESTED if data link is congested
1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttLLCP_STATUS LLCP_SendData (UINT8   local_sap,
1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            UINT8   remote_sap,
1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            BT_HDR *p_buf)
1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_STATUS  status = LLCP_STATUS_FAIL;
1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_DLCB   *p_dlcb;
1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API2 ("LLCP_SendData () Local SAP:0x%x, Remote SAP:0x%x",
1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     local_sap, remote_sap);
1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_dlcb = llcp_dlc_find_dlcb_by_sap (local_sap, remote_sap);
1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_dlcb)
1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_dlcb->remote_miu >= p_buf->len)
1153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_buf->offset >= LLCP_MIN_OFFSET)
1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                status = llcp_dlsm_execute (p_dlcb, LLCP_DLC_EVENT_API_DATA_REQ, p_buf);
1157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
1159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                LLCP_TRACE_ERROR2 ("LLCP_SendData (): offset (%d) must be %d at least",
1161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    p_buf->offset, LLCP_MIN_OFFSET );
1162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            LLCP_TRACE_ERROR2 ("LLCP_SendData (): Information (%d bytes) cannot be more than peer MIU (%d bytes)",
1167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                p_buf->len, p_dlcb->remote_miu);
1168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_SendData (): No data link");
1173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status == LLCP_STATUS_FAIL)
1176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_buf);
1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
1181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_ReadDataLinkData
1186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Read information of I PDU for data link connection
1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Information of I PDU up to max_data_len is copied into p_data.
1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Information of next I PDU is not concatenated.
1191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Recommended max_data_len is data link connection MIU of local
1192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                    end point
1193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if more data in queue
1195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN LLCP_ReadDataLinkData (UINT8  local_sap,
1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                               UINT8  remote_sap,
1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                               UINT32 max_data_len,
1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                               UINT32 *p_data_len,
1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                               UINT8  *p_data)
1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_DLCB *p_dlcb;
1204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR     *p_buf;
1205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8      *p_i_pdu;
1206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16     i_pdu_length;
1207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API2 ("LLCP_ReadDataLinkData () Local SAP:0x%x, Remote SAP:0x%x",
1209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      local_sap, remote_sap);
1210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_dlcb = llcp_dlc_find_dlcb_by_sap (local_sap, remote_sap);
1212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    *p_data_len = 0;
1214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_dlcb)
1215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if any I PDU in rx queue */
1217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_dlcb->i_rx_q.p_first)
1218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_buf   = (BT_HDR *) p_dlcb->i_rx_q.p_first;
1220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_i_pdu = (UINT8*) (p_buf + 1) + p_buf->offset;
1221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* get length of I PDU */
1223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            BE_STREAM_TO_UINT16 (i_pdu_length, p_i_pdu);
1224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* layer_specific has the offset to read within I PDU */
1226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_i_pdu += p_buf->layer_specific;
1227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* copy data up to max_data_len */
1229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (max_data_len >= (UINT32) (i_pdu_length - p_buf->layer_specific))
1230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* copy information */
1232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                *p_data_len = (UINT32) (i_pdu_length - p_buf->layer_specific);
1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* move to next I PDU if any */
1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_buf->layer_specific = 0;  /* reset offset to read from the first byte of next I PDU */
1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_buf->offset += LLCP_PDU_AGF_LEN_SIZE + i_pdu_length;
1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_buf->len    -= LLCP_PDU_AGF_LEN_SIZE + i_pdu_length;
1238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            else
1240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                *p_data_len = max_data_len;
1242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* update offset to read from remaining I PDU next time */
1244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_buf->layer_specific += max_data_len;
1245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            memcpy (p_data, p_i_pdu, *p_data_len);
1248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_buf->layer_specific == 0)
1250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_dlcb->num_rx_i_pdu--;
1252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* if read all of I PDU */
1255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_buf->len == 0)
1256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                GKI_dequeue (&p_dlcb->i_rx_q);
1258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                GKI_freebuf (p_buf);
1259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* decrease number of received I PDU in in all of ui_rx_q and check rx congestion status */
1261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_cb.total_rx_i_pdu--;
1262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_util_check_rx_congested_status ();
1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if getting out of rx congestion */
1267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (!p_dlcb->local_busy)
1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(p_dlcb->is_rx_congested)
1269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(p_dlcb->num_rx_i_pdu <= p_dlcb->rx_congest_threshold / 2)  )
1270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* send RR */
1272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_dlcb->is_rx_congested = FALSE;
1273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_dlcb->flags |= LLCP_DATA_LINK_FLAG_PENDING_RR_RNR;
1274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if there is more I PDU in rx queue */
1277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_dlcb->i_rx_q.p_first)
1278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return (TRUE);
1280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
1282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return (FALSE);
1284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_ReadDataLinkData (): No data link connection");
1289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (FALSE);
1291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_FlushDataLinkRxData
1297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Discard received data in data link connection
1299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          length of rx data flushed
1302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT32 LLCP_FlushDataLinkRxData (UINT8  local_sap,
1305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                 UINT8  remote_sap)
1306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_DLCB *p_dlcb;
1308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BT_HDR     *p_buf;
1309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT32     flushed_length = 0;
1310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8      *p_i_pdu;
1311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16     i_pdu_length;
1312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API2 ("LLCP_FlushDataLinkRxData () Local SAP:0x%x, Remote SAP:0x%x",
1314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      local_sap, remote_sap);
1315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_dlcb = llcp_dlc_find_dlcb_by_sap (local_sap, remote_sap);
1317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_dlcb)
1319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if any I PDU in rx queue */
1321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        while (p_dlcb->i_rx_q.p_first)
1322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_buf   = (BT_HDR *) p_dlcb->i_rx_q.p_first;
1324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_i_pdu = (UINT8*) (p_buf + 1) + p_buf->offset;
1325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* get length of I PDU */
1327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            BE_STREAM_TO_UINT16 (i_pdu_length, p_i_pdu);
1328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            flushed_length += (UINT32) (i_pdu_length - p_buf->layer_specific);
1330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* move to next I PDU if any */
1332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_buf->layer_specific = 0;  /* offset */
1333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_buf->offset += LLCP_PDU_AGF_LEN_SIZE + i_pdu_length;
1334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_buf->len    -= LLCP_PDU_AGF_LEN_SIZE + i_pdu_length;
1335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* if read all of I PDU */
1337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (p_buf->len == 0)
1338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                GKI_dequeue (&p_dlcb->i_rx_q);
1340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                GKI_freebuf (p_buf);
1341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_cb.total_rx_i_pdu--;
1342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_dlcb->num_rx_i_pdu = 0;
1346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if getting out of rx congestion */
1348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (  (!p_dlcb->local_busy)
1349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            &&(p_dlcb->is_rx_congested)  )
1350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* send RR */
1352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_dlcb->is_rx_congested = FALSE;
1353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_dlcb->flags |= LLCP_DATA_LINK_FLAG_PENDING_RR_RNR;
1354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* number of received I PDU is decreased so check rx congestion status */
1357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        llcp_util_check_rx_congested_status ();
1358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_FlushDataLinkRxData (): No data link connection");
1362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (flushed_length);
1365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_DisconnectReq
1370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Disconnect data link
1372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  discard any pending data if flush is set to TRUE
1373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
1375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttLLCP_STATUS LLCP_DisconnectReq (UINT8 local_sap,
1378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                 UINT8 remote_sap,
1379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                 BOOLEAN flush)
1380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_STATUS  status;
1382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_DLCB   *p_dlcb;
1383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API3 ("LLCP_DisconnectReq () Local SAP:0x%x, Remote SAP:0x%x, flush=%d",
1385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     local_sap, remote_sap, flush);
1386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_dlcb = llcp_dlc_find_dlcb_by_sap (local_sap, remote_sap);
1388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_dlcb)
1390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = llcp_dlsm_execute (p_dlcb, LLCP_DLC_EVENT_API_DISCONNECT_REQ, &flush);
1392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_DisconnectReq (): No data link");
1396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = LLCP_STATUS_FAIL;
1397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
1400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_SetTxCompleteNtf
1405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function is called to get LLCP_SERVICE_TX_COMPLETE
1407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  when Tx queue is empty and all PDU is acked.
1408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  This is one time event, so upper layer shall call this function
1409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  again to get next LLCP_SERVICE_TX_COMPLETE.
1410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
1412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttLLCP_STATUS LLCP_SetTxCompleteNtf (UINT8   local_sap,
1415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                    UINT8   remote_sap)
1416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_STATUS  status;
1418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_DLCB   *p_dlcb;
1419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API2 ("LLCP_SetTxCompleteNtf () Local SAP:0x%x, Remote SAP:0x%x",
1421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      local_sap, remote_sap);
1422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_dlcb = llcp_dlc_find_dlcb_by_sap (local_sap, remote_sap);
1424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_dlcb)
1426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* set flag to notify upper later when tx complete */
1428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_dlcb->flags |= LLCP_DATA_LINK_FLAG_NOTIFY_TX_DONE;
1429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = LLCP_STATUS_SUCCESS;
1430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_SetTxCompleteNtf (): No data link");
1434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = LLCP_STATUS_FAIL;
1435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
1438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_SetLocalBusyStatus
1443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set local busy status
1445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
1448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttLLCP_STATUS LLCP_SetLocalBusyStatus (UINT8   local_sap,
1451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      UINT8   remote_sap,
1452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                      BOOLEAN is_busy)
1453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_STATUS  status;
1455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_DLCB   *p_dlcb;
1456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API2 ("LLCP_SetLocalBusyStatus () Local SAP:0x%x, is_busy=%d",
1458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      local_sap, is_busy);
1459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_dlcb = llcp_dlc_find_dlcb_by_sap (local_sap, remote_sap);
1461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (p_dlcb)
1463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_dlcb->local_busy != is_busy)
1465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_dlcb->local_busy = is_busy;
1467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* send RR or RNR with valid sequence */
1469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            p_dlcb->flags |= LLCP_DATA_LINK_FLAG_PENDING_RR_RNR;
1470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (is_busy == FALSE)
1472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (p_dlcb->i_rx_q.count)
1474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
1475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    llcp_dlsm_execute (p_dlcb, LLCP_DLC_EVENT_PEER_DATA_IND, NULL);
1476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
1477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = LLCP_STATUS_SUCCESS;
1480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_SetLocalBusyStatus (): No data link");
1484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        status = LLCP_STATUS_FAIL;
1485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return status;
1488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_GetRemoteWKS
1493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Return well-known service bitmap of connected device
1495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          WKS bitmap if success
1498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT16 LLCP_GetRemoteWKS (void)
1501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API1 ("LLCP_GetRemoteWKS () WKS:0x%04x",
1503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED) ? llcp_cb.lcb.peer_wks :0);
1504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
1506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (llcp_cb.lcb.peer_wks);
1507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (0);
1509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_GetRemoteLSC
1514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Return link service class of connected device
1516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          link service class
1519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 LLCP_GetRemoteLSC (void)
1522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API1 ("LLCP_GetRemoteLSC () LSC:0x%x",
1524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
1525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                     ? llcp_cb.lcb.peer_opt & (LLCP_LSC_1 | LLCP_LSC_2) :0);
1526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
1528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (llcp_cb.lcb.peer_opt & (LLCP_LSC_1 | LLCP_LSC_2));
1529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return (LLCP_LSC_UNKNOWN);
1531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_GetLinkMIU
1536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Return local and remote link MIU
1538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
1541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectLLCP_API void LLCP_GetLinkMIU (UINT16 *p_local_link_miu,
1544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                               UINT16 *p_remote_link_miu)
1545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API0 ("LLCP_GetLinkMIU ()");
1547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
1549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *p_local_link_miu  = llcp_cb.lcb.local_link_miu;
1551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *p_remote_link_miu = llcp_cb.lcb.effective_miu;
1552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
1554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *p_local_link_miu  = 0;
1556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        *p_remote_link_miu = 0;
1557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_DEBUG2 ("LLCP_GetLinkMIU (): local_link_miu = %d, remote_link_miu = %d",
1560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                       *p_local_link_miu, *p_remote_link_miu);
1561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_DiscoverService
1566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Return SAP of service name in connected device through callback
1568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
1571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttLLCP_STATUS LLCP_DiscoverService (char            *p_name,
1574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   tLLCP_SDP_CBACK *p_cback,
1575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                   UINT8           *p_tid)
1576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
1577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tLLCP_STATUS  status;
1578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8         i;
1579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_API1 ("LLCP_DiscoverService () Service Name:%s",
1581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                      p_name);
1582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (llcp_cb.lcb.link_state != LLCP_LINK_STATE_ACTIVATED)
1584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_DiscoverService (): Link is not activated");
1586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_FAIL;
1587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (!p_cback)
1590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_DiscoverService (): Callback must be provided.");
1592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_FAIL;
1593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if peer version is less than V1.1 then SNL is not supported */
1596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if ((llcp_cb.lcb.agreed_major_version == 0x01) && (llcp_cb.lcb.agreed_minor_version < 0x01))
1597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        LLCP_TRACE_ERROR0 ("LLCP_DiscoverService (): Peer doesn't support SNL");
1599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        return LLCP_STATUS_FAIL;
1600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    for (i = 0; i < LLCP_MAX_SDP_TRANSAC; i++)
1603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
1604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (!llcp_cb.sdp_cb.transac[i].p_cback)
1605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
1606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.sdp_cb.transac[i].tid = llcp_cb.sdp_cb.next_tid;
1607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.sdp_cb.next_tid++;
1608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            llcp_cb.sdp_cb.transac[i].p_cback = p_cback;
1609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            status = llcp_sdp_send_sdreq (llcp_cb.sdp_cb.transac[i].tid, p_name);
1611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if (status == LLCP_STATUS_FAIL)
1613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
1614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                llcp_cb.sdp_cb.transac[i].p_cback = NULL;
1615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
1616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            *p_tid = llcp_cb.sdp_cb.transac[i].tid;
1618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            return (status);
1619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
1620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    LLCP_TRACE_ERROR0 ("LLCP_DiscoverService (): Out of resource");
1623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return LLCP_STATUS_FAIL;
1625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1627