Home | History | Annotate | Download | only in int
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2010-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  This file contains LLCP internal definitions
     22  *
     23  ******************************************************************************/
     24 #ifndef LLCP_INT_H
     25 #define LLCP_INT_H
     26 
     27 #include "llcp_api.h"
     28 #include "nfc_api.h"
     29 
     30 /*
     31 ** LLCP link states
     32 */
     33 enum
     34 {
     35     LLCP_LINK_STATE_DEACTIVATED,                /* llcp link is deactivated     */
     36     LLCP_LINK_STATE_ACTIVATED,                  /* llcp link has been activated */
     37     LLCP_LINK_STATE_DEACTIVATING                /* llcp link is deactivating    */
     38 };
     39 typedef UINT8 tLLCP_LINK_STATE;
     40 
     41 /*
     42 ** LLCP Symmetric state
     43 */
     44 
     45 #define LLCP_LINK_SYMM_LOCAL_XMIT_NEXT   0
     46 #define LLCP_LINK_SYMM_REMOTE_XMIT_NEXT  1
     47 
     48 /*
     49 ** LLCP link control block
     50 */
     51 typedef struct
     52 {
     53     tLLCP_LINK_STATE    link_state;             /* llcp link state                              */
     54     tLLCP_LINK_CBACK   *p_link_cback;           /* callback function to report llcp link status */
     55     UINT16              wks;                    /* well-known service bit-map                   */
     56 
     57     BOOLEAN             is_initiator;           /* TRUE if initiator role                       */
     58     BOOLEAN             is_sending_data;        /* TRUE if llcp_link_check_send_data() is excuting    */
     59     UINT8               agreed_major_version;   /* llcp major version used in activated state   */
     60     UINT8               agreed_minor_version;   /* llcp minor version used in activated state   */
     61 
     62     UINT8               peer_version;           /* llcp version of peer device                  */
     63     UINT16              peer_miu;               /* link MIU of peer device                      */
     64     UINT16              peer_wks;               /* WKS of peer device                           */
     65     UINT16              peer_lto;               /* link timeout of peer device in ms            */
     66     UINT8               peer_opt;               /* Option field of peer device                  */
     67     UINT16              effective_miu;          /* MIU to send PDU in activated state           */
     68 
     69     TIMER_LIST_ENT      timer;                  /* link timer for LTO and SYMM response         */
     70     UINT8               symm_state;             /* state of symmectric procedure                */
     71     BOOLEAN             ll_served;              /* TRUE if last transmisstion was for UI        */
     72     UINT8               ll_idx;                 /* for scheduler of logical link connection     */
     73     UINT8               dl_idx;                 /* for scheduler of data link connection        */
     74 
     75     TIMER_LIST_ENT      inact_timer;            /* inactivity timer                             */
     76     UINT16              inact_timeout;          /* inactivity timeout in ms                     */
     77 
     78     UINT8               link_deact_reason;      /* reason of LLCP link deactivated              */
     79 
     80     BUFFER_Q            sig_xmit_q;             /* tx signaling PDU queue                       */
     81 
     82     /* runtime configuration parameters */
     83     UINT16              local_link_miu;         /* Maximum Information Unit                     */
     84     UINT8               local_opt;              /* Option parameter                             */
     85     UINT8               local_wt;               /* Response Waiting Time Index                  */
     86     UINT16              local_lto;              /* Local Link Timeout                           */
     87     UINT16              inact_timeout_init;     /* Inactivity Timeout as initiator role         */
     88     UINT16              inact_timeout_target;   /* Inactivity Timeout as target role            */
     89     UINT16              symm_delay;             /* Delay SYMM response                          */
     90     UINT16              data_link_timeout;      /* data link conneciton timeout                 */
     91     UINT16              delay_first_pdu_timeout;/* delay timeout to send first PDU as initiator */
     92 
     93 } tLLCP_LCB;
     94 
     95 /*
     96 ** LLCP Application's registration control block on service access point (SAP)
     97 */
     98 
     99 typedef struct
    100 {
    101     UINT8               link_type;              /* logical link and/or data link                */
    102     UINT8               *p_service_name;        /* GKI buffer containing service name           */
    103     tLLCP_APP_CBACK     *p_app_cback;           /* application's callback pointer               */
    104 
    105     BUFFER_Q            ui_xmit_q;              /* UI PDU queue for transmitting                */
    106     BUFFER_Q            ui_rx_q;                /* UI PDU queue for receiving                   */
    107     BOOLEAN             is_ui_tx_congested;     /* TRUE if transmitting UI PDU is congested     */
    108 
    109 } tLLCP_APP_CB;
    110 
    111 /*
    112 ** LLCP data link connection states
    113 */
    114 enum
    115 {
    116     LLCP_DLC_STATE_IDLE,            /* initial state                                    */
    117     LLCP_DLC_STATE_W4_REMOTE_RESP,  /* waiting for connection confirm from peer         */
    118     LLCP_DLC_STATE_W4_LOCAL_RESP,   /* waiting for connection confirm from upper layer  */
    119     LLCP_DLC_STATE_CONNECTED,       /* data link connection has been established        */
    120     LLCP_DLC_STATE_W4_REMOTE_DM,    /* waiting for disconnection confirm from peer      */
    121     LLCP_DLC_STATE_MAX
    122 };
    123 typedef UINT8 tLLCP_DLC_STATE;
    124 
    125 /*
    126 ** LLCP data link connection events
    127 */
    128 enum
    129 {
    130     LLCP_DLC_EVENT_API_CONNECT_REQ,      /* connection request from upper layer  */
    131     LLCP_DLC_EVENT_API_CONNECT_CFM,      /* connection confirm from upper layer  */
    132     LLCP_DLC_EVENT_API_CONNECT_REJECT,   /* connection reject from upper layer   */
    133     LLCP_DLC_EVENT_PEER_CONNECT_IND,     /* connection request from peer         */
    134     LLCP_DLC_EVENT_PEER_CONNECT_CFM,     /* connection confirm from peer         */
    135 
    136     LLCP_DLC_EVENT_API_DATA_REQ,         /* data packet from upper layer         */
    137     LLCP_DLC_EVENT_PEER_DATA_IND,        /* data packet from peer                */
    138 
    139     LLCP_DLC_EVENT_API_DISCONNECT_REQ,   /* disconnect request from upper layer  */
    140     LLCP_DLC_EVENT_PEER_DISCONNECT_IND,  /* disconnect request from peer         */
    141     LLCP_DLC_EVENT_PEER_DISCONNECT_RESP, /* disconnect response from peer        */
    142 
    143     LLCP_DLC_EVENT_FRAME_ERROR,          /* received erroneous frame from peer   */
    144     LLCP_DLC_EVENT_LINK_ERROR,           /* llcp link has been deactivated       */
    145 
    146     LLCP_DLC_EVENT_TIMEOUT               /* timeout event                        */
    147 };
    148 typedef UINT8 tLLCP_DLC_EVENT;
    149 
    150 /*
    151 ** LLCP data link connection control block
    152 */
    153 
    154 #define LLCP_DATA_LINK_FLAG_PENDING_DISC     0x01 /* send DISC when tx queue is empty       */
    155 #define LLCP_DATA_LINK_FLAG_PENDING_RR_RNR   0x02 /* send RR/RNR with valid sequence        */
    156 #define LLCP_DATA_LINK_FLAG_NOTIFY_TX_DONE   0x04 /* notify upper later when tx complete    */
    157 
    158 
    159 typedef struct
    160 {
    161     tLLCP_DLC_STATE         state;              /* data link connection state               */
    162     UINT8                   flags;              /* specific action flags                    */
    163     tLLCP_APP_CB            *p_app_cb;          /* pointer of application registration      */
    164     TIMER_LIST_ENT          timer;              /* timer for connection complete            */
    165 
    166     UINT8                   local_sap;          /* SAP of local end point                   */
    167     UINT16                  local_miu;          /* MIU of local SAP                         */
    168     UINT8                   local_rw;           /* RW of local SAP                          */
    169     BOOLEAN                 local_busy;         /* TRUE if local SAP is busy                */
    170 
    171     UINT8                   remote_sap;         /* SAP of remote end point                  */
    172     UINT16                  remote_miu;         /* MIU of remote SAP                        */
    173     UINT8                   remote_rw;          /* RW of remote SAP                         */
    174     BOOLEAN                 remote_busy;        /* TRUE if remote SAP is busy               */
    175 
    176     UINT8                   next_tx_seq;        /* V(S), send state variable                */
    177     UINT8                   rcvd_ack_seq;       /* V(SA), send ack state variable           */
    178     UINT8                   next_rx_seq;        /* V(R), receive state variable             */
    179     UINT8                   sent_ack_seq;       /* V(RA), receive ack state variable        */
    180 
    181     BUFFER_Q                i_xmit_q;           /* tx queue of I PDU                        */
    182     BOOLEAN                 is_tx_congested;    /* TRUE if tx I PDU is congested            */
    183 
    184     BUFFER_Q                i_rx_q;             /* rx queue of I PDU                        */
    185     BOOLEAN                 is_rx_congested;    /* TRUE if rx I PDU is congested            */
    186     UINT8                   num_rx_i_pdu;       /* number of I PDU in rx queue              */
    187     UINT8                   rx_congest_threshold; /* dynamic congest threshold for rx I PDU */
    188 
    189 } tLLCP_DLCB;
    190 
    191 /*
    192 ** LLCP service discovery control block
    193 */
    194 
    195 typedef struct
    196 {
    197     UINT8           tid;        /* transaction ID                           */
    198     tLLCP_SDP_CBACK *p_cback;   /* callback function for service discovery  */
    199 } tLLCP_SDP_TRANSAC;
    200 
    201 typedef struct
    202 {
    203     UINT8               next_tid;                       /* next TID to use         */
    204     tLLCP_SDP_TRANSAC   transac[LLCP_MAX_SDP_TRANSAC];  /* active SDP transactions */
    205     BT_HDR              *p_snl;                         /* buffer for SNL PDU      */
    206 } tLLCP_SDP_CB;
    207 
    208 
    209 /*
    210 ** LLCP control block
    211 */
    212 
    213 typedef struct
    214 {
    215     UINT8           trace_level;                    /* LLCP trace level                             */
    216 
    217     tLLCP_SDP_CB    sdp_cb;                         /* SDP control block                            */
    218     tLLCP_LCB       lcb;                            /* LLCP link control block                      */
    219     tLLCP_APP_CB    wks_cb[LLCP_MAX_WKS];           /* Application's registration for well-known services */
    220     tLLCP_APP_CB    server_cb[LLCP_MAX_SERVER];     /* Application's registration for SDP services  */
    221     tLLCP_APP_CB    client_cb[LLCP_MAX_CLIENT];     /* Application's registration for client        */
    222     tLLCP_DLCB      dlcb[LLCP_MAX_DATA_LINK];       /* Data link connection control block           */
    223 
    224     UINT8           max_num_ll_tx_buff;             /* max number of tx UI PDU in queue             */
    225     UINT8           max_num_tx_buff;                /* max number of tx UI/I PDU in queue           */
    226 
    227     UINT8           num_logical_data_link;          /* number of logical data link                  */
    228     UINT8           num_data_link_connection;       /* number of established data link connection   */
    229 
    230     /* these two thresholds (number of tx UI PDU) are dynamically adjusted based on number of logical links */
    231     UINT8           ll_tx_congest_start;            /* congest start threshold for each logical link*/
    232     UINT8           ll_tx_congest_end;              /* congest end threshold for each logical link  */
    233 
    234     UINT8           total_tx_ui_pdu;                /* total number of tx UI PDU in all of ui_xmit_q*/
    235     UINT8           total_tx_i_pdu;                 /* total number of tx I PDU in all of i_xmit_q  */
    236     BOOLEAN         overall_tx_congested;           /* TRUE if tx link is congested                 */
    237 
    238     /* start point of uncongested status notification is in round robin */
    239     UINT8           ll_tx_uncongest_ntf_start_sap;  /* next start of logical data link              */
    240     UINT8           dl_tx_uncongest_ntf_start_idx;  /* next start of data link connection           */
    241 
    242     /*
    243     ** when overall rx link congestion starts, RNR is sent to remote end point of data link connection
    244     ** while rx link is congested, UI PDU is discarded.
    245     */
    246     UINT8           num_rx_buff;                    /* reserved number of rx UI/I PDU in queue      */
    247     UINT8           overall_rx_congest_start;       /* threshold of overall rx congestion start     */
    248     UINT8           overall_rx_congest_end;         /* threshold of overall rx congestion end       */
    249     UINT8           max_num_ll_rx_buff;             /* max number of rx UI PDU in queue             */
    250 
    251     /*
    252     ** threshold (number of rx UI PDU) is dynamically adjusted based on number of logical links
    253     ** when number of rx UI PDU is more than ll_rx_congest_start, the oldest UI PDU is discarded
    254     */
    255     UINT8           ll_rx_congest_start;            /* rx congest start threshold for each logical link */
    256 
    257     UINT8           total_rx_ui_pdu;                /* total number of rx UI PDU in all of ui_rx_q  */
    258     UINT8           total_rx_i_pdu;                 /* total number of rx I PDU in all of i_rx_q    */
    259     BOOLEAN         overall_rx_congested;           /* TRUE if overall rx link is congested         */
    260 
    261     tLLCP_DTA_CBACK *p_dta_cback;                   /* callback to notify DTA when respoding SNL    */
    262     BOOLEAN         dta_snl_resp;                   /* TRUE if need to notify DTA when respoding SNL*/
    263 } tLLCP_CB;
    264 
    265 #if (LLCP_TEST_INCLUDED == TRUE) /* this is for LLCP testing */
    266 
    267 typedef struct {
    268     UINT8  version;
    269     UINT16 wks;
    270 } tLLCP_TEST_PARAMS;
    271 
    272 #endif
    273 
    274 #ifdef __cplusplus
    275 extern "C" {
    276 #endif
    277 
    278 
    279 /*
    280 ** LLCP global data
    281 */
    282 
    283 #if (!defined LLCP_DYNAMIC_MEMORY) || (LLCP_DYNAMIC_MEMORY == FALSE)
    284 LLCP_API extern tLLCP_CB  llcp_cb;
    285 #else
    286 LLCP_API extern tLLCP_CB *llcp_cb_ptr;
    287 #define llcp_cb (*llcp_cb_ptr)
    288 #endif
    289 
    290 /*
    291 ** Functions provided by llcp_main.c
    292 */
    293 void llcp_init (void);
    294 void llcp_cleanup (void);
    295 void llcp_process_timeout (TIMER_LIST_ENT *p_tle);
    296 
    297 /*
    298 ** Functions provided by llcp_link.c
    299 */
    300 tLLCP_STATUS llcp_link_activate (tLLCP_ACTIVATE_CONFIG *p_config);
    301 void llcp_link_process_link_timeout (void);
    302 void llcp_link_deactivate (UINT8 reason);
    303 
    304 void llcp_link_check_send_data (void);
    305 void llcp_link_connection_cback (UINT8 conn_id, tNFC_CONN_EVT event, tNFC_CONN *p_data);
    306 
    307 /*
    308 **  Functions provided by llcp_util.c
    309 */
    310 void         llcp_util_adjust_ll_congestion (void);
    311 void         llcp_util_adjust_dl_rx_congestion (void);
    312 void         llcp_util_check_rx_congested_status (void);
    313 BOOLEAN      llcp_util_parse_link_params (UINT16 length, UINT8 *p_bytes);
    314 tLLCP_STATUS llcp_util_send_ui (UINT8 ssap, UINT8 dsap, tLLCP_APP_CB *p_app_cb, BT_HDR *p_msg);
    315 void         llcp_util_send_disc (UINT8 dsap, UINT8 ssap);
    316 tLLCP_DLCB  *llcp_util_allocate_data_link (UINT8 reg_sap, UINT8 remote_sap);
    317 void         llcp_util_deallocate_data_link (tLLCP_DLCB *p_dlcb);
    318 tLLCP_STATUS llcp_util_send_connect (tLLCP_DLCB *p_dlcb, tLLCP_CONNECTION_PARAMS *p_params);
    319 tLLCP_STATUS llcp_util_parse_connect (UINT8 *p_bytes, UINT16 length, tLLCP_CONNECTION_PARAMS *p_params);
    320 tLLCP_STATUS llcp_util_send_cc (tLLCP_DLCB *p_dlcb, tLLCP_CONNECTION_PARAMS *p_params);
    321 tLLCP_STATUS llcp_util_parse_cc (UINT8 *p_bytes, UINT16 length, UINT16 *p_miu, UINT8 *p_rw);
    322 void         llcp_util_send_dm (UINT8 dsap, UINT8 ssap, UINT8 reason);
    323 void         llcp_util_build_info_pdu (tLLCP_DLCB *p_dlcb, BT_HDR *p_msg);
    324 tLLCP_STATUS llcp_util_send_frmr (tLLCP_DLCB *p_dlcb, UINT8 flags, UINT8 ptype, UINT8 sequence);
    325 void         llcp_util_send_rr_rnr (tLLCP_DLCB *p_dlcb);
    326 tLLCP_APP_CB *llcp_util_get_app_cb (UINT8 sap);
    327 /*
    328 ** Functions provided by llcp_dlc.c
    329 */
    330 tLLCP_STATUS llcp_dlsm_execute (tLLCP_DLCB *p_dlcb, tLLCP_DLC_EVENT event, void *p_data);
    331 tLLCP_DLCB  *llcp_dlc_find_dlcb_by_sap (UINT8 local_sap, UINT8 remote_sap);
    332 void         llcp_dlc_flush_q (tLLCP_DLCB *p_dlcb);
    333 void         llcp_dlc_proc_i_pdu (UINT8 dsap, UINT8 ssap, UINT16 i_pdu_length, UINT8 *p_i_pdu, BT_HDR *p_msg);
    334 void         llcp_dlc_proc_rx_pdu (UINT8 dsap, UINT8 ptype, UINT8 ssap, UINT16 length, UINT8 *p_data);
    335 void         llcp_dlc_check_to_send_rr_rnr (void);
    336 BOOLEAN      llcp_dlc_is_rw_open (tLLCP_DLCB *p_dlcb);
    337 BT_HDR      *llcp_dlc_get_next_pdu (tLLCP_DLCB *p_dlcb);
    338 UINT16       llcp_dlc_get_next_pdu_length (tLLCP_DLCB *p_dlcb);
    339 
    340 /*
    341 ** Functions provided by llcp_sdp.c
    342 */
    343 void         llcp_sdp_proc_data (tLLCP_SAP_CBACK_DATA *p_data);
    344 tLLCP_STATUS llcp_sdp_send_sdreq (UINT8 tid, char *p_name);
    345 UINT8        llcp_sdp_get_sap_by_name (char *p_name, UINT8 length);
    346 tLLCP_STATUS llcp_sdp_proc_snl (UINT16 sdu_length, UINT8 *p);
    347 void         llcp_sdp_check_send_snl (void);
    348 void         llcp_sdp_proc_deactivation (void);
    349 #ifdef __cplusplus
    350 }
    351 #endif
    352 
    353 #endif
    354