Correct address in the baseURI field for resource directory.
This patch fixes issues where host() in OCResource.cpp returned
a wrong IP address. It uses baseURI field in the /oic/res to send
publishing device address.
JIRA ISSUE:855
Signed-off-by: Habib Virji <habib.virji@samsung.com>
Change-Id: Idf86fe801e25e32c84268f421feff479270faa1b
Reviewed-on: https://gerrit.iotivity.org/gerrit/4337
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Madan Lanka <lanka.madan@samsung.com>
Reviewed-by: Uze Choi <uzchoi@samsung.com>
if (resourcePtr->tags && !resourcePtr->tags->baseURI)
{
resourcePtr->tags->baseURI = OICStrdup(devAddr->addr);
+ if (resourcePtr->tags->port == 0 && devAddr->port != 0)
+ {
+ resourcePtr->tags->port = devAddr->port;
+ }
}
OCDiscoveryCollectionPayloadAddResource(payload, resourcePtr->tags, resourcePtr->setLinks);
return OC_STACK_OK;
#ifdef WITH_RD
static OCStackResult checkResourceExistsAtRD(const char *interfaceType, const char *resourceType,
- OCResourceCollectionPayload **repPayload)
+ OCResourceCollectionPayload **repPayload, OCDevAddr *devAddr)
{
- if (OCRDCheckPublishedResource(interfaceType, resourceType, repPayload) == OC_STACK_OK)
+ if (OCRDCheckPublishedResource(interfaceType, resourceType, repPayload, devAddr) == OC_STACK_OK)
{
return OC_STACK_OK;
}
if (strcmp(resource->uri, OC_RSRVD_RD_URI) == 0)
{
OCResourceCollectionPayload *repPayload;
- discoveryResult = checkResourceExistsAtRD(filterOne, filterTwo, &repPayload);
+ OCDevAddr devAddr;
+ discoveryResult = checkResourceExistsAtRD(filterOne, filterTwo, &repPayload, &devAddr);
if (discoveryResult != OC_STACK_OK)
{
break;
}
discoveryResult = BuildVirtualCollectionResourceResponse(repPayload,
(OCDiscoveryPayload*)payload,
- &request->devAddr);
+ &devAddr);
foundResourceAtRD = true;
}
#endif
#include <StringConstants.h>
#include "ocpayload.h"
#include "ocrandom.h"
+#include "oic_string.h"
namespace OC
{
{
while(colRes)
{
+ OCDevAddr colAddr;
+ OICStrcpy(colAddr.addr, sizeof(colAddr.addr), colRes->tags->baseURI);
if (colRes->tags->bitmap & OC_SECURE)
{
- m_devAddr.flags =
- (OCTransportFlags)(OC_FLAG_SECURE | m_devAddr.flags);
+ colAddr.flags =
+ (OCTransportFlags)(OC_FLAG_SECURE | colRes->tags->bitmap);
+ if (colRes->tags->port != 0)
+ {
+ colAddr.port = colRes->tags->port;
+ }
}
-
- if (colRes->tags->port != 0)
+ else
{
- m_devAddr.port = colRes->tags->port;
+ colAddr.port = colRes->tags->port;
}
m_resources.push_back(std::shared_ptr<OC::OCResource>(
- new OC::OCResource(m_clientWrapper, m_devAddr,
+ new OC::OCResource(m_clientWrapper, colAddr,
std::string(colRes->setLinks->href),
std::string((char*)colRes->tags->di.id),
(colRes->tags->bitmap & OC_OBSERVABLE) == OC_OBSERVABLE,
*
* @param interfaceType a interface type that is being queried.
* @param resourceType a resource type that is being queried.
- * @param payload A payload of the maching resource type or interface type or NULL.
+ * @param payload A payload of the maching resource type or interface type or NULL.
+ * @param addr A device address.
*
* @return ::OC_STACK_OK upon success, ::OC_STACK_ERROR is returned except
* the case that OC_STACK_SUCCESS is returned.
*/
OCStackResult OCRDCheckPublishedResource(const char *interfaceType, const char *resourceType,
- OCResourceCollectionPayload **payload);
+ OCResourceCollectionPayload **payload, OCDevAddr *addr);
#ifdef __cplusplus
}
#include "payload_logging.h"
#include "oic_malloc.h"
+#include "octypes.h"
#include "rdpayload.h"
}
}
-OCStackResult OCRDStorePublishedResources(const OCResourceCollectionPayload *payload)
+OCStackResult OCRDStorePublishedResources(const OCResourceCollectionPayload *payload, const OCDevAddr *address)
{
OCResourceCollectionPayload *storeResource = (OCResourceCollectionPayload *)OICCalloc(1, sizeof(OCResourceCollectionPayload));
if (!storeResource)
return OC_STACK_NO_MEMORY;
}
- OC_LOG(DEBUG, TAG, "Storing Resources ... ");
+ OC_LOG_V(DEBUG, TAG, "Storing Resources for %s:%u", address->addr, address->port);
OCTagsPayload *tags = payload->tags;
storeResource->tags = OCCopyTagsResources(tags->n.deviceName, tags->di.id, tags->baseURI,
- tags->bitmap, tags->port, tags->ins, tags->rts, tags->drel, tags->ttl);
+ tags->bitmap, address->port, tags->ins, tags->rts, tags->drel, tags->ttl);
if (!storeResource->tags)
{
OC_LOG(ERROR, TAG, "Failed allocating memory for tags.");
return OC_STACK_NO_MEMORY;
}
resources->publishedResource = storeResource;
+ resources->devAddr = *address;
pthread_mutex_lock(&storageMutex);
if (g_rdStorage)
}
OCStackResult OCRDCheckPublishedResource(const char *interfaceType, const char *resourceType,
- OCResourceCollectionPayload **payload)
+ OCResourceCollectionPayload **payload, OCDevAddr *devAddr)
{
// ResourceType and InterfaceType if both are NULL it will return. If either is
// not null it will continue execution.
OCFreeLinksResource(links);
return OC_STACK_NO_MEMORY;
}
+ memcpy(devAddr, &pResource->devAddr, sizeof(*devAddr));
return OC_STACK_OK;
}
temp = temp->next;
OCFreeLinksResource(links);
return OC_STACK_NO_MEMORY;
}
+ devAddr = &pResource->devAddr;
return OC_STACK_OK;
}
temp = temp->next;
/** Stucture holding Published Resources on the Resource Directory. */
typedef struct OCRDStorePublishResources
{
+ OCDevAddr devAddr;
/** Publish resource. */
OCResourceCollectionPayload *publishedResource;
/** Linked list pointing to next published resource. */
* Stores the publish resources.
*
* @param payload RDPublish payload sent from the remote device.
+ * @param address The address of the device publishing resources.
*
* @return ::OC_STACK_OK upon success, ::OC_STACK_ERROR in case of error.
*/
-OCStackResult OCRDStorePublishedResources(const OCResourceCollectionPayload *payload);
+OCStackResult OCRDStorePublishedResources(const OCResourceCollectionPayload *payload, const OCDevAddr *address);
#ifdef __cplusplus
}
goto no_memory;
}
+ OCTagsLog(DEBUG, rdPayload->rdPublish->tags);
+ OCLinksLog(DEBUG, rdPayload->rdPublish->setLinks);
+
OCDevAddr rdAddr = { 0 };
OICStrcpy(rdAddr.addr, MAX_ADDR_STR_SIZE, addr);
rdAddr.port = port;
OCRDPayload *payload = (OCRDPayload *)ehRequest->payload;
if (payload && payload->rdPublish)
{
- OCRDStorePublishedResources(payload->rdPublish);
+ OCRDStorePublishedResources(payload->rdPublish, &ehRequest->devAddr);
}
OCRDPayload *rdPayload = OCRDPayloadCreate();