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