diff --git a/src/rm_transport.c b/src/rm_transport.c
index 8f0fa5529a00f1c4021ec1a7dd1f89c6abe9d7dc..50d4ec2304f196837d334df572ecc1eff3b8dd54 100644 (file)
--- a/src/rm_transport.c
+++ b/src/rm_transport.c
********************** Internal Functions ****************************\r
**********************************************************************/\r
\r
-Rm_Transport *transportAdd(Rm_TransportCfg *transportCfg)\r
+static Rm_Transport *transportAdd(Rm_TransportCfg *transportCfg)\r
{\r
Rm_Inst *rmInst = (Rm_Inst *) transportCfg->rmHandle;\r
Rm_Transport *transports = rmInst->transports;\r
Rm_Transport *newTransport = NULL;\r
\r
newTransport = Rm_osalMalloc (sizeof(Rm_Transport));\r
+ memset((void *)newTransport, 0, sizeof(Rm_Transport));\r
\r
if (newTransport) {\r
newTransport->rmHandle = transportCfg->rmHandle;\r
+ newTransport->appTransportHandle = transportCfg->appTransportHandle;\r
newTransport->remoteInstType = transportCfg->remoteInstType;\r
- strncpy(&(newTransport->remoteInstName)[0], transportCfg->remoteInstName, RM_NAME_MAX_CHARS);\r
+ strncpy(newTransport->remoteInstName, transportCfg->remoteInstName, RM_NAME_MAX_CHARS);\r
newTransport->nextTransport = NULL;\r
\r
if (transports) {\r
- while (transports->nextTransport != NULL) {\r
+ while (transports->nextTransport) {\r
transports = transports->nextTransport;\r
}\r
transports->nextTransport = newTransport;\r
}\r
else {\r
- rmInst->transports = (void *) newTransport;\r
+ rmInst->transports = (void *)newTransport;\r
}\r
}\r
return (newTransport);\r
}\r
\r
-Rm_Transport *transportFindTransportHandle(Rm_Transport *transports, \r
- Rm_TransportHandle transportHandle)\r
+static bool transportIsTransportRegistered(Rm_Handle rmHandle, Rm_Transport *transport)\r
{\r
- while (transports) {\r
- if (transports == ((Rm_Transport *)transportHandle)) {\r
- break; \r
+ Rm_Inst *rmInst = (Rm_Inst *)rmHandle;\r
+ Rm_Transport *transportList = (Rm_Transport *)rmInst->transports;\r
+ \r
+ while (transportList) {\r
+ if (transportList == transport) {\r
+ return(TRUE); \r
}\r
- transports = transports->nextTransport;\r
+ transportList = transportList->nextTransport;\r
}\r
- return (transports);\r
+ return (FALSE);\r
}\r
\r
-int32_t transportDelete(Rm_Handle rmHandle, Rm_TransportHandle transportHandle)\r
+static void transportDelete(Rm_Transport *transport)\r
{\r
- Rm_Inst *rmInst = (Rm_Inst *)rmHandle;\r
- Rm_Transport *transport = (Rm_Transport *) rmInst->transports;\r
+ Rm_Inst *rmInst = (Rm_Inst *)transport->rmHandle;\r
+ Rm_Transport *transportList = (Rm_Transport *)rmInst->transports;\r
Rm_Transport *prevTransport = NULL;\r
\r
- while (transport) {\r
- if (transport == (Rm_Transport *)transportHandle) {\r
+ /* Get previous transport in list */\r
+ while (transportList) {\r
+ if (transportList == transport) {\r
break; \r
}\r
- prevTransport = transport;\r
- transport = transport->nextTransport;\r
+ prevTransport = transportList;\r
+ transportList = transportList->nextTransport;\r
}\r
\r
- if (transport) {\r
- if (prevTransport == NULL) {\r
- rmInst->transports = (void *) transport->nextTransport;\r
- }\r
- else {\r
- prevTransport->nextTransport = transport->nextTransport;\r
- }\r
- Rm_osalFree((void *) transport, sizeof(Rm_Transport));\r
+ if (prevTransport == NULL) {\r
+ rmInst->transports = (void *)transport->nextTransport;\r
}\r
else {\r
- return (RM_TRANSPORT_ERROR_HANDLE_HAS_NOT_BEEN_REGISTERED);\r
+ prevTransport->nextTransport = transport->nextTransport;\r
}\r
- return (RM_TRANSPORT_SUCCESSFUL);\r
+ Rm_osalFree((void *)transport, sizeof(Rm_Transport));\r
}\r
\r
Rm_Transport *rmTransportFindRemoteName(Rm_Transport *transports, char *remoteName)\r
{\r
while (transports) {\r
- if (strcmp(transports->remoteInstName, remoteName) == 0) {\r
+ if (strncmp(transports->remoteInstName, remoteName, RM_NAME_MAX_CHARS) == 0) {\r
break; \r
}\r
transports = transports->nextTransport;\r
@@ -147,22 +146,19 @@ Rm_Transport *rmTransportFindRemoteInstType(Rm_Transport *transports, Rm_InstTyp
return (transports);\r
}\r
\r
-Rm_Packet *rmTransportCreateResourceReqPkt(Rm_Inst *rmInst, Rm_Transport *dstTransport,\r
- Rm_Transaction *transaction)\r
+Rm_PacketHandle rmTransportCreateResourceReqPkt(Rm_Inst *rmInst, Rm_AppTransportHandle appTransport,\r
+ Rm_Transaction *transaction)\r
{\r
Rm_Packet *rmPkt = NULL;\r
+ Rm_PacketHandle pktHandle = NULL;\r
Rm_ResourceRequestPkt *resourceReqPkt = NULL;\r
\r
- if ((rmPkt = rmInst->transport.rmAllocPkt((Rm_TransportHandle)dstTransport, sizeof(Rm_Packet))) ==\r
- NULL) {\r
+ if ((rmPkt = rmInst->transportCallouts.rmAllocPkt(appTransport, \r
+ sizeof(Rm_Packet),\r
+ &pktHandle)) == NULL) {\r
transaction->state = RM_SERVICE_ERROR_TRANSPORT_ALLOC_PKT_ERROR;\r
return (NULL);\r
}\r
-\r
- if (rmPkt->pktLenBytes < (sizeof(Rm_ResourceRequestPkt) + sizeof(uint32_t) + sizeof(Rm_pktType))) { \r
- transaction->state = RM_SERVICE_ERROR_TRANSPORT_PKT_BUF_TOO_SMALL;\r
- return (NULL);\r
- }\r
\r
rmPkt->pktType = Rm_pktType_RESOURCE_REQUEST;\r
resourceReqPkt = (Rm_ResourceRequestPkt *) rmPkt->data;\r
@@ -183,54 +179,49 @@ Rm_Packet *rmTransportCreateResourceReqPkt(Rm_Inst *rmInst, Rm_Transport *dstTra
strncpy(resourceReqPkt->serviceSrcInstName, transaction->serviceSrcInstName, RM_NAME_MAX_CHARS);\r
memcpy ((void *)&(resourceReqPkt->resourceInfo), (void *)&(transaction->resourceInfo),\r
sizeof(Rm_ResourceInfo));\r
- return (rmPkt);\r
+ \r
+ return (pktHandle);\r
}\r
\r
-Rm_Packet *rmTransportCreateResourceResponsePkt(Rm_Inst *rmInst, Rm_Transport *dstTransport,\r
- Rm_Transaction *transaction)\r
+Rm_PacketHandle rmTransportCreateResourceResponsePkt(Rm_Inst *rmInst, Rm_AppTransportHandle appTransport,\r
+ Rm_Transaction *transaction)\r
{\r
Rm_Packet *rmPkt = NULL;\r
+ Rm_PacketHandle pktHandle = NULL;\r
Rm_ResourceResponsePkt *resourceRespPkt = NULL;\r
\r
- if ((rmPkt = rmInst->transport.rmAllocPkt((Rm_TransportHandle)dstTransport, sizeof(Rm_Packet))) ==\r
- NULL) {\r
+ if ((rmPkt = rmInst->transportCallouts.rmAllocPkt(appTransport, \r
+ sizeof(Rm_Packet),\r
+ &pktHandle)) == NULL) {\r
transaction->state = RM_SERVICE_ERROR_TRANSPORT_ALLOC_PKT_ERROR;\r
return (NULL);\r
}\r
-\r
- if (rmPkt->pktLenBytes < (sizeof(Rm_ResourceResponsePkt) + sizeof(uint32_t) + sizeof(Rm_pktType))) { \r
- transaction->state = RM_SERVICE_ERROR_TRANSPORT_PKT_BUF_TOO_SMALL;\r
- return (NULL);\r
- } \r
- rmPkt->pktType = Rm_pktType_RESOURCE_RESPONSE;\r
- \r
+ \r
+ rmPkt->pktType = Rm_pktType_RESOURCE_RESPONSE; \r
resourceRespPkt = (Rm_ResourceResponsePkt *)rmPkt->data;\r
resourceRespPkt->responseId = transaction->remoteOriginatingId;\r
resourceRespPkt->requestState = transaction->state;\r
memcpy ((void *)&(resourceRespPkt->resourceInfo), (void *)&(transaction->resourceInfo),\r
sizeof(Rm_ResourceInfo));\r
\r
- return (rmPkt);\r
+ return (pktHandle);\r
}\r
\r
-Rm_Packet *rmTransportCreateNsRequestPkt(Rm_Inst *rmInst, Rm_Transport *dstTransport,\r
- Rm_Transaction *transaction)\r
+Rm_PacketHandle rmTransportCreateNsRequestPkt(Rm_Inst *rmInst, Rm_AppTransportHandle appTransport,\r
+ Rm_Transaction *transaction)\r
{\r
Rm_Packet *rmPkt = NULL;\r
+ Rm_PacketHandle pktHandle = NULL; \r
Rm_NsRequestPkt *nsReqPkt = NULL;\r
\r
- if ((rmPkt = rmInst->transport.rmAllocPkt((Rm_TransportHandle)dstTransport, sizeof(Rm_Packet))) ==\r
- NULL) {\r
+ if ((rmPkt = rmInst->transportCallouts.rmAllocPkt(appTransport, \r
+ sizeof(Rm_Packet),\r
+ &pktHandle)) == NULL) {\r
transaction->state = RM_SERVICE_ERROR_TRANSPORT_ALLOC_PKT_ERROR;\r
return (NULL);\r
}\r
\r
- if (rmPkt->pktLenBytes < (sizeof(Rm_NsRequestPkt) + sizeof(uint32_t) + sizeof(Rm_pktType))) { \r
- transaction->state = RM_SERVICE_ERROR_TRANSPORT_PKT_BUF_TOO_SMALL;\r
- return (NULL);\r
- }\r
- rmPkt->pktType = Rm_pktType_NAMESERVER_REQUEST;\r
- \r
+ rmPkt->pktType = Rm_pktType_NAMESERVER_REQUEST; \r
nsReqPkt = (Rm_NsRequestPkt *)rmPkt->data;\r
nsReqPkt->requestId = transaction->localId;\r
if (transaction->type == Rm_service_RESOURCE_MAP_TO_NAME) {\r
@@ -243,33 +234,30 @@ Rm_Packet *rmTransportCreateNsRequestPkt(Rm_Inst *rmInst, Rm_Transport *dstTrans
strncpy(nsReqPkt->serviceSrcInstName, transaction->serviceSrcInstName, RM_NAME_MAX_CHARS);\r
memcpy ((void *)&(nsReqPkt->resourceInfo), (void *)&(transaction->resourceInfo),\r
sizeof(Rm_ResourceInfo));\r
-\r
- return (rmPkt);\r
+ \r
+ return (pktHandle);\r
}\r
\r
-Rm_Packet *rmTransportCreateNsResponsePkt(Rm_Inst *rmInst, Rm_Transport *dstTransport,\r
- Rm_Transaction *transaction)\r
+Rm_PacketHandle rmTransportCreateNsResponsePkt(Rm_Inst *rmInst, Rm_AppTransportHandle appTransport,\r
+ Rm_Transaction *transaction)\r
{\r
Rm_Packet *rmPkt = NULL;\r
+ Rm_PacketHandle pktHandle = NULL;\r
Rm_NsResponsePkt *nsRespPkt = NULL;\r
\r
- if ((rmPkt = rmInst->transport.rmAllocPkt((Rm_TransportHandle)dstTransport, sizeof(Rm_Packet))) ==\r
- NULL) {\r
+ if ((rmPkt = rmInst->transportCallouts.rmAllocPkt(appTransport, \r
+ sizeof(Rm_Packet),\r
+ &pktHandle)) == NULL) {\r
transaction->state = RM_SERVICE_ERROR_TRANSPORT_ALLOC_PKT_ERROR;\r
return (NULL);\r
}\r
-\r
- if (rmPkt->pktLenBytes < (sizeof(Rm_NsResponsePkt) + sizeof(uint32_t) + sizeof(Rm_pktType))) { \r
- transaction->state = RM_SERVICE_ERROR_TRANSPORT_PKT_BUF_TOO_SMALL;\r
- return (NULL);\r
- } \r
- rmPkt->pktType = Rm_pktType_NAMESERVER_RESPONSE;\r
- \r
+ \r
+ rmPkt->pktType = Rm_pktType_NAMESERVER_RESPONSE; \r
nsRespPkt = (Rm_NsResponsePkt *)rmPkt->data;\r
nsRespPkt->responseId = transaction->remoteOriginatingId;\r
nsRespPkt->requestState = transaction->state;\r
\r
- return (rmPkt);\r
+ return (pktHandle);\r
}\r
\r
/**********************************************************************\r
@@ -278,7 +266,7 @@ Rm_Packet *rmTransportCreateNsResponsePkt(Rm_Inst *rmInst, Rm_Transport *dstTran
\r
Rm_TransportHandle Rm_transportRegister (Rm_TransportCfg *transportCfg, int32_t *result)\r
{\r
- Rm_Inst *rmInst = (Rm_Inst *) transportCfg->rmHandle;\r
+ Rm_Inst *rmInst = (Rm_Inst *) transportCfg->rmHandle;\r
Rm_Transport *transport = NULL;\r
\r
/* RM Servers cannot connect to other Servers. RM Client Delegates cannot\r
(transportCfg->remoteInstType == Rm_instType_SERVER)) ||\r
((rmInst->instType == Rm_instType_CLIENT_DELEGATE) &&\r
(transportCfg->remoteInstType == Rm_instType_CLIENT_DELEGATE))) {\r
- *result = -500;\r
+ *result = RM_TRANSPORT_ERROR_INVALID_REMOTE_INST_TYPE;\r
return(NULL);\r
}\r
\r
@@ -298,26 +286,21 @@ Rm_TransportHandle Rm_transportRegister (Rm_TransportCfg *transportCfg, int32_t
(transportCfg->remoteInstType == Rm_instType_CLIENT_DELEGATE)) || \r
((rmInst->instType == Rm_instType_CLIENT_DELEGATE) &&\r
(transportCfg->remoteInstType == Rm_instType_SERVER)))) {\r
- *result = -501;\r
+ *result = RM_TRANSPORT_ERROR_REGISTERING_WITH_MORE_THAN_ONE_SERVER_OR_CD;\r
return(NULL);\r
} \r
-\r
+ \r
if (transportCfg->transportCalloutsValid &&\r
((transportCfg->transportCallouts.rmAllocPkt == NULL) ||\r
- (transportCfg->transportCallouts.rmFreePkt == NULL) ||\r
- (transportCfg->transportCallouts.rmSend == NULL) ||\r
- (transportCfg->transportCallouts.rmReceive == NULL) ||\r
- (transportCfg->transportCallouts.rmNumPktsReceived == NULL))) {\r
- *result = -502;\r
+ (transportCfg->transportCallouts.rmSendPkt == NULL))) {\r
+ *result = RM_TRANSPORT_ERROR_CALLOUTS_VALID_BUT_NULL_PROVIDED;\r
return(NULL);\r
}\r
else {\r
- rmInst->transport.rmAllocPkt = transportCfg->transportCallouts.rmAllocPkt;\r
- rmInst->transport.rmFreePkt = transportCfg->transportCallouts.rmFreePkt;\r
- rmInst->transport.rmSend = transportCfg->transportCallouts.rmSend;\r
- rmInst->transport.rmReceive = transportCfg->transportCallouts.rmReceive;\r
- rmInst->transport.rmNumPktsReceived = transportCfg->transportCallouts.rmNumPktsReceived;\r
+ rmInst->transportCallouts.rmAllocPkt = transportCfg->transportCallouts.rmAllocPkt;\r
+ rmInst->transportCallouts.rmSendPkt = transportCfg->transportCallouts.rmSendPkt;\r
}\r
+\r
transport = transportAdd(transportCfg);\r
\r
if ((transport->remoteInstType == Rm_instType_CLIENT_DELEGATE) ||\r
@@ -325,40 +308,38 @@ Rm_TransportHandle Rm_transportRegister (Rm_TransportCfg *transportCfg, int32_t
rmInst->registeredWithDelegateOrServer = true;\r
}\r
\r
- *result = 0; /* TEMP */\r
+ *result = RM_INIT_OK;\r
return ((Rm_TransportHandle) transport);\r
}\r
\r
-int32_t Rm_transportUnregister (Rm_Handle rmHandle, Rm_TransportHandle transportHandle)\r
+int32_t Rm_transportUnregister(Rm_TransportHandle transportHandle)\r
{\r
- Rm_Inst *rmInst = (Rm_Inst *) rmHandle;\r
- Rm_Transport *transport = transportFindTransportHandle((Rm_Transport *)rmInst->transports, \r
- transportHandle);\r
- int32_t retVal = RM_TRANSPORT_SUCCESSFUL; \r
+ Rm_Transport *transport = (Rm_Transport *)transportHandle;\r
+ Rm_Inst *rmInst = (Rm_Inst *)transport->rmHandle;\r
+ int32_t retVal = RM_TRANSPORT_SUCCESSFUL; \r
\r
- if (transport == NULL) {\r
- retVal = RM_TRANSPORT_ERROR_HANDLE_HAS_NOT_BEEN_REGISTERED;\r
- }\r
- else {\r
+ if (transportIsTransportRegistered(transport->rmHandle, transport)) {\r
if ((transport->remoteInstType == Rm_instType_CLIENT_DELEGATE) ||\r
(transport->remoteInstType == Rm_instType_SERVER)) {\r
rmInst->registeredWithDelegateOrServer = false;\r
}\r
- retVal = transportDelete(rmHandle, transportHandle);\r
+ transportDelete(transport);\r
+ }\r
+ else {\r
+ retVal = RM_TRANSPORT_ERROR_HANDLE_HAS_NOT_BEEN_REGISTERED;\r
}\r
-\r
return (retVal);\r
}\r
\r
/* Used by the application to pass RM packets received from a transport to RM.\r
- * CODE THE FUNCTION SUCH THAT IT CAN BE CALLED DIRECTLY BY APP OR BE PLUGGED\r
- * AS PART OF AN ISR HANDLER FOR THE TRANSACTION RECEIVE */\r
-int32_t Rm_receivePktIsr(Rm_TransportHandle transportHandle, Rm_Packet *pkt)\r
+ * Function can be called from polling or ISR context. */\r
+int32_t Rm_receivePacket(Rm_TransportHandle transportHandle, Rm_Packet *pkt)\r
{\r\r\r
- Rm_Inst *rmInst = (Rm_Inst *)((Rm_Transport *)transportHandle)->rmHandle;\r
+ Rm_Transport *transport = (Rm_Transport *)transportHandle;\r
+ Rm_Inst *rmInst = (Rm_Inst *)transport->rmHandle;\r
Rm_Transaction *transaction;\r
\r
- if (transportFindTransportHandle((Rm_Transport *)rmInst->transports, transportHandle) == NULL) {\r
+ if (!transportIsTransportRegistered(transport->rmHandle, transport)) {\r
return (RM_TRANSPORT_ERROR_HANDLE_HAS_NOT_BEEN_REGISTERED);\r
}\r
\r
rmTransactionProcessor(rmInst, transaction);\r
}\r
else {\r
- rmInst->transport.rmFreePkt(transportHandle, pkt);\r
return (RM_TRANSPORT_ERROR_MATCHING_RESOURCE_REQUEST_NOT_FOUND);\r
}\r
break;\r
rmTransactionProcessor(rmInst, transaction);\r
}\r
else {\r
- rmInst->transport.rmFreePkt(transportHandle, pkt);\r
return (RM_TRANSPORT_ERROR_MATCHING_NAME_SERVER_REQUEST_NOT_FOUND);\r
}\r
break;\r
}\r
default:\r
- rmInst->transport.rmFreePkt(transportHandle, pkt);\r
return (RM_TRANSPORT_ERROR_INVALID_PACKET_TYPE);\r
}\r
\r
- rmInst->transport.rmFreePkt(transportHandle, pkt);\r
return (RM_TRANSPORT_SUCCESSFUL);\r
}\r
\r
-/* Application can call this API so that RM handles reception of packets based on\r
- * the RM handle and transport handle provided */\r
-int32_t Rm_receivePktPolling(Rm_TransportHandle transportHandle)\r
-{\r
- Rm_Inst *rmInst = (Rm_Inst *)((Rm_Transport *)transportHandle)->rmHandle;\r
- Rm_Packet *pkt = NULL;\r
- int32_t retVal = RM_TRANSPORT_OK_BASE;\r
-\r
- if (transportFindTransportHandle((Rm_Transport *)rmInst->transports, transportHandle) != NULL) {\r
- while (rmInst->transport.rmNumPktsReceived(transportHandle) > 0) {\r
- pkt = rmInst->transport.rmReceive(transportHandle);\r
-\r
- if (pkt == NULL) {\r
- retVal = RM_TRANSPORT_ERROR_PACKET_RECEPTION_ERROR;\r
- break;\r
- }\r
-\r
- /* Pass packet to RM. Packet will be freed within PktIsr API */\r
- if (retVal = Rm_receivePktIsr(transportHandle, pkt) <= RM_SERVICE_ERROR_BASE) {\r
- break;\r
- }\r
- }\r
- }\r
- else {\r
- retVal = RM_TRANSPORT_ERROR_HANDLE_HAS_NOT_BEEN_REGISTERED;\r
- }\r
-\r
- return (retVal); \r
-}\r
-\r
-/**\r
-@}\r
-*/\r