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