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