X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fconnectivity%2Fsrc%2Fcablockwisetransfer.c;h=dd17fe9937dd9826558d05b08b02e14f7cf99784;hb=fcc3bb843169bf6d75aaf3ae2b29bcef4fc0c523;hp=60882e773fa22ed0ca0de6a1643eb2795b253956;hpb=defdf6eff73081dc0ccb48b3f0253ec655d7c085;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/connectivity/src/cablockwisetransfer.c b/resource/csdk/connectivity/src/cablockwisetransfer.c index 60882e7..dd17fe9 100644 --- a/resource/csdk/connectivity/src/cablockwisetransfer.c +++ b/resource/csdk/connectivity/src/cablockwisetransfer.c @@ -307,12 +307,12 @@ CAResult_t CAReceiveBlockWiseData(coap_pdu_t *pdu, const CAEndpoint_t *endpoint, { 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.."); @@ -392,8 +392,8 @@ CAResult_t CAReceiveBlockWiseData(coap_pdu_t *pdu, const CAEndpoint_t *endpoint, 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) { @@ -402,7 +402,7 @@ CAResult_t CAReceiveBlockWiseData(coap_pdu_t *pdu, const CAEndpoint_t *endpoint, 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); @@ -496,9 +496,9 @@ CAResult_t CAProcessNextStep(const coap_pdu_t *pdu, const CAData_t *receivedData 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) @@ -512,7 +512,7 @@ CAResult_t CAProcessNextStep(const coap_pdu_t *pdu, const CAData_t *receivedData 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"); @@ -571,7 +571,7 @@ CAResult_t CAProcessNextStep(const coap_pdu_t *pdu, const CAData_t *receivedData } 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"); @@ -605,7 +605,7 @@ CAResult_t CASendBlockMessage(const coap_pdu_t *pdu, CAMessageType_t msgType, 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); @@ -629,34 +629,39 @@ CAResult_t CASendBlockMessage(const coap_pdu_t *pdu, CAMessageType_t msgType, 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 @@ -673,7 +678,7 @@ CAResult_t CASendErrorMessage(const coap_pdu_t *pdu, uint8_t status, 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 @@ -685,7 +690,7 @@ CAResult_t CASendErrorMessage(const coap_pdu_t *pdu, uint8_t status, } 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; @@ -693,6 +698,8 @@ CAResult_t CASendErrorMessage(const coap_pdu_t *pdu, uint8_t status, case CA_MSG_ACKNOWLEDGE: sentMsgType = CA_MSG_CONFIRM; break; + default: + sentMsgType = CA_MSG_NONCONFIRM; } CAData_t *cloneData = NULL; @@ -707,20 +714,20 @@ CAResult_t CASendErrorMessage(const coap_pdu_t *pdu, uint8_t status, if (cloneData->responseInfo) { - cloneData->responseInfo->info.messageId = pdu->hdr->coap_hdr_udp_t.id; + cloneData->responseInfo->info.messageId = pdu->transport_hdr->udp.id; cloneData->responseInfo->info.type = sentMsgType; cloneData->responseInfo->result = responseResult; } else { - 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 CA_MEMORY_ALLOC_FAILED; } - memcpy(responseData.token, pdu->hdr->coap_hdr_udp_t.token, responseData.tokenLength); + memcpy(responseData.token, pdu->transport_hdr->udp.token, responseData.tokenLength); cloneData->responseInfo = (CAResponseInfo_t*) OICCalloc(1, sizeof(CAResponseInfo_t)); if (!cloneData->responseInfo) @@ -859,15 +866,15 @@ CAResult_t CASetNextBlockOption1(coap_pdu_t *pdu, const CAEndpoint_t *endpoint, { 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) { @@ -887,7 +894,7 @@ CAResult_t CASetNextBlockOption1(coap_pdu_t *pdu, const CAEndpoint_t *endpoint, } 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 @@ -940,7 +947,7 @@ CAResult_t CASetNextBlockOption1(coap_pdu_t *pdu, const CAEndpoint_t *endpoint, 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)) { @@ -1004,13 +1011,13 @@ CAResult_t CASetNextBlockOption2(coap_pdu_t *pdu, const CAEndpoint_t *endpoint, 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) { @@ -1030,7 +1037,7 @@ CAResult_t CASetNextBlockOption2(coap_pdu_t *pdu, const CAEndpoint_t *endpoint, } 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"); @@ -1052,7 +1059,7 @@ CAResult_t CASetNextBlockOption2(coap_pdu_t *pdu, const CAEndpoint_t *endpoint, } 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 @@ -1084,7 +1091,7 @@ CAResult_t CASetNextBlockOption2(coap_pdu_t *pdu, const CAEndpoint_t *endpoint, 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 @@ -1162,7 +1169,7 @@ CAResult_t CAUpdateBlockOptionItems(CABlockData_t *currData, const coap_pdu_t *p // 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) { @@ -1257,10 +1264,10 @@ CAResult_t CANegotiateBlockSize(CABlockData_t *currData, coap_block_t *block, 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; @@ -1357,7 +1364,7 @@ CAResult_t CAUpdateBlockData(CABlockData_t *currData, coap_block_t block, 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 @@ -1370,7 +1377,7 @@ CAResult_t CAUpdateMessageId(coap_pdu_t *pdu, const CABlockDataID_t *blockID) 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; @@ -1382,7 +1389,7 @@ CAResult_t CAAddBlockOption(coap_pdu_t **pdu, const CAInfo_t *info, 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"); @@ -1396,8 +1403,8 @@ CAResult_t CAAddBlockOption(coap_pdu_t **pdu, const CAInfo_t *info, } 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) { @@ -1406,7 +1413,7 @@ CAResult_t CAAddBlockOption(coap_pdu_t **pdu, const CAInfo_t *info, 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"); @@ -1448,7 +1455,7 @@ CAResult_t CAAddBlockOption(coap_pdu_t **pdu, const CAInfo_t *info, 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); + COAP_OPTION_DATA(*(coap_option *) opt->data)); } } @@ -1467,7 +1474,7 @@ CAResult_t CAAddBlockOption(coap_pdu_t **pdu, const CAInfo_t *info, } } - 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, @@ -1496,7 +1503,7 @@ CAResult_t CAAddBlockOption2(coap_pdu_t **pdu, const CAInfo_t *info, size_t data 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"); @@ -1511,7 +1518,7 @@ CAResult_t CAAddBlockOption2(coap_pdu_t **pdu, const CAInfo_t *info, size_t data } 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); @@ -1601,7 +1608,7 @@ CAResult_t CAAddBlockOption1(coap_pdu_t **pdu, const CAInfo_t *info, size_t data 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"); @@ -1615,7 +1622,7 @@ CAResult_t CAAddBlockOption1(coap_pdu_t **pdu, const CAInfo_t *info, size_t data } 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); @@ -1744,7 +1751,7 @@ CAResult_t CAAddOptionToPDU(coap_pdu_t *pdu, coap_list_t **options) 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; @@ -1861,7 +1868,11 @@ uint8_t CACheckBlockErrorType(CABlockData_t *currData, coap_block_t *receivedBlo 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; + } } } @@ -2000,23 +2011,23 @@ CAResult_t CAUpdatePayloadData(CABlockData_t *currData, const CAData_t *received 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) @@ -2029,14 +2040,14 @@ CAData_t* CACreateNewDataSet(const coap_pdu_t *pdu, const CAEndpoint_t *endpoint } 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) @@ -2059,7 +2070,7 @@ CAData_t* CACreateNewDataSet(const coap_pdu_t *pdu, const CAEndpoint_t *endpoint 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. @@ -2183,7 +2194,7 @@ CAPayload_t CAGetPayloadInfo(const CAData_t *data, size_t *payloadLen) return data->requestInfo->info.payload; } } - else + else if (data->responseInfo) { if (data->responseInfo->info.payload) { @@ -2293,6 +2304,31 @@ CAData_t *CAGetDataSetFromBlockDataList(const CABlockDataID_t *blockID) 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); + + 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)) + { + CADestroyDataSet(currData->sentData); + currData->sentData = CACloneCAData(sendData); + ca_mutex_unlock(g_context.blockDataListMutex); + return currData; + } + } + ca_mutex_unlock(g_context.blockDataListMutex); + + return NULL; +} + CAResult_t CAGetTokenFromBlockDataList(const coap_pdu_t *pdu, const CAEndpoint_t *endpoint, CAResponseInfo_t *responseInfo) { @@ -2314,7 +2350,7 @@ CAResult_t CAGetTokenFromBlockDataList(const coap_pdu_t *pdu, const CAEndpoint_t 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) @@ -2363,17 +2399,11 @@ CAResult_t CACheckBlockDataValidation(const CAData_t *sendData, CABlockData_t ** 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; } @@ -2559,10 +2589,10 @@ CAResult_t CARemoveBlockDataFromList(const CABlockDataID_t *blockID) } // destroy memory - CADestroyDataSet(currData->sentData); - CADestroyBlockID(currData->blockDataId); - OICFree(currData->payload); - OICFree(currData); + CADestroyDataSet(removedData->sentData); + CADestroyBlockID(removedData->blockDataId); + OICFree(removedData->payload); + OICFree(removedData); ca_mutex_unlock(g_context.blockDataListMutex); return CA_STATUS_OK; } @@ -2603,9 +2633,21 @@ void CADestroyDataSet(CAData_t* data) { 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); } @@ -2692,18 +2734,12 @@ CAResult_t CARemoveBlockDataFromListWithSeed(const CAToken_t token, uint8_t toke return CA_STATUS_FAILED; } - CAResult_t res = CA_STATUS_OK; - - if (NULL != CAGetBlockDataFromBlockDataList(blockDataID)) + CAResult_t res = CARemoveBlockDataFromList(blockDataID); + if (CA_STATUS_OK != res) { - res = CARemoveBlockDataFromList(blockDataID); - if (CA_STATUS_OK != res) - { - OIC_LOG(ERROR, TAG, "CARemoveBlockDataFromList failed"); - } + OIC_LOG(ERROR, TAG, "CARemoveBlockDataFromList failed"); } CADestroyBlockID(blockDataID); - return res; }