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;
*/
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
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)
{
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");
}
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");
}
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));
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");
}
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));
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");
}
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)
{
}
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);
* @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)
{
ptr->securePort = DEFAULT_SECURE_PORT;
ptr->endpoint.adapter = adapter;
ptr->next = NULL;
+ ptr->connType = connType;
LL_PREPEND(*ppDevicesList, ptr);
}
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.
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;
}
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.");
}
//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.");
}
}
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;
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)
{
}
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));
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);