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