Imported Upstream version 1.0.1
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / adapter_util / cafragmentation.c
index eacbbec..6831046 100644 (file)
 #include "cafragmentation.h"
 
 /**
- * @var CA_FRAGMENTATION_TAG
- * @brief debugging tag for fragmentation module
+ * Debugging tag for fragmentation module.
  */
 #define CA_FRAGMENTATION_TAG "CA_FRAGMENTATION"
 
-CAResult_t CAGenerateHeader(char *header, uint32_t length)
+CAResult_t CAGenerateHeader(uint8_t *header,
+                            size_t headerLength,
+                            size_t dataLength)
 {
     OIC_LOG(DEBUG, CA_FRAGMENTATION_TAG, "IN");
 
     VERIFY_NON_NULL(header, CA_FRAGMENTATION_TAG, "header is NULL");
-    memset(header, 0x0, sizeof(char) * CA_HEADER_LENGTH);
 
-    if(length > MAX_DATA_LENGTH_SUPPORTED)
+    if (headerLength < CA_HEADER_LENGTH)
     {
-        OIC_LOG(DEBUG, CA_FRAGMENTATION_TAG,
-                "Given length is more than 4095.It will be truncated");
+        return CA_STATUS_FAILED;
     }
-    //if length is more than 4095 then it will be truncated.
-    header[1] = length & 0xFF;
-    length >>= 8;
-    header[0] = length & 0x0F;
-    header[0] = header[0] | 0x40; // Adding version 0100.(Not used. Future use)
+
+    if (dataLength > MAX_DATA_LENGTH_SUPPORTED)
+    {
+        OIC_LOG_V(WARNING,
+                  CA_FRAGMENTATION_TAG,
+                  "Given length is more than %d.  It will be truncated.",
+                  MAX_DATA_LENGTH_SUPPORTED);
+    }
+
+    // Only bother initializing the header section of the buffer.  It
+    // is up to the caller to handle the data section.
+    memset(header, 0, CA_HEADER_LENGTH);
+
+    // If length is more than 4095 then it will be truncated.
+    header[1] = dataLength & 0xFF;
+    dataLength >>= 8;
+    header[0] = dataLength & 0x0F;
+    header[0] = header[0] | 0x40; // Adding version 0100.
+                                  // (Not used. Future use)
 
     OIC_LOG(DEBUG, CA_FRAGMENTATION_TAG, "OUT");
 
     return CA_STATUS_OK;
 }
 
-uint32_t CAParseHeader(const char *header)
+uint32_t CAParseHeader(const uint8_t *header, size_t length)
 {
     OIC_LOG(DEBUG, CA_FRAGMENTATION_TAG, "IN");
 
     VERIFY_NON_NULL_RET(header, CA_FRAGMENTATION_TAG, "header is NULL", 0);
 
-    uint32_t dataLen = ((header[0] & 0x0F) << 8) | (header[1] & 0xFF);
+    uint32_t dataLen = 0;
+
+    if (length >= CA_HEADER_LENGTH)
+    {
+        dataLen = ((header[0] & 0x0F) << 8) | (header[1] & 0xFF);
+    }
 
     OIC_LOG(DEBUG, CA_FRAGMENTATION_TAG, "OUT");
+
     return dataLen;
 }
-