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 is the private interface file for the NFA P2P.
23 *
24 ******************************************************************************/
25#ifndef NFA_P2P_INT_H
26#define NFA_P2P_INT_H
27
28#if (defined (NFA_P2P_INCLUDED) && (NFA_P2P_INCLUDED==TRUE))
29#include "nfa_p2p_api.h"
30#include "nfa_dm_int.h"
31
32/*****************************************************************************
33**  Constants and data types
34*****************************************************************************/
35#define NFA_P2P_DEBUG   BT_TRACE_VERBOSE
36
37/* NFA P2P LLCP link state */
38enum
39{
40    NFA_P2P_LLCP_STATE_IDLE,
41    NFA_P2P_LLCP_STATE_LISTENING,
42    NFA_P2P_LLCP_STATE_ACTIVATED,
43
44    NFA_P2P_LLCP_STATE_MAX
45};
46
47typedef UINT8 tNFA_P2P_LLCP_STATE;
48
49/* NFA P2P events */
50enum
51{
52    NFA_P2P_API_REG_SERVER_EVT  = NFA_SYS_EVT_START (NFA_ID_P2P),
53    NFA_P2P_API_REG_CLIENT_EVT,
54    NFA_P2P_API_DEREG_EVT,
55    NFA_P2P_API_ACCEPT_CONN_EVT,
56    NFA_P2P_API_REJECT_CONN_EVT,
57    NFA_P2P_API_DISCONNECT_EVT,
58    NFA_P2P_API_CONNECT_EVT,
59    NFA_P2P_API_SEND_UI_EVT,
60    NFA_P2P_API_SEND_DATA_EVT,
61    NFA_P2P_API_SET_LOCAL_BUSY_EVT,
62    NFA_P2P_API_GET_LINK_INFO_EVT,
63    NFA_P2P_API_GET_REMOTE_SAP_EVT,
64    NFA_P2P_API_SET_LLCP_CFG_EVT,
65    NFA_P2P_INT_RESTART_RF_DISC_EVT,
66
67    NFA_P2P_LAST_EVT
68};
69
70/* data type for NFA_P2P_API_REG_SERVER_EVT */
71typedef struct
72{
73    BT_HDR              hdr;
74    UINT8               server_sap;
75    tNFA_P2P_LINK_TYPE  link_type;
76    char                service_name[LLCP_MAX_SN_LEN + 1];
77    tNFA_P2P_CBACK     *p_cback;
78} tNFA_P2P_API_REG_SERVER;
79
80/* data type for NFA_P2P_API_REG_CLIENT_EVT */
81typedef struct
82{
83    BT_HDR              hdr;
84    tNFA_P2P_LINK_TYPE  link_type;
85    tNFA_P2P_CBACK     *p_cback;
86} tNFA_P2P_API_REG_CLIENT;
87
88/* data type for NFA_P2P_API_DEREG_EVT */
89typedef struct
90{
91    BT_HDR              hdr;
92    tNFA_HANDLE         handle;
93} tNFA_P2P_API_DEREG;
94
95/* data type for NFA_P2P_API_ACCEPT_CONN_EVT */
96typedef struct
97{
98    BT_HDR              hdr;
99    tNFA_HANDLE         conn_handle;
100    UINT16              miu;
101    UINT8               rw;
102} tNFA_P2P_API_ACCEPT_CONN;
103
104/* data type for NFA_P2P_API_REJECT_CONN_EVT */
105typedef struct
106{
107    BT_HDR              hdr;
108    tNFA_HANDLE         conn_handle;
109} tNFA_P2P_API_REJECT_CONN;
110
111/* data type for NFA_P2P_API_DISCONNECT_EVT */
112typedef struct
113{
114    BT_HDR              hdr;
115    tNFA_HANDLE         conn_handle;
116    BOOLEAN             flush;
117} tNFA_P2P_API_DISCONNECT;
118
119/* data type for NFA_P2P_API_CONNECT_EVT */
120typedef struct
121{
122    BT_HDR              hdr;
123    tNFA_HANDLE         client_handle;
124    char                service_name[LLCP_MAX_SN_LEN + 1];
125    UINT8               dsap;
126    UINT16              miu;
127    UINT8               rw;
128} tNFA_P2P_API_CONNECT;
129
130/* data type for NFA_P2P_API_SEND_UI_EVT */
131typedef struct
132{
133    BT_HDR              hdr;
134    tNFA_HANDLE         handle;
135    UINT8               dsap;
136    BT_HDR             *p_msg;
137} tNFA_P2P_API_SEND_UI;
138
139/* data type for NFA_P2P_API_SEND_DATA_EVT */
140typedef struct
141{
142    BT_HDR              hdr;
143    tNFA_HANDLE         conn_handle;
144    BT_HDR             *p_msg;
145} tNFA_P2P_API_SEND_DATA;
146
147/* data type for NFA_P2P_API_SET_LOCAL_BUSY_EVT */
148typedef struct
149{
150    BT_HDR              hdr;
151    tNFA_HANDLE         conn_handle;
152    BOOLEAN             is_busy;
153} tNFA_P2P_API_SET_LOCAL_BUSY;
154
155/* data type for NFA_P2P_API_GET_LINK_INFO_EVT */
156typedef struct
157{
158    BT_HDR              hdr;
159    tNFA_HANDLE         handle;
160} tNFA_P2P_API_GET_LINK_INFO;
161
162/* data type for NFA_P2P_API_GET_REMOTE_SAP_EVT */
163typedef struct
164{
165    BT_HDR              hdr;
166    tNFA_HANDLE         handle;
167    char                service_name[LLCP_MAX_SN_LEN + 1];
168} tNFA_P2P_API_GET_REMOTE_SAP;
169
170/* data type for NFA_P2P_API_SET_LLCP_CFG_EVT */
171typedef struct
172{
173    BT_HDR              hdr;
174    UINT16              link_miu;
175    UINT8               opt;
176    UINT8               wt;
177    UINT16              link_timeout;
178    UINT16              inact_timeout_init;
179    UINT16              inact_timeout_target;
180    UINT16              symm_delay;
181    UINT16              data_link_timeout;
182    UINT16              delay_first_pdu_timeout;
183} tNFA_P2P_API_SET_LLCP_CFG;
184
185/* union of all event data types */
186typedef union
187{
188    BT_HDR                      hdr;
189    tNFA_P2P_API_REG_SERVER     api_reg_server;
190    tNFA_P2P_API_REG_CLIENT     api_reg_client;
191    tNFA_P2P_API_DEREG          api_dereg;
192    tNFA_P2P_API_ACCEPT_CONN    api_accept;
193    tNFA_P2P_API_REJECT_CONN    api_reject;
194    tNFA_P2P_API_DISCONNECT     api_disconnect;
195    tNFA_P2P_API_CONNECT        api_connect;
196    tNFA_P2P_API_SEND_UI        api_send_ui;
197    tNFA_P2P_API_SEND_DATA      api_send_data;
198    tNFA_P2P_API_SET_LOCAL_BUSY api_local_busy;
199    tNFA_P2P_API_GET_LINK_INFO  api_link_info;
200    tNFA_P2P_API_GET_REMOTE_SAP api_remote_sap;
201    tNFA_P2P_API_SET_LLCP_CFG   api_set_llcp_cfg;
202} tNFA_P2P_MSG;
203
204/*****************************************************************************
205**  control block
206*****************************************************************************/
207#define NFA_P2P_HANDLE_FLAG_CONN             0x80   /* Bit flag for connection handle           */
208
209/* NFA P2P Connection block */
210#define NFA_P2P_CONN_FLAG_IN_USE             0x01   /* Connection control block is used         */
211#define NFA_P2P_CONN_FLAG_REMOTE_RW_ZERO     0x02   /* Remote set RW to 0 (flow off)            */
212#define NFA_P2P_CONN_FLAG_CONGESTED          0x04   /* data link connection is congested        */
213
214typedef struct
215{
216    UINT8               flags;                      /* internal flags for data link connection  */
217    UINT8               local_sap;                  /* local SAP of data link connection        */
218    UINT8               remote_sap;                 /* remote SAP of data link connection       */
219    UINT16              remote_miu;                 /* MIU of remote end point                  */
220    UINT8               num_pending_i_pdu;          /* number of tx I PDU not processed by NFA  */
221} tNFA_P2P_CONN_CB;
222
223/* NFA P2P SAP control block */
224#define NFA_P2P_SAP_FLAG_SERVER             0x01    /* registered server                        */
225#define NFA_P2P_SAP_FLAG_CLIENT             0x02    /* registered client                        */
226#define NFA_P2P_SAP_FLAG_LLINK_CONGESTED    0x04    /* logical link connection is congested     */
227
228typedef struct
229{
230    UINT8              flags;                       /* internal flags for local SAP             */
231    tNFA_P2P_CBACK     *p_cback;                    /* callback function for local SAP          */
232    UINT8              num_pending_ui_pdu;          /* number of tx UI PDU not processed by NFA */
233} tNFA_P2P_SAP_CB;
234
235/* NFA P2P SDP control block */
236typedef struct
237{
238    UINT8            tid;                           /* transaction ID */
239    UINT8            local_sap;
240} tNFA_P2P_SDP_CB;
241
242#define NFA_P2P_NUM_SAP         64
243
244/* NFA P2P control block */
245typedef struct
246{
247    tNFA_HANDLE         dm_disc_handle;
248
249    tNFA_DM_RF_DISC_STATE rf_disc_state;
250    tNFA_P2P_LLCP_STATE llcp_state;
251    BOOLEAN             is_initiator;
252    BOOLEAN             is_active_mode;
253    UINT16              local_link_miu;
254    UINT16              remote_link_miu;
255
256    tNFA_TECHNOLOGY_MASK listen_tech_mask;          /* for P2P listening */
257    tNFA_TECHNOLOGY_MASK listen_tech_mask_to_restore;/* to retry without active listen mode */
258    TIMER_LIST_ENT      active_listen_restore_timer; /* timer to restore active listen mode */
259    BOOLEAN             is_p2p_listening;
260    BOOLEAN             is_cho_listening;
261    BOOLEAN             is_snep_listening;
262
263    tNFA_P2P_SAP_CB     sap_cb[NFA_P2P_NUM_SAP];
264    tNFA_P2P_CONN_CB    conn_cb[LLCP_MAX_DATA_LINK];
265    tNFA_P2P_SDP_CB     sdp_cb[LLCP_MAX_SDP_TRANSAC];
266
267    UINT8               total_pending_ui_pdu;       /* total number of tx UI PDU not processed by NFA */
268    UINT8               total_pending_i_pdu;        /* total number of tx I PDU not processed by NFA */
269
270    UINT8               trace_level;
271} tNFA_P2P_CB;
272
273/*****************************************************************************
274**  External variables
275*****************************************************************************/
276
277/* NFA P2P control block */
278#if NFA_DYNAMIC_MEMORY == FALSE
279extern tNFA_P2P_CB nfa_p2p_cb;
280#else
281extern tNFA_P2P_CB *nfa_p2p_cb_ptr;
282#define nfa_p2p_cb (*nfa_p2p_cb_ptr)
283#endif
284
285/*****************************************************************************
286**  External functions
287*****************************************************************************/
288/*
289**  nfa_p2p_main.c
290*/
291void nfa_p2p_init (void);
292void nfa_p2p_update_listen_tech (tNFA_TECHNOLOGY_MASK tech_mask);
293void nfa_p2p_enable_listening (tNFA_SYS_ID sys_id, BOOLEAN update_wks);
294void nfa_p2p_disable_listening (tNFA_SYS_ID sys_id, BOOLEAN update_wks);
295void nfa_p2p_activate_llcp (tNFC_DISCOVER *p_data);
296void nfa_p2p_deactivate_llcp (void);
297void nfa_p2p_set_config (tNFA_DM_DISC_TECH_PROTO_MASK disc_mask);
298
299/*
300**  nfa_p2p_act.c
301*/
302void nfa_p2p_proc_llcp_data_ind (tLLCP_SAP_CBACK_DATA  *p_data);
303void nfa_p2p_proc_llcp_connect_ind (tLLCP_SAP_CBACK_DATA  *p_data);
304void nfa_p2p_proc_llcp_connect_resp (tLLCP_SAP_CBACK_DATA  *p_data);
305void nfa_p2p_proc_llcp_disconnect_ind (tLLCP_SAP_CBACK_DATA  *p_data);
306void nfa_p2p_proc_llcp_disconnect_resp (tLLCP_SAP_CBACK_DATA  *p_data);
307void nfa_p2p_proc_llcp_congestion (tLLCP_SAP_CBACK_DATA  *p_data);
308void nfa_p2p_proc_llcp_link_status (tLLCP_SAP_CBACK_DATA  *p_data);
309
310BOOLEAN nfa_p2p_start_sdp (char *p_service_name, UINT8 local_sap);
311
312BOOLEAN nfa_p2p_reg_server (tNFA_P2P_MSG *p_msg);
313BOOLEAN nfa_p2p_reg_client (tNFA_P2P_MSG *p_msg);
314BOOLEAN nfa_p2p_dereg (tNFA_P2P_MSG *p_msg);
315BOOLEAN nfa_p2p_accept_connection (tNFA_P2P_MSG *p_msg);
316BOOLEAN nfa_p2p_reject_connection (tNFA_P2P_MSG *p_msg);
317BOOLEAN nfa_p2p_disconnect (tNFA_P2P_MSG *p_msg);
318BOOLEAN nfa_p2p_create_data_link_connection (tNFA_P2P_MSG *p_msg);
319BOOLEAN nfa_p2p_send_ui (tNFA_P2P_MSG *p_msg);
320BOOLEAN nfa_p2p_send_data (tNFA_P2P_MSG *p_msg);
321BOOLEAN nfa_p2p_set_local_busy (tNFA_P2P_MSG *p_msg);
322BOOLEAN nfa_p2p_get_link_info (tNFA_P2P_MSG *p_msg);
323BOOLEAN nfa_p2p_get_remote_sap (tNFA_P2P_MSG *p_msg);
324BOOLEAN nfa_p2p_set_llcp_cfg (tNFA_P2P_MSG *p_msg);
325BOOLEAN nfa_p2p_restart_rf_discovery (tNFA_P2P_MSG *p_msg);
326
327#if (BT_TRACE_VERBOSE == TRUE)
328char *nfa_p2p_evt_code (UINT16 evt_code);
329#endif
330
331#else
332
333#define nfa_p2p_init ()
334#define nfa_p2p_activate_llcp (a) {};
335#define nfa_p2p_deactivate_llcp ()
336#define nfa_p2p_set_config ()
337
338#endif /* (defined (NFA_P2P_INCLUDED) && (NFA_P2P_INCLUDED==TRUE)) */
339#endif /* NFA_P2P_INT_H */
340