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