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 /** 18 * \file phFriNfc_LlcpTransport.h 19 * \brief 20 * 21 * Project: NFC-FRI 22 * 23 */ 24 25 #ifndef PHFRINFC_LLCP_TRANSPORT_H 26 #define PHFRINFC_LLCP_TRANSPORT_H 27 #include <phNfcHalTypes.h> 28 #include <phNfcLlcpTypes.h> 29 #include <phNfcTypes.h> 30 #include <phLibNfcStatus.h> 31 #include <phFriNfc_Llcp.h> 32 #include <phFriNfc_LlcpUtils.h> 33 #ifdef ANDROID 34 #include <string.h> 35 #include <pthread.h> 36 #endif 37 38 39 typedef uint32_t phFriNfc_Socket_Handle; 40 41 /** 42 * \ingroup grp_fri_nfc_llcp_mac 43 * \brief Declaration of a TRANSPORT type 44 */ 45 struct phFriNfc_LlcpTransport; 46 typedef struct phFriNfc_LlcpTransport phFriNfc_LlcpTransport_t; 47 48 struct phFriNfc_LlcpTransport_Socket; 49 typedef struct phFriNfc_LlcpTransport_Socket phFriNfc_LlcpTransport_Socket_t; 50 51 struct phFriNfc_Llcp_CachedServiceName; 52 typedef struct phFriNfc_Llcp_CachedServiceName phFriNfc_Llcp_CachedServiceName_t; 53 54 /*========== ENUMERATES ===========*/ 55 56 /* Enum reperesents the different LLCP Link status*/ 57 typedef enum phFriNfc_LlcpTransportSocket_eSocketState 58 { 59 phFriNfc_LlcpTransportSocket_eSocketDefault, 60 phFriNfc_LlcpTransportSocket_eSocketCreated, 61 phFriNfc_LlcpTransportSocket_eSocketBound, 62 phFriNfc_LlcpTransportSocket_eSocketRegistered, 63 phFriNfc_LlcpTransportSocket_eSocketConnected, 64 phFriNfc_LlcpTransportSocket_eSocketConnecting, 65 phFriNfc_LlcpTransportSocket_eSocketAccepted, 66 phFriNfc_LlcpTransportSocket_eSocketDisconnected, 67 phFriNfc_LlcpTransportSocket_eSocketDisconnecting, 68 phFriNfc_LlcpTransportSocket_eSocketRejected, 69 }phFriNfc_LlcpTransportSocket_eSocketState_t; 70 71 72 73 /*========== CALLBACKS ===========*/ 74 75 /** 76 *\ingroup grp_fri_nfc 77 * 78 * \brief LLCP socket error notification callback definition 79 */ 80 typedef void (*pphFriNfc_LlcpTransportSocketErrCb_t) ( void* pContext, 81 uint8_t nErrCode); 82 83 84 /** 85 *\ingroup grp_fri_nfc 86 * 87 * \brief LLCP socket listen callback definition 88 */ 89 typedef void (*pphFriNfc_LlcpTransportSocketListenCb_t) (void* pContext, 90 phFriNfc_LlcpTransport_Socket_t *IncomingSocket); 91 92 /** 93 *\ingroup grp_fri_nfc 94 * 95 * \brief LLCP socket connect callback definition 96 */ 97 typedef void (*pphFriNfc_LlcpTransportSocketConnectCb_t) ( void* pContext, 98 uint8_t nErrCode, 99 NFCSTATUS status); 100 101 /** 102 *\ingroup grp_fri_nfc 103 * 104 * \brief LLCP socket disconnect callback definition 105 */ 106 typedef void (*pphFriNfc_LlcpTransportSocketDisconnectCb_t) (void* pContext, 107 NFCSTATUS status); 108 109 /** 110 *\ingroup grp_fri_nfc 111 * 112 * \brief LLCP socket accept callback definition 113 */ 114 typedef void (*pphFriNfc_LlcpTransportSocketAcceptCb_t) (void* pContext, 115 NFCSTATUS status); 116 117 /** 118 *\ingroup grp_fri_nfc 119 * 120 * \brief LLCP socket reject callback definition 121 */ 122 typedef void (*pphFriNfc_LlcpTransportSocketRejectCb_t) (void* pContext, 123 NFCSTATUS status); 124 125 /** 126 *\ingroup grp_fri_nfc 127 * 128 * \brief LLCP socket reception callback definition 129 */ 130 typedef void (*pphFriNfc_LlcpTransportSocketRecvCb_t) (void* pContext, 131 NFCSTATUS status); 132 133 /** 134 *\ingroup grp_fri_nfc 135 * 136 * \brief LLCP socket reception with SSAP callback definition 137 */ 138 typedef void (*pphFriNfc_LlcpTransportSocketRecvFromCb_t) (void* pContext, 139 uint8_t ssap, 140 NFCSTATUS status); 141 142 /** 143 *\ingroup grp_fri_nfc 144 * 145 * \brief LLCP socket emission callback definition 146 */ 147 typedef void (*pphFriNfc_LlcpTransportSocketSendCb_t) (void* pContext, 148 NFCSTATUS status); 149 150 151 /*========== STRUCTURES ===========*/ 152 /** 153 * \ingroup grp_fri_nfc_llcp_mac 154 * \brief Declaration of a SOCKET type 155 */ 156 struct phFriNfc_LlcpTransport_Socket 157 { 158 phFriNfc_LlcpTransportSocket_eSocketState_t eSocket_State; 159 phFriNfc_LlcpTransport_eSocketType_t eSocket_Type; 160 phFriNfc_LlcpTransport_sSocketOptions_t sSocketOption; 161 pphFriNfc_LlcpTransportSocketErrCb_t pSocketErrCb; 162 163 /* Remote and local socket info */ 164 uint8_t socket_sSap; 165 uint8_t socket_dSap; 166 // TODO: copy service name (could be deallocated by upper layer) 167 phNfc_sData_t sServiceName; 168 uint8_t remoteRW; 169 uint8_t localRW; 170 uint16_t remoteMIU; 171 uint16_t localMIUX; 172 uint8_t index; 173 174 /* SDP related fields */ 175 uint8_t nTid; 176 177 /* Information Flags */ 178 bool_t bSocketRecvPending; 179 bool_t bSocketSendPending; 180 bool_t bSocketListenPending; 181 bool_t bSocketDiscPending; 182 bool_t bSocketConnectPending; 183 bool_t bSocketAcceptPending; 184 bool_t bSocketRRPending; 185 bool_t bSocketRNRPending; 186 187 /* Buffers */ 188 phNfc_sData_t sSocketSendBuffer; 189 phNfc_sData_t sSocketLinearBuffer; 190 phNfc_sData_t* sSocketRecvBuffer; 191 uint32_t *receivedLength; 192 uint32_t bufferLinearLength; 193 uint32_t bufferSendMaxLength; 194 uint32_t bufferRwMaxLength; 195 bool_t ReceiverBusyCondition; 196 bool_t RemoteBusyConditionInfo; 197 UTIL_FIFO_BUFFER sCyclicFifoBuffer; 198 uint32_t indexRwRead; 199 uint32_t indexRwWrite; 200 201 /* Construction Frame */ 202 phFriNfc_Llcp_sPacketHeader_t sLlcpHeader; 203 phFriNfc_Llcp_sPacketSequence_t sSequence; 204 uint8_t socket_VS; 205 uint8_t socket_VSA; 206 uint8_t socket_VR; 207 uint8_t socket_VRA; 208 209 /* Callbacks */ 210 pphFriNfc_LlcpTransportSocketAcceptCb_t pfSocketAccept_Cb; 211 pphFriNfc_LlcpTransportSocketSendCb_t pfSocketSend_Cb; 212 pphFriNfc_LlcpTransportSocketRecvFromCb_t pfSocketRecvFrom_Cb; 213 pphFriNfc_LlcpTransportSocketRecvCb_t pfSocketRecv_Cb; 214 pphFriNfc_LlcpTransportSocketListenCb_t pfSocketListen_Cb; 215 pphFriNfc_LlcpTransportSocketConnectCb_t pfSocketConnect_Cb; 216 pphFriNfc_LlcpTransportSocketDisconnectCb_t pfSocketDisconnect_Cb; 217 218 /* Table of PHFRINFC_LLCP_RW_MAX Receive Windows Buffers */ 219 phNfc_sData_t sSocketRwBufferTable[PHFRINFC_LLCP_RW_MAX]; 220 221 /* Pointer a the socket table */ 222 phFriNfc_LlcpTransport_t *psTransport; 223 /* Context */ 224 void *pListenContext; 225 void *pAcceptContext; 226 void *pRejectContext; 227 void *pConnectContext; 228 void *pDisconnectContext; 229 void *pSendContext; 230 void *pRecvContext; 231 void *pContext; 232 }; 233 234 /** 235 * \ingroup grp_fri_nfc_llcp_mac 236 * \brief TODO 237 */ 238 struct phFriNfc_Llcp_CachedServiceName 239 { 240 phNfc_sData_t sServiceName; 241 uint8_t nSap; 242 }; 243 244 245 /** 246 * \ingroup grp_fri_nfc_llcp_mac 247 * \brief Declaration of a TRANSPORT Type with a table of PHFRINFC_LLCP_NB_SOCKET_DEFAULT sockets 248 * and a pointer a Llcp layer 249 */ 250 struct phFriNfc_LlcpTransport 251 { 252 phFriNfc_LlcpTransport_Socket_t pSocketTable[PHFRINFC_LLCP_NB_SOCKET_MAX]; 253 phFriNfc_Llcp_CachedServiceName_t pCachedServiceNames[PHFRINFC_LLCP_SDP_ADVERTISED_NB]; 254 phFriNfc_Llcp_t *pLlcp; 255 pthread_mutex_t mutex; 256 bool_t bSendPending; 257 bool_t bRecvPending; 258 bool_t bDmPending; 259 bool_t bFrmrPending; 260 261 phFriNfc_Llcp_LinkSend_CB_t pfLinkSendCb; 262 void *pLinkSendContext; 263 264 uint8_t socketIndex; 265 266 /**< Info field of pending FRMR packet*/ 267 uint8_t FrmrInfoBuffer[4]; 268 phFriNfc_Llcp_sPacketHeader_t sLlcpHeader; 269 phFriNfc_Llcp_sPacketSequence_t sSequence; 270 271 /**< Info field of pending DM packet*/ 272 phFriNfc_Llcp_sPacketHeader_t sDmHeader; 273 phNfc_sData_t sDmPayload; 274 uint8_t DmInfoBuffer[3]; 275 276 uint8_t LinkStatusError; 277 278 /**< Service discovery related infos */ 279 phNfc_sData_t *psDiscoveryServiceNameList; 280 uint8_t *pnDiscoverySapList; 281 uint8_t nDiscoveryListSize; 282 uint8_t nDiscoveryReqOffset; 283 uint8_t nDiscoveryResOffset; 284 285 uint8_t nDiscoveryResTidList[PHFRINFC_LLCP_SNL_RESPONSE_MAX]; 286 uint8_t nDiscoveryResSapList[PHFRINFC_LLCP_SNL_RESPONSE_MAX]; 287 uint8_t nDiscoveryResListSize; 288 289 uint8_t pDiscoveryBuffer[PHFRINFC_LLCP_MIU_DEFAULT]; 290 pphFriNfc_Cr_t pfDiscover_Cb; 291 void *pDiscoverContext; 292 293 }; 294 295 /* 296 ################################################################################ 297 ********************** TRANSPORT Interface Function Prototype ***************** 298 ################################################################################ 299 */ 300 301 bool_t testAndSetSendPending(phFriNfc_LlcpTransport_t* transport); 302 303 void clearSendPending(phFriNfc_LlcpTransport_t* transport); 304 305 /** 306 * \ingroup grp_fri_nfc 307 * \brief <b>Create a socket on a LLCP-connected device</b>. 308 * 309 */ 310 NFCSTATUS phFriNfc_LlcpTransport_Reset (phFriNfc_LlcpTransport_t *pLlcpSocketTable, 311 phFriNfc_Llcp_t *pLlcp); 312 313 314 /** 315 * \ingroup grp_fri_nfc 316 * \brief <b>Close all existing sockets</b>. 317 * 318 */ 319 NFCSTATUS phFriNfc_LlcpTransport_CloseAll (phFriNfc_LlcpTransport_t *pLlcpSocketTable); 320 321 322 /** 323 * \ingroup grp_fri_nfc 324 * \brief <b>Used by transport layers to request a send on link layer</b>. 325 * 326 */ 327 NFCSTATUS phFriNfc_LlcpTransport_LinkSend( phFriNfc_LlcpTransport_t *LlcpTransport, 328 phFriNfc_Llcp_sPacketHeader_t *psHeader, 329 phFriNfc_Llcp_sPacketSequence_t *psSequence, 330 phNfc_sData_t *psInfo, 331 phFriNfc_Llcp_LinkSend_CB_t pfSend_CB, 332 uint8_t socketIndex, 333 void *pContext ); 334 335 336 /** 337 * \ingroup grp_fri_nfc 338 * \brief <b>Used by transport layers to send a DM frame</b>. 339 * 340 * This function is only used when the DM is not related to a DISC on a socket. 341 */ 342 NFCSTATUS phFriNfc_LlcpTransport_SendDisconnectMode(phFriNfc_LlcpTransport_t* psTransport, 343 uint8_t dsap, 344 uint8_t ssap, 345 uint8_t dmOpCode); 346 347 /** 348 * \ingroup grp_fri_nfc 349 * \brief <b>Used by transport layers to send a FRMR frame</b>. 350 * 351 */ 352 NFCSTATUS phFriNfc_LlcpTransport_SendFrameReject(phFriNfc_LlcpTransport_t *psTransport, 353 uint8_t dsap, 354 uint8_t rejectedPTYPE, 355 uint8_t ssap, 356 phFriNfc_Llcp_sPacketSequence_t* sLlcpSequence, 357 uint8_t WFlag, 358 uint8_t IFlag, 359 uint8_t RFlag, 360 uint8_t SFlag, 361 uint8_t vs, 362 uint8_t vsa, 363 uint8_t vr, 364 uint8_t vra); 365 366 /*! 367 * \ingroup grp_fri_nfc 368 * \brief <b>Discover remote services SAP using SDP protocol</b>. 369 */ 370 NFCSTATUS phFriNfc_LlcpTransport_DiscoverServices( phFriNfc_LlcpTransport_t *pLlcpTransport, 371 phNfc_sData_t *psServiceNameList, 372 uint8_t *pnSapList, 373 uint8_t nListSize, 374 pphFriNfc_Cr_t pDiscover_Cb, 375 void *pContext ); 376 377 /** 378 * \ingroup grp_lib_nfc 379 * \brief <b>Get the local options of a socket</b>. 380 * 381 * This function returns the local options (maximum packet size and receive window size) used 382 * for a given connection-oriented socket. This function shall not be used with connectionless 383 * sockets. 384 * 385 * \param[out] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t. 386 * \param[in] psLocalOptions A pointer to be filled with the local options of the socket. 387 * 388 * \retval NFCSTATUS_SUCCESS Operation successful. 389 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 390 * could not be properly interpreted. 391 * \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of 392 * a valid type to perform the requsted operation. 393 * \retval NFCSTATUS_NOT_INITIALISED Indicates stack is not yet initialized. 394 * \retval NFCSTATUS_SHUTDOWN Shutdown in progress. 395 * \retval NFCSTATUS_FAILED Operation failed. 396 */ 397 NFCSTATUS phFriNfc_LlcpTransport_SocketGetLocalOptions(phFriNfc_LlcpTransport_Socket_t *pLlcpSocket, 398 phLibNfc_Llcp_sSocketOptions_t *psLocalOptions); 399 400 401 /** 402 * \ingroup grp_lib_nfc 403 * \brief <b>Get the local options of a socket</b>. 404 * 405 * This function returns the remote options (maximum packet size and receive window size) used 406 * for a given connection-oriented socket. This function shall not be used with connectionless 407 * sockets. 408 * 409 * \param[out] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t. 410 * \param[in] psRemoteOptions A pointer to be filled with the remote options of the socket. 411 * 412 * \retval NFCSTATUS_SUCCESS Operation successful. 413 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 414 * could not be properly interpreted. 415 * \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of 416 * a valid type to perform the requsted operation. 417 * \retval NFCSTATUS_NOT_INITIALISED Indicates stack is not yet initialized. 418 * \retval NFCSTATUS_SHUTDOWN Shutdown in progress. 419 * \retval NFCSTATUS_FAILED Operation failed. 420 */ 421 NFCSTATUS phFriNfc_LlcpTransport_SocketGetRemoteOptions(phFriNfc_LlcpTransport_Socket_t* pLlcpSocket, 422 phLibNfc_Llcp_sSocketOptions_t* psRemoteOptions); 423 424 425 /** 426 * \ingroup grp_fri_nfc 427 * \brief <b>Create a socket on a LLCP-connected device</b>. 428 * 429 * This function creates a socket for a given LLCP link. Sockets can be of two types : 430 * connection-oriented and connectionless. If the socket is connection-oriented, the caller 431 * must provide a working buffer to the socket in order to handle incoming data. This buffer 432 * must be large enough to fit the receive window (RW * MIU), the remaining space being 433 * used as a linear buffer to store incoming data as a stream. Data will be readable later 434 * using the phLibNfc_LlcpTransport_Recv function. 435 * The options and working buffer are not required if the socket is used as a listening socket, 436 * since it cannot be directly used for communication. 437 * 438 * \param[in] pLlcpSocketTable A pointer to a table of PHFRINFC_LLCP_NB_SOCKET_DEFAULT sockets. 439 * \param[in] eType The socket type. 440 * \param[in] psOptions The options to be used with the socket. 441 * \param[in] psWorkingBuffer A working buffer to be used by the library. 442 * \param[out] pLlcpSocket A pointer to a socket pointer to be filled with a 443 socket found on the socket table. 444 * \param[in] pErr_Cb The callback to be called each time the socket 445 * is in error. 446 * \param[in] pContext Upper layer context to be returned in the callback. 447 * 448 * \retval NFCSTATUS_SUCCESS Operation successful. 449 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 450 * could not be properly interpreted. 451 * \retval NFCSTATUS_BUFFER_TOO_SMALL The working buffer is too small for the MIU and RW 452 * declared in the options. 453 * \retval NFCSTATUS_INSUFFICIENT_RESOURCES No more socket handle available. 454 * \retval NFCSTATUS_FAILED Operation failed. 455 * */ 456 NFCSTATUS phFriNfc_LlcpTransport_Socket(phFriNfc_LlcpTransport_t *pLlcpSocketTable, 457 phFriNfc_LlcpTransport_eSocketType_t eType, 458 phFriNfc_LlcpTransport_sSocketOptions_t* psOptions, 459 phNfc_sData_t* psWorkingBuffer, 460 phFriNfc_LlcpTransport_Socket_t **pLlcpSocket, 461 pphFriNfc_LlcpTransportSocketErrCb_t pErr_Cb, 462 void* pContext); 463 464 /** 465 * \ingroup grp_fri_nfc 466 * \brief <b>Close a socket on a LLCP-connected device</b>. 467 * 468 * This function closes a LLCP socket previously created using phFriNfc_LlcpTransport_Socket. 469 * If the socket was connected, it is first disconnected, and then closed. 470 * 471 * \param[in] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t. 472 473 * \retval NFCSTATUS_SUCCESS Operation successful. 474 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 475 * could not be properly interpreted. 476 * \retval NFCSTATUS_FAILED Operation failed. 477 */ 478 NFCSTATUS phFriNfc_LlcpTransport_Close(phFriNfc_LlcpTransport_Socket_t* pLlcpSocket); 479 480 481 /** 482 * \ingroup grp_fri_nfc 483 * \brief <b>Bind a socket to a local SAP</b>. 484 * 485 * This function binds the socket to a local Service Access Point. 486 * 487 * \param[out] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t. 488 * \param[in] pConfigInfo A port number for a specific socket 489 * \param TODO 490 * 491 * \retval NFCSTATUS_SUCCESS Operation successful. 492 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 493 * could not be properly interpreted. 494 * \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of 495 * a valid type to perform the requsted operation. 496 * \retval NFCSTATUS_ALREADY_REGISTERED The selected SAP is already bound to another 497 socket. 498 * \retval NFCSTATUS_FAILED Operation failed. 499 */ 500 NFCSTATUS phFriNfc_LlcpTransport_Bind(phFriNfc_LlcpTransport_Socket_t *pLlcpSocket, 501 uint8_t nSap, 502 phNfc_sData_t *psServiceName); 503 504 /** 505 * \ingroup grp_fri_nfc 506 * \brief <b>Listen for incoming connection requests on a socket</b>. 507 * 508 * This function switches a socket into a listening state and registers a callback on 509 * incoming connection requests. In this state, the socket is not able to communicate 510 * directly. The listening state is only available for connection-oriented sockets 511 * which are still not connected. The socket keeps listening until it is closed, and 512 * thus can trigger several times the pListen_Cb callback. 513 * 514 * 515 * \param[in] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t. 516 * \param[in] pListen_Cb The callback to be called each time the 517 * socket receive a connection request. 518 * \param[in] pContext Upper layer context to be returned in 519 * the callback. 520 * 521 * \retval NFCSTATUS_SUCCESS Operation successful. 522 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 523 * could not be properly interpreted. 524 * \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state to switch 525 * to listening state. 526 * \retval NFCSTATUS_FAILED Operation failed. 527 */ 528 NFCSTATUS phFriNfc_LlcpTransport_Listen(phFriNfc_LlcpTransport_Socket_t* pLlcpSocket, 529 pphFriNfc_LlcpTransportSocketListenCb_t pListen_Cb, 530 void* pContext); 531 532 /** 533 * \ingroup grp_fri_nfc 534 * \brief <b>Accept an incoming connection request for a socket</b>. 535 * 536 * This functions allows the client to accept an incoming connection request. 537 * It must be used with the socket provided within the listen callback. The socket 538 * is implicitly switched to the connected state when the function is called. 539 * 540 * \param[in] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t. 541 * \param[in] psOptions The options to be used with the socket. 542 * \param[in] psWorkingBuffer A working buffer to be used by the library. 543 * \param[in] pErr_Cb The callback to be called each time the accepted socket 544 * is in error. 545 * \param[in] pAccept_RspCb The callback to be called when the Accept operation is completed 546 * \param[in] pContext Upper layer context to be returned in the callback. 547 * 548 * \retval NFCSTATUS_SUCCESS Operation successful. 549 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 550 * could not be properly interpreted. 551 * \retval NFCSTATUS_BUFFER_TOO_SMALL The working buffer is too small for the MIU and RW 552 * declared in the options. 553 * \retval NFCSTATUS_FAILED Operation failed. 554 */ 555 NFCSTATUS phFriNfc_LlcpTransport_Accept(phFriNfc_LlcpTransport_Socket_t* pLlcpSocket, 556 phFriNfc_LlcpTransport_sSocketOptions_t* psOptions, 557 phNfc_sData_t* psWorkingBuffer, 558 pphFriNfc_LlcpTransportSocketErrCb_t pErr_Cb, 559 pphFriNfc_LlcpTransportSocketAcceptCb_t pAccept_RspCb, 560 void* pContext); 561 562 /** 563 * \ingroup grp_fri_nfc 564 * \brief <b>Reject an incoming connection request for a socket</b>. 565 * 566 * This functions allows the client to reject an incoming connection request. 567 * It must be used with the socket provided within the listen callback. The socket 568 * is implicitly closed when the function is called. 569 * 570 * \param[in] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t. 571 * \param[in] pReject_RspCb The callback to be called when the Reject operation is completed 572 * \param[in] pContext Upper layer context to be returned in the callback. 573 * 574 * \retval NFCSTATUS_SUCCESS Operation successful. 575 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 576 * could not be properly interpreted. 577 * \retval NFCSTATUS_FAILED Operation failed. 578 */ 579 NFCSTATUS phFriNfc_LlcpTransport_Reject( phFriNfc_LlcpTransport_Socket_t* pLlcpSocket, 580 pphFriNfc_LlcpTransportSocketRejectCb_t pReject_RspCb, 581 void *pContext); 582 /** 583 * \ingroup grp_fri_nfc 584 * \brief <b>Try to establish connection with a socket on a remote SAP</b>. 585 * 586 * This function tries to connect to a given SAP on the remote peer. If the 587 * socket is not bound to a local SAP, it is implicitly bound to a free SAP. 588 * 589 * \param[in] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t. 590 * \param[in] nSap The destination SAP to connect to. 591 * \param[in] pConnect_RspCb The callback to be called when the connection 592 * operation is completed. 593 * \param[in] pContext Upper layer context to be returned in 594 * the callback. 595 * 596 * \retval NFCSTATUS_SUCCESS Operation successful. 597 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 598 * could not be properly interpreted. 599 * \retval NFCSTATUS_PENDING Connection operation is in progress, 600 * pConnect_RspCb will be called upon completion. 601 * \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of 602 * a valid type to perform the requsted operation. 603 * \retval NFCSTATUS_FAILED Operation failed. 604 */ 605 NFCSTATUS phFriNfc_LlcpTransport_Connect( phFriNfc_LlcpTransport_Socket_t* pLlcpSocket, 606 uint8_t nSap, 607 pphFriNfc_LlcpTransportSocketConnectCb_t pConnect_RspCb, 608 void* pContext); 609 610 /** 611 * \ingroup grp_fri_nfc 612 * \brief <b>Try to establish connection with a socket on a remote service, given its URI</b>. 613 * 614 * This function tries to connect to a SAP designated by an URI. If the 615 * socket is not bound to a local SAP, it is implicitly bound to a free SAP. 616 * 617 * \param[in] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t. 618 * \param[in] psUri The URI corresponding to the destination SAP to connect to. 619 * \param[in] pConnect_RspCb The callback to be called when the connection 620 * operation is completed. 621 * \param[in] pContext Upper layer context to be returned in 622 * the callback. 623 * 624 * \retval NFCSTATUS_SUCCESS Operation successful. 625 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 626 * could not be properly interpreted. 627 * \retval NFCSTATUS_PENDING Connection operation is in progress, 628 * pConnect_RspCb will be called upon completion. 629 * \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of 630 * a valid type to perform the requsted operation. 631 * \retval NFCSTATUS_NOT_INITIALISED Indicates stack is not yet initialized. 632 * \retval NFCSTATUS_SHUTDOWN Shutdown in progress. 633 * \retval NFCSTATUS_FAILED Operation failed. 634 */ 635 NFCSTATUS phFriNfc_LlcpTransport_ConnectByUri(phFriNfc_LlcpTransport_Socket_t* pLlcpSocket, 636 phNfc_sData_t* psUri, 637 pphFriNfc_LlcpTransportSocketConnectCb_t pConnect_RspCb, 638 void* pContext); 639 640 /** 641 * \ingroup grp_lib_nfc 642 * \brief <b>Disconnect a currently connected socket</b>. 643 * 644 * This function initiates the disconnection of a previously connected socket. 645 * 646 * \param[in] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t. 647 * \param[in] pDisconnect_RspCb The callback to be called when the 648 * operation is completed. 649 * \param[in] pContext Upper layer context to be returned in 650 * the callback. 651 * 652 * \retval NFCSTATUS_SUCCESS Operation successful. 653 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 654 * could not be properly interpreted. 655 * \retval NFCSTATUS_PENDING Disconnection operation is in progress, 656 * pDisconnect_RspCb will be called upon completion. 657 * \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of 658 * a valid type to perform the requsted operation. 659 * \retval NFCSTATUS_NOT_INITIALISED Indicates stack is not yet initialized. 660 * \retval NFCSTATUS_SHUTDOWN Shutdown in progress. 661 * \retval NFCSTATUS_FAILED Operation failed. 662 */ 663 NFCSTATUS phFriNfc_LlcpTransport_Disconnect(phFriNfc_LlcpTransport_Socket_t* pLlcpSocket, 664 pphLibNfc_LlcpSocketDisconnectCb_t pDisconnect_RspCb, 665 void* pContext); 666 667 /** 668 * \ingroup grp_fri_nfc 669 * \brief <b>Send data on a socket</b>. 670 * 671 * This function is used to write data on a socket. This function 672 * can only be called on a connection-oriented socket which is already 673 * in a connected state. 674 * 675 * 676 * \param[in] hSocket Socket handle obtained during socket creation. 677 * \param[in] psBuffer The buffer containing the data to send. 678 * \param[in] pSend_RspCb The callback to be called when the 679 * operation is completed. 680 * \param[in] pContext Upper layer context to be returned in 681 * the callback. 682 * 683 * \retval NFCSTATUS_SUCCESS Operation successful. 684 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 685 * could not be properly interpreted. 686 * \retval NFCSTATUS_PENDING Reception operation is in progress, 687 * pSend_RspCb will be called upon completion. 688 * \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of 689 * a valid type to perform the requsted operation. 690 * \retval NFCSTATUS_FAILED Operation failed. 691 */ 692 NFCSTATUS phFriNfc_LlcpTransport_Send(phFriNfc_LlcpTransport_Socket_t* pLlcpSocket, 693 phNfc_sData_t* psBuffer, 694 pphFriNfc_LlcpTransportSocketSendCb_t pSend_RspCb, 695 void* pContext); 696 697 /** 698 * \ingroup grp_fri_nfc 699 * \brief <b>Read data on a socket</b>. 700 * 701 * This function is used to read data from a socket. It reads at most the 702 * size of the reception buffer, but can also return less bytes if less bytes 703 * are available. If no data is available, the function will be pending until 704 * more data comes, and the response will be sent by the callback. This function 705 * can only be called on a connection-oriented socket. 706 * 707 * 708 * \param[in] hSocket Socket handle obtained during socket creation. 709 * \param[in] psBuffer The buffer receiving the data. 710 * \param[in] pRecv_RspCb The callback to be called when the 711 * operation is completed. 712 * \param[in] pContext Upper layer context to be returned in 713 * the callback. 714 * 715 * \retval NFCSTATUS_SUCCESS Operation successful. 716 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 717 * could not be properly interpreted. 718 * \retval NFCSTATUS_PENDING Reception operation is in progress, 719 * pRecv_RspCb will be called upon completion. 720 * \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of 721 * a valid type to perform the requsted operation. 722 * \retval NFCSTATUS_FAILED Operation failed. 723 */ 724 NFCSTATUS phFriNfc_LlcpTransport_Recv( phFriNfc_LlcpTransport_Socket_t* pLlcpSocket, 725 phNfc_sData_t* psBuffer, 726 pphFriNfc_LlcpTransportSocketRecvCb_t pRecv_RspCb, 727 void* pContext); 728 729 730 731 /** 732 * \ingroup grp_lib_nfc 733 * \brief <b>Read data on a socket and get the source SAP</b>. 734 * 735 * This function is the same as phLibNfc_Llcp_Recv, except that the callback includes 736 * the source SAP. This functions can only be called on a connectionless socket. 737 * 738 * 739 * \param[in] pLlcpSocket A pointer to a LlcpSocket created. 740 * \param[in] psBuffer The buffer receiving the data. 741 * \param[in] pRecv_RspCb The callback to be called when the 742 * operation is completed. 743 * \param[in] pContext Upper layer context to be returned in 744 * the callback. 745 * 746 * \retval NFCSTATUS_SUCCESS Operation successful. 747 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 748 * could not be properly interpreted. 749 * \retval NFCSTATUS_PENDING Reception operation is in progress, 750 * pRecv_RspCb will be called upon completion. 751 * \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of 752 * a valid type to perform the requsted operation. 753 * \retval NFCSTATUS_NOT_INITIALISED Indicates stack is not yet initialized. 754 * \retval NFCSTATUS_SHUTDOWN Shutdown in progress. 755 * \retval NFCSTATUS_FAILED Operation failed. 756 */ 757 NFCSTATUS phFriNfc_LlcpTransport_RecvFrom( phFriNfc_LlcpTransport_Socket_t *pLlcpSocket, 758 phNfc_sData_t* psBuffer, 759 pphFriNfc_LlcpTransportSocketRecvFromCb_t pRecv_Cb, 760 void *pContext); 761 762 /** 763 * \ingroup grp_fri_nfc 764 * \brief <b>Send data on a socket to a given destination SAP</b>. 765 * 766 * This function is used to write data on a socket to a given destination SAP. 767 * This function can only be called on a connectionless socket. 768 * 769 * 770 * \param[in] pLlcpSocket A pointer to a LlcpSocket created. 771 * \param[in] nSap The destination SAP. 772 * \param[in] psBuffer The buffer containing the data to send. 773 * \param[in] pSend_RspCb The callback to be called when the 774 * operation is completed. 775 * \param[in] pContext Upper layer context to be returned in 776 * the callback. 777 * 778 * \retval NFCSTATUS_SUCCESS Operation successful. 779 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 780 * could not be properly interpreted. 781 * \retval NFCSTATUS_PENDING Reception operation is in progress, 782 * pSend_RspCb will be called upon completion. 783 * \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of 784 * a valid type to perform the requsted operation. 785 * \retval NFCSTATUS_NOT_INITIALISED Indicates stack is not yet initialized. 786 * \retval NFCSTATUS_SHUTDOWN Shutdown in progress. 787 * \retval NFCSTATUS_FAILED Operation failed. 788 */ 789 NFCSTATUS phFriNfc_LlcpTransport_SendTo( phFriNfc_LlcpTransport_Socket_t *pLlcpSocket, 790 uint8_t nSap, 791 phNfc_sData_t* psBuffer, 792 pphFriNfc_LlcpTransportSocketSendCb_t pSend_RspCb, 793 void* pContext); 794 #endif /* PHFRINFC_LLCP_TRANSPORT_H */ 795