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 = ¶ms; 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 = ¶ms; 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