nfa_p2p_act.c revision 552f2b745deddd35d9b75da9c9c09bd2f3f573a8
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 implementation file for the NFA P2P. 23 * 24 ******************************************************************************/ 25 26#include "string.h" 27#include "nfc_api.h" 28#include "nfa_sys.h" 29#include "nfa_sys_int.h" 30#include "nfa_dm_int.h" 31#include "llcp_defs.h" 32#include "llcp_api.h" 33#include "nfa_p2p_api.h" 34#include "nfa_p2p_int.h" 35 36/***************************************************************************** 37** Global Variables 38*****************************************************************************/ 39 40/***************************************************************************** 41** Static Functions 42*****************************************************************************/ 43 44/***************************************************************************** 45** Constants 46*****************************************************************************/ 47 48/******************************************************************************* 49** 50** Function nfa_p2p_allocate_conn_cb 51** 52** Description Allocate data link connection control block 53** 54** 55** Returns uint8_t 56** 57*******************************************************************************/ 58static uint8_t nfa_p2p_allocate_conn_cb (uint8_t local_sap) 59{ 60 uint8_t xx; 61 62 for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++) 63 { 64 if (nfa_p2p_cb.conn_cb[xx].flags == 0) 65 { 66 nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_IN_USE; 67 nfa_p2p_cb.conn_cb[xx].local_sap = local_sap; 68 69 return (xx); 70 } 71 } 72 73 P2P_TRACE_ERROR0 ("nfa_p2p_allocate_conn_cb (): No resource"); 74 75 return LLCP_MAX_DATA_LINK; 76} 77 78/******************************************************************************* 79** 80** Function nfa_p2p_deallocate_conn_cb 81** 82** Description Deallocate data link connection control block 83** 84** 85** Returns void 86** 87*******************************************************************************/ 88static void nfa_p2p_deallocate_conn_cb (uint8_t xx) 89{ 90 if (xx < LLCP_MAX_DATA_LINK) 91 { 92 nfa_p2p_cb.conn_cb[xx].flags = 0; 93 } 94 else 95 { 96 P2P_TRACE_ERROR1 ("nfa_p2p_deallocate_conn_cb (): Invalid index (%d)", xx); 97 } 98} 99 100/******************************************************************************* 101** 102** Function nfa_p2p_find_conn_cb 103** 104** Description Find data link connection control block by local/remote SAP 105** 106** 107** Returns uint8_t 108** 109*******************************************************************************/ 110static uint8_t nfa_p2p_find_conn_cb (uint8_t local_sap, uint8_t remote_sap) 111{ 112 uint8_t xx; 113 114 for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++) 115 { 116 if ( (nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_IN_USE) 117 &&(nfa_p2p_cb.conn_cb[xx].local_sap == local_sap) 118 &&(nfa_p2p_cb.conn_cb[xx].remote_sap == remote_sap) ) 119 { 120 return (xx); 121 } 122 } 123 124 return (LLCP_MAX_DATA_LINK); 125} 126 127/******************************************************************************* 128** 129** Function nfa_p2p_llcp_cback 130** 131** Description Processing SAP callback events from LLCP 132** 133** 134** Returns None 135** 136*******************************************************************************/ 137static void nfa_p2p_llcp_cback (tLLCP_SAP_CBACK_DATA *p_data) 138{ 139 P2P_TRACE_DEBUG2 ("nfa_p2p_llcp_cback (): event:0x%02X, local_sap:0x%02X", p_data->hdr.event, p_data->hdr.local_sap); 140 141 switch (p_data->hdr.event) 142 { 143 case LLCP_SAP_EVT_DATA_IND: 144 nfa_p2p_proc_llcp_data_ind (p_data); 145 break; 146 147 case LLCP_SAP_EVT_CONNECT_IND: 148 nfa_p2p_proc_llcp_connect_ind (p_data); 149 break; 150 151 case LLCP_SAP_EVT_CONNECT_RESP: 152 nfa_p2p_proc_llcp_connect_resp (p_data); 153 break; 154 155 case LLCP_SAP_EVT_DISCONNECT_IND: 156 nfa_p2p_proc_llcp_disconnect_ind (p_data); 157 break; 158 159 case LLCP_SAP_EVT_DISCONNECT_RESP: 160 nfa_p2p_proc_llcp_disconnect_resp (p_data); 161 break; 162 163 case LLCP_SAP_EVT_CONGEST: 164 nfa_p2p_proc_llcp_congestion (p_data); 165 break; 166 167 case LLCP_SAP_EVT_LINK_STATUS: 168 nfa_p2p_proc_llcp_link_status (p_data); 169 break; 170 171 default: 172 P2P_TRACE_ERROR1 ("nfa_p2p_llcp_cback (): Unknown event:0x%02X", p_data->hdr.event); 173 return; 174 } 175} 176 177/******************************************************************************* 178** 179** Function nfa_p2p_sdp_cback 180** 181** Description Process SDP callback event from LLCP 182** 183** 184** Returns None 185** 186*******************************************************************************/ 187void nfa_p2p_sdp_cback (uint8_t tid, uint8_t remote_sap) 188{ 189 uint8_t local_sap; 190 uint8_t xx; 191 tNFA_P2P_EVT_DATA evt_data; 192 193 P2P_TRACE_DEBUG2 ("nfa_p2p_sdp_cback (): tid:0x%02X, remote_sap:0x%02X", tid, remote_sap); 194 195 /* search for callback function to process */ 196 for (xx = 0; xx < LLCP_MAX_SDP_TRANSAC; xx++) 197 { 198 if ( (nfa_p2p_cb.sdp_cb[xx].local_sap != LLCP_INVALID_SAP) 199 &&(nfa_p2p_cb.sdp_cb[xx].tid == tid) ) 200 { 201 local_sap = nfa_p2p_cb.sdp_cb[xx].local_sap; 202 203 evt_data.sdp.handle = (NFA_HANDLE_GROUP_P2P | local_sap); 204 evt_data.sdp.remote_sap = remote_sap; 205 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_SDP_EVT, &evt_data); 206 207 nfa_p2p_cb.sdp_cb[xx].local_sap = LLCP_INVALID_SAP; 208 break; 209 } 210 } 211} 212 213/******************************************************************************* 214** 215** Function nfa_p2p_start_sdp 216** 217** Description Initiate SDP 218** 219** 220** Returns TRUE if success 221** 222*******************************************************************************/ 223bool nfa_p2p_start_sdp (char *p_service_name, uint8_t local_sap) 224{ 225 int xx; 226 227 P2P_TRACE_DEBUG1 ("nfa_p2p_start_sdp (): SN:<%s>", p_service_name); 228 229 /* search for empty slot */ 230 for (xx = 0; xx < LLCP_MAX_SDP_TRANSAC; xx++) 231 { 232 if (nfa_p2p_cb.sdp_cb[xx].local_sap == LLCP_INVALID_SAP) 233 { 234 if (LLCP_DiscoverService (p_service_name, 235 nfa_p2p_sdp_cback, 236 &(nfa_p2p_cb.sdp_cb[xx].tid)) == LLCP_STATUS_SUCCESS) 237 { 238 nfa_p2p_cb.sdp_cb[xx].local_sap = local_sap; 239 return true; 240 } 241 else 242 { 243 /* failure of SDP */ 244 return false; 245 } 246 } 247 } 248 return false; 249} 250 251/******************************************************************************* 252** 253** Function nfa_p2p_proc_llcp_data_ind 254** 255** Description Processing incoming data event from LLCP 256** 257** 258** Returns None 259** 260*******************************************************************************/ 261void nfa_p2p_proc_llcp_data_ind (tLLCP_SAP_CBACK_DATA *p_data) 262{ 263 uint8_t local_sap, xx; 264 tNFA_P2P_EVT_DATA evt_data; 265 266 P2P_TRACE_DEBUG0 ("nfa_p2p_proc_llcp_data_ind ()"); 267 268 local_sap = p_data->data_ind.local_sap; 269 270 if (nfa_p2p_cb.sap_cb[local_sap].p_cback) 271 { 272 evt_data.data.handle = 0; 273 /* if connectionless */ 274 if (p_data->data_ind.link_type == NFA_P2P_LLINK_TYPE) 275 { 276 evt_data.data.handle = (NFA_HANDLE_GROUP_P2P | local_sap); 277 } 278 else 279 { 280 xx = nfa_p2p_find_conn_cb (p_data->data_ind.local_sap, 281 p_data->data_ind.remote_sap); 282 283 if (xx != LLCP_MAX_DATA_LINK) 284 { 285 evt_data.data.handle = (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx); 286 } 287 } 288 289 evt_data.data.remote_sap = p_data->data_ind.remote_sap; 290 evt_data.data.link_type = p_data->data_ind.link_type; 291 292 /* notify upper layer that there are data at LLCP */ 293 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DATA_EVT, &evt_data); 294 } 295} 296 297/******************************************************************************* 298** 299** Function nfa_p2p_proc_llcp_connect_ind 300** 301** Description Processing connection request from peer 302** 303** 304** Returns None 305** 306*******************************************************************************/ 307void nfa_p2p_proc_llcp_connect_ind (tLLCP_SAP_CBACK_DATA *p_data) 308{ 309 uint8_t server_sap, local_sap; 310 tNFA_P2P_EVT_DATA evt_data; 311 uint8_t xx; 312 313 P2P_TRACE_DEBUG1 ("nfa_p2p_proc_llcp_connect_ind () server_sap:0x%x", 314 p_data->connect_ind.server_sap); 315 316 server_sap = p_data->connect_ind.server_sap; 317 local_sap = p_data->connect_ind.local_sap; 318 319 if (nfa_p2p_cb.sap_cb[server_sap].p_cback) 320 { 321 xx = nfa_p2p_allocate_conn_cb (server_sap); 322 323 if (xx != LLCP_MAX_DATA_LINK) 324 { 325 nfa_p2p_cb.conn_cb[xx].remote_sap = p_data->connect_ind.remote_sap; 326 nfa_p2p_cb.conn_cb[xx].remote_miu = p_data->connect_ind.miu; 327 328 /* peer will not receive any data */ 329 if (p_data->connect_ind.rw == 0) 330 nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_REMOTE_RW_ZERO; 331 332 evt_data.conn_req.server_handle = (NFA_HANDLE_GROUP_P2P | server_sap); 333 evt_data.conn_req.conn_handle = (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx); 334 evt_data.conn_req.remote_sap = p_data->connect_ind.remote_sap; 335 evt_data.conn_req.remote_miu = p_data->connect_ind.miu; 336 evt_data.conn_req.remote_rw = p_data->connect_ind.rw; 337 338 nfa_p2p_cb.sap_cb[server_sap].p_cback (NFA_P2P_CONN_REQ_EVT, &evt_data); 339 } 340 } 341 else 342 { 343 P2P_TRACE_ERROR0 ("nfa_p2p_proc_llcp_connect_ind (): Not registered"); 344 } 345} 346 347/******************************************************************************* 348** 349** Function nfa_p2p_proc_llcp_connect_resp 350** 351** Description Processing connection response from peer 352** 353** 354** Returns None 355** 356*******************************************************************************/ 357void nfa_p2p_proc_llcp_connect_resp (tLLCP_SAP_CBACK_DATA *p_data) 358{ 359 uint8_t local_sap, xx; 360 tNFA_P2P_EVT_DATA evt_data; 361 362 P2P_TRACE_DEBUG0 ("nfa_p2p_proc_llcp_connect_resp ()"); 363 364 local_sap = p_data->connect_resp.local_sap; 365 366 if (nfa_p2p_cb.sap_cb[local_sap].p_cback) 367 { 368 xx = nfa_p2p_allocate_conn_cb (local_sap); 369 370 if (xx != LLCP_MAX_DATA_LINK) 371 { 372 nfa_p2p_cb.conn_cb[xx].remote_sap = p_data->connect_resp.remote_sap; 373 nfa_p2p_cb.conn_cb[xx].remote_miu = p_data->connect_resp.miu; 374 375 /* peer will not receive any data */ 376 if (p_data->connect_resp.rw == 0) 377 nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_REMOTE_RW_ZERO; 378 379 evt_data.connected.client_handle = (NFA_HANDLE_GROUP_P2P | local_sap); 380 evt_data.connected.conn_handle = (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx); 381 evt_data.connected.remote_sap = p_data->connect_resp.remote_sap; 382 evt_data.connected.remote_miu = p_data->connect_resp.miu; 383 evt_data.connected.remote_rw = p_data->connect_resp.rw; 384 385 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_CONNECTED_EVT, &evt_data); 386 } 387 } 388} 389 390/******************************************************************************* 391** 392** Function nfa_p2p_proc_llcp_disconnect_ind 393** 394** Description Processing disconnection request from peer 395** 396** 397** Returns None 398** 399*******************************************************************************/ 400void nfa_p2p_proc_llcp_disconnect_ind (tLLCP_SAP_CBACK_DATA *p_data) 401{ 402 uint8_t local_sap, xx; 403 tNFA_P2P_EVT_DATA evt_data; 404 405 P2P_TRACE_DEBUG0 ("nfa_p2p_proc_llcp_disconnect_ind ()"); 406 407 local_sap = p_data->disconnect_ind.local_sap; 408 409 if (nfa_p2p_cb.sap_cb[local_sap].p_cback) 410 { 411 xx = nfa_p2p_find_conn_cb (p_data->disconnect_ind.local_sap, 412 p_data->disconnect_ind.remote_sap); 413 414 if (xx != LLCP_MAX_DATA_LINK) 415 { 416 evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx); 417 evt_data.disc.reason = NFA_P2P_DISC_REASON_REMOTE_INITIATE; 418 419 nfa_p2p_deallocate_conn_cb (xx); 420 421 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DISC_EVT, &evt_data); 422 } 423 else 424 { 425 /* 426 ** LLCP link has been deactivated before receiving CC or DM. 427 ** Return NFA_P2P_DISC_EVT to indicate failure of creating 428 ** connection 429 */ 430 431 evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | local_sap); 432 evt_data.disc.reason = NFA_P2P_DISC_REASON_LLCP_DEACTIVATED; 433 434 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DISC_EVT, &evt_data); 435 436 P2P_TRACE_ERROR0 ("nfa_p2p_proc_llcp_disconnect_ind (): Link deactivated"); 437 } 438 } 439} 440 441/******************************************************************************* 442** 443** Function nfa_p2p_proc_llcp_disconnect_resp 444** 445** Description Processing rejected connection from peer 446** 447** 448** Returns None 449** 450*******************************************************************************/ 451void nfa_p2p_proc_llcp_disconnect_resp (tLLCP_SAP_CBACK_DATA *p_data) 452{ 453 uint8_t local_sap, xx; 454 tNFA_P2P_EVT_DATA evt_data; 455 456 P2P_TRACE_DEBUG0 ("nfa_p2p_proc_llcp_disconnect_resp ()"); 457 458 local_sap = p_data->disconnect_resp.local_sap; 459 460 if (nfa_p2p_cb.sap_cb[local_sap].p_cback) 461 { 462 if (p_data->disconnect_resp.reason == LLCP_SAP_DM_REASON_RESP_DISC) 463 { 464 evt_data.disc.reason = NFA_P2P_DISC_REASON_LOCAL_INITITATE; 465 } 466 else if ( (p_data->disconnect_resp.reason == LLCP_SAP_DM_REASON_APP_REJECTED) 467 ||(p_data->disconnect_resp.reason == LLCP_SAP_DM_REASON_PERM_REJECT_THIS) 468 ||(p_data->disconnect_resp.reason == LLCP_SAP_DM_REASON_PERM_REJECT_ANY) 469 ||(p_data->disconnect_resp.reason == LLCP_SAP_DM_REASON_TEMP_REJECT_THIS) 470 ||(p_data->disconnect_resp.reason == LLCP_SAP_DM_REASON_TEMP_REJECT_ANY) ) 471 { 472 evt_data.disc.reason = NFA_P2P_DISC_REASON_REMOTE_REJECT; 473 } 474 else if (p_data->disconnect_resp.reason == LLCP_SAP_DM_REASON_NO_SERVICE) 475 { 476 evt_data.disc.reason = NFA_P2P_DISC_REASON_NO_SERVICE; 477 } 478 else if (p_data->disconnect_resp.reason == LLCP_SAP_DM_REASON_NO_ACTIVE_CONNECTION) 479 { 480 evt_data.disc.reason = NFA_P2P_DISC_REASON_LLCP_DEACTIVATED; 481 } 482 else 483 { 484 evt_data.disc.reason = NFA_P2P_DISC_REASON_NO_INFORMATION; 485 } 486 487 if (evt_data.disc.reason == NFA_P2P_DISC_REASON_LOCAL_INITITATE) 488 { 489 xx = nfa_p2p_find_conn_cb (p_data->disconnect_resp.local_sap, 490 p_data->disconnect_resp.remote_sap); 491 492 if (xx != LLCP_MAX_DATA_LINK) 493 { 494 evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx); 495 496 nfa_p2p_deallocate_conn_cb (xx); 497 498 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DISC_EVT, &evt_data); 499 } 500 else 501 { 502 P2P_TRACE_ERROR0 ("nfa_p2p_proc_llcp_disconnect_resp (): No connection found"); 503 } 504 } 505 else 506 { 507 evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | local_sap); 508 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DISC_EVT, &evt_data); 509 } 510 } 511} 512 513/******************************************************************************* 514** 515** Function nfa_p2p_proc_llcp_congest 516** 517** Description Processing LLCP congestion event 518** 519** 520** Returns None 521** 522*******************************************************************************/ 523void nfa_p2p_proc_llcp_congestion (tLLCP_SAP_CBACK_DATA *p_data) 524{ 525 uint8_t local_sap, remote_sap, xx; 526 tNFA_P2P_EVT_DATA evt_data; 527 528 local_sap = p_data->congest.local_sap; 529 remote_sap = p_data->congest.remote_sap; 530 531 evt_data.congest.link_type = p_data->congest.link_type; 532 evt_data.congest.is_congested = p_data->congest.is_congested; 533 534 if (p_data->congest.is_congested) 535 { 536 P2P_TRACE_DEBUG2 ("nfa_p2p_proc_llcp_congestion () START SAP=(0x%x,0x%x)", 537 local_sap, remote_sap); 538 539 } 540 else 541 { 542 P2P_TRACE_DEBUG2 ("nfa_p2p_proc_llcp_congestion () END SAP=(0x%x,0x%x)", 543 local_sap, remote_sap); 544 } 545 546 if (nfa_p2p_cb.sap_cb[local_sap].p_cback) 547 { 548 if (evt_data.congest.link_type == NFA_P2P_LLINK_TYPE) 549 { 550 evt_data.congest.handle = (NFA_HANDLE_GROUP_P2P | local_sap); 551 552 if ( (evt_data.congest.is_congested == false) 553 &&(nfa_p2p_cb.sap_cb[local_sap].flags & NFA_P2P_SAP_FLAG_LLINK_CONGESTED) ) 554 { 555 nfa_p2p_cb.sap_cb[local_sap].flags &= ~NFA_P2P_SAP_FLAG_LLINK_CONGESTED; 556 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_CONGEST_EVT, &evt_data); 557 } 558 else if ( (evt_data.congest.is_congested == true) 559 &&(!(nfa_p2p_cb.sap_cb[local_sap].flags & NFA_P2P_SAP_FLAG_LLINK_CONGESTED)) ) 560 { 561 /* this is overall congestion due to high usage of buffer pool */ 562 nfa_p2p_cb.sap_cb[local_sap].flags |= NFA_P2P_SAP_FLAG_LLINK_CONGESTED; 563 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_CONGEST_EVT, &evt_data); 564 } 565 } 566 else 567 { 568 xx = nfa_p2p_find_conn_cb (local_sap, remote_sap); 569 570 if (xx != LLCP_MAX_DATA_LINK) 571 { 572 evt_data.congest.handle = (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx); 573 574 if ( (evt_data.congest.is_congested == false) 575 &&(nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_CONGESTED) ) 576 { 577 nfa_p2p_cb.conn_cb[xx].flags &= ~NFA_P2P_CONN_FLAG_CONGESTED; 578 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_CONGEST_EVT, &evt_data); 579 } 580 else if ( (evt_data.congest.is_congested == true) 581 &&(!(nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_CONGESTED)) ) 582 { 583 /* this is overall congestion due to high usage of buffer pool */ 584 nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_CONGESTED; 585 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_CONGEST_EVT, &evt_data); 586 } 587 } 588 else 589 { 590 P2P_TRACE_ERROR0 ("nfa_p2p_proc_llcp_congestion (): No connection found"); 591 } 592 } 593 } 594} 595 596/******************************************************************************* 597** 598** Function nfa_p2p_proc_llcp_link_status 599** 600** Description Processing LLCP link status 601** 602** 603** Returns next state after processing this event 604** 605*******************************************************************************/ 606void nfa_p2p_proc_llcp_link_status (tLLCP_SAP_CBACK_DATA *p_data) 607{ 608 uint8_t local_sap, xx; 609 tNFA_P2P_EVT_DATA evt_data; 610 611 P2P_TRACE_DEBUG1 ("nfa_p2p_proc_llcp_link_status () is_activated:%d", 612 p_data->link_status.is_activated); 613 614 local_sap = p_data->link_status.local_sap; 615 616 if (nfa_p2p_cb.sap_cb[local_sap].p_cback) 617 { 618 if (p_data->link_status.is_activated) 619 { 620 /* only for server */ 621 evt_data.activated.handle = (NFA_HANDLE_GROUP_P2P | local_sap); 622 evt_data.activated.local_link_miu = nfa_p2p_cb.local_link_miu; 623 evt_data.activated.remote_link_miu = nfa_p2p_cb.remote_link_miu; 624 625 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_ACTIVATED_EVT, &evt_data); 626 } 627 else /* if LLCP link is deactivated */ 628 { 629 for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++) 630 { 631 if ( (nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_IN_USE) 632 &&(nfa_p2p_cb.conn_cb[xx].local_sap == local_sap)) 633 { 634 evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx); 635 evt_data.disc.reason = NFA_P2P_DISC_REASON_LLCP_DEACTIVATED; 636 637 nfa_p2p_deallocate_conn_cb (xx); 638 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DISC_EVT, &evt_data); 639 } 640 } 641 642 /* notify deactivation and clear flags */ 643 if (nfa_p2p_cb.sap_cb[local_sap].flags & NFA_P2P_SAP_FLAG_SERVER) 644 { 645 evt_data.deactivated.handle = (NFA_HANDLE_GROUP_P2P | local_sap); 646 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DEACTIVATED_EVT, &evt_data); 647 648 nfa_p2p_cb.sap_cb[local_sap].flags = NFA_P2P_SAP_FLAG_SERVER; 649 } 650 else if (nfa_p2p_cb.sap_cb[local_sap].flags & NFA_P2P_SAP_FLAG_CLIENT) 651 { 652 evt_data.deactivated.handle = (NFA_HANDLE_GROUP_P2P | local_sap); 653 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DEACTIVATED_EVT, &evt_data); 654 655 nfa_p2p_cb.sap_cb[local_sap].flags = NFA_P2P_SAP_FLAG_CLIENT; 656 } 657 else /* if this is not registered service */ 658 { 659 nfa_p2p_cb.sap_cb[local_sap].p_cback = NULL; 660 } 661 } 662 } 663} 664 665/******************************************************************************* 666** 667** Function nfa_p2p_reg_server 668** 669** Description Allocate a service as server and register to LLCP 670** 671** 672** Returns FALSE if need to keep buffer 673** 674*******************************************************************************/ 675bool nfa_p2p_reg_server (tNFA_P2P_MSG *p_msg) 676{ 677 tNFA_P2P_EVT_DATA evt_data; 678 uint8_t server_sap; 679 680 P2P_TRACE_DEBUG0 ("nfa_p2p_reg_server ()"); 681 682 server_sap = LLCP_RegisterServer (p_msg->api_reg_server.server_sap, 683 p_msg->api_reg_server.link_type, 684 p_msg->api_reg_server.service_name, 685 nfa_p2p_llcp_cback); 686 687 if (server_sap == LLCP_INVALID_SAP) 688 { 689 evt_data.reg_server.server_handle = NFA_HANDLE_INVALID; 690 evt_data.reg_server.server_sap = NFA_P2P_INVALID_SAP; 691 strncpy (evt_data.reg_server.service_name, p_msg->api_reg_server.service_name, 692 LLCP_MAX_SN_LEN); 693 evt_data.reg_server.service_name[LLCP_MAX_SN_LEN] = 0; 694 695 p_msg->api_reg_server.p_cback (NFA_P2P_REG_SERVER_EVT, &evt_data); 696 697 return true; 698 } 699 700 /* if need to update WKS in LLCP Gen bytes */ 701 if (server_sap <= LLCP_UPPER_BOUND_WK_SAP) 702 { 703 nfa_p2p_enable_listening (NFA_ID_P2P, true); 704 } 705 else if (!nfa_p2p_cb.is_p2p_listening) 706 { 707 nfa_p2p_enable_listening (NFA_ID_P2P, false); 708 } 709 710 nfa_p2p_cb.sap_cb[server_sap].p_cback = p_msg->api_reg_server.p_cback; 711 nfa_p2p_cb.sap_cb[server_sap].flags = NFA_P2P_SAP_FLAG_SERVER; 712 713 evt_data.reg_server.server_handle = (NFA_HANDLE_GROUP_P2P | server_sap); 714 evt_data.reg_server.server_sap = server_sap; 715 strncpy (evt_data.reg_server.service_name, p_msg->api_reg_server.service_name, 716 LLCP_MAX_SN_LEN); 717 evt_data.reg_server.service_name[LLCP_MAX_SN_LEN] = 0; 718 719 /* notify NFA_P2P_REG_SERVER_EVT to server */ 720 nfa_p2p_cb.sap_cb[server_sap].p_cback (NFA_P2P_REG_SERVER_EVT, &evt_data); 721 722 /* if LLCP is already activated */ 723 if (nfa_p2p_cb.llcp_state == NFA_P2P_LLCP_STATE_ACTIVATED) 724 { 725 evt_data.activated.handle = (NFA_HANDLE_GROUP_P2P | server_sap); 726 evt_data.activated.local_link_miu = nfa_p2p_cb.local_link_miu; 727 evt_data.activated.remote_link_miu = nfa_p2p_cb.remote_link_miu; 728 729 /* notify NFA_P2P_ACTIVATED_EVT to server */ 730 nfa_p2p_cb.sap_cb[server_sap].p_cback (NFA_P2P_ACTIVATED_EVT, &evt_data); 731 } 732 733 return true; 734} 735 736/******************************************************************************* 737** 738** Function nfa_p2p_reg_client 739** 740** Description Allocate a service as client and register to LLCP 741** 742** 743** Returns TRUE to deallocate buffer 744** 745*******************************************************************************/ 746bool nfa_p2p_reg_client (tNFA_P2P_MSG *p_msg) 747{ 748 tNFA_P2P_EVT_DATA evt_data; 749 uint8_t local_sap; 750 751 P2P_TRACE_DEBUG0 ("nfa_p2p_reg_client ()"); 752 753 local_sap = LLCP_RegisterClient (p_msg->api_reg_client.link_type, 754 nfa_p2p_llcp_cback); 755 756 if (local_sap == LLCP_INVALID_SAP) 757 { 758 evt_data.reg_client.client_handle = NFA_HANDLE_INVALID; 759 p_msg->api_reg_client.p_cback (NFA_P2P_REG_CLIENT_EVT, &evt_data); 760 return true; 761 } 762 763 nfa_p2p_cb.sap_cb[local_sap].p_cback = p_msg->api_reg_client.p_cback; 764 nfa_p2p_cb.sap_cb[local_sap].flags = NFA_P2P_SAP_FLAG_CLIENT; 765 766 evt_data.reg_client.client_handle = (NFA_HANDLE_GROUP_P2P | local_sap); 767 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_REG_CLIENT_EVT, &evt_data); 768 769 /* if LLCP is already activated */ 770 if (nfa_p2p_cb.llcp_state == NFA_P2P_LLCP_STATE_ACTIVATED) 771 { 772 evt_data.activated.handle = (NFA_HANDLE_GROUP_P2P | local_sap); 773 evt_data.activated.local_link_miu = nfa_p2p_cb.local_link_miu; 774 evt_data.activated.remote_link_miu = nfa_p2p_cb.remote_link_miu; 775 776 /* notify NFA_P2P_ACTIVATED_EVT to client */ 777 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_ACTIVATED_EVT, &evt_data); 778 } 779 780 return true; 781} 782 783/******************************************************************************* 784** 785** Function nfa_p2p_dereg 786** 787** Description Deallocate a service as server or client and deregister to 788** LLCP. LLCP will deallocate data link connection created by 789** this server 790** 791** Returns TRUE to deallocate buffer 792** 793*******************************************************************************/ 794bool nfa_p2p_dereg (tNFA_P2P_MSG *p_msg) 795{ 796 uint8_t local_sap, xx; 797 798 P2P_TRACE_DEBUG0 ("nfa_p2p_dereg ()"); 799 800 local_sap = (uint8_t) (p_msg->api_dereg.handle & NFA_HANDLE_MASK); 801 802 if (nfa_p2p_cb.sap_cb[local_sap].p_cback) 803 { 804 for (xx = 0; xx < LLCP_MAX_DATA_LINK; xx++) 805 { 806 if ( (nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_IN_USE) 807 &&(nfa_p2p_cb.conn_cb[xx].local_sap == local_sap) ) 808 { 809 nfa_p2p_deallocate_conn_cb (xx); 810 } 811 } 812 } 813 814 LLCP_Deregister (local_sap); 815 nfa_p2p_cb.sap_cb[local_sap].p_cback = NULL; 816 817 if (nfa_p2p_cb.is_p2p_listening) 818 { 819 /* check if this is the last server on NFA P2P */ 820 for (xx = 0; xx < NFA_P2P_NUM_SAP; xx++) 821 { 822 if ( (nfa_p2p_cb.sap_cb[xx].p_cback) 823 &&(nfa_p2p_cb.sap_cb[xx].flags & NFA_P2P_SAP_FLAG_SERVER) ) 824 { 825 break; 826 } 827 } 828 829 if (xx >= NFA_P2P_NUM_SAP) 830 { 831 /* if need to update WKS in LLCP Gen bytes */ 832 if (local_sap <= LLCP_UPPER_BOUND_WK_SAP) 833 nfa_p2p_disable_listening (NFA_ID_P2P, true); 834 else 835 nfa_p2p_disable_listening (NFA_ID_P2P, false); 836 } 837 /* if need to update WKS in LLCP Gen bytes */ 838 else if (local_sap <= LLCP_UPPER_BOUND_WK_SAP) 839 { 840 nfa_p2p_enable_listening (NFA_ID_P2P, true); 841 } 842 } 843 844 return true; 845} 846 847/******************************************************************************* 848** 849** Function nfa_p2p_accept_connection 850** 851** Description Connection Confirm from local application 852** 853** 854** Returns TRUE to deallocate buffer 855** 856*******************************************************************************/ 857bool nfa_p2p_accept_connection (tNFA_P2P_MSG *p_msg) 858{ 859 uint8_t xx; 860 tLLCP_CONNECTION_PARAMS params; 861 862 P2P_TRACE_DEBUG0 ("nfa_p2p_accept_connection ()"); 863 864 xx = (uint8_t) (p_msg->api_accept.conn_handle & NFA_HANDLE_MASK); 865 xx &= ~NFA_P2P_HANDLE_FLAG_CONN; 866 867 params.miu = p_msg->api_accept.miu; 868 params.rw = p_msg->api_accept.rw; 869 params.sn[0] = 0; 870 871 LLCP_ConnectCfm (nfa_p2p_cb.conn_cb[xx].local_sap, nfa_p2p_cb.conn_cb[xx].remote_sap, ¶ms); 872 873 return true; 874} 875 876/******************************************************************************* 877** 878** Function nfa_p2p_reject_connection 879** 880** Description Reject connection by local application 881** 882** 883** Returns TRUE to deallocate buffer 884** 885*******************************************************************************/ 886bool nfa_p2p_reject_connection (tNFA_P2P_MSG *p_msg) 887{ 888 uint8_t xx; 889 890 P2P_TRACE_DEBUG0 ("nfa_p2p_reject_connection ()"); 891 892 xx = (uint8_t) (p_msg->api_reject.conn_handle & NFA_HANDLE_MASK); 893 xx &= ~NFA_P2P_HANDLE_FLAG_CONN; 894 895 LLCP_ConnectReject (nfa_p2p_cb.conn_cb[xx].local_sap, nfa_p2p_cb.conn_cb[xx].remote_sap, 896 LLCP_SAP_DM_REASON_APP_REJECTED); 897 898 /* no need to deregister service on LLCP */ 899 nfa_p2p_deallocate_conn_cb (xx); 900 901 return true; 902} 903 904/******************************************************************************* 905** 906** Function nfa_p2p_disconnect 907** 908** Description Disconnect data link connection by local application 909** 910** 911** Returns TRUE to deallocate buffer 912** 913*******************************************************************************/ 914bool nfa_p2p_disconnect (tNFA_P2P_MSG *p_msg) 915{ 916 uint8_t local_sap, xx; 917 tLLCP_STATUS status; 918 tNFA_P2P_EVT_DATA evt_data; 919 920 P2P_TRACE_DEBUG0 ("nfa_p2p_disconnect ()"); 921 922 xx = (uint8_t) (p_msg->api_disconnect.conn_handle & NFA_HANDLE_MASK); 923 924 /* if this is for data link connection */ 925 if (xx & NFA_P2P_HANDLE_FLAG_CONN) 926 { 927 xx &= ~NFA_P2P_HANDLE_FLAG_CONN; 928 929 status = LLCP_DisconnectReq (nfa_p2p_cb.conn_cb[xx].local_sap, nfa_p2p_cb.conn_cb[xx].remote_sap, 930 p_msg->api_disconnect.flush); 931 932 if (status == LLCP_STATUS_SUCCESS) 933 { 934 /* wait for disconnect response if successful */ 935 return true; 936 } 937 else 938 { 939 /* 940 ** while we are waiting for connect confirm, 941 ** we cannot sent DISC because we don't know DSAP yet 942 */ 943 local_sap = nfa_p2p_cb.conn_cb[xx].local_sap; 944 945 if (nfa_p2p_cb.sap_cb[local_sap].p_cback) 946 { 947 evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx); 948 evt_data.disc.reason = NFA_P2P_DISC_REASON_LOCAL_INITITATE; 949 950 nfa_p2p_deallocate_conn_cb (xx); 951 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DISC_EVT, &evt_data); 952 } 953 } 954 } 955 else 956 { 957 P2P_TRACE_ERROR0 ("Handle is not for Data link connection"); 958 } 959 960 return true; 961} 962 963/******************************************************************************* 964** 965** Function nfa_p2p_create_data_link_connection 966** 967** Description Create data link connection 968** 969** 970** Returns TRUE to deallocate buffer 971** 972*******************************************************************************/ 973bool nfa_p2p_create_data_link_connection (tNFA_P2P_MSG *p_msg) 974{ 975 uint8_t local_sap; 976 tNFA_P2P_EVT_DATA evt_data; 977 tLLCP_CONNECTION_PARAMS conn_params; 978 tLLCP_STATUS status; 979 980 P2P_TRACE_DEBUG0 ("nfa_p2p_create_data_link_connection ()"); 981 982 local_sap = (uint8_t) (p_msg->api_connect.client_handle & NFA_HANDLE_MASK); 983 984 conn_params.miu = p_msg->api_connect.miu; 985 conn_params.rw = p_msg->api_connect.rw; 986 987 /* NFA_P2pConnectBySap () */ 988 if (p_msg->api_connect.dsap != LLCP_INVALID_SAP) 989 { 990 conn_params.sn[0] = 0; 991 status = LLCP_ConnectReq (local_sap, p_msg->api_connect.dsap, &conn_params); 992 } 993 /* NFA_P2pConnectByName () */ 994 else 995 { 996 strncpy (conn_params.sn, p_msg->api_connect.service_name, LLCP_MAX_SN_LEN); 997 conn_params.sn[LLCP_MAX_SN_LEN] = 0; 998 999 status = LLCP_ConnectReq (local_sap, LLCP_SAP_SDP, &conn_params); 1000 } 1001 1002 if (status != LLCP_STATUS_SUCCESS) 1003 { 1004 evt_data.disc.handle = (NFA_HANDLE_GROUP_P2P | local_sap); 1005 evt_data.disc.reason = NFA_P2P_DISC_REASON_NO_INFORMATION; 1006 1007 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_DISC_EVT, &evt_data); 1008 } 1009 1010 return true; 1011} 1012 1013/******************************************************************************* 1014** 1015** Function nfa_p2p_send_ui 1016** 1017** Description Send UI PDU 1018** 1019** 1020** Returns TRUE to deallocate buffer 1021** 1022*******************************************************************************/ 1023bool nfa_p2p_send_ui (tNFA_P2P_MSG *p_msg) 1024{ 1025 uint8_t local_sap; 1026 tLLCP_STATUS status; 1027 tNFA_P2P_EVT_DATA evt_data; 1028 1029 P2P_TRACE_DEBUG0 ("nfa_p2p_send_ui ()"); 1030 1031 local_sap = (uint8_t) (p_msg->api_send_ui.handle & NFA_HANDLE_MASK); 1032 1033 /* decrease number of tx UI PDU which is not processed by NFA for congestion control */ 1034 if (nfa_p2p_cb.sap_cb[local_sap].num_pending_ui_pdu) 1035 nfa_p2p_cb.sap_cb[local_sap].num_pending_ui_pdu--; 1036 1037 if (nfa_p2p_cb.total_pending_ui_pdu) 1038 nfa_p2p_cb.total_pending_ui_pdu--; 1039 1040 status = LLCP_SendUI (local_sap, 1041 p_msg->api_send_ui.dsap, 1042 p_msg->api_send_ui.p_msg); 1043 1044 if (status == LLCP_STATUS_CONGESTED) 1045 { 1046 if (!(nfa_p2p_cb.sap_cb[local_sap].flags & NFA_P2P_SAP_FLAG_LLINK_CONGESTED)) 1047 { 1048 nfa_p2p_cb.sap_cb[local_sap].flags |= NFA_P2P_SAP_FLAG_LLINK_CONGESTED; 1049 1050 /* notify that this logical link is congested */ 1051 evt_data.congest.link_type = NFA_P2P_LLINK_TYPE; 1052 evt_data.congest.handle = (NFA_HANDLE_GROUP_P2P | local_sap); 1053 evt_data.congest.is_congested = true; 1054 1055 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_CONGEST_EVT, &evt_data); 1056 } 1057 } 1058 1059 return true; 1060} 1061 1062/******************************************************************************* 1063** 1064** Function nfa_p2p_send_data 1065** 1066** Description Send I PDU 1067** 1068** 1069** Returns TRUE to deallocate buffer 1070** 1071*******************************************************************************/ 1072bool nfa_p2p_send_data (tNFA_P2P_MSG *p_msg) 1073{ 1074 tNFA_P2P_EVT_DATA evt_data; 1075 tLLCP_STATUS status; 1076 uint8_t xx; 1077 1078 P2P_TRACE_DEBUG0 ("nfa_p2p_send_data ()"); 1079 1080 xx = (uint8_t) (p_msg->api_send_data.conn_handle & NFA_HANDLE_MASK); 1081 xx &= ~NFA_P2P_HANDLE_FLAG_CONN; 1082 1083 /* decrease number of tx I PDU which is not processed by NFA for congestion control */ 1084 if (nfa_p2p_cb.conn_cb[xx].num_pending_i_pdu) 1085 nfa_p2p_cb.conn_cb[xx].num_pending_i_pdu--; 1086 1087 if (nfa_p2p_cb.total_pending_i_pdu) 1088 nfa_p2p_cb.total_pending_i_pdu--; 1089 1090 status = LLCP_SendData (nfa_p2p_cb.conn_cb[xx].local_sap, 1091 nfa_p2p_cb.conn_cb[xx].remote_sap, 1092 p_msg->api_send_data.p_msg); 1093 1094 if (status == LLCP_STATUS_CONGESTED) 1095 { 1096 if (!(nfa_p2p_cb.conn_cb[xx].flags & NFA_P2P_CONN_FLAG_CONGESTED)) 1097 { 1098 nfa_p2p_cb.conn_cb[xx].flags |= NFA_P2P_CONN_FLAG_CONGESTED; 1099 1100 /* notify that this data link is congested */ 1101 evt_data.congest.link_type = NFA_P2P_DLINK_TYPE; 1102 evt_data.congest.handle = (NFA_HANDLE_GROUP_P2P | NFA_P2P_HANDLE_FLAG_CONN | xx); 1103 evt_data.congest.is_congested = true; 1104 1105 nfa_p2p_cb.sap_cb[nfa_p2p_cb.conn_cb[xx].local_sap].p_cback (NFA_P2P_CONGEST_EVT, &evt_data); 1106 } 1107 } 1108 1109 return true; 1110} 1111 1112/******************************************************************************* 1113** 1114** Function nfa_p2p_set_local_busy 1115** 1116** Description Set or reset local busy 1117** 1118** 1119** Returns TRUE to deallocate buffer 1120** 1121*******************************************************************************/ 1122bool nfa_p2p_set_local_busy (tNFA_P2P_MSG *p_msg) 1123{ 1124 uint8_t xx; 1125 1126 P2P_TRACE_DEBUG0 ("nfa_p2p_set_local_busy ()"); 1127 1128 xx = (uint8_t) (p_msg->api_local_busy.conn_handle & NFA_HANDLE_MASK); 1129 xx &= ~NFA_P2P_HANDLE_FLAG_CONN; 1130 1131 LLCP_SetLocalBusyStatus (nfa_p2p_cb.conn_cb[xx].local_sap, 1132 nfa_p2p_cb.conn_cb[xx].remote_sap, 1133 p_msg->api_local_busy.is_busy); 1134 1135 return true; 1136} 1137 1138/******************************************************************************* 1139** 1140** Function nfa_p2p_get_link_info 1141** 1142** Description Get WKS of remote and link MIU 1143** 1144** 1145** Returns TRUE to deallocate buffer 1146** 1147*******************************************************************************/ 1148bool nfa_p2p_get_link_info (tNFA_P2P_MSG *p_msg) 1149{ 1150 tNFA_P2P_EVT_DATA evt_data; 1151 uint8_t local_sap; 1152 1153 P2P_TRACE_DEBUG0 ("nfa_p2p_get_link_info ()"); 1154 1155 evt_data.link_info.handle = p_msg->api_link_info.handle; 1156 evt_data.link_info.wks = LLCP_GetRemoteWKS (); 1157 evt_data.link_info.local_link_miu = nfa_p2p_cb.local_link_miu; 1158 evt_data.link_info.remote_link_miu = nfa_p2p_cb.remote_link_miu; 1159 1160 local_sap = (uint8_t) (p_msg->api_link_info.handle & NFA_HANDLE_MASK); 1161 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_LINK_INFO_EVT, &evt_data); 1162 1163 return true; 1164} 1165 1166/******************************************************************************* 1167** 1168** Function nfa_p2p_get_remote_sap 1169** 1170** Description Get remote SAP 1171** 1172** 1173** Returns TRUE to deallocate buffer 1174** 1175*******************************************************************************/ 1176bool nfa_p2p_get_remote_sap (tNFA_P2P_MSG *p_msg) 1177{ 1178 tNFA_P2P_EVT_DATA evt_data; 1179 uint8_t local_sap; 1180 1181 P2P_TRACE_DEBUG0 ("nfa_p2p_get_remote_sap ()"); 1182 1183 local_sap = (uint8_t) (p_msg->api_remote_sap.handle & NFA_HANDLE_MASK); 1184 1185 if (!nfa_p2p_start_sdp (p_msg->api_remote_sap.service_name, 1186 local_sap)) 1187 { 1188 evt_data.sdp.handle = p_msg->api_remote_sap.handle; 1189 evt_data.sdp.remote_sap = 0x00; 1190 nfa_p2p_cb.sap_cb[local_sap].p_cback (NFA_P2P_SDP_EVT, &evt_data); 1191 } 1192 1193 return true; 1194} 1195 1196/******************************************************************************* 1197** 1198** Function nfa_p2p_set_llcp_cfg 1199** 1200** Description Set LLCP configuration 1201** 1202** 1203** Returns TRUE to deallocate buffer 1204** 1205*******************************************************************************/ 1206bool nfa_p2p_set_llcp_cfg (tNFA_P2P_MSG *p_msg) 1207{ 1208 LLCP_SetConfig (p_msg->api_set_llcp_cfg.link_miu, 1209 p_msg->api_set_llcp_cfg.opt, 1210 p_msg->api_set_llcp_cfg.wt, 1211 p_msg->api_set_llcp_cfg.link_timeout, 1212 p_msg->api_set_llcp_cfg.inact_timeout_init, 1213 p_msg->api_set_llcp_cfg.inact_timeout_target, 1214 p_msg->api_set_llcp_cfg.symm_delay, 1215 p_msg->api_set_llcp_cfg.data_link_timeout, 1216 p_msg->api_set_llcp_cfg.delay_first_pdu_timeout); 1217 1218 return true; 1219} 1220 1221/******************************************************************************* 1222** 1223** Function nfa_p2p_restart_rf_discovery 1224** 1225** Description Restart RF discovery by deactivating to IDLE 1226** 1227** 1228** Returns TRUE to deallocate buffer 1229** 1230*******************************************************************************/ 1231bool nfa_p2p_restart_rf_discovery (tNFA_P2P_MSG *p_msg) 1232{ 1233 P2P_TRACE_DEBUG0 ("nfa_p2p_restart_rf_discovery ()"); 1234 1235 nfa_dm_rf_deactivate (NFA_DEACTIVATE_TYPE_IDLE); 1236 1237 return true; 1238} 1239