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