Fixed broken presence after IPv6 plumbing merge to master.
authorErich Keane <erich.keane@verizon.net>
Sat, 11 Jul 2015 05:37:41 +0000 (22:37 -0700)
committerErich Keane <erich.keane@intel.com>
Sat, 11 Jul 2015 17:12:10 +0000 (17:12 +0000)
Presence wasn't working for multiple reasons. oc/presence was not moved
to oic/ad, probably lost in the merge to master.
resourceUri in CA data structures was moved form the endpoint to the
CAInfo struct. But wasn't included in a clone operation which resulted
in a race condition when the memory was free'd in the main thread before
being accessed by the thread in CA.
Other adapter/flag issues.
Unicast presence failed to work because host() from OCResource only
returned the IP without the port.

Change-Id: If2e46f4677ebe369cbaee9609de38c369bf4c524
Signed-off-by: Mandeep Shetty <mandeep.shetty@intel.com>
Signed-off-by: Erich Keane <erich.keane@verizon.net>
Reviewed-on: https://gerrit.iotivity.org/gerrit/1424
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Erich Keane <erich.keane@intel.com>
resource/csdk/connectivity/src/ip_adapter/caipserver.c
resource/csdk/stack/include/octypes.h
resource/csdk/stack/src/ocserverrequest.c
resource/csdk/stack/src/ocstack.c
resource/src/InProcClientWrapper.cpp

index 7c0f9aa..b6a3e50 100644 (file)
@@ -266,7 +266,7 @@ static void CAReceiveHandler(void *data)
                 CAEndpoint_t ep;
                 strncpy(ep.addr, srcIPAddress, MAX_ADDR_STR_SIZE_CA);
                 ep.port = srcPort;
-                ep.flags = CA_IPV4;
+                ep.flags = (CATransportFlags_t)CA_IPV4 | CA_IPV6;
                 ep.adapter = CA_ADAPTER_IP;
 
                 if (info->endpoint.flags & CA_SECURE)
index 42c16bc..1ee5146 100644 (file)
@@ -111,7 +111,7 @@ extern "C" {
 // These provide backward compatibility - their use is deprecated
 #ifndef GOING_AWAY
 #define OC_MULTICAST_PREFIX                  "224.0.1.187:5683"
-#define OC_MULTICAST_IP                      "224.0.1.187:5683"
+#define OC_MULTICAST_IP                      "224.0.1.187"
 #define OC_MULTICAST_PORT                    5683
 #endif // GOING_AWAY
 
index 98d6040..04797a6 100644 (file)
@@ -562,13 +562,19 @@ OCStackResult HandleSingleResponse(OCEntityHandlerResponse * ehResponse)
     #ifdef WITH_PRESENCE
     //TODO: Add other connectivity types to CAConnTypes[] when enabled
     CATransportAdapter_t CAConnTypes[] = {CA_ADAPTER_IP};
-    const char * connTypes[] = {"ip transport"};
+    const char * connTypes[] = {"IP"};
     int size = sizeof(CAConnTypes)/ sizeof(CATransportAdapter_t);
     CATransportAdapter_t adapter = responseEndpoint.adapter;
     CAResult_t caResult = CA_STATUS_FAILED;
     result = OC_STACK_OK;
 
-    //Sending response on all n/w interfaces
+    // Default adapter, try to send response out on all adapters.
+    if (adapter == CA_DEFAULT_ADAPTER)
+    {
+        adapter =
+            (CATransportAdapter_t)(CA_ADAPTER_IP | CA_ADAPTER_GATT_BTLE | CA_ADAPTER_RFCOMM_BTEDR);
+    }
+
     for(int i = 0; i < size; i++ )
     {
         responseEndpoint.adapter = (CATransportAdapter_t)(adapter & CAConnTypes[i]);
index 2650130..19bdc95 100644 (file)
@@ -642,7 +642,7 @@ CATransportFlags_t OCToCATransportFlags(OCTransportFlags ocFlags)
 {
     CATransportFlags_t caFlags = (CATransportFlags_t)ocFlags;
 
-    // supply default behavior
+    // supply default behavior.
     if ((caFlags & (CA_IPV6|CA_IPV4)) == 0)
     {
         caFlags = (CATransportFlags_t)(caFlags|CA_IPV6|CA_IPV4);
@@ -752,7 +752,7 @@ OCPresenceTrigger convertTriggerStringToEnum(const char * triggerStr)
  */
 static int FormCanonicalPresenceUri(const CAEndpoint_t *endpoint, char *resourceUri, char *presenceUri)
 {
-    VERIFY_NON_NULL(endpoint, FATAL, OC_STACK_INVALID_PARAM);
+    VERIFY_NON_NULL(endpoint   , FATAL, OC_STACK_INVALID_PARAM);
     VERIFY_NON_NULL(resourceUri, FATAL, OC_STACK_INVALID_PARAM);
     VERIFY_NON_NULL(presenceUri, FATAL, OC_STACK_INVALID_PARAM);
 
@@ -914,7 +914,8 @@ OCStackResult HandlePresenceResponse(const CAEndpoint_t *endpoint,
     }
     else
     {
-        strncpy(presenceUri, responseInfo->info.resourceUri, CA_MAX_URI_LENGTH);
+        snprintf (presenceUri, MAX_URI_LENGTH, "coap://[%s]:%u%s", OC_MULTICAST_IP,
+                    OC_MULTICAST_PORT, OC_PRESENCE_URI);
         cbNode = GetClientCB(NULL, 0, NULL, presenceUri);
         if (cbNode)
         {
@@ -2028,6 +2029,7 @@ OCStackResult OCDoResource(OCDoHandle *handle,
     flags = (OCTransportFlags)(connectivityType & CT_MASK_FLAGS);
 
     result = ParseRequestUri(requestUri, adapter, flags, &devAddr, &resourceUri, &resourceType);
+
     if (result != OC_STACK_OK)
     {
         OC_LOG_V(DEBUG, TAG, "Unable to parse uri: %s", requestUri);
@@ -2147,7 +2149,10 @@ OCStackResult OCDoResource(OCDoHandle *handle,
         {
             goto exit;
         }
-        OICFree(resourceUri);
+
+        // Assign full presence uri as coap://ip:port/oic/ad to add to callback list.
+        // Presence notification will form a canonical uri to
+        // look for callbacks into the application.
         resourceUri = presenceUri;
     }
     #endif
@@ -2413,6 +2418,7 @@ OCStackResult OCProcessPresence()
         requestData.type = CA_MSG_NONCONFIRM;
         requestData.token = cbNode->token;
         requestData.tokenLength = cbNode->tokenLength;
+        requestData.resourceUri = OC_PRESENCE_URI;
         requestInfo.method = CA_GET;
         requestInfo.info = requestData;
 
index 52ea2b7..4968d72 100644 (file)
@@ -816,7 +816,7 @@ namespace OC
         auto cLock = m_csdkLock.lock();
 
         std::ostringstream os;
-        os << host << "/oc/presence";
+        os << host << OC_PRESENCE_URI;;
 
         if(!resourceType.empty())
         {