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