[IOT-3044] No response for Ping message 81/24581/7
authorVeeraj Khokale <veeraj.sk@samsung.com>
Thu, 5 Apr 2018 09:35:54 +0000 (15:05 +0530)
committerAshok Babu Channa <ashok.channa@samsung.com>
Fri, 11 May 2018 07:37:05 +0000 (07:37 +0000)
TCP adapter disconnects the session whenever
the data to be sent has an empty payload.
Since ping messages and signaling messages
need to have an empty payload they are dropped.
Fix this by checking if the message is a signaling
message before dropping it.

Change-Id: I1cfad27fcfd5cf3a42510412e6555b84ea905259
Signed-off-by: Veeraj Khokale <veeraj.sk@samsung.com>
resource/csdk/connectivity/src/camessagehandler.c
resource/csdk/connectivity/src/tcp_adapter/catcpadapter.c

index 68e94d6..eda0c58 100644 (file)
@@ -1628,8 +1628,8 @@ CAData_t *CAGenerateSignalingMessageUsingToken(const CAEndpoint_t *endpoint, CAS
     OIC_LOG(DEBUG, TAG, "GenerateSignalingMessage - IN");
 
     // create token for signaling message.
-    CAToken_t token = (char *)OICCalloc(pingTokenLength + 1, sizeof(char));
-    OICStrcpy(token, pingTokenLength, pingToken);
+    CAToken_t token = (char *)OICCalloc(pingTokenLength, sizeof(char));
+    memcpy(token, pingToken, pingTokenLength);
 
     CAInfo_t signalingData = { .type = CA_MSG_NONCONFIRM,
                                .token = token,
index ab8b96d..20427dc 100644 (file)
@@ -555,6 +555,15 @@ void CATerminateTCP()
 #endif
 }
 
+static bool CATCPIsSignalingData(const CATCPData *tcpData)
+{
+    // Check if the tcp data is a COAP signaling message as per RFC 8323
+    // by checking the code in the header
+    uint32_t code = CAGetCodeFromHeader(tcpData->data);
+    return code == CA_CSM || code == CA_PING ||
+           code == CA_PONG || code == CA_RELEASE || code == CA_ABORT;
+}
+
 void CATCPSendDataThread(void *threadData)
 {
     CATCPData *tcpData = (CATCPData *) threadData;
@@ -584,9 +593,11 @@ void CATCPSendDataThread(void *threadData)
         {
             // Check payload length from CoAP over TCP format header.
             size_t payloadLen = CACheckPayloadLengthFromHeader(tcpData->data, tcpData->dataLen);
-            if (!payloadLen)
+            if (!CATCPIsSignalingData(tcpData) && !payloadLen)
             {
-                // if payload length is zero, disconnect from remote device.
+                // if payload length is zero, and it is not a COAP signaling
+                // message(since such messages do not have a payload)
+                // then disconnect from remote device
                 OIC_LOG(DEBUG, TAG, "payload length is zero, disconnect from remote device");
 #ifdef __WITH_TLS__
                 if (CA_STATUS_OK != CAcloseSslConnection(tcpData->remoteEndpoint))