Make format and versioing number independent from each other.
authorZiran Sun <ziran.sun@samsung.com>
Wed, 15 Feb 2017 15:21:08 +0000 (15:21 +0000)
committerDan Mihai <Daniel.Mihai@microsoft.com>
Thu, 23 Mar 2017 16:03:20 +0000 (16:03 +0000)
Change-Id: I68138694d59a00aedf0eef36fc135e57ebc6c661
Signed-off-by: Ziran Sun <ziran.sun@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/17301
Tested-by: jenkins-iotivity <jenkins@iotivity.org>
Reviewed-by: Dan Mihai <Daniel.Mihai@microsoft.com>
resource/csdk/connectivity/api/cacommon.h
resource/csdk/connectivity/inc/caprotocolmessage.h
resource/csdk/connectivity/src/caprotocolmessage.c
resource/csdk/include/octypes.h
resource/csdk/stack/include/internal/ocstackinternal.h
resource/csdk/stack/src/ocserverrequest.c
resource/csdk/stack/src/ocstack.c

index 1999d1b..d037dec 100644 (file)
@@ -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.
index e24a204..0620a34 100644 (file)
@@ -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);
 
 /**
index cdadc6f..585dcc0 100644 (file)
@@ -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)
index 57a4c5a..95bb8ea 100644 (file)
@@ -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"
index 3c46946..1e256e2 100644 (file)
@@ -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.*/
index bbe4ddb..f824454 100644 (file)
@@ -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:
index 0b52070..eec1d28 100755 (executable)
@@ -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
     {