llcp_api.cc revision d7852c900bb5cd0139708fc22bf60fbb5303830a
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
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  This file contains the LLCP API code
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "llcp_api.h"
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "bt_types.h"
286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "gki.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llcp_defs.h"
306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "llcp_int.h"
316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "nfc_target.h"
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (LLCP_TEST_INCLUDED == TRUE) /* this is for LLCP testing */
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
356fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_TEST_PARAMS llcp_test_params = {
366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_VERSION_VALUE, 0, /* not override */
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_SetTestParams
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set test parameters for LLCP
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid LLCP_SetTestParams(uint8_t version, uint16_t wks) {
506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API2("LLCP_SetTestParams () version:0x%02X, wks:0x%04X", version,
516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  wks);
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (version != 0xFF) llcp_test_params.version = version;
54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (wks != 0xFFFF) llcp_test_params.wks = wks;
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
61d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna** Function         LLCP_RegisterDtaCback
62d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna**
63d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna** Description      Register callback function for LLCP DTA testing
64d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna**
65d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna**
66d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna** Returns          void
67d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna**
68d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna*******************************************************************************/
69d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khannavoid LLCP_RegisterDtaCback(tLLCP_DTA_CBACK* p_dta_cback) {
70d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna  LLCP_TRACE_API1("%s", __func__);
71d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna
72d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna  llcp_cb.p_dta_cback = p_dta_cback;
73d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna}
74d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna
75d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna/*******************************************************************************
76d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna**
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_SetConfig
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set configuration parameters for LLCP
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Local Link MIU
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Option parameter
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Response Waiting Time Index
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Local Link Timeout
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Inactivity Timeout as initiator role
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Inactivity Timeout as target role
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Delay SYMM response
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Data link connection timeout
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Delay timeout to send first PDU as initiator
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid LLCP_SetConfig(uint16_t link_miu, uint8_t opt, uint8_t wt,
946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    uint16_t link_timeout, uint16_t inact_timeout_init,
956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    uint16_t inact_timeout_target, uint16_t symm_delay,
966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    uint16_t data_link_timeout,
976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    uint16_t delay_first_pdu_timeout) {
986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API4(
996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "LLCP_SetConfig () link_miu:%d, opt:0x%02X, wt:%d, link_timeout:%d",
1006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      link_miu, opt, wt, link_timeout);
1016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API4(
1026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "                 inact_timeout (init:%d,target:%d), symm_delay:%d, "
1036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "data_link_timeout:%d",
1046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      inact_timeout_init, inact_timeout_target, symm_delay, data_link_timeout);
1056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API1("                 delay_first_pdu_timeout:%d",
1066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  delay_first_pdu_timeout);
1076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (link_miu < LLCP_DEFAULT_MIU) {
1096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR1(
1106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_SetConfig (): link_miu shall not be smaller than "
1116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_DEFAULT_MIU (%d)",
1126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        LLCP_DEFAULT_MIU);
1136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    link_miu = LLCP_DEFAULT_MIU;
1146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (link_miu > LLCP_MAX_MIU) {
1156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR1(
1166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_SetConfig (): link_miu shall not be bigger than LLCP_MAX_MIU "
1176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "(%d)",
1186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        LLCP_MAX_MIU);
1196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    link_miu = LLCP_MAX_MIU;
1206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if Link MIU is bigger than GKI buffer */
1236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (link_miu > LLCP_MIU) {
1246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR1(
1256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_SetConfig (): link_miu shall not be bigger than LLCP_MIU (%d)",
1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        LLCP_MIU);
1276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.lcb.local_link_miu = LLCP_MIU;
1286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else
1296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.lcb.local_link_miu = link_miu;
1306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  llcp_cb.lcb.local_opt = opt;
1326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  llcp_cb.lcb.local_wt = wt;
1336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (link_timeout < LLCP_LTO_UNIT) {
1356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR1(
1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_SetConfig (): link_timeout shall not be smaller than "
1376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_LTO_UNIT (%d ms)",
1386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        LLCP_LTO_UNIT);
1396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.lcb.local_lto = LLCP_DEFAULT_LTO_IN_MS;
1406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (link_timeout > LLCP_MAX_LTO_IN_MS) {
1416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR1(
1426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_SetConfig (): link_timeout shall not be bigger than "
1436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_MAX_LTO_IN_MS (%d ms)",
1446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        LLCP_MAX_LTO_IN_MS);
1456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.lcb.local_lto = LLCP_MAX_LTO_IN_MS;
1466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else
1476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.lcb.local_lto = link_timeout;
1486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  llcp_cb.lcb.inact_timeout_init = inact_timeout_init;
1506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  llcp_cb.lcb.inact_timeout_target = inact_timeout_target;
1516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  llcp_cb.lcb.symm_delay = symm_delay;
1526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  llcp_cb.lcb.data_link_timeout = data_link_timeout;
1536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  llcp_cb.lcb.delay_first_pdu_timeout = delay_first_pdu_timeout;
154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_GetConfig
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Get configuration parameters for LLCP
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Local Link MIU
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Option parameter
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Response Waiting Time Index
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Local Link Timeout
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Inactivity Timeout as initiator role
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Inactivity Timeout as target role
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Delay SYMM response
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Data link connection timeout
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Delay timeout to send first PDU as initiator
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid LLCP_GetConfig(uint16_t* p_link_miu, uint8_t* p_opt, uint8_t* p_wt,
1756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    uint16_t* p_link_timeout, uint16_t* p_inact_timeout_init,
1766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    uint16_t* p_inact_timeout_target, uint16_t* p_symm_delay,
1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    uint16_t* p_data_link_timeout,
1786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    uint16_t* p_delay_first_pdu_timeout) {
1796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_link_miu = llcp_cb.lcb.local_link_miu;
1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_opt = llcp_cb.lcb.local_opt;
1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_wt = llcp_cb.lcb.local_wt;
1826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_link_timeout = llcp_cb.lcb.local_lto;
1836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_inact_timeout_init = llcp_cb.lcb.inact_timeout_init;
1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_inact_timeout_target = llcp_cb.lcb.inact_timeout_target;
1856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_symm_delay = llcp_cb.lcb.symm_delay;
1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_data_link_timeout = llcp_cb.lcb.data_link_timeout;
1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_delay_first_pdu_timeout = llcp_cb.lcb.delay_first_pdu_timeout;
1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API4(
1906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "LLCP_GetConfig () link_miu:%d, opt:0x%02X, wt:%d, link_timeout:%d",
1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *p_link_miu, *p_opt, *p_wt, *p_link_timeout);
1926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API4(
1936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "                 inact_timeout (init:%d, target:%d), symm_delay:%d, "
1946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "data_link_timeout:%d",
1956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *p_inact_timeout_init, *p_inact_timeout_target, *p_symm_delay,
1966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *p_data_link_timeout);
1976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API1("                 delay_first_pdu_timeout:%d",
1986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  *p_delay_first_pdu_timeout);
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_GetDiscoveryConfig
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Returns discovery config for ISO 18092 MAC link activation
206552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  This function is called to get general bytes for
207552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  NFC_PMID_ATR_REQ_GEN_BYTES or NFC_PMID_ATR_RES_GEN_BYTES
208552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  before starting discovery.
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  wt:Waiting time 0 - 8, only for listen
211552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  p_gen_bytes: pointer to store LLCP magic number and
212552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                               paramters
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  p_gen_bytes_len: length of buffer for gen bytes as input
214552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                                   (NOTE:it must be bigger than
215552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                                   LLCP_MIN_GEN_BYTES) actual gen bytes size
216552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                                   as output
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Restrictions on the use of ISO 18092
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  1. The DID features shall not be used.
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  2. the NAD features shall not be used.
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  3. Frame waiting time extentions (WTX) shall not be used.
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid LLCP_GetDiscoveryConfig(uint8_t* p_wt, uint8_t* p_gen_bytes,
2276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                             uint8_t* p_gen_bytes_len) {
2286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p = p_gen_bytes;
2296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API0("LLCP_GetDiscoveryConfig ()");
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (*p_gen_bytes_len < LLCP_MIN_GEN_BYTES) {
2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR1(
2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_GetDiscoveryConfig (): GenBytes length shall not be smaller than "
2356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_MIN_GEN_BYTES (%d)",
2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        LLCP_MIN_GEN_BYTES);
2376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *p_gen_bytes_len = 0;
2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return;
2396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_wt = llcp_cb.lcb.local_wt;
2426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_MAGIC_NUMBER_BYTE0);
2446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_MAGIC_NUMBER_BYTE1);
2456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_MAGIC_NUMBER_BYTE2);
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (LLCP_TEST_INCLUDED == TRUE) /* this is for LLCP testing */
2486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_VERSION_TYPE);
2496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_VERSION_LEN);
2506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, llcp_test_params.version);
2516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_MIUX_TYPE);
2536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_MIUX_LEN);
2546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT16_TO_BE_STREAM(p, (llcp_cb.lcb.local_link_miu - LLCP_DEFAULT_MIU));
2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_WKS_TYPE);
2576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_WKS_LEN);
2586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (llcp_test_params.wks == 0) /* not override */
2596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  {
2606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT16_TO_BE_STREAM(p, llcp_cb.lcb.wks);
2616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
2626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT16_TO_BE_STREAM(p, llcp_test_params.wks);
2636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
2656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_VERSION_TYPE);
2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_VERSION_LEN);
2676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_VERSION_VALUE);
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_MIUX_TYPE);
2706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_MIUX_LEN);
2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT16_TO_BE_STREAM(p, (llcp_cb.lcb.local_link_miu - LLCP_DEFAULT_MIU));
272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_WKS_TYPE);
2746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_WKS_LEN);
2756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT16_TO_BE_STREAM(p, llcp_cb.lcb.wks);
276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_LTO_TYPE);
2796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_LTO_LEN);
2806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, (llcp_cb.lcb.local_lto / LLCP_LTO_UNIT));
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_OPT_TYPE);
2836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_OPT_LEN);
2846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, llcp_cb.lcb.local_opt);
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_gen_bytes_len = (uint8_t)(p - p_gen_bytes);
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_ActivateLink
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
293552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      This function will activate LLCP link with LR, WT and Gen
294552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  Bytes in activation NTF from NFCC.
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_LINK_ACTIVATION_COMPLETE_EVT will be returned through
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  callback function if successful.
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Otherwise, LLCP_LINK_ACTIVATION_FAILED_EVT will be returned.
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3036fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_ActivateLink(tLLCP_ACTIVATE_CONFIG config,
3046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                               tLLCP_LINK_CBACK* p_link_cback) {
3056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API1("LLCP_ActivateLink () link_state = %d",
3066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  llcp_cb.lcb.link_state);
3076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((llcp_cb.lcb.link_state == LLCP_LINK_STATE_DEACTIVATED) &&
3096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (p_link_cback)) {
3106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.lcb.p_link_cback = p_link_cback;
3116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (llcp_link_activate(&config));
3126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else
3136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_DeactivateLink
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Deactivate LLCP link
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_LINK_DEACTIVATED_EVT will be returned through callback
323552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  when LLCP link is deactivated. Then NFC link may be
324552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  deactivated.
325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3296fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_DeactivateLink(void) {
3306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API1("LLCP_DeactivateLink () link_state = %d",
3316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  llcp_cb.lcb.link_state);
3326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (llcp_cb.lcb.link_state != LLCP_LINK_STATE_DEACTIVATED) {
3346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_link_deactivate(LLCP_LINK_LOCAL_INITIATED);
3356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_SUCCESS;
3366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else
3376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_RegisterServer
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Register server and callback function
345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  reg_sap : Well-Known SAP except LM and SDP (0x02 - 0x0F)
347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                            Advertized by SDP (0x10 - 0x1F)
348552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                            LLCP_INVALID_SAP, LLCP will allocate between 0x10
349552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                            and 0x1F
350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  link_type : LLCP_LINK_TYPE_LOGICAL_DATA_LINK
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                              and/or LLCP_LINK_TYPE_DATA_LINK_CONNECTION
352552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  p_service_name : Null-terminated string up to
353552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                                   LLCP_MAX_SN_LEN
354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          SAP between 0x02 and 0x1F, if success
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_INVALID_SAP, otherwise
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint8_t LLCP_RegisterServer(uint8_t reg_sap, uint8_t link_type,
3606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                            char* p_service_name,
3616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                            tLLCP_APP_CBACK* p_app_cback) {
3626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t sap;
3636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t length;
3646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_APP_CB* p_app_cb = {
3656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      0,
3666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  };
3676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API3(
3696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "LLCP_RegisterServer (): SAP:0x%x, link_type:0x%x, ServiceName:<%s>",
3706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      reg_sap, link_type, ((p_service_name == NULL) ? "" : p_service_name));
3716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_app_cback) {
3736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0("LLCP_RegisterServer (): Callback must be provided");
3746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_INVALID_SAP;
3756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (((link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) == 0x00) &&
3766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             ((link_type & LLCP_LINK_TYPE_DATA_LINK_CONNECTION) == 0x00)) {
3776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR1(
3786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_RegisterServer (): link type (0x%x) must be specified",
3796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        link_type);
3806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_INVALID_SAP;
3816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (reg_sap == LLCP_INVALID_SAP) {
3846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* allocate a SAP between 0x10 and 0x1F */
3856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    for (sap = 0; sap < LLCP_MAX_SERVER; sap++) {
3866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (llcp_cb.server_cb[sap].p_app_cback == NULL) {
3876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_app_cb = &llcp_cb.server_cb[sap];
3886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        reg_sap = LLCP_LOWER_BOUND_SDP_SAP + sap;
3896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
3906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
3916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
3926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (reg_sap == LLCP_INVALID_SAP) {
3946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      LLCP_TRACE_ERROR0("LLCP_RegisterServer (): out of resource");
3956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return LLCP_INVALID_SAP;
3966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
3976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (reg_sap == LLCP_SAP_LM) {
3986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR1("LLCP_RegisterServer (): SAP (0x%x) is for link manager",
3996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      reg_sap);
4006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_INVALID_SAP;
4016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (reg_sap <= LLCP_UPPER_BOUND_WK_SAP) {
4026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (reg_sap >= LLCP_MAX_WKS) {
4036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      LLCP_TRACE_ERROR1(
4046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "LLCP_RegisterServer (): out of resource for SAP (0x%x)", reg_sap);
4056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return LLCP_INVALID_SAP;
4066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else if (llcp_cb.wks_cb[reg_sap].p_app_cback) {
4076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      LLCP_TRACE_ERROR1(
4086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "LLCP_RegisterServer (): SAP (0x%x) is already registered", reg_sap);
4096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return LLCP_INVALID_SAP;
4106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
4116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_app_cb = &llcp_cb.wks_cb[reg_sap];
4126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
4136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (reg_sap <= LLCP_UPPER_BOUND_SDP_SAP) {
4146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (reg_sap - LLCP_LOWER_BOUND_SDP_SAP >= LLCP_MAX_SERVER) {
4156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      LLCP_TRACE_ERROR1(
4166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "LLCP_RegisterServer (): out of resource for SAP (0x%x)", reg_sap);
4176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return LLCP_INVALID_SAP;
4186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else if (llcp_cb.server_cb[reg_sap - LLCP_LOWER_BOUND_SDP_SAP]
4196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   .p_app_cback) {
4206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      LLCP_TRACE_ERROR1(
4216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "LLCP_RegisterServer (): SAP (0x%x) is already registered", reg_sap);
4226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return LLCP_INVALID_SAP;
4236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
4246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_app_cb = &llcp_cb.server_cb[reg_sap - LLCP_LOWER_BOUND_SDP_SAP];
4256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
4266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (reg_sap >= LLCP_LOWER_BOUND_LOCAL_SAP) {
4276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR2(
4286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_RegisterServer (): SAP (0x%x) must be less than 0x%x", reg_sap,
4296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        LLCP_LOWER_BOUND_LOCAL_SAP);
4306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_INVALID_SAP;
4316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  memset(p_app_cb, 0x00, sizeof(tLLCP_APP_CB));
4346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_service_name) {
4366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    length = (uint8_t)strlen(p_service_name);
4376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (length > LLCP_MAX_SN_LEN) {
4386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      LLCP_TRACE_ERROR1(
4396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "LLCP_RegisterServer (): Service Name (%d bytes) is too long",
4406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          length);
4416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return LLCP_INVALID_SAP;
4426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
4436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_app_cb->p_service_name = (uint8_t*)GKI_getbuf((uint16_t)(length + 1));
4456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_app_cb->p_service_name == NULL) {
4466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      LLCP_TRACE_ERROR0("LLCP_RegisterServer (): Out of resource");
4476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return LLCP_INVALID_SAP;
4486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
4496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    strncpy((char*)p_app_cb->p_service_name, (char*)p_service_name, length + 1);
4516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_app_cb->p_service_name[length] = 0;
4526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else
4536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_app_cb->p_service_name = NULL;
454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb->p_app_cback = p_app_cback;
4566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb->link_type = link_type;
457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (reg_sap <= LLCP_UPPER_BOUND_WK_SAP) {
4596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.lcb.wks |= (1 << reg_sap);
4606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_DEBUG1("LLCP_RegisterServer (): Registered SAP = 0x%02X", reg_sap);
463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) {
4656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.num_logical_data_link++;
4666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_util_adjust_ll_congestion();
4676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return reg_sap;
470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_RegisterClient
475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Register client and callback function
477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  link_type : LLCP_LINK_TYPE_LOGICAL_DATA_LINK
479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                              and/or LLCP_LINK_TYPE_DATA_LINK_CONNECTION
480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          SAP between 0x20 and 0x3F, if success
482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_INVALID_SAP, otherwise
483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
4856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint8_t LLCP_RegisterClient(uint8_t link_type, tLLCP_APP_CBACK* p_app_cback) {
4866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t reg_sap = LLCP_INVALID_SAP;
4876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t sap;
4886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_APP_CB* p_app_cb;
4896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API1("LLCP_RegisterClient (): link_type = 0x%x", link_type);
4916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_app_cback) {
4936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0("LLCP_RegisterClient (): Callback must be provided");
4946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_INVALID_SAP;
4956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (((link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) == 0x00) &&
4966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             ((link_type & LLCP_LINK_TYPE_DATA_LINK_CONNECTION) == 0x00)) {
4976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR1(
4986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_RegisterClient (): link type (0x%x) must be specified",
4996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        link_type);
5006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_INVALID_SAP;
5016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
5026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* allocate a SAP between 0x20 and 0x3F */
5046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (sap = 0; sap < LLCP_MAX_CLIENT; sap++) {
5056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (llcp_cb.client_cb[sap].p_app_cback == NULL) {
5066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_app_cb = &llcp_cb.client_cb[sap];
5076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      memset(p_app_cb, 0x00, sizeof(tLLCP_APP_CB));
5086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      reg_sap = LLCP_LOWER_BOUND_LOCAL_SAP + sap;
5096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
5106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
5116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
5126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (reg_sap == LLCP_INVALID_SAP) {
5146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0("LLCP_RegisterClient (): out of resource");
5156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_INVALID_SAP;
5166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
5176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb->p_app_cback = p_app_cback;
5196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb->p_service_name = NULL;
5206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb->link_type = link_type;
5216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_DEBUG1("LLCP_RegisterClient (): Registered SAP = 0x%02X", reg_sap);
5236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) {
5256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.num_logical_data_link++;
5266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_util_adjust_ll_congestion();
5276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
5286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return reg_sap;
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_Deregister
535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Deregister server or client
537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5426fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_Deregister(uint8_t local_sap) {
5436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t idx;
5446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_APP_CB* p_app_cb;
545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API1("LLCP_Deregister () SAP:0x%x", local_sap);
547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb = llcp_util_get_app_cb(local_sap);
549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((!p_app_cb) || (p_app_cb->p_app_cback == NULL)) {
5516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR1("LLCP_Deregister (): SAP (0x%x) is not registered",
5526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      local_sap);
5536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
5546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_app_cb->p_service_name) GKI_freebuf(p_app_cb->p_service_name);
557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* update WKS bit map */
5596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (local_sap <= LLCP_UPPER_BOUND_WK_SAP) {
5606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.lcb.wks &= ~(1 << local_sap);
5616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* discard any received UI PDU on this SAP */
5646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_FlushLogicalLinkRxData(local_sap);
5656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  llcp_cb.total_rx_ui_pdu = 0;
5666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* deallocate any data link connection on this SAP */
5686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (idx = 0; idx < LLCP_MAX_DATA_LINK; idx++) {
5696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((llcp_cb.dlcb[idx].state != LLCP_DLC_STATE_IDLE) &&
5706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (llcp_cb.dlcb[idx].local_sap == local_sap)) {
5716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      llcp_util_deallocate_data_link(&llcp_cb.dlcb[idx]);
572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
5736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb->p_app_cback = NULL;
576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* discard any pending tx UI PDU from this SAP */
5786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  while (p_app_cb->ui_xmit_q.p_first) {
5796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(GKI_dequeue(&p_app_cb->ui_xmit_q));
5806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.total_tx_ui_pdu--;
5816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) {
5846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.num_logical_data_link--;
5856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_util_adjust_ll_congestion();
5866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* check rx congestion status */
5896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  llcp_util_check_rx_congested_status();
590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return LLCP_STATUS_SUCCESS;
592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_IsLogicalLinkCongested
597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Check if logical link is congested
599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if congested
602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
6046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool LLCP_IsLogicalLinkCongested(uint8_t local_sap, uint8_t num_pending_ui_pdu,
6056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                 uint8_t total_pending_ui_pdu,
6066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                 uint8_t total_pending_i_pdu) {
6076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_APP_CB* p_app_cb;
6086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API4(
6106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "LLCP_IsLogicalLinkCongested () Local SAP:0x%x, pending = (%d, %d, %d)",
6116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      local_sap, num_pending_ui_pdu, total_pending_ui_pdu, total_pending_i_pdu);
6126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb = llcp_util_get_app_cb(local_sap);
6146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((llcp_cb.lcb.link_state != LLCP_LINK_STATE_ACTIVATED) ||
6166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (p_app_cb == NULL) || (p_app_cb->p_app_cback == NULL) ||
6176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ((p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) == 0) ||
6186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (p_app_cb->is_ui_tx_congested)) {
6196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return true;
6206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if ((num_pending_ui_pdu + p_app_cb->ui_xmit_q.count >=
6216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              llcp_cb.ll_tx_congest_start) ||
6226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             (total_pending_ui_pdu + llcp_cb.total_tx_ui_pdu >=
6236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              llcp_cb.max_num_ll_tx_buff) ||
6246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             (total_pending_ui_pdu + total_pending_i_pdu +
6256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  llcp_cb.total_tx_ui_pdu + llcp_cb.total_tx_i_pdu >=
6266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              llcp_cb.max_num_tx_buff)) {
6276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* set flag so LLCP can notify uncongested status later */
6286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_app_cb->is_ui_tx_congested = true;
6296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return true;
6316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return false;
633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_SendUI
638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send connnectionless data to DSAP
640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_STATUS_CONGESTED if logical link is congested
644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_STATUS_FAIL, otherwise
645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
6476fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_SendUI(uint8_t ssap, uint8_t dsap, NFC_HDR* p_buf) {
6486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status = LLCP_STATUS_FAIL;
6496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_APP_CB* p_app_cb;
6506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API2("LLCP_SendUI () SSAP=0x%x, DSAP=0x%x", ssap, dsap);
6526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb = llcp_util_get_app_cb(ssap);
6546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_app_cb == NULL) || (p_app_cb->p_app_cback == NULL)) {
6566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR1("LLCP_SendUI (): SSAP (0x%x) is not registered", ssap);
6576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if ((p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) == 0) {
6586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR1(
6596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_SendUI (): Logical link on SSAP (0x%x) is not enabled", ssap);
6606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (llcp_cb.lcb.link_state != LLCP_LINK_STATE_ACTIVATED) {
6616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0("LLCP_SendUI (): LLCP link is not activated");
6626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if ((llcp_cb.lcb.peer_opt == LLCP_LSC_UNKNOWN) ||
6636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             (llcp_cb.lcb.peer_opt & LLCP_LSC_1)) {
6646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_buf->len <= llcp_cb.lcb.peer_miu) {
6656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_buf->offset >= LLCP_MIN_OFFSET) {
6666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        status = llcp_util_send_ui(ssap, dsap, p_app_cb, p_buf);
6676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
6686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        LLCP_TRACE_ERROR2("LLCP_SendUI (): offset (%d) must be %d at least",
6696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                          p_buf->offset, LLCP_MIN_OFFSET);
6706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
6716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
6726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      LLCP_TRACE_ERROR0(
6736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "LLCP_SendUI (): Data length shall not be bigger than peer's link "
6746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "MIU");
6756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
6766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
6776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0(
6786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_SendUI (): Peer doesn't support connectionless link");
6796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == LLCP_STATUS_FAIL) {
6826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(p_buf);
6836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_ReadLogicalLinkData
691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Read information of UI PDU for local SAP
693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Remote SAP who sent UI PDU is returned.
695552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  - Information of UI PDU up to max_data_len is copied into
696552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                    p_data.
697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Information of next UI PDU is not concatenated.
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Recommended max_data_len is link MIU of local device
699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if more information of UI PDU or more UI PDU in queue
701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
7036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool LLCP_ReadLogicalLinkData(uint8_t local_sap, uint32_t max_data_len,
7046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                              uint8_t* p_remote_sap, uint32_t* p_data_len,
7056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                              uint8_t* p_data) {
7066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_APP_CB* p_app_cb;
7076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_buf;
7086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p_ui_pdu;
7096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t pdu_hdr, ui_pdu_length;
7106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API1("LLCP_ReadLogicalLinkData () Local SAP:0x%x", local_sap);
7126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_data_len = 0;
7146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb = llcp_util_get_app_cb(local_sap);
7166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if application is registered */
7186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_app_cb) && (p_app_cb->p_app_cback)) {
7196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if any UI PDU in rx queue */
7206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_app_cb->ui_rx_q.p_first) {
7216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf = (NFC_HDR*)p_app_cb->ui_rx_q.p_first;
7226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ui_pdu = (uint8_t*)(p_buf + 1) + p_buf->offset;
7236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* get length of UI PDU */
7256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      BE_STREAM_TO_UINT16(ui_pdu_length, p_ui_pdu);
7266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* get remote SAP from LLCP header */
7286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      BE_STREAM_TO_UINT16(pdu_hdr, p_ui_pdu);
7296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *p_remote_sap = LLCP_GET_SSAP(pdu_hdr);
7306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* layer_specific has the offset to read within UI PDU */
7326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ui_pdu += p_buf->layer_specific;
7336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* copy data up to max_data_len */
7356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (max_data_len >= (uint32_t)(ui_pdu_length - LLCP_PDU_HEADER_SIZE -
7366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                     p_buf->layer_specific)) {
7376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* copy information without LLCP header */
7386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        *p_data_len = (uint32_t)(ui_pdu_length - LLCP_PDU_HEADER_SIZE -
7396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                 p_buf->layer_specific);
7406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* move to next UI PDU if any */
7426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->layer_specific =
7436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            0; /* reset offset to read from the first byte of next UI PDU */
7446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->offset += LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length;
7456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->len -= LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length;
7466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
7476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        *p_data_len = max_data_len;
7486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* update offset to read from remaining UI PDU next time */
7506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->layer_specific += max_data_len;
7516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
7526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      memcpy(p_data, p_ui_pdu, *p_data_len);
7546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* if read all of UI PDU */
7566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_buf->len == 0) {
7576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_dequeue(&p_app_cb->ui_rx_q);
7586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_freebuf(p_buf);
7596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* decrease number of received UI PDU in in all of ui_rx_q and check rx
7616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         * congestion status */
7626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_cb.total_rx_ui_pdu--;
7636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_util_check_rx_congested_status();
7646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
7656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
7666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if there is more UI PDU in rx queue */
7686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_app_cb->ui_rx_q.p_first) {
7696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return true;
7706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
7716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return false;
7726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
7736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
7746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR1("LLCP_ReadLogicalLinkData (): Unregistered SAP:0x%x",
7756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      local_sap);
776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return false;
7786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_FlushLogicalLinkRxData
784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Discard received data in logical data link of local SAP
786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          length of data flushed
789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
7916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint32_t LLCP_FlushLogicalLinkRxData(uint8_t local_sap) {
7926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_buf;
7936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint32_t flushed_length = 0;
7946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_APP_CB* p_app_cb;
7956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p_ui_pdu;
7966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t ui_pdu_length;
7976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API1("LLCP_FlushLogicalLinkRxData () Local SAP:0x%x", local_sap);
7996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb = llcp_util_get_app_cb(local_sap);
8016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if application is registered */
8036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_app_cb) && (p_app_cb->p_app_cback)) {
8046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if any UI PDU in rx queue */
8056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    while (p_app_cb->ui_rx_q.p_first) {
8066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf = (NFC_HDR*)p_app_cb->ui_rx_q.p_first;
8076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ui_pdu = (uint8_t*)(p_buf + 1) + p_buf->offset;
8086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* get length of UI PDU */
8106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      BE_STREAM_TO_UINT16(ui_pdu_length, p_ui_pdu);
8116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      flushed_length += (uint32_t)(ui_pdu_length - LLCP_PDU_HEADER_SIZE -
8136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                   p_buf->layer_specific);
8146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* move to next UI PDU if any */
8166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf->layer_specific = 0; /* offset */
8176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf->offset += LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length;
8186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf->len -= LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length;
8196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* if read all of UI PDU */
8216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_buf->len == 0) {
8226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_dequeue(&p_app_cb->ui_rx_q);
8236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_freebuf(p_buf);
8246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_cb.total_rx_ui_pdu--;
8256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
8266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
8276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* number of received UI PDU is decreased so check rx congestion status */
8296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_util_check_rx_congested_status();
8306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
8316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR1("LLCP_FlushLogicalLinkRxData (): Unregistered SAP:0x%x",
8326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      local_sap);
8336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (flushed_length);
836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_ConnectReq
841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Create data link connection between registered SAP and DSAP
843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  in peer LLCP,
844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_STATUS_FAIL, otherwise
848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
8506fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_ConnectReq(uint8_t reg_sap, uint8_t dsap,
8516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                             tLLCP_CONNECTION_PARAMS* p_params) {
8526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
8536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status;
8546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_APP_CB* p_app_cb;
8556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_CONNECTION_PARAMS params;
8566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API2("LLCP_ConnectReq () reg_sap=0x%x, DSAP=0x%x", reg_sap, dsap);
8586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((llcp_cb.lcb.peer_opt != LLCP_LSC_UNKNOWN) &&
8606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ((llcp_cb.lcb.peer_opt & LLCP_LSC_2) == 0)) {
8616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0(
8626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_ConnectReq (): Peer doesn't support connection-oriented link");
8636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
8646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
865a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
8666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_params) {
8676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    params.miu = LLCP_DEFAULT_MIU;
8686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    params.rw = LLCP_DEFAULT_RW;
8696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    params.sn[0] = 0;
8706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_params = &params;
8716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb = llcp_util_get_app_cb(reg_sap);
874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if application is registered */
8766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_app_cb == NULL) || (p_app_cb->p_app_cback == NULL)) {
8776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR1("LLCP_ConnectReq (): SSAP (0x%x) is not registered",
8786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      reg_sap);
8796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
8806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (dsap == LLCP_SAP_LM) {
8836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR1(
8846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_ConnectReq (): DSAP (0x%x) must not be link manager SAP", dsap);
8856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
8866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (dsap == LLCP_SAP_SDP) {
8896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (strlen(p_params->sn) > LLCP_MAX_SN_LEN) {
8906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      LLCP_TRACE_ERROR1(
8916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "LLCP_ConnectReq (): Service Name (%d bytes) is too long",
8926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          strlen(p_params->sn));
8936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return LLCP_STATUS_FAIL;
894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
8956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_params) && (p_params->miu > llcp_cb.lcb.local_link_miu)) {
8986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0(
8996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_ConnectReq (): Data link MIU shall not be bigger than local link "
9006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "MIU");
9016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
9026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* check if any pending connection request on this reg_sap */
9056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(reg_sap, LLCP_INVALID_SAP);
9066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
9076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /*
9086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ** Accepting LLCP may change SAP in CC, so we cannot find right data
9096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ** link connection if there is multiple pending connection request on
9106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ** the same local SAP.
9116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    */
9126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0(
9136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_ConnectReq (): There is pending connect request on this reg_sap");
9146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
9156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_util_allocate_data_link(reg_sap, dsap);
918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
9206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status =
9216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_API_CONNECT_REQ, p_params);
9226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (status != LLCP_STATUS_SUCCESS) {
9236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      LLCP_TRACE_ERROR0("LLCP_ConnectReq (): Error in state machine");
9246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      llcp_util_deallocate_data_link(p_dlcb);
9256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return LLCP_STATUS_FAIL;
926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
9276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
9286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
9296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return LLCP_STATUS_SUCCESS;
932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_ConnectCfm
937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Accept connection request from peer LLCP
939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_STATUS_FAIL, otherwise
943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
9456fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_ConnectCfm(uint8_t local_sap, uint8_t remote_sap,
9466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                             tLLCP_CONNECTION_PARAMS* p_params) {
9476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status;
9486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
9496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_CONNECTION_PARAMS params;
9506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API2("LLCP_ConnectCfm () Local SAP:0x%x, Remote SAP:0x%x)",
9526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  local_sap, remote_sap);
9536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_params) {
9556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    params.miu = LLCP_DEFAULT_MIU;
9566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    params.rw = LLCP_DEFAULT_RW;
9576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    params.sn[0] = 0;
9586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_params = &params;
9596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_params->miu > llcp_cb.lcb.local_link_miu) {
9616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0(
9626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_ConnectCfm (): Data link MIU shall not be bigger than local link "
9636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "MIU");
9646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
9656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
9706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status =
9716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_API_CONNECT_CFM, p_params);
9726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
9736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0("LLCP_ConnectCfm (): No data link");
9746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = LLCP_STATUS_FAIL;
9756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_ConnectReject
983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Reject connection request from peer LLCP
985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  reason : LLCP_SAP_DM_REASON_APP_REJECTED
987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                           LLCP_SAP_DM_REASON_PERM_REJECT_THIS
988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                           LLCP_SAP_DM_REASON_PERM_REJECT_ANY
989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                           LLCP_SAP_DM_REASON_TEMP_REJECT_THIS
990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                           LLCP_SAP_DM_REASON_TEMP_REJECT_ANY
991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_STATUS_FAIL, otherwise
994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
9966fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_ConnectReject(uint8_t local_sap, uint8_t remote_sap,
9976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                uint8_t reason) {
9986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status;
9996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
10006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API3(
10026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "LLCP_ConnectReject () Local SAP:0x%x, Remote SAP:0x%x, reason:0x%x",
10036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      local_sap, remote_sap, reason);
10046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
10066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
10086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status =
10096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_API_CONNECT_REJECT, &reason);
10106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_util_deallocate_data_link(p_dlcb);
10116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
10126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0("LLCP_ConnectReject (): No data link");
10136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = LLCP_STATUS_FAIL;
10146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_IsDataLinkCongested
1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Check if data link connection is congested
1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if congested
1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
10296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool LLCP_IsDataLinkCongested(uint8_t local_sap, uint8_t remote_sap,
10306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                              uint8_t num_pending_i_pdu,
10316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                              uint8_t total_pending_ui_pdu,
10326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                              uint8_t total_pending_i_pdu) {
10336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
10346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API5(
10366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "LLCP_IsDataLinkCongested () Local SAP:0x%x, Remote SAP:0x%x, pending = "
10376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "(%d, %d, %d)",
10386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      local_sap, remote_sap, num_pending_i_pdu, total_pending_ui_pdu,
10396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      total_pending_i_pdu);
10406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
10426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
10446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_dlcb->is_tx_congested) || (p_dlcb->remote_busy)) {
10456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return true;
10466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else if ((num_pending_i_pdu + p_dlcb->i_xmit_q.count >=
10476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                p_dlcb->remote_rw) ||
10486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi               (total_pending_ui_pdu + total_pending_i_pdu +
10496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    llcp_cb.total_tx_ui_pdu + llcp_cb.total_tx_i_pdu >=
10506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                llcp_cb.max_num_tx_buff)) {
10516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* set flag so LLCP can notify uncongested status later */
10526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_dlcb->is_tx_congested = true;
10536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return true;
1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
10556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return false;
10566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_SendData
1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send connection-oriented data
1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_STATUS_CONGESTED if data link is congested
1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
10716fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_SendData(uint8_t local_sap, uint8_t remote_sap,
10726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                           NFC_HDR* p_buf) {
10736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status = LLCP_STATUS_FAIL;
10746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
10756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API2("LLCP_SendData () Local SAP:0x%x, Remote SAP:0x%x", local_sap,
10776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  remote_sap);
10786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
10806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
10826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_dlcb->remote_miu >= p_buf->len) {
10836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_buf->offset >= LLCP_MIN_OFFSET) {
10846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        status = llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_API_DATA_REQ, p_buf);
10856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
10866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        LLCP_TRACE_ERROR2("LLCP_SendData (): offset (%d) must be %d at least",
10876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                          p_buf->offset, LLCP_MIN_OFFSET);
10886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
10896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
10906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      LLCP_TRACE_ERROR2(
10916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "LLCP_SendData (): Information (%d bytes) cannot be more than peer "
10926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "MIU (%d bytes)",
10936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_buf->len, p_dlcb->remote_miu);
10946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
10956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
10966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0("LLCP_SendData (): No data link");
10976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == LLCP_STATUS_FAIL) {
11006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(p_buf);
11016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
11026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_ReadDataLinkData
1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Read information of I PDU for data link connection
1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1112552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  - Information of I PDU up to max_data_len is copied into
1113552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                    p_data.
1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Information of next I PDU is not concatenated.
1115552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  - Recommended max_data_len is data link connection MIU of
1116552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                    local end point
1117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if more data in queue
1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
11216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool LLCP_ReadDataLinkData(uint8_t local_sap, uint8_t remote_sap,
11226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                           uint32_t max_data_len, uint32_t* p_data_len,
11236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                           uint8_t* p_data) {
11246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
11256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_buf;
11266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p_i_pdu;
11276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t i_pdu_length;
11286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API2("LLCP_ReadDataLinkData () Local SAP:0x%x, Remote SAP:0x%x",
11306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  local_sap, remote_sap);
11316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
11336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_data_len = 0;
11356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
11366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if any I PDU in rx queue */
11376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_dlcb->i_rx_q.p_first) {
11386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf = (NFC_HDR*)p_dlcb->i_rx_q.p_first;
11396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i_pdu = (uint8_t*)(p_buf + 1) + p_buf->offset;
11406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* get length of I PDU */
11426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      BE_STREAM_TO_UINT16(i_pdu_length, p_i_pdu);
11436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* layer_specific has the offset to read within I PDU */
11456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i_pdu += p_buf->layer_specific;
11466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* copy data up to max_data_len */
11486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (max_data_len >= (uint32_t)(i_pdu_length - p_buf->layer_specific)) {
11496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* copy information */
11506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        *p_data_len = (uint32_t)(i_pdu_length - p_buf->layer_specific);
11516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* move to next I PDU if any */
11536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->layer_specific =
11546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            0; /* reset offset to read from the first byte of next I PDU */
11556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->offset += LLCP_PDU_AGF_LEN_SIZE + i_pdu_length;
11566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->len -= LLCP_PDU_AGF_LEN_SIZE + i_pdu_length;
11576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
11586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        *p_data_len = max_data_len;
11596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* update offset to read from remaining I PDU next time */
11616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->layer_specific += max_data_len;
11626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
11636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      memcpy(p_data, p_i_pdu, *p_data_len);
11656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_buf->layer_specific == 0) {
11676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_dlcb->num_rx_i_pdu--;
11686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
11696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* if read all of I PDU */
11716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_buf->len == 0) {
11726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_dequeue(&p_dlcb->i_rx_q);
11736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_freebuf(p_buf);
11746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* decrease number of received I PDU in in all of ui_rx_q and check rx
11766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         * congestion status */
11776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_cb.total_rx_i_pdu--;
11786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_util_check_rx_congested_status();
11796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
11806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
11816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if getting out of rx congestion */
11836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((!p_dlcb->local_busy) && (p_dlcb->is_rx_congested) &&
11846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (p_dlcb->num_rx_i_pdu <= p_dlcb->rx_congest_threshold / 2)) {
11856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* send RR */
11866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_dlcb->is_rx_congested = false;
11876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_dlcb->flags |= LLCP_DATA_LINK_FLAG_PENDING_RR_RNR;
11886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
11896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if there is more I PDU in rx queue */
11916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_dlcb->i_rx_q.p_first) {
11926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return true;
11936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
11946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return false;
11956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
11966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
11976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0("LLCP_ReadDataLinkData (): No data link connection");
1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return false;
12006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_FlushDataLinkRxData
1206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Discard received data in data link connection
1208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          length of rx data flushed
1211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
12136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint32_t LLCP_FlushDataLinkRxData(uint8_t local_sap, uint8_t remote_sap) {
12146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
12156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_buf;
12166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint32_t flushed_length = 0;
12176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p_i_pdu;
12186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t i_pdu_length;
1219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API2("LLCP_FlushDataLinkRxData () Local SAP:0x%x, Remote SAP:0x%x",
12216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  local_sap, remote_sap);
1222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
12246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
12266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if any I PDU in rx queue */
12276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    while (p_dlcb->i_rx_q.p_first) {
12286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf = (NFC_HDR*)p_dlcb->i_rx_q.p_first;
12296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i_pdu = (uint8_t*)(p_buf + 1) + p_buf->offset;
12306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* get length of I PDU */
12326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      BE_STREAM_TO_UINT16(i_pdu_length, p_i_pdu);
1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      flushed_length += (uint32_t)(i_pdu_length - p_buf->layer_specific);
12356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* move to next I PDU if any */
12376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf->layer_specific = 0; /* offset */
12386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf->offset += LLCP_PDU_AGF_LEN_SIZE + i_pdu_length;
12396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf->len -= LLCP_PDU_AGF_LEN_SIZE + i_pdu_length;
12406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* if read all of I PDU */
12426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_buf->len == 0) {
12436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_dequeue(&p_dlcb->i_rx_q);
12446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_freebuf(p_buf);
12456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_cb.total_rx_i_pdu--;
12466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
1247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
12486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_dlcb->num_rx_i_pdu = 0;
12506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if getting out of rx congestion */
12526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((!p_dlcb->local_busy) && (p_dlcb->is_rx_congested)) {
12536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* send RR */
12546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_dlcb->is_rx_congested = false;
12556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_dlcb->flags |= LLCP_DATA_LINK_FLAG_PENDING_RR_RNR;
1256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* number of received I PDU is decreased so check rx congestion status */
12596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_util_check_rx_congested_status();
12606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
12616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0("LLCP_FlushDataLinkRxData (): No data link connection");
12626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
12636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (flushed_length);
1265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_DisconnectReq
1270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Disconnect data link
1272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  discard any pending data if flush is set to TRUE
1273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
1275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
12776fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_DisconnectReq(uint8_t local_sap, uint8_t remote_sap,
12786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                bool flush) {
12796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status;
12806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
12816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API3(
12836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "LLCP_DisconnectReq () Local SAP:0x%x, Remote SAP:0x%x, flush=%d",
12846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      local_sap, remote_sap, flush);
12856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
12876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
12896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status =
12906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_API_DISCONNECT_REQ, &flush);
12916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
12926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0("LLCP_DisconnectReq (): No data link");
12936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = LLCP_STATUS_FAIL;
12946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
12956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
1297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_SetTxCompleteNtf
1302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function is called to get LLCP_SERVICE_TX_COMPLETE
1304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  when Tx queue is empty and all PDU is acked.
1305552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  This is one time event, so upper layer shall call this
1306552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  function again to get next LLCP_SERVICE_TX_COMPLETE.
1307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
1309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
13116fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_SetTxCompleteNtf(uint8_t local_sap, uint8_t remote_sap) {
13126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status;
13136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
13146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API2("LLCP_SetTxCompleteNtf () Local SAP:0x%x, Remote SAP:0x%x",
13166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  local_sap, remote_sap);
13176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
1319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
13216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* set flag to notify upper later when tx complete */
13226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_dlcb->flags |= LLCP_DATA_LINK_FLAG_NOTIFY_TX_DONE;
13236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = LLCP_STATUS_SUCCESS;
13246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
13256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0("LLCP_SetTxCompleteNtf (): No data link");
13266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = LLCP_STATUS_FAIL;
13276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
13286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
1330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_SetLocalBusyStatus
1335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set local busy status
1337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
1340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
13426fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_SetLocalBusyStatus(uint8_t local_sap, uint8_t remote_sap,
13436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                     bool is_busy) {
13446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status;
13456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
13466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API2("LLCP_SetLocalBusyStatus () Local SAP:0x%x, is_busy=%d",
13486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  local_sap, is_busy);
13496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
13516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
13536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_dlcb->local_busy != is_busy) {
13546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_dlcb->local_busy = is_busy;
13556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* send RR or RNR with valid sequence */
13576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_dlcb->flags |= LLCP_DATA_LINK_FLAG_PENDING_RR_RNR;
13586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (is_busy == false) {
13606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_dlcb->i_rx_q.count) {
13616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_PEER_DATA_IND, NULL);
1362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
13636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
1364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
13656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = LLCP_STATUS_SUCCESS;
13666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
13676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0("LLCP_SetLocalBusyStatus (): No data link");
13686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = LLCP_STATUS_FAIL;
13696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
1372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_GetRemoteWKS
1377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Return well-known service bitmap of connected device
1379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          WKS bitmap if success
1382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
13846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint16_t LLCP_GetRemoteWKS(void) {
13856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API1("LLCP_GetRemoteWKS () WKS:0x%04x",
13866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
13876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      ? llcp_cb.lcb.peer_wks
13886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      : 0);
13896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
13916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (llcp_cb.lcb.peer_wks);
13926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else
13936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (0);
1394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_GetRemoteLSC
1399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Return link service class of connected device
1401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          link service class
1404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
14066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint8_t LLCP_GetRemoteLSC(void) {
14076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API1("LLCP_GetRemoteLSC () LSC:0x%x",
14086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
14096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      ? llcp_cb.lcb.peer_opt & (LLCP_LSC_1 | LLCP_LSC_2)
14106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      : 0);
14116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
14126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
14136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (llcp_cb.lcb.peer_opt & (LLCP_LSC_1 | LLCP_LSC_2));
14146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else
14156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (LLCP_LSC_UNKNOWN);
1416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
14204817764542b01378f70007625270d20f360ea58bMartijn Coenen** Function         LLCP_GetRemoteVersion
14214817764542b01378f70007625270d20f360ea58bMartijn Coenen**
14224817764542b01378f70007625270d20f360ea58bMartijn Coenen** Description      Return LLCP version of connected device
14234817764542b01378f70007625270d20f360ea58bMartijn Coenen**
14244817764542b01378f70007625270d20f360ea58bMartijn Coenen**
14254817764542b01378f70007625270d20f360ea58bMartijn Coenen** Returns          LLCP version
14264817764542b01378f70007625270d20f360ea58bMartijn Coenen**
14274817764542b01378f70007625270d20f360ea58bMartijn Coenen*******************************************************************************/
14286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint8_t LLCP_GetRemoteVersion(void) {
14296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API1("LLCP_GetRemoteVersion () Version: 0x%x",
14306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
14316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      ? llcp_cb.lcb.peer_version
14326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      : 0);
14336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
14346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
14356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (llcp_cb.lcb.peer_version);
14366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else
14376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return 0;
14384817764542b01378f70007625270d20f360ea58bMartijn Coenen}
14394817764542b01378f70007625270d20f360ea58bMartijn Coenen
14404817764542b01378f70007625270d20f360ea58bMartijn Coenen/*******************************************************************************
14414817764542b01378f70007625270d20f360ea58bMartijn Coenen**
1442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_GetLinkMIU
1443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Return local and remote link MIU
1445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
1448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
14506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid LLCP_GetLinkMIU(uint16_t* p_local_link_miu, uint16_t* p_remote_link_miu) {
14516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API0("LLCP_GetLinkMIU ()");
14526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
14536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED) {
14546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *p_local_link_miu = llcp_cb.lcb.local_link_miu;
14556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *p_remote_link_miu = llcp_cb.lcb.effective_miu;
14566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
14576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *p_local_link_miu = 0;
14586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *p_remote_link_miu = 0;
14596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
14606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
14616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_DEBUG2(
14626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "LLCP_GetLinkMIU (): local_link_miu = %d, remote_link_miu = %d",
14636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *p_local_link_miu, *p_remote_link_miu);
1464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_DiscoverService
1469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1470552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      Return SAP of service name in connected device through
1471552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  callback
1472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
1475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
14776fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_DiscoverService(char* p_name, tLLCP_SDP_CBACK* p_cback,
14786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                  uint8_t* p_tid) {
14796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status;
14806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t i;
1481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_API1("LLCP_DiscoverService () Service Name:%s", p_name);
1483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (llcp_cb.lcb.link_state != LLCP_LINK_STATE_ACTIVATED) {
14856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0("LLCP_DiscoverService (): Link is not activated");
14866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
14876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
14886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
14896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_cback) {
14906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0("LLCP_DiscoverService (): Callback must be provided.");
14916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
14926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if peer version is less than V1.1 then SNL is not supported */
14956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((llcp_cb.lcb.agreed_major_version == 0x01) &&
14966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (llcp_cb.lcb.agreed_minor_version < 0x01)) {
14976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_TRACE_ERROR0("LLCP_DiscoverService (): Peer doesn't support SNL");
14986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
14996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
15016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (i = 0; i < LLCP_MAX_SDP_TRANSAC; i++) {
15026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (!llcp_cb.sdp_cb.transac[i].p_cback) {
15036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      llcp_cb.sdp_cb.transac[i].tid = llcp_cb.sdp_cb.next_tid;
15046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      llcp_cb.sdp_cb.next_tid++;
15056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      llcp_cb.sdp_cb.transac[i].p_cback = p_cback;
1506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
15076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      status = llcp_sdp_send_sdreq(llcp_cb.sdp_cb.transac[i].tid, p_name);
1508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
15096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (status == LLCP_STATUS_FAIL) {
15106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_cb.sdp_cb.transac[i].p_cback = NULL;
15116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
15126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
15136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *p_tid = llcp_cb.sdp_cb.transac[i].tid;
15146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return (status);
1515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
15166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
15186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_TRACE_ERROR0("LLCP_DiscoverService (): Out of resource");
1519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
15206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return LLCP_STATUS_FAIL;
1521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1522