Enabled CoAP over TCP in RI Layer.
authorhyuna0213.jo <hyuna0213.jo@samsung.com>
Tue, 8 Sep 2015 12:33:30 +0000 (21:33 +0900)
committerPatrick Lankswert <patrick.lankswert@intel.com>
Fri, 11 Sep 2015 18:23:18 +0000 (18:23 +0000)
- added new transport adapter in RI
- linux platform can be supported
- https://wiki.iotivity.org/proposal_for_cloud_interface_in_iotivity

Change-Id: Iaf245c3bbf30e76708545d136435a371b86fda7e
Signed-off-by: hyuna0213.jo <hyuna0213.jo@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/2405
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: jihwan seo <jihwan.seo@samsung.com>
Reviewed-by: Jaehong Jo <jaehong.jo@samsung.com>
Reviewed-by: Patrick Lankswert <patrick.lankswert@intel.com>
resource/csdk/stack/include/octypes.h
resource/csdk/stack/src/ocserverrequest.c
resource/csdk/stack/src/ocstack.c
resource/src/OCResource.cpp

index ea0df8d..4c702be 100644 (file)
@@ -296,6 +296,11 @@ typedef enum
    OC_ADAPTER_REMOTE_ACCESS = (1 << 3)
 #endif
 
+#ifdef TCP_ADAPTER
+    /** CoAP over TCP.*/
+   OC_ADAPTER_TCP           = (1 << 4)
+#endif
+
 } OCTransportAdapter;
 
 /**
@@ -415,6 +420,11 @@ typedef enum
     CT_ADAPTER_REMOTE_ACCESS = (1 << 19),
 #endif
 
+#ifdef TCP_ADAPTER
+    /** CoAP over TCP.*/
+    CT_ADAPTER_TCP          = (1 << 20),
+#endif
+
     /** Insecure transport is the default (subject to change).*/
 
     /** secure the transport path.*/
index 47a280a..9c45034 100644 (file)
@@ -553,6 +553,10 @@ OCStackResult HandleSingleResponse(OCEntityHandlerResponse * ehResponse)
 #ifdef RA_ADAPTER
                             , CA_ADAPTER_REMOTE_ACCESS
 #endif
+
+#ifdef TCP_ADAPTER
+                            , CA_ADAPTER_TCP
+#endif
                         };
 
     int size = sizeof(CAConnTypes)/ sizeof(CATransportAdapter_t);
@@ -573,6 +577,10 @@ OCStackResult HandleSingleResponse(OCEntityHandlerResponse * ehResponse)
 #ifdef RA_ADAP
                 | CA_ADAPTER_REMOTE_ACCESS
 #endif
+
+#ifdef TCP_ADAPTER
+                | CA_ADAPTER_TCP
+#endif
             );
     }
 
index 8ab815b..87acda6 100644 (file)
@@ -106,6 +106,10 @@ static bool gRASetInfo = false;
 OCDeviceEntityHandler defaultDeviceHandler;
 void* defaultDeviceHandlerCallbackParameter = NULL;
 
+#ifdef TCP_ADAPTER
+static const char COAP_TCP[] = "coap+tcp:";
+#endif
+
 //-----------------------------------------------------------------------------
 // Macros
 //-----------------------------------------------------------------------------
@@ -1612,6 +1616,17 @@ OCStackResult OCInit1(OCMode mode, OCTransportFlags serverFlags, OCTransportFlag
         caglobals.clientFlags = (CATransportFlags_t)(caglobals.clientFlags|CA_IPV4|CA_IPV6);
     }
 
+#ifdef TCP_ADAPTER
+    if (!(caglobals.serverFlags & CA_IPFAMILY_MASK))
+    {
+        caglobals.serverFlags = (CATransportFlags_t)(caglobals.serverFlags|CA_IPV4);
+    }
+    if (!(caglobals.clientFlags & CA_IPFAMILY_MASK))
+    {
+        caglobals.clientFlags = (CATransportFlags_t)(caglobals.clientFlags|CA_IPV4);
+    }
+#endif
+
     defaultDeviceHandler = NULL;
     defaultDeviceHandlerCallbackParameter = NULL;
     OCSeedRandom();
