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 */
38 enum
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 
47 typedef UINT8 tNFA_P2P_LLCP_STATE;
48 
49 /* NFA P2P events */
50 enum
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 */
71 typedef 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 */
81 typedef 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 */
89 typedef 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 */
96 typedef 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 */
105 typedef 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 */
112 typedef 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 */
120 typedef 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 */
131 typedef 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 */
140 typedef 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 */
148 typedef 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 */
156 typedef 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 */
163 typedef 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 */
171 typedef 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 */
186 typedef 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 
214 typedef 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 
228 typedef 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 */
236 typedef 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 */
245 typedef 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
279 extern tNFA_P2P_CB nfa_p2p_cb;
280 #else
281 extern 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 */
291 void nfa_p2p_init (void);
292 void nfa_p2p_update_listen_tech (tNFA_TECHNOLOGY_MASK tech_mask);
293 void nfa_p2p_enable_listening (tNFA_SYS_ID sys_id, BOOLEAN update_wks);
294 void nfa_p2p_disable_listening (tNFA_SYS_ID sys_id, BOOLEAN update_wks);
295 void nfa_p2p_activate_llcp (tNFC_DISCOVER *p_data);
296 void nfa_p2p_deactivate_llcp (void);
297 void nfa_p2p_set_config (tNFA_DM_DISC_TECH_PROTO_MASK disc_mask);
298 
299 /*
300 **  nfa_p2p_act.c
301 */
302 void nfa_p2p_proc_llcp_data_ind (tLLCP_SAP_CBACK_DATA  *p_data);
303 void nfa_p2p_proc_llcp_connect_ind (tLLCP_SAP_CBACK_DATA  *p_data);
304 void nfa_p2p_proc_llcp_connect_resp (tLLCP_SAP_CBACK_DATA  *p_data);
305 void nfa_p2p_proc_llcp_disconnect_ind (tLLCP_SAP_CBACK_DATA  *p_data);
306 void nfa_p2p_proc_llcp_disconnect_resp (tLLCP_SAP_CBACK_DATA  *p_data);
307 void nfa_p2p_proc_llcp_congestion (tLLCP_SAP_CBACK_DATA  *p_data);
308 void nfa_p2p_proc_llcp_link_status (tLLCP_SAP_CBACK_DATA  *p_data);
309 
310 BOOLEAN nfa_p2p_start_sdp (char *p_service_name, UINT8 local_sap);
311 
312 BOOLEAN nfa_p2p_reg_server (tNFA_P2P_MSG *p_msg);
313 BOOLEAN nfa_p2p_reg_client (tNFA_P2P_MSG *p_msg);
314 BOOLEAN nfa_p2p_dereg (tNFA_P2P_MSG *p_msg);
315 BOOLEAN nfa_p2p_accept_connection (tNFA_P2P_MSG *p_msg);
316 BOOLEAN nfa_p2p_reject_connection (tNFA_P2P_MSG *p_msg);
317 BOOLEAN nfa_p2p_disconnect (tNFA_P2P_MSG *p_msg);
318 BOOLEAN nfa_p2p_create_data_link_connection (tNFA_P2P_MSG *p_msg);
319 BOOLEAN nfa_p2p_send_ui (tNFA_P2P_MSG *p_msg);
320 BOOLEAN nfa_p2p_send_data (tNFA_P2P_MSG *p_msg);
321 BOOLEAN nfa_p2p_set_local_busy (tNFA_P2P_MSG *p_msg);
322 BOOLEAN nfa_p2p_get_link_info (tNFA_P2P_MSG *p_msg);
323 BOOLEAN nfa_p2p_get_remote_sap (tNFA_P2P_MSG *p_msg);
324 BOOLEAN nfa_p2p_set_llcp_cfg (tNFA_P2P_MSG *p_msg);
325 BOOLEAN nfa_p2p_restart_rf_discovery (tNFA_P2P_MSG *p_msg);
326 
327 #if (BT_TRACE_VERBOSE == TRUE)
328 char *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