#include "cablockwisetransfer.h"
#include "oic_malloc.h"
#include "oic_string.h"
-#include "camutex.h"
+#include "octhread.h"
#include "logger.h"
+#include "oic_time.h"
#define TAG "OIC_CA_BWT"
#define BLOCK_SIZE(arg) (1 << ((arg) + 4))
+#define BLOCK_DATA_TIMEOUT_SECONDS (60 * 1) // 1 minutes.
+static const uint64_t USECS_PER_SEC = 1000000;
+
// context for block-wise transfer
static CABlockWiseContext_t g_context = { .sendThreadFunc = NULL,
.receivedThreadFunc = NULL,
{
if (!g_context.blockDataListMutex)
{
- g_context.blockDataListMutex = ca_mutex_new();
+ g_context.blockDataListMutex = oc_mutex_new();
if (!g_context.blockDataListMutex)
{
- OIC_LOG(ERROR, TAG, "ca_mutex_new has failed");
+ OIC_LOG(ERROR, TAG, "oc_mutex_new has failed");
return CA_STATUS_FAILED;
}
}
if (!g_context.blockDataSenderMutex)
{
- g_context.blockDataSenderMutex = ca_mutex_new();
+ g_context.blockDataSenderMutex = oc_mutex_new();
if (!g_context.blockDataSenderMutex)
{
- OIC_LOG(ERROR, TAG, "ca_mutex_new has failed");
+ OIC_LOG(ERROR, TAG, "oc_mutex_new has failed");
CATerminateBlockWiseMutexVariables();
return CA_STATUS_FAILED;
}
{
if (g_context.blockDataListMutex)
{
- ca_mutex_free(g_context.blockDataListMutex);
+ oc_mutex_free(g_context.blockDataListMutex);
g_context.blockDataListMutex = NULL;
}
if (g_context.blockDataSenderMutex)
{
- ca_mutex_free(g_context.blockDataSenderMutex);
+ oc_mutex_free(g_context.blockDataSenderMutex);
g_context.blockDataSenderMutex = NULL;
}
}
if (g_context.sendThreadFunc)
{
- ca_mutex_lock(g_context.blockDataSenderMutex);
+ oc_mutex_lock(g_context.blockDataSenderMutex);
g_context.sendThreadFunc(cloneData);
- ca_mutex_unlock(g_context.blockDataSenderMutex);
+ oc_mutex_unlock(g_context.blockDataSenderMutex);
}
else
{
{
OIC_LOG(DEBUG, TAG, "CAReceiveBlockWiseData");
VERIFY_NON_NULL(pdu, TAG, "pdu");
- VERIFY_NON_NULL(pdu->hdr, TAG, "pdu->hdr");
+ VERIFY_NON_NULL(pdu->transport_hdr, TAG, "pdu->transport_hdr");
VERIFY_NON_NULL(endpoint, TAG, "endpoint");
VERIFY_NON_NULL(receivedData, TAG, "receivedData");
// check if received message type is CA_MSG_RESET
- if (CA_EMPTY == pdu->hdr->coap_hdr_udp_t.code)
+ if (CA_EMPTY == pdu->transport_hdr->udp.code)
{
OIC_LOG(DEBUG, TAG, "code is CA_EMPTY..");
if (!isBlock1 && !isBlock2)
{
CABlockDataID_t* blockDataID = CACreateBlockDatablockId(
- (CAToken_t)pdu->hdr->coap_hdr_udp_t.token,
- pdu->hdr->coap_hdr_udp_t.token_length,
+ (CAToken_t)pdu->transport_hdr->udp.token,
+ pdu->transport_hdr->udp.token_length,
endpoint->port);
if (NULL == blockDataID || blockDataID->idLength < 1)
{
return CA_STATUS_FAILED;
}
- uint32_t code = CA_RESPONSE_CODE(pdu->hdr->coap_hdr_udp_t.code);
+ uint32_t code = CA_RESPONSE_CODE(pdu->transport_hdr->udp.code);
if (CA_REQUEST_ENTITY_INCOMPLETE == code)
{
CABlockData_t *data = CAGetBlockDataFromBlockDataList(blockDataID);
if (data->responseInfo)
{
data->responseInfo->info.type =
- (pdu->hdr->coap_hdr_udp_t.type == CA_MSG_CONFIRM) ?
+ (pdu->transport_hdr->udp.type == CA_MSG_CONFIRM) ?
CA_MSG_ACKNOWLEDGE : CA_MSG_NONCONFIRM;
- data->responseInfo->info.messageId = pdu->hdr->coap_hdr_udp_t.id;
+ data->responseInfo->info.messageId = pdu->transport_hdr->udp.id;
res = CAAddSendThreadQueue(data, blockID);
if (CA_STATUS_OK != res)
case CA_OPTION1_RESPONSE:
case CA_OPTION2_RESPONSE:
case CA_OPTION1_REQUEST_BLOCK:
- res = CASendBlockMessage(pdu, pdu->hdr->coap_hdr_udp_t.type, blockID);
+ res = CASendBlockMessage(pdu, pdu->transport_hdr->udp.type, blockID);
if (CA_STATUS_OK != res)
{
OIC_LOG(ERROR, TAG, "send has failed");
}
else if (receivedData->responseInfo)
{
- res = CASendBlockMessage(pdu, pdu->hdr->coap_hdr_udp_t.type, blockID);
+ res = CASendBlockMessage(pdu, pdu->transport_hdr->udp.type, blockID);
if (CA_STATUS_OK != res)
{
OIC_LOG(ERROR, TAG, "send has failed");
};
respInfo.info.type = CA_MSG_ACKNOWLEDGE;
respInfo.info.messageId = messageId;
+ respInfo.info.dataType = CA_RESPONSE_DATA;
CAResult_t caResult = CASendResponse(endpoint, &respInfo);
const CABlockDataID_t *blockID)
{
VERIFY_NON_NULL(pdu, TAG, "pdu");
- VERIFY_NON_NULL(pdu->hdr, TAG, "pdu->hdr");
+ VERIFY_NON_NULL(pdu->transport_hdr, TAG, "pdu->transport_hdr");
VERIFY_NON_NULL(blockID, TAG, "blockID");
CAData_t *data = CAGetDataSetFromBlockDataList(blockID);
break;
}
- uint32_t code = pdu->hdr->coap_hdr_udp_t.code;
+ uint32_t code = pdu->transport_hdr->udp.code;
if (CA_GET == code || CA_POST == code || CA_PUT == code || CA_DELETE == code)
{
if (data->responseInfo)
{
OIC_LOG(DEBUG, TAG, "set response info");
- data->responseInfo->info.messageId = pdu->hdr->coap_hdr_udp_t.id;
+ data->responseInfo->info.messageId = pdu->transport_hdr->udp.id;
data->responseInfo->info.type = sentMsgType;
data->responseInfo->result = CA_CONTINUE;
}
}
else
{
- // if the received response message type is CON, send empty message.
- // and then, send next block request message with new messagId.
- if (msgType == CA_MSG_CONFIRM)
- {
- CASendDirectEmptyResponse(data->remoteEndpoint,
- data->requestInfo->info.messageId);
- sentMsgType = CA_MSG_CONFIRM;
- }
-
if (data->requestInfo)
{
+ // if the received response message type is CON, send empty message.
+ // and then, send next block request message with new messagId.
+ if (msgType == CA_MSG_CONFIRM)
+ {
+ CASendDirectEmptyResponse(data->remoteEndpoint,
+ data->requestInfo->info.messageId);
+ sentMsgType = CA_MSG_CONFIRM;
+ }
+
OIC_LOG(DEBUG, TAG, "need new msgID");
data->requestInfo->info.messageId = 0;
data->requestInfo->info.type = sentMsgType;
}
+ else if (data->responseInfo)
+ {
+ data->responseInfo->info.messageId = pdu->transport_hdr->udp.id;
+ data->responseInfo->info.type = sentMsgType;
+ }
}
// add data to send thread
CAResponseResult_t responseResult, const CABlockDataID_t *blockID)
{
VERIFY_NON_NULL(pdu, TAG, "pdu");
- VERIFY_NON_NULL(pdu->hdr, TAG, "pdu->hdr");
+ VERIFY_NON_NULL(pdu->transport_hdr, TAG, "pdu->transport_hdr");
VERIFY_NON_NULL(blockID, TAG, "blockID");
// create error responseInfo
return CA_STATUS_FAILED;
}
+ if (!data->sentData)
+ {
+ OIC_LOG(ERROR, TAG, "data has no sent-data");
+ return CA_STATUS_FAILED;
+ }
+
+ CAData_t *cloneData = CACloneCAData(data->sentData);
+ if (!cloneData)
+ {
+ OIC_LOG(ERROR, TAG, "clone has failed");
+ return CA_MEMORY_ALLOC_FAILED;
+ }
+
CAMessageType_t sentMsgType = CA_MSG_NONCONFIRM;
- switch (pdu->hdr->coap_hdr_udp_t.type)
+ switch (pdu->transport_hdr->udp.type)
{
case CA_MSG_CONFIRM:
sentMsgType = CA_MSG_ACKNOWLEDGE;
case CA_MSG_ACKNOWLEDGE:
sentMsgType = CA_MSG_CONFIRM;
break;
+ default:
+ sentMsgType = CA_MSG_NONCONFIRM;
}
- CAData_t *cloneData = NULL;
- if (data->sentData)
+ if (cloneData->responseInfo)
{
- cloneData = CACloneCAData(data->sentData);
- if (!cloneData)
+ cloneData->responseInfo->info.messageId = pdu->transport_hdr->udp.id;
+ cloneData->responseInfo->info.type = sentMsgType;
+ cloneData->responseInfo->result = responseResult;
+ }
+ else
+ {
+ CAInfo_t responseData = { .tokenLength = pdu->transport_hdr->udp.token_length };
+ responseData.token = (CAToken_t) OICMalloc(responseData.tokenLength);
+ if (!responseData.token)
{
- OIC_LOG(ERROR, TAG, "clone has failed");
+ OIC_LOG(ERROR, TAG, "out of memory");
+ CADestroyDataSet(cloneData);
return CA_MEMORY_ALLOC_FAILED;
}
+ memcpy(responseData.token, pdu->transport_hdr->udp.token, responseData.tokenLength);
- if (cloneData->responseInfo)
+ cloneData->responseInfo = (CAResponseInfo_t*) OICCalloc(1, sizeof(CAResponseInfo_t));
+ if (!cloneData->responseInfo)
{
- cloneData->responseInfo->info.messageId = pdu->hdr->coap_hdr_udp_t.id;
- cloneData->responseInfo->info.type = sentMsgType;
- cloneData->responseInfo->result = responseResult;
+ OIC_LOG(ERROR, TAG, "out of memory");
+ CADestroyDataSet(cloneData);
+ OICFree(responseData.token);
+ return CA_MEMORY_ALLOC_FAILED;
}
- else
- {
- CAInfo_t responseData = { .tokenLength = pdu->hdr->coap_hdr_udp_t.token_length };
- responseData.token = (CAToken_t) OICMalloc(responseData.tokenLength);
- if (!responseData.token)
- {
- OIC_LOG(ERROR, TAG, "out of memory");
- return CA_MEMORY_ALLOC_FAILED;
- }
- memcpy(responseData.token, pdu->hdr->coap_hdr_udp_t.token, responseData.tokenLength);
- cloneData->responseInfo = (CAResponseInfo_t*) OICCalloc(1, sizeof(CAResponseInfo_t));
- if (!cloneData->responseInfo)
- {
- OIC_LOG(ERROR, TAG, "out of memory");
- OICFree(responseData.token);
- return CA_MEMORY_ALLOC_FAILED;
- }
-
- cloneData->responseInfo->info = responseData;
- cloneData->responseInfo->info.type = sentMsgType;
- cloneData->responseInfo->result = responseResult;
- }
- OIC_LOG(DEBUG, TAG, "set response message to send error code");
- }
- else
- {
- OIC_LOG(ERROR, TAG, "data has no sent-data");
- return CA_MEMORY_ALLOC_FAILED;
+ cloneData->responseInfo->info = responseData;
+ cloneData->responseInfo->info.type = sentMsgType;
+ cloneData->responseInfo->result = responseResult;
}
+ OIC_LOG(DEBUG, TAG, "set response message to send error code");
+
// if there is a requestInfo, remove it to send response message
if (cloneData->requestInfo)
{
// add data to send thread
if (g_context.sendThreadFunc)
{
- ca_mutex_lock(g_context.blockDataSenderMutex);
+ oc_mutex_lock(g_context.blockDataSenderMutex);
g_context.sendThreadFunc(cloneData);
- ca_mutex_unlock(g_context.blockDataSenderMutex);
+ oc_mutex_unlock(g_context.blockDataSenderMutex);
}
else
{
{
OIC_LOG(INFO, TAG, "CASetNextBlockOption1");
VERIFY_NON_NULL(pdu, TAG, "pdu");
- VERIFY_NON_NULL(pdu->hdr, TAG, "pdu->hdr");
+ VERIFY_NON_NULL(pdu->transport_hdr, TAG, "pdu->transport_hdr");
VERIFY_NON_NULL(endpoint, TAG, "endpoint");
VERIFY_NON_NULL(receivedData, TAG, "receivedData");
OIC_LOG_V(INFO, TAG, "num:%d, M:%d, sze:%d", block.num, block.m, block.szx);
CABlockDataID_t* blockDataID = CACreateBlockDatablockId(
- (CAToken_t)pdu->hdr->coap_hdr_udp_t.token,
- pdu->hdr->coap_hdr_udp_t.token_length,
+ (CAToken_t)pdu->transport_hdr->udp.token,
+ pdu->transport_hdr->udp.token_length,
endpoint->port);
if (NULL == blockDataID || blockDataID->idLength < 1)
{
return CA_STATUS_FAILED;
}
+ CAResult_t res = CA_STATUS_OK;
CABlockData_t *data = CACheckTheExistOfBlockData(blockDataID, pdu, endpoint,
COAP_OPTION_BLOCK1);
if (!data)
{
OIC_LOG(ERROR, TAG, "Failed to create or get block data");
+ res = CA_STATUS_FAILED;
goto exit;
}
- CAResult_t res = CA_STATUS_OK;
uint8_t blockWiseStatus = CA_BLOCK_UNKNOWN;
- uint32_t code = pdu->hdr->coap_hdr_udp_t.code;
+ uint32_t code = pdu->transport_hdr->udp.code;
if (CA_GET == code || CA_POST == code || CA_PUT == code || CA_DELETE == code)
{
// received message type is request
else
{
// received message type is response
- uint32_t code = CA_RESPONSE_CODE(pdu->hdr->coap_hdr_udp_t.code);
+ uint32_t code = CA_RESPONSE_CODE(pdu->transport_hdr->udp.code);
if (0 == block.m && (CA_REQUEST_ENTITY_INCOMPLETE != code
&& CA_REQUEST_ENTITY_TOO_LARGE != code))
{
OIC_LOG_V(INFO, TAG, "num:%d, M:%d, sze:%d", block.num, block.m, block.szx);
VERIFY_NON_NULL(pdu, TAG, "pdu");
- VERIFY_NON_NULL(pdu->hdr, TAG, "pdu->hdr");
+ VERIFY_NON_NULL(pdu->transport_hdr, TAG, "pdu->transport_hdr");
VERIFY_NON_NULL(endpoint, TAG, "endpoint");
VERIFY_NON_NULL(receivedData, TAG, "receivedData");
CABlockDataID_t* blockDataID = CACreateBlockDatablockId(
- (CAToken_t)pdu->hdr->coap_hdr_udp_t.token,
- pdu->hdr->coap_hdr_udp_t.token_length,
+ (CAToken_t)pdu->transport_hdr->udp.token,
+ pdu->transport_hdr->udp.token_length,
endpoint->port);
if (NULL == blockDataID || blockDataID->idLength < 1)
{
return CA_STATUS_FAILED;
}
+ CAResult_t res = CA_STATUS_OK;
CABlockData_t *data = CACheckTheExistOfBlockData(blockDataID, pdu, endpoint,
COAP_OPTION_BLOCK2);
if (!data)
{
OIC_LOG(ERROR, TAG, "Failed to create or get block data");
+ res = CA_STATUS_FAILED;
goto exit;
}
- CAResult_t res = CA_STATUS_OK;
uint8_t blockWiseStatus = CA_BLOCK_UNKNOWN;
- if (0 == block.num && CA_GET == pdu->hdr->coap_hdr_udp_t.code && 0 == block.m)
+ if (0 == block.num && CA_GET == pdu->transport_hdr->udp.code && 0 == block.m)
{
OIC_LOG(INFO, TAG, "first block number");
}
else
{
- uint32_t code = pdu->hdr->coap_hdr_udp_t.code;
+ uint32_t code = pdu->transport_hdr->udp.code;
if (CA_GET == code || CA_POST == code || CA_PUT == code || CA_DELETE == code)
{
// received message type is request
COAP_OPTION_SIZE2,
&(data->payloadLength));
- uint32_t code = CA_RESPONSE_CODE(pdu->hdr->coap_hdr_udp_t.code);
+ uint32_t code = CA_RESPONSE_CODE(pdu->transport_hdr->udp.code);
if (CA_REQUEST_ENTITY_INCOMPLETE != code && CA_REQUEST_ENTITY_TOO_LARGE != code)
{
// check if received payload is exact
// update block data
CAResult_t res = CA_STATUS_OK;
- uint32_t code = CA_RESPONSE_CODE(pdu->hdr->coap_hdr_udp_t.code);
+ uint32_t code = CA_RESPONSE_CODE(pdu->transport_hdr->udp.code);
if (CA_REQUEST_ENTITY_INCOMPLETE == code || CA_REQUEST_ENTITY_TOO_LARGE == code)
{
VERIFY_NON_NULL(currData, TAG, "currData");
VERIFY_NON_NULL(block, TAG, "block");
VERIFY_NON_NULL(pdu, TAG, "pdu");
- VERIFY_NON_NULL(pdu->hdr, TAG, "pdu->hdr");
+ VERIFY_NON_NULL(pdu->transport_hdr, TAG, "pdu->transport_hdr");
bool isReqMsg = false;
- uint32_t code = pdu->hdr->coap_hdr_udp_t.code;
+ uint32_t code = pdu->transport_hdr->udp.code;
if (CA_GET == code || CA_POST == code || CA_PUT == code || CA_DELETE == code)
{
isReqMsg = true;
CAResult_t CAUpdateMessageId(coap_pdu_t *pdu, const CABlockDataID_t *blockID)
{
VERIFY_NON_NULL(pdu, TAG, "pdu");
- VERIFY_NON_NULL(pdu->hdr, TAG, "pdu->hdr");
+ VERIFY_NON_NULL(pdu->transport_hdr, TAG, "pdu->transport_hdr");
VERIFY_NON_NULL(blockID, TAG, "blockID");
// if message is sent, update messageId in block-wise transfer list
if (cadata->requestInfo)
{
- cadata->requestInfo->info.messageId = pdu->hdr->coap_hdr_udp_t.id;
+ cadata->requestInfo->info.messageId = pdu->transport_hdr->udp.id;
}
return CA_STATUS_OK;
OIC_LOG(DEBUG, TAG, "IN-AddBlockOption");
VERIFY_NON_NULL(pdu, TAG, "pdu");
VERIFY_NON_NULL((*pdu), TAG, "(*pdu)");
- VERIFY_NON_NULL((*pdu)->hdr, TAG, "(*pdu)->hdr");
+ VERIFY_NON_NULL((*pdu)->transport_hdr, TAG, "(*pdu)->transport_hdr");
VERIFY_NON_NULL(info, TAG, "info");
VERIFY_NON_NULL(endpoint, TAG, "endpoint");
VERIFY_NON_NULL(options, TAG, "options");
}
CABlockDataID_t* blockDataID = CACreateBlockDatablockId(
- (CAToken_t)(*pdu)->hdr->coap_hdr_udp_t.token,
- (*pdu)->hdr->coap_hdr_udp_t.token_length,
+ (CAToken_t)(*pdu)->transport_hdr->udp.token,
+ (*pdu)->transport_hdr->udp.token_length,
endpoint->port);
if (NULL == blockDataID || blockDataID->idLength < 1)
{
goto exit;
}
- uint32_t repCode = CA_RESPONSE_CODE((*pdu)->hdr->coap_hdr_udp_t.code);
+ uint32_t repCode = CA_RESPONSE_CODE((*pdu)->transport_hdr->udp.code);
if (CA_REQUEST_ENTITY_INCOMPLETE == repCode)
{
OIC_LOG(INFO, TAG, "don't use option");
{
OIC_LOG_V(DEBUG, TAG, "[%s] opt will be added.",
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);
+
+ if (0 == 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)))
+ {
+ OIC_LOG(ERROR, TAG, "coap_add_option has failed");
+ res = CA_STATUS_FAILED;
+ goto exit;
+ }
}
}
-
OIC_LOG_V(DEBUG, TAG, "[%d] pdu length after option", (*pdu)->length);
// if response data is so large. it have to send as block transfer
if (!coap_add_data(*pdu, dataLength, (const unsigned char *) info->payload))
{
- OIC_LOG(INFO, TAG, "it have to use block");
+ OIC_LOG(INFO, TAG, "it has to use block");
res = CA_STATUS_FAILED;
goto exit;
}
}
}
- uint32_t code = (*pdu)->hdr->coap_hdr_udp_t.code;
+ uint32_t code = (*pdu)->transport_hdr->udp.code;
if (CA_GET == code || CA_POST == code || CA_PUT == code || CA_DELETE == code)
{
// if received message type is RESET from remote device,
}
}
+ CAResetBlockDataTTL(blockDataID);
exit:
CADestroyBlockID(blockDataID);
OIC_LOG(DEBUG, TAG, "OUT-AddBlockOption");
OIC_LOG(DEBUG, TAG, "IN-AddBlockOption2");
VERIFY_NON_NULL(pdu, TAG, "pdu");
VERIFY_NON_NULL((*pdu), TAG, "(*pdu)");
- VERIFY_NON_NULL((*pdu)->hdr, TAG, "(*pdu)->hdr");
+ VERIFY_NON_NULL((*pdu)->transport_hdr, TAG, "(*pdu)->transport_hdr");
VERIFY_NON_NULL(info, TAG, "info");
VERIFY_NON_NULL(blockID, TAG, "blockID");
VERIFY_NON_NULL(options, TAG, "options");
}
CAResult_t res = CA_STATUS_OK;
- uint32_t code = (*pdu)->hdr->coap_hdr_udp_t.code;
+ uint32_t code = (*pdu)->transport_hdr->udp.code;
if (CA_GET != code && CA_POST != code && CA_PUT != code && CA_DELETE != code)
{
CASetMoreBitFromBlock(dataLength, block2);
OIC_LOG(DEBUG, TAG, "IN-AddBlockOption1");
VERIFY_NON_NULL(pdu, TAG, "pdu");
VERIFY_NON_NULL((*pdu), TAG, "(*pdu)");
- VERIFY_NON_NULL((*pdu)->hdr, TAG, "(*pdu)->hdr");
+ VERIFY_NON_NULL((*pdu)->transport_hdr, TAG, "(*pdu)->transport_hdr");
VERIFY_NON_NULL(info, TAG, "info");
VERIFY_NON_NULL(blockID, TAG, "blockID");
VERIFY_NON_NULL(options, TAG, "options");
}
CAResult_t res = CA_STATUS_OK;
- uint32_t code = (*pdu)->hdr->coap_hdr_udp_t.code;
+ uint32_t code = (*pdu)->transport_hdr->udp.code;
if (CA_GET == code || CA_POST == code || CA_PUT == code || CA_DELETE == code)
{
CASetMoreBitFromBlock(dataLength, block1);
OIC_LOG_V(DEBUG, TAG, "[%d] pdu length", pdu->length);
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);
+ COAP_OPTION_DATA(*(coap_option *) opt->data));
if (!ret)
{
return CA_STATUS_FAILED;
OIC_LOG(ERROR, TAG, "it didn't order");
return CA_BLOCK_INCOMPLETE;
}
- return CA_BLOCK_RECEIVED_ALREADY;
+ else
+ {
+ OIC_LOG(ERROR, TAG, "already received this block");
+ return CA_BLOCK_RECEIVED_ALREADY;
+ }
}
}
CAData_t* CACreateNewDataSet(const coap_pdu_t *pdu, const CAEndpoint_t *endpoint)
{
VERIFY_NON_NULL_RET(pdu, TAG, "pdu", NULL);
- VERIFY_NON_NULL_RET(pdu->hdr, TAG, "pdu->hdr", NULL);
+ VERIFY_NON_NULL_RET(pdu->transport_hdr, TAG, "pdu->transport_hdr", NULL);
VERIFY_NON_NULL_RET(endpoint, TAG, "endpoint", NULL);
CARequestInfo_t* requestInfo = NULL;
CAResponseInfo_t* responseInfo = NULL;
- uint32_t code = pdu->hdr->coap_hdr_udp_t.code;
+ uint32_t code = pdu->transport_hdr->udp.code;
if (CA_GET == code || CA_POST == code || CA_PUT == code || CA_DELETE == code)
{
- CAInfo_t responseData = { .tokenLength = pdu->hdr->coap_hdr_udp_t.token_length };
+ CAInfo_t responseData = { .tokenLength = pdu->transport_hdr->udp.token_length };
responseData.token = (CAToken_t) OICMalloc(responseData.tokenLength);
if (!responseData.token)
{
OIC_LOG(ERROR, TAG, "out of memory");
return NULL;
}
- memcpy(responseData.token, pdu->hdr->coap_hdr_udp_t.token, responseData.tokenLength);
+ memcpy(responseData.token, pdu->transport_hdr->udp.token, responseData.tokenLength);
responseInfo = (CAResponseInfo_t*) OICCalloc(1, sizeof(CAResponseInfo_t));
if (!responseInfo)
}
else
{
- CAInfo_t requestData = { .tokenLength = pdu->hdr->coap_hdr_udp_t.token_length };
+ CAInfo_t requestData = { .tokenLength = pdu->transport_hdr->udp.token_length };
requestData.token = (CAToken_t) OICMalloc(requestData.tokenLength);
if (!requestData.token)
{
OIC_LOG(ERROR, TAG, "out of memory");
return NULL;
}
- memcpy(requestData.token, pdu->hdr->coap_hdr_udp_t.token, requestData.tokenLength);
+ memcpy(requestData.token, pdu->transport_hdr->udp.token, requestData.tokenLength);
requestInfo = (CARequestInfo_t*) OICCalloc(1, sizeof(CARequestInfo_t));
if (!requestInfo)
{
OIC_LOG(ERROR, TAG, "memory allocation failed");
OICFree(requestData.token);
+ OICFree(requestInfo);
return NULL;
}
CAGetResponseInfoFromPDU(pdu, resInfo, endpoint);
requestInfo->method = CA_GET;
- requestInfo->info.messageId = CAGetMessageIdFromPduBinaryData(pdu->hdr, pdu->length);
+ requestInfo->info.messageId = CAGetMessageIdFromPduBinaryData(pdu->transport_hdr,
+ pdu->length);
requestInfo->info.resourceUri = OICStrdup(resInfo->info.resourceUri);
// after copying the resource uri, destroy response info.
if (!data)
{
OIC_LOG(ERROR, TAG, "out of memory");
- OICFree(requestInfo);
- OICFree(responseInfo);
+ if (NULL != requestInfo)
+ {
+ OICFree(requestInfo->info.resourceUri);
+ OICFree(requestInfo->info.token);
+ OICFree(requestInfo);
+ }
+ if (NULL != responseInfo)
+ {
+ OICFree(responseInfo->info.token);
+ OICFree(responseInfo);
+ }
return NULL;
}
return data->requestInfo->info.payload;
}
}
- else
+ else if (data->responseInfo)
{
if (data->responseInfo->info.payload)
{
OIC_LOG(DEBUG, TAG, "IN-UpdateBlockOptionType");
VERIFY_NON_NULL(blockID, TAG, "blockID");
- ca_mutex_lock(g_context.blockDataListMutex);
+ oc_mutex_lock(g_context.blockDataListMutex);
size_t len = u_arraylist_length(g_context.dataList);
for (size_t i = 0; i < len; i++)
if (CABlockidMatches(currData, blockID))
{
currData->type = blockType;
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
OIC_LOG(DEBUG, TAG, "OUT-UpdateBlockOptionType");
return CA_STATUS_OK;
}
}
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
OIC_LOG(DEBUG, TAG, "OUT-UpdateBlockOptionType");
return CA_STATUS_FAILED;
OIC_LOG(DEBUG, TAG, "IN-GetBlockOptionType");
VERIFY_NON_NULL_RET(blockID, TAG, "blockID", 0);
- ca_mutex_lock(g_context.blockDataListMutex);
+ oc_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))
{
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
OIC_LOG(DEBUG, TAG, "OUT-GetBlockOptionType");
return currData->type;
}
}
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
OIC_LOG(DEBUG, TAG, "OUT-GetBlockOptionType");
return 0;
{
VERIFY_NON_NULL_RET(blockID, TAG, "blockID", NULL);
- ca_mutex_lock(g_context.blockDataListMutex);
+ oc_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))
{
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
return currData->sentData;
}
}
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
+
+ return NULL;
+}
+
+CABlockData_t *CAUpdateDataSetFromBlockDataList(const CABlockDataID_t *blockID,
+ const CAData_t *sendData)
+{
+ VERIFY_NON_NULL_RET(blockID, TAG, "blockID", NULL);
+ VERIFY_NON_NULL_RET(sendData, TAG, "sendData", NULL);
+
+ oc_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))
+ {
+ CADestroyDataSet(currData->sentData);
+ currData->sentData = CACloneCAData(sendData);
+ oc_mutex_unlock(g_context.blockDataListMutex);
+ return currData;
+ }
+ }
+ oc_mutex_unlock(g_context.blockDataListMutex);
return NULL;
}
VERIFY_NON_NULL(endpoint, TAG, "endpoint");
VERIFY_NON_NULL(responseInfo, TAG, "responseInfo");
- ca_mutex_lock(g_context.blockDataListMutex);
+ oc_mutex_lock(g_context.blockDataListMutex);
size_t len = u_arraylist_length(g_context.dataList);
for (size_t i = 0; i < len; i++)
if (NULL != currData->sentData && NULL != currData->sentData->requestInfo)
{
- if (pdu->hdr->coap_hdr_udp_t.id == currData->sentData->requestInfo->info.messageId &&
+ if (pdu->transport_hdr->udp.id == currData->sentData->requestInfo->info.messageId &&
endpoint->adapter == currData->sentData->remoteEndpoint->adapter)
{
if (NULL != currData->sentData->requestInfo->info.token)
if (NULL == responseInfo->info.token)
{
OIC_LOG(ERROR, TAG, "out of memory");
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
return CA_MEMORY_ALLOC_FAILED;
}
memcpy(responseInfo->info.token, currData->sentData->requestInfo->info.token,
responseInfo->info.tokenLength);
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
OIC_LOG(DEBUG, TAG, "OUT-CAGetTokenFromBlockDataList");
return CA_STATUS_OK;
}
}
}
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
OIC_LOG(DEBUG, TAG, "OUT-CAGetTokenFromBlockDataList");
return CA_STATUS_FAILED;
return CA_STATUS_FAILED;
}
- CABlockData_t *storedData = CAGetBlockDataFromBlockDataList(blockDataID);
- if (storedData)
+ CABlockData_t *updatedData = CAUpdateDataSetFromBlockDataList(blockDataID, sendData);
+ if (updatedData)
{
OIC_LOG(DEBUG, TAG, "Send response about the received block request.");
- if (storedData->sentData)
- {
- OIC_LOG(DEBUG, TAG, "init block number");
- CADestroyDataSet(storedData->sentData);
- }
- storedData->sentData = CACloneCAData(sendData);
- *blockData = storedData;
+ *blockData = updatedData;
CADestroyBlockID(blockDataID);
return CA_STATUS_OK;
}
{
VERIFY_NON_NULL_RET(blockID, TAG, "blockID", NULL);
- ca_mutex_lock(g_context.blockDataListMutex);
+ oc_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))
{
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
return currData;
}
}
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
return NULL;
}
OIC_LOG(DEBUG, TAG, "IN-GetBlockOption");
VERIFY_NON_NULL_RET(blockID, TAG, "blockID", NULL);
- ca_mutex_lock(g_context.blockDataListMutex);
+ oc_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))
{
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
OIC_LOG(DEBUG, TAG, "OUT-GetBlockOption");
if (COAP_OPTION_BLOCK2 == blockType)
{
}
}
}
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
OIC_LOG(DEBUG, TAG, "OUT-GetBlockOption");
return NULL;
VERIFY_NON_NULL_RET(blockID, TAG, "blockID", NULL);
VERIFY_NON_NULL_RET(fullPayloadLen, TAG, "fullPayloadLen", NULL);
- ca_mutex_lock(g_context.blockDataListMutex);
+ oc_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))
{
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
*fullPayloadLen = currData->receivedPayloadLen;
OIC_LOG(DEBUG, TAG, "OUT-GetFullPayload");
return currData->payload;
}
}
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
OIC_LOG(DEBUG, TAG, "OUT-GetFullPayload");
return NULL;
return NULL;
}
data->blockDataId = blockDataID;
+ uint64_t now = OICGetCurrentTime(TIME_IN_US);
+ data->ttl = now + (BLOCK_DATA_TIMEOUT_SECONDS * USECS_PER_SEC);
- ca_mutex_lock(g_context.blockDataListMutex);
+ oc_mutex_lock(g_context.blockDataListMutex);
bool res = u_arraylist_add(g_context.dataList, (void *) data);
if (!res)
CADestroyBlockID(data->blockDataId);
CADestroyDataSet(data->sentData);
OICFree(data);
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
return NULL;
}
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
OIC_LOG(DEBUG, TAG, "OUT-CreateBlockData");
return data;
CAResult_t CARemoveBlockDataFromList(const CABlockDataID_t *blockID)
{
- OIC_LOG(DEBUG, TAG, "CARemoveBlockData");
+ OIC_LOG_V(DEBUG, TAG, "In %s", __func__);
VERIFY_NON_NULL(blockID, TAG, "blockID");
- ca_mutex_lock(g_context.blockDataListMutex);
+ oc_mutex_lock(g_context.blockDataListMutex);
size_t len = u_arraylist_length(g_context.dataList);
for (size_t i = 0; i < len; i++)
if (!removedData)
{
OIC_LOG(ERROR, TAG, "data is NULL");
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
return CA_STATUS_FAILED;
}
+ OIC_LOG(DEBUG, TAG, "Removed BlockID is ");
+ OIC_LOG_BUFFER(DEBUG, TAG, (const uint8_t *) removedData->blockDataId->id,
+ removedData->blockDataId->idLength);
+
// destroy memory
- CADestroyDataSet(currData->sentData);
- CADestroyBlockID(currData->blockDataId);
- OICFree(currData->payload);
- OICFree(currData);
- ca_mutex_unlock(g_context.blockDataListMutex);
+ CADestroyDataSet(removedData->sentData);
+ CADestroyBlockID(removedData->blockDataId);
+ OICFree(removedData->payload);
+ OICFree(removedData);
+ oc_mutex_unlock(g_context.blockDataListMutex);
return CA_STATUS_OK;
}
}
- ca_mutex_unlock(g_context.blockDataListMutex);
-
+ oc_mutex_unlock(g_context.blockDataListMutex);
+ OIC_LOG_V(DEBUG, TAG, "Out %s", __func__);
return CA_STATUS_OK;
}
{
OIC_LOG(DEBUG, TAG, "CARemoveAllBlockDataFromList");
- ca_mutex_lock(g_context.blockDataListMutex);
+ oc_mutex_lock(g_context.blockDataListMutex);
size_t len = u_arraylist_length(g_context.dataList);
for (size_t i = len; i > 0; i--)
OICFree(removedData);
}
}
- ca_mutex_unlock(g_context.blockDataListMutex);
+ oc_mutex_unlock(g_context.blockDataListMutex);
return CA_STATUS_OK;
}
{
VERIFY_NON_NULL_VOID(data, TAG, "data");
- CAFreeEndpoint(data->remoteEndpoint);
- CADestroyRequestInfoInternal(data->requestInfo);
- CADestroyResponseInfoInternal(data->responseInfo);
+ if (data->remoteEndpoint)
+ {
+ CAFreeEndpoint(data->remoteEndpoint);
+ data->remoteEndpoint = NULL;
+ }
+ if (data->requestInfo)
+ {
+ CADestroyRequestInfoInternal(data->requestInfo);
+ data->requestInfo = NULL;
+ }
+ if (data->responseInfo)
+ {
+ CADestroyResponseInfoInternal(data->responseInfo);
+ data->responseInfo = NULL;
+ }
OICFree(data);
}
return CA_STATUS_FAILED;
}
- CAResult_t res = CA_STATUS_OK;
+ CAResult_t res = CARemoveBlockDataFromList(blockDataID);
+ if (CA_STATUS_OK != res)
+ {
+ OIC_LOG(ERROR, TAG, "CARemoveBlockDataFromList failed");
+ }
+
+ CADestroyBlockID(blockDataID);
+ return res;
+}
- if (NULL != CAGetBlockDataFromBlockDataList(blockDataID))
+void CAResetBlockDataTTL(const CABlockDataID_t *blockID)
+{
+ OIC_LOG_V(DEBUG, TAG, "In %s", __func__);
+
+ oc_mutex_lock(g_context.blockDataListMutex);
+ size_t len = u_arraylist_length(g_context.dataList);
+ for (size_t i = 0; i < len; i++)
{
- res = CARemoveBlockDataFromList(blockDataID);
- if (CA_STATUS_OK != res)
+ CABlockData_t *blockData = (CABlockData_t *) u_arraylist_get(g_context.dataList, i);
+ if (CABlockidMatches(blockData, blockID))
{
- OIC_LOG(ERROR, TAG, "CARemoveBlockDataFromList failed");
+ uint64_t now = OICGetCurrentTime(TIME_IN_US);
+ blockData->ttl = now + (BLOCK_DATA_TIMEOUT_SECONDS * USECS_PER_SEC);
+ oc_mutex_unlock(g_context.blockDataListMutex);
+ OIC_LOG_V(DEBUG, TAG, "Out %s", __func__);
+ return;
}
}
+ oc_mutex_unlock(g_context.blockDataListMutex);
+ OIC_LOG_V(DEBUG, TAG, "Out %s", __func__);
+}
- CADestroyBlockID(blockDataID);
+void CACheckAndDeleteTimedOutBlockData()
+{
+ OIC_LOG_V(DEBUG, TAG, "In %s", __func__);
- return res;
+ uint64_t now = OICGetCurrentTime(TIME_IN_US);
+
+ oc_mutex_lock(g_context.blockDataListMutex);
+ for (size_t i = 0; i < u_arraylist_length(g_context.dataList); i++)
+ {
+ CABlockData_t *blockData = (CABlockData_t *) u_arraylist_get(g_context.dataList, i);
+ if (blockData && blockData->ttl < now)
+ {
+ OIC_LOG(INFO, TAG, "Deleting timed-out BlockData");
+ OIC_LOG(DEBUG, TAG, "BlockID is ");
+ OIC_LOG_BUFFER(DEBUG, TAG, (const uint8_t *) blockData->blockDataId->id,
+ blockData->blockDataId->idLength);
+
+ blockData = (CABlockData_t *) u_arraylist_remove(g_context.dataList, i);
+ if (blockData)
+ {
+ // destroy memory
+ CADestroyDataSet(blockData->sentData);
+ CADestroyBlockID(blockData->blockDataId);
+ OICFree(blockData->payload);
+ OICFree(blockData);
+ }
+ }
+ }
+ oc_mutex_unlock(g_context.blockDataListMutex);
+ OIC_LOG_V(DEBUG, TAG, "Out %s", __func__);
}