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