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
258a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include <android-base/stringprintf.h>
268a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include <base/logging.h>
278a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach
286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "gki.h"
298a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach#include "llcp_api.h"
306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "llcp_int.h"
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
328a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbachusing android::base::StringPrintf;
338a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach
348a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbachextern bool nfc_debug_enabled;
358a4edf623d58153f34cac27a77bb4f3bbb593a43Andre Eisenbach
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (LLCP_TEST_INCLUDED == TRUE) /* this is for LLCP testing */
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
386fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_TEST_PARAMS llcp_test_params = {
396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    LLCP_VERSION_VALUE, 0, /* not override */
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_SetTestParams
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set test parameters for LLCP
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid LLCP_SetTestParams(uint8_t version, uint16_t wks) {
536767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
546767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("version:0x%02X, wks:0x%04X", version, wks);
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (version != 0xFF) llcp_test_params.version = version;
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (wks != 0xFFFF) llcp_test_params.wks = wks;
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
64d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna** Function         LLCP_RegisterDtaCback
65d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna**
66d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna** Description      Register callback function for LLCP DTA testing
67d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna**
68d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna**
69d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna** Returns          void
70d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna**
71d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna*******************************************************************************/
72d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khannavoid LLCP_RegisterDtaCback(tLLCP_DTA_CBACK* p_dta_cback) {
736767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
74d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna
75d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna  llcp_cb.p_dta_cback = p_dta_cback;
76d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna}
77d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna
78d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna/*******************************************************************************
79d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna**
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_SetConfig
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set configuration parameters for LLCP
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Local Link MIU
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Option parameter
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Response Waiting Time Index
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Local Link Timeout
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Inactivity Timeout as initiator role
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Inactivity Timeout as target role
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Delay SYMM response
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Data link connection timeout
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Delay timeout to send first PDU as initiator
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid LLCP_SetConfig(uint16_t link_miu, uint8_t opt, uint8_t wt,
976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    uint16_t link_timeout, uint16_t inact_timeout_init,
986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    uint16_t inact_timeout_target, uint16_t symm_delay,
996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    uint16_t data_link_timeout,
1006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    uint16_t delay_first_pdu_timeout) {
1016767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
1026767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("link_miu:%d, opt:0x%02X, wt:%d, link_timeout:%d",
1036767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                      link_miu, opt, wt, link_timeout);
1046767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
1056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "                 inact_timeout (init:%d,target:%d), symm_delay:%d, "
1066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "data_link_timeout:%d",
1076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      inact_timeout_init, inact_timeout_target, symm_delay, data_link_timeout);
1086767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
1096767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      "                 delay_first_pdu_timeout:%d", delay_first_pdu_timeout);
1106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (link_miu < LLCP_DEFAULT_MIU) {
1126767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf(
1136767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        "link_miu shall not be smaller than "
1146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_DEFAULT_MIU (%d)",
1156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        LLCP_DEFAULT_MIU);
1166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    link_miu = LLCP_DEFAULT_MIU;
1176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (link_miu > LLCP_MAX_MIU) {
1186767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf(
1196767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        "link_miu shall not be bigger than LLCP_MAX_MIU "
1206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "(%d)",
1216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        LLCP_MAX_MIU);
1226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    link_miu = LLCP_MAX_MIU;
1236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if Link MIU is bigger than GKI buffer */
1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (link_miu > LLCP_MIU) {
1276767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf(
1286767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        "link_miu shall not be bigger than LLCP_MIU (%zu)", LLCP_MIU);
1296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.lcb.local_link_miu = LLCP_MIU;
1306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else
1316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.lcb.local_link_miu = link_miu;
1326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  llcp_cb.lcb.local_opt = opt;
1346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  llcp_cb.lcb.local_wt = wt;
1356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (link_timeout < LLCP_LTO_UNIT) {
1376767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf(
1386767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        "link_timeout shall not be smaller than "
1396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_LTO_UNIT (%d ms)",
1406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        LLCP_LTO_UNIT);
1416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.lcb.local_lto = LLCP_DEFAULT_LTO_IN_MS;
1426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (link_timeout > LLCP_MAX_LTO_IN_MS) {
1436767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf(
1446767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        "link_timeout shall not be bigger than "
1456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_MAX_LTO_IN_MS (%d ms)",
1466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        LLCP_MAX_LTO_IN_MS);
1476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.lcb.local_lto = LLCP_MAX_LTO_IN_MS;
1486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else
1496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.lcb.local_lto = link_timeout;
1506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  llcp_cb.lcb.inact_timeout_init = inact_timeout_init;
1526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  llcp_cb.lcb.inact_timeout_target = inact_timeout_target;
1536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  llcp_cb.lcb.symm_delay = symm_delay;
1546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  llcp_cb.lcb.data_link_timeout = data_link_timeout;
1556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  llcp_cb.lcb.delay_first_pdu_timeout = delay_first_pdu_timeout;
156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_GetConfig
161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Get configuration parameters for LLCP
163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Local Link MIU
164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Option parameter
165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Response Waiting Time Index
166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Local Link Timeout
167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Inactivity Timeout as initiator role
168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Inactivity Timeout as target role
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Delay SYMM response
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Data link connection timeout
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Delay timeout to send first PDU as initiator
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
1766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid LLCP_GetConfig(uint16_t* p_link_miu, uint8_t* p_opt, uint8_t* p_wt,
1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    uint16_t* p_link_timeout, uint16_t* p_inact_timeout_init,
1786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    uint16_t* p_inact_timeout_target, uint16_t* p_symm_delay,
1796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    uint16_t* p_data_link_timeout,
1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    uint16_t* p_delay_first_pdu_timeout) {
1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_link_miu = llcp_cb.lcb.local_link_miu;
1826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_opt = llcp_cb.lcb.local_opt;
1836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_wt = llcp_cb.lcb.local_wt;
1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_link_timeout = llcp_cb.lcb.local_lto;
1856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_inact_timeout_init = llcp_cb.lcb.inact_timeout_init;
1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_inact_timeout_target = llcp_cb.lcb.inact_timeout_target;
1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_symm_delay = llcp_cb.lcb.symm_delay;
1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_data_link_timeout = llcp_cb.lcb.data_link_timeout;
1896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_delay_first_pdu_timeout = llcp_cb.lcb.delay_first_pdu_timeout;
1906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1916767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
1926767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("link_miu:%d, opt:0x%02X, wt:%d, link_timeout:%d",
1936767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                      *p_link_miu, *p_opt, *p_wt, *p_link_timeout);
1946767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
1956767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      "inact_timeout (init:%d, target:%d), symm_delay:%d, data_link_timeout:%d",
1966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *p_inact_timeout_init, *p_inact_timeout_target, *p_symm_delay,
1976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *p_data_link_timeout);
1986767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
1996767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("delay_first_pdu_timeout:%d", *p_delay_first_pdu_timeout);
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_GetDiscoveryConfig
205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Returns discovery config for ISO 18092 MAC link activation
207552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  This function is called to get general bytes for
208552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  NFC_PMID_ATR_REQ_GEN_BYTES or NFC_PMID_ATR_RES_GEN_BYTES
209552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  before starting discovery.
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  wt:Waiting time 0 - 8, only for listen
212552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  p_gen_bytes: pointer to store LLCP magic number and
213552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                               paramters
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  p_gen_bytes_len: length of buffer for gen bytes as input
215552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                                   (NOTE:it must be bigger than
216552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                                   LLCP_MIN_GEN_BYTES) actual gen bytes size
217552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                                   as output
218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Restrictions on the use of ISO 18092
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  1. The DID features shall not be used.
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  2. the NAD features shall not be used.
222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  3. Frame waiting time extentions (WTX) shall not be used.
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid LLCP_GetDiscoveryConfig(uint8_t* p_wt, uint8_t* p_gen_bytes,
2286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                             uint8_t* p_gen_bytes_len) {
2296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p = p_gen_bytes;
2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2316767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (*p_gen_bytes_len < LLCP_MIN_GEN_BYTES) {
2346767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf(
2356767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        "GenBytes length shall not be smaller than "
2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "LLCP_MIN_GEN_BYTES (%d)",
2376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        LLCP_MIN_GEN_BYTES);
2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *p_gen_bytes_len = 0;
2396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return;
2406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_wt = llcp_cb.lcb.local_wt;
2436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_MAGIC_NUMBER_BYTE0);
2456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_MAGIC_NUMBER_BYTE1);
2466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_MAGIC_NUMBER_BYTE2);
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (LLCP_TEST_INCLUDED == TRUE) /* this is for LLCP testing */
2496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_VERSION_TYPE);
2506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_VERSION_LEN);
2516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, llcp_test_params.version);
2526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_MIUX_TYPE);
2546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_MIUX_LEN);
2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT16_TO_BE_STREAM(p, (llcp_cb.lcb.local_link_miu - LLCP_DEFAULT_MIU));
2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
2576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_WKS_TYPE);
2586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_WKS_LEN);
2596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (llcp_test_params.wks == 0) /* not override */
2606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  {
2616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT16_TO_BE_STREAM(p, llcp_cb.lcb.wks);
2626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
2636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT16_TO_BE_STREAM(p, llcp_test_params.wks);
2646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#else
2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_VERSION_TYPE);
2676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_VERSION_LEN);
2686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_VERSION_VALUE);
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_MIUX_TYPE);
2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_MIUX_LEN);
2726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT16_TO_BE_STREAM(p, (llcp_cb.lcb.local_link_miu - LLCP_DEFAULT_MIU));
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_WKS_TYPE);
2756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_WKS_LEN);
2766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT16_TO_BE_STREAM(p, llcp_cb.lcb.wks);
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_LTO_TYPE);
2806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_LTO_LEN);
2816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, (llcp_cb.lcb.local_lto / LLCP_LTO_UNIT));
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_OPT_TYPE);
2846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, LLCP_OPT_LEN);
2856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  UINT8_TO_BE_STREAM(p, llcp_cb.lcb.local_opt);
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_gen_bytes_len = (uint8_t)(p - p_gen_bytes);
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_ActivateLink
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
294552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      This function will activate LLCP link with LR, WT and Gen
295552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  Bytes in activation NTF from NFCC.
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_LINK_ACTIVATION_COMPLETE_EVT will be returned through
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  callback function if successful.
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  Otherwise, LLCP_LINK_ACTIVATION_FAILED_EVT will be returned.
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3046fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_ActivateLink(tLLCP_ACTIVATE_CONFIG config,
3056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                               tLLCP_LINK_CBACK* p_link_cback) {
3066767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
3076767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("link_state = %d", llcp_cb.lcb.link_state);
3086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((llcp_cb.lcb.link_state == LLCP_LINK_STATE_DEACTIVATED) &&
3106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (p_link_cback)) {
3116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.lcb.p_link_cback = p_link_cback;
3126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (llcp_link_activate(&config));
3136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else
3146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_DeactivateLink
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Deactivate LLCP link
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_LINK_DEACTIVATED_EVT will be returned through callback
324552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  when LLCP link is deactivated. Then NFC link may be
325552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  deactivated.
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3306fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_DeactivateLink(void) {
3316767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
3326767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("link_state = %d", llcp_cb.lcb.link_state);
3336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (llcp_cb.lcb.link_state != LLCP_LINK_STATE_DEACTIVATED) {
3356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_link_deactivate(LLCP_LINK_LOCAL_INITIATED);
3366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_SUCCESS;
3376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else
3386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_RegisterServer
344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Register server and callback function
346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  reg_sap : Well-Known SAP except LM and SDP (0x02 - 0x0F)
348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                            Advertized by SDP (0x10 - 0x1F)
349552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                            LLCP_INVALID_SAP, LLCP will allocate between 0x10
350552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                            and 0x1F
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  link_type : LLCP_LINK_TYPE_LOGICAL_DATA_LINK
352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                              and/or LLCP_LINK_TYPE_DATA_LINK_CONNECTION
353552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  p_service_name : Null-terminated string up to
354552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                                   LLCP_MAX_SN_LEN
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          SAP between 0x02 and 0x1F, if success
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_INVALID_SAP, otherwise
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint8_t LLCP_RegisterServer(uint8_t reg_sap, uint8_t link_type,
3617dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi                            std::string p_service_name,
3626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                            tLLCP_APP_CBACK* p_app_cback) {
3636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t sap;
3646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t length;
3656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_APP_CB* p_app_cb = {
3666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      0,
3676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  };
3686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3696767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
3706767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      "SAP:0x%x, link_type:0x%x, ServiceName:<%s>", reg_sap, link_type,
3717dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi      ((p_service_name.empty()) ? "" : p_service_name.c_str()));
3726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_app_cback) {
3746767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Callback must be provided");
3756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_INVALID_SAP;
3766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (((link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) == 0x00) &&
3776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             ((link_type & LLCP_LINK_TYPE_DATA_LINK_CONNECTION) == 0x00)) {
3786767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("link type (0x%x) must be specified", link_type);
3796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_INVALID_SAP;
3806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (reg_sap == LLCP_INVALID_SAP) {
3836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* allocate a SAP between 0x10 and 0x1F */
3846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    for (sap = 0; sap < LLCP_MAX_SERVER; sap++) {
3856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (llcp_cb.server_cb[sap].p_app_cback == NULL) {
3866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_app_cb = &llcp_cb.server_cb[sap];
3876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        reg_sap = LLCP_LOWER_BOUND_SDP_SAP + sap;
3886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        break;
3896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
3906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
3916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (reg_sap == LLCP_INVALID_SAP) {
3936767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("out of resource");
3946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return LLCP_INVALID_SAP;
3956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
3966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (reg_sap == LLCP_SAP_LM) {
3976767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("SAP (0x%x) is for link manager", reg_sap);
3986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_INVALID_SAP;
3996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (reg_sap <= LLCP_UPPER_BOUND_WK_SAP) {
4006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (reg_sap >= LLCP_MAX_WKS) {
4016767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("out of resource for SAP (0x%x)", reg_sap);
4026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return LLCP_INVALID_SAP;
4036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else if (llcp_cb.wks_cb[reg_sap].p_app_cback) {
4046767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("SAP (0x%x) is already registered", reg_sap);
4056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return LLCP_INVALID_SAP;
4066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
4076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_app_cb = &llcp_cb.wks_cb[reg_sap];
4086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
4096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (reg_sap <= LLCP_UPPER_BOUND_SDP_SAP) {
4106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (reg_sap - LLCP_LOWER_BOUND_SDP_SAP >= LLCP_MAX_SERVER) {
4116767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("out of resource for SAP (0x%x)", reg_sap);
4126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return LLCP_INVALID_SAP;
4136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else if (llcp_cb.server_cb[reg_sap - LLCP_LOWER_BOUND_SDP_SAP]
4146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   .p_app_cback) {
4156767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("SAP (0x%x) is already registered", reg_sap);
4166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return LLCP_INVALID_SAP;
4176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
4186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_app_cb = &llcp_cb.server_cb[reg_sap - LLCP_LOWER_BOUND_SDP_SAP];
4196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
4206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (reg_sap >= LLCP_LOWER_BOUND_LOCAL_SAP) {
4216767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("SAP (0x%x) must be less than 0x%x", reg_sap,
4226767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               LLCP_LOWER_BOUND_LOCAL_SAP);
4236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_INVALID_SAP;
4246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  memset(p_app_cb, 0x00, sizeof(tLLCP_APP_CB));
4276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4287dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi  if (!p_service_name.empty()) {
4297dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi    length = p_service_name.length();
4306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (length > LLCP_MAX_SN_LEN) {
4316767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("Service Name (%d bytes) is too long", length);
4326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return LLCP_INVALID_SAP;
4336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
4346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4357dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi    p_app_cb->p_service_name = (char*)GKI_getbuf((uint16_t)(length + 1));
4366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_app_cb->p_service_name == NULL) {
4376767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("Out of resource");
4386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return LLCP_INVALID_SAP;
4396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
4406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4417dab0e579144a72612d29a4b1548e4d60a7d0ebdRuchi Kandoi    strncpy(p_app_cb->p_service_name, p_service_name.c_str(), length + 1);
4426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_app_cb->p_service_name[length] = 0;
4436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else
4446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_app_cb->p_service_name = NULL;
445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb->p_app_cback = p_app_cback;
4476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb->link_type = link_type;
448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (reg_sap <= LLCP_UPPER_BOUND_WK_SAP) {
4506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.lcb.wks |= (1 << reg_sap);
4516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4536767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
4546767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("Registered SAP = 0x%02X", reg_sap);
455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) {
4576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.num_logical_data_link++;
4586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_util_adjust_ll_congestion();
4596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return reg_sap;
462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_RegisterClient
467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Register client and callback function
469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  link_type : LLCP_LINK_TYPE_LOGICAL_DATA_LINK
471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                              and/or LLCP_LINK_TYPE_DATA_LINK_CONNECTION
472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          SAP between 0x20 and 0x3F, if success
474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_INVALID_SAP, otherwise
475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
4776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint8_t LLCP_RegisterClient(uint8_t link_type, tLLCP_APP_CBACK* p_app_cback) {
4786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t reg_sap = LLCP_INVALID_SAP;
4796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t sap;
4806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_APP_CB* p_app_cb;
4816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4826767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
4836767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("link_type = 0x%x", link_type);
4846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_app_cback) {
4866767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Callback must be provided");
4876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_INVALID_SAP;
4886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (((link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) == 0x00) &&
4896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             ((link_type & LLCP_LINK_TYPE_DATA_LINK_CONNECTION) == 0x00)) {
4906767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("link type (0x%x) must be specified", link_type);
4916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_INVALID_SAP;
4926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
4936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* allocate a SAP between 0x20 and 0x3F */
4956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (sap = 0; sap < LLCP_MAX_CLIENT; sap++) {
4966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (llcp_cb.client_cb[sap].p_app_cback == NULL) {
4976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_app_cb = &llcp_cb.client_cb[sap];
4986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      memset(p_app_cb, 0x00, sizeof(tLLCP_APP_CB));
4996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      reg_sap = LLCP_LOWER_BOUND_LOCAL_SAP + sap;
5006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
5016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
5026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
5036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (reg_sap == LLCP_INVALID_SAP) {
5056767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("out of resource");
5066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_INVALID_SAP;
5076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
5086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb->p_app_cback = p_app_cback;
5106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb->p_service_name = NULL;
5116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb->link_type = link_type;
5126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5136767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
5146767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("Registered SAP = 0x%02X", reg_sap);
5156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) {
5176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.num_logical_data_link++;
5186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_util_adjust_ll_congestion();
5196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
5206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return reg_sap;
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_Deregister
527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Deregister server or client
529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5346fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_Deregister(uint8_t local_sap) {
5356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t idx;
5366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_APP_CB* p_app_cb;
537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5386767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("SAP:0x%x", local_sap);
539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb = llcp_util_get_app_cb(local_sap);
541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((!p_app_cb) || (p_app_cb->p_app_cback == NULL)) {
5436767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("SAP (0x%x) is not registered", local_sap);
5446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
5456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_app_cb->p_service_name) GKI_freebuf(p_app_cb->p_service_name);
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* update WKS bit map */
5506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (local_sap <= LLCP_UPPER_BOUND_WK_SAP) {
5516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.lcb.wks &= ~(1 << local_sap);
5526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* discard any received UI PDU on this SAP */
5556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  LLCP_FlushLogicalLinkRxData(local_sap);
5566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  llcp_cb.total_rx_ui_pdu = 0;
5576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* deallocate any data link connection on this SAP */
5596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (idx = 0; idx < LLCP_MAX_DATA_LINK; idx++) {
5606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((llcp_cb.dlcb[idx].state != LLCP_DLC_STATE_IDLE) &&
5616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (llcp_cb.dlcb[idx].local_sap == local_sap)) {
5626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      llcp_util_deallocate_data_link(&llcp_cb.dlcb[idx]);
563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
5646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb->p_app_cback = NULL;
567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* discard any pending tx UI PDU from this SAP */
5696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  while (p_app_cb->ui_xmit_q.p_first) {
5706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(GKI_dequeue(&p_app_cb->ui_xmit_q));
5716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.total_tx_ui_pdu--;
5726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) {
5756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_cb.num_logical_data_link--;
5766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_util_adjust_ll_congestion();
5776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* check rx congestion status */
5806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  llcp_util_check_rx_congested_status();
581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return LLCP_STATUS_SUCCESS;
583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_IsLogicalLinkCongested
588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Check if logical link is congested
590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if congested
593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool LLCP_IsLogicalLinkCongested(uint8_t local_sap, uint8_t num_pending_ui_pdu,
5966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                 uint8_t total_pending_ui_pdu,
5976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                 uint8_t total_pending_i_pdu) {
5986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_APP_CB* p_app_cb;
5996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6006767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
6016767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      "Local SAP:0x%x, pending = (%d, %d, %d)", local_sap, num_pending_ui_pdu,
6026767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      total_pending_ui_pdu, total_pending_i_pdu);
6036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb = llcp_util_get_app_cb(local_sap);
6056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((llcp_cb.lcb.link_state != LLCP_LINK_STATE_ACTIVATED) ||
6076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (p_app_cb == NULL) || (p_app_cb->p_app_cback == NULL) ||
6086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ((p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) == 0) ||
6096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (p_app_cb->is_ui_tx_congested)) {
6106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return true;
6116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if ((num_pending_ui_pdu + p_app_cb->ui_xmit_q.count >=
6126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              llcp_cb.ll_tx_congest_start) ||
6136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             (total_pending_ui_pdu + llcp_cb.total_tx_ui_pdu >=
6146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              llcp_cb.max_num_ll_tx_buff) ||
6156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             (total_pending_ui_pdu + total_pending_i_pdu +
6166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                  llcp_cb.total_tx_ui_pdu + llcp_cb.total_tx_i_pdu >=
6176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              llcp_cb.max_num_tx_buff)) {
6186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* set flag so LLCP can notify uncongested status later */
6196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_app_cb->is_ui_tx_congested = true;
6206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return true;
6226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return false;
624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_SendUI
629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send connnectionless data to DSAP
631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_STATUS_CONGESTED if logical link is congested
635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_STATUS_FAIL, otherwise
636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
6386fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_SendUI(uint8_t ssap, uint8_t dsap, NFC_HDR* p_buf) {
6396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status = LLCP_STATUS_FAIL;
6406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_APP_CB* p_app_cb;
6416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6426767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
6436767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("SSAP=0x%x, DSAP=0x%x", ssap, dsap);
6446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb = llcp_util_get_app_cb(ssap);
6466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_app_cb == NULL) || (p_app_cb->p_app_cback == NULL)) {
6486767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("SSAP (0x%x) is not registered", ssap);
6496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if ((p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) == 0) {
6506767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Logical link on SSAP (0x%x) is not enabled",
6516767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               ssap);
6526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (llcp_cb.lcb.link_state != LLCP_LINK_STATE_ACTIVATED) {
6536767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("LLCP link is not activated");
6546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if ((llcp_cb.lcb.peer_opt == LLCP_LSC_UNKNOWN) ||
6556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             (llcp_cb.lcb.peer_opt & LLCP_LSC_1)) {
6566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_buf->len <= llcp_cb.lcb.peer_miu) {
6576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_buf->offset >= LLCP_MIN_OFFSET) {
6586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        status = llcp_util_send_ui(ssap, dsap, p_app_cb, p_buf);
6596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
6606767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        LOG(ERROR) << StringPrintf("offset (%d) must be %d at least",
6616767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                                   p_buf->offset, LLCP_MIN_OFFSET);
6626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
6636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
6646767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf(
6656767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          "Data length shall not be bigger than peer's link "
6666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "MIU");
6676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
6686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
6696767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Peer doesn't support connectionless link");
6706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == LLCP_STATUS_FAIL) {
6736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(p_buf);
6746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
6756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_ReadLogicalLinkData
682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Read information of UI PDU for local SAP
684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Remote SAP who sent UI PDU is returned.
686552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  - Information of UI PDU up to max_data_len is copied into
687552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                    p_data.
688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Information of next UI PDU is not concatenated.
689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Recommended max_data_len is link MIU of local device
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if more information of UI PDU or more UI PDU in queue
692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
6946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool LLCP_ReadLogicalLinkData(uint8_t local_sap, uint32_t max_data_len,
6956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                              uint8_t* p_remote_sap, uint32_t* p_data_len,
6966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                              uint8_t* p_data) {
6976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_APP_CB* p_app_cb;
6986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_buf;
6996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p_ui_pdu;
7006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t pdu_hdr, ui_pdu_length;
7016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7026767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Local SAP:0x%x", local_sap);
7036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_data_len = 0;
7056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb = llcp_util_get_app_cb(local_sap);
7076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if application is registered */
7096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_app_cb) && (p_app_cb->p_app_cback)) {
7106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if any UI PDU in rx queue */
7116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_app_cb->ui_rx_q.p_first) {
7126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf = (NFC_HDR*)p_app_cb->ui_rx_q.p_first;
7136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ui_pdu = (uint8_t*)(p_buf + 1) + p_buf->offset;
7146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* get length of UI PDU */
7166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      BE_STREAM_TO_UINT16(ui_pdu_length, p_ui_pdu);
7176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* get remote SAP from LLCP header */
7196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      BE_STREAM_TO_UINT16(pdu_hdr, p_ui_pdu);
7206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *p_remote_sap = LLCP_GET_SSAP(pdu_hdr);
7216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* layer_specific has the offset to read within UI PDU */
7236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ui_pdu += p_buf->layer_specific;
7246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* copy data up to max_data_len */
7266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (max_data_len >= (uint32_t)(ui_pdu_length - LLCP_PDU_HEADER_SIZE -
7276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                     p_buf->layer_specific)) {
7286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* copy information without LLCP header */
7296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        *p_data_len = (uint32_t)(ui_pdu_length - LLCP_PDU_HEADER_SIZE -
7306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                 p_buf->layer_specific);
7316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* move to next UI PDU if any */
7336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->layer_specific =
7346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            0; /* reset offset to read from the first byte of next UI PDU */
7356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->offset += LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length;
7366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->len -= LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length;
7376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
7386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        *p_data_len = max_data_len;
7396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* update offset to read from remaining UI PDU next time */
7416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->layer_specific += max_data_len;
7426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
7436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      memcpy(p_data, p_ui_pdu, *p_data_len);
7456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* if read all of UI PDU */
7476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_buf->len == 0) {
7486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_dequeue(&p_app_cb->ui_rx_q);
7496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_freebuf(p_buf);
7506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* decrease number of received UI PDU in in all of ui_rx_q and check rx
7526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         * congestion status */
7536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_cb.total_rx_ui_pdu--;
7546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_util_check_rx_congested_status();
7556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
7566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
7576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if there is more UI PDU in rx queue */
7596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_app_cb->ui_rx_q.p_first) {
7606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return true;
7616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
7626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return false;
7636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
7646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
7656767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unregistered SAP:0x%x", local_sap);
766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return false;
7686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_FlushLogicalLinkRxData
774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Discard received data in logical data link of local SAP
776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          length of data flushed
779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
7816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint32_t LLCP_FlushLogicalLinkRxData(uint8_t local_sap) {
7826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_buf;
7836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint32_t flushed_length = 0;
7846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_APP_CB* p_app_cb;
7856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p_ui_pdu;
7866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t ui_pdu_length;
7876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7886767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Local SAP:0x%x", local_sap);
7896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb = llcp_util_get_app_cb(local_sap);
7916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if application is registered */
7936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_app_cb) && (p_app_cb->p_app_cback)) {
7946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if any UI PDU in rx queue */
7956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    while (p_app_cb->ui_rx_q.p_first) {
7966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf = (NFC_HDR*)p_app_cb->ui_rx_q.p_first;
7976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_ui_pdu = (uint8_t*)(p_buf + 1) + p_buf->offset;
7986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* get length of UI PDU */
8006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      BE_STREAM_TO_UINT16(ui_pdu_length, p_ui_pdu);
8016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      flushed_length += (uint32_t)(ui_pdu_length - LLCP_PDU_HEADER_SIZE -
8036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                   p_buf->layer_specific);
8046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* move to next UI PDU if any */
8066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf->layer_specific = 0; /* offset */
8076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf->offset += LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length;
8086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf->len -= LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length;
8096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* if read all of UI PDU */
8116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_buf->len == 0) {
8126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_dequeue(&p_app_cb->ui_rx_q);
8136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_freebuf(p_buf);
8146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_cb.total_rx_ui_pdu--;
8156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
8166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
8176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* number of received UI PDU is decreased so check rx congestion status */
8196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_util_check_rx_congested_status();
8206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
8216767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Unregistered SAP:0x%x", local_sap);
8226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (flushed_length);
825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_ConnectReq
830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Create data link connection between registered SAP and DSAP
832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  in peer LLCP,
833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_STATUS_FAIL, otherwise
837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
8396fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_ConnectReq(uint8_t reg_sap, uint8_t dsap,
8406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                             tLLCP_CONNECTION_PARAMS* p_params) {
8416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
8426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status;
8436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_APP_CB* p_app_cb;
8446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_CONNECTION_PARAMS params;
8456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8466767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
8476767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("reg_sap=0x%x, DSAP=0x%x", reg_sap, dsap);
8486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((llcp_cb.lcb.peer_opt != LLCP_LSC_UNKNOWN) &&
8506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      ((llcp_cb.lcb.peer_opt & LLCP_LSC_2) == 0)) {
8516767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Peer doesn't support connection-oriented link");
8526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
8536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
854a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
8556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_params) {
8566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    params.miu = LLCP_DEFAULT_MIU;
8576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    params.rw = LLCP_DEFAULT_RW;
8586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    params.sn[0] = 0;
8596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_params = &params;
8606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_app_cb = llcp_util_get_app_cb(reg_sap);
863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if application is registered */
8656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_app_cb == NULL) || (p_app_cb->p_app_cback == NULL)) {
8666767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("SSAP (0x%x) is not registered", reg_sap);
8676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
8686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (dsap == LLCP_SAP_LM) {
8716767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("DSAP (0x%x) must not be link manager SAP",
8726767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                               dsap);
8736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
8746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (dsap == LLCP_SAP_SDP) {
8776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (strlen(p_params->sn) > LLCP_MAX_SN_LEN) {
8786767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("Service Name (%zu bytes) is too long",
8796767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                                 strlen(p_params->sn));
8806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return LLCP_STATUS_FAIL;
881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
8826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
8846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_params) && (p_params->miu > llcp_cb.lcb.local_link_miu)) {
8856767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf(
8866767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        "Data link MIU shall not be bigger than local link "
8876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "MIU");
8886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
8896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
8906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
8916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* check if any pending connection request on this reg_sap */
8926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(reg_sap, LLCP_INVALID_SAP);
8936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
8946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /*
8956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ** Accepting LLCP may change SAP in CC, so we cannot find right data
8966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ** link connection if there is multiple pending connection request on
8976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ** the same local SAP.
8986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    */
8996767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf(
9006767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        "There is pending connect request on this reg_sap");
9016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
9026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_util_allocate_data_link(reg_sap, dsap);
905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
9076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status =
9086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_API_CONNECT_REQ, p_params);
9096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (status != LLCP_STATUS_SUCCESS) {
9106767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf("Error in state machine");
9116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      llcp_util_deallocate_data_link(p_dlcb);
9126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return LLCP_STATUS_FAIL;
913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
9146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
9156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
9166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return LLCP_STATUS_SUCCESS;
919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_ConnectCfm
924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Accept connection request from peer LLCP
926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_STATUS_FAIL, otherwise
930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
9326fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_ConnectCfm(uint8_t local_sap, uint8_t remote_sap,
9336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                             tLLCP_CONNECTION_PARAMS* p_params) {
9346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status;
9356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
9366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_CONNECTION_PARAMS params;
9376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9386767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
9396767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      "Local SAP:0x%x, Remote SAP:0x%x)", local_sap, remote_sap);
9406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_params) {
9426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    params.miu = LLCP_DEFAULT_MIU;
9436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    params.rw = LLCP_DEFAULT_RW;
9446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    params.sn[0] = 0;
9456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_params = &params;
9466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
9476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_params->miu > llcp_cb.lcb.local_link_miu) {
9486767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf(
9496767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        "Data link MIU shall not be bigger than local link "
9506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "MIU");
9516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
9526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
9576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status =
9586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_API_CONNECT_CFM, p_params);
9596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
9606767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("No data link");
9616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = LLCP_STATUS_FAIL;
9626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
9646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_ConnectReject
970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Reject connection request from peer LLCP
972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  reason : LLCP_SAP_DM_REASON_APP_REJECTED
974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                           LLCP_SAP_DM_REASON_PERM_REJECT_THIS
975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                           LLCP_SAP_DM_REASON_PERM_REJECT_ANY
976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                           LLCP_SAP_DM_REASON_TEMP_REJECT_THIS
977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                           LLCP_SAP_DM_REASON_TEMP_REJECT_ANY
978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_STATUS_FAIL, otherwise
981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
9836fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_ConnectReject(uint8_t local_sap, uint8_t remote_sap,
9846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                uint8_t reason) {
9856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status;
9866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
9876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9886767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
9896767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("Local SAP:0x%x, Remote SAP:0x%x, reason:0x%x", local_sap,
9906767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                      remote_sap, reason);
9916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
9936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
9946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
9956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status =
9966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_API_CONNECT_REJECT, &reason);
9976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_util_deallocate_data_link(p_dlcb);
9986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
9996767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("No data link");
10006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = LLCP_STATUS_FAIL;
10016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_IsDataLinkCongested
1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Check if data link connection is congested
1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if congested
1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
10166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool LLCP_IsDataLinkCongested(uint8_t local_sap, uint8_t remote_sap,
10176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                              uint8_t num_pending_i_pdu,
10186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                              uint8_t total_pending_ui_pdu,
10196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                              uint8_t total_pending_i_pdu) {
10206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
10216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10226767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
10236767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      "Local SAP:0x%x, Remote SAP:0x%x, pending = "
10246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      "(%d, %d, %d)",
10256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      local_sap, remote_sap, num_pending_i_pdu, total_pending_ui_pdu,
10266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      total_pending_i_pdu);
10276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
10296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
10316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((p_dlcb->is_tx_congested) || (p_dlcb->remote_busy)) {
10326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return true;
10336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else if ((num_pending_i_pdu + p_dlcb->i_xmit_q.count >=
10346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                p_dlcb->remote_rw) ||
10356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi               (total_pending_ui_pdu + total_pending_i_pdu +
10366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                    llcp_cb.total_tx_ui_pdu + llcp_cb.total_tx_i_pdu >=
10376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                llcp_cb.max_num_tx_buff)) {
10386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* set flag so LLCP can notify uncongested status later */
10396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_dlcb->is_tx_congested = true;
10406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return true;
1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
10426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return false;
10436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return true;
1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_SendData
1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Send connection-oriented data
1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  LLCP_STATUS_CONGESTED if data link is congested
1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
10586fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_SendData(uint8_t local_sap, uint8_t remote_sap,
10596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                           NFC_HDR* p_buf) {
10606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status = LLCP_STATUS_FAIL;
10616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
10626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10636767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
10646767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("Local SAP:0x%x, Remote SAP:0x%x", local_sap, remote_sap);
10656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
10676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
10696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_dlcb->remote_miu >= p_buf->len) {
10706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_buf->offset >= LLCP_MIN_OFFSET) {
10716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        status = llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_API_DATA_REQ, p_buf);
10726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
10736767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi        LOG(ERROR) << StringPrintf("offset (%d) must be %d at least",
10746767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                                   p_buf->offset, LLCP_MIN_OFFSET);
10756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
10766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
10776767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      LOG(ERROR) << StringPrintf(
10786767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi          "Information (%d bytes) cannot be more than peer "
10796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "MIU (%d bytes)",
10806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_buf->len, p_dlcb->remote_miu);
10816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
10826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
10836767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("No data link");
10846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status == LLCP_STATUS_FAIL) {
10876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(p_buf);
10886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
10896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
10906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_ReadDataLinkData
1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Read information of I PDU for data link connection
1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1099552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  - Information of I PDU up to max_data_len is copied into
1100552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                    p_data.
1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  - Information of next I PDU is not concatenated.
1102552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  - Recommended max_data_len is data link connection MIU of
1103552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                    local end point
1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          TRUE if more data in queue
1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
11086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool LLCP_ReadDataLinkData(uint8_t local_sap, uint8_t remote_sap,
11096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                           uint32_t max_data_len, uint32_t* p_data_len,
11106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                           uint8_t* p_data) {
11116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
11126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_buf;
11136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p_i_pdu;
11146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t i_pdu_length;
11156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11166767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
11176767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("Local SAP:0x%x, Remote SAP:0x%x", local_sap, remote_sap);
11186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
11206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  *p_data_len = 0;
11226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
11236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if any I PDU in rx queue */
11246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_dlcb->i_rx_q.p_first) {
11256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf = (NFC_HDR*)p_dlcb->i_rx_q.p_first;
11266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i_pdu = (uint8_t*)(p_buf + 1) + p_buf->offset;
11276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* get length of I PDU */
11296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      BE_STREAM_TO_UINT16(i_pdu_length, p_i_pdu);
11306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* layer_specific has the offset to read within I PDU */
11326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i_pdu += p_buf->layer_specific;
11336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* copy data up to max_data_len */
11356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (max_data_len >= (uint32_t)(i_pdu_length - p_buf->layer_specific)) {
11366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* copy information */
11376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        *p_data_len = (uint32_t)(i_pdu_length - p_buf->layer_specific);
11386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* move to next I PDU if any */
11406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->layer_specific =
11416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            0; /* reset offset to read from the first byte of next I PDU */
11426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->offset += LLCP_PDU_AGF_LEN_SIZE + i_pdu_length;
11436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->len -= LLCP_PDU_AGF_LEN_SIZE + i_pdu_length;
11446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } else {
11456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        *p_data_len = max_data_len;
11466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* update offset to read from remaining I PDU next time */
11486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_buf->layer_specific += max_data_len;
11496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
11506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      memcpy(p_data, p_i_pdu, *p_data_len);
11526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_buf->layer_specific == 0) {
11546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_dlcb->num_rx_i_pdu--;
11556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
11566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* if read all of I PDU */
11586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_buf->len == 0) {
11596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_dequeue(&p_dlcb->i_rx_q);
11606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_freebuf(p_buf);
11616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* decrease number of received I PDU in in all of ui_rx_q and check rx
11636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         * congestion status */
11646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_cb.total_rx_i_pdu--;
11656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_util_check_rx_congested_status();
11666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
11676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
11686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if getting out of rx congestion */
11706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((!p_dlcb->local_busy) && (p_dlcb->is_rx_congested) &&
11716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        (p_dlcb->num_rx_i_pdu <= p_dlcb->rx_congest_threshold / 2)) {
11726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* send RR */
11736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_dlcb->is_rx_congested = false;
11746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_dlcb->flags |= LLCP_DATA_LINK_FLAG_PENDING_RR_RNR;
11756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
11766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
11776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if there is more I PDU in rx queue */
11786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_dlcb->i_rx_q.p_first) {
11796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return true;
11806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
11816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return false;
11826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
11836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
11846767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("No data link connection");
1185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
11866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return false;
11876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_FlushDataLinkRxData
1193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Discard received data in data link connection
1195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          length of rx data flushed
1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
12006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint32_t LLCP_FlushDataLinkRxData(uint8_t local_sap, uint8_t remote_sap) {
12016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
12026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_buf;
12036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint32_t flushed_length = 0;
12046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p_i_pdu;
12056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t i_pdu_length;
1206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12076767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
12086767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("Local SAP:0x%x, Remote SAP:0x%x", local_sap, remote_sap);
1209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
12116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
12136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if any I PDU in rx queue */
12146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    while (p_dlcb->i_rx_q.p_first) {
12156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf = (NFC_HDR*)p_dlcb->i_rx_q.p_first;
12166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_i_pdu = (uint8_t*)(p_buf + 1) + p_buf->offset;
12176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* get length of I PDU */
12196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      BE_STREAM_TO_UINT16(i_pdu_length, p_i_pdu);
1220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      flushed_length += (uint32_t)(i_pdu_length - p_buf->layer_specific);
12226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* move to next I PDU if any */
12246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf->layer_specific = 0; /* offset */
12256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf->offset += LLCP_PDU_AGF_LEN_SIZE + i_pdu_length;
12266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_buf->len -= LLCP_PDU_AGF_LEN_SIZE + i_pdu_length;
12276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* if read all of I PDU */
12296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (p_buf->len == 0) {
12306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_dequeue(&p_dlcb->i_rx_q);
12316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_freebuf(p_buf);
12326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_cb.total_rx_i_pdu--;
12336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
12356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_dlcb->num_rx_i_pdu = 0;
12376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if getting out of rx congestion */
12396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if ((!p_dlcb->local_busy) && (p_dlcb->is_rx_congested)) {
12406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* send RR */
12416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_dlcb->is_rx_congested = false;
12426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_dlcb->flags |= LLCP_DATA_LINK_FLAG_PENDING_RR_RNR;
1243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
1244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
12456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* number of received I PDU is decreased so check rx congestion status */
12466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    llcp_util_check_rx_congested_status();
12476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
12486767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("No data link connection");
12496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
12506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (flushed_length);
1252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_DisconnectReq
1257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Disconnect data link
1259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  discard any pending data if flush is set to TRUE
1260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
1262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
12646fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_DisconnectReq(uint8_t local_sap, uint8_t remote_sap,
12656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                bool flush) {
12666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status;
12676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
12686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12696767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
12706767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("Local SAP:0x%x, Remote SAP:0x%x, flush=%d", local_sap,
12716767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                      remote_sap, flush);
12726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
12746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
12766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status =
12776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_API_DISCONNECT_REQ, &flush);
12786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
12796767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("No data link");
12806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = LLCP_STATUS_FAIL;
12816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
12826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
12836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
1284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_SetTxCompleteNtf
1289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function is called to get LLCP_SERVICE_TX_COMPLETE
1291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  when Tx queue is empty and all PDU is acked.
1292552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  This is one time event, so upper layer shall call this
1293552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  function again to get next LLCP_SERVICE_TX_COMPLETE.
1294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
1296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
12986fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_SetTxCompleteNtf(uint8_t local_sap, uint8_t remote_sap) {
12996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status;
13006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
13016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13026767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
13036767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("Local SAP:0x%x, Remote SAP:0x%x", local_sap, remote_sap);
13046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
1306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
13086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* set flag to notify upper later when tx complete */
13096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_dlcb->flags |= LLCP_DATA_LINK_FLAG_NOTIFY_TX_DONE;
13106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = LLCP_STATUS_SUCCESS;
13116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
13126767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("No data link");
13136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = LLCP_STATUS_FAIL;
13146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
13156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
1317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_SetLocalBusyStatus
1322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Set local busy status
1324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
1327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
13296fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_SetLocalBusyStatus(uint8_t local_sap, uint8_t remote_sap,
13306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                     bool is_busy) {
13316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status;
13326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_DLCB* p_dlcb;
13336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13346767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
13356767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("Local SAP:0x%x, is_busy=%d", local_sap, is_busy);
13366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_dlcb = llcp_dlc_find_dlcb_by_sap(local_sap, remote_sap);
13386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (p_dlcb) {
13406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_dlcb->local_busy != is_busy) {
13416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_dlcb->local_busy = is_busy;
13426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* send RR or RNR with valid sequence */
13446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_dlcb->flags |= LLCP_DATA_LINK_FLAG_PENDING_RR_RNR;
13456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (is_busy == false) {
13476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (p_dlcb->i_rx_q.count) {
13486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          llcp_dlsm_execute(p_dlcb, LLCP_DLC_EVENT_PEER_DATA_IND, NULL);
1349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
13506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
1351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
13526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = LLCP_STATUS_SUCCESS;
13536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
13546767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("No data link");
13556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    status = LLCP_STATUS_FAIL;
13566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
13586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return status;
1359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_GetRemoteWKS
1364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Return well-known service bitmap of connected device
1366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          WKS bitmap if success
1369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
13716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint16_t LLCP_GetRemoteWKS(void) {
13726767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
13736767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      "WKS:0x%04x", (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
13746767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                        ? llcp_cb.lcb.peer_wks
13756767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                        : 0);
13766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
13786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (llcp_cb.lcb.peer_wks);
13796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else
13806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (0);
1381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_GetRemoteLSC
1386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Return link service class of connected device
1388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          link service class
1391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
13936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint8_t LLCP_GetRemoteLSC(void) {
13946767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
13956767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      "LSC:0x%x", (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
13966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      ? llcp_cb.lcb.peer_opt & (LLCP_LSC_1 | LLCP_LSC_2)
13976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      : 0);
13986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
13996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
14006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (llcp_cb.lcb.peer_opt & (LLCP_LSC_1 | LLCP_LSC_2));
14016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else
14026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (LLCP_LSC_UNKNOWN);
1403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
14074817764542b01378f70007625270d20f360ea58bMartijn Coenen** Function         LLCP_GetRemoteVersion
14084817764542b01378f70007625270d20f360ea58bMartijn Coenen**
14094817764542b01378f70007625270d20f360ea58bMartijn Coenen** Description      Return LLCP version of connected device
14104817764542b01378f70007625270d20f360ea58bMartijn Coenen**
14114817764542b01378f70007625270d20f360ea58bMartijn Coenen**
14124817764542b01378f70007625270d20f360ea58bMartijn Coenen** Returns          LLCP version
14134817764542b01378f70007625270d20f360ea58bMartijn Coenen**
14144817764542b01378f70007625270d20f360ea58bMartijn Coenen*******************************************************************************/
14156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint8_t LLCP_GetRemoteVersion(void) {
14166767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
14176767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      "Version: 0x%x", (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
14186767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                           ? llcp_cb.lcb.peer_version
14196767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                           : 0);
14206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
14216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED)
14226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return (llcp_cb.lcb.peer_version);
14236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  else
14246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return 0;
14254817764542b01378f70007625270d20f360ea58bMartijn Coenen}
14264817764542b01378f70007625270d20f360ea58bMartijn Coenen
14274817764542b01378f70007625270d20f360ea58bMartijn Coenen/*******************************************************************************
14284817764542b01378f70007625270d20f360ea58bMartijn Coenen**
1429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_GetLinkMIU
1430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Return local and remote link MIU
1432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          None
1435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
14376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid LLCP_GetLinkMIU(uint16_t* p_local_link_miu, uint16_t* p_remote_link_miu) {
14386767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << __func__;
14396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
14406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED) {
14416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *p_local_link_miu = llcp_cb.lcb.local_link_miu;
14426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *p_remote_link_miu = llcp_cb.lcb.effective_miu;
14436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
14446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *p_local_link_miu = 0;
14456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *p_remote_link_miu = 0;
14466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
14476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
14486767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled)
14496767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi      << StringPrintf("local_link_miu = %d, remote_link_miu = %d",
14506767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi                      *p_local_link_miu, *p_remote_link_miu);
1451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
1454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         LLCP_DiscoverService
1456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1457552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi** Description      Return SAP of service name in connected device through
1458552f2b745deddd35d9b75da9c9c09bd2f3f573a8Ruchi Kandoi**                  callback
1459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          LLCP_STATUS_SUCCESS if success
1462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
1463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
14646fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS LLCP_DiscoverService(char* p_name, tLLCP_SDP_CBACK* p_cback,
14656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                  uint8_t* p_tid) {
14666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tLLCP_STATUS status;
14676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t i;
1468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14696767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("Service Name:%s", p_name);
1470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (llcp_cb.lcb.link_state != LLCP_LINK_STATE_ACTIVATED) {
14726767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Link is not activated");
14736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
14746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
14756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
14766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (!p_cback) {
14776767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Callback must be provided.");
14786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
14796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if peer version is less than V1.1 then SNL is not supported */
14826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((llcp_cb.lcb.agreed_major_version == 0x01) &&
14836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (llcp_cb.lcb.agreed_minor_version < 0x01)) {
14846767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi    LOG(ERROR) << StringPrintf("Peer doesn't support SNL");
14856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    return LLCP_STATUS_FAIL;
14866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  for (i = 0; i < LLCP_MAX_SDP_TRANSAC; i++) {
14896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (!llcp_cb.sdp_cb.transac[i].p_cback) {
14906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      llcp_cb.sdp_cb.transac[i].tid = llcp_cb.sdp_cb.next_tid;
14916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      llcp_cb.sdp_cb.next_tid++;
14926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      llcp_cb.sdp_cb.transac[i].p_cback = p_cback;
1493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      status = llcp_sdp_send_sdreq(llcp_cb.sdp_cb.transac[i].tid, p_name);
1495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
14966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (status == LLCP_STATUS_FAIL) {
14976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        llcp_cb.sdp_cb.transac[i].p_cback = NULL;
14986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
14996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
15006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      *p_tid = llcp_cb.sdp_cb.transac[i].tid;
15016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      return (status);
1502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
15036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
15056767aec6e61ac10feb07bd27f9e1247076b32050Ruchi Kandoi  LOG(ERROR) << StringPrintf("Out of resource");
1506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
15076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return LLCP_STATUS_FAIL;
1508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
1509