blob: 2f8343963835d7a30c2b0538ee754b239ff57fd7 [file] [log] [blame]
/*
* Copyright (C) 2010 NXP Semiconductors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* \file phFriNfc_LlcpTransport.h
* \brief
*
* Project: NFC-FRI
*
*/
#ifndef PHFRINFC_LLCP_TRANSPORT_H
#define PHFRINFC_LLCP_TRANSPORT_H
#include <phNfcHalTypes.h>
#include <phNfcLlcpTypes.h>
#include <phNfcTypes.h>
#include <phLibNfcStatus.h>
#include <phFriNfc_Llcp.h>
#include <phFriNfc_LlcpUtils.h>
#ifdef ANDROID
#include <string.h>
#include <pthread.h>
#endif
typedef uint32_t phFriNfc_Socket_Handle;
/**
* \ingroup grp_fri_nfc_llcp_mac
* \brief Declaration of a TRANSPORT type
*/
struct phFriNfc_LlcpTransport;
typedef struct phFriNfc_LlcpTransport phFriNfc_LlcpTransport_t;
struct phFriNfc_LlcpTransport_Socket;
typedef struct phFriNfc_LlcpTransport_Socket phFriNfc_LlcpTransport_Socket_t;
struct phFriNfc_Llcp_CachedServiceName;
typedef struct phFriNfc_Llcp_CachedServiceName phFriNfc_Llcp_CachedServiceName_t;
/*========== ENUMERATES ===========*/
/* Enum reperesents the different LLCP Link status*/
typedef enum phFriNfc_LlcpTransportSocket_eSocketState
{
phFriNfc_LlcpTransportSocket_eSocketDefault,
phFriNfc_LlcpTransportSocket_eSocketCreated,
phFriNfc_LlcpTransportSocket_eSocketBound,
phFriNfc_LlcpTransportSocket_eSocketRegistered,
phFriNfc_LlcpTransportSocket_eSocketConnected,
phFriNfc_LlcpTransportSocket_eSocketConnecting,
phFriNfc_LlcpTransportSocket_eSocketAccepted,
phFriNfc_LlcpTransportSocket_eSocketDisconnected,
phFriNfc_LlcpTransportSocket_eSocketDisconnecting,
phFriNfc_LlcpTransportSocket_eSocketRejected,
}phFriNfc_LlcpTransportSocket_eSocketState_t;
/*========== CALLBACKS ===========*/
/**
*\ingroup grp_fri_nfc
*
* \brief LLCP socket error notification callback definition
*/
typedef void (*pphFriNfc_LlcpTransportSocketErrCb_t) ( void* pContext,
uint8_t nErrCode);
/**
*\ingroup grp_fri_nfc
*
* \brief LLCP socket listen callback definition
*/
typedef void (*pphFriNfc_LlcpTransportSocketListenCb_t) (void* pContext,
phFriNfc_LlcpTransport_Socket_t *IncomingSocket);
/**
*\ingroup grp_fri_nfc
*
* \brief LLCP socket connect callback definition
*/
typedef void (*pphFriNfc_LlcpTransportSocketConnectCb_t) ( void* pContext,
uint8_t nErrCode,
NFCSTATUS status);
/**
*\ingroup grp_fri_nfc
*
* \brief LLCP socket disconnect callback definition
*/
typedef void (*pphFriNfc_LlcpTransportSocketDisconnectCb_t) (void* pContext,
NFCSTATUS status);
/**
*\ingroup grp_fri_nfc
*
* \brief LLCP socket accept callback definition
*/
typedef void (*pphFriNfc_LlcpTransportSocketAcceptCb_t) (void* pContext,
NFCSTATUS status);
/**
*\ingroup grp_fri_nfc
*
* \brief LLCP socket reject callback definition
*/
typedef void (*pphFriNfc_LlcpTransportSocketRejectCb_t) (void* pContext,
NFCSTATUS status);
/**
*\ingroup grp_fri_nfc
*
* \brief LLCP socket reception callback definition
*/
typedef void (*pphFriNfc_LlcpTransportSocketRecvCb_t) (void* pContext,
NFCSTATUS status);
/**
*\ingroup grp_fri_nfc
*
* \brief LLCP socket reception with SSAP callback definition
*/
typedef void (*pphFriNfc_LlcpTransportSocketRecvFromCb_t) (void* pContext,
uint8_t ssap,
NFCSTATUS status);
/**
*\ingroup grp_fri_nfc
*
* \brief LLCP socket emission callback definition
*/
typedef void (*pphFriNfc_LlcpTransportSocketSendCb_t) (void* pContext,
NFCSTATUS status);
/*========== STRUCTURES ===========*/
/**
* \ingroup grp_fri_nfc_llcp_mac
* \brief Declaration of a SOCKET type
*/
struct phFriNfc_LlcpTransport_Socket
{
phFriNfc_LlcpTransportSocket_eSocketState_t eSocket_State;
phFriNfc_LlcpTransport_eSocketType_t eSocket_Type;
phFriNfc_LlcpTransport_sSocketOptions_t sSocketOption;
pphFriNfc_LlcpTransportSocketErrCb_t pSocketErrCb;
/* Remote and local socket info */
uint8_t socket_sSap;
uint8_t socket_dSap;
// TODO: copy service name (could be deallocated by upper layer)
phNfc_sData_t sServiceName;
uint8_t remoteRW;
uint8_t localRW;
uint16_t remoteMIU;
uint16_t localMIUX;
uint8_t index;
/* SDP related fields */
uint8_t nTid;
/* Information Flags */
bool_t bSocketRecvPending;
bool_t bSocketSendPending;
bool_t bSocketListenPending;
bool_t bSocketDiscPending;
bool_t bSocketConnectPending;
bool_t bSocketAcceptPending;
bool_t bSocketRRPending;
bool_t bSocketRNRPending;
/* Buffers */
phNfc_sData_t sSocketSendBuffer;
phNfc_sData_t sSocketLinearBuffer;
phNfc_sData_t* sSocketRecvBuffer;
uint32_t *receivedLength;
uint32_t bufferLinearLength;
uint32_t bufferSendMaxLength;
uint32_t bufferRwMaxLength;
bool_t ReceiverBusyCondition;
bool_t RemoteBusyConditionInfo;
UTIL_FIFO_BUFFER sCyclicFifoBuffer;
uint32_t indexRwRead;
uint32_t indexRwWrite;
/* Construction Frame */
phFriNfc_Llcp_sPacketHeader_t sLlcpHeader;
phFriNfc_Llcp_sPacketSequence_t sSequence;
uint8_t socket_VS;
uint8_t socket_VSA;
uint8_t socket_VR;
uint8_t socket_VRA;
/* Callbacks */
pphFriNfc_LlcpTransportSocketAcceptCb_t pfSocketAccept_Cb;
pphFriNfc_LlcpTransportSocketSendCb_t pfSocketSend_Cb;
pphFriNfc_LlcpTransportSocketRecvFromCb_t pfSocketRecvFrom_Cb;
pphFriNfc_LlcpTransportSocketRecvCb_t pfSocketRecv_Cb;
pphFriNfc_LlcpTransportSocketListenCb_t pfSocketListen_Cb;
pphFriNfc_LlcpTransportSocketConnectCb_t pfSocketConnect_Cb;
pphFriNfc_LlcpTransportSocketDisconnectCb_t pfSocketDisconnect_Cb;
/* Table of PHFRINFC_LLCP_RW_MAX Receive Windows Buffers */
phNfc_sData_t sSocketRwBufferTable[PHFRINFC_LLCP_RW_MAX];
/* Pointer a the socket table */
phFriNfc_LlcpTransport_t *psTransport;
/* Context */
void *pListenContext;
void *pAcceptContext;
void *pRejectContext;
void *pConnectContext;
void *pDisconnectContext;
void *pSendContext;
void *pRecvContext;
void *pContext;
};
/**
* \ingroup grp_fri_nfc_llcp_mac
* \brief TODO
*/
struct phFriNfc_Llcp_CachedServiceName
{
phNfc_sData_t sServiceName;
uint8_t nSap;
};
/**
* \ingroup grp_fri_nfc_llcp_mac
* \brief Declaration of a TRANSPORT Type with a table of PHFRINFC_LLCP_NB_SOCKET_DEFAULT sockets
* and a pointer a Llcp layer
*/
struct phFriNfc_LlcpTransport
{
phFriNfc_LlcpTransport_Socket_t pSocketTable[PHFRINFC_LLCP_NB_SOCKET_MAX];
phFriNfc_Llcp_CachedServiceName_t pCachedServiceNames[PHFRINFC_LLCP_SDP_ADVERTISED_NB];
phFriNfc_Llcp_t *pLlcp;
pthread_mutex_t mutex;
bool_t bSendPending;
bool_t bRecvPending;
bool_t bDmPending;
bool_t bFrmrPending;
phFriNfc_Llcp_LinkSend_CB_t pfLinkSendCb;
void *pLinkSendContext;
uint8_t socketIndex;
/**< Info field of pending FRMR packet*/
uint8_t FrmrInfoBuffer[4];
phFriNfc_Llcp_sPacketHeader_t sLlcpHeader;
phFriNfc_Llcp_sPacketSequence_t sSequence;
/**< Info field of pending DM packet*/
phFriNfc_Llcp_sPacketHeader_t sDmHeader;
phNfc_sData_t sDmPayload;
uint8_t DmInfoBuffer[3];
uint8_t LinkStatusError;
/**< Service discovery related infos */
phNfc_sData_t *psDiscoveryServiceNameList;
uint8_t *pnDiscoverySapList;
uint8_t nDiscoveryListSize;
uint8_t nDiscoveryReqOffset;
uint8_t nDiscoveryResOffset;
uint8_t nDiscoveryResTidList[PHFRINFC_LLCP_SNL_RESPONSE_MAX];
uint8_t nDiscoveryResSapList[PHFRINFC_LLCP_SNL_RESPONSE_MAX];
uint8_t nDiscoveryResListSize;
uint8_t pDiscoveryBuffer[PHFRINFC_LLCP_MIU_DEFAULT];
pphFriNfc_Cr_t pfDiscover_Cb;
void *pDiscoverContext;
};
/*
################################################################################
********************** TRANSPORT Interface Function Prototype *****************
################################################################################
*/
bool_t testAndSetSendPending(phFriNfc_LlcpTransport_t* transport);
void clearSendPending(phFriNfc_LlcpTransport_t* transport);
/**
* \ingroup grp_fri_nfc
* \brief <b>Create a socket on a LLCP-connected device</b>.
*
*/
NFCSTATUS phFriNfc_LlcpTransport_Reset (phFriNfc_LlcpTransport_t *pLlcpSocketTable,
phFriNfc_Llcp_t *pLlcp);
/**
* \ingroup grp_fri_nfc
* \brief <b>Close all existing sockets</b>.
*
*/
NFCSTATUS phFriNfc_LlcpTransport_CloseAll (phFriNfc_LlcpTransport_t *pLlcpSocketTable);
/**
* \ingroup grp_fri_nfc
* \brief <b>Used by transport layers to request a send on link layer</b>.
*
*/
NFCSTATUS phFriNfc_LlcpTransport_LinkSend( phFriNfc_LlcpTransport_t *LlcpTransport,
phFriNfc_Llcp_sPacketHeader_t *psHeader,
phFriNfc_Llcp_sPacketSequence_t *psSequence,
phNfc_sData_t *psInfo,
phFriNfc_Llcp_LinkSend_CB_t pfSend_CB,
uint8_t socketIndex,
void *pContext );
/**
* \ingroup grp_fri_nfc
* \brief <b>Used by transport layers to send a DM frame</b>.
*
* This function is only used when the DM is not related to a DISC on a socket.
*/
NFCSTATUS phFriNfc_LlcpTransport_SendDisconnectMode(phFriNfc_LlcpTransport_t* psTransport,
uint8_t dsap,
uint8_t ssap,
uint8_t dmOpCode);
/**
* \ingroup grp_fri_nfc
* \brief <b>Used by transport layers to send a FRMR frame</b>.
*
*/
NFCSTATUS phFriNfc_LlcpTransport_SendFrameReject(phFriNfc_LlcpTransport_t *psTransport,
uint8_t dsap,
uint8_t rejectedPTYPE,
uint8_t ssap,
phFriNfc_Llcp_sPacketSequence_t* sLlcpSequence,
uint8_t WFlag,
uint8_t IFlag,
uint8_t RFlag,
uint8_t SFlag,
uint8_t vs,
uint8_t vsa,
uint8_t vr,
uint8_t vra);
/*!
* \ingroup grp_fri_nfc
* \brief <b>Discover remote services SAP using SDP protocol</b>.
*/
NFCSTATUS phFriNfc_LlcpTransport_DiscoverServices( phFriNfc_LlcpTransport_t *pLlcpTransport,
phNfc_sData_t *psServiceNameList,
uint8_t *pnSapList,
uint8_t nListSize,
pphFriNfc_Cr_t pDiscover_Cb,
void *pContext );
/**
* \ingroup grp_lib_nfc
* \brief <b>Get the local options of a socket</b>.
*
* This function returns the local options (maximum packet size and receive window size) used
* for a given connection-oriented socket. This function shall not be used with connectionless
* sockets.
*
* \param[out] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t.
* \param[in] psLocalOptions A pointer to be filled with the local options of the socket.
*
* \retval NFCSTATUS_SUCCESS Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
* could not be properly interpreted.
* \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of
* a valid type to perform the requsted operation.
* \retval NFCSTATUS_NOT_INITIALISED Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN Shutdown in progress.
* \retval NFCSTATUS_FAILED Operation failed.
*/
NFCSTATUS phFriNfc_LlcpTransport_SocketGetLocalOptions(phFriNfc_LlcpTransport_Socket_t *pLlcpSocket,
phLibNfc_Llcp_sSocketOptions_t *psLocalOptions);
/**
* \ingroup grp_lib_nfc
* \brief <b>Get the local options of a socket</b>.
*
* This function returns the remote options (maximum packet size and receive window size) used
* for a given connection-oriented socket. This function shall not be used with connectionless
* sockets.
*
* \param[out] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t.
* \param[in] psRemoteOptions A pointer to be filled with the remote options of the socket.
*
* \retval NFCSTATUS_SUCCESS Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
* could not be properly interpreted.
* \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of
* a valid type to perform the requsted operation.
* \retval NFCSTATUS_NOT_INITIALISED Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN Shutdown in progress.
* \retval NFCSTATUS_FAILED Operation failed.
*/
NFCSTATUS phFriNfc_LlcpTransport_SocketGetRemoteOptions(phFriNfc_LlcpTransport_Socket_t* pLlcpSocket,
phLibNfc_Llcp_sSocketOptions_t* psRemoteOptions);
/**
* \ingroup grp_fri_nfc
* \brief <b>Create a socket on a LLCP-connected device</b>.
*
* This function creates a socket for a given LLCP link. Sockets can be of two types :
* connection-oriented and connectionless. If the socket is connection-oriented, the caller
* must provide a working buffer to the socket in order to handle incoming data. This buffer
* must be large enough to fit the receive window (RW * MIU), the remaining space being
* used as a linear buffer to store incoming data as a stream. Data will be readable later
* using the phLibNfc_LlcpTransport_Recv function.
* The options and working buffer are not required if the socket is used as a listening socket,
* since it cannot be directly used for communication.
*
* \param[in] pLlcpSocketTable A pointer to a table of PHFRINFC_LLCP_NB_SOCKET_DEFAULT sockets.
* \param[in] eType The socket type.
* \param[in] psOptions The options to be used with the socket.
* \param[in] psWorkingBuffer A working buffer to be used by the library.
* \param[out] pLlcpSocket A pointer to a socket pointer to be filled with a
socket found on the socket table.
* \param[in] pErr_Cb The callback to be called each time the socket
* is in error.
* \param[in] pContext Upper layer context to be returned in the callback.
*
* \retval NFCSTATUS_SUCCESS Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
* could not be properly interpreted.
* \retval NFCSTATUS_BUFFER_TOO_SMALL The working buffer is too small for the MIU and RW
* declared in the options.
* \retval NFCSTATUS_INSUFFICIENT_RESOURCES No more socket handle available.
* \retval NFCSTATUS_FAILED Operation failed.
* */
NFCSTATUS phFriNfc_LlcpTransport_Socket(phFriNfc_LlcpTransport_t *pLlcpSocketTable,
phFriNfc_LlcpTransport_eSocketType_t eType,
phFriNfc_LlcpTransport_sSocketOptions_t* psOptions,
phNfc_sData_t* psWorkingBuffer,
phFriNfc_LlcpTransport_Socket_t **pLlcpSocket,
pphFriNfc_LlcpTransportSocketErrCb_t pErr_Cb,
void* pContext);
/**
* \ingroup grp_fri_nfc
* \brief <b>Close a socket on a LLCP-connected device</b>.
*
* This function closes a LLCP socket previously created using phFriNfc_LlcpTransport_Socket.
* If the socket was connected, it is first disconnected, and then closed.
*
* \param[in] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t.
* \retval NFCSTATUS_SUCCESS Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
* could not be properly interpreted.
* \retval NFCSTATUS_FAILED Operation failed.
*/
NFCSTATUS phFriNfc_LlcpTransport_Close(phFriNfc_LlcpTransport_Socket_t* pLlcpSocket);
/**
* \ingroup grp_fri_nfc
* \brief <b>Bind a socket to a local SAP</b>.
*
* This function binds the socket to a local Service Access Point.
*
* \param[out] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t.
* \param[in] pConfigInfo A port number for a specific socket
* \param TODO
*
* \retval NFCSTATUS_SUCCESS Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
* could not be properly interpreted.
* \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of
* a valid type to perform the requsted operation.
* \retval NFCSTATUS_ALREADY_REGISTERED The selected SAP is already bound to another
socket.
* \retval NFCSTATUS_FAILED Operation failed.
*/
NFCSTATUS phFriNfc_LlcpTransport_Bind(phFriNfc_LlcpTransport_Socket_t *pLlcpSocket,
uint8_t nSap,
phNfc_sData_t *psServiceName);
/**
* \ingroup grp_fri_nfc
* \brief <b>Listen for incoming connection requests on a socket</b>.
*
* This function switches a socket into a listening state and registers a callback on
* incoming connection requests. In this state, the socket is not able to communicate
* directly. The listening state is only available for connection-oriented sockets
* which are still not connected. The socket keeps listening until it is closed, and
* thus can trigger several times the pListen_Cb callback.
*
*
* \param[in] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t.
* \param[in] pListen_Cb The callback to be called each time the
* socket receive a connection request.
* \param[in] pContext Upper layer context to be returned in
* the callback.
*
* \retval NFCSTATUS_SUCCESS Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
* could not be properly interpreted.
* \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state to switch
* to listening state.
* \retval NFCSTATUS_FAILED Operation failed.
*/
NFCSTATUS phFriNfc_LlcpTransport_Listen(phFriNfc_LlcpTransport_Socket_t* pLlcpSocket,
pphFriNfc_LlcpTransportSocketListenCb_t pListen_Cb,
void* pContext);
/**
* \ingroup grp_fri_nfc
* \brief <b>Accept an incoming connection request for a socket</b>.
*
* This functions allows the client to accept an incoming connection request.
* It must be used with the socket provided within the listen callback. The socket
* is implicitly switched to the connected state when the function is called.
*
* \param[in] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t.
* \param[in] psOptions The options to be used with the socket.
* \param[in] psWorkingBuffer A working buffer to be used by the library.
* \param[in] pErr_Cb The callback to be called each time the accepted socket
* is in error.
* \param[in] pAccept_RspCb The callback to be called when the Accept operation is completed
* \param[in] pContext Upper layer context to be returned in the callback.
*
* \retval NFCSTATUS_SUCCESS Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
* could not be properly interpreted.
* \retval NFCSTATUS_BUFFER_TOO_SMALL The working buffer is too small for the MIU and RW
* declared in the options.
* \retval NFCSTATUS_FAILED Operation failed.
*/
NFCSTATUS phFriNfc_LlcpTransport_Accept(phFriNfc_LlcpTransport_Socket_t* pLlcpSocket,
phFriNfc_LlcpTransport_sSocketOptions_t* psOptions,
phNfc_sData_t* psWorkingBuffer,
pphFriNfc_LlcpTransportSocketErrCb_t pErr_Cb,
pphFriNfc_LlcpTransportSocketAcceptCb_t pAccept_RspCb,
void* pContext);
/**
* \ingroup grp_fri_nfc
* \brief <b>Reject an incoming connection request for a socket</b>.
*
* This functions allows the client to reject an incoming connection request.
* It must be used with the socket provided within the listen callback. The socket
* is implicitly closed when the function is called.
*
* \param[in] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t.
* \param[in] pReject_RspCb The callback to be called when the Reject operation is completed
* \param[in] pContext Upper layer context to be returned in the callback.
*
* \retval NFCSTATUS_SUCCESS Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
* could not be properly interpreted.
* \retval NFCSTATUS_FAILED Operation failed.
*/
NFCSTATUS phFriNfc_LlcpTransport_Reject( phFriNfc_LlcpTransport_Socket_t* pLlcpSocket,
pphFriNfc_LlcpTransportSocketRejectCb_t pReject_RspCb,
void *pContext);
/**
* \ingroup grp_fri_nfc
* \brief <b>Try to establish connection with a socket on a remote SAP</b>.
*
* This function tries to connect to a given SAP on the remote peer. If the
* socket is not bound to a local SAP, it is implicitly bound to a free SAP.
*
* \param[in] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t.
* \param[in] nSap The destination SAP to connect to.
* \param[in] pConnect_RspCb The callback to be called when the connection
* operation is completed.
* \param[in] pContext Upper layer context to be returned in
* the callback.
*
* \retval NFCSTATUS_SUCCESS Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
* could not be properly interpreted.
* \retval NFCSTATUS_PENDING Connection operation is in progress,
* pConnect_RspCb will be called upon completion.
* \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of
* a valid type to perform the requsted operation.
* \retval NFCSTATUS_FAILED Operation failed.
*/
NFCSTATUS phFriNfc_LlcpTransport_Connect( phFriNfc_LlcpTransport_Socket_t* pLlcpSocket,
uint8_t nSap,
pphFriNfc_LlcpTransportSocketConnectCb_t pConnect_RspCb,
void* pContext);
/**
* \ingroup grp_fri_nfc
* \brief <b>Try to establish connection with a socket on a remote service, given its URI</b>.
*
* This function tries to connect to a SAP designated by an URI. If the
* socket is not bound to a local SAP, it is implicitly bound to a free SAP.
*
* \param[in] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t.
* \param[in] psUri The URI corresponding to the destination SAP to connect to.
* \param[in] pConnect_RspCb The callback to be called when the connection
* operation is completed.
* \param[in] pContext Upper layer context to be returned in
* the callback.
*
* \retval NFCSTATUS_SUCCESS Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
* could not be properly interpreted.
* \retval NFCSTATUS_PENDING Connection operation is in progress,
* pConnect_RspCb will be called upon completion.
* \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of
* a valid type to perform the requsted operation.
* \retval NFCSTATUS_NOT_INITIALISED Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN Shutdown in progress.
* \retval NFCSTATUS_FAILED Operation failed.
*/
NFCSTATUS phFriNfc_LlcpTransport_ConnectByUri(phFriNfc_LlcpTransport_Socket_t* pLlcpSocket,
phNfc_sData_t* psUri,
pphFriNfc_LlcpTransportSocketConnectCb_t pConnect_RspCb,
void* pContext);
/**
* \ingroup grp_lib_nfc
* \brief <b>Disconnect a currently connected socket</b>.
*
* This function initiates the disconnection of a previously connected socket.
*
* \param[in] pLlcpSocket A pointer to a phFriNfc_LlcpTransport_Socket_t.
* \param[in] pDisconnect_RspCb The callback to be called when the
* operation is completed.
* \param[in] pContext Upper layer context to be returned in
* the callback.
*
* \retval NFCSTATUS_SUCCESS Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
* could not be properly interpreted.
* \retval NFCSTATUS_PENDING Disconnection operation is in progress,
* pDisconnect_RspCb will be called upon completion.
* \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of
* a valid type to perform the requsted operation.
* \retval NFCSTATUS_NOT_INITIALISED Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN Shutdown in progress.
* \retval NFCSTATUS_FAILED Operation failed.
*/
NFCSTATUS phFriNfc_LlcpTransport_Disconnect(phFriNfc_LlcpTransport_Socket_t* pLlcpSocket,
pphLibNfc_LlcpSocketDisconnectCb_t pDisconnect_RspCb,
void* pContext);
/**
* \ingroup grp_fri_nfc
* \brief <b>Send data on a socket</b>.
*
* This function is used to write data on a socket. This function
* can only be called on a connection-oriented socket which is already
* in a connected state.
*
*
* \param[in] hSocket Socket handle obtained during socket creation.
* \param[in] psBuffer The buffer containing the data to send.
* \param[in] pSend_RspCb The callback to be called when the
* operation is completed.
* \param[in] pContext Upper layer context to be returned in
* the callback.
*
* \retval NFCSTATUS_SUCCESS Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
* could not be properly interpreted.
* \retval NFCSTATUS_PENDING Reception operation is in progress,
* pSend_RspCb will be called upon completion.
* \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of
* a valid type to perform the requsted operation.
* \retval NFCSTATUS_FAILED Operation failed.
*/
NFCSTATUS phFriNfc_LlcpTransport_Send(phFriNfc_LlcpTransport_Socket_t* pLlcpSocket,
phNfc_sData_t* psBuffer,
pphFriNfc_LlcpTransportSocketSendCb_t pSend_RspCb,
void* pContext);
/**
* \ingroup grp_fri_nfc
* \brief <b>Read data on a socket</b>.
*
* This function is used to read data from a socket. It reads at most the
* size of the reception buffer, but can also return less bytes if less bytes
* are available. If no data is available, the function will be pending until
* more data comes, and the response will be sent by the callback. This function
* can only be called on a connection-oriented socket.
*
*
* \param[in] hSocket Socket handle obtained during socket creation.
* \param[in] psBuffer The buffer receiving the data.
* \param[in] pRecv_RspCb The callback to be called when the
* operation is completed.
* \param[in] pContext Upper layer context to be returned in
* the callback.
*
* \retval NFCSTATUS_SUCCESS Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
* could not be properly interpreted.
* \retval NFCSTATUS_PENDING Reception operation is in progress,
* pRecv_RspCb will be called upon completion.
* \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of
* a valid type to perform the requsted operation.
* \retval NFCSTATUS_FAILED Operation failed.
*/
NFCSTATUS phFriNfc_LlcpTransport_Recv( phFriNfc_LlcpTransport_Socket_t* pLlcpSocket,
phNfc_sData_t* psBuffer,
pphFriNfc_LlcpTransportSocketRecvCb_t pRecv_RspCb,
void* pContext);
/**
* \ingroup grp_lib_nfc
* \brief <b>Read data on a socket and get the source SAP</b>.
*
* This function is the same as phLibNfc_Llcp_Recv, except that the callback includes
* the source SAP. This functions can only be called on a connectionless socket.
*
*
* \param[in] pLlcpSocket A pointer to a LlcpSocket created.
* \param[in] psBuffer The buffer receiving the data.
* \param[in] pRecv_RspCb The callback to be called when the
* operation is completed.
* \param[in] pContext Upper layer context to be returned in
* the callback.
*
* \retval NFCSTATUS_SUCCESS Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
* could not be properly interpreted.
* \retval NFCSTATUS_PENDING Reception operation is in progress,
* pRecv_RspCb will be called upon completion.
* \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of
* a valid type to perform the requsted operation.
* \retval NFCSTATUS_NOT_INITIALISED Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN Shutdown in progress.
* \retval NFCSTATUS_FAILED Operation failed.
*/
NFCSTATUS phFriNfc_LlcpTransport_RecvFrom( phFriNfc_LlcpTransport_Socket_t *pLlcpSocket,
phNfc_sData_t* psBuffer,
pphFriNfc_LlcpTransportSocketRecvFromCb_t pRecv_Cb,
void *pContext);
/**
* \ingroup grp_fri_nfc
* \brief <b>Send data on a socket to a given destination SAP</b>.
*
* This function is used to write data on a socket to a given destination SAP.
* This function can only be called on a connectionless socket.
*
*
* \param[in] pLlcpSocket A pointer to a LlcpSocket created.
* \param[in] nSap The destination SAP.
* \param[in] psBuffer The buffer containing the data to send.
* \param[in] pSend_RspCb The callback to be called when the
* operation is completed.
* \param[in] pContext Upper layer context to be returned in
* the callback.
*
* \retval NFCSTATUS_SUCCESS Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
* could not be properly interpreted.
* \retval NFCSTATUS_PENDING Reception operation is in progress,
* pSend_RspCb will be called upon completion.
* \retval NFCSTATUS_INVALID_STATE The socket is not in a valid state, or not of
* a valid type to perform the requsted operation.
* \retval NFCSTATUS_NOT_INITIALISED Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN Shutdown in progress.
* \retval NFCSTATUS_FAILED Operation failed.
*/
NFCSTATUS phFriNfc_LlcpTransport_SendTo( phFriNfc_LlcpTransport_Socket_t *pLlcpSocket,
uint8_t nSap,
phNfc_sData_t* psBuffer,
pphFriNfc_LlcpTransportSocketSendCb_t pSend_RspCb,
void* pContext);
#endif /* PHFRINFC_LLCP_TRANSPORT_H */