• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 is the main implementation file for the NFA P2P.
22  *
23  ******************************************************************************/
24 #include <string.h>
25 #include "nfc_api.h"
26 #include "nfa_sys.h"
27 #include "nfa_sys_int.h"
28 #include "nfa_dm_int.h"
29 #include "llcp_api.h"
30 #include "llcp_defs.h"
31 #include "nfa_p2p_api.h"
32 #include "nfa_p2p_int.h"
33 
34 /*****************************************************************************
35 **  Global Variables
36 *****************************************************************************/
37 
38 /* system manager control block definition */
39 #if NFA_DYNAMIC_MEMORY == FALSE
40 tNFA_P2P_CB nfa_p2p_cb;
41 #endif
42 
43 /*****************************************************************************
44 **  Static Functions
45 *****************************************************************************/
46 
47 /* event handler function type */
48 static BOOLEAN nfa_p2p_evt_hdlr (BT_HDR *p_msg);
49 
50 /* disable function type */
51 static void nfa_p2p_sys_disable (void);
52 
53 /* debug functions type */
54 #if (BT_TRACE_VERBOSE == TRUE)
55 static char *nfa_p2p_llcp_state_code (tNFA_P2P_LLCP_STATE state_code);
56 #endif
57 
58 /*****************************************************************************
59 **  Constants
60 *****************************************************************************/
61 static const tNFA_SYS_REG nfa_p2p_sys_reg =
62 {
63     NULL,
64     nfa_p2p_evt_hdlr,
65     nfa_p2p_sys_disable,
66     NULL
67 };
68 
69 #define NFA_P2P_NUM_ACTIONS  (NFA_P2P_LAST_EVT & 0x00ff)
70 
71 /* type for action functions */
72 typedef BOOLEAN (*tNFA_P2P_ACTION) (tNFA_P2P_MSG *p_data);
73 
74 /* action function list */
75 const tNFA_P2P_ACTION nfa_p2p_action[] =
76 {
77     nfa_p2p_reg_server,                     /* NFA_P2P_API_REG_SERVER_EVT       */
78     nfa_p2p_reg_client,                     /* NFA_P2P_API_REG_CLIENT_EVT       */
79     nfa_p2p_dereg,                          /* NFA_P2P_API_DEREG_EVT            */
80     nfa_p2p_accept_connection,              /* NFA_P2P_API_ACCEPT_CONN_EVT      */
81     nfa_p2p_reject_connection,              /* NFA_P2P_API_REJECT_CONN_EVT      */
82     nfa_p2p_disconnect,                     /* NFA_P2P_API_DISCONNECT_EVT       */
83     nfa_p2p_create_data_link_connection,    /* NFA_P2P_API_CONNECT_EVT          */
84     nfa_p2p_send_ui,                        /* NFA_P2P_API_SEND_UI_EVT          */
85     nfa_p2p_send_data,                      /* NFA_P2P_API_SEND_DATA_EVT        */
86     nfa_p2p_set_local_busy,                 /* NFA_P2P_API_SET_LOCAL_BUSY_EVT   */
87     nfa_p2p_get_link_info,                  /* NFA_P2P_API_GET_LINK_INFO_EVT    */
88     nfa_p2p_get_remote_sap,                 /* NFA_P2P_API_GET_REMOTE_SAP_EVT   */
89     nfa_p2p_set_llcp_cfg                    /* NFA_P2P_API_SET_LLCP_CFG_EVT     */
90 };
91 
92 /*******************************************************************************
93 **
94 ** Function         nfa_p2p_discovery_cback
95 **
96 ** Description      Processing event from discovery callback for listening
97 **
98 **
99 ** Returns          None
100 **
101 *******************************************************************************/
nfa_p2p_discovery_cback(tNFA_DM_RF_DISC_EVT event,tNFC_DISCOVER * p_data)102 void nfa_p2p_discovery_cback (tNFA_DM_RF_DISC_EVT event, tNFC_DISCOVER *p_data)
103 {
104     tNFA_CONN_EVT_DATA evt_data;
105 
106     P2P_TRACE_DEBUG1 ("nfa_p2p_discovery_cback (): event:0x%02X", event);
107 
108     switch (event)
109     {
110     case NFA_DM_RF_DISC_START_EVT:
111         if (p_data->status == NFC_STATUS_OK)
112         {
113             nfa_p2p_cb.llcp_state = NFA_P2P_LLCP_STATE_LISTENING;
114         }
115         break;
116 
117     case NFA_DM_RF_DISC_ACTIVATED_EVT:
118 
119         /* notify NFC link activation */
120         memcpy (&(evt_data.activated.activate_ntf),
121                 &(p_data->activate),
122                 sizeof (tNFC_ACTIVATE_DEVT));
123         nfa_dm_conn_cback_event_notify (NFA_ACTIVATED_EVT, &evt_data);
124 
125         if ((p_data->activate.protocol        == NFC_PROTOCOL_NFC_DEP)
126           &&(p_data->activate.intf_param.type == NFC_INTERFACE_NFC_DEP))
127         {
128             nfa_p2p_activate_llcp (p_data);
129         }
130         break;
131 
132     case NFA_DM_RF_DISC_DEACTIVATED_EVT:
133 
134         /* notify deactivation */
135         if (  (p_data->deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP)
136             ||(p_data->deactivate.type == NFC_DEACTIVATE_TYPE_SLEEP_AF)  )
137         {
138             evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_SLEEP;
139         }
140         else
141         {
142             evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE;
143         }
144         nfa_dm_conn_cback_event_notify (NFA_DEACTIVATED_EVT, &evt_data);
145         break;
146 
147     case NFA_DM_RF_DISC_CMD_IDLE_CMPL_EVT:
148         /* DH initiated deactivation in NFA_DM_RFST_LISTEN_SLEEP */
149         evt_data.deactivated.type = NFA_DEACTIVATE_TYPE_IDLE;
150         nfa_dm_conn_cback_event_notify (NFA_DEACTIVATED_EVT, &evt_data);
151         break;
152 
153     default:
154         P2P_TRACE_ERROR0 ("Unexpected event");
155         break;
156     }
157 }
158 
159 /*******************************************************************************
160 **
161 ** Function         nfa_p2p_llcp_link_cback
162 **
163 ** Description      Processing event from LLCP link management callback
164 **
165 **
166 ** Returns          None
167 **
168 *******************************************************************************/
nfa_p2p_llcp_link_cback(UINT8 event,UINT8 reason)169 void nfa_p2p_llcp_link_cback (UINT8 event, UINT8 reason)
170 {
171     tNFA_LLCP_ACTIVATED     llcp_activated;
172     tNFA_LLCP_DEACTIVATED   llcp_deactivated;
173 
174     P2P_TRACE_DEBUG1 ("nfa_p2p_llcp_link_cback () event:0x%x", event);
175 
176     if (event == LLCP_LINK_ACTIVATION_COMPLETE_EVT)
177     {
178         LLCP_GetLinkMIU (&nfa_p2p_cb.local_link_miu, &nfa_p2p_cb.remote_link_miu);
179         nfa_p2p_cb.llcp_state = NFA_P2P_LLCP_STATE_ACTIVATED;
180 
181         if (nfa_p2p_cb.is_initiator)
182         {
183             /* notify NFA DM to send Activate Event to applicaiton with status  */
184             nfa_dm_notify_activation_status (NFA_STATUS_OK, NULL);
185         }
186 
187         llcp_activated.is_initiator    = nfa_p2p_cb.is_initiator;
188         llcp_activated.local_link_miu  = nfa_p2p_cb.local_link_miu;
189         llcp_activated.remote_link_miu = nfa_p2p_cb.remote_link_miu;
190         llcp_activated.remote_lsc      = LLCP_GetRemoteLSC ();
191         llcp_activated.remote_wks      = LLCP_GetRemoteWKS ();
192 
193         nfa_dm_act_conn_cback_notify (NFA_LLCP_ACTIVATED_EVT, (tNFA_CONN_EVT_DATA *) &llcp_activated);
194 
195     }
196     else if (event == LLCP_LINK_ACTIVATION_FAILED_EVT)
197     {
198         nfa_p2p_cb.llcp_state = NFA_P2P_LLCP_STATE_IDLE;
199 
200         if (nfa_p2p_cb.is_initiator)
201         {
202             /* notify NFA DM to send Activate Event to applicaiton with status  */
203             nfa_dm_notify_activation_status (NFA_STATUS_FAILED, NULL);
204         }
205 
206         nfa_dm_rf_deactivate (NFA_DEACTIVATE_TYPE_DISCOVERY);
207     }
208     else /* LLCP_LINK_DEACTIVATED_EVT       */
209     {
210         nfa_p2p_cb.llcp_state = NFA_P2P_LLCP_STATE_IDLE;
211 
212         llcp_deactivated.reason = reason;
213         nfa_dm_act_conn_cback_notify (NFA_LLCP_DEACTIVATED_EVT, (tNFA_CONN_EVT_DATA *)&llcp_deactivated);
214 
215         if (  (nfa_p2p_cb.is_initiator)
216             &&(reason != LLCP_LINK_RF_LINK_LOSS_ERR)  ) /* if NFC link is still up */
217         {
218             nfa_dm_rf_deactivate (NFA_DEACTIVATE_TYPE_DISCOVERY);
219         }
220     }
221 }
222 
223 /*******************************************************************************
224 **
225 ** Function         nfa_p2p_activate_llcp
226 **
227 ** Description      Activate LLCP link
228 **
229 **
230 ** Returns          None
231 **
232 *******************************************************************************/
nfa_p2p_activate_llcp(tNFC_DISCOVER * p_data)233 void nfa_p2p_activate_llcp (tNFC_DISCOVER *p_data)
234 {
235     tLLCP_ACTIVATE_CONFIG config;
236 
237     P2P_TRACE_DEBUG0 ("nfa_p2p_activate_llcp ()");
238 
239     if (  (p_data->activate.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_A)
240         ||(p_data->activate.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_F)
241         ||(p_data->activate.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_A_ACTIVE)
242         ||(p_data->activate.rf_tech_param.mode == NFC_DISCOVERY_TYPE_POLL_F_ACTIVE)  )
243     {
244         config.is_initiator = TRUE;
245     }
246     else
247     {
248         config.is_initiator = FALSE;
249     }
250 
251     nfa_p2p_cb.is_initiator = config.is_initiator;
252 
253     config.max_payload_size = p_data->activate.intf_param.intf_param.pa_nfc.max_payload_size;
254     config.waiting_time     = p_data->activate.intf_param.intf_param.pa_nfc.waiting_time;
255     config.p_gen_bytes      = p_data->activate.intf_param.intf_param.pa_nfc.gen_bytes;
256     config.gen_bytes_len    = p_data->activate.intf_param.intf_param.pa_nfc.gen_bytes_len;
257 
258     LLCP_ActivateLink (config, nfa_p2p_llcp_link_cback);
259 }
260 
261 /*******************************************************************************
262 **
263 ** Function         nfa_p2p_deactivate_llcp
264 **
265 ** Description      Deactivate LLCP link
266 **
267 **
268 ** Returns          None
269 **
270 *******************************************************************************/
nfa_p2p_deactivate_llcp(void)271 void nfa_p2p_deactivate_llcp (void)
272 {
273     P2P_TRACE_DEBUG0 ("nfa_p2p_deactivate_llcp ()");
274 
275     LLCP_DeactivateLink ();
276 }
277 
278 /*******************************************************************************
279 **
280 ** Function         nfa_p2p_init
281 **
282 ** Description      Initialize NFA P2P
283 **
284 **
285 ** Returns          None
286 **
287 *******************************************************************************/
nfa_p2p_init(void)288 void nfa_p2p_init (void)
289 {
290     UINT8 xx;
291 
292     P2P_TRACE_DEBUG0 ("nfa_p2p_init ()");
293 
294     /* initialize control block */
295     memset (&nfa_p2p_cb, 0, sizeof (tNFA_P2P_CB));
296     nfa_p2p_cb.dm_disc_handle = NFA_HANDLE_INVALID;
297     nfa_p2p_cb.trace_level    = APPL_INITIAL_TRACE_LEVEL;
298 
299     for (xx = 0; xx < LLCP_MAX_SDP_TRANSAC; xx++)
300     {
301         nfa_p2p_cb.sdp_cb[xx].local_sap = LLCP_INVALID_SAP;
302     }
303 
304     /* register message handler on NFA SYS */
305     nfa_sys_register (NFA_ID_P2P,  &nfa_p2p_sys_reg);
306 }
307 
308 
309 /*******************************************************************************
310 **
311 ** Function         nfa_p2p_sys_disable
312 **
313 ** Description      Deregister NFA P2P from NFA SYS/DM
314 **
315 **
316 ** Returns          None
317 **
318 *******************************************************************************/
nfa_p2p_sys_disable(void)319 static void nfa_p2p_sys_disable (void)
320 {
321     P2P_TRACE_DEBUG0 ("nfa_p2p_sys_disable()");
322 
323     /* deregister message handler on NFA SYS */
324     nfa_sys_deregister (NFA_ID_P2P);
325 }
326 
327 /*******************************************************************************
328 **
329 ** Function         nfa_p2p_set_config
330 **
331 ** Description      Set General bytes and WT parameters for LLCP
332 **
333 **
334 ** Returns          void
335 **
336 *******************************************************************************/
nfa_p2p_set_config(tNFA_DM_DISC_TECH_PROTO_MASK disc_mask)337 void nfa_p2p_set_config (tNFA_DM_DISC_TECH_PROTO_MASK disc_mask)
338 {
339     UINT8 wt, gen_bytes_len = LLCP_MAX_GEN_BYTES;
340     UINT8 params[LLCP_MAX_GEN_BYTES + 5], *p, length;
341 
342     P2P_TRACE_DEBUG0 ("nfa_p2p_set_config ()");
343 
344     LLCP_GetDiscoveryConfig (&wt, params + 2, &gen_bytes_len);
345 
346     if (disc_mask & ( NFA_DM_DISC_MASK_PA_NFC_DEP
347                      |NFA_DM_DISC_MASK_PF_NFC_DEP
348                      |NFA_DM_DISC_MASK_PAA_NFC_DEP
349                      |NFA_DM_DISC_MASK_PFA_NFC_DEP) )
350     {
351         p = params;
352 
353         UINT8_TO_BE_STREAM (p, NFC_PMID_ATR_REQ_GEN_BYTES);
354         UINT8_TO_BE_STREAM (p, gen_bytes_len);
355 
356         p += gen_bytes_len;
357         length = gen_bytes_len + 2;
358 
359         nfa_dm_check_set_config (length, params, FALSE);
360     }
361 
362     if (disc_mask & ( NFA_DM_DISC_MASK_LA_NFC_DEP
363                      |NFA_DM_DISC_MASK_LF_NFC_DEP
364                      |NFA_DM_DISC_MASK_LAA_NFC_DEP
365                      |NFA_DM_DISC_MASK_LFA_NFC_DEP) )
366     {
367         p = params;
368 
369         UINT8_TO_BE_STREAM (p, NFC_PMID_ATR_RES_GEN_BYTES);
370         UINT8_TO_BE_STREAM (p, gen_bytes_len);
371 
372         p += gen_bytes_len;
373         length = gen_bytes_len + 2;
374 
375         UINT8_TO_BE_STREAM (p, NFC_PMID_WT);
376         UINT8_TO_BE_STREAM (p, NCI_PARAM_LEN_WT);
377         UINT8_TO_BE_STREAM (p, wt);
378 
379         length += 3;
380 
381         nfa_dm_check_set_config (length, params, FALSE);
382     }
383 }
384 
385 /*******************************************************************************
386 **
387 ** Function         nfa_p2p_enable_listening
388 **
389 ** Description      Configure listen technologies and protocols for LLCP
390 **                  If LLCP WKS is changed then LLCP Gen bytes will be updated.
391 **
392 ** Returns          void
393 **
394 *******************************************************************************/
nfa_p2p_enable_listening(tNFA_SYS_ID sys_id,BOOLEAN update_wks)395 void nfa_p2p_enable_listening (tNFA_SYS_ID sys_id, BOOLEAN update_wks)
396 {
397     tNFA_DM_DISC_TECH_PROTO_MASK p2p_listen_mask = 0;
398 
399     P2P_TRACE_DEBUG2 ("nfa_p2p_enable_listening () sys_id = %d, update_wks = %d",
400                        sys_id, update_wks);
401 
402     if (sys_id == NFA_ID_P2P)
403         nfa_p2p_cb.is_p2p_listening = TRUE;
404     else if (sys_id == NFA_ID_CHO)
405         nfa_p2p_cb.is_cho_listening = TRUE;
406     else if (sys_id == NFA_ID_SNEP)
407         nfa_p2p_cb.is_snep_listening = TRUE;
408 
409     if (nfa_p2p_cb.dm_disc_handle != NFA_HANDLE_INVALID)
410     {
411         /* if need to update WKS in LLCP Gen bytes */
412         if (update_wks)
413         {
414             /* update LLCP Gen Bytes */
415             nfa_p2p_set_config (NFA_DM_DISC_MASK_PA_NFC_DEP|NFA_DM_DISC_MASK_LA_NFC_DEP);
416         }
417         return;
418     }
419 
420     /* collect listen technologies with NFC-DEP protocol */
421     if (nfa_p2p_cb.listen_tech_mask & NFA_TECHNOLOGY_MASK_A)
422         p2p_listen_mask |= NFA_DM_DISC_MASK_LA_NFC_DEP;
423 
424     if (nfa_p2p_cb.listen_tech_mask & NFA_TECHNOLOGY_MASK_F)
425         p2p_listen_mask |= NFA_DM_DISC_MASK_LF_NFC_DEP;
426 
427     if (nfa_p2p_cb.listen_tech_mask & NFA_TECHNOLOGY_MASK_A_ACTIVE)
428         p2p_listen_mask |= NFA_DM_DISC_MASK_LAA_NFC_DEP;
429 
430     if (nfa_p2p_cb.listen_tech_mask & NFA_TECHNOLOGY_MASK_F_ACTIVE)
431         p2p_listen_mask |= NFA_DM_DISC_MASK_LFA_NFC_DEP;
432 
433     if (p2p_listen_mask)
434     {
435         /* Configure listen technologies and protocols and register callback to NFA DM discovery */
436         nfa_p2p_cb.dm_disc_handle = nfa_dm_add_rf_discover (p2p_listen_mask,
437                                                             NFA_DM_DISC_HOST_ID_DH,
438                                                             nfa_p2p_discovery_cback);
439     }
440 }
441 
442 /*******************************************************************************
443 **
444 ** Function         nfa_p2p_disable_listening
445 **
446 ** Description      Remove listen technologies and protocols for LLCP and
447 **                  deregister callback from NFA DM discovery if all of P2P/CHO/SNEP
448 **                  doesn't listen LLCP any more.
449 **                  If LLCP WKS is changed then ATR_RES will be updated.
450 **
451 ** Returns          void
452 **
453 *******************************************************************************/
nfa_p2p_disable_listening(tNFA_SYS_ID sys_id,BOOLEAN update_wks)454 void nfa_p2p_disable_listening (tNFA_SYS_ID sys_id, BOOLEAN update_wks)
455 {
456 
457     P2P_TRACE_DEBUG2 ("nfa_p2p_disable_listening ()  sys_id = %d, update_wks = %d",
458                        sys_id, update_wks);
459 
460     if (sys_id == NFA_ID_P2P)
461         nfa_p2p_cb.is_p2p_listening = FALSE;
462     else if (sys_id == NFA_ID_CHO)
463         nfa_p2p_cb.is_cho_listening = FALSE;
464     else if (sys_id == NFA_ID_SNEP)
465         nfa_p2p_cb.is_snep_listening = FALSE;
466 
467     if (nfa_p2p_cb.dm_disc_handle != NFA_HANDLE_INVALID)
468     {
469         if (  (nfa_p2p_cb.is_p2p_listening == FALSE)
470             &&(nfa_p2p_cb.is_cho_listening == FALSE)
471             &&(nfa_p2p_cb.is_snep_listening == FALSE)  )
472         {
473             nfa_p2p_cb.llcp_state = NFA_P2P_LLCP_STATE_IDLE;
474 
475             nfa_dm_delete_rf_discover (nfa_p2p_cb.dm_disc_handle);
476             nfa_p2p_cb.dm_disc_handle = NFA_HANDLE_INVALID;
477         }
478         else if (update_wks)
479         {
480             /* update LLCP Gen Bytes */
481             nfa_p2p_set_config (NFA_DM_DISC_MASK_PA_NFC_DEP|NFA_DM_DISC_MASK_LA_NFC_DEP);
482         }
483     }
484 }
485 
486 /*******************************************************************************
487 **
488 ** Function         nfa_p2p_update_listen_tech
489 **
490 ** Description      Update P2P listen technologies. If there is change then
491 **                  restart or stop P2P listen.
492 **
493 ** Returns          void
494 **
495 *******************************************************************************/
nfa_p2p_update_listen_tech(tNFA_TECHNOLOGY_MASK tech_mask)496 void nfa_p2p_update_listen_tech (tNFA_TECHNOLOGY_MASK tech_mask)
497 {
498     P2P_TRACE_DEBUG1 ("nfa_p2p_update_listen_tech ()  tech_mask = %d", tech_mask);
499 
500     if (nfa_p2p_cb.listen_tech_mask != tech_mask)
501     {
502         nfa_p2p_cb.listen_tech_mask = tech_mask;
503 
504         if (nfa_p2p_cb.dm_disc_handle != NFA_HANDLE_INVALID)
505         {
506             nfa_dm_delete_rf_discover (nfa_p2p_cb.dm_disc_handle);
507             nfa_p2p_cb.dm_disc_handle = NFA_HANDLE_INVALID;
508         }
509 
510         /* restart discovery without updating sub-module status */
511         if (nfa_p2p_cb.is_p2p_listening)
512             nfa_p2p_enable_listening (NFA_ID_P2P, FALSE);
513         else if (nfa_p2p_cb.is_cho_listening)
514             nfa_p2p_enable_listening (NFA_ID_CHO, FALSE);
515         else if (nfa_p2p_cb.is_snep_listening)
516             nfa_p2p_enable_listening (NFA_ID_SNEP, FALSE);
517     }
518 }
519 
520 /*******************************************************************************
521 **
522 ** Function         nfa_p2p_evt_hdlr
523 **
524 ** Description      Processing event for NFA P2P
525 **
526 **
527 ** Returns          TRUE if p_msg needs to be deallocated
528 **
529 *******************************************************************************/
nfa_p2p_evt_hdlr(BT_HDR * p_hdr)530 static BOOLEAN nfa_p2p_evt_hdlr (BT_HDR *p_hdr)
531 {
532     BOOLEAN delete_msg = TRUE;
533     UINT16  event;
534 
535     tNFA_P2P_MSG *p_msg = (tNFA_P2P_MSG *)p_hdr;
536 
537 #if (BT_TRACE_VERBOSE == TRUE)
538     P2P_TRACE_DEBUG2 ("nfa_p2p_evt_hdlr (): LLCP State [%s], Event [%s]",
539                        nfa_p2p_llcp_state_code (nfa_p2p_cb.llcp_state),
540                        nfa_p2p_evt_code (p_msg->hdr.event));
541 #else
542     P2P_TRACE_DEBUG2 ("nfa_p2p_evt_hdlr (): State 0x%02x, Event 0x%02x",
543                        nfa_p2p_cb.llcp_state, p_msg->hdr.event);
544 #endif
545 
546     event = p_msg->hdr.event & 0x00ff;
547 
548     /* execute action functions */
549     if (event < NFA_P2P_NUM_ACTIONS)
550     {
551         delete_msg = (*nfa_p2p_action[event]) (p_msg);
552     }
553     else
554     {
555         P2P_TRACE_ERROR0 ("Unhandled event");
556     }
557 
558     return delete_msg;
559 }
560 
561 
562 #if (BT_TRACE_VERBOSE == TRUE)
563 /*******************************************************************************
564 **
565 ** Function         nfa_p2p_llcp_state_code
566 **
567 ** Description
568 **
569 ** Returns          string of state
570 **
571 *******************************************************************************/
nfa_p2p_llcp_state_code(tNFA_P2P_LLCP_STATE state_code)572 static char *nfa_p2p_llcp_state_code (tNFA_P2P_LLCP_STATE state_code)
573 {
574     switch (state_code)
575     {
576     case NFA_P2P_LLCP_STATE_IDLE:
577         return "Link IDLE";
578     case NFA_P2P_LLCP_STATE_LISTENING:
579         return "Link LISTENING";
580     case NFA_P2P_LLCP_STATE_ACTIVATED:
581         return "Link ACTIVATED";
582     default:
583         return "Unknown state";
584     }
585 }
586 
587 /*******************************************************************************
588 **
589 ** Function         nfa_p2p_evt_code
590 **
591 ** Description
592 **
593 ** Returns          string of event
594 **
595 *******************************************************************************/
nfa_p2p_evt_code(UINT16 evt_code)596 char *nfa_p2p_evt_code (UINT16 evt_code)
597 {
598     switch (evt_code)
599     {
600     case NFA_P2P_API_REG_SERVER_EVT:
601         return "API_REG_SERVER";
602     case NFA_P2P_API_REG_CLIENT_EVT:
603         return "API_REG_CLIENT";
604     case NFA_P2P_API_DEREG_EVT:
605         return "API_DEREG";
606     case NFA_P2P_API_ACCEPT_CONN_EVT:
607         return "API_ACCEPT_CONN";
608     case NFA_P2P_API_REJECT_CONN_EVT:
609         return "API_REJECT_CONN";
610     case NFA_P2P_API_DISCONNECT_EVT:
611         return "API_DISCONNECT";
612     case NFA_P2P_API_CONNECT_EVT:
613         return "API_CONNECT";
614     case NFA_P2P_API_SEND_UI_EVT:
615         return "API_SEND_UI";
616     case NFA_P2P_API_SEND_DATA_EVT:
617         return "API_SEND_DATA";
618     case NFA_P2P_API_SET_LOCAL_BUSY_EVT:
619         return "API_SET_LOCAL_BUSY";
620     case NFA_P2P_API_GET_LINK_INFO_EVT:
621         return "API_GET_LINK_INFO";
622     case NFA_P2P_API_GET_REMOTE_SAP_EVT:
623         return "API_GET_REMOTE_SAP";
624     case NFA_P2P_API_SET_LLCP_CFG_EVT:
625         return "API_SET_LLCP_CFG_EVT";
626     default:
627         return "Unknown event";
628     }
629 }
630 #endif  /* Debug Functions */
631