Update snapshot(2017-12-14)
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / tcp_adapter / catcpserver.c
index eaee7f3..8551650 100644 (file)
@@ -614,8 +614,11 @@ static void CAReceiveMessage(int fd)
     {
         if (CA_STATUS_OK != CATCPDisconnectSession(&svritem->sep.endpoint))
         {
+            CASearchAndDeleteTCPSession(&svritem->sep.endpoint);
             OIC_LOG(ERROR, TAG, "Failed to disconnect TCP session");
         }
+
+        return;
     }
 }
 
@@ -1062,6 +1065,7 @@ size_t CACheckPayloadLengthFromHeader(const void *data, size_t dlen)
     if (!pdu)
     {
         OIC_LOG(ERROR, TAG, "outpdu is null");
+        OIC_LOG_V(ERROR, TAG, "data length: %zu", dlen);
         return 0;
     }
 
@@ -1107,9 +1111,9 @@ static ssize_t sendData(const CAEndpoint_t *endpoint, const void *data,
 
     // #2. send data to remote device.
     ssize_t remainLen = dlen;
+    size_t sendCounter = 0;
     do
     {
-        size_t sendCounter = 0;
 #ifdef MSG_NOSIGNAL
         ssize_t len = send(sockFd, data, remainLen, MSG_DONTWAIT | MSG_NOSIGNAL);
 #else
@@ -1125,8 +1129,8 @@ static ssize_t sendData(const CAEndpoint_t *endpoint, const void *data,
                 return len;
             }
             sendCounter++;
-            OIC_LOG_V(WARNING, TAG, "send blocked. trying %n attempt from 100", sendCounter);
-            if(sendCounter >= 100)
+            OIC_LOG_V(WARNING, TAG, "send blocked. trying %zu attempt from 25", sendCounter);
+            if(sendCounter >= 25)
             {
                 return len;
             }
@@ -1263,6 +1267,8 @@ CAResult_t CADisconnectTCPSession(size_t index)
 
 void CATCPDisconnectAll()
 {
+    OIC_LOG(DEBUG, TAG, "IN - CATCPDisconnectAll");
+
     oc_mutex_lock(g_mutexObjectList);
 
     uint32_t length = u_arraylist_length(caglobals.tcp.svrlist);
@@ -1281,6 +1287,7 @@ void CATCPDisconnectAll()
     CAcloseSslConnectionAll(CA_ADAPTER_TCP);
 #endif
 
+    OIC_LOG(DEBUG, TAG, "OUT - CATCPDisconnectAll");
 }
 
 CATCPSessionInfo_t *CAGetTCPSessionInfoFromEndpoint(const CAEndpoint_t *endpoint, size_t *index)
@@ -1394,6 +1401,37 @@ CAResult_t CASearchAndDeleteTCPSession(const CAEndpoint_t *endpoint)
     return result;
 }
 
+void CATCPCloseInProgressConnections()
+{
+    OIC_LOG(INFO, TAG, "IN - CATCPCloseInProgressConnections");
+
+    oc_mutex_lock(g_mutexObjectList);
+
+    uint32_t length = u_arraylist_length(caglobals.tcp.svrlist);
+    for (size_t index = 0; index < length; index++)
+    {
+        CATCPSessionInfo_t *svritem = (CATCPSessionInfo_t *) u_arraylist_get(
+                caglobals.tcp.svrlist, index);
+        if (!svritem)
+        {
+            continue;
+        }
+
+        // Session which are connecting state
+        if (svritem->fd >= 0 && svritem->state == CONNECTING)
+        {
+            shutdown(svritem->fd, SHUT_RDWR);
+            close(svritem->fd);
+            svritem->fd = -1;
+            svritem->state = DISCONNECTED;
+        }
+    }
+
+    oc_mutex_unlock(g_mutexObjectList);
+
+    OIC_LOG(INFO, TAG, "OUT - CATCPCloseInProgressConnections");
+}
+
 size_t CAGetTotalLengthFromHeader(const unsigned char *recvBuffer)
 {
     OIC_LOG(DEBUG, TAG, "IN - CAGetTotalLengthFromHeader");