From 9a5202068f0b0d831162988e7487c786edb9f62e Mon Sep 17 00:00:00 2001 From: Ziran Sun Date: Fri, 24 Mar 2017 15:24:56 +0000 Subject: [PATCH] Version option is not associate with application/cbor format. 1. Remove versioing option settings for application/cbor format. 2. Correct default versioing number value. Change-Id: Ia9a5f1edfc834a450106eefc4097c60726e4d740 Signed-off-by: Ziran Sun Reviewed-on: https://gerrit.iotivity.org/gerrit/18167 Tested-by: jenkins-iotivity Reviewed-by: Dan Mihai Reviewed-by: Todd Malsbary --- resource/csdk/connectivity/src/caprotocolmessage.c | 32 ++++++++--------- .../samples/linux/SimpleClientServer/SConscript | 1 + .../samples/linux/SimpleClientServer/occlient.cpp | 20 +++++------ resource/csdk/stack/src/ocserverrequest.c | 11 ++++-- resource/csdk/stack/src/ocstack.c | 41 +++++++++++++++++----- 5 files changed, 66 insertions(+), 39 deletions(-) diff --git a/resource/csdk/connectivity/src/caprotocolmessage.c b/resource/csdk/connectivity/src/caprotocolmessage.c index 585dcc0..da0bbba 100644 --- a/resource/csdk/connectivity/src/caprotocolmessage.c +++ b/resource/csdk/connectivity/src/caprotocolmessage.c @@ -609,19 +609,17 @@ CAResult_t CAParsePayloadFormatHeadOption(uint16_t formatOption, CAPayloadFormat OIC_LOG(ERROR, TAG, "Format option not created"); return CA_STATUS_INVALID_PARAM; } - else + int ret = coap_insert(optlist, encodeNode, CAOrderOpts); + if (0 >= ret) { - int ret = coap_insert(optlist, encodeNode, CAOrderOpts); - if (0 >= ret) - { - coap_delete(encodeNode); - OIC_LOG(ERROR, TAG, "Format option not inserted in header"); - return CA_STATUS_INVALID_PARAM; - } + coap_delete(encodeNode); + OIC_LOG(ERROR, TAG, "Format option not inserted in header"); + return CA_STATUS_INVALID_PARAM; } - if (COAP_OPTION_ACCEPT_VERSION == versionOption || - COAP_OPTION_CONTENT_VERSION == versionOption) + if ((COAP_OPTION_ACCEPT_VERSION == versionOption || + COAP_OPTION_CONTENT_VERSION == versionOption) && + CA_FORMAT_APPLICATION_VND_OCF_CBOR == format) { versionNode = CACreateNewOptionNode(versionOption, coap_encode_var_bytes(versionBuf, version), (char *) versionBuf); @@ -632,10 +630,7 @@ CAResult_t CAParsePayloadFormatHeadOption(uint16_t formatOption, CAPayloadFormat coap_delete(encodeNode); return CA_STATUS_INVALID_PARAM; } - } - if (versionNode) - { - int ret = coap_insert(optlist, versionNode, CAOrderOpts); + ret = coap_insert(optlist, versionNode, CAOrderOpts); if (0 >= ret) { coap_delete(versionNode); @@ -921,7 +916,8 @@ CAResult_t CAGetInfoFromPDU(const coap_pdu_t *pdu, const CAEndpoint_t *endpoint, { if (2 == COAP_OPT_LENGTH(option)) { - outInfo->payloadVersion = coap_decode_var_bytes(COAP_OPT_VALUE(option), COAP_OPT_LENGTH(option)); + outInfo->payloadVersion = coap_decode_var_bytes(COAP_OPT_VALUE(option), + COAP_OPT_LENGTH(option)); } else { @@ -934,7 +930,8 @@ CAResult_t CAGetInfoFromPDU(const coap_pdu_t *pdu, const CAEndpoint_t *endpoint, { if (2 == COAP_OPT_LENGTH(option)) { - outInfo->acceptVersion = coap_decode_var_bytes(COAP_OPT_VALUE(option), COAP_OPT_LENGTH(option)); + outInfo->acceptVersion = coap_decode_var_bytes(COAP_OPT_VALUE(option), + COAP_OPT_LENGTH(option)); } else { @@ -951,7 +948,8 @@ CAResult_t CAGetInfoFromPDU(const coap_pdu_t *pdu, const CAEndpoint_t *endpoint, else if (2 == COAP_OPT_LENGTH(option)) { outInfo->acceptFormat = CAConvertFormat( - coap_decode_var_bytes(COAP_OPT_VALUE(option), COAP_OPT_LENGTH(option))); + coap_decode_var_bytes(COAP_OPT_VALUE(option), + COAP_OPT_LENGTH(option))); } else { diff --git a/resource/csdk/stack/samples/linux/SimpleClientServer/SConscript b/resource/csdk/stack/samples/linux/SimpleClientServer/SConscript index 5a145b7..4b9bfdf 100644 --- a/resource/csdk/stack/samples/linux/SimpleClientServer/SConscript +++ b/resource/csdk/stack/samples/linux/SimpleClientServer/SConscript @@ -43,6 +43,7 @@ samples_env.PrependUnique(CPPPATH=[ '../../../../logger/include', '../../../../include', '../../../../stack/include', + '../../../../connectivity/api', '../../../../security/include', '../../../../../../extlibs/boost/boost', '../../../../../oc_logger/include', diff --git a/resource/csdk/stack/samples/linux/SimpleClientServer/occlient.cpp b/resource/csdk/stack/samples/linux/SimpleClientServer/occlient.cpp index 6576405..1b39e28 100755 --- a/resource/csdk/stack/samples/linux/SimpleClientServer/occlient.cpp +++ b/resource/csdk/stack/samples/linux/SimpleClientServer/occlient.cpp @@ -23,6 +23,7 @@ #include #include #include +#include "cacommon.h" #ifdef HAVE_UNISTD_H #include #endif @@ -405,7 +406,7 @@ OCStackApplicationResult discoveryReqCB(void* ctx, OCDoHandle /*handle*/, { // Re-initiate discovery with OIC format. This is applicable for the case that // a OCF 1.x client speaks to a OIC 1.1 server. - InitDiscovery(OC_LOW_QOS, 1); + InitDiscovery(OC_LOW_QOS, 0); return OC_STACK_KEEP_TRANSACTION; } @@ -879,15 +880,14 @@ int InitDiscovery(OCQualityOfService qos, uint8_t withVendorSpecificHeaderOption memset(options, 0, sizeof(OCHeaderOption) * MAX_HEADER_OPTIONS); size_t numOptions = 0; - uint8_t option0[] = {0}; - uint16_t optionID = 2049; - size_t optionDataSize = sizeof(option0); - OCSetHeaderOption(options, &numOptions, optionID, option0, optionDataSize); + uint16_t format = COAP_MEDIATYPE_APPLICATION_VND_OCF_CBOR; + uint16_t optionID = CA_OPTION_ACCEPT; + OCSetHeaderOption(options, &numOptions, optionID, &format, sizeof(format)); - uint8_t option1[] = {0}; - optionID = 2053; - optionDataSize = sizeof(option1); - OCSetHeaderOption(options, &numOptions, optionID, option1, optionDataSize); + uint16_t version = 2048; + optionID = CA_OPTION_ACCEPT_VERSION; + numOptions = 1; + OCSetHeaderOption(options, &numOptions, optionID, &version, sizeof(version)); ret = OCDoRequest(NULL, OC_REST_DISCOVER, szQueryUri, NULL, 0, CT_DEFAULT, (qos == OC_HIGH_QOS) ? OC_HIGH_QOS : OC_LOW_QOS, @@ -1107,7 +1107,7 @@ int main(int argc, char* argv[]) } else { - InitDiscovery(OC_LOW_QOS, 0); + InitDiscovery(OC_LOW_QOS, 1); } // Break from loop with Ctrl+C diff --git a/resource/csdk/stack/src/ocserverrequest.c b/resource/csdk/stack/src/ocserverrequest.c index b4c3014..fddd9c1 100644 --- a/resource/csdk/stack/src/ocserverrequest.c +++ b/resource/csdk/stack/src/ocserverrequest.c @@ -666,11 +666,16 @@ OCStackResult HandleSingleResponse(OCEntityHandlerResponse * ehResponse) { responseInfo.info.payloadFormat = CA_FORMAT_APPLICATION_CBOR; } - if (!serverRequest->acceptVersion) + if ((OC_FORMAT_VND_OCF_CBOR == serverRequest->acceptFormat)) { - serverRequest->acceptVersion = DEFAULT_VERSION_VALUE; + // Add versioning information for this format + responseInfo.info.payloadVersion = serverRequest->acceptVersion; + if (!responseInfo.info.payloadVersion) + { + responseInfo.info.payloadVersion = DEFAULT_VERSION_VALUE; + } + } - responseInfo.info.payloadVersion = serverRequest->acceptVersion; } break; default: diff --git a/resource/csdk/stack/src/ocstack.c b/resource/csdk/stack/src/ocstack.c index eb5a077..2b4e55d 100755 --- a/resource/csdk/stack/src/ocstack.c +++ b/resource/csdk/stack/src/ocstack.c @@ -612,7 +612,7 @@ static OCStackResult OCSendRequest(const CAEndpoint_t *object, CARequestInfo_t * } #endif - uint16_t acceptVersion = OC_SPEC_VERSION_VALUE; + uint16_t acceptVersion = 0; CAPayloadFormat_t acceptFormat = CA_FORMAT_APPLICATION_CBOR; // Check settings of version option and content format. if (requestInfo->info.numOptions > 0 && requestInfo->info.options) @@ -644,11 +644,21 @@ static OCStackResult OCSendRequest(const CAEndpoint_t *object, CARequestInfo_t * } } - requestInfo->info.acceptVersion = acceptVersion; requestInfo->info.acceptFormat = acceptFormat; + if (CA_FORMAT_APPLICATION_VND_OCF_CBOR == acceptFormat) + { + if (!acceptVersion) + { + requestInfo->info.acceptVersion = OC_SPEC_VERSION_VALUE; + } + else + { + requestInfo->info.acceptVersion = acceptVersion; + } + } CAResult_t result = CASendRequest(object, requestInfo); - if(CA_STATUS_OK != result) + if (CA_STATUS_OK != result) { OIC_LOG_V(ERROR, TAG, "CASendRequest failed with CA error %u", result); OIC_TRACE_END(); @@ -2317,6 +2327,10 @@ void OCHandleRequests(const CAEndpoint_t* endPoint, const CARequestInfo_t* reque } serverRequest.acceptFormat = CAToOCPayloadFormat(requestInfo->info.acceptFormat); + if (OC_FORMAT_VND_OCF_CBOR == serverRequest.acceptFormat) + { + serverRequest.acceptVersion = requestInfo->info.acceptVersion; + } if (requestInfo->info.type == CA_MSG_CONFIRM) { serverRequest.qos = OC_HIGH_QOS; @@ -3242,9 +3256,9 @@ OCStackResult OCDoRequest(OCDoHandle *handle, if (payload) { - uint16_t payloadVersion = OC_SPEC_VERSION_VALUE; + uint16_t payloadVersion = 0; CAPayloadFormat_t payloadFormat = CA_FORMAT_APPLICATION_CBOR; - // From OCF onwards, check version option settings + // Check version option settings if (numOptions > 0 && options) { for (uint8_t i = 0; i < numOptions; i++) @@ -3272,12 +3286,21 @@ OCStackResult OCDoRequest(OCDoHandle *handle, } } - requestInfo.info.payloadVersion = payloadVersion; requestInfo.info.payloadFormat = payloadFormat; - - if((result = + if (CA_FORMAT_APPLICATION_VND_OCF_CBOR == payloadFormat) + { + if (!payloadVersion) + { + requestInfo.info.payloadVersion = OC_SPEC_VERSION_VALUE; + } + else + { + requestInfo.info.payloadVersion = payloadVersion; + } + } + if ((result = OCConvertPayload(payload, CAToOCPayloadFormat(requestInfo.info.payloadFormat), - &requestInfo.info.payload, &requestInfo.info.payloadSize)) + &requestInfo.info.payload, &requestInfo.info.payloadSize)) != OC_STACK_OK) { OIC_LOG(ERROR, TAG, "Failed to create CBOR Payload"); -- 2.7.4