summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSylvain Fonteneau <sylvain.fonteneau@trusted-logic.com>2010-11-26 10:38:22 +0100
committerNick Pelly <npelly@google.com>2010-12-05 13:15:05 -0800
commit1c75e8952d88d81c5f04826f69ca22d14bb5683b (patch)
tree5bbd1ffc62f248e24c9a5410eb4ffda710547325
parente57ef4170474a0929b25bbdc8eb75f316ebffd56 (diff)
downloadexternal_libnfc-nxp-1c75e8952d88d81c5f04826f69ca22d14bb5683b.zip
external_libnfc-nxp-1c75e8952d88d81c5f04826f69ca22d14bb5683b.tar.gz
external_libnfc-nxp-1c75e8952d88d81c5f04826f69ca22d14bb5683b.tar.bz2
Call the callback of any pending action in case of LLCP socket closure.
This ensure the lib client not to be stuck waiting for a callback when the socket has been closed meanwhile. Change-Id: I9cdfa3c2cc75ee9451c3ad5b92eb338b5e68f53a
-rw-r--r--src/phFriNfc_LlcpTransport_Connection.c64
-rw-r--r--src/phFriNfc_LlcpTransport_Connectionless.c32
2 files changed, 79 insertions, 17 deletions
diff --git a/src/phFriNfc_LlcpTransport_Connection.c b/src/phFriNfc_LlcpTransport_Connection.c
index 50c3b3d..3f3c37a 100644
--- a/src/phFriNfc_LlcpTransport_Connection.c
+++ b/src/phFriNfc_LlcpTransport_Connection.c
@@ -106,6 +106,8 @@ static void phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB(void* p
psTransport->pSocketTable[psTransport->socketIndex].eSocket_State = phFriNfc_LlcpTransportSocket_eSocketConnected;
/* Call the Accept Callback */
psTransport->pSocketTable[psTransport->socketIndex].pfSocketAccept_Cb(psTransport->pSocketTable[psTransport->socketIndex].pAcceptContext,status);
+ psTransport->pSocketTable[psTransport->socketIndex].pfSocketAccept_Cb = NULL;
+ psTransport->pSocketTable[psTransport->socketIndex].pAcceptContext = NULL;
}break;
case phFriNfc_LlcpTransportSocket_eSocketRejected:
@@ -328,6 +330,48 @@ static void phFriNfc_LlcpTransport_ConnectionOriented_SendLlcp_CB(void* p
}
}
+static void phFriNfc_LlcpTransport_ConnectionOriented_Abort(phFriNfc_LlcpTransport_Socket_t * pLlcpSocket)
+{
+ if (pLlcpSocket->pfSocketSend_Cb != NULL)
+ {
+ pLlcpSocket->pfSocketSend_Cb(pLlcpSocket->pSendContext, NFCSTATUS_ABORTED);
+ pLlcpSocket->pfSocketSend_Cb = NULL;
+ }
+ pLlcpSocket->pSendContext = NULL;
+ if (pLlcpSocket->pfSocketRecv_Cb != NULL)
+ {
+ pLlcpSocket->pfSocketRecv_Cb(pLlcpSocket->pRecvContext, NFCSTATUS_ABORTED);
+ pLlcpSocket->pfSocketRecv_Cb = NULL;
+ }
+ pLlcpSocket->pRecvContext = NULL;
+ if (pLlcpSocket->pfSocketListen_Cb != NULL)
+ {
+ pLlcpSocket->pfSocketListen_Cb(pLlcpSocket->pListenContext, NULL);
+ pLlcpSocket->pfSocketListen_Cb = NULL;
+ }
+ pLlcpSocket->pListenContext = NULL;
+ if (pLlcpSocket->pfSocketAccept_Cb != NULL)
+ {
+ pLlcpSocket->pfSocketAccept_Cb(pLlcpSocket->pAcceptContext, NFCSTATUS_ABORTED);
+ pLlcpSocket->pfSocketAccept_Cb = NULL;
+ }
+ pLlcpSocket->pAcceptContext = NULL;
+ if (pLlcpSocket->pfSocketConnect_Cb != NULL)
+ {
+ pLlcpSocket->pfSocketConnect_Cb(pLlcpSocket->pConnectContext, 0, NFCSTATUS_ABORTED);
+ pLlcpSocket->pfSocketConnect_Cb = NULL;
+ }
+ pLlcpSocket->pConnectContext = NULL;
+ if (pLlcpSocket->pfSocketDisconnect_Cb != NULL)
+ {
+ pLlcpSocket->pfSocketDisconnect_Cb(pLlcpSocket->pDisonnectContext, NFCSTATUS_ABORTED);
+ pLlcpSocket->pfSocketDisconnect_Cb = NULL;
+ }
+ pLlcpSocket->pDisonnectContext = NULL;
+
+ pLlcpSocket->pfSocketRecvFrom_Cb = NULL;
+}
+
static NFCSTATUS phFriNfc_Llcp_Send_DisconnectMode_Frame(phFriNfc_LlcpTransport_t* psTransport,
uint8_t dsap,
uint8_t ssap,
@@ -870,8 +914,10 @@ static void Handle_ConnectionCompleteFrame(phFriNfc_LlcpTransport_t *psTran
psLocalLlcpSocket->remoteMIU = remoteMIU;
psLocalLlcpSocket->remoteRW = remoteRW;
- /* Call the Connect CB */
+ /* Call the Connect CB and reset callback info */
psLocalLlcpSocket->pfSocketConnect_Cb(psLocalLlcpSocket->pConnectContext,0x00,NFCSTATUS_SUCCESS);
+ psLocalLlcpSocket->pfSocketConnect_Cb = NULL;
+ psLocalLlcpSocket->pConnectContext = NULL;
}
else
{
@@ -2406,16 +2452,13 @@ static void phFriNfc_LlcpTransport_ConnectionOriented_DisconnectClose_CB(void*
pLlcpSocket->bSocketSendPending = FALSE;
pLlcpSocket->bSocketListenPending = FALSE;
pLlcpSocket->bSocketDiscPending = FALSE;
- pLlcpSocket->pfSocketSend_Cb = NULL;
- pLlcpSocket->pfSocketRecv_Cb = NULL;
- pLlcpSocket->pfSocketListen_Cb = NULL;
- pLlcpSocket->pfSocketConnect_Cb = NULL;
- pLlcpSocket->pfSocketDisconnect_Cb = NULL;
pLlcpSocket->socket_VS = 0;
pLlcpSocket->socket_VSA = 0;
pLlcpSocket->socket_VR = 0;
pLlcpSocket->socket_VRA = 0;
+ phFriNfc_LlcpTransport_ConnectionOriented_Abort(pLlcpSocket);
+
memset(&pLlcpSocket->sSocketOption, 0x00, sizeof(phFriNfc_LlcpTransport_sSocketOptions_t));
if (pLlcpSocket->sServiceName.buffer != NULL) {
@@ -2456,7 +2499,7 @@ NFCSTATUS phFriNfc_LlcpTransport_ConnectionOriented_Close(phFriNfc_LlcpTransport
}
else
{
- LLCP_PRINT("Socket Closed");
+ LLCP_PRINT("Socket not connected, no need to disconnect");
/* Reset the pointer to the socket closed */
pLlcpSocket->eSocket_State = phFriNfc_LlcpTransportSocket_eSocketDefault;
pLlcpSocket->eSocket_Type = phFriNfc_LlcpTransport_eDefaultType;
@@ -2470,16 +2513,13 @@ NFCSTATUS phFriNfc_LlcpTransport_ConnectionOriented_Close(phFriNfc_LlcpTransport
pLlcpSocket->bSocketDiscPending = FALSE;
pLlcpSocket->RemoteBusyConditionInfo = FALSE;
pLlcpSocket->ReceiverBusyCondition = FALSE;
- pLlcpSocket->pfSocketSend_Cb = NULL;
- pLlcpSocket->pfSocketRecv_Cb = NULL;
- pLlcpSocket->pfSocketListen_Cb = NULL;
- pLlcpSocket->pfSocketConnect_Cb = NULL;
- pLlcpSocket->pfSocketDisconnect_Cb = NULL;
pLlcpSocket->socket_VS = 0;
pLlcpSocket->socket_VSA = 0;
pLlcpSocket->socket_VR = 0;
pLlcpSocket->socket_VRA = 0;
+ phFriNfc_LlcpTransport_ConnectionOriented_Abort(pLlcpSocket);
+
memset(&pLlcpSocket->sSocketOption, 0x00, sizeof(phFriNfc_LlcpTransport_sSocketOptions_t));
if (pLlcpSocket->sServiceName.buffer != NULL) {
diff --git a/src/phFriNfc_LlcpTransport_Connectionless.c b/src/phFriNfc_LlcpTransport_Connectionless.c
index 72397ad..5648c11 100644
--- a/src/phFriNfc_LlcpTransport_Connectionless.c
+++ b/src/phFriNfc_LlcpTransport_Connectionless.c
@@ -72,6 +72,31 @@ static void phFriNfc_LlcpTransport_Connectionless_SendTo_CB(void* pContex
}
+static void phFriNfc_LlcpTransport_Connectionless_Abort(phFriNfc_LlcpTransport_Socket_t* pLlcpSocket)
+{
+ if (pLlcpSocket->pfSocketSend_Cb != NULL)
+ {
+ pLlcpSocket->pfSocketSend_Cb(pLlcpSocket->pSendContext, NFCSTATUS_ABORTED);
+ pLlcpSocket->pSendContext = NULL;
+ pLlcpSocket->pfSocketSend_Cb = NULL;
+ }
+ if (pLlcpSocket->pfSocketRecvFrom_Cb != NULL)
+ {
+ pLlcpSocket->pfSocketRecvFrom_Cb(pLlcpSocket->pRecvContext, 0, NFCSTATUS_ABORTED);
+ pLlcpSocket->pRecvContext = NULL;
+ pLlcpSocket->pfSocketRecvFrom_Cb = NULL;
+ pLlcpSocket->pfSocketRecv_Cb = NULL;
+ }
+ pLlcpSocket->pAcceptContext = NULL;
+ pLlcpSocket->pfSocketAccept_Cb = NULL;
+ pLlcpSocket->pListenContext = NULL;
+ pLlcpSocket->pfSocketListen_Cb = NULL;
+ pLlcpSocket->pConnectContext = NULL;
+ pLlcpSocket->pfSocketConnect_Cb = NULL;
+ pLlcpSocket->pDisonnectContext = NULL;
+ pLlcpSocket->pfSocketDisconnect_Cb = NULL;
+}
+
/**
* \ingroup grp_fri_nfc
* \brief <b>Close a socket on a LLCP-connectionless device</b>.
@@ -100,16 +125,13 @@ NFCSTATUS phFriNfc_LlcpTransport_Connectionless_Close(phFriNfc_LlcpTransport_Soc
pLlcpSocket->bSocketDiscPending = FALSE;
pLlcpSocket->RemoteBusyConditionInfo = FALSE;
pLlcpSocket->ReceiverBusyCondition = FALSE;
- pLlcpSocket->pfSocketSend_Cb = NULL;
- pLlcpSocket->pfSocketRecv_Cb = NULL;
- pLlcpSocket->pfSocketListen_Cb = NULL;
- pLlcpSocket->pfSocketConnect_Cb = NULL;
- pLlcpSocket->pfSocketDisconnect_Cb = NULL;
pLlcpSocket->socket_VS = 0;
pLlcpSocket->socket_VSA = 0;
pLlcpSocket->socket_VR = 0;
pLlcpSocket->socket_VRA = 0;
+ phFriNfc_LlcpTransport_Connectionless_Abort(pLlcpSocket);
+
memset(&pLlcpSocket->sSocketOption, 0x00, sizeof(phFriNfc_LlcpTransport_sSocketOptions_t));
if (pLlcpSocket->sServiceName.buffer != NULL) {