@@ -1760,7 +1775,9 @@ OCStackResult verifyUriQueryLength(const char *inputUri, uint16_t uriLen)
 /**
  *  A request uri consists of the following components in order:
  *                              example
- *  optional prefix             "coap://"
+ *  optionally one of
+ *      CoAP over UDP prefix    "coap://"
+ *      CoAP over TCP prefix    "coap+tcp://"
  *  optionally one of
  *      IPv6 address            "[1234::5678]"
  *      IPv4 address            "192.168.1.1"
@@ -1810,6 +1827,20 @@ static OCStackResult ParseRequestUri(const char *fullUri,
         return OC_STACK_INVALID_URI;
     }
 
+#ifdef TCP_ADAPTER
+    // process url scheme
+    size_t prefixLen = slash2 - fullUri;
+    bool istcp = false;
+    if (prefixLen)
+    {
+        if ((prefixLen == sizeof(COAP_TCP) - 1) && (!strncmp(fullUri, COAP_TCP, prefixLen)))
+        {
+            istcp = true;
+        }
+    }
+#endif
+
+    // TODO: this logic should come in with unit tests exercising the various strings
     // processs url prefix, if any
     size_t urlLen = slash - start;
     // port
@@ -1839,8 +1870,17 @@ static OCStackResult ParseRequestUri(const char *fullUri,
             {   // ipv4 address
                 colon = strchr(start, ':');
                 end = (colon && colon < slash) ? colon : slash;
-                adapter = (OCTransportAdapter)(adapter | OC_ADAPTER_IP);
-                flags = (OCTransportFlags)(flags | OC_IP_USE_V4);
+#ifdef TCP_ADAPTER
+                if (istcp)
+                {   // coap over tcp
+                    adapter = (OCTransportAdapter)(adapter | OC_ADAPTER_TCP);
+                }
+                else
+#endif
+                {
+                    adapter = (OCTransportAdapter)(adapter | OC_ADAPTER_IP);
+                    flags = (OCTransportFlags)(flags | OC_IP_USE_V4);
+                }
             }
             else
             {   // MAC address
index d9742fc..9e152d9 100644 (file)
@@ -28,6 +28,11 @@ namespace OC {
 
 static const char COAP[] = "coap://";
 static const char COAPS[] = "coaps://";
+
+#ifdef TCP_ADAPTER
+static const char COAP_TCP[] = "coap+tcp://";
+#endif
+
 using OC::nil_guard;
 using OC::result_guard;
 using OC::checked_guard;
@@ -122,13 +127,20 @@ void OCResource::setHost(const std::string& host)
         prefix_len = sizeof(COAPS) - 1;
         m_devAddr.flags = static_cast<OCTransportFlags>(m_devAddr.flags & OC_SECURE);
     }
+#ifdef TCP_ADAPTER
+    else if (host.compare(0, sizeof(COAP_TCP) - 1, COAP_TCP) == 0)
+    {
+        prefix_len = sizeof(COAP_TCP) - 1;
+        m_devAddr.adapter = static_cast<OCTransportAdapter>(m_devAddr.adapter & OC_ADAPTER_TCP);
+    }
+#endif
     else
     {
         throw ResourceInitException(m_uri.empty(), m_resourceTypes.empty(),
             m_interfaces.empty(), m_clientWrapper.expired(), false, false);
     }
 
-    // removed coap:// or coaps://
+    // removed coap:// or coaps:// or coap+tcp://
     std::string host_token = host.substr(prefix_len);
 
     if(host_token[0] == '[')
@@ -395,6 +407,12 @@ std::string OCResource::host() const
     {
         ss << COAPS;
     }
+#ifdef TCP_ADAPTER
+    else if (m_devAddr.adapter & OC_ADAPTER_TCP)
+    {
+        ss << COAP_TCP;
+    }
+#endif
     else
     {
         ss << COAP;