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 LLCP Link Management 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 "trace_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 Projectconst UINT16 llcp_link_rwt[15] = /* RWT = (302us)*2**WT; 302us = 256*16/fc; fc = 13.56MHz */ 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1, /* WT=0, 302us */ 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1, /* WT=1, 604us */ 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2, /* WT=2, 1208us */ 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3, /* WT=3, 2.4ms */ 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5, /* WT=4, 4.8ms */ 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10, /* WT=5, 9.7ms */ 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 20, /* WT=6, 19.3ms */ 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 39, /* WT=7, 38.7ms */ 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 78, /* WT=8, 77.3ms */ 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 155, /* WT=9, 154.6ms */ 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 310, /* WT=10, 309.2ms */ 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 619, /* WT=11, 618.5ms */ 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1237, /* WT=12, 1237.0ms */ 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2474, /* WT=13, 2474.0ms */ 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4948, /* WT=14, 4948.0ms */ 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN llcp_link_parse_gen_bytes (UINT8 gen_bytes_len, UINT8 *p_gen_bytes); 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN llcp_link_version_agreement (void); 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_send_SYMM (void); 58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_update_status (BOOLEAN is_activated); 59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_check_congestion (void); 60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_check_uncongested (void); 61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_proc_ui_pdu (UINT8 local_sap, UINT8 remote_sap, UINT16 ui_pdu_length, UINT8 *p_ui_pdu, BT_HDR *p_msg); 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_proc_agf_pdu (BT_HDR *p_msg); 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_proc_rx_pdu (UINT8 dsap, UINT8 ptype, UINT8 ssap, BT_HDR *p_msg); 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_proc_rx_data (BT_HDR *p_msg); 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BT_HDR *llcp_link_get_next_pdu (BOOLEAN length_only, UINT16 *p_next_pdu_length); 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BT_HDR *llcp_link_build_next_pdu (BT_HDR *p_agf); 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_send_to_lower (BT_HDR *p_msg); 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (LLCP_TEST_INCLUDED == TRUE) /* this is for LLCP testing */ 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern tLLCP_TEST_PARAMS llcp_test_params; 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* debug functions type */ 75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *llcp_pdu_type (UINT8 ptype); 77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_start_inactivity_timer 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function start LLCP link inactivity timer. 84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_start_inactivity_timer (void) 89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (llcp_cb.lcb.inact_timer.in_use == FALSE) 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(llcp_cb.lcb.inact_timeout > 0) ) 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG1 ("Start inactivity_timer: %d ms", llcp_cb.lcb.inact_timeout); 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_start_quick_timer (&llcp_cb.lcb.inact_timer, NFC_TTYPE_LLCP_LINK_INACT, 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ((UINT32) llcp_cb.lcb.inact_timeout) * QUICK_TIMER_TICKS_PER_SEC / 1000); 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_stop_inactivity_timer 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function stop LLCP link inactivity timer. 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_stop_inactivity_timer (void) 110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.lcb.inact_timer.in_use) 112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG0 ("Stop inactivity_timer"); 114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_stop_quick_timer (&llcp_cb.lcb.inact_timer); 116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_start_link_timer 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function starts LLCP link timer (LTO or delay response). 124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_start_link_timer (void) 129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.lcb.symm_state == LLCP_LINK_SYMM_LOCAL_XMIT_NEXT) 131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* wait for application layer sending data */ 133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_start_quick_timer (&llcp_cb.lcb.timer, NFC_TTYPE_LLCP_LINK_MANAGER, 134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (((UINT32) llcp_cb.lcb.symm_delay) * QUICK_TIMER_TICKS_PER_SEC) / 1000); 135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* wait for data to receive from remote */ 139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_start_quick_timer (&llcp_cb.lcb.timer, NFC_TTYPE_LLCP_LINK_MANAGER, 140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ((UINT32) llcp_cb.lcb.peer_lto) * QUICK_TIMER_TICKS_PER_SEC / 1000); 141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_stop_link_timer 147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function stop LLCP link timer (LTO or delay response). 149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_stop_link_timer (void) 154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_stop_quick_timer (&llcp_cb.lcb.timer); 156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_activate 161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Activate LLCP link 163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tLLCP_STATUS 165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttLLCP_STATUS llcp_link_activate (tLLCP_ACTIVATE_CONFIG *p_config) 168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG0 ("llcp_link_activate ()"); 170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* At this point, MAC link activation procedure has been successfully completed */ 172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* The Length Reduction values LRi and LRt MUST be 11b. (254bytes) */ 174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_config->max_payload_size != LLCP_NCI_MAX_PAYL_SIZE) 175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_WARNING2 ("llcp_link_activate (): max payload size (%d) must be %d bytes", 177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_config->max_payload_size, LLCP_NCI_MAX_PAYL_SIZE); 178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Processing the parametes that have been received with the MAC link activation */ 181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_link_parse_gen_bytes (p_config->gen_bytes_len, 182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_config->p_gen_bytes ) == FALSE) 183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_ERROR0 ("llcp_link_activate (): Failed to parse general bytes"); 185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*llcp_cb.lcb.p_link_cback) (LLCP_LINK_ACTIVATION_FAILED_EVT, LLCP_LINK_BAD_GEN_BYTES); 1867c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu 1877c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu if (p_config->is_initiator == FALSE) 1887c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu { 1897c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu /* repond to any incoming PDU with invalid LLCP PDU */ 1907c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu llcp_cb.lcb.link_state = LLCP_LINK_STATE_ACTIVATION_FAILED; 1917c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu NFC_SetStaticRfCback (llcp_link_connection_cback); 1927c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu } 193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return LLCP_STATUS_FAIL; 194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* 197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** For the Target device, the scaled value of RWT MUST be less than or equal to the 198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** scaled value of the LLC Link Timeout (LTO). 199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */ 200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_config->is_initiator) && (llcp_link_rwt[p_config->waiting_time] > llcp_cb.lcb.peer_lto)) 201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_WARNING3 ("llcp_link_activate (): WT (%d, %dms) must be less than or equal to LTO (%dms)", 203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_config->waiting_time, 204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_rwt[p_config->waiting_time], 205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.peer_lto); 206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* extend LTO as much as internally required processing time and propagation delays */ 209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.peer_lto += LLCP_INTERNAL_TX_DELAY + LLCP_INTERNAL_RX_DELAY; 210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* LLCP version number agreement */ 212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_link_version_agreement () == FALSE) 213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_ERROR0 ("llcp_link_activate (): Failed to agree version"); 215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*llcp_cb.lcb.p_link_cback) (LLCP_LINK_ACTIVATION_FAILED_EVT, LLCP_LINK_VERSION_FAILED); 2167c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu 2177c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu if (p_config->is_initiator == FALSE) 2187c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu { 2197c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu /* repond to any incoming PDU with invalid LLCP PDU */ 2207c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu llcp_cb.lcb.link_state = LLCP_LINK_STATE_ACTIVATION_FAILED; 2217c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu NFC_SetStaticRfCback (llcp_link_connection_cback); 2227c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu } 223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return LLCP_STATUS_FAIL; 224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 226dd682fab2cc1e32cc054b86b77606365b3f8f1eeMartijn Coenen llcp_cb.lcb.received_first_packet = FALSE; 227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.is_initiator = p_config->is_initiator; 228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* reset internal flags */ 2305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen llcp_cb.lcb.flags = 0x00; 2315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* set tx MIU to MIN (MIU of local LLCP, MIU of peer LLCP) */ 233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.lcb.local_link_miu >= llcp_cb.lcb.peer_miu) 235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.effective_miu = llcp_cb.lcb.peer_miu; 236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.effective_miu = llcp_cb.lcb.local_link_miu; 238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* 240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** When entering the normal operation phase, LLCP shall initialize the symmetry 241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** procedure. 242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */ 243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.lcb.is_initiator) 244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG0 ("llcp_link_activate (): Connected as Initiator"); 246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.inact_timeout = llcp_cb.lcb.inact_timeout_init; 248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.symm_state = LLCP_LINK_SYMM_LOCAL_XMIT_NEXT; 249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.lcb.delay_first_pdu_timeout > 0) 251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* give a chance to upper layer to send PDU if need */ 253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_start_quick_timer (&llcp_cb.lcb.timer, NFC_TTYPE_LLCP_DELAY_FIRST_PDU, 254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (((UINT32) llcp_cb.lcb.delay_first_pdu_timeout) * QUICK_TIMER_TICKS_PER_SEC) / 1000); 255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_send_SYMM (); 259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG0 ("llcp_link_activate (): Connected as Target"); 264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.inact_timeout = llcp_cb.lcb.inact_timeout_target; 265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.symm_state = LLCP_LINK_SYMM_REMOTE_XMIT_NEXT; 266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* wait for data to receive from remote */ 268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_start_link_timer (); 269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* 273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Set state to LLCP_LINK_STATE_ACTIVATED and notify activation before set data callback 274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** because LLCP PDU could be in NCI queue. 275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */ 276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.link_state = LLCP_LINK_STATE_ACTIVATED; 277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* LLCP Link Activation completed */ 279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*llcp_cb.lcb.p_link_cback) (LLCP_LINK_ACTIVATION_COMPLETE_EVT, LLCP_LINK_SUCCESS); 280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Update link status to service layer */ 282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_update_status (TRUE); 283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_SetStaticRfCback (llcp_link_connection_cback); 285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (LLCP_STATUS_SUCCESS); 287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_deactivate_cleanup 292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Clean up for link deactivation 294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_deactivate_cleanup (UINT8 reason) 299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* report SDP failure for any pending request */ 301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_sdp_proc_deactivation (); 302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Update link status to service layer */ 304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_update_status (FALSE); 305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* We had sent out DISC */ 307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.link_state = LLCP_LINK_STATE_DEACTIVATED; 308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_stop_link_timer (); 310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* stop inactivity timer */ 312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_stop_inactivity_timer (); 313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Let upper layer deactivate local link */ 315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*llcp_cb.lcb.p_link_cback) (LLCP_LINK_DEACTIVATED_EVT, reason); 316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_process_link_timeout 321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process timeout events for LTO, SYMM and deactivating 323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid llcp_link_process_link_timeout (void) 328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED) 330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((llcp_cb.lcb.symm_delay > 0) && (llcp_cb.lcb.symm_state == LLCP_LINK_SYMM_LOCAL_XMIT_NEXT)) 332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* upper layer doesn't have anything to send */ 334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG0 ("llcp_link_process_link_timeout (): LEVT_TIMEOUT in state of LLCP_LINK_SYMM_LOCAL_XMIT_NEXT"); 335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_send_SYMM (); 336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* wait for data to receive from remote */ 338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_start_link_timer (); 339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* start inactivity timer */ 341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.num_data_link_connection == 0) 342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_start_inactivity_timer (); 344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_ERROR0 ("llcp_link_process_link_timeout (): LEVT_TIMEOUT in state of LLCP_LINK_SYMM_REMOTE_XMIT_NEXT"); 349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_deactivate (LLCP_LINK_TIMEOUT); 350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_DEACTIVATING) 353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_deactivate_cleanup (llcp_cb.lcb.link_deact_reason); 355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_SetStaticRfCback (NULL); 357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_deactivate 363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Deactivate LLCP link 365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid llcp_link_deactivate (UINT8 reason) 370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 local_sap, idx; 372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tLLCP_DLCB *p_dlcb; 373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tLLCP_APP_CB *p_app_cb; 374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG1 ("llcp_link_deactivate () reason = 0x%x", reason); 376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Release any held buffers in signaling PDU queue */ 378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (llcp_cb.lcb.sig_xmit_q.p_first) 379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (GKI_dequeue (&llcp_cb.lcb.sig_xmit_q)); 380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Release any held buffers in UI PDU queue */ 382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (local_sap = LLCP_SAP_SDP + 1; local_sap < LLCP_NUM_SAPS; local_sap++) 383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_app_cb = llcp_util_get_app_cb (local_sap); 385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_app_cb) 387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_app_cb->p_app_cback) ) 388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (p_app_cb->ui_xmit_q.p_first) 390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (GKI_dequeue (&p_app_cb->ui_xmit_q)); 391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_app_cb->is_ui_tx_congested = FALSE; 393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (p_app_cb->ui_rx_q.p_first) 395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (GKI_dequeue (&p_app_cb->ui_rx_q)); 396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.total_tx_ui_pdu = 0; 400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.total_rx_ui_pdu = 0; 401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Notify all of data link */ 403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (idx = 0; idx < LLCP_MAX_DATA_LINK; idx++) 404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.dlcb[idx].state != LLCP_DLC_STATE_IDLE) 406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_dlcb = &(llcp_cb.dlcb[idx]); 408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_dlsm_execute (p_dlcb, LLCP_DLC_EVENT_LINK_ERROR, NULL); 410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.total_tx_i_pdu = 0; 413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.total_rx_i_pdu = 0; 414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.overall_tx_congested = FALSE; 416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.overall_rx_congested = FALSE; 417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (reason == LLCP_LINK_FRAME_ERROR) 419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(reason == LLCP_LINK_LOCAL_INITIATED) ) 420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get rid of the data pending in NFC tx queue, so DISC PDU can be sent ASAP */ 422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_FlushData (NFC_RF_CONN_ID); 423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_util_send_disc (LLCP_SAP_LM, LLCP_SAP_LM); 425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Wait until DISC is sent to peer */ 427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG0 ("llcp_link_deactivate (): Wait until DISC is sent to peer"); 428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.link_state = LLCP_LINK_STATE_DEACTIVATING; 430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.lcb.sig_xmit_q.count == 0) 432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if DISC is sent to NFCC, wait for short period for NFCC to send it to peer */ 434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_start_quick_timer (&llcp_cb.lcb.timer, NFC_TTYPE_LLCP_LINK_MANAGER, 435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ((UINT32) 50) * QUICK_TIMER_TICKS_PER_SEC / 1000); 436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.link_deact_reason = reason; 439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ( (reason == LLCP_LINK_REMOTE_INITIATED) 442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(!llcp_cb.lcb.is_initiator) ) 443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if received DISC to deactivate LLCP link as target role, send SYMM PDU */ 445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_send_SYMM (); 446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else /* for link timeout and interface error */ 448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 4495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* if got RF link loss receiving no LLC PDU from peer */ 450a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if ( (reason == LLCP_LINK_RF_LINK_LOSS_ERR) 451a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu &&(!(llcp_cb.lcb.flags & LLCP_LINK_FLAGS_RX_ANY_LLC_PDU))) 452a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 453a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu reason = LLCP_LINK_RF_LINK_LOSS_NO_RX_LLC; 454a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 455a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_FlushData (NFC_RF_CONN_ID); 457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_deactivate_cleanup (reason); 460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_parse_gen_bytes 465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Check LLCP magic number and get parameters in general bytes 467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if success 469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN llcp_link_parse_gen_bytes (UINT8 gen_bytes_len, UINT8 *p_gen_bytes) 472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p = p_gen_bytes + LLCP_MAGIC_NUMBER_LEN; 474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 length = gen_bytes_len - LLCP_MAGIC_NUMBER_LEN; 475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (gen_bytes_len >= LLCP_MAGIC_NUMBER_LEN) 477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(*(p_gen_bytes) == LLCP_MAGIC_NUMBER_BYTE0) 478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(*(p_gen_bytes + 1) == LLCP_MAGIC_NUMBER_BYTE1) 479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(*(p_gen_bytes + 2) == LLCP_MAGIC_NUMBER_BYTE2) ) 480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* in case peer didn't include these */ 482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.peer_miu = LLCP_DEFAULT_MIU; 483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.peer_lto = LLCP_DEFAULT_LTO_IN_MS; 484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (llcp_util_parse_link_params (length, p)); 486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else /* if this is not LLCP */ 488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (FALSE); 490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (TRUE); 493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_version_agreement 498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description LLCP version number agreement 500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if success 502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BOOLEAN llcp_link_version_agreement (void) 505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 peer_major_version, peer_minor_version; 507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project peer_major_version = LLCP_GET_MAJOR_VERSION (llcp_cb.lcb.peer_version); 509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project peer_minor_version = LLCP_GET_MINOR_VERSION (llcp_cb.lcb.peer_version); 510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (peer_major_version < LLCP_MIN_MAJOR_VERSION) 512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_ERROR1("llcp_link_version_agreement(): unsupported peer version number. Peer Major Version:%d", peer_major_version); 514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return FALSE; 515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (peer_major_version == LLCP_VERSION_MAJOR) 519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.agreed_major_version = LLCP_VERSION_MAJOR; 521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (peer_minor_version >= LLCP_VERSION_MINOR) 522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.agreed_minor_version = LLCP_VERSION_MINOR; 524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.agreed_minor_version = peer_minor_version; 528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (peer_major_version < LLCP_VERSION_MAJOR) 531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* so far we can support backward compatibility */ 533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.agreed_major_version = peer_major_version; 534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.agreed_minor_version = peer_minor_version; 535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* let peer (higher major version) decide it */ 539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.agreed_major_version = LLCP_VERSION_MAJOR; 540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.agreed_minor_version = LLCP_VERSION_MINOR; 541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG6 ("local version:%d.%d, remote version:%d.%d, agreed version:%d.%d", 544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_VERSION_MAJOR, LLCP_VERSION_MINOR, 545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project peer_major_version, peer_minor_version, 546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.agreed_major_version, llcp_cb.lcb.agreed_minor_version); 547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (TRUE); 549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_update_status 555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Notify all of service layer client link status change 557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_update_status (BOOLEAN is_activated) 562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tLLCP_SAP_CBACK_DATA data; 564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tLLCP_APP_CB *p_app_cb; 565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 sap; 566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.link_status.event = LLCP_SAP_EVT_LINK_STATUS; 568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.link_status.is_activated = is_activated; 569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.link_status.is_initiator = llcp_cb.lcb.is_initiator; 570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* notify all SAP so they can create connection while link is activated */ 572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (sap = LLCP_SAP_SDP + 1; sap < LLCP_NUM_SAPS; sap++) 573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_app_cb = llcp_util_get_app_cb (sap); 575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_app_cb) 577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_app_cb->p_app_cback) ) 578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.link_status.local_sap = sap; 580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_app_cb->p_app_cback (&data); 581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_check_congestion 588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Check overall congestion status 590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Notify to all of upper layer if congested 591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_check_congestion (void) 596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tLLCP_SAP_CBACK_DATA data; 598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tLLCP_APP_CB *p_app_cb; 599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 sap, idx; 600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.overall_tx_congested) 602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* already congested so no need to check again */ 604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.total_tx_ui_pdu + llcp_cb.total_tx_i_pdu >= llcp_cb.max_num_tx_buff) 608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* overall buffer usage is high */ 610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.overall_tx_congested = TRUE; 611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_WARNING2 ("overall tx congestion start: total_tx_ui_pdu=%d, total_tx_i_pdu=%d", 613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.total_tx_ui_pdu, llcp_cb.total_tx_i_pdu); 614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.congest.event = LLCP_SAP_EVT_CONGEST; 616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.congest.is_congested = TRUE; 617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* notify logical data link congestion status */ 619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.congest.remote_sap = LLCP_INVALID_SAP; 620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.congest.link_type = LLCP_LINK_TYPE_LOGICAL_DATA_LINK; 621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (sap = LLCP_SAP_SDP + 1; sap < LLCP_NUM_SAPS; sap++) 623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_app_cb = llcp_util_get_app_cb (sap); 625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_app_cb) 627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_app_cb->p_app_cback) 628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) ) 629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if already congested then no need to notify again */ 631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_app_cb->is_ui_tx_congested) 632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_app_cb->is_ui_tx_congested = TRUE; 634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_WARNING2 ("Logical link (SAP=0x%X) congestion start: count=%d", 636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project sap, p_app_cb->ui_xmit_q.count); 637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.congest.local_sap = sap; 639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_app_cb->p_app_cback (&data); 640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* notify data link connection congestion status */ 645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.congest.link_type = LLCP_LINK_TYPE_DATA_LINK_CONNECTION; 646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (idx = 0; idx < LLCP_MAX_DATA_LINK; idx++ ) 648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (llcp_cb.dlcb[idx].state == LLCP_DLC_STATE_CONNECTED) 650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(llcp_cb.dlcb[idx].remote_busy == FALSE) 651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(llcp_cb.dlcb[idx].is_tx_congested == FALSE) ) 652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.dlcb[idx].is_tx_congested = TRUE; 654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_WARNING3 ("Data link (SSAP:DSAP=0x%X:0x%X) congestion start: count=%d", 656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.dlcb[idx].local_sap, llcp_cb.dlcb[idx].remote_sap, 657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.dlcb[idx].i_xmit_q.count); 658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.congest.local_sap = llcp_cb.dlcb[idx].local_sap; 660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.congest.remote_sap = llcp_cb.dlcb[idx].remote_sap; 661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*llcp_cb.dlcb[idx].p_app_cb->p_app_cback) (&data); 663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_check_uncongested 671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Check overall congestion status, logical data link and 673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** data link connection congestion status 674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Notify to each upper layer if uncongested 675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_check_uncongested (void) 680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tLLCP_SAP_CBACK_DATA data; 682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tLLCP_APP_CB *p_app_cb; 683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 xx, sap, idx; 684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.overall_tx_congested) 686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.total_tx_ui_pdu + llcp_cb.total_tx_i_pdu <= llcp_cb.max_num_tx_buff / 2) 688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* overall congestion is cleared */ 690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.overall_tx_congested = FALSE; 691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_WARNING2 ("overall tx congestion end: total_tx_ui_pdu=%d, total_tx_i_pdu=%d", 693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.total_tx_ui_pdu, llcp_cb.total_tx_i_pdu); 694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* wait until more data packets are sent out */ 698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.congest.event = LLCP_SAP_EVT_CONGEST; 703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.congest.is_congested = FALSE; 704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if total number of UI PDU is below threshold */ 706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.total_tx_ui_pdu < llcp_cb.max_num_ll_tx_buff) 707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* check and notify logical data link congestion status */ 709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.congest.remote_sap = LLCP_INVALID_SAP; 710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.congest.link_type = LLCP_LINK_TYPE_LOGICAL_DATA_LINK; 711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* 713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** start point of uncongested status notification is in round robin 714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** so each logical data link has equal chance of transmitting. 715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */ 716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project sap = llcp_cb.ll_tx_uncongest_ntf_start_sap; 717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (xx = LLCP_SAP_SDP + 1; xx < LLCP_NUM_SAPS; xx++) 719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* no logical data link on LM and SDP */ 721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (sap > LLCP_SAP_SDP) 722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_app_cb = llcp_util_get_app_cb (sap); 724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_app_cb) 726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_app_cb->p_app_cback) 727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) 728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_app_cb->is_ui_tx_congested) 729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_app_cb->ui_xmit_q.count <= llcp_cb.ll_tx_congest_end) ) 730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if it was congested but now tx queue count is below threshold */ 732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_app_cb->is_ui_tx_congested = FALSE; 733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG2 ("Logical link (SAP=0x%X) congestion end: count=%d", 735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project sap, p_app_cb->ui_xmit_q.count); 736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.congest.local_sap = sap; 738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_app_cb->p_app_cback (&data); 739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project sap = (sap + 1) % LLCP_NUM_SAPS; 743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* move start point for next logical data link */ 746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (xx = 0; xx < LLCP_NUM_SAPS; xx++) 747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project sap = (llcp_cb.ll_tx_uncongest_ntf_start_sap + 1) % LLCP_NUM_SAPS; 749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (sap > LLCP_SAP_SDP) 751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_app_cb = llcp_util_get_app_cb (sap); 753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_app_cb) 755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_app_cb->p_app_cback) 756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) ) 757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.ll_tx_uncongest_ntf_start_sap = sap; 759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* notify data link connection congestion status */ 766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.congest.link_type = LLCP_LINK_TYPE_DATA_LINK_CONNECTION; 767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* 769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** start point of uncongested status notification is in round robin 770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** so each data link connection has equal chance of transmitting. 771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */ 772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project idx = llcp_cb.dl_tx_uncongest_ntf_start_idx; 773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++ ) 775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if it was congested but now tx queue is below threshold (receiving window) */ 777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (llcp_cb.dlcb[idx].state == LLCP_DLC_STATE_CONNECTED) 778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(llcp_cb.dlcb[idx].is_tx_congested) 779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(llcp_cb.dlcb[idx].i_xmit_q.count <= llcp_cb.dlcb[idx].remote_rw / 2) ) 780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.dlcb[idx].is_tx_congested = FALSE; 782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.dlcb[idx].remote_busy == FALSE) 784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG3 ("Data link (SSAP:DSAP=0x%X:0x%X) congestion end: count=%d", 786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.dlcb[idx].local_sap, llcp_cb.dlcb[idx].remote_sap, 787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.dlcb[idx].i_xmit_q.count); 788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.congest.local_sap = llcp_cb.dlcb[idx].local_sap; 790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.congest.remote_sap = llcp_cb.dlcb[idx].remote_sap; 791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*llcp_cb.dlcb[idx].p_app_cb->p_app_cback) (&data); 793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project idx = (idx + 1) % LLCP_MAX_DATA_LINK; 796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* move start point for next data link connection */ 799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++ ) 800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project idx = (llcp_cb.dl_tx_uncongest_ntf_start_idx + 1) % LLCP_MAX_DATA_LINK; 802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.dlcb[idx].state == LLCP_DLC_STATE_CONNECTED) 803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.dl_tx_uncongest_ntf_start_idx = idx; 805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_send_SYMM 813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send SYMM PDU 815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_send_SYMM (void) 820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_msg; 822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg = (BT_HDR*) GKI_getpoolbuf (LLCP_POOL_ID); 825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_msg) 827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->len = LLCP_PDU_SYMM_SIZE; 829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_msg + 1) + p_msg->offset; 832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, LLCP_GET_PDU_HEADER (LLCP_SAP_LM, LLCP_PDU_SYMM_TYPE, LLCP_SAP_LM )); 833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_send_to_lower (p_msg); 835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 8407c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** Function llcp_link_send_invalid_pdu 8417c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** 8427c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** Description Send invalid LLC PDU in LLCP_LINK_STATE_ACTIVATION_FAILED 8437c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** 8447c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** Returns void 8457c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** 8467c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu*******************************************************************************/ 8477c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chustatic void llcp_link_send_invalid_pdu (void) 8487c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu{ 8497c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu BT_HDR *p_msg; 8507c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu UINT8 *p; 8517c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu 8527c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu p_msg = (BT_HDR*) GKI_getpoolbuf (LLCP_POOL_ID); 8537c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu 8547c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu if (p_msg) 8557c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu { 8567c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu /* send one byte of 0x00 as invalid LLC PDU */ 8577c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu p_msg->len = 1; 8587c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu p_msg->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 8597c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu 8607c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu p = (UINT8 *) (p_msg + 1) + p_msg->offset; 8617c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu *p = 0x00; 8627c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu 8637c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu NFC_SendData (NFC_RF_CONN_ID, p_msg); 8647c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu } 8657c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu} 8667c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu 8677c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu/******************************************************************************* 8687c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu** 869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_check_send_data 870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send PDU to peer 872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid llcp_link_check_send_data (void) 877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_pdu; 879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* don't re-enter while processing to prevent out of sequence */ 881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.lcb.is_sending_data) 882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.is_sending_data = TRUE; 885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* 887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** check overall congestion due to high usage of buffer pool 888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** if congested then notify all of upper layers not to send any more data 889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */ 890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_check_congestion (); 891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.lcb.symm_state == LLCP_LINK_SYMM_LOCAL_XMIT_NEXT) 893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG0 ("llcp_link_check_send_data () in state of LLCP_LINK_SYMM_LOCAL_XMIT_NEXT"); 895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_pdu = llcp_link_build_next_pdu (NULL); 897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* 899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** For data link connection, 900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** V(RA) was updated and N(R) was set to V(RA), if I PDU was added in this transmission. 901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** If there was no I PDU to carry V(RA) and V(RA) is not V(R) and it's not congested, 902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** then RR PDU will be sent. 903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** If there was no I PDU to carry V(RA) and V(RA) is not V(R) and it's congested, 904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** then RNR PDU will be sent. 905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** If local busy state has been changed then RR or RNR PDU may be sent. 906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */ 907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_dlc_check_to_send_rr_rnr (); 908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* add RR/RNR PDU to be sent if any */ 910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_pdu = llcp_link_build_next_pdu (p_pdu); 911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_pdu != NULL) 913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_send_to_lower (p_pdu); 915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* stop inactivity timer */ 917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_stop_inactivity_timer (); 918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* check congestion status after sending out some data */ 920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_check_uncongested (); 921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* There is no data to send, so send SYMM */ 925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATED) 926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.lcb.symm_delay > 0) 928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* wait for application layer sending data */ 930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_start_link_timer (); 931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.is_sending_data = FALSE; 932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_send_SYMM (); 937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* start inactivity timer */ 939e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.num_data_link_connection == 0) 940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_start_inactivity_timer (); 942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.is_sending_data = FALSE; 948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_DEACTIVATING) 953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* wait for short period for NFCC to send DISC */ 955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_start_quick_timer (&llcp_cb.lcb.timer, NFC_TTYPE_LLCP_LINK_MANAGER, 956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ((UINT32) 50) * QUICK_TIMER_TICKS_PER_SEC / 1000); 957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* wait for data to receive from remote */ 961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_start_link_timer (); 962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.is_sending_data = FALSE; 966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_proc_ui_pdu 971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process UI PDU from peer device 973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns None 975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_proc_ui_pdu (UINT8 local_sap, 978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 remote_sap, 979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 ui_pdu_length, 980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_ui_pdu, 981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_msg) 982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN appended; 984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_last_buf; 985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 available_bytes; 986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_dst; 987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tLLCP_APP_CB *p_app_cb; 988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tLLCP_SAP_CBACK_DATA data; 989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tLLCP_DLCB *p_dlcb; 990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_app_cb = llcp_util_get_app_cb (local_sap); 992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /*if UI PDU sent to SAP with data link connection*/ 993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_dlcb = llcp_dlc_find_dlcb_by_sap (local_sap, remote_sap))) 994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_util_send_frmr (p_dlcb, LLCP_FRMR_W_ERROR_FLAG, LLCP_PDU_UI_TYPE, 0); 996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_dlsm_execute (p_dlcb, LLCP_DLC_EVENT_FRAME_ERROR, NULL); 997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_msg) 998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg); 1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if application is registered and expecting UI PDU on logical data link */ 1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_app_cb) 1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_app_cb->p_app_cback) 1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_app_cb->link_type & LLCP_LINK_TYPE_LOGICAL_DATA_LINK) ) 1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG2 ("llcp_link_proc_ui_pdu () Local SAP:0x%x, Remote SAP:0x%x", local_sap, remote_sap); 1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if this is not from AGF PDU */ 1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_msg) 1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ui_pdu_length = p_msg->len; /* including LLCP header */ 1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_ui_pdu = (UINT8*) (p_msg + 1) + p_msg->offset; 1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project appended = FALSE; 1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get last buffer in rx queue */ 1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_last_buf = (BT_HDR *) GKI_getlast (&p_app_cb->ui_rx_q); 1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_last_buf) 1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get max length to append at the end of buffer */ 1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project available_bytes = GKI_get_buf_size (p_last_buf) - BT_HDR_SIZE - p_last_buf->offset - p_last_buf->len; 1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if new UI PDU with length can be attached at the end of buffer */ 1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (available_bytes >= LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length) 1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_dst = (UINT8*) (p_last_buf + 1) + p_last_buf->offset + p_last_buf->len; 1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* add length of UI PDU */ 1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p_dst, ui_pdu_length); 1035e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* copy UI PDU with LLCP header */ 1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_dst, p_ui_pdu, ui_pdu_length); 1038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_last_buf->len += LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length; 1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_msg) 1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg); 1043e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project appended = TRUE; 1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1046e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1047e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if it is not available to append */ 1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!appended) 1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if it's not from AGF PDU */ 1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_msg) 1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* add length of PDU in front of UI PDU (reuse room for NCI header) */ 1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_ui_pdu -= LLCP_PDU_AGF_LEN_SIZE; 1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p_ui_pdu, ui_pdu_length); 1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->offset -= LLCP_PDU_AGF_LEN_SIZE; 1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->len += LLCP_PDU_AGF_LEN_SIZE; 1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->layer_specific = 0; 1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg = (BT_HDR *) GKI_getpoolbuf (LLCP_POOL_ID); 1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_msg) 1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_dst = (UINT8*) (p_msg + 1); 1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* add length of PDU in front of UI PDU */ 1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p_dst, ui_pdu_length); 1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p_dst, p_ui_pdu, ui_pdu_length); 1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->offset = 0; 1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->len = LLCP_PDU_AGF_LEN_SIZE + ui_pdu_length; 1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->layer_specific = 0; 1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_ERROR0 ("llcp_link_proc_ui_pdu (): out of buffer"); 1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* insert UI PDU in rx queue */ 1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_msg) 1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_enqueue (&p_app_cb->ui_rx_q, p_msg); 1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.total_rx_ui_pdu++; 1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_app_cb->ui_rx_q.count > llcp_cb.ll_rx_congest_start) 1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_WARNING2 ("llcp_link_proc_ui_pdu (): SAP:0x%x, rx link is congested (%d), discard oldest UI PDU", 1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project local_sap, p_app_cb->ui_rx_q.count); 1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (GKI_dequeue (&p_app_cb->ui_rx_q)); 1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.total_rx_ui_pdu--; 1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_app_cb->ui_rx_q.count == 1) && (appended == FALSE)) 1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.data_ind.event = LLCP_SAP_EVT_DATA_IND; 1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.data_ind.local_sap = local_sap; 1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.data_ind.remote_sap = remote_sap; 1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project data.data_ind.link_type = LLCP_LINK_TYPE_LOGICAL_DATA_LINK; 1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_app_cb->p_app_cback) (&data); 1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_ERROR1 ("llcp_link_proc_ui_pdu (): Unregistered SAP:0x%x", local_sap); 1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_msg) 1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg); 1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_proc_agf_pdu 1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process AGF PDU from peer device 1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_proc_agf_pdu (BT_HDR *p_agf) 1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 agf_length; 1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p, *p_info, *p_pdu_length; 1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 pdu_hdr, pdu_length; 1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 dsap, ptype, ssap; 1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_agf->len -= LLCP_PDU_HEADER_SIZE; 1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_agf->offset += LLCP_PDU_HEADER_SIZE; 1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* 1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** check integrity of AGF PDU and get number of PDUs in AGF PDU 1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */ 1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project agf_length = p_agf->len; 1145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_agf + 1) + p_agf->offset; 1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (agf_length > 0) 1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (agf_length > LLCP_PDU_AGF_LEN_SIZE) 1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (pdu_length, p); 1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project agf_length -= LLCP_PDU_AGF_LEN_SIZE; 1153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (pdu_length <= agf_length) 1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += pdu_length; 1162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project agf_length -= pdu_length; 1163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (agf_length != 0) 1171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_ERROR0 ("llcp_link_proc_agf_pdu (): Received invalid AGF PDU"); 1173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_agf); 1174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 1175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* 1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** Process PDUs in AGF 1179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */ 1180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project agf_length = p_agf->len; 1181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_agf + 1) + p_agf->offset; 1182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (agf_length > 0) 1184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get length of PDU */ 1186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_pdu_length = p; 1187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (pdu_length, p); 1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project agf_length -= LLCP_PDU_AGF_LEN_SIZE; 1189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get DSAP/PTYPE/SSAP */ 1191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_info = p; 1192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (pdu_hdr, p_info ); 1193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project dsap = LLCP_GET_DSAP (pdu_hdr); 1195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ptype = (UINT8) (LLCP_GET_PTYPE (pdu_hdr)); 1196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ssap = LLCP_GET_SSAP (pdu_hdr); 1197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG4 ("llcp_link_proc_agf_pdu (): Rx DSAP:0x%x, PTYPE:%s (0x%x), SSAP:0x%x in AGF", 1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project dsap, llcp_pdu_type (ptype), ptype, ssap); 1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (ptype == LLCP_PDU_DISC_TYPE) 1204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(dsap == LLCP_SAP_LM) 1205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(ssap == LLCP_SAP_LM) ) 1206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_agf); 1208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_deactivate (LLCP_LINK_REMOTE_INITIATED); 1209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 1210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (ptype == LLCP_PDU_SYMM_TYPE) 1212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_ERROR0 ("llcp_link_proc_agf_pdu (): SYMM PDU exchange shall not be in AGF"); 1214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (ptype == LLCP_PDU_PAX_TYPE) 1216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_ERROR0 ("llcp_link_proc_agf_pdu (): PAX PDU exchange shall not be used"); 1218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (ptype == LLCP_PDU_SNL_TYPE) 1220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_sdp_proc_snl ((UINT16) (pdu_length - LLCP_PDU_HEADER_SIZE), p_info); 1222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ((ptype == LLCP_PDU_UI_TYPE) && (pdu_length > LLCP_PDU_HEADER_SIZE)) 1224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_proc_ui_pdu (dsap, ssap, pdu_length, p, NULL); 1226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (ptype == LLCP_PDU_I_TYPE) 1228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_dlc_proc_i_pdu (dsap, ssap, pdu_length, p, NULL); 1230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else /* let data link connection handle PDU */ 1232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_dlc_proc_rx_pdu (dsap, ptype, ssap, (UINT16) (pdu_length - LLCP_PDU_HEADER_SIZE), p_info); 1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += pdu_length; 1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project agf_length -= pdu_length; 1238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_agf); 1241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_proc_rx_pdu 1246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process received PDU from peer device 1248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 1250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_proc_rx_pdu (UINT8 dsap, UINT8 ptype, UINT8 ssap, BT_HDR *p_msg) 1253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN free_buffer = TRUE; 1255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_data; 1256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (ptype) 1258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_PAX_TYPE: 1260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_ERROR0 ("llcp_link_proc_rx_pdu (); PAX PDU exchange shall not be used"); 1261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_DISC_TYPE: 1264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((dsap == LLCP_SAP_LM) && (ssap == LLCP_SAP_LM)) 1265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_deactivate (LLCP_LINK_REMOTE_INITIATED); 1267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_data = (UINT8 *) (p_msg + 1) + p_msg->offset + LLCP_PDU_HEADER_SIZE; 1271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_dlc_proc_rx_pdu (dsap, ptype, ssap, (UINT16) (p_msg->len - LLCP_PDU_HEADER_SIZE), p_data); 1272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_SNL_TYPE: 1276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_data = (UINT8 *) (p_msg + 1) + p_msg->offset + LLCP_PDU_HEADER_SIZE; 1277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_sdp_proc_snl ((UINT16) (p_msg->len - LLCP_PDU_HEADER_SIZE), p_data); 1278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_AGF_TYPE: 1281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_proc_agf_pdu (p_msg); 1282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project free_buffer = FALSE; 1283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_UI_TYPE: 1286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_proc_ui_pdu (dsap, ssap, 0, NULL, p_msg); 1287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project free_buffer = FALSE; 1288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_I_TYPE: 1291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_dlc_proc_i_pdu (dsap, ssap, 0, NULL, p_msg); 1292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project free_buffer = FALSE; 1293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 1296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_data = (UINT8 *) (p_msg + 1) + p_msg->offset + LLCP_PDU_HEADER_SIZE; 1297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_dlc_proc_rx_pdu (dsap, ptype, ssap, (UINT16) (p_msg->len - LLCP_PDU_HEADER_SIZE), p_data); 1298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (free_buffer) 1302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg); 1303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_proc_rx_data 1308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process received data from NFCC and maintain symmetry state 1310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 1312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_proc_rx_data (BT_HDR *p_msg) 1315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 1317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 pdu_hdr, info_length = 0; 1318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 dsap, ptype, ssap; 1319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN free_buffer = TRUE; 1320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN frame_error = FALSE; 1321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.lcb.symm_state == LLCP_LINK_SYMM_REMOTE_XMIT_NEXT) 1323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_stop_link_timer (); 1325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1326dd682fab2cc1e32cc054b86b77606365b3f8f1eeMartijn Coenen if (llcp_cb.lcb.received_first_packet == FALSE) 1327dd682fab2cc1e32cc054b86b77606365b3f8f1eeMartijn Coenen { 1328dd682fab2cc1e32cc054b86b77606365b3f8f1eeMartijn Coenen llcp_cb.lcb.received_first_packet = TRUE; 1329dd682fab2cc1e32cc054b86b77606365b3f8f1eeMartijn Coenen (*llcp_cb.lcb.p_link_cback) (LLCP_LINK_FIRST_PACKET_RECEIVED_EVT, LLCP_LINK_SUCCESS); 1330dd682fab2cc1e32cc054b86b77606365b3f8f1eeMartijn Coenen } 1331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (llcp_cb.lcb.link_state == LLCP_LINK_STATE_DEACTIVATING) 1332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(llcp_cb.lcb.sig_xmit_q.count == 0) ) 1333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* this indicates that DISC PDU had been sent out to peer */ 1335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* initiator may wait for SYMM PDU */ 1336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_process_link_timeout (); 1337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_msg->len < LLCP_PDU_HEADER_SIZE) 1341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_ERROR1 ("Received too small PDU: got %d bytes", p_msg->len); 1343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project frame_error = TRUE; 1344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_msg + 1) + p_msg->offset; 1348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (pdu_hdr, p ); 1349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project dsap = LLCP_GET_DSAP (pdu_hdr); 1351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ptype = (UINT8) (LLCP_GET_PTYPE (pdu_hdr)); 1352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ssap = LLCP_GET_SSAP (pdu_hdr); 1353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get length of information per PDU type */ 1355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (ptype == LLCP_PDU_I_TYPE) 1356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(ptype == LLCP_PDU_RR_TYPE) 1357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(ptype == LLCP_PDU_RNR_TYPE) ) 1358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_msg->len >= LLCP_PDU_HEADER_SIZE + LLCP_SEQUENCE_SIZE) 1360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project info_length = p_msg->len - LLCP_PDU_HEADER_SIZE - LLCP_SEQUENCE_SIZE; 1362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_ERROR0 ("Received I/RR/RNR PDU without sequence"); 1366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project frame_error = TRUE; 1367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project info_length = p_msg->len - LLCP_PDU_HEADER_SIZE; 1372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* check if length of information is bigger than link MIU */ 1375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((!frame_error) && (info_length > llcp_cb.lcb.local_link_miu)) 1376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_ERROR2 ("Received exceeding MIU (%d): got %d bytes SDU", 1378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.local_link_miu, info_length); 1379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project frame_error = TRUE; 1381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 1385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG4 ("llcp_link_proc_rx_data (): DSAP:0x%x, PTYPE:%s (0x%x), SSAP:0x%x", 1386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project dsap, llcp_pdu_type (ptype), ptype, ssap); 1387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 1388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ptype == LLCP_PDU_SYMM_TYPE) 1390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (info_length > 0) 1392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_ERROR1 ("Received extra data (%d bytes) in SYMM PDU", info_length); 1394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project frame_error = TRUE; 1395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* received other than SYMM */ 1400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_stop_inactivity_timer (); 1401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_proc_rx_pdu (dsap, ptype, ssap, p_msg); 1403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project free_buffer = FALSE; 1404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.symm_state = LLCP_LINK_SYMM_LOCAL_XMIT_NEXT; 1409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* check if any pending packet */ 1411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_check_send_data (); 1412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_ERROR0 ("Received PDU in state of SYMM_MUST_XMIT_NEXT"); 1417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (free_buffer) 1420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg); 1421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_get_next_pdu 1426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Get next PDU from link manager or data links w/wo dequeue 1428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns pointer of a PDU to send if length_only is FALSE 1430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NULL otherwise 1431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BT_HDR *llcp_link_get_next_pdu (BOOLEAN length_only, UINT16 *p_next_pdu_length) 1434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_msg; 1436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project int count, xx; 1437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tLLCP_APP_CB *p_app_cb; 1438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* processing signalling PDU first */ 1440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.lcb.sig_xmit_q.p_first) 1441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (length_only) 1443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg = (BT_HDR*) llcp_cb.lcb.sig_xmit_q.p_first; 1445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_next_pdu_length = p_msg->len; 1446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NULL; 1447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg = (BT_HDR*) GKI_dequeue (&llcp_cb.lcb.sig_xmit_q); 1450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return p_msg; 1452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* transmitting logical data link and data link connection equaly */ 1456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (xx = 0; xx < 2; xx++) 1457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!llcp_cb.lcb.ll_served) 1459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Get one from logical link connection */ 1461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (count = 0; count < LLCP_NUM_SAPS; count++) 1462e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* round robin schedule without priority */ 1464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_app_cb = llcp_util_get_app_cb (llcp_cb.lcb.ll_idx); 1465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (p_app_cb) 1467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_app_cb->p_app_cback) 1468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(p_app_cb->ui_xmit_q.count) ) 1469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (length_only) 1471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* don't alternate next data link to return the same length of PDU */ 1473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg = (BT_HDR *) p_app_cb->ui_xmit_q.p_first; 1474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_next_pdu_length = p_msg->len; 1475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NULL; 1476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* check data link connection first in next time */ 1480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.ll_served = !llcp_cb.lcb.ll_served; 1481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg = (BT_HDR*) GKI_dequeue (&p_app_cb->ui_xmit_q); 1483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.total_tx_ui_pdu--; 1484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* this logical link has been served, so start from next logical link next time */ 1486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.ll_idx = (llcp_cb.lcb.ll_idx + 1) % LLCP_NUM_SAPS; 1487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return p_msg; 1489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* check next logical link connection */ 1494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.ll_idx = (llcp_cb.lcb.ll_idx + 1) % LLCP_NUM_SAPS; 1495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* no data, so check data link connection if not checked yet */ 1499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.ll_served = !llcp_cb.lcb.ll_served; 1500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Get one from data link connection */ 1504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project for (count = 0; count < LLCP_MAX_DATA_LINK; count++) 1505e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* round robin schedule without priority */ 1507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.dlcb[llcp_cb.lcb.dl_idx].state != LLCP_DLC_STATE_IDLE) 1508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (length_only) 1510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_next_pdu_length = llcp_dlc_get_next_pdu_length (&llcp_cb.dlcb[llcp_cb.lcb.dl_idx]); 1512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (*p_next_pdu_length > 0 ) 1514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* don't change data link connection to return the same length of PDU */ 1516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NULL; 1517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* no data, so check next data link connection */ 1521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.dl_idx = (llcp_cb.lcb.dl_idx + 1) % LLCP_MAX_DATA_LINK; 1522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg = llcp_dlc_get_next_pdu (&llcp_cb.dlcb[llcp_cb.lcb.dl_idx]); 1527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* this data link has been served, so start from next data link next time */ 1529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.dl_idx = (llcp_cb.lcb.dl_idx + 1) % LLCP_MAX_DATA_LINK; 1530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_msg) 1532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* serve logical data link next time */ 1534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.ll_served = !llcp_cb.lcb.ll_served; 1535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return p_msg; 1536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1541e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* check next data link connection */ 1542e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.dl_idx = (llcp_cb.lcb.dl_idx + 1) % LLCP_MAX_DATA_LINK; 1543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1544e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if all of data link connection doesn't have data to send */ 1547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (count >= LLCP_MAX_DATA_LINK) 1548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.ll_served = !llcp_cb.lcb.ll_served; 1550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1555e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* nothing to send */ 1556e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p_next_pdu_length = 0; 1557e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NULL; 1558e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1559e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1560e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1561e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1562e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_build_next_pdu 1563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Build a PDU from Link Manager and Data Link 1565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Perform aggregation procedure if necessary 1566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns BT_HDR* if sent any PDU 1568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic BT_HDR *llcp_link_build_next_pdu (BT_HDR *p_pdu) 1571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BT_HDR *p_agf = NULL, *p_msg = NULL, *p_next_pdu; 1573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p, ptype; 1574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 next_pdu_length, pdu_hdr; 1575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_DEBUG0 ("llcp_link_build_next_pdu ()"); 1577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* add any pending SNL PDU into sig_xmit_q for transmitting */ 1579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_sdp_check_send_snl (); 1580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_pdu) 1582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* get PDU type */ 1584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_pdu + 1) + p_pdu->offset; 1585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BE_STREAM_TO_UINT16 (pdu_hdr, p); 1586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ptype = (UINT8) (LLCP_GET_PTYPE (pdu_hdr)); 1588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (ptype == LLCP_PDU_AGF_TYPE) 1590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* add more PDU into this AGF PDU */ 1592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_agf = p_pdu; 1593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg = p_pdu; 1597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Get a PDU from link manager or data links */ 1602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg = llcp_link_get_next_pdu (FALSE, &next_pdu_length); 1603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_msg) 1605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return NULL; 1607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Get length of next PDU from link manager or data links without dequeue */ 1611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_get_next_pdu (TRUE, &next_pdu_length); 1612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (next_pdu_length > 0) 1613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if it's first visit */ 1615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!p_agf) 1616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if next PDU fits into MIU, allocate AGF PDU and copy the first PDU */ 1618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (2 + p_msg->len + 2 + next_pdu_length <= llcp_cb.lcb.effective_miu) 1619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_agf = (BT_HDR*) GKI_getpoolbuf (LLCP_POOL_ID); 1621e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_agf) 1622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_agf->offset = NCI_MSG_OFFSET_SIZE + NCI_DATA_HDR_SIZE; 1624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_agf + 1) + p_agf->offset; 1626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, LLCP_GET_PDU_HEADER (LLCP_SAP_LM, LLCP_PDU_AGF_TYPE, LLCP_SAP_LM )); 1628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, p_msg->len); 1629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy(p, (UINT8 *) (p_msg + 1) + p_msg->offset, p_msg->len); 1630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_agf->len = LLCP_PDU_HEADER_SIZE + 2 + p_msg->len; 1632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_msg); 1634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg = p_agf; 1635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project LLCP_TRACE_ERROR0 ("llcp_link_build_next_pdu (): Out of buffer"); 1639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return p_msg; 1640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if next PDU fits into MIU, copy the next PDU into AGF */ 1649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_agf->len - LLCP_PDU_HEADER_SIZE + 2 + next_pdu_length <= llcp_cb.lcb.effective_miu) 1650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Get a next PDU from link manager or data links */ 1652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_next_pdu = llcp_link_get_next_pdu (FALSE, &next_pdu_length); 1653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_agf + 1) + p_agf->offset + p_agf->len; 1655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_BE_STREAM (p, p_next_pdu->len); 1657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy (p, (UINT8 *) (p_next_pdu + 1) + p_next_pdu->offset, p_next_pdu->len); 1658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_agf->len += 2 + p_next_pdu->len; 1660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_next_pdu); 1662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Get next PDU length from link manager or data links without dequeue */ 1664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_get_next_pdu (TRUE, &next_pdu_length); 1665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 1669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_agf) 1673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return p_agf; 1674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return p_msg; 1676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_send_to_lower 1681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send PDU to lower layer 1683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 1685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void llcp_link_send_to_lower (BT_HDR *p_pdu) 1688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE) 1690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project DispLLCP (p_pdu, FALSE); 1691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 1692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_cb.lcb.symm_state = LLCP_LINK_SYMM_REMOTE_XMIT_NEXT; 1694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_SendData (NFC_RF_CONN_ID, p_pdu); 1696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_link_connection_cback 1701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description processing incoming data 1703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 1705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid llcp_link_connection_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data) 1708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (event == NFC_DATA_CEVT) 1710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_PROTOCOL == TRUE) 1712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project DispLLCP ((BT_HDR *)p_data->data.p_data, TRUE); 1713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 1714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_DEACTIVATED) 1715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* respoding SYMM while LLCP is deactivated but RF link is not deactivated yet */ 1717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_send_SYMM (); 1718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf ((BT_HDR *) p_data->data.p_data); 1719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 17207c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu else if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATION_FAILED) 17217c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu { 17227c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu /* respoding with invalid LLC PDU until initiator deactivates RF link after LLCP activation was failed, 17237c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu ** so that initiator knows LLCP link activation was failed. 17247c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu */ 17257c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu llcp_link_send_invalid_pdu (); 17267c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu GKI_freebuf ((BT_HDR *) p_data->data.p_data); 17277c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu } 1728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 17305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen llcp_cb.lcb.flags |= LLCP_LINK_FLAGS_RX_ANY_LLC_PDU; 1731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_proc_rx_data ((BT_HDR *) p_data->data.p_data); 1732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (event == NFC_ERROR_CEVT) 1735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* RF interface specific status code */ 1737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_deactivate (*(UINT8*) p_data); 1738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (event == NFC_DEACTIVATE_CEVT) 1740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (llcp_cb.lcb.link_state == LLCP_LINK_STATE_DEACTIVATING) 1742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(!llcp_cb.lcb.is_initiator) ) 1743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* peer initiates NFC link deactivation before timeout */ 1745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_stop_link_timer (); 1746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_process_link_timeout (); 1747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 17487c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu else if (llcp_cb.lcb.link_state == LLCP_LINK_STATE_ACTIVATION_FAILED) 17497c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu { 17507c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu /* do not notify to upper layer because activation failure was already notified */ 17517c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu NFC_FlushData (NFC_RF_CONN_ID); 17527c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu llcp_cb.lcb.link_state = LLCP_LINK_STATE_DEACTIVATED; 17537c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu } 1754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (llcp_cb.lcb.link_state != LLCP_LINK_STATE_DEACTIVATED) 1755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project llcp_link_deactivate (LLCP_LINK_RF_LINK_LOSS_ERR); 1757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 17587c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu 1759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_SetStaticRfCback (NULL); 1760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 17617c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu else if (event == NFC_DATA_START_CEVT) 17627c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu { 17637c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu if (llcp_cb.lcb.symm_state == LLCP_LINK_SYMM_REMOTE_XMIT_NEXT) 17647c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu { 17657c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu /* LLCP shall stop LTO timer when receiving the first bit of LLC PDU */ 17667c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu llcp_link_stop_link_timer (); 17677c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu } 17687c69b2723b60a59df4aaa58b13985b3483b291bfEvan Chu } 1769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* LLCP ignores the following events 1771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_CONN_CREATE_CEVT 1773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_CONN_CLOSE_CEVT 1774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */ 1775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (BT_TRACE_VERBOSE == TRUE) 1778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function llcp_pdu_type 1781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description 1783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns string of PDU type 1785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic char *llcp_pdu_type (UINT8 ptype) 1788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch(ptype) 1790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_SYMM_TYPE: 1792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "SYMM"; 1793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_PAX_TYPE: 1794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "PAX"; 1795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_AGF_TYPE: 1796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "AGF"; 1797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_UI_TYPE: 1798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "UI"; 1799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_CONNECT_TYPE: 1800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "CONNECT"; 1801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_DISC_TYPE: 1802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "DISC"; 1803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_CC_TYPE: 1804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "CC"; 1805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_DM_TYPE: 1806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "DM"; 1807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_FRMR_TYPE: 1808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "FRMR"; 1809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_SNL_TYPE: 1810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "SNL"; 1811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_I_TYPE: 1812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "I"; 1813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_RR_TYPE: 1814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "RR"; 1815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case LLCP_PDU_RNR_TYPE: 1816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "RNR"; 1817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 1819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return "RESERVED"; 1820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 1824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1825