1 /* 2 * Copyright (C) 2010 NXP Semiconductors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <phNfcTypes.h> 18 #include <phLibNfc.h> 19 #include <phLibNfc_Internal.h> 20 #include <phFriNfc_Llcp.h> 21 #include <phFriNfc_LlcpTransport.h> 22 23 /* ---------------------------- Internal macros -------------------------------- */ 24 25 #ifndef STATIC_DISABLE 26 #define STATIC static 27 #else 28 #define STATIC 29 #endif 30 31 /* ----------------------- Internal functions headers -------------------------- */ 32 33 STATIC 34 NFCSTATUS static_CheckState(); 35 36 STATIC 37 NFCSTATUS static_CheckDevice(phLibNfc_Handle hRemoteDevice); 38 39 STATIC 40 void phLibNfc_Llcp_CheckLlcp_Cb(void *pContext,NFCSTATUS status); 41 42 STATIC 43 void phLibNfc_Llcp_Link_Cb(void *pContext,phLibNfc_Llcp_eLinkStatus_t status); 44 45 /* --------------------------- Internal functions ------------------------------ */ 46 47 STATIC NFCSTATUS static_CheckState() 48 { 49 /* Check if the global context is set */ 50 if(gpphLibContext == NULL) 51 { 52 return NFCSTATUS_NOT_INITIALISED; 53 } 54 55 /* Check if initialized */ 56 if(gpphLibContext->LibNfcState.cur_state == eLibNfcHalStateShutdown) 57 { 58 return NFCSTATUS_NOT_INITIALISED; 59 } 60 61 /* Check if shutting down */ 62 if(gpphLibContext->LibNfcState.next_state == eLibNfcHalStateShutdown) 63 { 64 return NFCSTATUS_SHUTDOWN; 65 } 66 67 return NFCSTATUS_SUCCESS; 68 } 69 70 STATIC NFCSTATUS static_CheckDevice(phLibNfc_Handle hRemoteDevice) 71 { 72 phLibNfc_sRemoteDevInformation_t* psRemoteDevInfo = (phLibNfc_sRemoteDevInformation_t*)hRemoteDevice; 73 74 if (hRemoteDevice == NULL) 75 { 76 return NFCSTATUS_INVALID_PARAMETER; 77 } 78 79 /* If local device is the Initiator (remote is Target), 80 * check if connection is correct 81 */ 82 if (psRemoteDevInfo->RemDevType == phHal_eNfcIP1_Target) 83 { 84 /* Check if any device connected */ 85 if(gpphLibContext->Connected_handle == 0) 86 { 87 return NFCSTATUS_TARGET_NOT_CONNECTED; 88 } 89 90 /* Check if handle corresponds to connected one */ 91 if(hRemoteDevice != gpphLibContext->Connected_handle) 92 { 93 return NFCSTATUS_INVALID_HANDLE; 94 } 95 } 96 97 /* Check if previous callback is pending or if remote peer is not LLCP compliant */ 98 if ((gpphLibContext->status.GenCb_pending_status == TRUE) || 99 (gpphLibContext->llcp_cntx.bIsLlcp == FALSE)) 100 { 101 return NFCSTATUS_REJECTED; 102 } 103 104 return NFCSTATUS_SUCCESS; 105 } 106 107 /* ---------------------------- Public functions ------------------------------- */ 108 109 NFCSTATUS phLibNfc_Mgt_SetLlcp_ConfigParams( phLibNfc_Llcp_sLinkParameters_t* pConfigInfo, 110 pphLibNfc_RspCb_t pConfigRspCb, 111 void* pContext 112 ) 113 { 114 NFCSTATUS result; 115 phNfc_sData_t sGeneralBytesBuffer; 116 phLibNfc_sNfcIPCfg_t sNfcIPCfg; 117 const uint8_t pMagicBuffer[] = { 0x46, 0x66, 0x6D }; 118 119 /* State checking */ 120 result = static_CheckState(); 121 if (result != NFCSTATUS_SUCCESS) 122 { 123 return result; 124 } 125 126 /* Parameters checking */ 127 if ((pConfigInfo == NULL) || (pConfigRspCb == NULL)) 128 { 129 return NFCSTATUS_INVALID_PARAMETER; 130 } 131 132 /* Save the config for later use */ 133 memcpy( &gpphLibContext->llcp_cntx.sLocalParams, 134 pConfigInfo, 135 sizeof(phLibNfc_Llcp_sLinkParameters_t) ); 136 137 /* Copy magic number in NFCIP General Bytes */ 138 memcpy(sNfcIPCfg.generalBytes, pMagicBuffer, sizeof(pMagicBuffer)); 139 sNfcIPCfg.generalBytesLength = sizeof(pMagicBuffer); 140 141 /* Encode link parameters in TLV to configure P2P General Bytes */ 142 sGeneralBytesBuffer.buffer = sNfcIPCfg.generalBytes + sizeof(pMagicBuffer); 143 sGeneralBytesBuffer.length = sizeof(sNfcIPCfg.generalBytes) - sizeof(pMagicBuffer); 144 result = phFriNfc_Llcp_EncodeLinkParams( &sGeneralBytesBuffer, 145 pConfigInfo, 146 PHFRINFC_LLCP_VERSION); 147 if (result != NFCSTATUS_SUCCESS) 148 { 149 return PHNFCSTATUS(result); 150 } 151 sNfcIPCfg.generalBytesLength += (uint8_t)sGeneralBytesBuffer.length; 152 153 /* Set the P2P general bytes */ 154 result = phLibNfc_Mgt_SetP2P_ConfigParams(&sNfcIPCfg, pConfigRspCb, pContext); 155 if (result != NFCSTATUS_PENDING) 156 { 157 return PHNFCSTATUS(result); 158 } 159 160 /* Resets the LLCP LLC component */ 161 result = phFriNfc_Llcp_Reset( &gpphLibContext->llcp_cntx.sLlcpContext, 162 gpphLibContext->psOverHalCtxt, 163 pConfigInfo, 164 gpphLibContext->llcp_cntx.pRxBuffer, 165 sizeof(gpphLibContext->llcp_cntx.pRxBuffer), 166 gpphLibContext->llcp_cntx.pTxBuffer, 167 sizeof(gpphLibContext->llcp_cntx.pTxBuffer), 168 phLibNfc_Llcp_Link_Cb, 169 gpphLibContext); 170 if (result != NFCSTATUS_SUCCESS) 171 { 172 return PHNFCSTATUS(result); 173 } 174 175 /* Resets the LLCP Transport component */ 176 result = phFriNfc_LlcpTransport_Reset( &gpphLibContext->llcp_cntx.sLlcpTransportContext, 177 &gpphLibContext->llcp_cntx.sLlcpContext ); 178 if (result != NFCSTATUS_SUCCESS) 179 { 180 return PHNFCSTATUS(result); 181 } 182 183 return NFCSTATUS_PENDING; 184 } 185 186 NFCSTATUS phLibNfc_Llcp_CheckLlcp( phLibNfc_Handle hRemoteDevice, 187 pphLibNfc_ChkLlcpRspCb_t pCheckLlcp_RspCb, 188 pphLibNfc_LlcpLinkStatusCb_t pLink_Cb, 189 void* pContext 190 ) 191 { 192 NFCSTATUS result; 193 phLibNfc_sRemoteDevInformation_t* psRemoteDevInfo = (phLibNfc_sRemoteDevInformation_t*)hRemoteDevice; 194 195 /* State checking */ 196 result = static_CheckState(); 197 if (result != NFCSTATUS_SUCCESS) 198 { 199 return result; 200 } 201 202 /* Parameters checking */ 203 if ((hRemoteDevice == 0) || 204 (pCheckLlcp_RspCb == NULL) || 205 (pLink_Cb == NULL)) 206 { 207 return NFCSTATUS_INVALID_PARAMETER; 208 } 209 210 /* If local device is the Initiator (remote is Target), 211 * check if connection is correct 212 */ 213 if (psRemoteDevInfo->RemDevType == phHal_eNfcIP1_Target) 214 { 215 /* Check if any device connected */ 216 if(gpphLibContext->Connected_handle == 0) 217 { 218 return NFCSTATUS_TARGET_NOT_CONNECTED; 219 } 220 221 /* Check if handle corresponds to connected one */ 222 if(hRemoteDevice != gpphLibContext->Connected_handle) 223 { 224 return NFCSTATUS_INVALID_HANDLE; 225 } 226 } 227 228 /* Prepare callback */ 229 gpphLibContext->CBInfo.pClientLlcpLinkCb = pLink_Cb; 230 gpphLibContext->CBInfo.pClientLlcpLinkCntx = pContext; 231 232 // DEBUG: Reset at least the state 233 gpphLibContext->llcp_cntx.sLlcpContext.state = 0; 234 235 /* Prepare callback */ 236 gpphLibContext->CBInfo.pClientLlcpCheckRespCb = pCheckLlcp_RspCb; 237 gpphLibContext->CBInfo.pClientLlcpCheckRespCntx = pContext; 238 239 /* Update state */ 240 result = phLibNfc_UpdateNextState(gpphLibContext, eLibNfcHalStateTransaction); 241 if (result != NFCSTATUS_SUCCESS) 242 { 243 return result; 244 } 245 246 /* Call the component function */ 247 result = phFriNfc_Llcp_ChkLlcp( &gpphLibContext->llcp_cntx.sLlcpContext, 248 psRemoteDevInfo, 249 phLibNfc_Llcp_CheckLlcp_Cb, 250 gpphLibContext 251 ); 252 result = PHNFCSTATUS(result); 253 if (result == NFCSTATUS_PENDING) 254 { 255 gpphLibContext->status.GenCb_pending_status = TRUE; 256 } 257 else if (result == NFCSTATUS_SUCCESS) 258 { 259 /* Nothing to do */ 260 } 261 else if (result != NFCSTATUS_FAILED) 262 { 263 result = NFCSTATUS_TARGET_LOST; 264 } 265 266 return result; 267 } 268 269 /* LLCP link callback */ 270 STATIC 271 void phLibNfc_Llcp_Link_Cb(void *pContext, phLibNfc_Llcp_eLinkStatus_t status) 272 { 273 phLibNfc_LibContext_t *pLibNfc_Ctxt = (phLibNfc_LibContext_t *)pContext; 274 pphLibNfc_LlcpLinkStatusCb_t pClientCb = NULL; 275 void *pClientContext = NULL; 276 277 if(pLibNfc_Ctxt != gpphLibContext) 278 { 279 /*wrong context returned from below layer*/ 280 phOsalNfc_RaiseException(phOsalNfc_e_InternalErr,1); 281 } 282 else 283 { 284 /* Close all sockets */ 285 phFriNfc_LlcpTransport_CloseAll(&gpphLibContext->llcp_cntx.sLlcpTransportContext); 286 287 /* Copy callback details */ 288 pClientCb = gpphLibContext->CBInfo.pClientLlcpLinkCb; 289 pClientContext = gpphLibContext->CBInfo.pClientLlcpLinkCntx; 290 291 /* Trigger the callback */ 292 if(pClientCb != NULL) 293 { 294 pClientCb(pClientContext, status); 295 } 296 } 297 } 298 299 /* Response callback for phLibNfc_Ndef_CheckNdef */ 300 STATIC 301 void phLibNfc_Llcp_CheckLlcp_Cb(void *pContext, NFCSTATUS status) 302 { 303 phLibNfc_LibContext_t *pLibNfc_Ctxt = (phLibNfc_LibContext_t *)pContext; 304 NFCSTATUS RetStatus = NFCSTATUS_SUCCESS; 305 pphLibNfc_ChkLlcpRspCb_t pClientCb = NULL; 306 void *pClientContext = NULL; 307 308 if(pLibNfc_Ctxt != gpphLibContext) 309 { 310 /*wrong context returned from below layer*/ 311 phOsalNfc_RaiseException(phOsalNfc_e_InternalErr,1); 312 } 313 else 314 { 315 if(gpphLibContext->LibNfcState.next_state == eLibNfcHalStateShutdown) 316 { 317 /*shutdown called before completion of check Ndef, allow shutdown to happen */ 318 phLibNfc_Pending_Shutdown(); 319 RetStatus = NFCSTATUS_SHUTDOWN; 320 } 321 else if(gpphLibContext->LibNfcState.next_state == eLibNfcHalStateRelease) 322 { 323 RetStatus = NFCSTATUS_ABORTED; 324 } 325 else 326 { 327 if(status == NFCSTATUS_SUCCESS) 328 { 329 /* Remote peer is LLCP compliant */ 330 gpphLibContext->llcp_cntx.bIsLlcp = TRUE; 331 } 332 else if(PHNFCSTATUS(status)== NFCSTATUS_FAILED) 333 { 334 RetStatus = NFCSTATUS_FAILED; 335 gpphLibContext->llcp_cntx.bIsLlcp = FALSE; 336 } 337 else 338 { 339 RetStatus = NFCSTATUS_TARGET_LOST; 340 } 341 } 342 343 /* Update the current state */ 344 gpphLibContext->status.GenCb_pending_status = FALSE; 345 phLibNfc_UpdateCurState(RetStatus,gpphLibContext); 346 347 /* Copy callback details */ 348 pClientCb = gpphLibContext->CBInfo.pClientLlcpCheckRespCb; 349 pClientContext = gpphLibContext->CBInfo.pClientLlcpCheckRespCntx; 350 351 /* Reset saved callback */ 352 gpphLibContext->CBInfo.pClientCkNdefCb = NULL; 353 gpphLibContext->CBInfo.pClientCkNdefCntx = NULL; 354 355 /* Trigger the callback */ 356 if(pClientCb != NULL) 357 { 358 pClientCb(pClientContext,RetStatus); 359 } 360 } 361 } 362 363 NFCSTATUS phLibNfc_Llcp_Activate( phLibNfc_Handle hRemoteDevice ) 364 { 365 NFCSTATUS result; 366 367 /* State checking */ 368 result = static_CheckState(); 369 if (result != NFCSTATUS_SUCCESS) 370 { 371 return result; 372 } 373 374 /* Parameters checking */ 375 if (hRemoteDevice == 0) 376 { 377 return NFCSTATUS_INVALID_PARAMETER; 378 } 379 380 /* Check device */ 381 result = static_CheckDevice(hRemoteDevice); 382 if (result != NFCSTATUS_SUCCESS) 383 { 384 return result; 385 } 386 387 /* Start activation */ 388 result = phFriNfc_Llcp_Activate(&gpphLibContext->llcp_cntx.sLlcpContext); 389 390 return PHNFCSTATUS(result); 391 } 392 393 NFCSTATUS phLibNfc_Llcp_Deactivate( phLibNfc_Handle hRemoteDevice ) 394 { 395 NFCSTATUS result; 396 397 /* State checking */ 398 result = static_CheckState(); 399 if (result != NFCSTATUS_SUCCESS) 400 { 401 return result; 402 } 403 404 /* Parameters checking */ 405 if (hRemoteDevice == 0) 406 { 407 return NFCSTATUS_INVALID_PARAMETER; 408 } 409 410 /* Check device */ 411 result = static_CheckDevice(hRemoteDevice); 412 if (result != NFCSTATUS_SUCCESS) 413 { 414 return result; 415 } 416 417 /* Start deactivation */ 418 result = phFriNfc_Llcp_Deactivate(&gpphLibContext->llcp_cntx.sLlcpContext); 419 420 return PHNFCSTATUS(result); 421 } 422 423 NFCSTATUS phLibNfc_Llcp_GetLocalInfo( phLibNfc_Handle hRemoteDevice, 424 phLibNfc_Llcp_sLinkParameters_t* pConfigInfo 425 ) 426 { 427 NFCSTATUS result; 428 429 /* State checking */ 430 result = static_CheckState(); 431 if (result != NFCSTATUS_SUCCESS) 432 { 433 return result; 434 } 435 436 /* Parameters checking */ 437 if (pConfigInfo == NULL) 438 { 439 return NFCSTATUS_INVALID_PARAMETER; 440 } 441 442 /* Get local infos */ 443 result = phFriNfc_Llcp_GetLocalInfo(&gpphLibContext->llcp_cntx.sLlcpContext, pConfigInfo); 444 445 return PHNFCSTATUS(result); 446 } 447 448 NFCSTATUS phLibNfc_Llcp_GetRemoteInfo( phLibNfc_Handle hRemoteDevice, 449 phLibNfc_Llcp_sLinkParameters_t* pConfigInfo 450 ) 451 { 452 NFCSTATUS result; 453 454 /* State checking */ 455 result = static_CheckState(); 456 if (result != NFCSTATUS_SUCCESS) 457 { 458 return result; 459 } 460 461 /* Parameters checking */ 462 if ((hRemoteDevice == 0) || 463 (pConfigInfo == NULL)) 464 { 465 return NFCSTATUS_INVALID_PARAMETER; 466 } 467 468 /* Check device */ 469 result = static_CheckDevice(hRemoteDevice); 470 if (result != NFCSTATUS_SUCCESS) 471 { 472 return result; 473 } 474 475 /* Get local infos */ 476 result = phFriNfc_Llcp_GetRemoteInfo(&gpphLibContext->llcp_cntx.sLlcpContext, pConfigInfo); 477 478 return PHNFCSTATUS(result); 479 } 480 481 NFCSTATUS phLibNfc_Llcp_Socket( phLibNfc_Llcp_eSocketType_t eType, 482 phLibNfc_Llcp_sSocketOptions_t* psOptions, 483 phNfc_sData_t* psWorkingBuffer, 484 phLibNfc_Handle* phSocket, 485 pphLibNfc_LlcpSocketErrCb_t pErr_Cb, 486 void* pContext 487 ) 488 { 489 NFCSTATUS result; 490 phFriNfc_LlcpTransport_Socket_t *psSocket; 491 492 /* State checking */ 493 result = static_CheckState(); 494 if (result != NFCSTATUS_SUCCESS) 495 { 496 return result; 497 } 498 499 /* Parameters checking */ 500 /* NOTE: Transport Layer test psOption and psWorkingBuffer value */ 501 if ((phSocket == NULL) || 502 (pErr_Cb == NULL)) 503 { 504 return NFCSTATUS_INVALID_PARAMETER; 505 } 506 507 /* Get local infos */ 508 result = phFriNfc_LlcpTransport_Socket(&gpphLibContext->llcp_cntx.sLlcpTransportContext, 509 eType, 510 psOptions, 511 psWorkingBuffer, 512 &psSocket, 513 pErr_Cb, 514 pContext); 515 516 /* Send back the socket handle */ 517 *phSocket = (phLibNfc_Handle)psSocket; 518 519 return PHNFCSTATUS(result); 520 } 521 522 NFCSTATUS phLibNfc_Llcp_Close( phLibNfc_Handle hSocket ) 523 { 524 NFCSTATUS result; 525 phFriNfc_LlcpTransport_Socket_t *psSocket = (phFriNfc_LlcpTransport_Socket_t*)hSocket; 526 527 /* State checking */ 528 result = static_CheckState(); 529 if (result != NFCSTATUS_SUCCESS) 530 { 531 return result; 532 } 533 534 /* Parameters checking */ 535 if (hSocket == 0) 536 { 537 return NFCSTATUS_INVALID_PARAMETER; 538 } 539 540 /* Get local infos */ 541 /* TODO: if connected abort and close else close only */ 542 result = phFriNfc_LlcpTransport_Close(psSocket); 543 544 return PHNFCSTATUS(result); 545 } 546 547 NFCSTATUS phLibNfc_Llcp_SocketGetLocalOptions( phLibNfc_Handle hSocket, 548 phLibNfc_Llcp_sSocketOptions_t* psLocalOptions 549 ) 550 { 551 NFCSTATUS result; 552 phFriNfc_LlcpTransport_Socket_t *psSocket = (phFriNfc_LlcpTransport_Socket_t*)hSocket; 553 554 /* State checking */ 555 result = static_CheckState(); 556 if (result != NFCSTATUS_SUCCESS) 557 { 558 return result; 559 } 560 561 /* Parameters checking */ 562 if ((hSocket == 0) || 563 (psLocalOptions == NULL)) 564 { 565 return NFCSTATUS_INVALID_PARAMETER; 566 } 567 568 /* Get local options */ 569 result = phFriNfc_LlcpTransport_SocketGetLocalOptions(psSocket, psLocalOptions); 570 571 return PHNFCSTATUS(result); 572 } 573 574 NFCSTATUS phLibNfc_Llcp_SocketGetRemoteOptions( phLibNfc_Handle hRemoteDevice, 575 phLibNfc_Handle hSocket, 576 phLibNfc_Llcp_sSocketOptions_t* psRemoteOptions 577 ) 578 { 579 NFCSTATUS result; 580 phFriNfc_LlcpTransport_Socket_t *psSocket = (phFriNfc_LlcpTransport_Socket_t*)hSocket; 581 582 LLCP_PRINT("phLibNfc_Llcp_SocketGetRemoteOptions"); 583 584 /* State checking */ 585 result = static_CheckState(); 586 if (result != NFCSTATUS_SUCCESS) 587 { 588 return result; 589 } 590 591 /* Parameters checking */ 592 if ((hRemoteDevice == 0) || 593 (hSocket == 0) || 594 (psRemoteOptions == NULL)) 595 { 596 return NFCSTATUS_INVALID_PARAMETER; 597 } 598 599 /* Check device */ 600 result = static_CheckDevice(hRemoteDevice); 601 if (result != NFCSTATUS_SUCCESS) 602 { 603 return result; 604 } 605 606 /* Get remote infos */ 607 result = phFriNfc_LlcpTransport_SocketGetRemoteOptions(psSocket, psRemoteOptions); 608 609 return PHNFCSTATUS(result); 610 } 611 612 NFCSTATUS phLibNfc_Llcp_Bind( phLibNfc_Handle hSocket, 613 uint8_t nSap 614 ) 615 { 616 NFCSTATUS result; 617 phFriNfc_LlcpTransport_Socket_t *psSocket = (phFriNfc_LlcpTransport_Socket_t*)hSocket; 618 619 LLCP_PRINT("phLibNfc_Llcp_Bind"); 620 621 /* State checking */ 622 result = static_CheckState(); 623 if (result != NFCSTATUS_SUCCESS) 624 { 625 return result; 626 } 627 628 /* Parameters checking */ 629 if (hSocket == 0) 630 { 631 return NFCSTATUS_INVALID_PARAMETER; 632 } 633 634 /* Bind the socket to the designated port */ 635 result = phFriNfc_LlcpTransport_Bind(psSocket, nSap); 636 637 return PHNFCSTATUS(result); 638 } 639 640 NFCSTATUS phLibNfc_Llcp_Listen( phLibNfc_Handle hSocket, 641 phNfc_sData_t *psServiceName, 642 pphLibNfc_LlcpSocketListenCb_t pListen_Cb, 643 void* pContext 644 ) 645 { 646 NFCSTATUS result; 647 phFriNfc_LlcpTransport_Socket_t *psSocket = (phFriNfc_LlcpTransport_Socket_t*)hSocket; 648 649 LLCP_PRINT("phLibNfc_Llcp_Listen"); 650 651 /* State checking */ 652 result = static_CheckState(); 653 if (result != NFCSTATUS_SUCCESS) 654 { 655 return result; 656 } 657 658 /* Parameters checking */ 659 /* NOTE : psServiceName may be NULL, do not test it ! */ 660 if ((hSocket == 0) || 661 (pListen_Cb == NULL)) 662 { 663 return NFCSTATUS_INVALID_PARAMETER; 664 } 665 666 /* Start listening for incoming connections */ 667 result = phFriNfc_LlcpTransport_Listen( psSocket, 668 psServiceName, 669 (pphFriNfc_LlcpTransportSocketListenCb_t)pListen_Cb, 670 pContext ); 671 672 return PHNFCSTATUS(result); 673 } 674 675 NFCSTATUS phLibNfc_Llcp_Accept( phLibNfc_Handle hSocket, 676 phLibNfc_Llcp_sSocketOptions_t* psOptions, 677 phNfc_sData_t* psWorkingBuffer, 678 pphLibNfc_LlcpSocketErrCb_t pErr_Cb, 679 pphLibNfc_LlcpSocketAcceptCb_t pAccept_RspCb, 680 void* pContext 681 ) 682 { 683 NFCSTATUS result; 684 phFriNfc_LlcpTransport_Socket_t *psSocket = (phFriNfc_LlcpTransport_Socket_t*)hSocket; 685 686 LLCP_PRINT("phLibNfc_Llcp_Accept"); 687 688 /* State checking */ 689 result = static_CheckState(); 690 if (result != NFCSTATUS_SUCCESS) 691 { 692 return result; 693 } 694 695 /* Parameters checking */ 696 if ((hSocket == 0) || 697 (psOptions == NULL) || 698 (psWorkingBuffer == NULL) || 699 (pErr_Cb == NULL) || 700 (pAccept_RspCb == NULL)) 701 { 702 return NFCSTATUS_INVALID_PARAMETER; 703 } 704 705 /* Accept incoming connection */ 706 result = phFriNfc_LlcpTransport_Accept( psSocket, 707 psOptions, 708 psWorkingBuffer, 709 pErr_Cb, 710 pAccept_RspCb, 711 pContext ); 712 713 return PHNFCSTATUS(result); 714 } 715 716 NFCSTATUS phLibNfc_Llcp_Reject( phLibNfc_Handle hRemoteDevice, 717 phLibNfc_Handle hSocket, 718 pphLibNfc_LlcpSocketRejectCb_t pReject_RspCb, 719 void* pContext 720 ) 721 { 722 NFCSTATUS result; 723 phFriNfc_LlcpTransport_Socket_t *psSocket = (phFriNfc_LlcpTransport_Socket_t*)hSocket; 724 725 LLCP_PRINT("phLibNfc_Llcp_Reject"); 726 727 /* State checking */ 728 result = static_CheckState(); 729 if (result != NFCSTATUS_SUCCESS) 730 { 731 return result; 732 } 733 734 /* Parameters checking */ 735 if ((hRemoteDevice == 0) || 736 (hSocket == 0) || 737 (pReject_RspCb == NULL)) 738 { 739 return NFCSTATUS_INVALID_PARAMETER; 740 } 741 742 /* Check device */ 743 result = static_CheckDevice(hRemoteDevice); 744 if (result != NFCSTATUS_SUCCESS) 745 { 746 return result; 747 } 748 749 /* Reject incoming connection */ 750 result = phFriNfc_LlcpTransport_Reject( psSocket, 751 pReject_RspCb, 752 pContext ); 753 754 return PHNFCSTATUS(result); 755 } 756 757 NFCSTATUS phLibNfc_Llcp_Connect( phLibNfc_Handle hRemoteDevice, 758 phLibNfc_Handle hSocket, 759 uint8_t nSap, 760 pphLibNfc_LlcpSocketConnectCb_t pConnect_RspCb, 761 void* pContext 762 ) 763 { 764 NFCSTATUS result; 765 phFriNfc_LlcpTransport_Socket_t *psSocket = (phFriNfc_LlcpTransport_Socket_t*)hSocket; 766 767 LLCP_PRINT("phLibNfc_Llcp_Connect"); 768 769 /* State checking */ 770 result = static_CheckState(); 771 if (result != NFCSTATUS_SUCCESS) 772 { 773 return result; 774 } 775 776 /* Parameters checking */ 777 if ((hRemoteDevice == 0) || 778 (hSocket == 0) || 779 (pConnect_RspCb == NULL)) 780 { 781 LLCP_PRINT("phLibNfc_Llcp_Connect NFCSTATUS_INVALID_PARAMETER"); 782 return NFCSTATUS_INVALID_PARAMETER; 783 } 784 785 /* Check device */ 786 result = static_CheckDevice(hRemoteDevice); 787 if (result != NFCSTATUS_SUCCESS) 788 { 789 return result; 790 } 791 792 /* Try to connect on a remote service, given its SAP */ 793 result = phFriNfc_LlcpTransport_Connect( psSocket, 794 nSap, 795 pConnect_RspCb, 796 pContext ); 797 798 return PHNFCSTATUS(result); 799 } 800 801 NFCSTATUS phLibNfc_Llcp_ConnectByUri( phLibNfc_Handle hRemoteDevice, 802 phLibNfc_Handle hSocket, 803 phNfc_sData_t* psUri, 804 pphLibNfc_LlcpSocketConnectCb_t pConnect_RspCb, 805 void* pContext 806 ) 807 { 808 NFCSTATUS result; 809 phFriNfc_LlcpTransport_Socket_t *psSocket = (phFriNfc_LlcpTransport_Socket_t*)hSocket; 810 811 LLCP_PRINT("phLibNfc_Llcp_ConnectByUri"); 812 813 /* State checking */ 814 result = static_CheckState(); 815 if (result != NFCSTATUS_SUCCESS) 816 { 817 return result; 818 } 819 820 /* Parameters checking */ 821 if ((hRemoteDevice == 0) || 822 (hSocket == 0) || 823 (psUri == NULL) || 824 (pConnect_RspCb == NULL)) 825 { 826 LLCP_PRINT("phLibNfc_Llcp_ConnectByUri NFCSTATUS_INVALID_PARAMETER"); 827 return NFCSTATUS_INVALID_PARAMETER; 828 } 829 830 /* Check device */ 831 result = static_CheckDevice(hRemoteDevice); 832 if (result != NFCSTATUS_SUCCESS) 833 { 834 return result; 835 } 836 837 /* Try to connect on a remote service, using SDP */ 838 result = phFriNfc_LlcpTransport_ConnectByUri( psSocket, 839 psUri, 840 pConnect_RspCb, 841 pContext ); 842 843 return PHNFCSTATUS(result); 844 } 845 846 NFCSTATUS phLibNfc_Llcp_Disconnect( phLibNfc_Handle hRemoteDevice, 847 phLibNfc_Handle hSocket, 848 pphLibNfc_LlcpSocketDisconnectCb_t pDisconnect_RspCb, 849 void* pContext 850 ) 851 { 852 NFCSTATUS result; 853 phFriNfc_LlcpTransport_Socket_t *psSocket = (phFriNfc_LlcpTransport_Socket_t*)hSocket; 854 855 LLCP_PRINT("phLibNfc_Llcp_Disconnect"); 856 857 /* State checking */ 858 result = static_CheckState(); 859 if (result != NFCSTATUS_SUCCESS) 860 { 861 return result; 862 } 863 864 /* Parameters checking */ 865 if ((hRemoteDevice == 0) || 866 (hSocket == 0) || 867 (pDisconnect_RspCb == NULL)) 868 { 869 return NFCSTATUS_INVALID_PARAMETER; 870 } 871 872 /* Check device */ 873 result = static_CheckDevice(hRemoteDevice); 874 if (result != NFCSTATUS_SUCCESS) 875 { 876 return result; 877 } 878 879 /* Disconnect a logical link */ 880 result = phFriNfc_LlcpTransport_Disconnect( psSocket, 881 pDisconnect_RspCb, 882 pContext ); 883 884 return PHNFCSTATUS(result); 885 } 886 887 NFCSTATUS phLibNfc_Llcp_Recv( phLibNfc_Handle hRemoteDevice, 888 phLibNfc_Handle hSocket, 889 phNfc_sData_t* psBuffer, 890 pphLibNfc_LlcpSocketRecvCb_t pRecv_RspCb, 891 void* pContext 892 ) 893 { 894 NFCSTATUS result; 895 phFriNfc_LlcpTransport_Socket_t *psSocket = (phFriNfc_LlcpTransport_Socket_t*)hSocket; 896 897 LLCP_PRINT("phLibNfc_Llcp_Recv"); 898 899 /* State checking */ 900 result = static_CheckState(); 901 if (result != NFCSTATUS_SUCCESS) 902 { 903 return result; 904 } 905 906 /* Parameters checking */ 907 if ((hRemoteDevice == 0) || 908 (hSocket == 0) || 909 (psBuffer == NULL) || 910 (pRecv_RspCb == NULL)) 911 { 912 return NFCSTATUS_INVALID_PARAMETER; 913 } 914 915 /* Check device */ 916 result = static_CheckDevice(hRemoteDevice); 917 if (result != NFCSTATUS_SUCCESS) 918 { 919 return result; 920 } 921 922 /* Receive data from the logical link */ 923 result = phFriNfc_LlcpTransport_Recv( psSocket, 924 psBuffer, 925 pRecv_RspCb, 926 pContext ); 927 928 return PHNFCSTATUS(result); 929 } 930 931 NFCSTATUS phLibNfc_Llcp_RecvFrom( phLibNfc_Handle hRemoteDevice, 932 phLibNfc_Handle hSocket, 933 phNfc_sData_t* psBuffer, 934 pphLibNfc_LlcpSocketRecvFromCb_t pRecv_Cb, 935 void* pContext 936 ) 937 { 938 NFCSTATUS result; 939 phFriNfc_LlcpTransport_Socket_t *psSocket = (phFriNfc_LlcpTransport_Socket_t*)hSocket; 940 941 LLCP_PRINT("phLibNfc_Llcp_RecvFrom"); 942 943 /* State checking */ 944 result = static_CheckState(); 945 if (result != NFCSTATUS_SUCCESS) 946 { 947 return result; 948 } 949 950 /* Parameters checking */ 951 if ((hRemoteDevice == 0) || 952 (hSocket == 0) || 953 (psBuffer == NULL) || 954 (pRecv_Cb == NULL)) 955 { 956 return NFCSTATUS_INVALID_PARAMETER; 957 } 958 959 /* Check device */ 960 result = static_CheckDevice(hRemoteDevice); 961 if (result != NFCSTATUS_SUCCESS) 962 { 963 return result; 964 } 965 966 /* Receive data from the logical link */ 967 result = phFriNfc_LlcpTransport_RecvFrom( psSocket, 968 psBuffer, 969 pRecv_Cb, 970 pContext ); 971 972 return PHNFCSTATUS(result); 973 } 974 975 NFCSTATUS phLibNfc_Llcp_Send( phLibNfc_Handle hRemoteDevice, 976 phLibNfc_Handle hSocket, 977 phNfc_sData_t* psBuffer, 978 pphLibNfc_LlcpSocketSendCb_t pSend_RspCb, 979 void* pContext 980 ) 981 { 982 NFCSTATUS result; 983 phFriNfc_LlcpTransport_Socket_t *psSocket = (phFriNfc_LlcpTransport_Socket_t*)hSocket; 984 985 LLCP_PRINT("phLibNfc_Llcp_Send"); 986 987 /* State checking */ 988 result = static_CheckState(); 989 if (result != NFCSTATUS_SUCCESS) 990 { 991 return result; 992 } 993 994 /* Parameters checking */ 995 if ((hRemoteDevice == 0) || 996 (hSocket == 0) || 997 (psBuffer == NULL) || 998 (pSend_RspCb == NULL)) 999 { 1000 return NFCSTATUS_INVALID_PARAMETER; 1001 } 1002 1003 /* Check device */ 1004 result = static_CheckDevice(hRemoteDevice); 1005 if (result != NFCSTATUS_SUCCESS) 1006 { 1007 return result; 1008 } 1009 1010 /* Send data to the logical link */ 1011 result = phFriNfc_LlcpTransport_Send( psSocket, 1012 psBuffer, 1013 pSend_RspCb, 1014 pContext ); 1015 1016 return PHNFCSTATUS(result); 1017 } 1018 1019 NFCSTATUS phLibNfc_Llcp_SendTo( phLibNfc_Handle hRemoteDevice, 1020 phLibNfc_Handle hSocket, 1021 uint8_t nSap, 1022 phNfc_sData_t* psBuffer, 1023 pphLibNfc_LlcpSocketSendCb_t pSend_RspCb, 1024 void* pContext 1025 ) 1026 { 1027 NFCSTATUS result; 1028 phFriNfc_LlcpTransport_Socket_t *psSocket = (phFriNfc_LlcpTransport_Socket_t*)hSocket; 1029 1030 LLCP_PRINT("phLibNfc_Llcp_SendTo"); 1031 1032 /* State checking */ 1033 result = static_CheckState(); 1034 if (result != NFCSTATUS_SUCCESS) 1035 { 1036 return result; 1037 } 1038 1039 /* Parameters checking */ 1040 if ((hRemoteDevice == 0) || 1041 (hSocket == 0) || 1042 (psBuffer == NULL) || 1043 (pSend_RspCb == NULL)) 1044 { 1045 return NFCSTATUS_INVALID_PARAMETER; 1046 } 1047 1048 /* Check device */ 1049 result = static_CheckDevice(hRemoteDevice); 1050 if (result != NFCSTATUS_SUCCESS) 1051 { 1052 return result; 1053 } 1054 1055 /* Send data to the logical link */ 1056 result = phFriNfc_LlcpTransport_SendTo( psSocket, 1057 nSap, 1058 psBuffer, 1059 pSend_RspCb, 1060 pContext ); 1061 1062 return PHNFCSTATUS(result); 1063 } 1064