Updated provisioning API to cater different connectivity type.
authorleechul <chuls.lee@samsung.com>
Thu, 27 Aug 2015 07:07:31 +0000 (16:07 +0900)
committerSachin Agrawal <sachin.agrawal@intel.com>
Mon, 31 Aug 2015 06:14:21 +0000 (06:14 +0000)
 - PMGenerateQuery() will make a proper query
   based on connectivity type of endpoint.

[Patch #1] Intial upload
[Patch #2] Update according to comments.
[Patch #3] Modify the buffer size which is request query is stored.
[Patch #4] Update according to comments.
[Patch #5] Update according to Jon's comment.

Fixed a buffer size for writing queries.

Change-Id: I996888faec20614736907dc7c17300eb8d1550cf
Signed-off-by: leechul <chuls.lee@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/2300
Reviewed-by: Jon A. Cruz <jonc@osg.samsung.com>
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Sachin Agrawal <sachin.agrawal@intel.com>
Tested-by: Sachin Agrawal <sachin.agrawal@intel.com>
resource/csdk/security/provisioning/include/pmtypes.h
resource/csdk/security/provisioning/include/pmutility.h
resource/csdk/security/provisioning/src/ownershiptransfermanager.c
resource/csdk/security/provisioning/src/pmutility.c
resource/csdk/security/provisioning/src/secureresourceprovider.c

index 377ce2b..08f21c3 100644 (file)
@@ -36,6 +36,7 @@ typedef struct OCProvisionDev
     OCDevAddr       endpoint;        /**< target address **/
     OicSecPstat_t   *pstat;          /**< Pointer to target's pstat resource. **/
     OicSecDoxm_t    *doxm;           /**< Pointer to target's doxm resource. **/
+    OCConnectivityType connType;     /**< Connectivity type of endpoint */
     uint16_t        securePort;      /**< secure port **/
     struct OCProvisionDev  *next;           /**< Next pointer. **/
 }OCProvisionDev_t;
index 79f98b5..ce2f69d 100644 (file)
@@ -55,6 +55,25 @@ OCStackResult PMDeviceDiscovery(unsigned short waittime, bool isOwned, OCProvisi
  */
 void DeleteDeviceList(OCProvisionDev_t **pList);
 
+
+/**
+ * Function to generate qurey for coap/coaps request.
+ *
+ * @param[in] isSeucre Choose whether to encrypt the payload.
+ * @param[in] address Network address of remote device
+ * @param[in] port Port number
+ * @param[in] connType Connectivity type of remote device
+ * @param[in,out] buffer A buffer to save the query.
+ * @param[in] bufferSize Size of buffer
+ * @param[in] uri The resource URI
+ *
+ * @return true on success
+ */
+bool PMGenerateQuery(bool isSecure,
+                     const char* address, uint16_t port,
+                     OCConnectivityType connType,
+                     char* buffer, size_t bufferSize, const char* uri);
+
 #ifdef __cplusplus
 }
 #endif
index e1f69f0..b80710c 100644 (file)
@@ -655,10 +655,17 @@ static OCStackResult PutOwnerTransferModeToResource(OTMContext_t* otmCtx)
 
     OCProvisionDev_t* deviceInfo = otmCtx->selectedDeviceInfo;
     OicSecOxm_t selectedOxm = deviceInfo->doxm->oxmSel;
-    char query[MAX_QUERY_LENGTH] = {};
-    sprintf(query, "%s%s:%d%s", COAP_PREFIX,
-                                deviceInfo->endpoint.addr, deviceInfo->endpoint.port,
-                                OIC_RSRC_DOXM_URI);
+    char query[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {0};
+
+    if(!PMGenerateQuery(false,
+                        deviceInfo->endpoint.addr, deviceInfo->endpoint.port,
+                        deviceInfo->connType,
+                        query, sizeof(query), OIC_RSRC_DOXM_URI))
+    {
+        OC_LOG(ERROR, TAG, "DeviceDiscoveryHandler : Failed to generate query");
+        return OC_STACK_ERROR;
+    }
+    OC_LOG_V(DEBUG, TAG, "Query=%s", query);
     OCSecurityPayload* secPayload = (OCSecurityPayload*)OICCalloc(1, sizeof(OCSecurityPayload));
     if(!secPayload)
     {
@@ -679,11 +686,9 @@ static OCStackResult PutOwnerTransferModeToResource(OTMContext_t* otmCtx)
     cbData.cb = &OwnerTransferModeHandler;
     cbData.context = (void *)otmCtx;
     cbData.cd = NULL;
-
-    // TODO: 6th argument need to be changed, if we have to use CT_FLAG_SECURE
     OCStackResult res = OCDoResource(NULL, OC_REST_PUT, query,
                                      &deviceInfo->endpoint, (OCPayload*)secPayload,
-                                     CT_ADAPTER_IP, OC_LOW_QOS, &cbData, NULL, 0);
+                                     deviceInfo->connType, OC_LOW_QOS, &cbData, NULL, 0);
     if (res != OC_STACK_OK)
     {
         OC_LOG(ERROR, TAG, "OCStack resource error");
@@ -705,18 +710,23 @@ static OCStackResult GetProvisioningStatusResource(OTMContext_t* otmCtx)
     }
 
     OCProvisionDev_t* deviceInfo = otmCtx->selectedDeviceInfo;
-    char query[MAX_QUERY_LENGTH] = {};
-    sprintf(query, "%s%s:%d%s", COAP_PREFIX,
-                                deviceInfo->endpoint.addr, deviceInfo->endpoint.port,
-                                OIC_RSRC_PSTAT_URI);
+    char query[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {0};
+    if(!PMGenerateQuery(false,
+                        deviceInfo->endpoint.addr, deviceInfo->endpoint.port,
+                        deviceInfo->connType,
+                        query, sizeof(query), OIC_RSRC_PSTAT_URI))
+    {
+        OC_LOG(ERROR, TAG, "DeviceDiscoveryHandler : Failed to generate query");
+        return OC_STACK_ERROR;
+    }
+    OC_LOG_V(DEBUG, TAG, "Query=%s", query);
+
     OCCallbackData cbData;
     cbData.cb = &ListMethodsHandler;
     cbData.context = (void *)otmCtx;
     cbData.cd = NULL;
-
-    // TODO: 6th argument need to be changed, if we have to use CT_FLAG_SECURE
     OCStackResult res = OCDoResource(NULL, OC_REST_GET, query, NULL, NULL,
-                                     CT_ADAPTER_IP, OC_LOW_QOS, &cbData, NULL, 0);
+                                     deviceInfo->connType, OC_LOW_QOS, &cbData, NULL, 0);
     if (res != OC_STACK_OK)
     {
         OC_LOG(ERROR, TAG, "OCStack resource error");
@@ -739,10 +749,17 @@ static OCStackResult PutOwnershipInformation(OTMContext_t* otmCtx)
     }
 
     OCProvisionDev_t* deviceInfo = otmCtx->selectedDeviceInfo;
-    char query[MAX_QUERY_LENGTH] = {};
-    sprintf(query, "%s%s:%d%s", COAPS_PREFIX,
-                                deviceInfo->endpoint.addr, deviceInfo->securePort,
-                                OIC_RSRC_DOXM_URI);
+    char query[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {0};
+    if(!PMGenerateQuery(true,
+                        deviceInfo->endpoint.addr, deviceInfo->securePort,
+                        deviceInfo->connType,
+                        query, sizeof(query), OIC_RSRC_DOXM_URI))
+    {
+        OC_LOG(ERROR, TAG, "DeviceDiscoveryHandler : Failed to generate query");
+        return OC_STACK_ERROR;
+    }
+    OC_LOG_V(DEBUG, TAG, "Query=%s", query);
+
     //OwnershipInformationHandler
     OicSecOxm_t selOxm = deviceInfo->doxm->oxmSel;
     OCSecurityPayload* secPayload = (OCSecurityPayload*)OICCalloc(1, sizeof(OCSecurityPayload));
@@ -764,9 +781,8 @@ static OCStackResult PutOwnershipInformation(OTMContext_t* otmCtx)
     cbData.cb = &OwnershipInformationHandler;
     cbData.context = (void *)otmCtx;
     cbData.cd = NULL;
-    // TODO: 6th argument need to be changed, if we have to use CT_FLAG_SECURE
     OCStackResult res = OCDoResource(NULL, OC_REST_PUT, query, 0, (OCPayload*)secPayload,
-                                     CT_ADAPTER_IP, OC_LOW_QOS, &cbData, NULL, 0);
+                                     deviceInfo->connType, OC_LOW_QOS, &cbData, NULL, 0);
     if (res != OC_STACK_OK)
     {
         OC_LOG(ERROR, TAG, "OCStack resource error");
@@ -788,10 +804,17 @@ static OCStackResult PutUpdateOperationMode(OTMContext_t* otmCtx,
     }
 
     OCProvisionDev_t* deviceInfo = otmCtx->selectedDeviceInfo;
-    char query[MAX_QUERY_LENGTH] = {};
-    sprintf(query, "%s%s:%d%s", COAP_PREFIX,
-                                deviceInfo->endpoint.addr, deviceInfo->endpoint.port,
-                                OIC_RSRC_PSTAT_URI);
+    char query[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {0};
+    if(!PMGenerateQuery(false,
+                        deviceInfo->endpoint.addr, deviceInfo->endpoint.port,
+                        deviceInfo->connType,
+                        query, sizeof(query), OIC_RSRC_PSTAT_URI))
+    {
+        OC_LOG(ERROR, TAG, "DeviceDiscoveryHandler : Failed to generate query");
+        return OC_STACK_ERROR;
+    }
+    OC_LOG_V(DEBUG, TAG, "Query=%s", query);
+
     deviceInfo->pstat->om = selectedOperationMode;
 
     OCSecurityPayload* secPayload = (OCSecurityPayload*)OICCalloc(1, sizeof(OCSecurityPayload));
@@ -813,9 +836,8 @@ static OCStackResult PutUpdateOperationMode(OTMContext_t* otmCtx,
     cbData.cb = &OperationModeUpdateHandler;
     cbData.context = (void *)otmCtx;
     cbData.cd = NULL;
-
     OCStackResult res = OCDoResource(NULL, OC_REST_PUT, query, 0, (OCPayload*)secPayload,
-                                     CT_ADAPTER_IP, OC_LOW_QOS, &cbData, NULL, 0);
+                                     deviceInfo->connType, OC_LOW_QOS, &cbData, NULL, 0);
     if (res != OC_STACK_OK)
     {
         OC_LOG(ERROR, TAG, "OCStack resource error");
@@ -1017,20 +1039,24 @@ static OCStackApplicationResult ProvisionDefaultACLCB(void *ctx, OCDoHandle UNUS
         }
         OC_LOG_V(INFO, TAG, "Created payload for commit hash: %s",secPayload->securityData);
 
-        char uri[MAX_QUERY_LENGTH] = { 0 };
-        size_t uriLen = sizeof(uri);
+        char query[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {0};
+        if(!PMGenerateQuery(true,
+                            otmCtx->selectedDeviceInfo->endpoint.addr,
+                            otmCtx->selectedDeviceInfo->securePort,
+                            otmCtx->selectedDeviceInfo->connType,
+                            query, sizeof(query), OIC_RSRC_PSTAT_URI))
+        {
+            OC_LOG(ERROR, TAG, "DeviceDiscoveryHandler : Failed to generate query");
+            return OC_STACK_ERROR;
+        }
+        OC_LOG_V(DEBUG, TAG, "Query=%s", query);
 
-        snprintf(uri, uriLen - 1, COAPS_QUERY, otmCtx->selectedDeviceInfo->endpoint.addr,
-                otmCtx->selectedDeviceInfo->securePort, OIC_RSRC_PSTAT_URI);
-        uri[uriLen - 1] = '\0';
         OCCallbackData cbData = {.context=NULL, .cb=NULL, .cd=NULL};
         cbData.cb = &FinalizeProvisioningCB;
-        cbData.context = (void*)otmCtx; // forward context to SRPFinalizeProvisioningCB
+        cbData.context = (void*)otmCtx;
         cbData.cd = NULL;
-
-        // TODO change value of CT_ADAPTER_IP with val from discovery
-        OCStackResult ret = OCDoResource(NULL, OC_REST_PUT, uri, 0, (OCPayload*)secPayload,
-                CT_ADAPTER_IP, OC_HIGH_QOS, &cbData, NULL, 0);
+        OCStackResult ret = OCDoResource(NULL, OC_REST_PUT, query, 0, (OCPayload*)secPayload,
+                otmCtx->selectedDeviceInfo->connType, OC_HIGH_QOS, &cbData, NULL, 0);
         OC_LOG_V(INFO, TAG, "OCDoResource returned: %d",ret);
         if (ret != OC_STACK_OK)
         {
@@ -1118,22 +1144,27 @@ OCStackResult FinalizeProvisioning(OTMContext_t* otmCtx)
     }
     OC_LOG_V(INFO, TAG, "Provisioning default ACL : %s",secPayload->securityData);
 
-    char uri[MAX_QUERY_LENGTH] = { 0 };
+    char query[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {0};
+    if(!PMGenerateQuery(true,
+                        otmCtx->selectedDeviceInfo->endpoint.addr,
+                        otmCtx->selectedDeviceInfo->securePort,
+                        otmCtx->selectedDeviceInfo->connType,
+                        query, sizeof(query), OIC_RSRC_ACL_URI))
+    {
+        OC_LOG(ERROR, TAG, "DeviceDiscoveryHandler : Failed to generate query");
+        return OC_STACK_ERROR;
+    }
+    OC_LOG_V(DEBUG, TAG, "Query=%s", query);
 
-    size_t uriLen = sizeof(uri);
-    snprintf(uri, uriLen - 1, COAPS_QUERY, otmCtx->selectedDeviceInfo->endpoint.addr,
-            otmCtx->selectedDeviceInfo->securePort, OIC_RSRC_ACL_URI);
-    uri[uriLen - 1] = '\0';
-    OC_LOG_V(INFO, TAG, "Request URI for Provisioning default ACL : %s",uri);
+    OC_LOG_V(INFO, TAG, "Request URI for Provisioning default ACL : %s", query);
 
     OCCallbackData cbData =  {.context=NULL, .cb=NULL, .cd=NULL};
     cbData.cb = &ProvisionDefaultACLCB;
     cbData.context = (void *)otmCtx;
     cbData.cd = NULL;
-
-    OCStackResult ret = OCDoResource(NULL, OC_REST_POST, uri,
+    OCStackResult ret = OCDoResource(NULL, OC_REST_POST, query,
             &otmCtx->selectedDeviceInfo->endpoint, (OCPayload*)secPayload,
-            CT_ADAPTER_IP, OC_HIGH_QOS, &cbData, NULL, 0);
+            otmCtx->selectedDeviceInfo->connType, OC_HIGH_QOS, &cbData, NULL, 0);
     if (OC_STACK_OK != ret)
     {
         SetResult(otmCtx, ret);
index 0f46c36..eac476a 100644 (file)
@@ -82,11 +82,12 @@ OCProvisionDev_t* GetDevice(OCProvisionDev_t **ppDevicesList, const char* addr,
  * @param[in] port          port of remote server.
  * @param[in] adapter       adapter type of endpoint.
  * @param[in] doxm          pointer to doxm instance.
+ * @param[in] connType  connectivity type of endpoint
  *
  * @return OC_STACK_OK for success and errorcode otherwise.
  */
 OCStackResult AddDevice(OCProvisionDev_t **ppDevicesList, const char* addr, const uint16_t port,
-                               OCTransportAdapter adapter, OicSecDoxm_t *doxm)
+                               OCTransportAdapter adapter, OCConnectivityType connType, OicSecDoxm_t *doxm)
 {
     if (NULL == addr)
     {
@@ -109,6 +110,7 @@ OCStackResult AddDevice(OCProvisionDev_t **ppDevicesList, const char* addr, cons
         ptr->securePort = DEFAULT_SECURE_PORT;
         ptr->endpoint.adapter = adapter;
         ptr->next = NULL;
+        ptr->connType = connType;
 
         LL_PREPEND(*ppDevicesList, ptr);
     }
@@ -256,6 +258,56 @@ uint16_t GetSecurePortFromJSON(char* jsonStr)
     return (uint16_t)jsonPort->valueint;
 }
 
+bool PMGenerateQuery(bool isSecure,
+                     const char* address, const uint16_t port,
+                     const OCConnectivityType connType,
+                     char* buffer, size_t bufferSize, const char* uri)
+{
+    if(!address || !buffer || !uri)
+    {
+        OC_LOG(ERROR, TAG, "PMGenerateQuery : Invalid parameters.");
+        return false;
+    }
+
+    int snRet = 0;
+    char* prefix = (isSecure == true) ? COAPS_PREFIX : COAP_PREFIX;
+
+    switch(connType & CT_MASK_ADAPTER)
+    {
+        case CT_ADAPTER_IP:
+            switch(connType & CT_MASK_FLAGS)
+            {
+                case CT_IP_USE_V4:
+                        snRet = snprintf(buffer, bufferSize, "%s%s:%d%s",
+                                         prefix, address, port, uri);
+                    break;
+                case CT_IP_USE_V6:
+                        snRet = snprintf(buffer, bufferSize, "%s[%s]:%d%s",
+                                         prefix, address, port, uri);
+                    break;
+                default:
+                    OC_LOG(ERROR, ERROR, "Unknown address format.");
+                    return false;
+            }
+            if(snRet >= bufferSize)
+            {
+                OC_LOG(ERROR, INFO, "PMGenerateQuery : URI is too long");
+                return false;
+            }
+            break;
+        // TODO: We need to verify tinyDTLS in below cases
+        case CT_ADAPTER_GATT_BTLE:
+        case CT_ADAPTER_RFCOMM_BTEDR:
+            OC_LOG(ERROR, ERROR, "Not supported connectivity adapter.");
+            return false;
+            break;
+        default:
+            OC_LOG(ERROR, ERROR, "Unknown connectivity adapter.");
+            return false;
+    }
+
+    return true;
+}
 
 /**
  * Callback handler for getting secure port information using /oic/res discovery.
@@ -290,16 +342,16 @@ static OCStackApplicationResult SecurePortDiscoveryHandler(void *ctx, OCDoHandle
                 return OC_STACK_KEEP_TRANSACTION;
             }
 
-            OCDiscoveryPayload* discover = (OCDiscoveryPayload*) clientResponse->payload;
             uint16_t securePort = 0;
+            OCResourcePayload* resPayload = ((OCDiscoveryPayload*)clientResponse->payload)->resources;
 
-            if (discover && discover->resources && discover->resources->secure)
+            if (resPayload && resPayload->secure)
             {
-                securePort = discover->resources->port;
+                securePort = resPayload->port;
             }
             else
             {
-                OC_LOG(INFO, TAG, "Secure Port info is missing");
+                OC_LOG(INFO, TAG, "Can not find secure port information.");
                 return OC_STACK_KEEP_TRANSACTION;
             }
 
@@ -376,7 +428,8 @@ static OCStackApplicationResult DeviceDiscoveryHandler(void *ctx, OCDoHandle UNU
 
                 OCStackResult res = AddDevice(ppDevicesList, clientResponse->devAddr.addr,
                         clientResponse->devAddr.port,
-                        clientResponse->devAddr.adapter, ptrDoxm);
+                        clientResponse->devAddr.adapter,
+                        clientResponse->connType, ptrDoxm);
                 if (OC_STACK_OK != res)
                 {
                     OC_LOG(ERROR, TAG, "Error while adding data to linkedlist.");
@@ -385,27 +438,32 @@ static OCStackApplicationResult DeviceDiscoveryHandler(void *ctx, OCDoHandle UNU
                 }
 
                 //Try to the unicast discovery to getting secure port
-                char query[MAX_QUERY_LENGTH] = { 0, };
-                sprintf(query, "%s%s:%d%s",
-                        COAP_PREFIX,
-                        clientResponse->devAddr.addr, clientResponse->devAddr.port,
-                        OC_RSRVD_WELL_KNOWN_URI);
+                char query[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = { 0, };
+                if(!PMGenerateQuery(false,
+                                    clientResponse->devAddr.addr, clientResponse->devAddr.port,
+                                    clientResponse->connType,
+                                    query, sizeof(query), OC_RSRVD_WELL_KNOWN_URI))
+                {
+                    OC_LOG(ERROR, TAG, "DeviceDiscoveryHandler : Failed to generate query");
+                    return OC_STACK_ERROR;
+                }
+                OC_LOG_V(DEBUG, TAG, "Query=%s", query);
 
                 OCCallbackData cbData;
                 cbData.cb = &SecurePortDiscoveryHandler;
                 cbData.context = ctx;
                 cbData.cd = NULL;
                 OCStackResult ret = OCDoResource(NULL, OC_REST_GET, query, 0, 0,
-                        CT_ADAPTER_IP, OC_LOW_QOS, &cbData, NULL, 0);
+                        clientResponse->connType, OC_LOW_QOS, &cbData, NULL, 0);
                 // TODO: Should we use the default secure port in case of error?
                 if(OC_STACK_OK != ret)
                 {
-                    UpdateSecurePortOfDevice(ppDevicesList, clientResponse->devAddr.addr,
-                            clientResponse->devAddr.port, DEFAULT_SECURE_PORT);
+                    OC_LOG(ERROR, TAG, "Failed to Secure Port Discovery");
+                    return OC_STACK_DELETE_TRANSACTION;
                 }
                 else
                 {
-                    OC_LOG_V(ERROR, TAG, "OCDoResource with [%s] Success", query);
+                    OC_LOG_V(INFO, TAG, "OCDoResource with [%s] Success", query);
                 }
                 OC_LOG(INFO, TAG, "Exiting ProvisionDiscoveryHandler.");
             }
index 4ac8e32..f7ebcea 100644 (file)
@@ -250,14 +250,18 @@ static OCStackResult provisionCredentials(const OicSecCred_t *cred,
     }
 
     OC_LOG_V(INFO, TAG, "Credential for provisioning : %s",secPayload->securityData);
-    char uri[SRP_MAX_URI_LENGTH] = { 0 };
-
-    size_t uriLen = sizeof(uri);
-    snprintf(uri, uriLen - 1, COAPS_QUERY, deviceInfo->endpoint.addr, deviceInfo->securePort,
-            OIC_RSRC_CRED_URI);
+    char query[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {0};
+    if(!PMGenerateQuery(true,
+                        deviceInfo->endpoint.addr,
+                        deviceInfo->securePort,
+                        deviceInfo->connType,
+                        query, sizeof(query), OIC_RSRC_CRED_URI))
+    {
+        OC_LOG(ERROR, TAG, "DeviceDiscoveryHandler : Failed to generate query");
+        return OC_STACK_ERROR;
+    }
+    OC_LOG_V(DEBUG, TAG, "Query=%s", query);
 
-    uri[uriLen - 1] = '\0';
-    OC_LOG_V(INFO, TAG, "URI for Credential provisioning : %s",uri);
     OCCallbackData cbData = {.context=NULL, .cb=NULL, .cd=NULL};
     cbData.cb = responseHandler;
     cbData.context = (void *) credData;
@@ -265,9 +269,8 @@ static OCStackResult provisionCredentials(const OicSecCred_t *cred,
 
     OCDoHandle handle = NULL;
     OCMethod method = OC_REST_POST;
-    // TODO replace CT_ADAPTER_IP with value from discovery
-    OCStackResult ret = OCDoResource(&handle, method, uri, 0, (OCPayload*)secPayload,
-            CT_ADAPTER_IP, OC_HIGH_QOS, &cbData, NULL, 0);
+    OCStackResult ret = OCDoResource(&handle, method, query, 0, (OCPayload*)secPayload,
+            deviceInfo->connType, OC_HIGH_QOS, &cbData, NULL, 0);
     OC_LOG_V(INFO, TAG, "OCDoResource::Credential provisioning returned : %d",ret);
     if (ret != OC_STACK_OK)
     {
@@ -439,14 +442,18 @@ OCStackResult SRPProvisionACL(void *ctx, const OCProvisionDev_t *selectedDeviceI
     }
     OC_LOG_V(INFO, TAG, "ACL : %s", secPayload->securityData);
 
-    char uri[SRP_MAX_URI_LENGTH] = {0};
-    size_t uriLen = sizeof(uri);
-
-    snprintf(uri, uriLen - 1, COAPS_QUERY, selectedDeviceInfo->endpoint.addr,
-            selectedDeviceInfo->securePort, OIC_RSRC_ACL_URI);
-    uri[uriLen - 1] = '\0';
+    char query[MAX_URI_LENGTH + MAX_QUERY_LENGTH] = {0};
+    if(!PMGenerateQuery(true,
+                        selectedDeviceInfo->endpoint.addr,
+                        selectedDeviceInfo->securePort,
+                        selectedDeviceInfo->connType,
+                        query, sizeof(query), OIC_RSRC_ACL_URI))
+    {
+        OC_LOG(ERROR, TAG, "DeviceDiscoveryHandler : Failed to generate query");
+        return OC_STACK_ERROR;
+    }
+    OC_LOG_V(DEBUG, TAG, "Query=%s", query);
 
-    OC_LOG_V(INFO, TAG, "URI : %s", uri);
     OCCallbackData cbData =  {.context=NULL, .cb=NULL, .cd=NULL};
     cbData.cb = &SRPProvisionACLCB;
     ACLData_t *aclData = (ACLData_t *) OICMalloc(sizeof(ACLData_t));
@@ -476,11 +483,9 @@ OCStackResult SRPProvisionACL(void *ctx, const OCProvisionDev_t *selectedDeviceI
     OCMethod method = OC_REST_POST;
     OCDoHandle handle = NULL;
     OC_LOG(DEBUG, TAG, "Sending ACL info to resource server");
-    // TODO replace CT_ADAPTER_IP with value from discovery
-
-    OCStackResult ret = OCDoResource(&handle, method, uri,
+    OCStackResult ret = OCDoResource(&handle, method, query,
             &selectedDeviceInfo->endpoint, (OCPayload*)secPayload,
-            CT_ADAPTER_IP, OC_HIGH_QOS, &cbData, NULL, 0);
+            selectedDeviceInfo->connType, OC_HIGH_QOS, &cbData, NULL, 0);
     if (ret != OC_STACK_OK)
     {
         OICFree(aclData->resArr);