code clean up in cablockwisetransfer
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / cablockwisetransfer.c
index dd3e1b5..2e29be5 100644 (file)
@@ -43,7 +43,7 @@
 #include "camutex.h"
 #include "logger.h"
 
-#define TAG "CA_BWT"
+#define TAG "OIC_CA_BWT"
 
 #define BLOCKWISE_OPTION_BUFFER    (sizeof(unsigned int))
 #define BLOCK_NUMBER_IDX           4
@@ -53,7 +53,9 @@
 #define BLOCK_SIZE(arg) (1 << ((arg) + 4))
 
 // context for block-wise transfer
-static CABlockWiseContext_t g_context = { 0 };
+static CABlockWiseContext_t g_context = { .sendThreadFunc = NULL,
+                                          .receivedThreadFunc = NULL,
+                                          .dataList = NULL };
 
 static bool CACheckPayloadLength(const CAData_t *sendData)
 {
@@ -62,7 +64,7 @@ static bool CACheckPayloadLength(const CAData_t *sendData)
 
     // check if message has to be transfered to a block
     size_t maxBlockSize = BLOCK_SIZE(CA_DEFAULT_BLOCK_SIZE);
-    OIC_LOG_V(DEBUG, TAG, "payloadLen=%d, maxBlockSize=%d", payloadLen, maxBlockSize);
+    OIC_LOG_V(DEBUG, TAG, "payloadLen=%zu, maxBlockSize=%zu", payloadLen, maxBlockSize);
 
     if (payloadLen <= maxBlockSize)
     {
@@ -96,6 +98,8 @@ CAResult_t CAInitializeBlockWiseTransfer(CASendThreadFunc sendThreadFunc,
     CAResult_t res = CAInitBlockWiseMutexVariables();
     if (CA_STATUS_OK != res)
     {
+        u_arraylist_free(&g_context.dataList);
+        g_context.dataList = NULL;
         OIC_LOG(ERROR, TAG, "init has failed");
     }
 
@@ -307,11 +311,20 @@ CAResult_t CAReceiveBlockWiseData(coap_pdu_t *pdu, const CAEndpoint_t *endpoint,
                 receivedData->responseInfo->info.token,
                 receivedData->responseInfo->info.tokenLength,
                 endpoint->port);
-        if(NULL == blockDataID || NULL == blockDataID->id || blockDataID->idLength < 1)
+        if (NULL == blockDataID || blockDataID->idLength < 1)
         {
-            OIC_LOG(ERROR, TAG, "blockId is null");
-            CADestroyBlockID(blockDataID);
-            return CA_STATUS_FAILED;
+            // if retransmission is timeout, callback msg will be send without token.
+            if (NULL == blockDataID && !receivedData->responseInfo->info.token)
+            {
+                OIC_LOG(INFO, TAG, "retransmission was stopped");
+                return CA_REQUEST_TIMEOUT;
+            }
+            else
+            {
+                OIC_LOG(ERROR, TAG, "blockId is null");
+                CADestroyBlockID(blockDataID);
+                return CA_STATUS_FAILED;
+            }
         }
 
         CARemoveBlockDataFromList(blockDataID);
@@ -354,10 +367,9 @@ CAResult_t CAReceiveBlockWiseData(coap_pdu_t *pdu, const CAEndpoint_t *endpoint,
         {
             CABlockDataID_t* blockDataID = CACreateBlockDatablockId(
                     (CAToken_t)pdu->hdr->coap_hdr_udp_t.token,
-                     pdu->hdr->coap_hdr_udp_t.token_length,
-                     endpoint->port);
-
-            if(NULL == blockDataID || NULL == blockDataID->id || blockDataID->idLength < 1)
+                    pdu->hdr->coap_hdr_udp_t.token_length,
+                    endpoint->port);
+            if (NULL == blockDataID || blockDataID->idLength < 1)
             {
                 OIC_LOG(ERROR, TAG, "blockId is null");
                 CADestroyBlockID(blockDataID);
@@ -424,7 +436,7 @@ CAResult_t CAReceiveBlockWiseData(coap_pdu_t *pdu, const CAEndpoint_t *endpoint,
                         (CAToken_t)pdu->hdr->coap_hdr_udp_t.token,
                         pdu->hdr->coap_hdr_udp_t.token_length,
                         endpoint->port);
-                if(NULL == blockDataID || NULL == blockDataID->id || blockDataID->idLength < 1)
+                if (NULL == blockDataID || blockDataID->idLength < 1)
                 {
                     OIC_LOG(ERROR, TAG, "blockId is null");
                     CADestroyBlockID(blockDataID);
@@ -789,36 +801,36 @@ CAResult_t CASetNextBlockOption1(coap_pdu_t *pdu, const CAEndpoint_t *endpoint,
             (CAToken_t)pdu->hdr->coap_hdr_udp_t.token,
             pdu->hdr->coap_hdr_udp_t.token_length,
             endpoint->port);
-
-    if(NULL == blockDataID || NULL == blockDataID->id || blockDataID->idLength < 1)
+    if (NULL == blockDataID || blockDataID->idLength < 1)
     {
         OIC_LOG(ERROR, TAG, "blockId is null");
         CADestroyBlockID(blockDataID);
         return CA_STATUS_FAILED;
     }
 
-    // BlockData data is created if it not existed
-    if (!CAIsBlockDataInList(blockDataID))
+    // Get BlockData data. If does not exist, create a new data
+    CABlockData_t *data = CAGetBlockDataFromBlockDataList(blockDataID);
+    if (!data)
     {
-        OIC_LOG(DEBUG, TAG, "no message in list");
+        OIC_LOG(DEBUG, TAG, "block data doesn't exist in list. create new one");
 
-        CAData_t *data = CACreateNewDataSet(pdu, endpoint);
-        if (!data)
+        CAData_t *cadata = CACreateNewDataSet(pdu, endpoint);
+        if (!cadata)
         {
             OIC_LOG(ERROR, TAG, "data is null");
             CADestroyBlockID(blockDataID);
             return CA_STATUS_FAILED;
         }
 
-        CABlockData_t *currData = CACreateNewBlockData(data);
+        CABlockData_t *currData = CACreateNewBlockData(cadata);
         if (!currData)
         {
-            OIC_LOG(ERROR, TAG, "currData is null");
-            CADestroyDataSet(data);
+            OIC_LOG(ERROR, TAG, "failed to create a new block data");
+            CADestroyDataSet(cadata);
             CADestroyBlockID(blockDataID);
             return CA_STATUS_FAILED;
         }
-        CADestroyDataSet(data);
+        CADestroyDataSet(cadata);
     }
 
     // update BLOCK OPTION1 type
@@ -832,14 +844,6 @@ CAResult_t CASetNextBlockOption1(coap_pdu_t *pdu, const CAEndpoint_t *endpoint,
         return res;
     }
 
-    CABlockData_t *data = CAGetBlockDataFromBlockDataList(blockDataID);
-    if (!data)
-    {
-        OIC_LOG(ERROR, TAG, "getting has failed");
-        CADestroyBlockID(blockDataID);
-        return CA_STATUS_FAILED;
-    }
-
     uint8_t blockWiseStatus = CA_BLOCK_UNKNOWN;
     // received type from remote device
     if (CA_MSG_ACKNOWLEDGE == pdu->hdr->coap_hdr_udp_t.type)
@@ -854,17 +858,16 @@ CAResult_t CASetNextBlockOption1(coap_pdu_t *pdu, const CAEndpoint_t *endpoint,
                 OIC_LOG(INFO, TAG, "received data is combining block1 and block2");
                 // initialize block number for response message
                 data->block1.num = 0;
-                CADestroyBlockID(blockDataID);
-                return CA_STATUS_OK;
             }
             else
             {
                 OIC_LOG(INFO, TAG, "received data is not bulk data");
                 CAReceiveLastBlock(blockDataID, receivedData);
                 CARemoveBlockDataFromList(blockDataID);
-                CADestroyBlockID(blockDataID);
-                return CA_STATUS_OK;
             }
+
+            CADestroyBlockID(blockDataID);
+            return CA_STATUS_OK;
         }
 
         blockWiseStatus = CA_OPTION1_ACK;
@@ -914,7 +917,8 @@ CAResult_t CASetNextBlockOption1(coap_pdu_t *pdu, const CAEndpoint_t *endpoint,
                 return res;
             }
 
-            res = CAUpdateBlockOptionItems(data, pdu, &block, COAP_OPTION_BLOCK1, blockWiseStatus);
+            res = CAUpdateBlockOptionItems(data, pdu, &block, COAP_OPTION_BLOCK1,
+                                           blockWiseStatus);
             if (CA_STATUS_OK != res)
             {
                 OIC_LOG(ERROR, TAG, "update has failed");
@@ -978,41 +982,40 @@ CAResult_t CASetNextBlockOption2(coap_pdu_t *pdu, const CAEndpoint_t *endpoint,
             (CAToken_t)pdu->hdr->coap_hdr_udp_t.token,
             pdu->hdr->coap_hdr_udp_t.token_length,
             endpoint->port);
-
-    if(NULL == blockDataID || NULL == blockDataID->id || blockDataID->idLength < 1)
+    if (NULL == blockDataID || blockDataID->idLength < 1)
     {
         OIC_LOG(ERROR, TAG, "blockId is null");
         CADestroyBlockID(blockDataID);
         return CA_STATUS_FAILED;
     }
 
-    // BlockData data is created if it not existed
-    if (!CAIsBlockDataInList(blockDataID))
+    // Get BlockData data. If does not exist, create a new data
+    CABlockData_t *data = CAGetBlockDataFromBlockDataList(blockDataID);
+    if (!data)
     {
-        OIC_LOG(DEBUG, TAG, "no msg in list.");
+        OIC_LOG(DEBUG, TAG, "block data doesn't exist in list. create new one");
 
-        CAData_t *data = CACreateNewDataSet(pdu, endpoint);
-        if (!data)
+        CAData_t *cadata = CACreateNewDataSet(pdu, endpoint);
+        if (!cadata)
         {
             OIC_LOG(ERROR, TAG, "data is null");
             CADestroyBlockID(blockDataID);
             return CA_STATUS_FAILED;
         }
 
-        CABlockData_t *currData = CACreateNewBlockData(data);
+        CABlockData_t *currData = CACreateNewBlockData(cadata);
         if (!currData)
         {
-            OIC_LOG(ERROR, TAG, "data is null");
-            CADestroyDataSet(data);
+            OIC_LOG(ERROR, TAG, "failed to create a new block data");
+            CADestroyDataSet(cadata);
             CADestroyBlockID(blockDataID);
             return CA_STATUS_FAILED;
         }
-        CADestroyDataSet(data);
+        CADestroyDataSet(cadata);
     }
 
     // set Block Option Type
-    CAResult_t res = CAUpdateBlockOptionType(blockDataID,
-                                             COAP_OPTION_BLOCK2);
+    CAResult_t res = CAUpdateBlockOptionType(blockDataID, COAP_OPTION_BLOCK2);
     if (CA_STATUS_OK != res)
     {
         OIC_LOG(ERROR, TAG, "update has failed");
@@ -1021,15 +1024,6 @@ CAResult_t CASetNextBlockOption2(coap_pdu_t *pdu, const CAEndpoint_t *endpoint,
         return res;
     }
 
-    CABlockData_t *data = CAGetBlockDataFromBlockDataList(blockDataID);
-    if (!data)
-    {
-        OIC_LOG(ERROR, TAG, "getting has failed");
-        CARemoveBlockDataFromList(blockDataID);
-        CADestroyBlockID(blockDataID);
-        return CA_STATUS_FAILED;
-    }
-
     uint8_t blockWiseStatus = CA_BLOCK_UNKNOWN;
     if (0 == block.num && CA_GET == pdu->hdr->coap_hdr_udp_t.code && 0 == block.m)
     {
@@ -1254,7 +1248,7 @@ CAResult_t CAUpdateBlockOptionItems(CABlockData_t *currData, const coap_pdu_t *p
     return res;
 }
 
-CAResult_t CAGetMoreBitFromBlock(size_t payloadLen, coap_block_t *block)
+CAResult_t CASetMoreBitFromBlock(size_t payloadLen, coap_block_t *block)
 {
     VERIFY_NON_NULL(block, TAG, "block");
 
@@ -1408,7 +1402,7 @@ CAResult_t CAAddBlockOption(coap_pdu_t **pdu, const CAInfo_t *info,
     if (info->payload)
     {
         dataLength = info->payloadSize;
-        OIC_LOG_V(DEBUG, TAG, "dataLength - %d", dataLength);
+        OIC_LOG_V(DEBUG, TAG, "dataLength - %zu", dataLength);
     }
 
     OIC_LOG_V(DEBUG, TAG, "previous payload - %s", (*pdu)->data);
@@ -1425,8 +1419,7 @@ CAResult_t CAAddBlockOption(coap_pdu_t **pdu, const CAInfo_t *info,
             (CAToken_t)(*pdu)->hdr->coap_hdr_udp_t.token,
             (*pdu)->hdr->coap_hdr_udp_t.token_length,
             endpoint->port);
-
-    if(NULL == blockDataID || NULL == blockDataID->id || blockDataID->idLength < 1)
+    if (NULL == blockDataID || blockDataID->idLength < 1)
     {
         OIC_LOG(ERROR, TAG, "blockId is null");
         res = CA_STATUS_FAILED;
@@ -1516,10 +1509,8 @@ CAResult_t CAAddBlockOption2(coap_pdu_t **pdu, const CAInfo_t *info, size_t data
     VERIFY_NON_NULL(options, TAG, "options");
 
     // get set block data from CABlock list-set.
-    coap_block_t *block1 = CAGetBlockOption(blockID,
-                                            COAP_OPTION_BLOCK1);
-    coap_block_t *block2 = CAGetBlockOption(blockID,
-                                            COAP_OPTION_BLOCK2);
+    coap_block_t *block1 = CAGetBlockOption(blockID, COAP_OPTION_BLOCK1);
+    coap_block_t *block2 = CAGetBlockOption(blockID, COAP_OPTION_BLOCK2);
     if (!block1 || !block2)
     {
         OIC_LOG(ERROR, TAG, "getting has failed");
@@ -1528,34 +1519,17 @@ CAResult_t CAAddBlockOption2(coap_pdu_t **pdu, const CAInfo_t *info, size_t data
 
     CALogBlockInfo(block2);
 
-    uint8_t code = 0;
     if (CA_MSG_ACKNOWLEDGE == (*pdu)->hdr->coap_hdr_udp_t.type ||
             (CA_MSG_NONCONFIRM == (*pdu)->hdr->coap_hdr_udp_t.type &&
                     CA_GET != (*pdu)->hdr->coap_hdr_udp_t.code))
     {
-        int32_t res = coap_write_block_opt(block2, COAP_OPTION_BLOCK2, *pdu, dataLength);
-        switch (res)
-        {
-            case -2: /* illegal block */
-                code = COAP_RESPONSE_CODE(CA_BAD_REQ);
-                OIC_LOG(ERROR, TAG, "write block option : -2");
-                goto error;
-            case -1: /* should really not happen */
-                OIC_LOG(ERROR, TAG, "write block option : -1");
-                break;
-            case -3: /* cannot handle request */
-                code = COAP_RESPONSE_CODE(CA_INTERNAL_SERVER_ERROR);
-                OIC_LOG(ERROR, TAG, "write block option : -3");
-                goto error;
-            default:
-                OIC_LOG(INFO, TAG, "success write block option");
-        }
+        CASetMoreBitFromBlock(dataLength, block2);
         CALogBlockInfo(block2);
 
         // if block number is 0, add size2 option
         if (0 == block2->num)
         {
-            res = CAAddBlockSizeOption(*pdu, COAP_OPTION_SIZE2, dataLength, options);
+            CAResult_t res = CAAddBlockSizeOption(*pdu, COAP_OPTION_SIZE2, dataLength, options);
             if (CA_STATUS_OK != res)
             {
                 OIC_LOG(ERROR, TAG, "add has failed");
@@ -1564,10 +1538,18 @@ CAResult_t CAAddBlockOption2(coap_pdu_t **pdu, const CAInfo_t *info, size_t data
             }
         }
 
+        CAResult_t res = CAAddBlockOptionImpl(block2, COAP_OPTION_BLOCK2, options);
+        if (CA_STATUS_OK != res)
+        {
+            OIC_LOG(ERROR, TAG, "add has failed");
+            CARemoveBlockDataFromList(blockID);
+            return res;
+        }
+
         if (block1->num)
         {
             OIC_LOG(DEBUG, TAG, "combining block1 and block2");
-            CAResult_t res = CAAddBlockOptionImpl(*pdu, block1, COAP_OPTION_BLOCK1, options);
+            res = CAAddBlockOptionImpl(block1, COAP_OPTION_BLOCK1, options);
             if (CA_STATUS_OK != res)
             {
                 OIC_LOG(ERROR, TAG, "add has failed");
@@ -1578,6 +1560,14 @@ CAResult_t CAAddBlockOption2(coap_pdu_t **pdu, const CAInfo_t *info, size_t data
             block1->num = 0;
         }
 
+        res = CAAddOptionToPDU(*pdu, options);
+        if (CA_STATUS_OK != res)
+        {
+            OIC_LOG(ERROR, TAG, "add has failed");
+            CARemoveBlockDataFromList(blockID);
+            return res;
+        }
+
         if (!coap_add_block(*pdu, dataLength, (const unsigned char *) info->payload,
                             block2->num, block2->szx))
         {
@@ -1612,7 +1602,15 @@ CAResult_t CAAddBlockOption2(coap_pdu_t **pdu, const CAInfo_t *info, size_t data
     else
     {
         OIC_LOG(DEBUG, TAG, "option2, not ACK msg");
-        CAResult_t res = CAAddBlockOptionImpl(*pdu, block2, COAP_OPTION_BLOCK2, options);
+        CAResult_t res = CAAddBlockOptionImpl(block2, COAP_OPTION_BLOCK2, options);
+        if (CA_STATUS_OK != res)
+        {
+            OIC_LOG(ERROR, TAG, "add has failed");
+            CARemoveBlockDataFromList(blockID);
+            return res;
+        }
+
+        res = CAAddOptionToPDU(*pdu, options);
         if (CA_STATUS_OK != res)
         {
             OIC_LOG(ERROR, TAG, "add has failed");
@@ -1622,17 +1620,6 @@ CAResult_t CAAddBlockOption2(coap_pdu_t **pdu, const CAInfo_t *info, size_t data
     }
 
     return CA_STATUS_OK;
-
-error:
-    OIC_LOG_V(ERROR, TAG, "error : %d", code);
-
-    char* phrase = coap_response_phrase(code);
-    if(phrase)
-    {
-        coap_add_data(*pdu, strlen(phrase),
-                      (unsigned char *) phrase);
-    }
-    return CA_STATUS_FAILED;
 }
 
 CAResult_t CAAddBlockOption1(coap_pdu_t **pdu, const CAInfo_t *info, size_t dataLength,
@@ -1659,7 +1646,15 @@ CAResult_t CAAddBlockOption1(coap_pdu_t **pdu, const CAInfo_t *info, size_t data
     if (CA_MSG_ACKNOWLEDGE == (*pdu)->hdr->coap_hdr_udp_t.type)
     {
         OIC_LOG(DEBUG, TAG, "option1 and ACK msg..");
-        CAResult_t res = CAAddBlockOptionImpl(*pdu, block1, COAP_OPTION_BLOCK1, options);
+        CAResult_t res = CAAddBlockOptionImpl(block1, COAP_OPTION_BLOCK1, options);
+        if (CA_STATUS_OK != res)
+        {
+            OIC_LOG(ERROR, TAG, "add has failed");
+            CARemoveBlockDataFromList(blockID);
+            return res;
+        }
+
+        res = CAAddOptionToPDU(*pdu, options);
         if (CA_STATUS_OK != res)
         {
             OIC_LOG(ERROR, TAG, "add has failed");
@@ -1687,7 +1682,7 @@ CAResult_t CAAddBlockOption1(coap_pdu_t **pdu, const CAInfo_t *info, size_t data
     }
     else
     {
-        CAGetMoreBitFromBlock(dataLength, block1);
+        CASetMoreBitFromBlock(dataLength, block1);
 
         CAResult_t res = CA_STATUS_OK;
         // if block number is 0, add size1 option
@@ -1702,13 +1697,22 @@ CAResult_t CAAddBlockOption1(coap_pdu_t **pdu, const CAInfo_t *info, size_t data
             }
         }
 
-        res = CAAddBlockOptionImpl(*pdu, block1, COAP_OPTION_BLOCK1, options);
+        res = CAAddBlockOptionImpl(block1, COAP_OPTION_BLOCK1, options);
         if (CA_STATUS_OK != res)
         {
             OIC_LOG(ERROR, TAG, "add has failed");
             CARemoveBlockDataFromList(blockID);
             return res;
         }
+
+        res = CAAddOptionToPDU(*pdu, options);
+        if (CA_STATUS_OK != res)
+        {
+            OIC_LOG(ERROR, TAG, "add has failed");
+            CARemoveBlockDataFromList(blockID);
+            return res;
+        }
+
         CALogBlockInfo(block1);
 
         if (!coap_add_block(*pdu, dataLength, (const unsigned char *) info->payload,
@@ -1748,11 +1752,10 @@ CAResult_t CAAddBlockOption1(coap_pdu_t **pdu, const CAInfo_t *info, size_t data
     return CA_STATUS_OK;
 }
 
-CAResult_t CAAddBlockOptionImpl(coap_pdu_t *pdu, coap_block_t *block, uint8_t blockType,
+CAResult_t CAAddBlockOptionImpl(coap_block_t *block, uint8_t blockType,
                                 coap_list_t **options)
 {
     OIC_LOG(DEBUG, TAG, "IN-AddBlockOptionImpl");
-    VERIFY_NON_NULL(pdu, TAG, "pdu");
     VERIFY_NON_NULL(block, TAG, "block");
     VERIFY_NON_NULL(options, TAG, "options");
 
@@ -1770,6 +1773,12 @@ CAResult_t CAAddBlockOptionImpl(coap_pdu_t *pdu, coap_block_t *block, uint8_t bl
         return CA_STATUS_INVALID_PARAM;
     }
 
+    OIC_LOG(DEBUG, TAG, "OUT-AddBlockOptionImpl");
+    return CA_STATUS_OK;
+}
+
+CAResult_t CAAddOptionToPDU(coap_pdu_t *pdu, coap_list_t **options)
+{
     // after adding the block option to option list, add option list to pdu.
     if (*options)
     {
@@ -1779,15 +1788,18 @@ CAResult_t CAAddBlockOptionImpl(coap_pdu_t *pdu, coap_block_t *block, uint8_t bl
                       COAP_OPTION_DATA(*(coap_option *) opt->data));
 
             OIC_LOG_V(DEBUG, TAG, "[%d] pdu length", pdu->length);
-            coap_add_option(pdu, COAP_OPTION_KEY(*(coap_option *) opt->data),
-                            COAP_OPTION_LENGTH(*(coap_option *) opt->data),
-                            COAP_OPTION_DATA(*(coap_option *) opt->data), coap_udp);
+            int ret = coap_add_option(pdu, COAP_OPTION_KEY(*(coap_option *) opt->data),
+                                      COAP_OPTION_LENGTH(*(coap_option *) opt->data),
+                                      COAP_OPTION_DATA(*(coap_option *) opt->data), coap_udp);
+            if (!ret)
+            {
+                return CA_STATUS_FAILED;
+            }
         }
     }
 
     OIC_LOG_V(DEBUG, TAG, "[%d] pdu length after option", pdu->length);
 
-    OIC_LOG(DEBUG, TAG, "OUT-AddBlockOptionImpl");
     return CA_STATUS_OK;
 }
 
@@ -1843,7 +1855,7 @@ bool CAIsPayloadLengthInPduWithBlockSizeOption(coap_pdu_t *pdu,
         *totalPayloadLen = coap_decode_var_bytes(COAP_OPT_VALUE(option),
                                                  COAP_OPT_LENGTH(option));
 
-        OIC_LOG_V(DEBUG, TAG, "the total payload length to be received is [%d]bytes",
+        OIC_LOG_V(DEBUG, TAG, "the total payload length to be received is [%zu]bytes",
                   *totalPayloadLen);
 
         return true;
@@ -2031,7 +2043,7 @@ CAResult_t CAUpdatePayloadData(CABlockData_t *currData, const CAData_t *received
         // update received payload length
         currData->receivedPayloadLen += blockPayloadLen;
 
-        OIC_LOG_V(DEBUG, TAG, "updated payload: %s, len: %d", currData->payload,
+        OIC_LOG_V(DEBUG, TAG, "updated payload: %s, len: %zu", currData->payload,
                   currData->receivedPayloadLen);
     }
 
@@ -2212,6 +2224,7 @@ CAResult_t CAHandleBlockErrorResponse(coap_block_t *block, uint16_t blockType,
             break;
         default:
             OIC_LOG_V(ERROR, TAG, "there is no Error Code of BWT[%d]", responseResult);
+            return CA_STATUS_FAILED;
     }
 
     OIC_LOG(DEBUG, TAG, "OUT-HandleBlockErrorRes");
@@ -2338,7 +2351,7 @@ CAResult_t CAGetTokenFromBlockDataList(const coap_pdu_t *pdu, const CAEndpoint_t
     ca_mutex_unlock(g_context.blockDataListMutex);
 
     OIC_LOG(DEBUG, TAG, "OUT-CAGetTokenFromBlockDataList");
-    return CA_STATUS_OK;
+    return CA_STATUS_FAILED;
 }
 
 CAResult_t CACheckBlockDataValidation(const CAData_t *sendData, CABlockData_t **blockData)
@@ -2346,6 +2359,34 @@ CAResult_t CACheckBlockDataValidation(const CAData_t *sendData, CABlockData_t **
     VERIFY_NON_NULL(sendData, TAG, "sendData");
     VERIFY_NON_NULL(blockData, TAG, "blockData");
 
+    CABlockDataID_t* blockDataID;
+    if(sendData->requestInfo)
+    {
+        blockDataID = CACreateBlockDatablockId(
+                            (CAToken_t)sendData->requestInfo->info.token,
+                            sendData->requestInfo->info.tokenLength,
+                            sendData->remoteEndpoint->port);
+    }
+    else if(sendData->responseInfo)
+    {
+        blockDataID = CACreateBlockDatablockId(
+                            (CAToken_t)sendData->responseInfo->info.token,
+                            sendData->responseInfo->info.tokenLength,
+                            sendData->remoteEndpoint->port);
+    }
+    else
+    {
+        OIC_LOG(ERROR, TAG, "sendData doesn't have requestInfo or responseInfo");
+        return CA_STATUS_FAILED;
+    }
+
+    if (NULL == blockDataID || blockDataID->idLength < 1)
+    {
+        OIC_LOG(ERROR, TAG, "blockId is null");
+        CADestroyBlockID(blockDataID);
+        return CA_STATUS_FAILED;
+    }
+
     ca_mutex_lock(g_context.blockDataListMutex);
 
     size_t len = u_arraylist_length(g_context.dataList);
@@ -2366,25 +2407,11 @@ CAResult_t CACheckBlockDataValidation(const CAData_t *sendData, CABlockData_t **
                     && currData->blockDataId->idLength > 0
                     && NULL != sendData->requestInfo->info.token)
             {
-                CABlockDataID_t* blockDataID = CACreateBlockDatablockId(
-                        (CAToken_t)sendData->requestInfo->info.token,
-                        sendData->requestInfo->info.tokenLength,
-                        sendData->remoteEndpoint->port);
-
-                if(NULL == blockDataID || NULL == blockDataID->id || blockDataID->idLength < 1)
-                {
-                    OIC_LOG(ERROR, TAG, "blockId is null");
-                    CADestroyBlockID(blockDataID);
-                    return CA_STATUS_FAILED;
-                }
-
                 if (CABlockidMatches(currData, blockDataID))
                 {
                     OIC_LOG(ERROR, TAG, "already sent");
-                    CADestroyBlockID(blockDataID);
                     continue;
                 }
-                CADestroyBlockID(blockDataID);
             }
         }
         else if (sendData->responseInfo) // sendData is responseMessage
@@ -2395,18 +2422,6 @@ CAResult_t CACheckBlockDataValidation(const CAData_t *sendData, CABlockData_t **
                     && currData->blockDataId->idLength > 0
                     && NULL != sendData->responseInfo->info.token)
             {
-                CABlockDataID_t* blockDataID = CACreateBlockDatablockId(
-                        (CAToken_t)sendData->responseInfo->info.token,
-                        sendData->responseInfo->info.tokenLength,
-                        sendData->remoteEndpoint->port);
-
-                if(NULL == blockDataID || NULL == blockDataID->id || blockDataID->idLength < 1)
-                {
-                    OIC_LOG(ERROR, TAG, "blockId is null");
-                    CADestroyBlockID(blockDataID);
-                    return CA_STATUS_FAILED;
-                }
-
                 if (CABlockidMatches(currData, blockDataID))
                 {
                     // set sendData
@@ -2417,11 +2432,10 @@ CAResult_t CACheckBlockDataValidation(const CAData_t *sendData, CABlockData_t **
                     }
                     currData->sentData = CACloneCAData(sendData);
                     *blockData = currData;
-                    CADestroyBlockID(blockDataID);
                     ca_mutex_unlock(g_context.blockDataListMutex);
+                    CADestroyBlockID(blockDataID);
                     return CA_STATUS_OK;
                 }
-                CADestroyBlockID(blockDataID);
             }
         }
         else
@@ -2432,6 +2446,8 @@ CAResult_t CACheckBlockDataValidation(const CAData_t *sendData, CABlockData_t **
     }
     ca_mutex_unlock(g_context.blockDataListMutex);
 
+    CADestroyBlockID(blockDataID);
+
     return CA_STATUS_FAILED;
 }
 
@@ -2555,7 +2571,7 @@ CABlockData_t *CACreateNewBlockData(const CAData_t *sendData)
     CABlockDataID_t* blockDataID = CACreateBlockDatablockId(
             token, tokenLength,
             data->sentData->remoteEndpoint->port);
-    if (NULL == blockDataID || NULL == blockDataID->id || blockDataID->idLength < 1)
+    if (NULL == blockDataID || blockDataID->idLength < 1)
     {
         OIC_LOG(ERROR, TAG, "blockId is null");
         CADestroyBlockID(blockDataID);
@@ -2621,30 +2637,6 @@ CAResult_t CARemoveBlockDataFromList(const CABlockDataID_t *blockID)
     return CA_STATUS_OK;
 }
 
-bool CAIsBlockDataInList(const CABlockDataID_t *blockID)
-{
-    OIC_LOG(DEBUG, TAG, "IN-IsBlockDataInList");
-    VERIFY_NON_NULL_RET(blockID, TAG, "blockID", false);
-
-    ca_mutex_lock(g_context.blockDataListMutex);
-
-    size_t len = u_arraylist_length(g_context.dataList);
-    for (size_t i = 0; i < len; i++)
-    {
-        CABlockData_t *currData = (CABlockData_t *) u_arraylist_get(g_context.dataList, i);
-        if (CABlockidMatches(currData, blockID))
-        {
-            OIC_LOG(DEBUG, TAG, "found block data");
-            ca_mutex_unlock(g_context.blockDataListMutex);
-            return true;
-        }
-    }
-    ca_mutex_unlock(g_context.blockDataListMutex);
-
-    OIC_LOG(DEBUG, TAG, "OUT-IsBlockDataInList");
-    return false;
-}
-
 void CADestroyDataSet(CAData_t* data)
 {
     VERIFY_NON_NULL_VOID(data, TAG, "data");
@@ -2658,8 +2650,6 @@ void CADestroyDataSet(CAData_t* data)
 CABlockDataID_t* CACreateBlockDatablockId(const CAToken_t token, uint8_t tokenLength,
                                           uint16_t portNumber)
 {
-    VERIFY_NON_NULL_RET(token, TAG, "token", NULL);
-
     char port[PORT_LENGTH] = {0,};
     port[0] = (char)((portNumber>>8) & 0xFF);
     port[1] = (char)(portNumber & 0xFF);
@@ -2679,7 +2669,11 @@ CABlockDataID_t* CACreateBlockDatablockId(const CAToken_t token, uint8_t tokenLe
         return NULL;
     }
 
-    memcpy(blockDataID->id, token, tokenLength);
+    if (token)
+    {
+        memcpy(blockDataID->id, token, tokenLength);
+    }
+
     memcpy(blockDataID->id + tokenLength, port, sizeof(port));
 
     OIC_LOG(DEBUG, TAG, "BlockID is ");