1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu * Copyright (C) 2010-2014 Broadcom Corporation 4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * you may not use this file except in compliance with the License. 7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * You may obtain a copy of the License at: 8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * See the License for the specific language governing permissions and 15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * limitations under the License. 16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * This file contains the main LLCP entry points 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h> 27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h" 28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_target.h" 29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "bt_types.h" 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llcp_api.h" 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llcp_int.h" 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llcp_defs.h" 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_int.h" 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (LLCP_DYNAMIC_MEMORY == FALSE) 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttLLCP_CB llcp_cb; 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_init 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called once at startup to initialize 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** all the LLCP structures 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid llcp_init (void) 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT32 pool_count; 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memset (&llcp_cb, 0, sizeof (tLLCP_CB)); 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.trace_level = LLCP_INITIAL_TRACE_LEVEL; 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG0 ("LLCP - llcp_init ()"); 58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.local_link_miu = (LLCP_MIU <= LLCP_MAX_MIU ? LLCP_MIU : LLCP_MAX_MIU); 60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.local_opt = LLCP_OPT_VALUE; 61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.local_wt = LLCP_WAITING_TIME; 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.local_lto = LLCP_LTO_VALUE; 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.inact_timeout_init = LLCP_INIT_INACTIVITY_TIMEOUT; 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.inact_timeout_target = LLCP_TARGET_INACTIVITY_TIMEOUT; 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.symm_delay = LLCP_DELAY_RESP_TIME; 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.data_link_timeout = LLCP_DATA_LINK_CONNECTION_TOUT; 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.delay_first_pdu_timeout = LLCP_DELAY_TIME_TO_SEND_FIRST_PDU; 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.wks = LLCP_WKS_MASK_LM; 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* total number of buffers for LLCP */ 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pool_count = GKI_poolcount (LLCP_POOL_ID); 74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* number of buffers for receiving data */ 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.num_rx_buff = (pool_count * LLCP_RX_BUFF_RATIO) / 100; 77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* rx congestion start/end threshold */ 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.overall_rx_congest_start = (UINT8) ((llcp_cb.num_rx_buff * LLCP_RX_CONGEST_START) / 100); 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.overall_rx_congest_end = (UINT8) ((llcp_cb.num_rx_buff * LLCP_RX_CONGEST_END) / 100); 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* max number of buffers for receiving data on logical data link */ 83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.max_num_ll_rx_buff = (UINT8) ((llcp_cb.num_rx_buff * LLCP_LL_RX_BUFF_LIMIT) / 100); 84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG4 ("num_rx_buff = %d, rx_congest_start = %d, rx_congest_end = %d, max_num_ll_rx_buff = %d", 86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.num_rx_buff, llcp_cb.overall_rx_congest_start, 87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.overall_rx_congest_end, llcp_cb.max_num_ll_rx_buff); 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* max number of buffers for transmitting data */ 90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.max_num_tx_buff = (UINT8) (pool_count - llcp_cb.num_rx_buff); 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* max number of buffers for transmitting data on logical data link */ 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.max_num_ll_tx_buff = (UINT8) ((llcp_cb.max_num_tx_buff * LLCP_LL_TX_BUFF_LIMIT) / 100); 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG2 ("max_num_tx_buff = %d, max_num_ll_tx_buff = %d", 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.max_num_tx_buff, llcp_cb.max_num_ll_tx_buff); 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.ll_tx_uncongest_ntf_start_sap = LLCP_SAP_SDP + 1; 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_RegisterServer (LLCP_SAP_SDP, LLCP_LINK_TYPE_DATA_LINK_CONNECTION, "urn:nfc:sn:sdp", llcp_sdp_proc_data); 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_cleanup 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called once at closing to clean up 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid llcp_cleanup (void) 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 sap; 115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tLLCP_APP_CB *p_app_cb; 116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG0 ("LLCP - llcp_cleanup ()"); 118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (sap = LLCP_SAP_SDP; sap < LLCP_NUM_SAPS; sap++) 120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_app_cb = llcp_util_get_app_cb (sap); 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_app_cb) 124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_app_cb->p_app_cback) ) 125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_Deregister (sap); 127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_stop_quick_timer (&llcp_cb.lcb.inact_timer); 131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_stop_quick_timer (&llcp_cb.lcb.timer); 132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_process_timeout 137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function is called when an LLCP-related timeout occurs 139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid llcp_process_timeout (TIMER_LIST_ENT *p_tle) 144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 reason; 146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG1 ("llcp_process_timeout: event=%d", p_tle->event); 148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_tle->event) 150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_TTYPE_LLCP_LINK_MANAGER: 152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Link timeout or Symm timeout */ 153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_process_link_timeout (); 154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_TTYPE_LLCP_LINK_INACT: 157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* inactivity timeout */ 158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_deactivate (LLCP_LINK_LOCAL_INITIATED); 159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_TTYPE_LLCP_DATA_LINK: 162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project reason = LLCP_SAP_DISCONNECT_REASON_TIMEOUT; 163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_dlsm_execute ((tLLCP_DLCB *) (p_tle->param), LLCP_DLC_EVENT_TIMEOUT, &reason); 164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_TTYPE_LLCP_DELAY_FIRST_PDU: 167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_check_send_data (); 168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function LLCP_SetTraceLevel 178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function sets the trace level for LLCP. If called with 180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** a value of 0xFF, it simply returns the current trace level. 181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns The new or current trace level 183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 LLCP_SetTraceLevel (UINT8 new_level) 186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (new_level != 0xFF) 188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.trace_level = new_level; 189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (llcp_cb.trace_level); 191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 192