[IOT-3044] No response for Ping message 43/25443/1
authorVeeraj Khokale <veeraj.sk@samsung.com>
Thu, 5 Apr 2018 09:35:54 +0000 (15:05 +0530)
committerMushfiqul Islam <mmiantu@gmail.com>
Thu, 24 May 2018 10:02:59 +0000 (10:02 +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>
(cherry picked from commit c7dce6b522604e2c6b99847c88a00f7da275c08d)

resource/csdk/connectivity/src/camessagehandler.c
resource/csdk/connectivity/src/tcp_adapter/catcpadapter.c

index 80fd866..a07e301 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))