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