From: Ziran Sun Date: Wed, 15 Feb 2017 15:21:08 +0000 (+0000) Subject: Make format and versioing number independent from each other. X-Git-Tag: 1.3.0~437 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a572a09f975782d0032e26e96fbbad9971282e07;p=platform%2Fupstream%2Fiotivity.git Make format and versioing number independent from each other. Change-Id: I68138694d59a00aedf0eef36fc135e57ebc6c661 Signed-off-by: Ziran Sun Reviewed-on: https://gerrit.iotivity.org/gerrit/17301 Tested-by: jenkins-iotivity Reviewed-by: Dan Mihai --- diff --git a/resource/csdk/connectivity/api/cacommon.h b/resource/csdk/connectivity/api/cacommon.h index 1999d1b..d037dec 100644 --- a/resource/csdk/connectivity/api/cacommon.h +++ b/resource/csdk/connectivity/api/cacommon.h @@ -139,8 +139,8 @@ extern "C" #define CA_OPTION_ACCEPT_VERSION 2049 #define CA_OPTION_CONTENT_VERSION 2053 -#define DEFAULT_ACCEPT_VERSION_VALUE 2048 // OCF version 1.0.0 -#define DEFAULT_CONTENT_VERSION_VALUE 2048 // OCF version 1.0.0 +// The Accept Version and Content-Format Version for OCF 1.0.0 (0b0000 1000 0000 0000). +#define DEFAULT_VERSION_VALUE 2048 /** * Payload information from resource model. diff --git a/resource/csdk/connectivity/inc/caprotocolmessage.h b/resource/csdk/connectivity/inc/caprotocolmessage.h index e24a204..0620a34 100644 --- a/resource/csdk/connectivity/inc/caprotocolmessage.h +++ b/resource/csdk/connectivity/inc/caprotocolmessage.h @@ -139,15 +139,15 @@ CAResult_t CAParseHeadOption(uint32_t code, const CAInfo_t *info, coap_list_t ** * Helper to parse content format and accept format header options * and populate the supplied options list. * - * @param[in] format content or accept format. * @param[in] formatOption CoAP format header option. + * @param[in] format content or accept format. * @param[in] versionOption CoAP version header option. * @param[in] version value of version. * @param[out] optlist options information. * @return CA_STATUS_OK or ERROR CODES (CAResult_t error codes in cacommon.h). */ -CAResult_t CAParsePayloadFormatHeadOption(CAPayloadFormat_t format, uint16_t formatOption, +CAResult_t CAParsePayloadFormatHeadOption(uint16_t formatOption, CAPayloadFormat_t format, uint16_t versionOption, uint16_t version, coap_list_t **optlist); /** diff --git a/resource/csdk/connectivity/src/caprotocolmessage.c b/resource/csdk/connectivity/src/caprotocolmessage.c index cdadc6f..585dcc0 100644 --- a/resource/csdk/connectivity/src/caprotocolmessage.c +++ b/resource/csdk/connectivity/src/caprotocolmessage.c @@ -540,39 +540,47 @@ CAResult_t CAParseHeadOption(uint32_t code, const CAInfo_t *info, coap_list_t ** } uint32_t id = (info->options + i)->optionID; - if (COAP_OPTION_URI_PATH == id || COAP_OPTION_URI_QUERY == id) + switch (id) { - OIC_LOG_V(DEBUG, TAG, "not Header Opt: %d", id); - } - else - { - OIC_LOG_V(DEBUG, TAG, "Head opt ID[%d], length[%d]", id, (info->options + i)->optionLength); - int ret = coap_insert(optlist, - CACreateNewOptionNode(id, (info->options + i)->optionLength, - (info->options + i)->optionData), - CAOrderOpts); - if (ret <= 0) - { - return CA_STATUS_INVALID_PARAM; - } + case COAP_OPTION_URI_PATH: + case COAP_OPTION_URI_QUERY: + OIC_LOG_V(DEBUG, TAG, "not Header Opt: %d", id); + break; + case COAP_OPTION_ACCEPT: + case COAP_OPTION_ACCEPT_VERSION: + case COAP_OPTION_CONTENT_FORMAT: + case COAP_OPTION_CONTENT_VERSION: + // this is handled below via CAParsePayloadFormatHeadOption + break; + default: + OIC_LOG_V(DEBUG, TAG, "Head opt ID[%d], length[%d]", id, + (info->options + i)->optionLength); + int ret = coap_insert(optlist, + CACreateNewOptionNode(id, (info->options + i)->optionLength, + (info->options + i)->optionData), + CAOrderOpts); + if (ret <= 0) + { + return CA_STATUS_INVALID_PARAM; + } } } // insert one extra header with the payload format if applicable. if (CA_FORMAT_UNDEFINED != info->payloadFormat) { - CAParsePayloadFormatHeadOption(info->payloadFormat, COAP_OPTION_CONTENT_FORMAT, COAP_OPTION_CONTENT_VERSION, info->payloadVersion, optlist); + CAParsePayloadFormatHeadOption(COAP_OPTION_CONTENT_FORMAT, info->payloadFormat, COAP_OPTION_CONTENT_VERSION, info->payloadVersion, optlist); } if (CA_FORMAT_UNDEFINED != info->acceptFormat) { - CAParsePayloadFormatHeadOption(info->acceptFormat, COAP_OPTION_ACCEPT, info->acceptVersion, COAP_OPTION_ACCEPT_VERSION, optlist); + CAParsePayloadFormatHeadOption(COAP_OPTION_ACCEPT, info->acceptFormat, COAP_OPTION_ACCEPT_VERSION, info->acceptVersion, optlist); } return CA_STATUS_OK; } -CAResult_t CAParsePayloadFormatHeadOption(CAPayloadFormat_t format, uint16_t formatOption, +CAResult_t CAParsePayloadFormatHeadOption(uint16_t formatOption, CAPayloadFormat_t format, uint16_t versionOption, uint16_t version, coap_list_t **optlist) { coap_list_t* encodeNode = NULL; @@ -592,9 +600,6 @@ CAResult_t CAParsePayloadFormatHeadOption(CAPayloadFormat_t format, uint16_t for coap_encode_var_bytes(encodeBuf, (unsigned short) COAP_MEDIATYPE_APPLICATION_VND_OCF_CBOR), (char *) encodeBuf); - // Include payload version information for this format. - versionNode = CACreateNewOptionNode(versionOption, - coap_encode_var_bytes(versionBuf, version), (char *) versionBuf); break; default: OIC_LOG_V(ERROR, TAG, "Format option:[%d] not supported", format); @@ -604,36 +609,39 @@ CAResult_t CAParsePayloadFormatHeadOption(CAPayloadFormat_t format, uint16_t for OIC_LOG(ERROR, TAG, "Format option not created"); return CA_STATUS_INVALID_PARAM; } - int ret = coap_insert(optlist, encodeNode, CAOrderOpts); - if (0 >= ret) + else { - coap_delete(encodeNode); - OIC_LOG(ERROR, TAG, "Format option not inserted in header"); - if (CA_FORMAT_APPLICATION_VND_OCF_CBOR == format && versionNode) + int ret = coap_insert(optlist, encodeNode, CAOrderOpts); + if (0 >= ret) { - coap_delete(versionNode); + coap_delete(encodeNode); + OIC_LOG(ERROR, TAG, "Format option not inserted in header"); + return CA_STATUS_INVALID_PARAM; } - return CA_STATUS_INVALID_PARAM; } - if (CA_FORMAT_APPLICATION_VND_OCF_CBOR == format) + if (COAP_OPTION_ACCEPT_VERSION == versionOption || + COAP_OPTION_CONTENT_VERSION == versionOption) { + versionNode = CACreateNewOptionNode(versionOption, + coap_encode_var_bytes(versionBuf, version), (char *) versionBuf); + if (!versionNode) { OIC_LOG(ERROR, TAG, "Version option not created"); coap_delete(encodeNode); return CA_STATUS_INVALID_PARAM; } - else + } + if (versionNode) + { + int ret = coap_insert(optlist, versionNode, CAOrderOpts); + if (0 >= ret) { - ret = coap_insert(optlist, versionNode, CAOrderOpts); - if (0 >= ret) - { - coap_delete(versionNode); - coap_delete(encodeNode); - OIC_LOG(ERROR, TAG, "Content version option not inserted in header"); - return CA_STATUS_INVALID_PARAM; - } + coap_delete(versionNode); + coap_delete(encodeNode); + OIC_LOG(ERROR, TAG, "Content version option not inserted in header"); + return CA_STATUS_INVALID_PARAM; } } return CA_STATUS_OK; @@ -918,7 +926,7 @@ CAResult_t CAGetInfoFromPDU(const coap_pdu_t *pdu, const CAEndpoint_t *endpoint, else { OIC_LOG(DEBUG, TAG, "unsupported content version"); - outInfo->payloadVersion = DEFAULT_CONTENT_VERSION_VALUE; + outInfo->payloadVersion = DEFAULT_VERSION_VALUE; } } @@ -931,7 +939,7 @@ CAResult_t CAGetInfoFromPDU(const coap_pdu_t *pdu, const CAEndpoint_t *endpoint, else { OIC_LOG(DEBUG, TAG, "unsupported accept version"); - outInfo->acceptVersion = DEFAULT_ACCEPT_VERSION_VALUE; + outInfo->acceptVersion = DEFAULT_VERSION_VALUE; } } else if (COAP_OPTION_ACCEPT == opt_iter.type) diff --git a/resource/csdk/include/octypes.h b/resource/csdk/include/octypes.h index 57a4c5a..95bb8ea 100644 --- a/resource/csdk/include/octypes.h +++ b/resource/csdk/include/octypes.h @@ -326,8 +326,8 @@ extern "C" { /** Device specification version.*/ #define OC_SPEC_VERSION "ocf.1.1.0" -/** Integer value of spec version.*/ -#define OC_SPEC_VERSION_VALUE 0 +/** Integer value of spec version (OCF1.0 0b0000:1000:0000:0000).*/ +#define OC_SPEC_VERSION_VALUE 2048 /** Device Data Model version.*/ #define OC_DATA_MODEL_VERSION "ocf.res.1.1.0,ocf.sh.1.1.0" diff --git a/resource/csdk/stack/include/internal/ocstackinternal.h b/resource/csdk/stack/include/internal/ocstackinternal.h index 3c46946..1e256e2 100644 --- a/resource/csdk/stack/include/internal/ocstackinternal.h +++ b/resource/csdk/stack/include/internal/ocstackinternal.h @@ -83,7 +83,7 @@ typedef struct /** the requested payload format. */ OCPayloadFormat acceptFormat; - /** the requested payload format. */ + /** the requested payload version. */ uint16_t acceptVersion; /** resourceUrl will be filled in occoap using the path options in received request PDU.*/ diff --git a/resource/csdk/stack/src/ocserverrequest.c b/resource/csdk/stack/src/ocserverrequest.c index bbe4ddb..f824454 100644 --- a/resource/csdk/stack/src/ocserverrequest.c +++ b/resource/csdk/stack/src/ocserverrequest.c @@ -167,6 +167,20 @@ static OCStackResult OCSendResponse(const CAEndpoint_t *object, CAResponseInfo_t return OC_STACK_OK; } +static CAPayloadFormat_t OCToCAPayloadFormat(OCPayloadFormat ocFormat) +{ + switch (ocFormat) + { + case OC_FORMAT_UNDEFINED: + return CA_FORMAT_UNDEFINED; + case OC_FORMAT_CBOR: + return CA_FORMAT_APPLICATION_CBOR; + case OC_FORMAT_VND_OCF_CBOR: + return CA_FORMAT_APPLICATION_VND_OCF_CBOR; + default: + return CA_FORMAT_UNSUPPORTED; + } +} //------------------------------------------------------------------------------------------------- // Internal APIs //------------------------------------------------------------------------------------------------- @@ -644,20 +658,17 @@ OCStackResult HandleSingleResponse(OCEntityHandlerResponse * ehResponse) // Add CONTENT_FORMAT OPT if payload exist if (responseInfo.info.payloadSize > 0) { - if (OC_FORMAT_VND_OCF_CBOR == serverRequest->acceptFormat) + responseInfo.info.payloadFormat = OCToCAPayloadFormat( + serverRequest->acceptFormat); + if (CA_FORMAT_UNDEFINED == responseInfo.info.payloadFormat) { - responseInfo.info.payloadFormat = CA_FORMAT_APPLICATION_VND_OCF_CBOR; - if (!serverRequest->acceptVersion) - { - serverRequest->acceptVersion = DEFAULT_ACCEPT_VERSION_VALUE; - } - // Add CONTENT_VERSION OPT for this format. - responseInfo.info.payloadVersion = serverRequest->acceptVersion; + responseInfo.info.payloadFormat = CA_FORMAT_APPLICATION_CBOR; } - else + if (!serverRequest->acceptVersion) { - responseInfo.info.payloadFormat = CA_FORMAT_APPLICATION_CBOR; + serverRequest->acceptVersion = 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 0b52070..eec1d28 100755 --- a/resource/csdk/stack/src/ocstack.c +++ b/resource/csdk/stack/src/ocstack.c @@ -65,6 +65,7 @@ #include "ocpayloadcbor.h" #include "cautilinterface.h" #include "cainterface.h" +#include "caprotocolmessage.h" #include "oicgroup.h" #include "ocendpoint.h" #include "ocatomic.h" @@ -469,6 +470,21 @@ static OCStackResult OCDeInitializeInternal(); //----------------------------------------------------------------------------- // Internal functions //----------------------------------------------------------------------------- +static OCPayloadFormat CAToOCPayloadFormat(CAPayloadFormat_t caFormat) +{ + switch (caFormat) + { + case CA_FORMAT_UNDEFINED: + return OC_FORMAT_UNDEFINED; + case CA_FORMAT_APPLICATION_CBOR: + return OC_FORMAT_CBOR; + case CA_FORMAT_APPLICATION_VND_OCF_CBOR: + return OC_FORMAT_VND_OCF_CBOR; + default: + return OC_FORMAT_UNSUPPORTED; + } +} + static void OCEnterInitializer() { for (;;) @@ -596,36 +612,39 @@ static OCStackResult OCSendRequest(const CAEndpoint_t *object, CARequestInfo_t * #endif uint16_t acceptVersion = OC_SPEC_VERSION_VALUE; - // From OCF onwards, check settings of version option. - if (DEFAULT_ACCEPT_VERSION_VALUE <= acceptVersion) + CAPayloadFormat_t acceptFormat = CA_FORMAT_APPLICATION_CBOR; + // Check settings of version option and content format. + if (requestInfo->info.numOptions > 0 && requestInfo->info.options) { - if (requestInfo->info.numOptions > 0 && requestInfo->info.options) + for (uint8_t i = 0; i < requestInfo->info.numOptions; i++) { - for (uint8_t i = 0; i < requestInfo->info.numOptions; i++) + if (COAP_OPTION_ACCEPT_VERSION == requestInfo->info.options[i].optionID) + { + acceptVersion = *(uint16_t*) requestInfo->info.options[i].optionData; + } + else if (COAP_OPTION_ACCEPT == requestInfo->info.options[i].optionID) { - if (COAP_OPTION_ACCEPT_VERSION == requestInfo->info.options[i].protocolID) + if (1 == requestInfo->info.options[i].optionLength) + { + acceptFormat = CAConvertFormat( + *(uint8_t*) requestInfo->info.options[i].optionData); + } + else if (2 == requestInfo->info.options[i].optionLength) { - acceptVersion = requestInfo->info.options[i].optionData[0]; - break; + acceptFormat = CAConvertFormat( + *(uint16_t*) requestInfo->info.options[i].optionData); } - else if (COAP_OPTION_CONTENT_VERSION == requestInfo->info.options[i].protocolID) + else { - acceptVersion = requestInfo->info.options[i].optionData[0]; - break; + acceptFormat = CA_FORMAT_UNSUPPORTED; + OIC_LOG_V(DEBUG, TAG, "option has an unsupported format"); } } } } - if (DEFAULT_CONTENT_VERSION_VALUE <= acceptVersion) - { - requestInfo->info.acceptFormat = CA_FORMAT_APPLICATION_VND_OCF_CBOR; - requestInfo->info.acceptVersion = acceptVersion; - } - else - { - requestInfo->info.acceptFormat = CA_FORMAT_APPLICATION_CBOR; - } + requestInfo->info.acceptVersion = acceptVersion; + requestInfo->info.acceptFormat = acceptFormat; CAResult_t result = CASendRequest(object, requestInfo); if(CA_STATUS_OK != result) @@ -2287,21 +2306,7 @@ void OCHandleRequests(const CAEndpoint_t* endPoint, const CARequestInfo_t* reque memcpy(serverRequest.requestToken, requestInfo->info.token, requestInfo->info.tokenLength); } - switch (requestInfo->info.acceptFormat) - { - case CA_FORMAT_APPLICATION_CBOR: - serverRequest.acceptFormat = OC_FORMAT_CBOR; - break; - case CA_FORMAT_APPLICATION_VND_OCF_CBOR: - serverRequest.acceptFormat = OC_FORMAT_VND_OCF_CBOR; - break; - case CA_FORMAT_UNDEFINED: - serverRequest.acceptFormat = OC_FORMAT_UNDEFINED; - break; - default: - serverRequest.acceptFormat = OC_FORMAT_UNSUPPORTED; - } - + serverRequest.acceptFormat = CAToOCPayloadFormat(requestInfo->info.acceptFormat); if (requestInfo->info.type == CA_MSG_CONFIRM) { serverRequest.qos = OC_HIGH_QOS; @@ -3236,36 +3241,37 @@ OCStackResult OCDoRequest(OCDoHandle *handle, } uint16_t payloadVersion = OC_SPEC_VERSION_VALUE; + CAPayloadFormat_t payloadFormat = CA_FORMAT_APPLICATION_CBOR; // From OCF onwards, check version option settings - if (DEFAULT_CONTENT_VERSION_VALUE <= payloadVersion) + if (numOptions > 0 && options) { - if (numOptions > 0 && options) + for (uint8_t i = 0; i < numOptions; i++) { - for (uint8_t i = 0; i < numOptions; i++) + if (COAP_OPTION_CONTENT_VERSION == options[i].optionID) + { + payloadVersion = *(uint16_t*) options[i].optionData; + } + else if (COAP_OPTION_CONTENT_FORMAT == options[i].optionID) { - if (COAP_OPTION_CONTENT_VERSION == options[i].optionID) + if (1 == options[i].optionLength) { - payloadVersion = options[i].optionData[0]; - break; + payloadFormat = CAConvertFormat(*(uint8_t*) options[i].optionData); } - else if (COAP_OPTION_ACCEPT_VERSION == options[i].optionID) + else if (2 == options[i].optionLength) { - payloadVersion = options[i].optionData[0]; - break; + payloadFormat = CAConvertFormat(*(uint16_t*) options[i].optionData); + } + else + { + payloadFormat = CA_FORMAT_UNSUPPORTED; + OIC_LOG_V(DEBUG, TAG, "option has an unsupported format"); } } } } - if (DEFAULT_CONTENT_VERSION_VALUE <= payloadVersion) - { - requestInfo.info.payloadFormat = CA_FORMAT_APPLICATION_VND_OCF_CBOR; - requestInfo.info.payloadVersion = payloadVersion; - } - else - { - requestInfo.info.payloadFormat = CA_FORMAT_APPLICATION_CBOR; - } + requestInfo.info.payloadVersion = payloadVersion; + requestInfo.info.payloadFormat = payloadFormat; } else {