From 28f70137dca2e75133c12d6da577a59fcf0d615f Mon Sep 17 00:00:00 2001 From: Aleksey Volkov Date: Mon, 10 Sep 2018 17:16:39 +0300 Subject: [PATCH 1/8] [IOT-3140] Enable ResetSecureResources Uncomment ResetSecureResources call on transition reset state. This will return the proper state of the security resources after reset. Change-Id: I5d43bc1e950811bbabceb1f42fd8cdcae31f87d0 Signed-off-by: Aleksey Volkov --- resource/csdk/security/src/deviceonboardingstate.c | 3 ++- resource/csdk/security/src/resourcemanager.c | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/resource/csdk/security/src/deviceonboardingstate.c b/resource/csdk/security/src/deviceonboardingstate.c index 5d0a769b20..b2f6887b80 100644 --- a/resource/csdk/security/src/deviceonboardingstate.c +++ b/resource/csdk/security/src/deviceonboardingstate.c @@ -363,7 +363,8 @@ static bool EnterRESET(void) // SVRs (e.g. the hard-coded SVRs in IoTivity) or it could be a backup // copy of the initally-provisioned SVRs (e.g. the ResetSecureResourceInPS // function in IoTivity). - // TODO [IOT-2633]: VERIFY_SUCCESS(TAG, OC_STACK_OK == ResetSecureResources(), ERROR); + // TODO [IOT-2633]: + VERIFY_SUCCESS(TAG, OC_STACK_OK == ResetSecureResources(), ERROR); // Set doxm.deviceuuid = Mfr Default (handled above) // Set doxm.sct = Mfr Default ("") diff --git a/resource/csdk/security/src/resourcemanager.c b/resource/csdk/security/src/resourcemanager.c index da3b83cb01..cee7df53de 100644 --- a/resource/csdk/security/src/resourcemanager.c +++ b/resource/csdk/security/src/resourcemanager.c @@ -140,6 +140,7 @@ OCStackResult DestroySecureResources( ) DeInitRolesResource(); #endif // __WITH_DTLS__ || __WITH_TLS__ DeInitAmaclResource(); + DeInitSpResource(); OIC_LOG_V(DEBUG, TAG, "OUT %s", __func__); From 21fe4e9974302faf2fa24411434f827650a9125c Mon Sep 17 00:00:00 2001 From: Aleksey Volkov Date: Wed, 12 Sep 2018 12:40:47 +0300 Subject: [PATCH 2/8] [IOT-3107] Proper SP resource reset Reset SP secure resource to mfr defaults: Add SP resource support to the reset profile in PS API implementation. Change-Id: Id680843a04f69090b4ae7554e18d442f093debc7 Signed-off-by: Aleksey Volkov --- resource/csdk/security/src/psinterface.c | 55 ++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/resource/csdk/security/src/psinterface.c b/resource/csdk/security/src/psinterface.c index 6549797513..3581676ea8 100644 --- a/resource/csdk/security/src/psinterface.c +++ b/resource/csdk/security/src/psinterface.c @@ -248,6 +248,7 @@ OCStackResult UpdateResourceInPS(const char *databaseName, const char *resourceN uint8_t *resetPfCbor = NULL; uint8_t *crlCbor = NULL; uint8_t *dpCbor = NULL; + uint8_t *spCbor = NULL; int64_t cborEncoderResult = CborNoError; OCStackResult ret = ReadDatabaseFromPS(databaseName, NULL, &dbData, &dbSize); @@ -263,6 +264,7 @@ OCStackResult UpdateResourceInPS(const char *databaseName, const char *resourceN size_t resetPfCborLen = 0; size_t crlCborLen = 0; size_t dpCborLen = 0; + size_t spCborLen = 0; // Determine which database we are working with so we can scope our operations if (0 == strcmp(OC_DEVICE_PROPS_FILE_NAME, databaseName)) @@ -332,6 +334,12 @@ OCStackResult UpdateResourceInPS(const char *databaseName, const char *resourceN OIC_LOG(INFO, TAG, "Successfully Finding optional CRL Name Value."); } } + cborFindResult = cbor_value_map_find_value(&cbor, OIC_JSON_SP_NAME, &curVal); + if ((CborNoError == cborFindResult) && cbor_value_is_byte_string(&curVal)) + { + cborFindResult = cbor_value_dup_byte_string(&curVal, &spCbor, &spCborLen, NULL); + VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, cborFindResult, "Failed Finding SP Name Value."); + } } else { @@ -351,7 +359,7 @@ OCStackResult UpdateResourceInPS(const char *databaseName, const char *resourceN if (PS_DATABASE_SECURITY == database) { allocSize = aclCborLen + pstatCborLen + doxmCborLen + amaclCborLen - + credCborLen + /* pconfCborLen + */ resetPfCborLen + crlCborLen + + credCborLen + /* pconfCborLen + */ resetPfCborLen + crlCborLen + spCborLen + size + CBOR_ENCODING_SIZE_ADDITION; } else @@ -433,6 +441,15 @@ OCStackResult UpdateResourceInPS(const char *databaseName, const char *resourceN cborEncoderResult |= cbor_encode_byte_string(&resource, crlCbor, crlCborLen); VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, cborEncoderResult, "Failed Adding Crl Value."); } + if (strcmp(OIC_JSON_SP_NAME, resourceName) && crlCborLen) + { + cborEncoderResult |= cbor_encode_text_string(&resource, OIC_JSON_SP_NAME, strlen(OIC_JSON_SP_NAME)); + VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, cborEncoderResult, "Failed Adding SP Name."); + cborEncoderResult |= cbor_encode_byte_string(&resource, spCbor, spCborLen); + VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, cborEncoderResult, "Failed Adding SP Value."); + } + + } else { @@ -489,6 +506,7 @@ OCStackResult UpdateResourceInPS(const char *databaseName, const char *resourceN OICFree(resetPfCbor); OICFree(crlCbor); OICFree(dpCbor); + OICFree(spCbor); return ret; } @@ -544,6 +562,7 @@ OCStackResult ResetSecureResourceInPS(void) uint8_t *credCbor = NULL; uint8_t *pstatCbor = NULL; uint8_t *doxmCbor = NULL; + uint8_t *spCbor = NULL; uint8_t *resetPfCbor = NULL; int64_t cborEncoderResult = CborNoError; @@ -554,6 +573,7 @@ OCStackResult ResetSecureResourceInPS(void) size_t credCborLen = 0; size_t pstatCborLen = 0; size_t doxmCborLen = 0; + size_t spCborLen = 0; size_t resetPfCborLen = 0; // Gets the reset profile from persistent storage @@ -603,10 +623,19 @@ OCStackResult ResetSecureResourceInPS(void) cborFindResult = cbor_value_dup_byte_string(&curVal, &doxmCbor, &doxmCborLen, NULL); VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, cborFindResult, "Failed Finding DOXM Name Value."); } + cborFindResult = cbor_value_map_find_value(&cbor, OIC_JSON_SP_NAME, &curVal); + if (CborNoError == cborFindResult && cbor_value_is_byte_string(&curVal)) + { + cborFindResult = cbor_value_dup_byte_string(&curVal, &spCbor, &spCborLen, NULL); + VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, cborFindResult, "Failed Finding SP Name Value."); + } + + } { - size_t size = aclCborLen + credCborLen + pstatCborLen + doxmCborLen + resetPfCborLen + CBOR_ENCODING_SIZE_ADDITION; + size_t size = aclCborLen + credCborLen + pstatCborLen + doxmCborLen + spCborLen + + resetPfCborLen + CBOR_ENCODING_SIZE_ADDITION; outPayload = (uint8_t *) OICCalloc(1, size); VERIFY_NOT_NULL(TAG, outPayload, ERROR); @@ -638,6 +667,11 @@ OCStackResult ResetSecureResourceInPS(void) cborEncoderResult |= cbor_encode_byte_string(&secRsrc, doxmCbor, doxmCborLen); VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, cborEncoderResult, "Failed Adding DOXM Value."); + cborEncoderResult |= cbor_encode_text_string(&secRsrc, OIC_JSON_SP_NAME, strlen(OIC_JSON_SP_NAME)); + VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, cborEncoderResult, "Failed Adding SP Name."); + cborEncoderResult |= cbor_encode_byte_string(&secRsrc, spCbor, spCborLen); + VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, cborEncoderResult, "Failed Adding SP Value."); + cborEncoderResult |= cbor_encode_text_string(&secRsrc, OIC_JSON_RESET_PF_NAME, strlen(OIC_JSON_RESET_PF_NAME)); VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, cborEncoderResult, "Failed Adding Reset Profile Name."); cborEncoderResult |= cbor_encode_byte_string(&secRsrc, resetPfCbor, resetPfCborLen); @@ -663,6 +697,7 @@ OCStackResult ResetSecureResourceInPS(void) OICFree(credCbor); OICFree(pstatCbor); OICFree(doxmCbor); + OICFree(spCbor); OICFree(resetPfCbor); return ret; } @@ -686,6 +721,7 @@ OCStackResult CreateResetProfile(void) uint8_t *credCbor = NULL; uint8_t *pstatCbor = NULL; uint8_t *doxmCbor = NULL; + uint8_t *spCbor = NULL; uint8_t *resetPfCbor = NULL; OCStackResult ret = OC_STACK_ERROR; @@ -697,6 +733,7 @@ OCStackResult CreateResetProfile(void) size_t credCborLen = 0; size_t pstatCborLen = 0; size_t doxmCborLen = 0; + size_t spCborLen = 0; size_t resetPfCborLen = 0; { @@ -738,10 +775,16 @@ OCStackResult CreateResetProfile(void) cborFindResult = cbor_value_dup_byte_string(&curVal, &doxmCbor, &doxmCborLen, NULL); VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, cborFindResult, "Failed Finding DOXM Name Value."); } + cborFindResult = cbor_value_map_find_value(&cbor, OIC_JSON_SP_NAME, &curVal); + if (CborNoError == cborFindResult && cbor_value_is_byte_string(&curVal)) + { + cborFindResult = cbor_value_dup_byte_string(&curVal, &spCbor, &spCborLen, NULL); + VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, cborFindResult, "Failed Finding SP Name Value."); + } } { - size_t size = aclCborLen + credCborLen + pstatCborLen + doxmCborLen + CBOR_ENCODING_SIZE_ADDITION; + size_t size = aclCborLen + credCborLen + pstatCborLen + doxmCborLen + spCborLen + CBOR_ENCODING_SIZE_ADDITION; resetPfCbor = (uint8_t *) OICCalloc(1, size); VERIFY_NOT_NULL(TAG, resetPfCbor, ERROR); CborEncoder encoder; // will be initialized in |cbor_parser_init| @@ -772,6 +815,11 @@ OCStackResult CreateResetProfile(void) cborEncoderResult |= cbor_encode_byte_string(&secRsrc, doxmCbor, doxmCborLen); VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, cborEncoderResult, "Failed Adding Doxm Value."); + cborEncoderResult |= cbor_encode_text_string(&secRsrc, OIC_JSON_SP_NAME, strlen(OIC_JSON_SP_NAME)); + VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, cborEncoderResult, "Failed Adding SP Name."); + cborEncoderResult |= cbor_encode_byte_string(&secRsrc, spCbor, spCborLen); + VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, cborEncoderResult, "Failed Adding SP Value."); + cborEncoderResult |= cbor_encoder_close_container(&encoder, &secRsrc); VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, cborEncoderResult, "Failed Closing Array."); resetPfCborLen = cbor_encoder_get_buffer_size(&encoder, resetPfCbor); @@ -788,6 +836,7 @@ OCStackResult CreateResetProfile(void) OICFree(credCbor); OICFree(pstatCbor); OICFree(doxmCbor); + OICFree(spCbor); OICFree(resetPfCbor); return ret; } From 36fe5fb1b342dcd6e259b2e446ef2250a9c96972 Mon Sep 17 00:00:00 2001 From: Philippe Coval Date: Fri, 14 Sep 2018 17:32:31 +0200 Subject: [PATCH 3/8] bridging: build: Remove duplicated -Werror Should rely only only ./build_common/ More cleanup to come later Change-Id: Ib48c441f4e07acbb4d9f74ba070ae427956e4178 Signed-off-by: Philippe Coval --- bridging/common/SConscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridging/common/SConscript b/bridging/common/SConscript index bb77d6b96f..452aec2fc2 100644 --- a/bridging/common/SConscript +++ b/bridging/common/SConscript @@ -55,7 +55,7 @@ mpmcommon_env.PrependUnique(CPPPATH=[ if target_os not in ['windows']: mpmcommon_env.AppendUnique( - CXXFLAGS=['-std=c++0x', '-Wall', '-Wextra', '-Werror', '-fpic']) + CXXFLAGS=['-std=c++0x', '-Wall', '-Wextra', '-fpic']) mpmcommon_env['LINKFLAGS'] = maskFlags(mpmcommon_env['LINKFLAGS']) From d0427f56eeb6fe51ed4bd1e2a379396e0ac0acc0 Mon Sep 17 00:00:00 2001 From: "koushik.girijala" Date: Wed, 27 Jun 2018 15:22:27 +0530 Subject: [PATCH 4/8] [IOT-3055] Fix to handle single element of batch Response for collection with batch interface should be an array and not object, This change will fix the case when the collection resource have to send only one element in response, instead of sending it as array of one element it sends as single object As per OCF 2.0 spec , for single element case the response should be an array even for single element Change-Id: I29a2bafd1d163c4754cc3edcb77c15661399cbeb Signed-off-by: koushik.girijala --- resource/csdk/include/octypes.h | 8 ++++++++ resource/csdk/stack/include/ocpayload.h | 2 ++ resource/csdk/stack/octbstack_product.def | 1 + .../linux/SimpleClientServer/ocservercoll.cpp | 1 + resource/csdk/stack/src/ocpayload.c | 13 +++++++++++++ resource/csdk/stack/src/ocpayloadconvert.c | 14 ++++++++++---- resource/csdk/stack/src/ocserverrequest.c | 1 + resource/include/OCRepresentation.h | 8 ++++---- resource/src/OCRepresentation.cpp | 14 ++++++++++++++ 9 files changed, 54 insertions(+), 8 deletions(-) diff --git a/resource/csdk/include/octypes.h b/resource/csdk/include/octypes.h index 89280de3f0..e2e49a62b2 100644 --- a/resource/csdk/include/octypes.h +++ b/resource/csdk/include/octypes.h @@ -1447,6 +1447,13 @@ typedef enum PAYLOAD_TYPE_INTROSPECTION } OCPayloadType; +/** Enum to describe payload interface interface.*/ +typedef enum +{ + PAYLOAD_NON_BATCH_INTERFACE, + PAYLOAD_BATCH_INTERFACE +} OCPayloadInterfaceType; + /** * A generic struct representing a payload returned from a resource operation * @@ -1526,6 +1533,7 @@ typedef struct OCRepPayloadValue typedef struct OCRepPayload { OCPayload base; + OCPayloadInterfaceType ifType; char* uri; OCStringLL* types; OCStringLL* interfaces; diff --git a/resource/csdk/stack/include/ocpayload.h b/resource/csdk/stack/include/ocpayload.h index 7bf1c14981..f4a42d2ede 100644 --- a/resource/csdk/stack/include/ocpayload.h +++ b/resource/csdk/stack/include/ocpayload.h @@ -110,6 +110,8 @@ void OC_CALL OCRepPayloadAppend(OCRepPayload* parent, OCRepPayload* child); bool OC_CALL OCRepPayloadSetUri(OCRepPayload* payload, const char* uri); +bool OC_CALL OCRepPayloadSetInterfaceType(OCRepPayload* payload, OCPayloadInterfaceType type); + bool OC_CALL OCRepPayloadAddResourceType(OCRepPayload* payload, const char* resourceType); bool OC_CALL OCRepPayloadAddInterface(OCRepPayload* payload, const char* iface); diff --git a/resource/csdk/stack/octbstack_product.def b/resource/csdk/stack/octbstack_product.def index 56021c5597..b8407970e0 100644 --- a/resource/csdk/stack/octbstack_product.def +++ b/resource/csdk/stack/octbstack_product.def @@ -120,6 +120,7 @@ OCRepPayloadSetPropStringAsOwner OCRepPayloadSetStringArray OCRepPayloadSetStringArrayAsOwner OCRepPayloadSetUri +OCRepPayloadSetInterfaceType OCResourcePayloadAddNewEndpoint OCResourcePayloadAddStringLL OCSecurityPayloadCreate diff --git a/resource/csdk/stack/samples/linux/SimpleClientServer/ocservercoll.cpp b/resource/csdk/stack/samples/linux/SimpleClientServer/ocservercoll.cpp index 4b939a0612..3dd5f20084 100644 --- a/resource/csdk/stack/samples/linux/SimpleClientServer/ocservercoll.cpp +++ b/resource/csdk/stack/samples/linux/SimpleClientServer/ocservercoll.cpp @@ -211,6 +211,7 @@ OCEntityHandlerResult OCEntityHandlerRoomCb(OCEntityHandlerFlag flag, { OCRepPayloadSetUri(payload, gRoomResourceUri); + OCRepPayloadSetInterfaceType(payload, PAYLOAD_BATCH_INTERFACE); OCRepPayload *tempPayload = OCRepPayloadCreate(); OCRepPayloadSetUri(tempPayload, gLightResourceUri); diff --git a/resource/csdk/stack/src/ocpayload.c b/resource/csdk/stack/src/ocpayload.c index a0c3b05fec..6e34b565d7 100644 --- a/resource/csdk/stack/src/ocpayload.c +++ b/resource/csdk/stack/src/ocpayload.c @@ -85,6 +85,7 @@ OCRepPayload* OC_CALL OCRepPayloadCreate(void) return NULL; } + payload->ifType = PAYLOAD_NON_BATCH_INTERFACE; payload->base.type = PAYLOAD_TYPE_REPRESENTATION; return payload; @@ -495,6 +496,17 @@ bool OC_CALL OCRepPayloadSetUri(OCRepPayload* payload, const char* uri) return payload->uri != NULL; } +bool OC_CALL OCRepPayloadSetInterfaceType(OCRepPayload* payload, OCPayloadInterfaceType type) +{ + if (!payload) + { + return false; + } + + payload->ifType = type; + return true; +} + bool OC_CALL OCRepPayloadIsNull(const OCRepPayload* payload, const char* name) { OCRepPayloadValue* val = OCRepPayloadFindValue(payload, name); @@ -1622,6 +1634,7 @@ OCRepPayload* OC_CALL OCRepPayloadBatchClone(const OCRepPayload* repPayload) } clone->types = CloneOCStringLL(repPayload->types); + clone->ifType = repPayload->ifType; clone->interfaces = CloneOCStringLL(repPayload->interfaces); clone->values = OCRepPayloadValueClone(repPayload->values); OCRepPayloadSetPropObjectAsOwner(newPayload, OC_RSRVD_REPRESENTATION, clone); diff --git a/resource/csdk/stack/src/ocpayloadconvert.c b/resource/csdk/stack/src/ocpayloadconvert.c index 11891b2c0f..ac06847711 100644 --- a/resource/csdk/stack/src/ocpayloadconvert.c +++ b/resource/csdk/stack/src/ocpayloadconvert.c @@ -942,13 +942,19 @@ static int64_t OCConvertRepPayload(OCRepPayload *payload, uint8_t *outPayload, s cbor_encoder_init(&encoder, outPayload, *size, 0); + int isBatch = 0; + if (payload != NULL && payload->ifType == PAYLOAD_BATCH_INTERFACE) + { + isBatch = 1; + } + size_t arrayCount = 0; for (OCRepPayload *temp = payload; temp; temp = temp->next) { arrayCount++; } CborEncoder rootArray; - if (arrayCount > 1) + if (arrayCount > 1 || isBatch) { err |= cbor_encoder_create_array(&encoder, &rootArray, arrayCount); VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, err, "Failed adding rep root map"); @@ -957,7 +963,7 @@ static int64_t OCConvertRepPayload(OCRepPayload *payload, uint8_t *outPayload, s while (payload != NULL && (err == CborNoError)) { CborEncoder rootMap; - err |= cbor_encoder_create_map(((arrayCount == 1)? &encoder: &rootArray), + err |= cbor_encoder_create_map(((arrayCount == 1 && !isBatch)? &encoder: &rootArray), &rootMap, CborIndefiniteLength); VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, err, "Failed creating root map"); @@ -965,12 +971,12 @@ static int64_t OCConvertRepPayload(OCRepPayload *payload, uint8_t *outPayload, s VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, err, "Failed setting rep payload"); // Close main array - err |= cbor_encoder_close_container(((arrayCount == 1) ? &encoder: &rootArray), + err |= cbor_encoder_close_container(((arrayCount == 1 && !isBatch) ? &encoder: &rootArray), &rootMap); VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, err, "Failed closing root map"); payload = payload->next; } - if (arrayCount > 1) + if (arrayCount > 1 || isBatch) { err |= cbor_encoder_close_container(&encoder, &rootArray); VERIFY_CBOR_SUCCESS_OR_OUT_OF_MEMORY(TAG, err, "Failed closing root array"); diff --git a/resource/csdk/stack/src/ocserverrequest.c b/resource/csdk/stack/src/ocserverrequest.c index 65bf85a6bc..d1224e61e6 100644 --- a/resource/csdk/stack/src/ocserverrequest.c +++ b/resource/csdk/stack/src/ocserverrequest.c @@ -877,6 +877,7 @@ OCStackResult HandleAggregateResponse(OCEntityHandlerResponse * ehResponse) if(!serverResponse->payload) { + OCRepPayloadSetInterfaceType(newPayload, PAYLOAD_BATCH_INTERFACE); serverResponse->payload = (OCPayload *)newPayload; } else diff --git a/resource/include/OCRepresentation.h b/resource/include/OCRepresentation.h index 561bea4343..d7b079cd1e 100644 --- a/resource/include/OCRepresentation.h +++ b/resource/include/OCRepresentation.h @@ -102,6 +102,10 @@ namespace OC OCRepPayload* getPayload() const; + void setInterfaceType(const InterfaceType&); + + InterfaceType getInterfaceType() const; + void addChild(const OCRepresentation&); void clearChildren(); @@ -448,10 +452,6 @@ namespace OC // based on the interface type configured in ResourceResponse. // This allows ResourceResponse to set it, so that the save function // doesn't serialize things that it isn't supposed to serialize. - void setInterfaceType(InterfaceType ift) - { - m_interfaceType = ift; - } // class used to wrap the 'prop' feature of the save/load class Prop diff --git a/resource/src/OCRepresentation.cpp b/resource/src/OCRepresentation.cpp index 83f205d5f7..6aa4869362 100644 --- a/resource/src/OCRepresentation.cpp +++ b/resource/src/OCRepresentation.cpp @@ -83,6 +83,10 @@ namespace OC if (!root) { root = r.getPayload(); + if (r.getInterfaceType() == InterfaceType::BatchParent) + { + root->ifType = PAYLOAD_BATCH_INTERFACE; + } } else { @@ -389,6 +393,16 @@ namespace OC return root; } + void OCRepresentation::setInterfaceType(const InterfaceType& ift) + { + m_interfaceType = ift; + } + + InterfaceType OCRepresentation::getInterfaceType() const + { + return m_interfaceType; + } + size_t calcArrayDepth(const size_t dimensions[MAX_REP_ARRAY_DEPTH]) { if (dimensions[0] == 0) From e7691bc1ab5f0827ce7af10577df2a5a5ff28275 Mon Sep 17 00:00:00 2001 From: Philippe Coval Date: Mon, 17 Jul 2017 19:17:11 +0200 Subject: [PATCH 5/8] build: Disable MOT by default to align spec An extra build job might be requiered to turn on all features Bug: https://jira.iotivity.org/browse/IOT-2241 Change-Id: I9bed4ade3fb12747e35d390b4a4e0339288ff564 Signed-off-by: Philippe Coval Origin: https://gerrit.iotivity.org/gerrit/#/c/21493/ (cherry picked from commit 49d3f8b51d81705933006c968bc32da30ac1c387) --- build_common/SConscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_common/SConscript b/build_common/SConscript index 43fdd199ef..c6e04b3687 100644 --- a/build_common/SConscript +++ b/build_common/SConscript @@ -147,7 +147,7 @@ help_vars.AddVariables( allowed_values=os_arch_map[target_os]), EnumVariable('MULTIPLE_OWNER', 'Enable multiple owner', - default='1', + default='0', allowed_values=('0', '1')), EnumVariable('EXC_PROV_SUPPORT', 'Except OCPMAPI library(libocpmapi.so)', From aed67e1f8365f4d4cafea3a7cf149a73a7c601a4 Mon Sep 17 00:00:00 2001 From: Todd Malsbary Date: Mon, 27 Nov 2017 11:30:56 -0800 Subject: [PATCH 6/8] RD samples need to call OCProcess. Bug: https://jira.iotivity.org/browse/IOT-2846 Change-Id: Ife04ffe93cd1780b448aa43072d7eba869a672fb Signed-off-by: Todd Malsbary --- .../samples/rd_publishingClient.cpp | 191 +++++++++++++----- .../samples/rd_queryClient.cpp | 9 +- 2 files changed, 147 insertions(+), 53 deletions(-) diff --git a/resource/csdk/resource-directory/samples/rd_publishingClient.cpp b/resource/csdk/resource-directory/samples/rd_publishingClient.cpp index ee9c01ec8a..be76861d14 100644 --- a/resource/csdk/resource-directory/samples/rd_publishingClient.cpp +++ b/resource/csdk/resource-directory/samples/rd_publishingClient.cpp @@ -22,20 +22,20 @@ #include #include #include +#include +#include +#include #include "oic_string.h" #include "rd_client.h" -/// This example is using experimental API, so there is no guarantee of support for future release, -/// nor any there any guarantee that breaking changes will not occur across releases. -/// logging part is not critical but convenient for developer -#include "experimental/payload_logging.h" - -#define TAG ("RD_PublishClient") #define DEFAULT_CONTEXT_VALUE 0x99 OCResourceHandle handles[2]; -std::ostringstream rdAddress; +std::string rdAddress; +std::mutex mutex; +std::condition_variable cond; +int in = 0; OCStackResult registerLocalResources() { @@ -74,11 +74,11 @@ void printHelp() { std::cout << std::endl; std::cout << "********************************************" << std::endl; - std::cout << "* method Type : 1 - Discover RD *" << std::endl; - std::cout << "* method Type : 2 - Publish *" << std::endl; - std::cout << "* method Type : 3 - Update *" << std::endl; - std::cout << "* method Type : 4 - Delete *" << std::endl; - std::cout << "* method Type : 5 - Status *" << std::endl; + std::cout << "* method Type : 1 - Discover RD *" << std::endl; + std::cout << "* method Type : 2 - Publish *" << std::endl; + std::cout << "* method Type : 3 - Update *" << std::endl; + std::cout << "* method Type : 4 - Delete *" << std::endl; + std::cout << "* method Type : 99 - Exit *" << std::endl; std::cout << "********************************************" << std::endl; std::cout << std::endl; } @@ -88,9 +88,11 @@ static OCStackApplicationResult handleDiscoveryCB(__attribute__((unused))void *c __attribute__((unused)) OCClientResponse *clientResponse) { - OIC_LOG(DEBUG, TAG, "Successfully found RD."); - rdAddress << clientResponse->devAddr.addr << ":" << clientResponse->devAddr.port; - std::cout << "RD Address is : " << rdAddress.str() << std::endl; + std::cout << "Successfully found RD." << std::endl; + std::ostringstream oss; + oss << clientResponse->devAddr.addr << ":" << clientResponse->devAddr.port; + rdAddress = oss.str(); + std::cout << "RD Address is : " << rdAddress << std::endl; return OC_STACK_DELETE_TRANSACTION; } @@ -99,17 +101,127 @@ static OCStackApplicationResult handlePublishCB(__attribute__((unused))void *ctx __attribute__((unused)) OCClientResponse *clientResponse) { - OIC_LOG(DEBUG, TAG, "Successfully published resources."); + std::cout << "Successfully published resources." << std::endl; return OC_STACK_DELETE_TRANSACTION; } -int main(void) +static OCStackApplicationResult handleUpdateCB(__attribute__((unused))void *ctx, + __attribute__((unused)) OCDoHandle handle, + __attribute__((unused)) + OCClientResponse *clientResponse) +{ + std::cout << "Successfully updated resources." << std::endl; + return OC_STACK_DELETE_TRANSACTION; +} + +static OCStackApplicationResult handleDeleteCB(__attribute__((unused))void *ctx, + __attribute__((unused)) OCDoHandle handle, + __attribute__((unused)) + OCClientResponse *clientResponse) +{ + std::cout << "Successfully deleted resources." << std::endl; + return OC_STACK_DELETE_TRANSACTION; +} + +static void ocThread() +{ + OCStackResult result; + bool run = true; + while (run) + { + std::unique_lock lock(mutex); + if (cond.wait_for(lock, std::chrono::milliseconds(100)) == std::cv_status::no_timeout) + { + switch (in) + { + case 1: + { + OCCallbackData cbData; + cbData.cb = &handleDiscoveryCB; + cbData.cd = NULL; + cbData.context = (void*) DEFAULT_CONTEXT_VALUE; + result = OCRDDiscover(nullptr, CT_ADAPTER_IP, &cbData, OC_LOW_QOS); + if (OC_STACK_OK != result) + { + std::cout << "OCRDDiscover Failed " << result << std::endl; + } + break; + } + case 2: + { + OCCallbackData cbData; + cbData.cb = &handlePublishCB; + cbData.cd = NULL; + cbData.context = (void*) DEFAULT_CONTEXT_VALUE; + result = OCRDPublish(nullptr, rdAddress.c_str(), CT_ADAPTER_IP, handles, + 2, OIC_RD_PUBLISH_TTL, &cbData, OC_LOW_QOS); + if (OC_STACK_OK != result) + { + std::cout << "OCRDPublish Failed " << result << std::endl; + } + break; + } + case 3: + { + /* Update the TTL */ + OCCallbackData cbData; + cbData.cb = &handleUpdateCB; + cbData.cd = NULL; + cbData.context = (void*) DEFAULT_CONTEXT_VALUE; + result = OCRDPublish(nullptr, rdAddress.c_str(), CT_ADAPTER_IP, handles, + 2, OIC_RD_PUBLISH_TTL, &cbData, OC_LOW_QOS); + if (OC_STACK_OK != result) + { + std::cout << "OCRDPublish Failed " << result << std::endl; + } + break; + } + case 4: + { + /* Delete all resources */ + OCCallbackData cbData; + cbData.cb = &handleDeleteCB; + cbData.cd = NULL; + cbData.context = (void*) DEFAULT_CONTEXT_VALUE; + result = OCRDDelete(nullptr, rdAddress.c_str(), CT_ADAPTER_IP, NULL, + 0, &cbData, OC_LOW_QOS); + if (OC_STACK_OK != result) + { + std::cout << "OCRDDelete Failed " << result << std::endl; + } + break; + } + case 99: + run = false; + break; + default: + std::cout << "Invalid input, please try again" << std::endl; + break; + } + printHelp(); + } + result = OCProcess(); + if (OC_STACK_OK != result) + { + std::cout << "OCProcess Failed " << result << std::endl; + break; + } + } +} + +int main() { std::cout << "Initializing IoTivity Platform" << std::endl; OCStackResult result = OCInit(NULL, 0, OC_CLIENT_SERVER); if (OC_STACK_OK != result) { - std::cout << "OCInit Failed" << result << std::endl; + std::cout << "OCInit Failed " << result << std::endl; + return -1; + } + result = OCStopMulticastServer(); + if (OC_STACK_OK != result) + { + std::cout << "OCStopMulticastServer Failed " << result << std::endl; return -1; } @@ -121,15 +233,12 @@ int main(void) return -1; } + printHelp(); + + std::thread t(ocThread); + while (1) { - if (handles[0] == NULL || handles[1] == NULL) - { - continue; - } - printHelp(); - - int in = 0; std::cin >> in; if (std::cin.fail()) @@ -140,34 +249,14 @@ int main(void) continue; } - switch ((int)in) + cond.notify_one(); + + if (in == 99) { - case 1: - { - OCCallbackData cbData; - cbData.cb = &handleDiscoveryCB;; - cbData.cd = NULL; - cbData.context = (void*) DEFAULT_CONTEXT_VALUE; - OCRDDiscover(nullptr, CT_ADAPTER_IP, &cbData, OC_LOW_QOS); - break; - } - case 2: - { - OCCallbackData cbData; - cbData.cb = &handlePublishCB; - cbData.cd = NULL; - cbData.context = (void*) DEFAULT_CONTEXT_VALUE; - std::string address = rdAddress.str(); - OCRDPublish(nullptr, address.c_str(), CT_ADAPTER_IP, handles, - 2, OIC_RD_PUBLISH_TTL, &cbData, OC_LOW_QOS); - break; - } - case 3: - break; - default: - std::cout << "Invalid input, please try again" << std::endl; - break; + break; } } + + t.join(); return 0; } diff --git a/resource/csdk/resource-directory/samples/rd_queryClient.cpp b/resource/csdk/resource-directory/samples/rd_queryClient.cpp index d1ecf7c601..90547290e4 100644 --- a/resource/csdk/resource-directory/samples/rd_queryClient.cpp +++ b/resource/csdk/resource-directory/samples/rd_queryClient.cpp @@ -36,11 +36,11 @@ OCStackApplicationResult foundResource(void* ctx, OCClientResponse *clientResponse) { (void)handle; - (void) ctx; + (void)ctx; if (clientResponse == NULL) { std::cout << "foundResource received NULL clientResponse" << std::endl; - return OC_STACK_DELETE_TRANSACTION; + return OC_STACK_DELETE_TRANSACTION; } std::cout << "Found resource response." << std::endl; @@ -102,5 +102,10 @@ int main(void) sendRequest = true; } } + if (OCProcess() != OC_STACK_OK) + { + std::cout << "OCStack process error" << std::endl; + return -1; + } } } From b06614a7e3665992bc2f191b56d0dc8328196ebd Mon Sep 17 00:00:00 2001 From: Aleksey Volkov Date: Thu, 20 Sep 2018 14:51:24 +0300 Subject: [PATCH 7/8] [IOT-3140] Fix roles deinit crash Change-Id: I27bab5b348a4b0c52319447ce52e9ebdf3755628 Signed-off-by: Aleksey Volkov --- resource/csdk/security/src/rolesresource.c | 1 + 1 file changed, 1 insertion(+) diff --git a/resource/csdk/security/src/rolesresource.c b/resource/csdk/security/src/rolesresource.c index 00ba020288..40554eb8fb 100644 --- a/resource/csdk/security/src/rolesresource.c +++ b/resource/csdk/security/src/rolesresource.c @@ -1093,6 +1093,7 @@ OCStackResult DeInitRolesResource(void) FreeSymmetricRolesList(gSymmetricRoles); gRoles = NULL; + gSymmetricRoles = NULL; return res; } From 758fc4ae114e7daa91ade8ca7e6bb17ae93d7c3b Mon Sep 17 00:00:00 2001 From: Aleksey Volkov Date: Thu, 20 Sep 2018 18:14:09 +0300 Subject: [PATCH 8/8] [IOT-3140] Revert PSK callback at reset Set default PSK callback after the reset of secure resources Change-Id: Ib4e768c7401247dc9dd4917ff5a611396e8e07a1 Signed-off-by: Aleksey Volkov --- resource/csdk/security/src/deviceonboardingstate.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/resource/csdk/security/src/deviceonboardingstate.c b/resource/csdk/security/src/deviceonboardingstate.c index b2f6887b80..a4239a3805 100644 --- a/resource/csdk/security/src/deviceonboardingstate.c +++ b/resource/csdk/security/src/deviceonboardingstate.c @@ -366,6 +366,10 @@ static bool EnterRESET(void) // TODO [IOT-2633]: VERIFY_SUCCESS(TAG, OC_STACK_OK == ResetSecureResources(), ERROR); +#if defined(__WITH_DTLS__) || defined(__WITH_TLS__) + VERIFY_SUCCESS(TAG, CA_STATUS_OK == CAregisterPskCredentialsHandler(GetDtlsPskCredentials), ERROR); +#endif // __WITH_DTLS__ or __WITH_TLS__ + // Set doxm.deviceuuid = Mfr Default (handled above) // Set doxm.sct = Mfr Default ("") // Set doxm.oxmsel = Mfr Default ("")