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