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