From c4a6fd206e343bfcbeedddc338d95dbc9802c0e6 Mon Sep 17 00:00:00 2001 From: "hyuna0213.jo" Date: Mon, 12 Oct 2015 22:05:36 +0900 Subject: [PATCH] Changed the logic to add option list in pdu. resource uri has become null when CASendResponse API use large payload. because we failed to add option in pdu. so we fixed the code to add all option normally. Change-Id: I9e25421793879020ccc0695b9c2642f18fd5e8d2 Signed-off-by: hyuna0213.jo Reviewed-on: https://gerrit.iotivity.org/gerrit/3811 Tested-by: jenkins-iotivity Reviewed-by: Jaehong Jo Reviewed-by: Jon A. Cruz --- .../csdk/connectivity/inc/cablockwisetransfer.h | 14 +++- .../csdk/connectivity/samples/linux/sample_main.c | 3 + .../csdk/connectivity/src/cablockwisetransfer.c | 95 ++++++++++++++-------- resource/csdk/connectivity/src/caprotocolmessage.c | 2 +- 4 files changed, 78 insertions(+), 36 deletions(-) diff --git a/resource/csdk/connectivity/inc/cablockwisetransfer.h b/resource/csdk/connectivity/inc/cablockwisetransfer.h index 49461f8..3b2878b 100644 --- a/resource/csdk/connectivity/inc/cablockwisetransfer.h +++ b/resource/csdk/connectivity/inc/cablockwisetransfer.h @@ -329,16 +329,24 @@ CAResult_t CAAddBlockOption1(coap_pdu_t **pdu, const CAInfo_t *info, size_t data const CABlockDataID_t *blockID, coap_list_t **options); /** - * Add the block option in pdu data. - * @param[in] pdu pdu object. + * Add the block option in option list. * @param[out] block block data. * @param[in] blockType block option type. + * @param[out] options option list. * @return ::CASTATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h). */ -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); /** + * Add the option list in pdu data. + * @param[out] pdu pdu object. + * @param[out] options option list. + * @return ::CASTATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h). + */ +CAResult_t CAAddOptionToPDU(coap_pdu_t *pdu, coap_list_t **options); + +/** * Add the size option in pdu data. * @param[in/out] pdu pdu object. * @param[in] sizeType size option type. diff --git a/resource/csdk/connectivity/samples/linux/sample_main.c b/resource/csdk/connectivity/samples/linux/sample_main.c index 2400163..d717f0f 100644 --- a/resource/csdk/connectivity/samples/linux/sample_main.c +++ b/resource/csdk/connectivity/samples/linux/sample_main.c @@ -994,6 +994,7 @@ void request_handler(const CAEndpoint_t *object, const CARequestInfo_t *requestI } printf("Data: %s\n", requestInfo->info.payload); printf("Message type: %s\n", MESSAGE_TYPE[requestInfo->info.type]); + printf("Resource URI: %s \n", requestInfo->info.resourceUri); if (requestInfo->info.options) { @@ -1061,6 +1062,8 @@ void response_handler(const CAEndpoint_t *object, const CAResponseInfo_t *respon printf("Data: %s\n", responseInfo->info.payload); printf("Message type: %s\n", MESSAGE_TYPE[responseInfo->info.type]); printf("Token: %s\n", responseInfo->info.token); + printf("Resource URI: %s \n", responseInfo->info.resourceUri); + if (responseInfo->info.options) { uint32_t len = responseInfo->info.numOptions; diff --git a/resource/csdk/connectivity/src/cablockwisetransfer.c b/resource/csdk/connectivity/src/cablockwisetransfer.c index dbab84e..2b46b97 100644 --- a/resource/csdk/connectivity/src/cablockwisetransfer.c +++ b/resource/csdk/connectivity/src/cablockwisetransfer.c @@ -1525,10 +1525,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"); @@ -1542,29 +1540,13 @@ CAResult_t CAAddBlockOption2(coap_pdu_t **pdu, const CAInfo_t *info, size_t data (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"); - } + CAGetMoreBitFromBlock(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"); @@ -1573,10 +1555,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"); @@ -1587,6 +1577,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)) { @@ -1621,7 +1619,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"); @@ -1668,7 +1674,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"); @@ -1711,13 +1725,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, @@ -1757,11 +1780,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"); @@ -1779,6 +1801,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) { @@ -1788,15 +1816,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; } diff --git a/resource/csdk/connectivity/src/caprotocolmessage.c b/resource/csdk/connectivity/src/caprotocolmessage.c index 18412dd..58ca291 100644 --- a/resource/csdk/connectivity/src/caprotocolmessage.c +++ b/resource/csdk/connectivity/src/caprotocolmessage.c @@ -136,7 +136,7 @@ coap_pdu_t *CAGeneratePDU(uint32_t code, const CAInfo_t *info, const CAEndpoint_ } else { - if (CA_MSG_ACKNOWLEDGE != info->type && info->resourceUri) + if (info->resourceUri) { uint32_t length = strlen(info->resourceUri); if (CA_MAX_URI_LENGTH < length) -- 2.7.4