#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.
* 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);
/**
}
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;
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);
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;
else
{
OIC_LOG(DEBUG, TAG, "unsupported content version");
- outInfo->payloadVersion = DEFAULT_CONTENT_VERSION_VALUE;
+ outInfo->payloadVersion = DEFAULT_VERSION_VALUE;
}
}
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)
/** 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"
/** 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.*/
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
//-------------------------------------------------------------------------------------------------
// 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:
#include "ocpayloadcbor.h"
#include "cautilinterface.h"
#include "cainterface.h"
+#include "caprotocolmessage.h"
#include "oicgroup.h"
#include "ocendpoint.h"
#include "ocatomic.h"
//-----------------------------------------------------------------------------
// 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 (;;)
#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)
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;
}
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
{