1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu * Copyright (C) 2010-2014 Broadcom Corporation 4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * you may not use this file except in compliance with the License. 7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * You may obtain a copy of the License at: 8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * See the License for the specific language governing permissions and 15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * limitations under the License. 16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * This file contains LLCP internal definitions 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef LLCP_INT_H 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define LLCP_INT_H 26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "llcp_api.h" 28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_api.h" 29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** LLCP link states 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*/ 336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoienum { 346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_LINK_STATE_DEACTIVATED, /* llcp link is deactivated */ 356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_LINK_STATE_ACTIVATED, /* llcp link has been activated */ 366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_LINK_STATE_DEACTIVATING, /* llcp link is deactivating */ 376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_LINK_STATE_ACTIVATION_FAILED /* llcp link activation was failed */ 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 39512ee63c7cc8feb016863e507a5d33cd0f4242bfRuchi Kandoitypedef uint8_t tLLCP_LINK_STATE; 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** LLCP Symmetric state 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*/ 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define LLCP_LINK_SYMM_LOCAL_XMIT_NEXT 0 466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#define LLCP_LINK_SYMM_REMOTE_XMIT_NEXT 1 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* 495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** LLCP internal flags 505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*/ 5146e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi/* Received any LLC PDU in activated state */ 5246e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi#define LLCP_LINK_FLAGS_RX_ANY_LLC_PDU 0x01 535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/* 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** LLCP link control block 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*/ 576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoitypedef struct { 586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tLLCP_LINK_STATE link_state; /* llcp link state */ 596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tLLCP_LINK_CBACK* 606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi p_link_cback; /* callback function to report llcp link status */ 616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t wks; /* well-known service bit-map */ 626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool is_initiator; /* TRUE if initiator role */ 646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool is_sending_data; /* TRUE if llcp_link_check_send_data() is excuting */ 656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t flags; /* LLCP internal flags */ 666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool received_first_packet; /* TRUE if a packet has been received from remote 676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi */ 686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t agreed_major_version; /* llcp major version used in activated state */ 696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t agreed_minor_version; /* llcp minor version used in activated state */ 706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t peer_version; /* llcp version of peer device */ 726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t peer_miu; /* link MIU of peer device */ 736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t peer_wks; /* WKS of peer device */ 746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t peer_lto; /* link timeout of peer device in ms */ 756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t peer_opt; /* Option field of peer device */ 766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t effective_miu; /* MIU to send PDU in activated state */ 776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi TIMER_LIST_ENT timer; /* link timer for LTO and SYMM response */ 796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t symm_state; /* state of symmectric procedure */ 806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool ll_served; /* TRUE if last transmisstion was for UI */ 816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t ll_idx; /* for scheduler of logical link connection */ 826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t dl_idx; /* for scheduler of data link connection */ 836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi TIMER_LIST_ENT inact_timer; /* inactivity timer */ 856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t inact_timeout; /* inactivity timeout in ms */ 866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t link_deact_reason; /* reason of LLCP link deactivated */ 886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi BUFFER_Q sig_xmit_q; /* tx signaling PDU queue */ 906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* runtime configuration parameters */ 926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t local_link_miu; /* Maximum Information Unit */ 936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t local_opt; /* Option parameter */ 946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t local_wt; /* Response Waiting Time Index */ 956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t local_lto; /* Local Link Timeout */ 966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t inact_timeout_init; /* Inactivity Timeout as initiator role */ 976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t inact_timeout_target; /* Inactivity Timeout as target role */ 986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t symm_delay; /* Delay SYMM response */ 996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t data_link_timeout; /* data link conneciton timeout */ 1006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t delay_first_pdu_timeout; /* delay timeout to send first PDU as 1016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi initiator */ 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} tLLCP_LCB; 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** LLCP Application's registration control block on service access point (SAP) 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*/ 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoitypedef struct { 1107e16563ba20c63ec431301e77405fe29791f2486Ruchi Kandoi uint8_t link_type; /* logical link and/or data link */ 1117e16563ba20c63ec431301e77405fe29791f2486Ruchi Kandoi char* p_service_name; /* GKI buffer containing service name */ 1126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tLLCP_APP_CBACK* p_app_cback; /* application's callback pointer */ 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi BUFFER_Q ui_xmit_q; /* UI PDU queue for transmitting */ 1156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi BUFFER_Q ui_rx_q; /* UI PDU queue for receiving */ 1166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool is_ui_tx_congested; /* TRUE if transmitting UI PDU is congested */ 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} tLLCP_APP_CB; 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* 121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** LLCP data link connection states 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*/ 1236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoienum { 1246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_DLC_STATE_IDLE, /* initial state */ 1256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_DLC_STATE_W4_REMOTE_RESP, /* waiting for connection confirm from peer */ 1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_DLC_STATE_W4_LOCAL_RESP, /* waiting for connection confirm from upper 1276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi layer */ 1286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_DLC_STATE_CONNECTED, /* data link connection has been established */ 1292eba59f3f0639fbf6a2be8cc54167e9ffd5d8536Ruchi Kandoi LLCP_DLC_STATE_W4_REMOTE_DM /* waiting for disconnection confirm from peer */ 130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 131512ee63c7cc8feb016863e507a5d33cd0f4242bfRuchi Kandoitypedef uint8_t tLLCP_DLC_STATE; 132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* 134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** LLCP data link connection events 135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*/ 1366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoienum { 1376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_DLC_EVENT_API_CONNECT_REQ, /* connection request from upper layer */ 1386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_DLC_EVENT_API_CONNECT_CFM, /* connection confirm from upper layer */ 1396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_DLC_EVENT_API_CONNECT_REJECT, /* connection reject from upper layer */ 1406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_DLC_EVENT_PEER_CONNECT_IND, /* connection request from peer */ 1416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_DLC_EVENT_PEER_CONNECT_CFM, /* connection confirm from peer */ 142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_DLC_EVENT_API_DATA_REQ, /* data packet from upper layer */ 1446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_DLC_EVENT_PEER_DATA_IND, /* data packet from peer */ 145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_DLC_EVENT_API_DISCONNECT_REQ, /* disconnect request from upper layer */ 1476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_DLC_EVENT_PEER_DISCONNECT_IND, /* disconnect request from peer */ 1486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_DLC_EVENT_PEER_DISCONNECT_RESP, /* disconnect response from peer */ 149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_DLC_EVENT_FRAME_ERROR, /* received erroneous frame from peer */ 1516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_DLC_EVENT_LINK_ERROR, /* llcp link has been deactivated */ 152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi LLCP_DLC_EVENT_TIMEOUT /* timeout event */ 154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 155512ee63c7cc8feb016863e507a5d33cd0f4242bfRuchi Kandoitypedef uint8_t tLLCP_DLC_EVENT; 156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* 158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** LLCP data link connection control block 159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*/ 160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 16146e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi/* send DISC when tx queue is empty */ 16246e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi#define LLCP_DATA_LINK_FLAG_PENDING_DISC 0x01 16346e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi/* send RR/RNR with valid sequence */ 16446e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi#define LLCP_DATA_LINK_FLAG_PENDING_RR_RNR 0x02 16546e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi/* notify upper later when tx complete */ 16646e6e28414b5e37ffad65353916520fc56ea3a86Ruchi Kandoi#define LLCP_DATA_LINK_FLAG_NOTIFY_TX_DONE 0x04 167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoitypedef struct { 1696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tLLCP_DLC_STATE state; /* data link connection state */ 1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t flags; /* specific action flags */ 1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tLLCP_APP_CB* p_app_cb; /* pointer of application registration */ 1726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi TIMER_LIST_ENT timer; /* timer for connection complete */ 1736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t local_sap; /* SAP of local end point */ 1756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t local_miu; /* MIU of local SAP */ 1766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t local_rw; /* RW of local SAP */ 1776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool local_busy; /* TRUE if local SAP is busy */ 1786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t remote_sap; /* SAP of remote end point */ 1806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t remote_miu; /* MIU of remote SAP */ 1816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t remote_rw; /* RW of remote SAP */ 1826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool remote_busy; /* TRUE if remote SAP is busy */ 1836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t next_tx_seq; /* V(S), send state variable */ 1856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t rcvd_ack_seq; /* V(SA), send ack state variable */ 1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t next_rx_seq; /* V(R), receive state variable */ 1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t sent_ack_seq; /* V(RA), receive ack state variable */ 1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi BUFFER_Q i_xmit_q; /* tx queue of I PDU */ 1906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool is_tx_congested; /* TRUE if tx I PDU is congested */ 1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 1926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi BUFFER_Q i_rx_q; /* rx queue of I PDU */ 1936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool is_rx_congested; /* TRUE if rx I PDU is congested */ 1946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_rx_i_pdu; /* number of I PDU in rx queue */ 1956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t rx_congest_threshold; /* dynamic congest threshold for rx I PDU */ 196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} tLLCP_DLCB; 198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* 200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** LLCP service discovery control block 201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*/ 202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoitypedef struct { 2046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t tid; /* transaction ID */ 2056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tLLCP_SDP_CBACK* p_cback; /* callback function for service discovery */ 206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} tLLCP_SDP_TRANSAC; 207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoitypedef struct { 2096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t next_tid; /* next TID to use */ 2106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tLLCP_SDP_TRANSAC transac[LLCP_MAX_SDP_TRANSAC]; /* active SDP transactions */ 2116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi NFC_HDR* p_snl; /* buffer for SNL PDU */ 212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} tLLCP_SDP_CB; 213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* 215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** LLCP control block 216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*/ 217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoitypedef struct { 2196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tLLCP_SDP_CB sdp_cb; /* SDP control block */ 2206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tLLCP_LCB lcb; /* LLCP link control block */ 2216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tLLCP_APP_CB wks_cb[LLCP_MAX_WKS]; /* Application's registration for 2226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi well-known services */ 2236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tLLCP_APP_CB server_cb 2246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi [LLCP_MAX_SERVER]; /* Application's registration for SDP services */ 2256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tLLCP_APP_CB 2266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi client_cb[LLCP_MAX_CLIENT]; /* Application's registration for client */ 2276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tLLCP_DLCB dlcb[LLCP_MAX_DATA_LINK]; /* Data link connection control block */ 2286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t max_num_ll_tx_buff; /* max number of tx UI PDU in queue */ 2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t max_num_tx_buff; /* max number of tx UI/I PDU in queue */ 2316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_logical_data_link; /* number of logical data link */ 2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t 2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi num_data_link_connection; /* number of established data link connection */ 2356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* these two thresholds (number of tx UI PDU) are dynamically adjusted based 2376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi * on number of logical links */ 2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t 2396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ll_tx_congest_start; /* congest start threshold for each logical link*/ 2406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t ll_tx_congest_end; /* congest end threshold for each logical link */ 2416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t total_tx_ui_pdu; /* total number of tx UI PDU in all of ui_xmit_q*/ 2436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t total_tx_i_pdu; /* total number of tx I PDU in all of i_xmit_q */ 2446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool overall_tx_congested; /* TRUE if tx link is congested */ 2456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* start point of uncongested status notification is in round robin */ 2476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t ll_tx_uncongest_ntf_start_sap; /* next start of logical data link */ 2486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t 2496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi dl_tx_uncongest_ntf_start_idx; /* next start of data link connection */ 2506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* 2526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ** when overall rx link congestion starts, RNR is sent to remote end point 2536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ** of data link connection while rx link is congested, UI PDU is discarded. 2546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi */ 2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t num_rx_buff; /* reserved number of rx UI/I PDU in queue */ 2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t 2576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi overall_rx_congest_start; /* threshold of overall rx congestion start */ 2586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t overall_rx_congest_end; /* threshold of overall rx congestion end */ 2596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t max_num_ll_rx_buff; /* max number of rx UI PDU in queue */ 2606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi /* 2626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ** threshold (number of rx UI PDU) is dynamically adjusted based on number 2636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ** of logical links when number of rx UI PDU is more than 2646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi ** ll_rx_congest_start, the oldest UI PDU is discarded 2656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi */ 2666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t ll_rx_congest_start; /* rx congest start threshold for each logical 2676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi link */ 2686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi 2696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t total_rx_ui_pdu; /* total number of rx UI PDU in all of ui_rx_q */ 2706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t total_rx_i_pdu; /* total number of rx I PDU in all of i_rx_q */ 2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi bool overall_rx_congested; /* TRUE if overall rx link is congested */ 272d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna tLLCP_DTA_CBACK* p_dta_cback; /* callback to notify DTA when respoding SNL */ 273d7852c900bb5cd0139708fc22bf60fbb5303830aLove Khanna bool dta_snl_resp; /* TRUE if need to notify DTA when respoding SNL*/ 274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} tLLCP_CB; 275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (LLCP_TEST_INCLUDED == TRUE) /* this is for LLCP testing */ 277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projecttypedef struct { 2796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t version; 2806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t wks; 281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} tLLCP_TEST_PARAMS; 282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* 286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** LLCP global data 287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*/ 288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern tLLCP_CB llcp_cb; 290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* 292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Functions provided by llcp_main.c 293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*/ 2946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_init(void); 2956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_cleanup(void); 2966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_process_timeout(TIMER_LIST_ENT* p_tle); 297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* 299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Functions provided by llcp_link.c 300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*/ 3016fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS llcp_link_activate(tLLCP_ACTIVATE_CONFIG* p_config); 3026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_link_process_link_timeout(void); 3036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_link_deactivate(uint8_t reason); 304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 3056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_link_check_send_data(void); 3066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_link_connection_cback(uint8_t conn_id, tNFC_CONN_EVT event, 3076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tNFC_CONN* p_data); 308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* 310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Functions provided by llcp_util.c 311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*/ 3126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_util_adjust_ll_congestion(void); 3136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_util_adjust_dl_rx_congestion(void); 3146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_util_check_rx_congested_status(void); 3156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool llcp_util_parse_link_params(uint16_t length, uint8_t* p_bytes); 3166fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS llcp_util_send_ui(uint8_t ssap, uint8_t dsap, 3176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tLLCP_APP_CB* p_app_cb, NFC_HDR* p_msg); 3186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_util_send_disc(uint8_t dsap, uint8_t ssap); 3196fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_DLCB* llcp_util_allocate_data_link(uint8_t reg_sap, uint8_t remote_sap); 3206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_util_deallocate_data_link(tLLCP_DLCB* p_dlcb); 3216fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS llcp_util_send_connect(tLLCP_DLCB* p_dlcb, 3226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tLLCP_CONNECTION_PARAMS* p_params); 3236fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS llcp_util_parse_connect(uint8_t* p_bytes, uint16_t length, 3246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tLLCP_CONNECTION_PARAMS* p_params); 3256fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS llcp_util_send_cc(tLLCP_DLCB* p_dlcb, 3266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi tLLCP_CONNECTION_PARAMS* p_params); 3276fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS llcp_util_parse_cc(uint8_t* p_bytes, uint16_t length, 3286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t* p_miu, uint8_t* p_rw); 3296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_util_send_dm(uint8_t dsap, uint8_t ssap, uint8_t reason); 3306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_util_build_info_pdu(tLLCP_DLCB* p_dlcb, NFC_HDR* p_msg); 3316fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS llcp_util_send_frmr(tLLCP_DLCB* p_dlcb, uint8_t flags, 3326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t ptype, uint8_t sequence); 3336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_util_send_rr_rnr(tLLCP_DLCB* p_dlcb); 3346fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_APP_CB* llcp_util_get_app_cb(uint8_t sap); 335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* 336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Functions provided by llcp_dlc.c 337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*/ 3386fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS llcp_dlsm_execute(tLLCP_DLCB* p_dlcb, tLLCP_DLC_EVENT event, 3396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi void* p_data); 3406fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_DLCB* llcp_dlc_find_dlcb_by_sap(uint8_t local_sap, uint8_t remote_sap); 3416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_dlc_flush_q(tLLCP_DLCB* p_dlcb); 3426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_dlc_proc_i_pdu(uint8_t dsap, uint8_t ssap, uint16_t i_pdu_length, 3436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint8_t* p_i_pdu, NFC_HDR* p_msg); 3446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_dlc_proc_rx_pdu(uint8_t dsap, uint8_t ptype, uint8_t ssap, 3456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi uint16_t length, uint8_t* p_data); 3466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_dlc_check_to_send_rr_rnr(void); 3476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoibool llcp_dlc_is_rw_open(tLLCP_DLCB* p_dlcb); 3486fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoiNFC_HDR* llcp_dlc_get_next_pdu(tLLCP_DLCB* p_dlcb); 3496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint16_t llcp_dlc_get_next_pdu_length(tLLCP_DLCB* p_dlcb); 350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* 352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Functions provided by llcp_sdp.c 353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*/ 3546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_sdp_proc_data(tLLCP_SAP_CBACK_DATA* p_data); 3556fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS llcp_sdp_send_sdreq(uint8_t tid, char* p_name); 3566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint8_t llcp_sdp_get_sap_by_name(char* p_name, uint8_t length); 3576fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoitLLCP_STATUS llcp_sdp_proc_snl(uint16_t sdu_length, uint8_t* p); 3586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_sdp_check_send_snl(void); 3596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid llcp_sdp_proc_deactivation(void); 360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 361