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
39typedef uint32_t    phFriNfc_Socket_Handle;
40
41/**
42 * \ingroup grp_fri_nfc_llcp_mac
43 * \brief Declaration of a TRANSPORT type
44 */
45struct phFriNfc_LlcpTransport;
46typedef struct phFriNfc_LlcpTransport phFriNfc_LlcpTransport_t;
47
48struct phFriNfc_LlcpTransport_Socket;
49typedef struct phFriNfc_LlcpTransport_Socket phFriNfc_LlcpTransport_Socket_t;
50
51struct phFriNfc_Llcp_CachedServiceName;
52typedef struct phFriNfc_Llcp_CachedServiceName phFriNfc_Llcp_CachedServiceName_t;
53
54/*========== ENUMERATES ===========*/
55
56/* Enum reperesents the different LLCP Link status*/
57typedef 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*/
80typedef 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*/
89typedef 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*/
97typedef 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*/
106typedef 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*/
114typedef 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*/
122typedef 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*/
130typedef 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*/
138typedef 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*/
147typedef 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 */
156struct 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 */
238struct 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 */
250struct 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
301bool_t testAndSetSendPending(phFriNfc_LlcpTransport_t* transport);
302
303void 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*/
310NFCSTATUS 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*/
319NFCSTATUS 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*/
327NFCSTATUS 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*/
342NFCSTATUS 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*/
352NFCSTATUS 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 */
370NFCSTATUS 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*/
397NFCSTATUS 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*/
421NFCSTATUS 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* */
456NFCSTATUS 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*/
478NFCSTATUS 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*/
500NFCSTATUS 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*/
528NFCSTATUS 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*/
555NFCSTATUS 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*/
579NFCSTATUS 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*/
605NFCSTATUS 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*/
635NFCSTATUS 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*/
663NFCSTATUS 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*/
692NFCSTATUS 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*/
724NFCSTATUS 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*/
757NFCSTATUS 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*/
789NFCSTATUS 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