Updated the code related to Blockwise Transfer in CA
authorhyuna0213.jo <hyuna0213.jo@samsung.com>
Mon, 21 Sep 2015 11:43:09 +0000 (20:43 +0900)
committerPatrick Lankswert <patrick.lankswert@intel.com>
Thu, 24 Sep 2015 14:59:53 +0000 (14:59 +0000)
- Added to check RESET message for BlockWise Transfer.
- clean up blockID when multicast is ran.

Change-Id: I432bda9577db294722892ff164ffdc6f66673fbb
Signed-off-by: jihwan.seo <jihwan.seo@samsung.com>
Signed-off-by: hyuna0213.jo <hyuna0213.jo@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/2825
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Patrick Lankswert <patrick.lankswert@intel.com>
resource/csdk/connectivity/src/cablockwisetransfer.c

index 6b3633b..41efc98 100644 (file)
@@ -166,7 +166,15 @@ CAResult_t CASendBlockWiseData(const CAData_t *sendData)
     VERIFY_NON_NULL(sendData, TAG, "sendData");
 
     // check if message type is CA_MSG_RESET
-    if (sendData->responseInfo)
+    if (sendData->requestInfo)
+    {
+        if (CA_MSG_RESET == sendData->requestInfo->info.type)
+        {
+            OIC_LOG(DEBUG, TAG, "reset message can't be sent to the block");
+            return CA_NOT_SUPPORTED;
+        }
+    }
+    else if (sendData->responseInfo)
     {
         if (CA_MSG_RESET == sendData->responseInfo->info.type)
         {
@@ -1396,11 +1404,12 @@ CAResult_t CAAddBlockOption(coap_pdu_t **pdu, const CAInfo_t *info,
 
     OIC_LOG_V(DEBUG, TAG, "previous payload - %s", (*pdu)->data);
 
+    CAResult_t res = CA_STATUS_OK;
     uint32_t code = CA_RESPONSE_CODE((*pdu)->hdr->coap_hdr_udp_t.code);
     if (CA_REQUEST_ENTITY_INCOMPLETE == code)
     {
         OIC_LOG(INFO, TAG, "don't use option");
-        return CA_STATUS_OK;
+        return res;
     }
 
     CABlockDataID_t* blockDataID = CACreateBlockDatablockId(
@@ -1411,31 +1420,27 @@ CAResult_t CAAddBlockOption(coap_pdu_t **pdu, const CAInfo_t *info,
     if(NULL == blockDataID || NULL == blockDataID->id || blockDataID->idLength < 1)
     {
         OIC_LOG(ERROR, TAG, "blockId is null");
-        CADestroyBlockID(blockDataID);
-        return CA_STATUS_FAILED;
+        res = CA_STATUS_FAILED;
+        goto exit;
     }
 
     uint8_t blockType = CAGetBlockOptionType(blockDataID);
     if (COAP_OPTION_BLOCK2 == blockType)
     {
-        CAResult_t res = CAAddBlockOption2(pdu, info, dataLength,
-                                           blockDataID);
+        res = CAAddBlockOption2(pdu, info, dataLength, blockDataID);
         if (CA_STATUS_OK != res)
         {
             OIC_LOG(ERROR, TAG, "add has failed");
-            CADestroyBlockID(blockDataID);
-            return res;
+            goto exit;
         }
     }
     else if (COAP_OPTION_BLOCK1 == blockType)
     {
-        CAResult_t res = CAAddBlockOption1(pdu, info, dataLength,
-                                           blockDataID);
+        res = CAAddBlockOption1(pdu, info, dataLength, blockDataID);
         if (CA_STATUS_OK != res)
         {
             OIC_LOG(ERROR, TAG, "add has failed");
-            CADestroyBlockID(blockDataID);
-            return res;
+            goto exit;
         }
     }
     else
@@ -1449,22 +1454,27 @@ CAResult_t CAAddBlockOption(coap_pdu_t **pdu, const CAInfo_t *info,
         else
         {
             OIC_LOG(INFO, TAG, "not Blockwise Transfer");
-            CADestroyBlockID(blockDataID);
-            return CA_STATUS_OK;
+            goto exit;
         }
     }
 
-    CAResult_t res = CAUpdateMessageId(*pdu, blockDataID);
+    // if received message type is RESET from remote device,
+    // we have to use the updated message id to find token.
+    res = CAUpdateMessageId(*pdu, blockDataID);
     if (CA_STATUS_OK != res)
     {
         OIC_LOG(ERROR, TAG, "fail to update CON message id ");
-        CADestroyBlockID(blockDataID);
-        return res;
+        goto exit;
     }
 
+exit:
+    if (0 == endpoint->port)
+    {
+        CARemoveBlockDataFromList(blockDataID);
+    }
     CADestroyBlockID(blockDataID);
     OIC_LOG(DEBUG, TAG, "OUT-AddBlockOption");
-    return CA_STATUS_OK;
+    return res;
 }
 
 CAResult_t CAAddBlockOption2(coap_pdu_t **pdu, const CAInfo_t *info, size_t dataLength,
@@ -2032,8 +2042,7 @@ CAData_t *CACloneCAData(const CAData_t *data)
     {
         clone->requestInfo = CACloneRequestInfo(data->requestInfo);
     }
-
-    if (data->responseInfo)
+    else if (data->responseInfo)
     {
         clone->responseInfo = CACloneResponseInfo(data->responseInfo);
     }
@@ -2058,6 +2067,11 @@ CAResult_t CAUpdatePayloadToCAData(CAData_t *data, const CAPayload_t payload,
     switch (data->dataType)
     {
         case CA_REQUEST_DATA:
+            if (!data->requestInfo)
+            {
+                OIC_LOG(ERROR, TAG, "request info is null");
+                return CA_STATUS_FAILED;
+            }
             // allocate payload field
             newPayload = OICRealloc(data->requestInfo->info.payload, payloadLen);
             if (!newPayload)
@@ -2071,6 +2085,11 @@ CAResult_t CAUpdatePayloadToCAData(CAData_t *data, const CAPayload_t payload,
             break;
 
         case CA_RESPONSE_DATA:
+            if (!data->responseInfo)
+            {
+                OIC_LOG(ERROR, TAG, "response info is null");
+                return CA_STATUS_FAILED;
+            }
             // allocate payload field
             newPayload = OICRealloc(data->responseInfo->info.payload, payloadLen);
             if (!newPayload)