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)
{
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(
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
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,
{
clone->requestInfo = CACloneRequestInfo(data->requestInfo);
}
-
- if (data->responseInfo)
+ else if (data->responseInfo)
{
clone->responseInfo = CACloneResponseInfo(data->responseInfo);
}
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)
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)