From: Jin-Seong Kim Date: Thu, 6 Apr 2017 01:45:46 +0000 (+0900) Subject: external: introduce wakaama X-Git-Tag: 1.1_Public_Release~614^2~127 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8b57e75dc1aae75995caa0622f30d65ac3ea848b;p=rtos%2Ftinyara.git external: introduce wakaama This commit is an initial commit to support lwm2m through wakaama[1]. [1] https://github.com/eclipse/wakaama Change-Id: I615b4ef26a7baba86d492776f13a10e1be84003d Signed-off-by: Jin-Seong Kim --- diff --git a/external/wakaama/README.md b/external/wakaama/README.md index f0d331c..d75a7d0 100644 --- a/external/wakaama/README.md +++ b/external/wakaama/README.md @@ -45,6 +45,7 @@ Several compilation switches are used: - LWM2M_BOOTSTRAP_SERVER_MODE to enable LWM2M Bootstrap Server interfaces. - LWM2M_BOOTSTRAP to enable LWM2M Bootstrap support in a LWM2M Client. - LWM2M_SUPPORT_JSON to enable JSON payload support (implicit when defining LWM2M_SERVER_MODE) + - LWM2M_OLD_CONTENT_FORMAT_SUPPORT to support the deprecated content format values for TLV and JSON. Depending on your platform, you need to define LWM2M_BIG_ENDIAN or LWM2M_LITTLE_ENDIAN. LWM2M_CLIENT_MODE and LWM2M_SERVER_MODE can be defined at the same time. @@ -73,14 +74,18 @@ Options are: * ``make`` * ``./lwm2mclient [Options]`` -DTLS feature requires tinydtls submodule. Look at examples/client/README.md for an example of how -to include tinydtls. +DTLS feature requires the tinydtls submodule. To include it, on the first run, +use the following commands to retrieve the sources: + * git submodule init + * git submodule update + +You need to install libtool and autoreconf to build with tinydtls. Build with tinydtls: * Create a build directory and change to that. * ``cmake -DDTLS=1 [liblwm2m directory]/examples/client`` * ``make`` - * ``./lwm2mclient_dtls [Options]`` + * ``./lwm2mclient [Options]`` The lwm2mclient features nine LWM2M objects: - Security Object (id: 0) diff --git a/external/wakaama/TODO b/external/wakaama/TODO index 363e79f..b7a7f72 100644 --- a/external/wakaama/TODO +++ b/external/wakaama/TODO @@ -20,8 +20,8 @@ LWM2M Features -------- - Implementation Improvments - -------------------------- + Implementation Improvements + --------------------------- - Store lwm2m_transaction_t per peer @@ -42,5 +42,5 @@ LWM2M Features - Utility functions to easily implements objects The utility will just use read and write individual resources. Either statically or - throught callbacks. See [https://github.com/01org/libdmclient]/tests/mgtobj/utils/static_mo_util.h + through callbacks. See [https://github.com/01org/libdmclient]/tests/mgtobj/utils/static_mo_util.h \ No newline at end of file diff --git a/external/wakaama/core/Make.defs b/external/wakaama/core/Make.defs index 1336a5a..5012d41 100644 --- a/external/wakaama/core/Make.defs +++ b/external/wakaama/core/Make.defs @@ -36,8 +36,9 @@ ifeq ($(CONFIG_DM),y) # Routing table support - -CSRCS += management.c objects.c observe.c data.c discover.c packet.c registration.c tlv_lwm2m.c transaction.c uri_lwm2m.c utils.c list.c liblwm2m.c json.c bootstrap.c +CSRCS += block1.c +CSRCS += management.c objects.c observe.c data.c discover.c packet.c registration.c transaction.c utils.c list.c liblwm2m.c json.c bootstrap.c +CSRCS += tlv.c uri.c ifeq ($(CONFIG_LWM2M_CLIENT_MODE),y) CFLAGS+=-DLWM2M_CLIENT_MODE @@ -49,7 +50,12 @@ endif ifeq ($(CONFIG_LWM2M_LITTLE_ENDIAN),y) CFLAGS+=-DLWM2M_LITTLE_ENDIAN +else +CFLAGS+=-DLWM2M_BIG_ENDIAN endif + +CFLAGS+=-D__TINYARA__ + CFLAGS+=-I$(TOPDIR)/../external/wakaama/core DEPPATH += --dep-path wakaama/core diff --git a/external/wakaama/core/block1.c b/external/wakaama/core/block1.c new file mode 100644 index 0000000..9178e34 --- /dev/null +++ b/external/wakaama/core/block1.c @@ -0,0 +1,153 @@ +/******************************************************************************* + * + * Copyright (c) 2016 Intel Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and Eclipse Distribution License v1.0 which accompany this distribution. + * + * The Eclipse Public License is available at + * http://www.eclipse.org/legal/epl-v10.html + * The Eclipse Distribution License is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + * + * Contributors: + * Simon Bernard - initial API and implementation + * + *******************************************************************************/ +/* + Copyright (c) 2016 Intel Corporation + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of Intel Corporation nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + THE POSSIBILITY OF SUCH DAMAGE. +*/ +#include "internals.h" + +#include +#include +#include + +// the maximum payload transferred by block1 we accumulate per server +#define MAX_BLOCK1_SIZE 4096 + +coap_status_t coap_block1_handler(lwm2m_block1_data_t ** pBlock1Data, + uint16_t mid, + uint8_t * buffer, + size_t length, + uint16_t blockSize, + uint32_t blockNum, + bool blockMore, + uint8_t ** outputBuffer, + size_t * outputLength) +{ + lwm2m_block1_data_t * block1Data = *pBlock1Data;; + + // manage new block1 transfer + if (blockNum == 0) + { + // we already have block1 data for this server, clear it + if (block1Data != NULL) + { + lwm2m_free(block1Data->block1buffer); + } + else + { + block1Data = lwm2m_malloc(sizeof(lwm2m_block1_data_t)); + *pBlock1Data = block1Data; + if (NULL == block1Data) return COAP_500_INTERNAL_SERVER_ERROR; + } + + block1Data->block1buffer = lwm2m_malloc(length); + block1Data->block1bufferSize = length; + + // write new block in buffer + memcpy(block1Data->block1buffer, buffer, length); + block1Data->lastmid = mid; + } + // manage already started block1 transfer + else + { + if (block1Data == NULL) + { + // we never receive the first block + // TODO should we clean block1 data for this server ? + return COAP_408_REQ_ENTITY_INCOMPLETE; + } + + // If this is a retransmission, we already did that. + if (block1Data->lastmid != mid) + { + uint8_t * oldBuffer = block1Data->block1buffer; + size_t oldSize = block1Data->block1bufferSize; + + if (block1Data->block1bufferSize != blockSize * blockNum) + { + // we don't receive block in right order + // TODO should we clean block1 data for this server ? + return COAP_408_REQ_ENTITY_INCOMPLETE; + } + + // is it too large? + if (block1Data->block1bufferSize + length >= MAX_BLOCK1_SIZE) { + return COAP_413_ENTITY_TOO_LARGE; + } + // re-alloc new buffer + block1Data->block1bufferSize = oldSize+length; + block1Data->block1buffer = lwm2m_malloc(block1Data->block1bufferSize); + if (NULL == block1Data->block1buffer) return COAP_500_INTERNAL_SERVER_ERROR; + memcpy(block1Data->block1buffer, oldBuffer, oldSize); + lwm2m_free(oldBuffer); + + // write new block in buffer + memcpy(block1Data->block1buffer + oldSize, buffer, length); + block1Data->lastmid = mid; + } + } + + if (blockMore) + { + *outputLength = -1; + return COAP_231_CONTINUE; + } + else + { + // buffer is full, set output parameter + // we don't free it to be able to send retransmission + *outputLength = block1Data->block1bufferSize; + *outputBuffer = block1Data->block1buffer; + + return NO_ERROR; + } +} + +void free_block1_buffer(lwm2m_block1_data_t * block1Data) +{ + if (block1Data != NULL) + { + // free block1 buffer + lwm2m_free(block1Data->block1buffer); + block1Data->block1bufferSize = 0 ; + + // free current element + lwm2m_free(block1Data); + } +} diff --git a/external/wakaama/core/bootstrap.c b/external/wakaama/core/bootstrap.c index 1b98dfa..f673a97 100644 --- a/external/wakaama/core/bootstrap.c +++ b/external/wakaama/core/bootstrap.c @@ -28,12 +28,6 @@ #define PRV_QUERY_BUFFER_LENGTH 200 -static void prv_bootstrapFailed(lwm2m_server_t * bootstrapServer) -{ - LOG("Entering"); - - bootstrapServer->status = STATE_BS_FAILED; -} static void prv_handleResponse(lwm2m_server_t * bootstrapServer, coap_packet_t * message) @@ -45,7 +39,7 @@ static void prv_handleResponse(lwm2m_server_t * bootstrapServer, } else { - prv_bootstrapFailed(bootstrapServer); + bootstrapServer->status = STATE_BS_FAILING; } } @@ -65,7 +59,7 @@ static void prv_handleBootstrapReply(lwm2m_transaction_t * transaction, } else { - prv_bootstrapFailed(bootstrapServer); + bootstrapServer->status = STATE_BS_FAILING; } } } @@ -80,16 +74,16 @@ static void prv_requestBootstrap(lwm2m_context_t * context, LOG("Entering"); - query_length = utils_stringCopy(query, PRV_QUERY_BUFFER_LENGTH, "?ep="); + query_length = utils_stringCopy(query, PRV_QUERY_BUFFER_LENGTH, QUERY_STARTER QUERY_NAME); if (query_length < 0) { - bootstrapServer->status = STATE_BS_FAILED; + bootstrapServer->status = STATE_BS_FAILING; return; } res = utils_stringCopy(query + query_length, PRV_QUERY_BUFFER_LENGTH - query_length, context->endpointName); if (res < 0) { - bootstrapServer->status = STATE_BS_FAILED; + bootstrapServer->status = STATE_BS_FAILING; return; } query_length += res; @@ -105,10 +99,10 @@ static void prv_requestBootstrap(lwm2m_context_t * context, LOG("Bootstrap server connection opened"); - transaction = transaction_new(COAP_TYPE_CON, COAP_POST, NULL, NULL, context->nextMID++, 4, NULL, ENDPOINT_SERVER, (void *)bootstrapServer); + transaction = transaction_new(bootstrapServer->sessionH, COAP_POST, NULL, NULL, context->nextMID++, 4, NULL); if (transaction == NULL) { - bootstrapServer->status = STATE_BS_FAILED; + bootstrapServer->status = STATE_BS_FAILING; return; } @@ -132,7 +126,7 @@ static void prv_requestBootstrap(lwm2m_context_t * context, void bootstrap_step(lwm2m_context_t * contextP, uint32_t currentTime, - time_t* timeoutP) + time_t * timeoutP) { lwm2m_server_t * targetP; @@ -171,20 +165,24 @@ void bootstrap_step(lwm2m_context_t * contextP, // waiting break; - case STATE_BS_FINISHED: + case STATE_BS_FINISHING: if (targetP->sessionH != NULL) { lwm2m_close_connection(targetP->sessionH, contextP->userData); targetP->sessionH = NULL; } + targetP->status = STATE_BS_FINISHED; + *timeoutP = 0; break; - case STATE_BS_FAILED: + case STATE_BS_FAILING: if (targetP->sessionH != NULL) { lwm2m_close_connection(targetP->sessionH, contextP->userData); targetP->sessionH = NULL; } + targetP->status = STATE_BS_FAILED; + *timeoutP = 0; break; default: @@ -205,8 +203,8 @@ coap_status_t bootstrap_handleFinish(lwm2m_context_t * context, if (bootstrapServer != NULL && bootstrapServer->status == STATE_BS_PENDING) { - LOG("Bootstrap server status changed to STATE_BS_FINISHED"); - bootstrapServer->status = STATE_BS_FINISHED; + LOG("Bootstrap server status changed to STATE_BS_FINISHING"); + bootstrapServer->status = STATE_BS_FINISHING; return COAP_204_CHANGED; } @@ -264,6 +262,7 @@ lwm2m_status_t bootstrap_getStatus(lwm2m_context_t * contextP) case STATE_BS_HOLD_OFF: case STATE_BS_INITIATED: case STATE_BS_PENDING: + case STATE_BS_FINISHING: bs_status = STATE_BS_PENDING; break; @@ -302,6 +301,8 @@ static coap_status_t prv_checkServerStatus(lwm2m_server_t * serverP) break; case STATE_BS_FINISHED: + case STATE_BS_FINISHING: + case STATE_BS_FAILING: case STATE_BS_FAILED: default: LOG("Returning COAP_IGNORE"); @@ -571,19 +572,19 @@ uint8_t bootstrap_handleRequest(lwm2m_context_t * contextP, if (message->uri_query == NULL) return COAP_400_BAD_REQUEST; if (message->payload != NULL) return COAP_400_BAD_REQUEST; - if (lwm2m_strncmp((char *)message->uri_query->data, QUERY_TEMPLATE, QUERY_LENGTH) != 0) + if (lwm2m_strncmp((char *)message->uri_query->data, QUERY_NAME, QUERY_NAME_LEN) != 0) { return COAP_400_BAD_REQUEST; } - if (message->uri_query->len == QUERY_LENGTH) return COAP_400_BAD_REQUEST; + if (message->uri_query->len == QUERY_NAME_LEN) return COAP_400_BAD_REQUEST; if (message->uri_query->next != NULL) return COAP_400_BAD_REQUEST; - name = (char *)lwm2m_malloc(message->uri_query->len - QUERY_LENGTH + 1); + name = (char *)lwm2m_malloc(message->uri_query->len - QUERY_NAME_LEN + 1); if (name == NULL) return COAP_500_INTERNAL_SERVER_ERROR; - memcpy(name, message->uri_query->data + QUERY_LENGTH, message->uri_query->len - QUERY_LENGTH); - name[message->uri_query->len - QUERY_LENGTH] = 0; + memcpy(name, message->uri_query->data + QUERY_NAME_LEN, message->uri_query->len - QUERY_NAME_LEN); + name[message->uri_query->len - QUERY_NAME_LEN] = 0; result = contextP->bootstrapCallback(fromSessionH, COAP_NO_ERROR, NULL, name, contextP->bootstrapUserData); @@ -618,7 +619,7 @@ static void prv_resultCallback(lwm2m_transaction_t * transacP, if (message == NULL) { - dataP->callback(transacP->peerP, + dataP->callback(transacP->peerH, COAP_503_SERVICE_UNAVAILABLE, uriP, NULL, @@ -628,7 +629,7 @@ static void prv_resultCallback(lwm2m_transaction_t * transacP, { coap_packet_t * packet = (coap_packet_t *)message; - dataP->callback(transacP->peerP, + dataP->callback(transacP->peerH, packet->code, uriP, NULL, @@ -645,7 +646,7 @@ int lwm2m_bootstrap_delete(lwm2m_context_t * contextP, bs_data_t * dataP; LOG_URI(uriP); - transaction = transaction_new(COAP_TYPE_CON, COAP_DELETE, NULL, uriP, contextP->nextMID++, 4, NULL, ENDPOINT_UNKNOWN, sessionH); + transaction = transaction_new(sessionH, COAP_DELETE, NULL, uriP, contextP->nextMID++, 4, NULL); if (transaction == NULL) return COAP_500_INTERNAL_SERVER_ERROR; dataP = (bs_data_t *)lwm2m_malloc(sizeof(bs_data_t)); @@ -692,7 +693,7 @@ int lwm2m_bootstrap_write(lwm2m_context_t * contextP, return COAP_400_BAD_REQUEST; } - transaction = transaction_new(COAP_TYPE_CON, COAP_PUT, NULL, uriP, contextP->nextMID++, 4, NULL, ENDPOINT_UNKNOWN, sessionH); + transaction = transaction_new(sessionH, COAP_PUT, NULL, uriP, contextP->nextMID++, 4, NULL); if (transaction == NULL) return COAP_500_INTERNAL_SERVER_ERROR; coap_set_header_content_type(transaction->message, format); @@ -724,7 +725,7 @@ int lwm2m_bootstrap_finish(lwm2m_context_t * contextP, bs_data_t * dataP; LOG("Entering"); - transaction = transaction_new(COAP_TYPE_CON, COAP_POST, NULL, NULL, contextP->nextMID++, 4, NULL, ENDPOINT_UNKNOWN, sessionH); + transaction = transaction_new(sessionH, COAP_POST, NULL, NULL, contextP->nextMID++, 4, NULL); if (transaction == NULL) return COAP_500_INTERNAL_SERVER_ERROR; coap_set_header_uri_path(transaction->message, "/"URI_BOOTSTRAP_SEGMENT); diff --git a/external/wakaama/core/data.c b/external/wakaama/core/data.c index 14ba06f..0b8602c 100644 --- a/external/wakaama/core/data.c +++ b/external/wakaama/core/data.c @@ -21,32 +21,49 @@ #include // dataP array length is assumed to be 1. -static size_t prv_textSerialize(lwm2m_data_t * dataP, - uint8_t ** bufferP) +static int prv_textSerialize(lwm2m_data_t * dataP, + uint8_t ** bufferP) { + size_t res; + switch (dataP->type) { case LWM2M_TYPE_STRING: *bufferP = (uint8_t *)lwm2m_malloc(dataP->value.asBuffer.length); if (*bufferP == NULL) return 0; memcpy(*bufferP, dataP->value.asBuffer.buffer, dataP->value.asBuffer.length); - return dataP->value.asBuffer.length; + return (int)dataP->value.asBuffer.length; case LWM2M_TYPE_INTEGER: - return utils_int64ToPlainText(dataP->value.asInteger, bufferP); + res = utils_int64ToPlainText(dataP->value.asInteger, bufferP); + if (res == 0) return -1; + return (int)res; case LWM2M_TYPE_FLOAT: - return utils_float64ToPlainText(dataP->value.asFloat, bufferP); + res = utils_float64ToPlainText(dataP->value.asFloat, bufferP); + if (res == 0) return -1; + return (int)res; case LWM2M_TYPE_BOOLEAN: - return utils_boolToPlainText(dataP->value.asBoolean, bufferP); + res = utils_boolToPlainText(dataP->value.asBoolean, bufferP); + if (res == 0) return -1; + return (int)res; case LWM2M_TYPE_OBJECT_LINK: - // TODO: implement + { + char stringBuffer[20]; + int len = snprintf(stringBuffer, 20, "%d:%d", + dataP->value.asObjLink.objectId, + dataP->value.asObjLink.objectInstanceId); + *bufferP = (uint8_t *)lwm2m_malloc(len); + if (*bufferP == NULL) return -1; + memcpy(*bufferP, stringBuffer, len); + return len; + } case LWM2M_TYPE_OPAQUE: case LWM2M_TYPE_UNDEFINED: default: - return 0; + return -1; } } @@ -359,6 +376,16 @@ int lwm2m_data_decode_bool(const lwm2m_data_t * dataP, return result; } +void lwm2m_data_encode_objlink(uint16_t objectId, + uint16_t objectInstanceId, + lwm2m_data_t * dataP) +{ + LOG_ARG("value: %d/%d", objectId, objectInstanceId); + dataP->type = LWM2M_TYPE_OBJECT_LINK; + dataP->value.asObjLink.objectId = objectId; + dataP->value.asObjLink.objectInstanceId = objectInstanceId; +} + void lwm2m_data_include(lwm2m_data_t * subDataP, size_t count, lwm2m_data_t * dataP) @@ -422,10 +449,16 @@ int lwm2m_data_parse(lwm2m_uri_t * uriP, (*dataP)->type = LWM2M_TYPE_OPAQUE; return prv_setBuffer(*dataP, buffer, bufferLen); +#ifdef LWM2M_OLD_CONTENT_FORMAT_SUPPORT + case LWM2M_CONTENT_TLV_OLD: +#endif case LWM2M_CONTENT_TLV: return tlv_parse(buffer, bufferLen, dataP); #ifdef LWM2M_SUPPORT_JSON +#ifdef LWM2M_OLD_CONTENT_FORMAT_SUPPORT + case LWM2M_CONTENT_JSON_OLD: +#endif case LWM2M_CONTENT_JSON: return json_parse(uriP, buffer, bufferLen, dataP); #endif @@ -435,13 +468,12 @@ int lwm2m_data_parse(lwm2m_uri_t * uriP, } } -size_t lwm2m_data_serialize(lwm2m_uri_t * uriP, - int size, - lwm2m_data_t * dataP, - lwm2m_media_type_t * formatP, - uint8_t ** bufferP) +int lwm2m_data_serialize(lwm2m_uri_t * uriP, + int size, + lwm2m_data_t * dataP, + lwm2m_media_type_t * formatP, + uint8_t ** bufferP) { - LOG_URI(uriP); LOG_ARG("size: %d, formatP: %s", size, STR_MEDIA_TYPE(*formatP)); @@ -450,7 +482,7 @@ size_t lwm2m_data_serialize(lwm2m_uri_t * uriP, || *formatP == LWM2M_CONTENT_OPAQUE) { if (size != 1 - || !LWM2M_URI_IS_SET_RESOURCE(uriP) + || (uriP != NULL && !LWM2M_URI_IS_SET_RESOURCE(uriP)) || dataP->type == LWM2M_TYPE_OBJECT || dataP->type == LWM2M_TYPE_OBJECT_INSTANCE || dataP->type == LWM2M_TYPE_MULTIPLE_RESOURCE) @@ -477,20 +509,16 @@ size_t lwm2m_data_serialize(lwm2m_uri_t * uriP, case LWM2M_CONTENT_OPAQUE: *bufferP = (uint8_t *)lwm2m_malloc(dataP->value.asBuffer.length); - if (*bufferP == NULL) return 0; + if (*bufferP == NULL) return -1; memcpy(*bufferP, dataP->value.asBuffer.buffer, dataP->value.asBuffer.length); - return dataP->value.asBuffer.length; + return (int)dataP->value.asBuffer.length; case LWM2M_CONTENT_TLV: { - uint8_t baseUriStr[URI_MAX_STRING_LEN]; - size_t baseUriLen; - uri_depth_t rootLevel; bool isResourceInstance; - baseUriLen = uri_toString(uriP, baseUriStr, URI_MAX_STRING_LEN, &rootLevel); - if (baseUriLen <= 0) return 0; - if (rootLevel == URI_DEPTH_RESOURCE_INSTANCE) + if (uriP != NULL && LWM2M_URI_IS_SET_RESOURCE(uriP) + && (size != 1 || dataP->id != uriP->resourceId)) { isResourceInstance = true; } @@ -503,7 +531,7 @@ size_t lwm2m_data_serialize(lwm2m_uri_t * uriP, #ifdef LWM2M_CLIENT_MODE case LWM2M_CONTENT_LINK: - return discover_serialize(NULL, uriP, size, dataP, bufferP); + return discover_serialize(NULL, uriP, NULL, size, dataP, bufferP); #endif #ifdef LWM2M_SUPPORT_JSON case LWM2M_CONTENT_JSON: @@ -511,7 +539,7 @@ size_t lwm2m_data_serialize(lwm2m_uri_t * uriP, #endif default: - return 0; + return -1; } } diff --git a/external/wakaama/core/discover.c b/external/wakaama/core/discover.c index b8cde42..e29e28e 100644 --- a/external/wakaama/core/discover.c +++ b/external/wakaama/core/discover.c @@ -30,56 +30,74 @@ #ifdef LWM2M_CLIENT_MODE + +static lwm2m_attributes_t * prv_findAttributes(lwm2m_context_t * contextP, + lwm2m_uri_t * uriP, + lwm2m_server_t * serverP) +{ + lwm2m_observed_t * observedP; + lwm2m_watcher_t * watcherP; + lwm2m_attributes_t * paramP; + + paramP = NULL; + + if (contextP == NULL) return NULL; + if (serverP == NULL) return NULL; + + observedP = observe_findByUri(contextP, uriP); + if (observedP == NULL || observedP->watcherList == NULL) return NULL; + + for (watcherP = observedP->watcherList; watcherP != NULL; watcherP = watcherP->next) + { + if (watcherP->server == serverP) + { + paramP = watcherP->parameters; + } + } + + return paramP; +} + static int prv_serializeAttributes(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, + lwm2m_server_t * serverP, + lwm2m_attributes_t * objectParamP, uint8_t * buffer, size_t uriLen, size_t bufferLen) { - lwm2m_observed_t * observedP; - lwm2m_watcher_t * watcherP; int head; int res; + lwm2m_attributes_t * paramP; - if (contextP == NULL) return 0; + head = 0; - observedP = observe_findByUri(contextP, uriP); - if (observedP == NULL || observedP->watcherList == NULL) return 0; + paramP = prv_findAttributes(contextP, uriP, serverP); + if (paramP == NULL) paramP = objectParamP; - head = 0; - for (watcherP = observedP->watcherList; watcherP != NULL; watcherP = watcherP->next) + if (paramP != NULL) { - lwm2m_attributes_t * paramP; - - paramP = watcherP->parameters; - if (paramP == NULL || paramP->toSet == 0) continue; + head = uriLen; - if (observedP->watcherList->next != NULL) + if (paramP->toSet & LWM2M_ATTR_FLAG_MIN_PERIOD) { - // multiple servers - memcpy(buffer + head, buffer, uriLen); - PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE); - PRV_CONCAT_STR(buffer, bufferLen, head, ATTR_SERVER_ID_STR, ATTR_SERVER_ID_LEN); + PRV_CONCAT_STR(buffer, bufferLen, head, ATTR_MIN_PERIOD_STR, ATTR_MIN_PERIOD_LEN); - res = utils_intToText(watcherP->server->shortID, buffer + head, bufferLen - head); + res = utils_intToText(paramP->minPeriod, buffer + head, bufferLen - head); if (res <= 0) return -1; head += res; } - else - { - head = uriLen; - } - - if (paramP->toSet & LWM2M_ATTR_FLAG_MIN_PERIOD) + else if (objectParamP->toSet & LWM2M_ATTR_FLAG_MIN_PERIOD) { PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE); PRV_CONCAT_STR(buffer, bufferLen, head, ATTR_MIN_PERIOD_STR, ATTR_MIN_PERIOD_LEN); - res = utils_intToText(paramP->minPeriod, buffer + head, bufferLen - head); + res = utils_intToText(objectParamP->minPeriod, buffer + head, bufferLen - head); if (res <= 0) return -1; head += res; } + if (paramP->toSet & LWM2M_ATTR_FLAG_MAX_PERIOD) { PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE); @@ -89,6 +107,16 @@ static int prv_serializeAttributes(lwm2m_context_t * contextP, if (res <= 0) return -1; head += res; } + else if (objectParamP->toSet & LWM2M_ATTR_FLAG_MAX_PERIOD) + { + PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE); + PRV_CONCAT_STR(buffer, bufferLen, head, ATTR_MAX_PERIOD_STR, ATTR_MAX_PERIOD_LEN); + + res = utils_intToText(objectParamP->maxPeriod, buffer + head, bufferLen - head); + if (res <= 0) return -1; + head += res; + } + if (paramP->toSet & LWM2M_ATTR_FLAG_GREATER_THAN) { PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE); @@ -119,13 +147,15 @@ static int prv_serializeAttributes(lwm2m_context_t * contextP, PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ITEM_ATTR_END, LINK_ITEM_ATTR_END_SIZE); } - if (head > 0) head -= uriLen; + if (head > 0) head -= uriLen + 1; return head; } static int prv_serializeLinkData(lwm2m_context_t * contextP, lwm2m_data_t * tlvP, + lwm2m_server_t * serverP, + lwm2m_attributes_t * objectParamP, lwm2m_uri_t * parentUriP, uint8_t * parentUriStr, size_t parentUriLen, @@ -188,13 +218,15 @@ static int prv_serializeLinkData(lwm2m_context_t * contextP, head += LINK_ITEM_END_SIZE; } - memcpy(&uri, parentUriP, sizeof(lwm2m_uri_t)); - uri.resourceId = tlvP->id; - uri.flag |= LWM2M_URI_FLAG_RESOURCE_ID; - res = prv_serializeAttributes(contextP, &uri, buffer, head - 1, bufferLen); - if (res < 0) return -1; // careful, 0 is valid - if (res > 0) head += res - 1; - + if (serverP != NULL) + { + memcpy(&uri, parentUriP, sizeof(lwm2m_uri_t)); + uri.resourceId = tlvP->id; + uri.flag |= LWM2M_URI_FLAG_RESOURCE_ID; + res = prv_serializeAttributes(contextP, &uri, serverP, objectParamP, buffer, head - 1, bufferLen); + if (res < 0) return -1; // careful, 0 is valid + if (res > 0) head += res; + } break; case LWM2M_TYPE_OBJECT_INSTANCE: @@ -230,14 +262,16 @@ static int prv_serializeLinkData(lwm2m_context_t * contextP, PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ITEM_START, LINK_ITEM_START_SIZE); PRV_CONCAT_STR(buffer, bufferLen, head, uriStr, uriLen); PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ITEM_END, LINK_ITEM_END_SIZE); - res = prv_serializeAttributes(contextP, &uri, buffer, head - 1, bufferLen); - if (res < 0) return -1; // careful, 0 is valid - if (res == 0) head = 0; // rewind - else head += res - 1; - + if (serverP != NULL) + { + res = prv_serializeAttributes(contextP, &uri, serverP, NULL, buffer, head - 1, bufferLen); + if (res < 0) return -1; // careful, 0 is valid + if (res == 0) head = 0; // rewind + else head += res; + } for (index = 0; index < tlvP->value.asChildren.count; index++) { - res = prv_serializeLinkData(contextP, tlvP->value.asChildren.array + index, &uri, uriStr, uriLen, buffer + head, bufferLen - head); + res = prv_serializeLinkData(contextP, tlvP->value.asChildren.array + index, serverP, objectParamP, &uri, uriStr, uriLen, buffer + head, bufferLen - head); if (res < 0) return -1; head += res; } @@ -253,10 +287,11 @@ static int prv_serializeLinkData(lwm2m_context_t * contextP, } int discover_serialize(lwm2m_context_t * contextP, - lwm2m_uri_t * uriP, - int size, - lwm2m_data_t * dataP, - uint8_t ** bufferP) + lwm2m_uri_t * uriP, + lwm2m_server_t * serverP, + int size, + lwm2m_data_t * dataP, + uint8_t ** bufferP) { uint8_t bufferLink[PRV_LINK_BUFFER_SIZE]; uint8_t baseUriStr[URI_MAX_STRING_LEN]; @@ -264,58 +299,131 @@ int discover_serialize(lwm2m_context_t * contextP, int index; size_t head; int res; - lwm2m_uri_t tempUri; + lwm2m_uri_t parentUri; + lwm2m_attributes_t * paramP; + lwm2m_attributes_t mergedParam; LOG_ARG("size: %d", size); LOG_URI(uriP); - baseUriLen = uri_toString(uriP, baseUriStr, URI_MAX_STRING_LEN, NULL); - if (baseUriLen < 0) return -1; - baseUriLen -= 1; head = 0; - memset(&tempUri, 0, sizeof(lwm2m_uri_t)); - - // get object level attributes - PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_ITEM_START, LINK_ITEM_START_SIZE); - PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_URI_SEPARATOR, LINK_URI_SEPARATOR_SIZE); - res = utils_intToText(uriP->objectId, bufferLink + head, PRV_LINK_BUFFER_SIZE - head); - if (res <= 0) return -1; - head += res; - PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_ITEM_END, LINK_ITEM_END_SIZE); - tempUri.objectId = uriP->objectId; - res = prv_serializeAttributes(contextP, &tempUri, bufferLink, head - 1, PRV_LINK_BUFFER_SIZE); - if (res < 0) return -1; // careful, 0 is valid - if (res == 0) head = 0; // rewind - else head += res - 1; - if (LWM2M_URI_IS_SET_INSTANCE(uriP)) + memset(&parentUri, 0, sizeof(lwm2m_uri_t)); + parentUri.objectId = uriP->objectId; + parentUri.flag = LWM2M_URI_FLAG_OBJECT_ID; + + if (LWM2M_URI_IS_SET_RESOURCE(uriP)) { - size_t subHead; + lwm2m_uri_t tempUri; + lwm2m_attributes_t * objParamP; + lwm2m_attributes_t * instParamP; + memset(&parentUri, 0, sizeof(lwm2m_uri_t)); + tempUri.objectId = uriP->objectId; + tempUri.flag = LWM2M_URI_FLAG_OBJECT_ID; + + // get object level attributes + objParamP = prv_findAttributes(contextP, &tempUri, serverP); + // get object instance level attributes - subHead = 0; - PRV_CONCAT_STR(bufferLink + head, PRV_LINK_BUFFER_SIZE - head, subHead, LINK_ITEM_START, LINK_ITEM_START_SIZE); - PRV_CONCAT_STR(bufferLink + head, PRV_LINK_BUFFER_SIZE - head, subHead, LINK_URI_SEPARATOR, LINK_URI_SEPARATOR_SIZE); - res = utils_intToText(uriP->objectId, bufferLink + head + subHead, PRV_LINK_BUFFER_SIZE - head - subHead); - if (res <= 0) return -1; - subHead += res; - PRV_CONCAT_STR(bufferLink + head, PRV_LINK_BUFFER_SIZE - head, subHead, LINK_URI_SEPARATOR, LINK_URI_SEPARATOR_SIZE); - res = utils_intToText(uriP->instanceId, bufferLink + head + subHead, PRV_LINK_BUFFER_SIZE - head - subHead); - if (res <= 0) return -1; - subHead += res; - PRV_CONCAT_STR(bufferLink + head, PRV_LINK_BUFFER_SIZE - head, subHead, LINK_ITEM_END, LINK_ITEM_END_SIZE); tempUri.instanceId = uriP->instanceId; tempUri.flag = LWM2M_URI_FLAG_INSTANCE_ID; - res = prv_serializeAttributes(contextP, &tempUri, bufferLink + head, head + subHead - 1, PRV_LINK_BUFFER_SIZE); - if (res < 0) return -1; // careful, 0 is valid - if (res == 0) subHead = 0; // rewind - else subHead += res - 1; + instParamP = prv_findAttributes(contextP, &tempUri, serverP); + + if (objParamP != NULL) + { + if (instParamP != NULL) + { + memset(&mergedParam, 0, sizeof(lwm2m_attributes_t)); + mergedParam.toSet = objParamP->toSet | instParamP->toSet; + if (mergedParam.toSet & LWM2M_ATTR_FLAG_MIN_PERIOD) + { + if (instParamP->toSet & LWM2M_ATTR_FLAG_MIN_PERIOD) + { + mergedParam.minPeriod = instParamP->minPeriod; + } + else + { + mergedParam.minPeriod = objParamP->minPeriod; + } + } + if (mergedParam.toSet & LWM2M_ATTR_FLAG_MAX_PERIOD) + { + if (instParamP->toSet & LWM2M_ATTR_FLAG_MAX_PERIOD) + { + mergedParam.maxPeriod = instParamP->maxPeriod; + } + else + { + mergedParam.maxPeriod = objParamP->maxPeriod; + } + } + paramP = &mergedParam; + } + else + { + paramP = objParamP; + } + } + else + { + paramP = instParamP; + } + uriP->flag &= ~LWM2M_URI_FLAG_RESOURCE_ID; + } + else + { + paramP = NULL; - head += subHead; + if (LWM2M_URI_IS_SET_INSTANCE(uriP)) + { + PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_ITEM_START, LINK_ITEM_START_SIZE); + PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_URI_SEPARATOR, LINK_URI_SEPARATOR_SIZE); + res = utils_intToText(uriP->objectId, bufferLink + head, PRV_LINK_BUFFER_SIZE - head); + if (res <= 0) return -1; + head += res; + PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_URI_SEPARATOR, LINK_URI_SEPARATOR_SIZE); + res = utils_intToText(uriP->instanceId, bufferLink + head, PRV_LINK_BUFFER_SIZE - head); + if (res <= 0) return -1; + head += res; + PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_ITEM_END, LINK_ITEM_END_SIZE); + parentUri.instanceId = uriP->instanceId; + parentUri.flag = LWM2M_URI_FLAG_INSTANCE_ID; + if (serverP != NULL) + { + res = prv_serializeAttributes(contextP, &parentUri, serverP, NULL, bufferLink, head - 1, PRV_LINK_BUFFER_SIZE); + if (res < 0) return -1; // careful, 0 is valid + } + else + { + res = 0; + } + head += res; + } + else + { + PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_ITEM_START, LINK_ITEM_START_SIZE); + PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_URI_SEPARATOR, LINK_URI_SEPARATOR_SIZE); + res = utils_intToText(uriP->objectId, bufferLink + head, PRV_LINK_BUFFER_SIZE - head); + if (res <= 0) return -1; + head += res; + PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_ITEM_END, LINK_ITEM_END_SIZE); + + if (serverP != NULL) + { + res = prv_serializeAttributes(contextP, &parentUri, serverP, NULL, bufferLink, head - 1, PRV_LINK_BUFFER_SIZE); + if (res < 0) return -1; // careful, 0 is valid + head += res; + } + } } + baseUriLen = uri_toString(uriP, baseUriStr, URI_MAX_STRING_LEN, NULL); + if (baseUriLen < 0) return -1; + baseUriLen -= 1; + for (index = 0; index < size && head < PRV_LINK_BUFFER_SIZE; index++) { - res = prv_serializeLinkData(contextP, dataP + index, uriP, baseUriStr, baseUriLen, bufferLink + head, PRV_LINK_BUFFER_SIZE - head); + res = prv_serializeLinkData(contextP, dataP + index, serverP, paramP, uriP, baseUriStr, baseUriLen, bufferLink + head, PRV_LINK_BUFFER_SIZE - head); if (res < 0) return -1; head += res; } diff --git a/external/wakaama/core/er-coap-13/er-coap-13.c b/external/wakaama/core/er-coap-13/er-coap-13.c index 1e3cdc1..0828ec4 100644 --- a/external/wakaama/core/er-coap-13/er-coap-13.c +++ b/external/wakaama/core/er-coap-13/er-coap-13.c @@ -120,11 +120,11 @@ size_t coap_set_option_header(unsigned int delta, size_t length, uint8_t *buffer) { size_t written = 0; + unsigned int *x = δ buffer[0] = coap_option_nibble(delta)<<4 | coap_option_nibble(length); /* avoids code duplication without function overhead */ - unsigned int *x = δ do { if (*x>268) @@ -610,6 +610,11 @@ coap_status_t coap_parse_message(void *packet, uint8_t *data, uint16_t data_len) { coap_packet_t *const coap_pkt = (coap_packet_t *) packet; + uint8_t *current_option; + unsigned int option_number = 0; + unsigned int option_delta = 0; + size_t option_length = 0; + unsigned int *x; /* Initialize packet */ memset(coap_pkt, 0, sizeof(coap_packet_t)); @@ -630,7 +635,7 @@ coap_parse_message(void *packet, uint8_t *data, uint16_t data_len) return BAD_REQUEST_4_00; } - uint8_t *current_option = data + COAP_HEADER_LEN; + current_option = data + COAP_HEADER_LEN; if (coap_pkt->token_len != 0) { @@ -652,10 +657,6 @@ coap_parse_message(void *packet, uint8_t *data, uint16_t data_len) /* parse options */ current_option += coap_pkt->token_len; - unsigned int option_number = 0; - unsigned int option_delta = 0; - size_t option_length = 0; - while (current_option < data+data_len) { /* Payload marker 0xFF, currently only checking for 0xF* because rest is reserved */ @@ -672,7 +673,7 @@ coap_parse_message(void *packet, uint8_t *data, uint16_t data_len) ++current_option; /* avoids code duplication without function overhead */ - unsigned int *x = &option_delta; + x = &option_delta; do { if (*x==13) @@ -1034,7 +1035,7 @@ coap_get_header_proxy_uri(void *packet, const char **uri) if (!IS_OPTION(coap_pkt, COAP_OPTION_PROXY_URI)) return 0; - *uri = coap_pkt->proxy_uri; + *uri = (const char *)coap_pkt->proxy_uri; return coap_pkt->proxy_uri_len; } @@ -1043,7 +1044,7 @@ coap_set_header_proxy_uri(void *packet, const char *uri) { coap_packet_t *const coap_pkt = (coap_packet_t *) packet; - coap_pkt->proxy_uri = uri; + coap_pkt->proxy_uri = (uint8_t *)uri; coap_pkt->proxy_uri_len = strlen(uri); SET_OPTION(coap_pkt, COAP_OPTION_PROXY_URI); @@ -1215,7 +1216,7 @@ coap_get_header_location_query(void *packet, const char **query) if (!IS_OPTION(coap_pkt, COAP_OPTION_LOCATION_QUERY)) return 0; - *query = coap_pkt->location_query; + *query = (const char*)coap_pkt->location_query; return coap_pkt->location_query_len; } @@ -1226,7 +1227,7 @@ coap_set_header_location_query(void *packet, char *query) while (query[0]=='?') ++query; - coap_pkt->location_query = query; + coap_pkt->location_query = (uint8_t *)query; coap_pkt->location_query_len = strlen(query); SET_OPTION(coap_pkt, COAP_OPTION_LOCATION_QUERY); diff --git a/external/wakaama/core/er-coap-13/er-coap-13.h b/external/wakaama/core/er-coap-13/er-coap-13.h index 430dba2..8eed09f 100644 --- a/external/wakaama/core/er-coap-13/er-coap-13.h +++ b/external/wakaama/core/er-coap-13/er-coap-13.h @@ -56,6 +56,9 @@ #define COAP_DEFAULT_MAX_AGE 60 #define COAP_RESPONSE_TIMEOUT 2 #define COAP_MAX_RETRANSMIT 4 +#define COAP_ACK_RANDOM_FACTOR 1.5 + +#define COAP_MAX_TRANSMIT_WAIT ((COAP_RESPONSE_TIMEOUT * ( (1 << (COAP_MAX_RETRANSMIT + 1) ) - 1) * COAP_ACK_RANDOM_FACTOR)) #define COAP_HEADER_LEN 4 /* | version:0x03 type:0x0C tkl:0xF0 | code | mid:0x00FF | mid:0xFF00 | */ #define COAP_ETAG_LEN 8 /* The maximum number of bytes for the ETag */ @@ -84,9 +87,6 @@ #define COAP_MAX_PACKET_SIZE (COAP_MAX_HEADER_SIZE + REST_MAX_CHUNK_SIZE) /* 0/14 48 for IPv6 (28 for IPv4) */ -// #if COAP_MAX_PACKET_SIZE > (UIP_BUFSIZE - UIP_LLH_LEN - UIP_IPUDPH_LEN) -//#error "UIP_CONF_BUFFER_SIZE too small for REST_MAX_CHUNK_SIZE" -// #endif /* Bitmap for set options */ @@ -171,6 +171,7 @@ typedef enum { COAP_OPTION_BLOCK1 = 27, /* 1-3 B */ COAP_OPTION_SIZE = 28, /* 0-4 B */ COAP_OPTION_PROXY_URI = 35, /* 1-270 B */ + OPTION_MAX_VALUE = 0xFFFF } coap_option_t; /* CoAP Content-Types */ @@ -197,7 +198,7 @@ typedef enum { APPLICATION_SOAP_FASTINFOSET = 49, APPLICATION_JSON = 50, APPLICATION_X_OBIX_BINARY = 51, - APPLICATION_FILLER=65535, + CONTENT_MAX_VALUE = 0xFFFF } coap_content_type_t; typedef struct _multi_option_t { @@ -302,8 +303,8 @@ typedef struct { #define COAP_SERIALIZE_BLOCK_OPTION(number, field, text) \ if (IS_OPTION(coap_pkt, number)) \ { \ - PRINTF(text" [%lu%s (%u B/blk)]\n", coap_pkt->field##_num, coap_pkt->field##_more ? "+" : "", coap_pkt->field##_size); \ uint32_t block = coap_pkt->field##_num << 4; \ + PRINTF(text" [%lu%s (%u B/blk)]\n", coap_pkt->field##_num, coap_pkt->field##_more ? "+" : "", coap_pkt->field##_size); \ if (coap_pkt->field##_more) block |= 0x8; \ block |= 0xF & coap_log_2(coap_pkt->field##_size/16); \ PRINTF(text" encoded: 0x%lX\n", block); \ diff --git a/external/wakaama/core/internals.h b/external/wakaama/core/internals.h index d848c3e..8632357 100644 --- a/external/wakaama/core/internals.h +++ b/external/wakaama/core/internals.h @@ -83,13 +83,17 @@ ((S) == STATE_REGISTERED ? "STATE_REGISTERED" : \ ((S) == STATE_REG_FAILED ? "STATE_REG_FAILED" : \ ((S) == STATE_REG_UPDATE_PENDING ? "STATE_REG_UPDATE_PENDING" : \ +((S) == STATE_REG_UPDATE_NEEDED ? "STATE_REG_UPDATE_NEEDED" : \ +((S) == STATE_REG_FULL_UPDATE_NEEDED ? "STATE_REG_FULL_UPDATE_NEEDED" : \ ((S) == STATE_DEREG_PENDING ? "STATE_DEREG_PENDING" : \ ((S) == STATE_BS_HOLD_OFF ? "STATE_BS_HOLD_OFF" : \ ((S) == STATE_BS_INITIATED ? "STATE_BS_INITIATED" : \ ((S) == STATE_BS_PENDING ? "STATE_BS_PENDING" : \ ((S) == STATE_BS_FINISHED ? "STATE_BS_FINISHED" : \ +((S) == STATE_BS_FINISHING ? "STATE_BS_FINISHING" : \ +((S) == STATE_BS_FAILING ? "STATE_BS_FAILING" : \ ((S) == STATE_BS_FAILED ? "STATE_BS_FAILED" : \ -"Unknown"))))))))))) +"Unknown"))))))))))))))) #define STR_MEDIA_TYPE(M) \ ((M) == LWM2M_CONTENT_TEXT ? "LWM2M_CONTENT_TEXT" : \ ((M) == LWM2M_CONTENT_LINK ? "LWM2M_CONTENT_LINK" : \ @@ -114,7 +118,7 @@ #define LWM2M_DEFAULT_LIFETIME 86400 #ifdef LWM2M_SUPPORT_JSON -#define REG_LWM2M_RESOURCE_TYPE ">;rt=\"oma.lwm2m\";ct=1543," // Temporary value +#define REG_LWM2M_RESOURCE_TYPE ">;rt=\"oma.lwm2m\";ct=11543," #define REG_LWM2M_RESOURCE_TYPE_LEN 25 #else #define REG_LWM2M_RESOURCE_TYPE ">;rt=\"oma.lwm2m\"," @@ -135,8 +139,9 @@ #define URI_BOOTSTRAP_SEGMENT "bs" #define URI_BOOTSTRAP_SEGMENT_LEN 2 -#define QUERY_TEMPLATE "ep=" -#define QUERY_LENGTH 3 // strlen("ep=") +#define QUERY_STARTER "?" +#define QUERY_NAME "ep=" +#define QUERY_NAME_LEN 3 // strlen("ep=") #define QUERY_SMS "sms=" #define QUERY_SMS_LEN 4 #define QUERY_LIFETIME "lt=" @@ -147,8 +152,11 @@ #define QUERY_BINDING_LEN 2 #define QUERY_DELIMITER "&" -#define QUERY_VERSION_FULL "lwm2m=1.0" -#define QUERY_VERSION_FULL_LEN 9 +#define LWM2M_VERSION "1.0" +#define LWM2M_VERSION_LEN 3 + +#define QUERY_VERSION_FULL QUERY_VERSION LWM2M_VERSION +#define QUERY_VERSION_FULL_LEN QUERY_VERSION_LEN+LWM2M_VERSION_LEN #define REG_URI_START '<' #define REG_URI_END '>' @@ -161,8 +169,8 @@ #define REG_ATTR_TYPE_VALUE_LEN 11 #define REG_ATTR_CONTENT_KEY "ct" #define REG_ATTR_CONTENT_KEY_LEN 2 -#define REG_ATTR_CONTENT_JSON "1543" // Temporary value -#define REG_ATTR_CONTENT_JSON_LEN 4 +#define REG_ATTR_CONTENT_JSON "11543" // Temporary value +#define REG_ATTR_CONTENT_JSON_LEN 5 #define ATTR_SERVER_ID_STR "ep=" #define ATTR_SERVER_ID_LEN 3 @@ -207,6 +215,7 @@ typedef struct { + uint16_t clientID; lwm2m_uri_t uri; lwm2m_result_callback_t callback; void * userData; @@ -242,7 +251,7 @@ coap_status_t object_write(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m coap_status_t object_create(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_media_type_t format, uint8_t * buffer, size_t length); coap_status_t object_execute(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, uint8_t * buffer, size_t length); coap_status_t object_delete(lwm2m_context_t * contextP, lwm2m_uri_t * uriP); -coap_status_t object_discover(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, uint8_t ** bufferP, size_t * lengthP); +coap_status_t object_discover(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_server_t * serverP, uint8_t ** bufferP, size_t * lengthP); uint8_t object_checkReadable(lwm2m_context_t * contextP, lwm2m_uri_t * uriP); uint8_t object_checkNumeric(lwm2m_context_t * contextP, lwm2m_uri_t * uriP); bool object_isInstanceNew(lwm2m_context_t * contextP, uint16_t objectId, uint16_t instanceId); @@ -252,7 +261,7 @@ coap_status_t object_createInstance(lwm2m_context_t * contextP, lwm2m_uri_t * ur coap_status_t object_writeInstance(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_data_t * dataP); // defined in transaction.c -lwm2m_transaction_t * transaction_new(coap_message_type_t type, coap_method_t method, char * altPath, lwm2m_uri_t * uriP, uint16_t mID, uint8_t token_len, uint8_t* token, lwm2m_endpoint_type_t peerType, void * peerP); +lwm2m_transaction_t * transaction_new(void * sessionH, coap_method_t method, char * altPath, lwm2m_uri_t * uriP, uint16_t mID, uint8_t token_len, uint8_t* token); int transaction_send(lwm2m_context_t * contextP, lwm2m_transaction_t * transacP); void transaction_free(lwm2m_transaction_t * transacP); void transaction_remove(lwm2m_context_t * contextP, lwm2m_transaction_t * transacP); @@ -268,7 +277,7 @@ void observe_cancel(lwm2m_context_t * contextP, uint16_t mid, void * fromSession coap_status_t observe_setParameters(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_server_t * serverP, lwm2m_attributes_t * attrP); void observe_step(lwm2m_context_t * contextP, time_t currentTime, time_t * timeoutP); bool observe_handleNotify(lwm2m_context_t * contextP, void * fromSessionH, coap_packet_t * message, coap_packet_t * response); -void observe_remove(lwm2m_client_t * clientP, lwm2m_observation_t * observationP); +void observe_remove(lwm2m_observation_t * observationP); lwm2m_observed_t * observe_findByUri(lwm2m_context_t * contextP, lwm2m_uri_t * uriP); // defined in registration.c @@ -293,16 +302,20 @@ lwm2m_status_t bootstrap_getStatus(lwm2m_context_t * contextP); // defined in tlv.c int tlv_parse(uint8_t * buffer, size_t bufferLen, lwm2m_data_t ** dataP); -size_t tlv_serialize(bool isResourceInstance, int size, lwm2m_data_t * dataP, uint8_t ** bufferP); +int tlv_serialize(bool isResourceInstance, int size, lwm2m_data_t * dataP, uint8_t ** bufferP); // defined in json.c #ifdef LWM2M_SUPPORT_JSON int json_parse(lwm2m_uri_t * uriP, uint8_t * buffer, size_t bufferLen, lwm2m_data_t ** dataP); -size_t json_serialize(lwm2m_uri_t * uriP, int size, lwm2m_data_t * tlvP, uint8_t ** bufferP); +int json_serialize(lwm2m_uri_t * uriP, int size, lwm2m_data_t * tlvP, uint8_t ** bufferP); #endif // defined in discover.c -int discover_serialize(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, int size, lwm2m_data_t * dataP, uint8_t ** bufferP); +int discover_serialize(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_server_t * serverP, int size, lwm2m_data_t * dataP, uint8_t ** bufferP); + +// defined in block1.c +coap_status_t coap_block1_handler(lwm2m_block1_data_t ** block1Data, uint16_t mid, uint8_t * buffer, size_t length, uint16_t blockSize, uint32_t blockNum, bool blockMore, uint8_t ** outputBuffer, size_t * outputLength); +void free_block1_buffer(lwm2m_block1_data_t * block1Data); // defined in utils.c lwm2m_data_type_t utils_depthToDatatype(uri_depth_t depth); diff --git a/external/wakaama/core/json.c b/external/wakaama/core/json.c index 77f21e6..6932cf4 100644 --- a/external/wakaama/core/json.c +++ b/external/wakaama/core/json.c @@ -1211,14 +1211,16 @@ int prv_serializeData(lwm2m_data_t * tlvP, return head; } -static size_t prv_findAndCheckData(lwm2m_uri_t * uriP, - uri_depth_t level, - size_t size, - lwm2m_data_t * tlvP, - lwm2m_data_t ** targetP) +static int prv_findAndCheckData(lwm2m_uri_t * uriP, + uri_depth_t level, + size_t size, + lwm2m_data_t * tlvP, + lwm2m_data_t ** targetP) { size_t index; - size_t result; + int result; + + if (size == 0) return 0; if (size > 1) { @@ -1229,7 +1231,7 @@ static size_t prv_findAndCheckData(lwm2m_uri_t * uriP, if (tlvP[index].type != tlvP[0].type) { *targetP = NULL; - return 0; + return -1; } } } @@ -1240,21 +1242,21 @@ static size_t prv_findAndCheckData(lwm2m_uri_t * uriP, if (tlvP[index].type == LWM2M_TYPE_OBJECT || tlvP[index].type == LWM2M_TYPE_OBJECT_INSTANCE) { *targetP = NULL; - return 0; + return -1; } } } } *targetP = NULL; - result = 0; + result = -1; switch (level) { case URI_DEPTH_OBJECT: if (tlvP[0].type == LWM2M_TYPE_OBJECT) { *targetP = tlvP; - result = size; + result = (int)size; } break; @@ -1272,7 +1274,7 @@ static size_t prv_findAndCheckData(lwm2m_uri_t * uriP, break; case LWM2M_TYPE_OBJECT_INSTANCE: *targetP = tlvP; - result = size; + result = (int)size; break; default: break; @@ -1302,7 +1304,7 @@ static size_t prv_findAndCheckData(lwm2m_uri_t * uriP, break; default: *targetP = tlvP; - result = size; + result = (int)size; break; } break; @@ -1339,7 +1341,7 @@ static size_t prv_findAndCheckData(lwm2m_uri_t * uriP, break; default: *targetP = tlvP; - result = size; + result = (int)size; break; } break; @@ -1351,29 +1353,29 @@ static size_t prv_findAndCheckData(lwm2m_uri_t * uriP, return result; } -size_t json_serialize(lwm2m_uri_t * uriP, - int size, - lwm2m_data_t * tlvP, - uint8_t ** bufferP) +int json_serialize(lwm2m_uri_t * uriP, + int size, + lwm2m_data_t * tlvP, + uint8_t ** bufferP) { - size_t index; + int index; size_t head; uint8_t bufferJSON[PRV_JSON_BUFFER_SIZE]; uint8_t baseUriStr[URI_MAX_STRING_LEN]; int baseUriLen; uri_depth_t rootLevel; - size_t num; + int num; lwm2m_data_t * targetP; LOG_ARG("size: %d", size); LOG_URI(uriP); - if (size == 0 || tlvP == NULL) return 0; + if (size != 0 && tlvP == NULL) return -1; baseUriLen = uri_toString(uriP, baseUriStr, URI_MAX_STRING_LEN, &rootLevel); - if (baseUriLen < 0) return 0; + if (baseUriLen < 0) return -1; num = prv_findAndCheckData(uriP, rootLevel, size, tlvP, &targetP); - if (num == 0) return num; + if (num < 0) return -1; while (num == 1 && (targetP->type == LWM2M_TYPE_OBJECT @@ -1418,8 +1420,10 @@ size_t json_serialize(lwm2m_uri_t * uriP, if (head + JSON_FOOTER_SIZE - 1 > PRV_JSON_BUFFER_SIZE) return 0; - memcpy(bufferJSON + head - 1, JSON_FOOTER, JSON_FOOTER_SIZE); - head = head - 1 + JSON_FOOTER_SIZE; + if (num > 0) head = head - 1; + + memcpy(bufferJSON + head, JSON_FOOTER, JSON_FOOTER_SIZE); + head = head + JSON_FOOTER_SIZE; *bufferP = (uint8_t *)lwm2m_malloc(head); if (*bufferP == NULL) return 0; diff --git a/external/wakaama/core/liblwm2m.c b/external/wakaama/core/liblwm2m.c index d19a5f2..e636494 100644 --- a/external/wakaama/core/liblwm2m.c +++ b/external/wakaama/core/liblwm2m.c @@ -67,7 +67,7 @@ lwm2m_context_t * lwm2m_init(void * userData) { memset(contextP, 0, sizeof(lwm2m_context_t)); contextP->userData = userData; - srand(time(NULL)); + srand((int)lwm2m_gettime()); contextP->nextMID = rand(); } @@ -94,6 +94,7 @@ static void prv_deleteServer(lwm2m_server_t * serverP) { lwm2m_free(serverP->location); } + free_block1_buffer(serverP->block1Data); lwm2m_free(serverP); } @@ -108,10 +109,23 @@ static void prv_deleteServerList(lwm2m_context_t * context) } } -static void prv_deleteBootstrapServerList(lwm2m_context_t * contextP) +static void prv_deleteBootstrapServer(lwm2m_server_t * serverP) { - LWM2M_LIST_FREE(contextP->bootstrapServerList); - contextP->bootstrapServerList = NULL; + // TODO should we free location as in prv_deleteServer ? + // TODO should we parse transaction and observation to remove the ones related to this server ? + free_block1_buffer(serverP->block1Data); + lwm2m_free(serverP); +} + +static void prv_deleteBootstrapServerList(lwm2m_context_t * context) +{ + while (NULL != context->bootstrapServerList) + { + lwm2m_server_t * server; + server = context->bootstrapServerList; + context->bootstrapServerList = server->next; + prv_deleteBootstrapServer(server); + } } static void prv_deleteObservedList(lwm2m_context_t * contextP) @@ -217,7 +231,7 @@ static int prv_refreshServerList(lwm2m_context_t * contextP) if (!targetP->dirty) { // TODO: Should we revert the status to STATE_DEREGISTERED ? - contextP->serverList = (lwm2m_server_t *)LWM2M_LIST_ADD(contextP->serverList, targetP);; + contextP->serverList = (lwm2m_server_t *)LWM2M_LIST_ADD(contextP->serverList, targetP); } else { @@ -321,7 +335,6 @@ int lwm2m_add_object(lwm2m_context_t * contextP, int lwm2m_remove_object(lwm2m_context_t * contextP, uint16_t id) { - uint16_t i; lwm2m_object_t * targetP; LOG_ARG("ID: %d", id); diff --git a/external/wakaama/core/liblwm2m.h b/external/wakaama/core/liblwm2m.h index be637af..a1f91ed 100644 --- a/external/wakaama/core/liblwm2m.h +++ b/external/wakaama/core/liblwm2m.h @@ -141,12 +141,16 @@ bool lwm2m_session_is_equal(void * session1, void * session2, void * userData); #define COAP_202_DELETED (uint8_t)0x42 #define COAP_204_CHANGED (uint8_t)0x44 #define COAP_205_CONTENT (uint8_t)0x45 +#define COAP_231_CONTINUE (uint8_t)0x5F #define COAP_400_BAD_REQUEST (uint8_t)0x80 #define COAP_401_UNAUTHORIZED (uint8_t)0x81 #define COAP_402_BAD_OPTION (uint8_t)0x82 #define COAP_404_NOT_FOUND (uint8_t)0x84 #define COAP_405_METHOD_NOT_ALLOWED (uint8_t)0x85 #define COAP_406_NOT_ACCEPTABLE (uint8_t)0x86 +#define COAP_408_REQ_ENTITY_INCOMPLETE (uint8_t)0x88 +#define COAP_412_PRECONDITION_FAILED (uint8_t)0x8C +#define COAP_413_ENTITY_TOO_LARGE (uint8_t)0x8D #define COAP_500_INTERNAL_SERVER_ERROR (uint8_t)0xA0 #define COAP_501_NOT_IMPLEMENTED (uint8_t)0xA1 #define COAP_503_SERVICE_UNAVAILABLE (uint8_t)0xA3 @@ -162,7 +166,6 @@ bool lwm2m_session_is_equal(void * session1, void * session2, void * userData); #define LWM2M_FIRMWARE_UPDATE_OBJECT_ID 5 #define LWM2M_LOCATION_OBJECT_ID 6 #define LWM2M_CONN_STATS_OBJECT_ID 7 -#define LWM2M_POWER_MONITOR_OBJECT_ID 8 /* * Ressource IDs for the LWM2M Security Object @@ -179,6 +182,7 @@ bool lwm2m_session_is_equal(void * session1, void * session2, void * userData); #define LWM2M_SECURITY_SMS_SERVER_NUMBER_ID 9 #define LWM2M_SECURITY_SHORT_SERVER_ID 10 #define LWM2M_SECURITY_HOLD_OFF_ID 11 +#define LWM2M_SECURITY_BOOTSTRAP_TIMEOUT_ID 12 /* * Ressource IDs for the LWM2M Server Object @@ -310,6 +314,11 @@ struct _lwm2m_data_t size_t count; lwm2m_data_t * array; } asChildren; + struct + { + uint16_t objectId; + uint16_t objectInstanceId; + } asObjLink; } value; }; @@ -318,13 +327,15 @@ typedef enum LWM2M_CONTENT_TEXT = 0, // Also used as undefined LWM2M_CONTENT_LINK = 40, LWM2M_CONTENT_OPAQUE = 42, - LWM2M_CONTENT_TLV = 1542, // Temporary value - LWM2M_CONTENT_JSON = 1543 // Temporary value + LWM2M_CONTENT_TLV_OLD = 1542, // Keep old value for backward-compatibility + LWM2M_CONTENT_TLV = 11542, + LWM2M_CONTENT_JSON_OLD = 1543, // Keep old value for backward-compatibility + LWM2M_CONTENT_JSON = 11543 } lwm2m_media_type_t; lwm2m_data_t * lwm2m_data_new(int size); int lwm2m_data_parse(lwm2m_uri_t * uriP, uint8_t * buffer, size_t bufferLen, lwm2m_media_type_t format, lwm2m_data_t ** dataP); -size_t lwm2m_data_serialize(lwm2m_uri_t * uriP, int size, lwm2m_data_t * dataP, lwm2m_media_type_t * formatP, uint8_t ** bufferP); +int lwm2m_data_serialize(lwm2m_uri_t * uriP, int size, lwm2m_data_t * dataP, lwm2m_media_type_t * formatP, uint8_t ** bufferP); void lwm2m_data_free(int size, lwm2m_data_t * dataP); void lwm2m_data_encode_string(const char * string, lwm2m_data_t * dataP); @@ -336,6 +347,7 @@ void lwm2m_data_encode_float(double value, lwm2m_data_t * dataP); int lwm2m_data_decode_float(const lwm2m_data_t * dataP, double * valueP); void lwm2m_data_encode_bool(bool value, lwm2m_data_t * dataP); int lwm2m_data_decode_bool(const lwm2m_data_t * dataP, bool * valueP); +void lwm2m_data_encode_objlink(uint16_t objectId, uint16_t objectInstanceId, lwm2m_data_t * dataP); void lwm2m_data_encode_instances(lwm2m_data_t * subDataP, size_t count, lwm2m_data_t * dataP); void lwm2m_data_include(lwm2m_data_t * subDataP, size_t count, lwm2m_data_t * dataP); @@ -401,17 +413,21 @@ struct _lwm2m_object_t typedef enum { - STATE_DEREGISTERED = 0, // not registered or boostrap not started - STATE_REG_PENDING, // registration pending - STATE_REGISTERED, // successfully registered - STATE_REG_FAILED, // last registration failed - STATE_REG_UPDATE_PENDING, // registration update pending - STATE_DEREG_PENDING, // deregistration pending - STATE_BS_HOLD_OFF, // bootstrap hold off time - STATE_BS_INITIATED, // bootstrap request sent - STATE_BS_PENDING, // boostrap on going - STATE_BS_FINISHED, // bootstrap done - STATE_BS_FAILED, // bootstrap failed + STATE_DEREGISTERED = 0, // not registered or boostrap not started + STATE_REG_PENDING, // registration pending + STATE_REGISTERED, // successfully registered + STATE_REG_FAILED, // last registration failed + STATE_REG_UPDATE_PENDING, // registration update pending + STATE_REG_UPDATE_NEEDED, // registration update required + STATE_REG_FULL_UPDATE_NEEDED, // registration update with objects required + STATE_DEREG_PENDING, // deregistration pending + STATE_BS_HOLD_OFF, // bootstrap hold off time + STATE_BS_INITIATED, // bootstrap request sent + STATE_BS_PENDING, // boostrap ongoing + STATE_BS_FINISHING, // boostrap finish received + STATE_BS_FINISHED, // bootstrap done + STATE_BS_FAILING, // bootstrap error occurred + STATE_BS_FAILED, // bootstrap failed } lwm2m_status_t; typedef enum @@ -425,18 +441,34 @@ typedef enum BINDING_UQS // UDP queue mode plus SMS } lwm2m_binding_t; +/* + * LWM2M block1 data + * + * Temporary data needed to handle block1 request. + * Currently support only one block1 request by server. + */ +typedef struct _lwm2m_block1_data_ lwm2m_block1_data_t; + +struct _lwm2m_block1_data_ +{ + uint8_t * block1buffer; // data buffer + size_t block1bufferSize; // buffer size + uint16_t lastmid; // mid of the last message received +}; + typedef struct _lwm2m_server_ { - struct _lwm2m_server_ * next; // matches lwm2m_list_t::next - uint16_t secObjInstID; // matches lwm2m_list_t::id - uint16_t shortID; // servers short ID, may be 0 for bootstrap server - time_t lifetime; // lifetime of the registration in sec or 0 if default value (86400 sec), also used as hold off time for bootstrap servers - time_t registration; // date of the last registration in sec or end of client hold off time for bootstrap servers - lwm2m_binding_t binding; // client connection mode with this server - void * sessionH; - lwm2m_status_t status; - char * location; - bool dirty; + struct _lwm2m_server_ * next; // matches lwm2m_list_t::next + uint16_t secObjInstID; // matches lwm2m_list_t::id + uint16_t shortID; // servers short ID, may be 0 for bootstrap server + time_t lifetime; // lifetime of the registration in sec or 0 if default value (86400 sec), also used as hold off time for bootstrap servers + time_t registration; // date of the last registration in sec or end of client hold off time for bootstrap servers + lwm2m_binding_t binding; // client connection mode with this server + void * sessionH; + lwm2m_status_t status; + char * location; + bool dirty; + lwm2m_block1_data_t * block1Data; // buffer to handle block1 data, should be replace by a list to support several block1 transfer by server. } lwm2m_server_t; @@ -529,13 +561,6 @@ typedef struct _lwm2m_client_ * Adaptation of Erbium's coap_transaction_t */ -typedef enum -{ - ENDPOINT_UNKNOWN = 0, - ENDPOINT_CLIENT, - ENDPOINT_SERVER -} lwm2m_endpoint_type_t; - typedef struct _lwm2m_transaction_ lwm2m_transaction_t; typedef void (*lwm2m_transaction_callback_t) (lwm2m_transaction_t * transacP, void * message); @@ -544,8 +569,7 @@ struct _lwm2m_transaction_ { lwm2m_transaction_t * next; // matches lwm2m_list_t::next uint16_t mID; // matches lwm2m_list_t::id - lwm2m_endpoint_type_t peerType; - void * peerP; + void * peerH; uint8_t ack_received; // indicates, that the ACK was received time_t response_timeout; // timeout to wait for response, if token is used. When 0, use calculated acknowledge timeout. uint8_t retrans_counter; diff --git a/external/wakaama/core/management.c b/external/wakaama/core/management.c index e8cd13e..da13557 100644 --- a/external/wakaama/core/management.c +++ b/external/wakaama/core/management.c @@ -170,7 +170,15 @@ coap_status_t dm_handleRequest(lwm2m_context_t * contextP, LOG_ARG("Code: %02X, server status: %s", message->code, STR_STATUS(serverP->status)); LOG_URI(uriP); - format = utils_convertMediaType(message->content_type); + + if (IS_OPTION(message, COAP_OPTION_CONTENT_TYPE)) + { + format = utils_convertMediaType(message->content_type); + } + else + { + format = LWM2M_CONTENT_TLV; + } if (uriP->objectId == LWM2M_SECURITY_OBJECT_ID) { @@ -178,7 +186,9 @@ coap_status_t dm_handleRequest(lwm2m_context_t * contextP, } if (serverP->status != STATE_REGISTERED - && serverP->status != STATE_REG_UPDATE_PENDING) + && serverP->status != STATE_REG_UPDATE_NEEDED + && serverP->status != STATE_REG_FULL_UPDATE_NEEDED + && serverP->status != STATE_REG_UPDATE_PENDING) { return COAP_IGNORE; } @@ -191,6 +201,7 @@ coap_status_t dm_handleRequest(lwm2m_context_t * contextP, { uint8_t * buffer = NULL; size_t length = 0; + int res; if (IS_OPTION(message, COAP_OPTION_OBSERVE)) { @@ -203,13 +214,14 @@ coap_status_t dm_handleRequest(lwm2m_context_t * contextP, result = observe_handleRequest(contextP, uriP, serverP, size, dataP, message, response); if (COAP_205_CONTENT == result) { - length = lwm2m_data_serialize(uriP, size, dataP, &format, &buffer); - if (length == 0) + res = lwm2m_data_serialize(uriP, size, dataP, &format, &buffer); + if (res < 0) { result = COAP_500_INTERNAL_SERVER_ERROR; } else { + length = (size_t)res; LOG_ARG("Observe Request[/%d/%d/%d]: %.*s\n", uriP->objectId, uriP->instanceId, uriP->resourceId, length, buffer); } } @@ -220,11 +232,16 @@ coap_status_t dm_handleRequest(lwm2m_context_t * contextP, && message->accept_num == 1 && message->accept[0] == APPLICATION_LINK_FORMAT) { - format = APPLICATION_LINK_FORMAT; - result = object_discover(contextP, uriP, &buffer, &length); + format = LWM2M_CONTENT_LINK; + result = object_discover(contextP, uriP, serverP, &buffer, &length); } else { + if (IS_OPTION(message, COAP_OPTION_ACCEPT)) + { + format = utils_convertMediaType(message->accept[0]); + } + result = object_read(contextP, uriP, &format, &buffer, &length); } if (COAP_205_CONTENT == result) @@ -341,7 +358,7 @@ static void prv_resultCallback(lwm2m_transaction_t * transacP, if (message == NULL) { - dataP->callback(((lwm2m_client_t*)transacP->peerP)->internalID, + dataP->callback(dataP->clientID, &dataP->uri, COAP_503_SERVICE_UNAVAILABLE, LWM2M_CONTENT_TEXT, NULL, 0, @@ -380,7 +397,7 @@ static void prv_resultCallback(lwm2m_transaction_t * transacP, lwm2m_free(locationString); } - dataP->callback(((lwm2m_client_t*)transacP->peerP)->internalID, + dataP->callback(dataP->clientID, &dataP->uri, packet->code, utils_convertMediaType(packet->content_type), @@ -408,10 +425,14 @@ static int prv_makeOperation(lwm2m_context_t * contextP, clientP = (lwm2m_client_t *)lwm2m_list_find((lwm2m_list_t *)contextP->clientList, clientID); if (clientP == NULL) return COAP_404_NOT_FOUND; - transaction = transaction_new(COAP_TYPE_CON, method, clientP->altPath, uriP, contextP->nextMID++, 4, NULL, ENDPOINT_CLIENT, (void *)clientP); + transaction = transaction_new(clientP->sessionH, method, clientP->altPath, uriP, contextP->nextMID++, 4, NULL); if (transaction == NULL) return COAP_500_INTERNAL_SERVER_ERROR; - if (buffer != NULL) + if (method == COAP_GET) + { + coap_set_header_accept(transaction->message, format); + } + else if (buffer != NULL) { coap_set_header_content_type(transaction->message, format); // TODO: Take care of fragmentation @@ -427,6 +448,7 @@ static int prv_makeOperation(lwm2m_context_t * contextP, return COAP_500_INTERNAL_SERVER_ERROR; } memcpy(&dataP->uri, uriP, sizeof(lwm2m_uri_t)); + dataP->clientID = clientP->internalID; dataP->callback = callback; dataP->userData = userData; @@ -445,13 +467,29 @@ int lwm2m_dm_read(lwm2m_context_t * contextP, lwm2m_result_callback_t callback, void * userData) { + lwm2m_client_t * clientP; + lwm2m_media_type_t format; + LOG_ARG("clientID: %d", clientID); LOG_URI(uriP); + + clientP = (lwm2m_client_t *)lwm2m_list_find((lwm2m_list_t *)contextP->clientList, clientID); + if (clientP == NULL) return COAP_404_NOT_FOUND; + + if (clientP->supportJSON == true) + { + format = LWM2M_CONTENT_JSON; + } + else + { + format = LWM2M_CONTENT_TLV; + } + return prv_makeOperation(contextP, clientID, uriP, - COAP_GET, - LWM2M_CONTENT_TEXT, - NULL, 0, - callback, userData); + COAP_GET, + format, + NULL, 0, + callback, userData); } int lwm2m_dm_write(lwm2m_context_t * contextP, @@ -520,6 +558,7 @@ int lwm2m_dm_create(lwm2m_context_t * contextP, { LOG_ARG("clientID: %d, format: %s, length: %d", clientID, STR_MEDIA_TYPE(format), length); LOG_URI(uriP); + if (LWM2M_URI_IS_SET_INSTANCE(uriP) || length == 0) { @@ -578,7 +617,7 @@ int lwm2m_dm_write_attributes(lwm2m_context_t * contextP, clientP = (lwm2m_client_t *)lwm2m_list_find((lwm2m_list_t *)contextP->clientList, clientID); if (clientP == NULL) return COAP_404_NOT_FOUND; - transaction = transaction_new(COAP_TYPE_CON, COAP_PUT, clientP->altPath, uriP, contextP->nextMID++, 4, NULL, ENDPOINT_CLIENT, (void *)clientP); + transaction = transaction_new(clientP->sessionH, COAP_PUT, clientP->altPath, uriP, contextP->nextMID++, 4, NULL); if (transaction == NULL) return COAP_500_INTERNAL_SERVER_ERROR; if (callback != NULL) @@ -592,6 +631,7 @@ int lwm2m_dm_write_attributes(lwm2m_context_t * contextP, return COAP_500_INTERNAL_SERVER_ERROR; } memcpy(&dataP->uri, uriP, sizeof(lwm2m_uri_t)); + dataP->clientID = clientP->internalID; dataP->callback = callback; dataP->userData = userData; @@ -707,7 +747,7 @@ int lwm2m_dm_discover(lwm2m_context_t * contextP, clientP = (lwm2m_client_t *)lwm2m_list_find((lwm2m_list_t *)contextP->clientList, clientID); if (clientP == NULL) return COAP_404_NOT_FOUND; - transaction = transaction_new(COAP_TYPE_CON, COAP_GET, clientP->altPath, uriP, contextP->nextMID++, 4, NULL, ENDPOINT_CLIENT, (void *)clientP); + transaction = transaction_new(clientP->sessionH, COAP_GET, clientP->altPath, uriP, contextP->nextMID++, 4, NULL); if (transaction == NULL) return COAP_500_INTERNAL_SERVER_ERROR; coap_set_header_accept(transaction->message, LWM2M_CONTENT_LINK); @@ -721,6 +761,7 @@ int lwm2m_dm_discover(lwm2m_context_t * contextP, return COAP_500_INTERNAL_SERVER_ERROR; } memcpy(&dataP->uri, uriP, sizeof(lwm2m_uri_t)); + dataP->clientID = clientP->internalID; dataP->callback = callback; dataP->userData = userData; diff --git a/external/wakaama/core/objects.c b/external/wakaama/core/objects.c index cd91cab..4883b31 100644 --- a/external/wakaama/core/objects.c +++ b/external/wakaama/core/objects.c @@ -141,7 +141,6 @@ coap_status_t object_readData(lwm2m_context_t * contextP, targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); if (NULL == targetP) return COAP_404_NOT_FOUND; if (NULL == targetP->readFunc) return COAP_405_METHOD_NOT_ALLOWED; - if (targetP->instanceList == NULL) return COAP_404_NOT_FOUND; if (LWM2M_URI_IS_SET_INSTANCE(uriP)) { @@ -165,25 +164,33 @@ coap_status_t object_readData(lwm2m_context_t * contextP, lwm2m_list_t * instanceP; int i; + result = COAP_205_CONTENT; + *sizeP = 0; for (instanceP = targetP->instanceList; instanceP != NULL ; instanceP = instanceP->next) { (*sizeP)++; } - *dataP = lwm2m_data_new(*sizeP); - if (*dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; - - result = COAP_205_CONTENT; - instanceP = targetP->instanceList; - i = 0; - while (instanceP != NULL && result == COAP_205_CONTENT) + if (*sizeP == 0) { - result = targetP->readFunc(instanceP->id, (int*)&((*dataP)[i].value.asChildren.count), &((*dataP)[i].value.asChildren.array), targetP); - (*dataP)[i].type = LWM2M_TYPE_OBJECT_INSTANCE; - (*dataP)[i].id = instanceP->id; - i++; - instanceP = instanceP->next; + *dataP = NULL; + } + else + { + *dataP = lwm2m_data_new(*sizeP); + if (*dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; + + instanceP = targetP->instanceList; + i = 0; + while (instanceP != NULL && result == COAP_205_CONTENT) + { + result = targetP->readFunc(instanceP->id, (int*)&((*dataP)[i].value.asChildren.count), &((*dataP)[i].value.asChildren.array), targetP); + (*dataP)[i].type = LWM2M_TYPE_OBJECT_INSTANCE; + (*dataP)[i].id = instanceP->id; + i++; + instanceP = instanceP->next; + } } } @@ -200,22 +207,21 @@ coap_status_t object_read(lwm2m_context_t * contextP, coap_status_t result; lwm2m_data_t * dataP = NULL; int size = 0; + int res; LOG_URI(uriP); result = object_readData(contextP, uriP, &size, &dataP); if (result == COAP_205_CONTENT) { - *lengthP = lwm2m_data_serialize(uriP, size, dataP, formatP, bufferP); - if (*lengthP == 0) + res = lwm2m_data_serialize(uriP, size, dataP, formatP, bufferP); + if (res < 0) { - if (*formatP != LWM2M_CONTENT_TEXT - || size != 1 - || dataP->type != LWM2M_TYPE_STRING - || dataP->value.asBuffer.length != 0) - { - result = COAP_500_INTERNAL_SERVER_ERROR; - } + result = COAP_500_INTERNAL_SERVER_ERROR; + } + else + { + *lengthP = (size_t)res; } } lwm2m_data_free(size, dataP); @@ -276,6 +282,7 @@ coap_status_t object_execute(lwm2m_context_t * contextP, targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); if (NULL == targetP) return COAP_404_NOT_FOUND; if (NULL == targetP->executeFunc) return COAP_405_METHOD_NOT_ALLOWED; + if (NULL == lwm2m_list_find(targetP->instanceList, uriP->instanceId)) return COAP_404_NOT_FOUND; return targetP->executeFunc(uriP->instanceId, uriP->resourceId, buffer, length, targetP); } @@ -292,6 +299,7 @@ coap_status_t object_create(lwm2m_context_t * contextP, uint8_t result; LOG_URI(uriP); + if (length == 0 || buffer == 0) { return COAP_400_BAD_REQUEST; @@ -380,6 +388,7 @@ coap_status_t object_delete(lwm2m_context_t * contextP, coap_status_t object_discover(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, + lwm2m_server_t * serverP, uint8_t ** bufferP, size_t * lengthP) { @@ -392,7 +401,6 @@ coap_status_t object_discover(lwm2m_context_t * contextP, targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); if (NULL == targetP) return COAP_404_NOT_FOUND; if (NULL == targetP->discoverFunc) return COAP_501_NOT_IMPLEMENTED; - if (targetP->instanceList == NULL) return COAP_404_NOT_FOUND; if (LWM2M_URI_IS_SET_INSTANCE(uriP)) { @@ -406,7 +414,6 @@ coap_status_t object_discover(lwm2m_context_t * contextP, if (dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; dataP->id = uriP->resourceId; - uriP->flag &= ~LWM2M_URI_FLAG_RESOURCE_ID; } result = targetP->discoverFunc(uriP->instanceId, &size, &dataP, targetP); @@ -417,25 +424,29 @@ coap_status_t object_discover(lwm2m_context_t * contextP, lwm2m_list_t * instanceP; int i; + result = COAP_205_CONTENT; + size = 0; for (instanceP = targetP->instanceList; instanceP != NULL ; instanceP = instanceP->next) { size++; } - dataP = lwm2m_data_new(size); - if (dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; - - result = COAP_205_CONTENT; - instanceP = targetP->instanceList; - i = 0; - while (instanceP != NULL && result == COAP_205_CONTENT) + if (size != 0) { - result = targetP->discoverFunc(instanceP->id, (int*)&(dataP[i].value.asChildren.count), &(dataP[i].value.asChildren.array), targetP); - dataP[i].type = LWM2M_TYPE_OBJECT_INSTANCE; - dataP[i].id = instanceP->id; - i++; - instanceP = instanceP->next; + dataP = lwm2m_data_new(size); + if (dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; + + instanceP = targetP->instanceList; + i = 0; + while (instanceP != NULL && result == COAP_205_CONTENT) + { + result = targetP->discoverFunc(instanceP->id, (int*)&(dataP[i].value.asChildren.count), &(dataP[i].value.asChildren.array), targetP); + dataP[i].type = LWM2M_TYPE_OBJECT_INSTANCE; + dataP[i].id = instanceP->id; + i++; + instanceP = instanceP->next; + } } } @@ -443,7 +454,7 @@ coap_status_t object_discover(lwm2m_context_t * contextP, { int len; - len = discover_serialize(contextP, uriP, size, dataP, bufferP); + len = discover_serialize(contextP, uriP, serverP, size, dataP, bufferP); if (len <= 0) result = COAP_500_INTERNAL_SERVER_ERROR; else *lengthP = len; } @@ -648,9 +659,6 @@ static int prv_getMandatoryInfo(lwm2m_object_t * objectP, return -1; } targetP->lifetime = value; - dataP[1].value.asBuffer.buffer = lwm2m_malloc(sizeof(uint8_t)); - *(dataP[1].value.asBuffer.buffer) = 'U'; - dataP[1].value.asBuffer.length = 1; targetP->binding = utils_stringToBinding(dataP[1].value.asBuffer.buffer, dataP[1].value.asBuffer.length); @@ -672,6 +680,7 @@ int object_getServers(lwm2m_context_t * contextP) lwm2m_list_t * securityInstP; // instanceID of the server in the LWM2M Security Object LOG("Entering"); + for (objectP = contextP->objectList; objectP != NULL; objectP = objectP->next) { if (objectP->objID == LWM2M_SECURITY_OBJECT_ID) diff --git a/external/wakaama/core/observe.c b/external/wakaama/core/observe.c index b5a2b1a..595d0ec 100644 --- a/external/wakaama/core/observe.c +++ b/external/wakaama/core/observe.c @@ -477,9 +477,7 @@ void observe_step(lwm2m_context_t * contextP, { bool notify = false; -#ifdef LWM2M_CLIENT_SHELL_ON if (watcherP->update == true) -#endif { // value changed, should we notify the server ? @@ -594,8 +592,7 @@ void observe_step(lwm2m_context_t * contextP, } if (watcherP->parameters != NULL - && (watcherP->parameters->toSet & LWM2M_ATTR_FLAG_MIN_PERIOD) != 0 - && (notify == true)) + && (watcherP->parameters->toSet & LWM2M_ATTR_FLAG_MIN_PERIOD) != 0) { LOG_ARG("Checking minimal period (%d s)", watcherP->parameters->minPeriod); @@ -606,13 +603,11 @@ void observe_step(lwm2m_context_t * contextP, if (*timeoutP > interval) *timeoutP = interval; notify = false; } -/*** else { LOG("Notify on minimal period"); notify = true; } -***/ } } @@ -636,8 +631,18 @@ void observe_step(lwm2m_context_t * contextP, { if (dataP != NULL) { - length = lwm2m_data_serialize(&targetP->uri, size, dataP, &format, &buffer); - if (length == 0) break; + int res; + + res = lwm2m_data_serialize(&targetP->uri, size, dataP, &format, &buffer); + if (res < 0) + { + break; + } + else + { + length = (size_t)res; + } + } else { @@ -722,11 +727,10 @@ static lwm2m_observation_t * prv_findObservationByURI(lwm2m_client_t * clientP, return targetP; } -void observe_remove(lwm2m_client_t * clientP, - lwm2m_observation_t * observationP) +void observe_remove(lwm2m_observation_t * observationP) { LOG("Entering"); - clientP->observationList = (lwm2m_observation_t *) LWM2M_LIST_RM(clientP->observationList, observationP->id, NULL); + observationP->clientP->observationList = (lwm2m_observation_t *) LWM2M_LIST_RM(observationP->clientP->observationList, observationP->id, NULL); lwm2m_free(observationP); } @@ -741,7 +745,7 @@ static void prv_obsRequestCallback(lwm2m_transaction_t * transacP, { case STATE_DEREG_PENDING: // Observation was canceled by the user. - observe_remove(((lwm2m_client_t*)transacP->peerP), observationP); + observe_remove(observationP); return; case STATE_REG_PENDING: @@ -768,16 +772,16 @@ static void prv_obsRequestCallback(lwm2m_transaction_t * transacP, if (code != COAP_205_CONTENT) { - observationP->callback(((lwm2m_client_t*)transacP->peerP)->internalID, + observationP->callback(observationP->clientP->internalID, &observationP->uri, code, LWM2M_CONTENT_TEXT, NULL, 0, observationP->userData); - observe_remove(((lwm2m_client_t*)transacP->peerP), observationP); + observe_remove(observationP); } else { - observationP->callback(((lwm2m_client_t*)transacP->peerP)->internalID, + observationP->callback(observationP->clientP->internalID, &observationP->uri, 0, packet->content_type, packet->payload, packet->payload_len, @@ -804,7 +808,7 @@ static void prv_obsCancelRequestCallback(lwm2m_transaction_t * transacP, if (code != COAP_205_CONTENT) { - cancelP->callbackP(((lwm2m_client_t*)transacP->peerP)->internalID, + cancelP->callbackP(cancelP->observationP->clientP->internalID, &cancelP->observationP->uri, code, LWM2M_CONTENT_TEXT, NULL, 0, @@ -812,14 +816,14 @@ static void prv_obsCancelRequestCallback(lwm2m_transaction_t * transacP, } else { - cancelP->callbackP(((lwm2m_client_t*)transacP->peerP)->internalID, + cancelP->callbackP(cancelP->observationP->clientP->internalID, &cancelP->observationP->uri, 0, packet->content_type, packet->payload, packet->payload_len, cancelP->userDataP); } - observe_remove(((lwm2m_client_t*)transacP->peerP), cancelP->observationP); + observe_remove(cancelP->observationP); lwm2m_free(cancelP); } @@ -860,7 +864,7 @@ int lwm2m_observe(lwm2m_context_t * contextP, token[2] = observationP->id >> 8; token[3] = observationP->id & 0xFF; - transactionP = transaction_new(COAP_TYPE_CON, COAP_GET, clientP->altPath, uriP, contextP->nextMID++, 4, token, ENDPOINT_CLIENT, (void *)clientP); + transactionP = transaction_new(clientP->sessionH, COAP_GET, clientP->altPath, uriP, contextP->nextMID++, 4, token); if (transactionP == NULL) { lwm2m_free(observationP); @@ -905,7 +909,7 @@ int lwm2m_observe_cancel(lwm2m_context_t * contextP, lwm2m_transaction_t * transactionP; cancellation_data_t * cancelP; - transactionP = transaction_new(COAP_TYPE_CON, COAP_GET, clientP->altPath, uriP, contextP->nextMID++, 0, NULL, ENDPOINT_CLIENT, (void *)clientP); + transactionP = transaction_new(clientP->sessionH, COAP_GET, clientP->altPath, uriP, contextP->nextMID++, 0, NULL); if (transactionP == NULL) { return COAP_500_INTERNAL_SERVER_ERROR; diff --git a/external/wakaama/core/packet.c b/external/wakaama/core/packet.c index a903725..82de962 100644 --- a/external/wakaama/core/packet.c +++ b/external/wakaama/core/packet.c @@ -246,17 +246,61 @@ void lwm2m_handle_packet(lwm2m_context_t * contextP, new_offset = block_offset; } - coap_error_code = handle_request(contextP, fromSessionH, message, response); - if (coap_error_code==NO_ERROR) + /* handle block1 option */ + if (IS_OPTION(message, COAP_OPTION_BLOCK1)) { - /* Apply blockwise transfers. */ - if ( IS_OPTION(message, COAP_OPTION_BLOCK1) && response->codeblock1Data, message->mid, message->payload, message->payload_len, block1_size, block1_num, block1_more, &complete_buffer, &complete_buffer_size); + + // if payload is complete, replace it in the coap message. + if (coap_error_code == NO_ERROR) + { + message->payload = complete_buffer; + message->payload_len = complete_buffer_size; + } + else if (coap_error_code == COAP_231_CONTINUE) + { + block1_size = MIN(block1_size, REST_MAX_CHUNK_SIZE); + coap_set_header_block1(response,block1_num, block1_more,block1_size); + } } - else if ( IS_OPTION(message, COAP_OPTION_BLOCK2) ) +#else + coap_error_code = COAP_501_NOT_IMPLEMENTED; +#endif + } + if (coap_error_code == NO_ERROR) + { + coap_error_code = handle_request(contextP, fromSessionH, message, response); + } + if (coap_error_code==NO_ERROR) + { + if ( IS_OPTION(message, COAP_OPTION_BLOCK2) ) { /* unchanged new_offset indicates that resource is unaware of blockwise transfer */ if (new_offset==block_offset) diff --git a/external/wakaama/core/registration.c b/external/wakaama/core/registration.c index 8970922..095a65f 100644 --- a/external/wakaama/core/registration.c +++ b/external/wakaama/core/registration.c @@ -71,7 +71,7 @@ static int prv_getRegistrationQuery(lwm2m_context_t * contextP, int index; int res; - index = utils_stringCopy(buffer, length, "?ep="); + index = utils_stringCopy(buffer, length, QUERY_STARTER QUERY_VERSION_FULL QUERY_DELIMITER QUERY_NAME); if (index < 0) return 0; res = utils_stringCopy(buffer + index, length - index, contextP->endpointName); if (res < 0) return 0; @@ -119,7 +119,7 @@ static void prv_handleRegistrationReply(lwm2m_transaction_t * transacP, void * message) { coap_packet_t * packet = (coap_packet_t *)message; - lwm2m_server_t * targetP = (lwm2m_server_t *)(transacP->peerP); + lwm2m_server_t * targetP = (lwm2m_server_t *)(transacP->userData); if (targetP->status == STATE_REG_PENDING) { @@ -185,7 +185,7 @@ static uint8_t prv_register(lwm2m_context_t * contextP, if (NULL == server->sessionH) return COAP_503_SERVICE_UNAVAILABLE; - transaction = transaction_new(COAP_TYPE_CON, COAP_POST, NULL, NULL, contextP->nextMID++, 4, NULL, ENDPOINT_SERVER, (void *)server); + transaction = transaction_new(server->sessionH, COAP_POST, NULL, NULL, contextP->nextMID++, 4, NULL); if (transaction == NULL) return COAP_500_INTERNAL_SERVER_ERROR; coap_set_header_uri_path(transaction->message, "/"URI_REGISTRATION_SEGMENT); @@ -208,14 +208,13 @@ static void prv_handleRegistrationUpdateReply(lwm2m_transaction_t * transacP, void * message) { coap_packet_t * packet = (coap_packet_t *)message; - lwm2m_server_t * targetP = (lwm2m_server_t *)(transacP->peerP); + lwm2m_server_t * targetP = (lwm2m_server_t *)(transacP->userData); if (targetP->status == STATE_REG_UPDATE_PENDING) { time_t tv_sec = lwm2m_gettime(); if (tv_sec >= 0) { - printf("update register\n"); targetP->registration = tv_sec; } if (packet != NULL && packet->code == COAP_204_CHANGED) @@ -239,7 +238,7 @@ static int prv_updateRegistration(lwm2m_context_t * contextP, uint8_t payload[512]; int payload_length; - transaction = transaction_new(COAP_TYPE_CON, COAP_POST, NULL, NULL, contextP->nextMID++, 4, NULL, ENDPOINT_SERVER, (void *)server); + transaction = transaction_new(server->sessionH, COAP_POST, NULL, NULL, contextP->nextMID++, 4, NULL); if (transaction == NULL) return COAP_500_INTERNAL_SERVER_ERROR; coap_set_header_uri_path(transaction->message, server->location); @@ -296,9 +295,28 @@ int lwm2m_update_registration(lwm2m_context_t * contextP, if (targetP->shortID == shortServerID) { // found the server, trigger the update transaction - if (targetP->status == STATE_REGISTERED) + if (targetP->status == STATE_REGISTERED + || targetP->status == STATE_REG_UPDATE_PENDING) { - return prv_updateRegistration(contextP, targetP, withObjects); + if (withObjects == true) + { + targetP->status = STATE_REG_FULL_UPDATE_NEEDED; + } + else + { + targetP->status = STATE_REG_UPDATE_NEEDED; + } + return COAP_NO_ERROR; + } + else if ((targetP->status == STATE_REG_FULL_UPDATE_NEEDED) + || (targetP->status == STATE_REG_UPDATE_NEEDED)) + { + // if REG (FULL) UPDATE is already set, returns COAP_NO_ERROR + if (withObjects == true) + { + targetP->status = STATE_REG_FULL_UPDATE_NEEDED; + } + return COAP_NO_ERROR; } else { @@ -308,9 +326,17 @@ int lwm2m_update_registration(lwm2m_context_t * contextP, } else { - if (targetP->status == STATE_REGISTERED) + if (targetP->status == STATE_REGISTERED + || targetP->status == STATE_REG_UPDATE_PENDING) { - result = prv_updateRegistration(contextP, targetP, withObjects); + if (withObjects == true) + { + targetP->status = STATE_REG_FULL_UPDATE_NEEDED; + } + else + { + targetP->status = STATE_REG_UPDATE_NEEDED; + } } } targetP = targetP->next; @@ -371,6 +397,8 @@ lwm2m_status_t registration_getStatus(lwm2m_context_t * contextP) switch (targetP->status) { case STATE_REGISTERED: + case STATE_REG_UPDATE_NEEDED: + case STATE_REG_FULL_UPDATE_NEEDED: case STATE_REG_UPDATE_PENDING: if (reg_status == STATE_REG_FAILED) { @@ -401,7 +429,7 @@ static void prv_handleDeregistrationReply(lwm2m_transaction_t * transacP, { lwm2m_server_t * targetP; - targetP = (lwm2m_server_t *)(transacP->peerP); + targetP = (lwm2m_server_t *)(transacP->userData); if (NULL != targetP) { if (targetP->status == STATE_DEREG_PENDING) @@ -427,7 +455,7 @@ void registration_deregister(lwm2m_context_t * contextP, return; } - transaction = transaction_new(COAP_TYPE_CON, COAP_DELETE, NULL, NULL, contextP->nextMID++, 4, NULL, ENDPOINT_SERVER, (void *)serverP); + transaction = transaction_new(serverP->sessionH, COAP_DELETE, NULL, NULL, contextP->nextMID++, 4, NULL); if (transaction == NULL) return; coap_set_header_uri_path(transaction->message, serverP->location); @@ -469,25 +497,27 @@ static int prv_getParameters(multi_option_t * query, char ** nameP, uint32_t * lifetimeP, char ** msisdnP, - lwm2m_binding_t * bindingP) + lwm2m_binding_t * bindingP, + char ** versionP) { *nameP = NULL; *lifetimeP = 0; *msisdnP = NULL; *bindingP = BINDING_UNKNOWN; + *versionP = NULL; while (query != NULL) { - if (lwm2m_strncmp((char *)query->data, QUERY_TEMPLATE, QUERY_LENGTH) == 0) + if (lwm2m_strncmp((char *)query->data, QUERY_NAME, QUERY_NAME_LEN) == 0) { if (*nameP != NULL) goto error; - if (query->len == QUERY_LENGTH) goto error; + if (query->len == QUERY_NAME_LEN) goto error; - *nameP = (char *)lwm2m_malloc(query->len - QUERY_LENGTH + 1); + *nameP = (char *)lwm2m_malloc(query->len - QUERY_NAME_LEN + 1); if (*nameP != NULL) { - memcpy(*nameP, query->data + QUERY_LENGTH, query->len - QUERY_LENGTH); - (*nameP)[query->len - QUERY_LENGTH] = 0; + memcpy(*nameP, query->data + QUERY_NAME_LEN, query->len - QUERY_NAME_LEN); + (*nameP)[query->len - QUERY_NAME_LEN] = 0; } } else if (lwm2m_strncmp((char *)query->data, QUERY_SMS, QUERY_SMS_LEN) == 0) @@ -517,10 +547,14 @@ static int prv_getParameters(multi_option_t * query, } else if (lwm2m_strncmp((char *)query->data, QUERY_VERSION, QUERY_VERSION_LEN) == 0) { - if ((query->len != QUERY_VERSION_FULL_LEN) - || (lwm2m_strncmp((char *)query->data, QUERY_VERSION_FULL, QUERY_VERSION_FULL_LEN) != 0)) + if (*versionP != NULL) goto error; + if (query->len == QUERY_VERSION_LEN) goto error; + + *versionP = (char *)lwm2m_malloc(query->len - QUERY_VERSION_LEN + 1); + if (*versionP != NULL) { - goto error; + memcpy(*versionP, query->data + QUERY_VERSION_LEN, query->len - QUERY_VERSION_LEN); + (*versionP)[query->len - QUERY_VERSION_LEN] = 0; } } else if (lwm2m_strncmp((char *)query->data, QUERY_BINDING, QUERY_BINDING_LEN) == 0) @@ -538,6 +572,7 @@ static int prv_getParameters(multi_option_t * query, error: if (*nameP != NULL) lwm2m_free(*nameP); if (*msisdnP != NULL) lwm2m_free(*msisdnP); + if (*versionP != NULL) lwm2m_free(*versionP); return -1; } @@ -556,6 +591,12 @@ static uint16_t prv_splitLinkAttribute(uint8_t * data, while (index < length && data[index] == ' ') index++; if (index == length) return 0; + if (data[index] == REG_ATTR_SEPARATOR) + { + index++; + } + if (index == length) return 0; + *keyStart = index; while (index < length && data[index] != REG_ATTR_EQUALS) index++; @@ -893,13 +934,14 @@ coap_status_t registration_handleRequest(lwm2m_context_t * contextP, uint32_t lifetime; char * msisdn; char * altPath; + char * version; lwm2m_binding_t binding; lwm2m_client_object_t * objects; bool supportJSON; lwm2m_client_t * clientP; char location[MAX_LOCATION_LENGTH]; - if (0 != prv_getParameters(message->uri_query, &name, &lifetime, &msisdn, &binding)) + if (0 != prv_getParameters(message->uri_query, &name, &lifetime, &msisdn, &binding, &version)) { return COAP_400_BAD_REQUEST; } @@ -915,19 +957,38 @@ coap_status_t registration_handleRequest(lwm2m_context_t * contextP, { case 0: // Register operation - - if (objects == NULL) + // Version is mandatory + if (version == NULL) { - lwm2m_free(name); + if (name != NULL) lwm2m_free(name); if (msisdn != NULL) lwm2m_free(msisdn); return COAP_400_BAD_REQUEST; } // Endpoint client name is mandatory if (name == NULL) { + lwm2m_free(version); + if (msisdn != NULL) lwm2m_free(msisdn); + return COAP_400_BAD_REQUEST; + } + // Object list is mandatory + if (objects == NULL) + { + lwm2m_free(version); + lwm2m_free(name); if (msisdn != NULL) lwm2m_free(msisdn); return COAP_400_BAD_REQUEST; } + // version must be 1.0 + if (strlen(version) != LWM2M_VERSION_LEN + || lwm2m_strncmp(version, LWM2M_VERSION, LWM2M_VERSION_LEN)) + { + lwm2m_free(version); + lwm2m_free(name); + if (msisdn != NULL) lwm2m_free(msisdn); + return COAP_412_PRECONDITION_FAILED; + } + if (lifetime == 0) { lifetime = LWM2M_DEFAULT_LIFETIME; @@ -1035,7 +1096,7 @@ coap_status_t registration_handleRequest(lwm2m_context_t * contextP, COAP_202_DELETED, LWM2M_CONTENT_TEXT, NULL, 0, observationP->userData); - observe_remove(clientP, observationP); + observe_remove(observationP); } else { @@ -1048,7 +1109,7 @@ coap_status_t registration_handleRequest(lwm2m_context_t * contextP, COAP_202_DELETED, LWM2M_CONTENT_TEXT, NULL, 0, observationP->userData); - observe_remove(clientP, observationP); + observe_remove(observationP); } } } @@ -1131,16 +1192,19 @@ void registration_step(lwm2m_context_t * contextP, time_t interval; nextUpdate = targetP->lifetime; - if (30 < nextUpdate) + if (COAP_MAX_TRANSMIT_WAIT < nextUpdate) + { + nextUpdate -= COAP_MAX_TRANSMIT_WAIT; + } + else { - nextUpdate -= 15; // update 15s earlier to have a chance to resend + nextUpdate = nextUpdate >> 1; } interval = targetP->registration + nextUpdate - currentTime; if (0 >= interval) { LOG("Updating registration"); - printf("update regmsg\n"); prv_updateRegistration(contextP, targetP, false); } else if (interval < *timeoutP) @@ -1150,6 +1214,14 @@ void registration_step(lwm2m_context_t * contextP, } break; + case STATE_REG_UPDATE_NEEDED: + prv_updateRegistration(contextP, targetP, false); + break; + + case STATE_REG_FULL_UPDATE_NEEDED: + prv_updateRegistration(contextP, targetP, true); + break; + case STATE_REG_FAILED: if (targetP->sessionH != NULL) { diff --git a/external/wakaama/core/tlv_lwm2m.c b/external/wakaama/core/tlv.c similarity index 85% rename from external/wakaama/core/tlv_lwm2m.c rename to external/wakaama/core/tlv.c index fde48b9..b1d9e4e 100644 --- a/external/wakaama/core/tlv_lwm2m.c +++ b/external/wakaama/core/tlv.c @@ -305,8 +305,8 @@ int tlv_parse(uint8_t * buffer, } -static size_t prv_getLength(int size, - lwm2m_data_t * dataP) +static int prv_getLength(int size, + lwm2m_data_t * dataP) { int length; int i; @@ -383,23 +383,16 @@ static size_t prv_getLength(int size, } } - if (length < 0) - { - return 0; - } - else - { - return (size_t)length; - } + return length; } -size_t tlv_serialize(bool isResourceInstance, - int size, - lwm2m_data_t * dataP, - uint8_t ** bufferP) +int tlv_serialize(bool isResourceInstance, + int size, + lwm2m_data_t * dataP, + uint8_t ** bufferP) { - size_t length; + int length; int index; int i; @@ -423,45 +416,61 @@ size_t tlv_serialize(bool isResourceInstance, { case LWM2M_TYPE_MULTIPLE_RESOURCE: isInstance = true; - // fall throught + // fall through case LWM2M_TYPE_OBJECT_INSTANCE: { uint8_t * tmpBuffer; - size_t tmpLength; + int res; - tmpLength = tlv_serialize(isInstance, dataP[i].value.asChildren.count, dataP[i].value.asChildren.array, &tmpBuffer); - if (tmpLength == 0) + res = tlv_serialize(isInstance, dataP[i].value.asChildren.count, dataP[i].value.asChildren.array, &tmpBuffer); + if (res < 0) { - length = 0; + length = -1; } else { + size_t tmpLength; + + tmpLength = (size_t)res; headerLen = prv_createHeader(*bufferP + index, false, dataP[i].type, dataP[i].id, tmpLength); index += headerLen; - memcpy(*bufferP + index, tmpBuffer, tmpLength); - index += tmpLength; - lwm2m_free(tmpBuffer); + if (tmpLength > 0) + { + memcpy(*bufferP + index, tmpBuffer, tmpLength); + index += tmpLength; + lwm2m_free(tmpBuffer); + } } } break; - case LWM2M_TYPE_STRING: - case LWM2M_TYPE_OPAQUE: - headerLen = prv_createHeader(*bufferP + index, isInstance, dataP[i].type, dataP[i].id, dataP[i].value.asBuffer.length); - if (headerLen == 0) - { - length = 0; - } - else + case LWM2M_TYPE_OBJECT_LINK: { + int k; + uint8_t buf[4]; + uint32_t v = dataP[i].value.asObjLink.objectId; + v <<= 16; + v |= dataP[i].value.asObjLink.objectInstanceId; + for (k = 3; k >= 0; --k) { + buf[k] = (uint8_t)(v & 0xFF); + v >>= 8; + } + // keep encoding as buffer + headerLen = prv_createHeader(*bufferP + index, isInstance, dataP[i].type, dataP[i].id, 4); index += headerLen; - memcpy(*bufferP + index, dataP[i].value.asBuffer.buffer, dataP[i].value.asBuffer.length); - index += dataP[i].value.asBuffer.length; + memcpy(*bufferP + index, buf, 4); + index += 4; } break; - case LWM2M_TYPE_OBJECT_LINK: - // Object Link is a four-bytes integer + case LWM2M_TYPE_STRING: + case LWM2M_TYPE_OPAQUE: + headerLen = prv_createHeader(*bufferP + index, isInstance, dataP[i].type, dataP[i].id, dataP[i].value.asBuffer.length); + index += headerLen; + memcpy(*bufferP + index, dataP[i].value.asBuffer.buffer, dataP[i].value.asBuffer.length); + index += dataP[i].value.asBuffer.length; + break; + case LWM2M_TYPE_INTEGER: { size_t data_len; @@ -469,16 +478,9 @@ size_t tlv_serialize(bool isResourceInstance, data_len = utils_encodeInt(dataP[i].value.asInteger, data_buffer); headerLen = prv_createHeader(*bufferP + index, isInstance, dataP[i].type, dataP[i].id, data_len); - if (headerLen == 0) - { - length = 0; - } - else - { - index += headerLen; - memcpy(*bufferP + index, data_buffer, data_len); - index += data_len; - } + index += headerLen; + memcpy(*bufferP + index, data_buffer, data_len); + index += data_len; } break; @@ -489,42 +491,29 @@ size_t tlv_serialize(bool isResourceInstance, data_len = utils_encodeFloat(dataP[i].value.asFloat, data_buffer); headerLen = prv_createHeader(*bufferP + index, isInstance, dataP[i].type, dataP[i].id, data_len); - if (headerLen == 0) - { - length = 0; - } - else - { - index += headerLen; - memcpy(*bufferP + index, data_buffer, data_len); - index += data_len; - } + index += headerLen; + memcpy(*bufferP + index, data_buffer, data_len); + index += data_len; } break; case LWM2M_TYPE_BOOLEAN: headerLen = prv_createHeader(*bufferP + index, isInstance, dataP[i].type, dataP[i].id, 1); - if (headerLen == 0) - { - length = 0; - } - else - { - index += headerLen; - (*bufferP)[index] = dataP[i].value.asBoolean ? 1 : 0; - index += 1; - } + index += headerLen; + (*bufferP)[index] = dataP[i].value.asBoolean ? 1 : 0; + index += 1; break; default: - length = 0; + length = -1; break; } } - if (length == 0) + if (length < 0) { lwm2m_free(*bufferP); + *bufferP = NULL; } LOG_ARG("returning %u", length); diff --git a/external/wakaama/core/transaction.c b/external/wakaama/core/transaction.c index 0e4f6bb..2f968e7 100644 --- a/external/wakaama/core/transaction.c +++ b/external/wakaama/core/transaction.c @@ -141,36 +141,23 @@ static int prv_checkFinished(lwm2m_transaction_t * transacP, return 0; } -lwm2m_transaction_t * transaction_new(coap_message_type_t type, +lwm2m_transaction_t * transaction_new(void * sessionH, coap_method_t method, char * altPath, lwm2m_uri_t * uriP, uint16_t mID, uint8_t token_len, - uint8_t* token, - lwm2m_endpoint_type_t peerType, - void * peerP) + uint8_t* token) { lwm2m_transaction_t * transacP; int result; - LOG_ARG("type: %d, method: %d, altPath: \"%s\", mID: %d, token_len: %d", - type, method, altPath, mID, token_len); + LOG_ARG("method: %d, altPath: \"%s\", mID: %d, token_len: %d", + method, altPath, mID, token_len); LOG_URI(uriP); - // no transactions for ack or rst - if (COAP_TYPE_ACK == type || COAP_TYPE_RST == type) return NULL; - // no transactions without peer - if (NULL == peerP) return NULL; - - if (COAP_TYPE_NON == type) - { - // no transactions for NON responses - if (COAP_DELETE < method) return NULL; - // no transactions for NON request without token - if (0 == token_len) return NULL; - } + if (NULL == sessionH) return NULL; transacP = (lwm2m_transaction_t *)lwm2m_malloc(sizeof(lwm2m_transaction_t)); @@ -180,11 +167,11 @@ lwm2m_transaction_t * transaction_new(coap_message_type_t type, transacP->message = lwm2m_malloc(sizeof(coap_packet_t)); if (NULL == transacP->message) goto error; - coap_init_message(transacP->message, type, method, mID); + coap_init_message(transacP->message, COAP_TYPE_CON, method, mID); + + transacP->peerH = sessionH; transacP->mID = mID; - transacP->peerType = peerType; - transacP->peerP = peerP; if (altPath != NULL) { @@ -280,36 +267,7 @@ bool transaction_handleResponse(lwm2m_context_t * contextP, while (NULL != transacP) { - void * targetSessionH; - - targetSessionH = NULL; - switch (transacP->peerType) - { -#ifdef LWM2M_BOOTSTRAP_SERVER_MODE - case ENDPOINT_UNKNOWN: - targetSessionH = transacP->peerP; - break; -#endif -#ifdef LWM2M_SERVER_MODE - case ENDPOINT_CLIENT: - targetSessionH = ((lwm2m_client_t *)transacP->peerP)->sessionH; - break; -#endif - -#ifdef LWM2M_CLIENT_MODE - case ENDPOINT_SERVER: - if (NULL != transacP->peerP) - { - targetSessionH = ((lwm2m_server_t *)transacP->peerP)->sessionH; - } - break; -#endif - - default: - break; - } - - if (lwm2m_session_is_equal(fromSessionH, targetSessionH, contextP->userData) == true) + if (lwm2m_session_is_equal(fromSessionH, transacP->peerH, contextP->userData) == true) { if (!transacP->ack_received) { @@ -425,33 +383,7 @@ int transaction_send(lwm2m_context_t * contextP, if (COAP_MAX_RETRANSMIT + 1 >= transacP->retrans_counter) { - void * targetSessionH = NULL; - - switch (transacP->peerType) - { -#ifdef LWM2M_BOOTSTRAP_SERVER_MODE - case ENDPOINT_UNKNOWN: - targetSessionH = transacP->peerP; - break; -#endif -#ifdef LWM2M_SERVER_MODE - case ENDPOINT_CLIENT: - targetSessionH = ((lwm2m_client_t *)transacP->peerP)->sessionH; - break; -#endif -#ifdef LWM2M_CLIENT_MODE - case ENDPOINT_SERVER: - if (NULL != transacP->peerP) - { - targetSessionH = ((lwm2m_server_t *)transacP->peerP)->sessionH; - } - break; -#endif - default: - return COAP_500_INTERNAL_SERVER_ERROR; - } - - (void)lwm2m_buffer_send(targetSessionH, transacP->buffer, transacP->buffer_len, contextP->userData); + (void)lwm2m_buffer_send(transacP->peerH, transacP->buffer, transacP->buffer_len, contextP->userData); transacP->retrans_time += timeout; transacP->retrans_counter += 1; diff --git a/external/wakaama/core/uri_lwm2m.c b/external/wakaama/core/uri.c similarity index 100% rename from external/wakaama/core/uri_lwm2m.c rename to external/wakaama/core/uri.c diff --git a/external/wakaama/core/utils.c b/external/wakaama/core/utils.c index 09a62c4..48f9723 100644 --- a/external/wakaama/core/utils.c +++ b/external/wakaama/core/utils.c @@ -253,18 +253,15 @@ size_t utils_floatToText(double data, decLength = 0; if (decPart >= FLT_EPSILON) { - int i; double noiseFloor; if (intLength >= length - 1) return 0; - i = 0; noiseFloor = FLT_EPSILON; do { decPart *= 10; noiseFloor *= 10; - i++; } while (decPart - (int64_t)decPart > noiseFloor); decLength = utils_intToText(decPart, string + intLength, length - intLength); @@ -386,8 +383,12 @@ lwm2m_media_type_t utils_convertMediaType(coap_content_type_t type) return LWM2M_CONTENT_TEXT; case APPLICATION_OCTET_STREAM: return LWM2M_CONTENT_OPAQUE; + case LWM2M_CONTENT_TLV_OLD: + return LWM2M_CONTENT_TLV_OLD; case LWM2M_CONTENT_TLV: return LWM2M_CONTENT_TLV; + case LWM2M_CONTENT_JSON_OLD: + return LWM2M_CONTENT_JSON_OLD; case LWM2M_CONTENT_JSON: return LWM2M_CONTENT_JSON; case APPLICATION_LINK_FORMAT: @@ -499,7 +500,7 @@ int utils_intCopy(char * buffer, if (len == 0) return -1; if (len > length + 1) return -1; - memcpy(buffer, str + _PRV_INT32_MAX_STR_LEN - len, len); + memcpy(buffer, str, len); buffer[len] = 0; return len; diff --git a/external/wakaama/core/wakaama.cmake b/external/wakaama/core/wakaama.cmake index a8549e3..0f3a3e6 100644 --- a/external/wakaama/core/wakaama.cmake +++ b/external/wakaama/core/wakaama.cmake @@ -13,7 +13,7 @@ set(CORE_HEADERS set(WAKAAMA_SOURCES ${WAKAAMA_SOURCES_DIR}/liblwm2m.c - ${WAKAAMA_SOURCES_DIR}/uri_lwm2m.c + ${WAKAAMA_SOURCES_DIR}/uri.c ${WAKAAMA_SOURCES_DIR}/utils.c ${WAKAAMA_SOURCES_DIR}/objects.c ${WAKAAMA_SOURCES_DIR}/tlv.c @@ -27,7 +27,7 @@ set(WAKAAMA_SOURCES ${WAKAAMA_SOURCES_DIR}/observe.c ${WAKAAMA_SOURCES_DIR}/json.c ${WAKAAMA_SOURCES_DIR}/discover.c - ${CORE_HEADERS} + ${WAKAAMA_SOURCES_DIR}/block1.c ${EXT_SOURCES}) # This will not work for multi project cmake generators like the Visual Studio Generator diff --git a/external/wakaama/examples/bootstrap_server/CMakeLists.txt b/external/wakaama/examples/bootstrap_server/CMakeLists.txt index 3a95ff9..55abbeb 100644 --- a/external/wakaama/examples/bootstrap_server/CMakeLists.txt +++ b/external/wakaama/examples/bootstrap_server/CMakeLists.txt @@ -15,13 +15,13 @@ add_definitions(${SHARED_DEFINITIONS} ${WAKAAMA_DEFINITIONS}) include_directories (${WAKAAMA_SOURCES_DIR} ${SHARED_INCLUDE_DIRS}) SET(SOURCES - bootstrap_server.c - bootstrap_info.c - bootstrap_info.h + ${CMAKE_CURRENT_LIST_DIR}/bootstrap_server.c + ${CMAKE_CURRENT_LIST_DIR}/bootstrap_info.c + ${CMAKE_CURRENT_LIST_DIR}/bootstrap_info.h ) SET(AUXILIARY_FILES - bootstrap_server.ini) + ${CMAKE_CURRENT_LIST_DIR}/bootstrap_server.ini) add_executable(${PROJECT_NAME} ${SOURCES} ${AUXILIARY_FILES} ${WAKAAMA_SOURCES} ${SHARED_SOURCES}) diff --git a/external/wakaama/examples/bootstrap_server/bootstrap_info.c b/external/wakaama/examples/bootstrap_server/bootstrap_info.c index 6787494..dbb2e9b 100644 --- a/external/wakaama/examples/bootstrap_server/bootstrap_info.c +++ b/external/wakaama/examples/bootstrap_server/bootstrap_info.c @@ -360,6 +360,7 @@ static int prv_add_server(bs_info_t * infoP, int size; bs_server_tlv_t * serverP; lwm2m_media_type_t format; + int res; switch (dataP->securityMode) { @@ -418,8 +419,9 @@ static int prv_add_server(bs_info_t * infoP, } format = LWM2M_CONTENT_TLV; - serverP->securityLen = lwm2m_data_serialize(NULL, size, tlvP, &format, &(serverP->securityData)); - if (serverP->securityLen <= 0) goto error; + res = lwm2m_data_serialize(NULL, size, tlvP, &format, &(serverP->securityData)); + if (res <= 0) goto error; + serverP->securityLen = (size_t)res; lwm2m_data_free(size, tlvP); if (dataP->isBootstrap == false) @@ -444,8 +446,9 @@ static int prv_add_server(bs_info_t * infoP, tlvP[3].id = LWM2M_SERVER_BINDING_ID; lwm2m_data_encode_string("U", tlvP + 3); - serverP->serverLen = lwm2m_data_serialize(NULL, size, tlvP, &format, &(serverP->serverData)); - if (serverP->serverLen <= 0) goto error; + res = lwm2m_data_serialize(NULL, size, tlvP, &format, &(serverP->serverData)); + if (res <= 0) goto error; + serverP->serverLen = res; lwm2m_data_free(size, tlvP); } diff --git a/external/wakaama/examples/bootstrap_server/bootstrap_server.c b/external/wakaama/examples/bootstrap_server/bootstrap_server.c index 9f05966..aeb443e 100644 --- a/external/wakaama/examples/bootstrap_server/bootstrap_server.c +++ b/external/wakaama/examples/bootstrap_server/bootstrap_server.c @@ -565,7 +565,7 @@ int bootstrap_server_main(int argc, char *argv[]) fclose(fd); if (data.bsInfo == NULL) { - fprintf(stderr, "Reading Bootsrap Info from file %s failed.\r\n", filename); + fprintf(stderr, "Reading Bootstrap Info from file %s failed.\r\n", filename); return -1; } diff --git a/external/wakaama/examples/client/CMakeLists.txt b/external/wakaama/examples/client/CMakeLists.txt index a9c7f98..4a043b3 100644 --- a/external/wakaama/examples/client/CMakeLists.txt +++ b/external/wakaama/examples/client/CMakeLists.txt @@ -13,18 +13,18 @@ add_definitions(${SHARED_DEFINITIONS} ${WAKAAMA_DEFINITIONS}) include_directories (${WAKAAMA_SOURCES_DIR} ${SHARED_INCLUDE_DIRS}) SET(SOURCES - lwm2mclient.c - lwm2mclient.h - system_api.c - object_security.c - object_server.c - object_device.c - object_firmware.c - object_location.c - object_connectivity_moni.c - object_connectivity_stat.c - object_access_control.c - test_object.c + ${CMAKE_CURRENT_LIST_DIR}/lwm2mclient.c + ${CMAKE_CURRENT_LIST_DIR}/lwm2mclient.h + ${CMAKE_CURRENT_LIST_DIR}/system_api.c + ${CMAKE_CURRENT_LIST_DIR}/object_security.c + ${CMAKE_CURRENT_LIST_DIR}/object_server.c + ${CMAKE_CURRENT_LIST_DIR}/object_device.c + ${CMAKE_CURRENT_LIST_DIR}/object_firmware.c + ${CMAKE_CURRENT_LIST_DIR}/object_location.c + ${CMAKE_CURRENT_LIST_DIR}/object_connectivity_moni.c + ${CMAKE_CURRENT_LIST_DIR}/object_connectivity_stat.c + ${CMAKE_CURRENT_LIST_DIR}/object_access_control.c + ${CMAKE_CURRENT_LIST_DIR}/test_object.c ) add_executable(${PROJECT_NAME} ${SOURCES} ${WAKAAMA_SOURCES} ${SHARED_SOURCES}) diff --git a/external/wakaama/examples/client/Make.defs b/external/wakaama/examples/client/Make.defs index 56f8d47..f82ca77 100644 --- a/external/wakaama/examples/client/Make.defs +++ b/external/wakaama/examples/client/Make.defs @@ -35,13 +35,20 @@ ifeq ($(CONFIG_DM),y) -# Routing table support +CSRCS += lwm2mclient.c +CSRCS += object_connectivity_moni.c object_connectivity_stat.c +CSRCS += object_device.c +CSRCS += object_location.c +CSRCS += object_security.c -CSRCS += object_access_control.c object_connectivity_moni.c object_connectivity_stat.c object_device.c object_firmware.c object_location.c object_security.c object_server.c system_api.c test_object.c lwm2mclient.c common_monitor_interface.c connectivity_interface.c power_monitor_interface.c object_power_moni.c +# Interface API functions for dm frameworks +CSRCS += connectivity_interface.c CFLAGS+=-I$(TOPDIR)/../external/wakaama/core CFLAGS+=-I$(TOPDIR)/../external/wakaama/examples/shared +CFLAGS+=-D__TINYARA__ + DEPPATH += --dep-path wakaama/examples/client VPATH += :wakaama/examples/client diff --git a/external/wakaama/examples/client/common_monitor_interface.c b/external/wakaama/examples/client/common_monitor_interface.c deleted file mode 100644 index 87e08d4..0000000 --- a/external/wakaama/examples/client/common_monitor_interface.c +++ /dev/null @@ -1,159 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include "common_monitor_interface.h" - - -int readonce(FAR const char *filename, FAR char *buffer, uint8_t buflen) -{ - int ret; - - printf("opening %s\n", filename); - int fd = open(filename, O_RDONLY); - - memset(buffer, 0x00, buflen); - if (fd < 0) - { - printf("error reading file %s\n", filename); - return ERROR; - } - else - { - size_t nbytes; - - - /* Read until we hit the end of the file, until we have exhausted the - * buffer space, or until some irrecoverable error occurs - */ - - *buffer = '\0'; /* NUL terminate the empty buffer */ - ret = ERROR; /* Assume failure */ - - nbytes = read(fd, buffer, buflen); - printf("%d bytes read\n", nbytes); - if (nbytes < 0) - { - /* Read error */ - - int errcode = errno; - DEBUGASSERT(errcode > 0); - - /* EINTR is not a read error. It simply means that a signal was - * received while waiting for the read to complete. - */ - - if (errcode != EINTR) - { - /* Fatal error */ - - printf("EINTR error\n"); - } - } - else if (nbytes >= 0) - { - *(buffer+nbytes) = '\0'; - ret = OK; - } - - } - - /* Close the file and return. */ - - close(fd); - return ret; -} - -int readfile(FAR const char *filename, FAR char *buffer, uint8_t buflen) -{ - FAR char *bufptr; - size_t remaining; - ssize_t nread; - ssize_t ntotal; - int ret; - - printf("opening %s\n", filename); - int fd = open(filename, O_RDONLY); - - if (fd < 0) - { - printf("error reading file %s\n", filename); - return ERROR; - } - else - { - size_t nbytes; - - - /* Read until we hit the end of the file, until we have exhausted the - * buffer space, or until some irrecoverable error occurs - */ - - ntotal = 0; /* No bytes read yet */ - *buffer = '\0'; /* NUL terminate the empty buffer */ - bufptr = buffer; /* Working pointer */ - remaining = buflen - 1; /* Reserve one byte for a NUL terminator */ - ret = ERROR; /* Assume failure */ - - do { - nbytes = read(fd, buffer, buflen); - printf("%d bytes read\n", nbytes); - if (nbytes < 0) - { - /* Read error */ - - int errcode = errno; - DEBUGASSERT(errcode > 0); - - /* EINTR is not a read error. It simply means that a signal was - * received while waiting for the read to complete. - */ - - if (errcode != EINTR) - { - /* Fatal error */ - - printf("EINTR error\n"); - break; - } - } - else if (nbytes == 0) - { - /* End of file */ - - ret = OK; - break; - } - else - { - /* Successful read. Make sure that the buffer is null terminated */ - - DEBUGASSERT(nbytes <= remaining); - ntotal += nbytes; - buffer[ntotal] = '\0'; - - /* Bump up the read count and continuing reading to the end of - * file. - */ - - bufptr += nbytes; - remaining -= nbytes; - } - } while (buflen > 0); - } - - /* Close the file and return. */ - - close(fd); - return ret; -} - -void mount_procfs(void) -{ - int ret; - ret = mount(NULL, PROC_MOUNTPOINT, "procfs", 0, NULL); -} - diff --git a/external/wakaama/examples/client/common_monitor_interface.h b/external/wakaama/examples/client/common_monitor_interface.h deleted file mode 100644 index 5f58601..0000000 --- a/external/wakaama/examples/client/common_monitor_interface.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _COMMON_MONITOR_INTERFACE_H -#define _COMMON_MONITOR_INTERFACE_H -#include -#define PROC_BUFFER_LEN 128 -#define PROC_MOUNTPOINT "/proc" - -int readonce(FAR const char *filename, FAR char *buffer, uint8_t buflen); -int readfile(FAR const char *filename, FAR char *buffer, uint8_t buflen); -void mount_procfs(void); -#endif - diff --git a/external/wakaama/examples/client/connectivity_interface.c b/external/wakaama/examples/client/connectivity_interface.c index 3fc5627..f5c6754 100644 --- a/external/wakaama/examples/client/connectivity_interface.c +++ b/external/wakaama/examples/client/connectivity_interface.c @@ -1,16 +1,8 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -//#include "../../../../net/dualmac/csma.h" +#include +#include +#include #include "connectivity_interface.h" @@ -18,12 +10,6 @@ #include #endif -#include "common_monitor_interface.h" - - -uint8_t cm_iobuffer[PROC_BUFFER_LEN]; - - /*Read APIs*/ @@ -41,13 +27,11 @@ uint8_t cm_iobuffer[PROC_BUFFER_LEN]; void get_interface_name(char *mac) { #if defined(CONFIG_WICED) - strcpy(mac,"en1"); + strcpy(mac,"en1"); #elif defined(CONFIG_NET_ETHERNET) - strcpy(mac,"eth0"); + strcpy(mac,"eth0"); #elif defined(CONFIG_NET_802154) - strcpy(mac,"wlan0"); -#elif defined(CONFIG_ARCH_BOARD_SIDK_S5JT200) - strcpy(mac, "wl1"); + strcpy(mac,"wlan0"); #endif } @@ -65,17 +49,20 @@ void get_interface_name(char *mac) void get_ip_address(char *ipAddr) { - int ret; - uint8_t *filepath; - ret = mount(NULL, PROC_MOUNTPOINT, "procfs", 0, NULL); - printf("mount returns value %d\n", ret); - ret = asprintf(&filepath, "%s/connectivity/ipaddr", PROC_MOUNTPOINT); - ret = readonce(filepath, cm_iobuffer, PROC_BUFFER_LEN); - strncpy(ipAddr, cm_iobuffer, strlen(cm_iobuffer)); - if (ret == OK) - { - printf("IP addr is %s\n", ipAddr); - } + printf("Calling inet_ntop\n"); + char mac[4]; + get_interface_name(mac); +#ifdef CONFIG_NET_IPv4 + struct in_addr addr; + netlib_get_ipv4addr(mac, &addr); + inet_ntop(AF_INET, &addr, ipAddr, INET_ADDRSTRLEN); +#endif +#ifdef CONFIG_NET_IPv6 + struct in6_addr addr; + netlib_get_ipv6addr(mac, &addr); + inet_ntop(AF_INET6, &addr, ipAddr, INET6_ADDRSTRLEN); +#endif + printf("After inet_ntop\n"); } /**************************************************************************** @@ -91,17 +78,17 @@ void get_ip_address(char *ipAddr) void get_router_ip_address(char *routerIPAddr) { - char mac[4]; - get_interface_name(mac); + char mac[4]; + get_interface_name(mac); #ifdef CONFIG_NET_IPv4 - struct in_addr addr; - netlib_get_dripv4addr(mac,addr); - inet_ntop(AF_INET, &addr, routerIPAddr, INET_ADDRSTRLEN); + struct in_addr addr; + netlib_get_dripv4addr(mac,addr); + inet_ntop(AF_INET, &addr, routerIPAddr, INET_ADDRSTRLEN); #endif #ifdef CONFIG_NET_IPv6 - struct in6_addr addr; - netlib_get_dripv6addr(mac,addr); - inet_ntop(AF_INET6, &addr, routerIPAddr, INET6_ADDRSTRLEN); + struct in6_addr addr; + netlib_get_dripv6addr(mac,addr); + inet_ntop(AF_INET6, &addr, routerIPAddr, INET6_ADDRSTRLEN); #endif } @@ -116,20 +103,12 @@ void get_router_ip_address(char *routerIPAddr) * ****************************************************************************/ -void get_signal_strength(int *rssi_value) +uint8_t get_signal_strength(void) { - int ret; - uint8_t *filepath; - ret = mount(NULL, PROC_MOUNTPOINT, "procfs", 0, NULL); - printf("mount returns value %d\n", ret); - ret = asprintf(&filepath, "%s/connectivity/rssi", PROC_MOUNTPOINT); - ret = readonce(filepath, cm_iobuffer, PROC_BUFFER_LEN); - if (ret == OK) - { -// *rssi_value = atoi(cm_iobuffer); - sscanf(cm_iobuffer, "%d", rssi_value); - printf("rssi is %d\n", *rssi_value); - } +#if defined(CONFIG_NET_802154) + return get_rssi(); +#endif + return -1; } /**************************************************************************** @@ -143,7 +122,7 @@ void get_signal_strength(int *rssi_value) * ****************************************************************************/ -int get_lqi() +int get_lqi(void) { #if defined(CONFIG_NET_802154) return get_lqi_val(); @@ -162,7 +141,7 @@ int get_lqi() * ****************************************************************************/ -int get_link_utilization() +int get_link_utilization(void) { return 0; } @@ -182,6 +161,7 @@ int get_link_utilization() int get_tx_data() { //TODO: Feature implementation + return 0; } /**************************************************************************** @@ -198,6 +178,7 @@ int get_tx_data() int get_rx_data() { ///TODO: Feature implementation + return 0; } /**************************************************************************** @@ -210,80 +191,8 @@ int get_rx_data() * * ****************************************************************************/ - int get_max_message_size() +int get_max_message_size() { ///TODO: Feature implementation + return 0; } - - -/**************************************************************************** - * Name: get_bitrate - * - * Description: - * Get bitrate - * - * Returned Value: - * - * - ****************************************************************************/ - void get_bitrate(int *bitrate) - { - int ret; - uint8_t *filepath; - ret = mount(NULL, PROC_MOUNTPOINT, "procfs", 0, NULL); - printf("mount returns value %d\n", ret); - ret = asprintf(&filepath, "%s/connectivity/bitrate", PROC_MOUNTPOINT); - ret = readonce(filepath, cm_iobuffer, PROC_BUFFER_LEN); - if (ret == OK) - { - *bitrate = atoi(cm_iobuffer); - } - } - -/**************************************************************************** - * Name: get_network_bearer - * - * Description: - * Get Network Bearer - * - * Returned Value: - * - * - ****************************************************************************/ -void get_network_bearer(int *nwbearer) -{ - int ret; - uint8_t *filepath; - ret = mount(NULL, PROC_MOUNTPOINT, "procfs", 0, NULL); - printf("mount returns value %d\n", ret); - ret = asprintf(&filepath, "%s/connectivity/nwbearer", PROC_MOUNTPOINT); - ret = readonce(filepath, cm_iobuffer, PROC_BUFFER_LEN); - if (ret == OK) - sscanf(cm_iobuffer, "%d", nwbearer); -} - -/**************************************************************************** - * Name: get_avl_network_bearer - * - * Description: - * Get Available Network Bearer - * - * Returned Value: - * - * - ****************************************************************************/ -void get_avl_network_bearer(int *nwbearer) -{ - int ret; - uint8_t *filepath; - ret = mount(NULL, PROC_MOUNTPOINT, "procfs", 0, NULL); - printf("mount returns value %d\n", ret); - ret = asprintf(&filepath, "%s/connectivity/available_bearer", PROC_MOUNTPOINT); - ret = readonce(filepath, cm_iobuffer, PROC_BUFFER_LEN); - if (ret == OK) - sscanf(cm_iobuffer, "%d", nwbearer); -} - - - - diff --git a/external/wakaama/examples/client/connectivity_interface.h b/external/wakaama/examples/client/connectivity_interface.h index 4556bdf..5efe0e8 100644 --- a/external/wakaama/examples/client/connectivity_interface.h +++ b/external/wakaama/examples/client/connectivity_interface.h @@ -1,6 +1,4 @@ - - /*Util Functions*/ /**************************************************************************** @@ -51,7 +49,7 @@ void get_ip_address(char *ipAddr); * Return the appropriate Callback flags * ****************************************************************************/ -void get_signal_strength(int *rssi_value); +uint8_t get_signal_strength(void); /**************************************************************************** * Name: get_link_utilization @@ -87,7 +85,6 @@ int get_lqi(void); * * ****************************************************************************/ - int get_tx_data(void); /**************************************************************************** @@ -100,7 +97,6 @@ int get_tx_data(void); * * ****************************************************************************/ - int get_rx_data(void); /**************************************************************************** @@ -114,41 +110,3 @@ int get_rx_data(void); * ****************************************************************************/ int get_max_message_size(void); - - -/**************************************************************************** - * Name: get_bitrate - * - * Description: - * Get bitrate - * - * Returned Value: - * - * - ****************************************************************************/ - void get_bitrate(int *bitrate); - - -/**************************************************************************** - * Name: get_network_bearer - * - * Description: - * Get Network Bearer - * - * Returned Value: - * - * - ****************************************************************************/ -void get_network_bearer(int *nwbearer); - -/**************************************************************************** - * Name: get_avl_network_bearer - * - * Description: - * Get Available Network Bearer - * - * Returned Value: - * - * - ****************************************************************************/ -void get_avl_network_bearer(int *nwbearer); diff --git a/external/wakaama/examples/client/lwm2mclient.c b/external/wakaama/examples/client/lwm2mclient.c index 6cf362e..5efc621 100644 --- a/external/wakaama/examples/client/lwm2mclient.c +++ b/external/wakaama/examples/client/lwm2mclient.c @@ -55,11 +55,6 @@ Bosch Software Innovations GmbH - Please refer to git log */ -#include -#include -#ifdef CONFIG_NET_LWIP - -//#include "object_connectivity_stat.h" #include "lwm2mclient.h" #include "liblwm2m.h" @@ -80,54 +75,44 @@ #include #include #include +#include #include #include #include -#include -#include -#include - -#include -#include - -#include -#include -#include +#define MAX_PACKET_SIZE 1024 +#define DEFAULT_SERVER_IPV6 "[::1]" +#define DEFAULT_SERVER_IPV4 "127.0.0.1" /**************************************************************************** - * Definitions + * TINYARA + * - definition and global variables + * - APIs used for dm frameworks ****************************************************************************/ +#if defined(__TINYARA__) -#if defined(CONFIG_NET_ETHERNET) && CONFIG_NET_ETHERNET == 1 -#if LWIP_HAVE_LOOPIF -#define NET_DEVNAME "en1" -#else -#define NET_DEVNAME "en0" +/* Definitions*/ +#ifndef FD_SETSIZE +#define FD_SETSIZE (CONFIG_NFILE_DESCRIPTORS + CONFIG_NSOCKET_DESCRIPTORS) #endif -#elif defined(CONFIG_NET_802154) && CONFIG_NET_802154 == 1 -#define NET_DEVNAME "wpan0" -#else -#error "undefined CONFIG_NET_, check your .config" + +#ifndef STDIN_FILENO +#define STDIN_FILENO 0 +#endif +#ifndef STDOUT_FILENO +#define STDOUT_FILENO 1 +#endif +#ifndef STDERR_FILENO +#define STDERR_FILENO 2 #endif -/**************************************************************************** - * Private Data - ****************************************************************************/ +#define SET_PARAM_DM_FRAMEWORK -10 -#define MAX_PACKET_SIZE 1024 -#define DEFAULT_SERVER_IPV6 "[::1]" -#define DEFAULT_SERVER_IPV4 "127.0.0.1" +#define DEFAULT_CLIENT_NAME "myawesomeclient" #define IPADDRLEN_MAX 32 #define PORTLEN_MAX 6 -#ifndef STDIN_FILENO -# define STDIN_FILENO 0 -#endif - -static int cc = 0; -int g_reboot = 0; -static int g_quit = 0; +/* Global variables */ static char g_serverAddr[IPADDRLEN_MAX]; static char g_serverPort[PORTLEN_MAX]; static char g_bootstrapserverAddr[IPADDRLEN_MAX]; @@ -135,749 +120,1368 @@ static char g_bootstrapserverPort[PORTLEN_MAX]; static uint16_t g_lifetime; bool g_bootstrapRequested; -#define OBJ_COUNT 10 -lwm2m_object_t *objArray[OBJ_COUNT]; +#endif /* __TINYARA__ */ + +int g_reboot = 0; +static int g_quit = 0; + +lwm2m_context_t * lwm2mH; + +#define OBJ_COUNT 9 +lwm2m_object_t * objArray[OBJ_COUNT]; // only backup security and server objects # define BACKUP_OBJECT_COUNT 2 -lwm2m_object_t *backupObjectArray[BACKUP_OBJECT_COUNT]; +lwm2m_object_t * backupObjectArray[BACKUP_OBJECT_COUNT]; -typedef struct { - lwm2m_object_t *securityObjP; - lwm2m_object_t *serverObject; - int sock; +typedef struct +{ + lwm2m_object_t * securityObjP; + lwm2m_object_t * serverObject; + int sock; #ifdef WITH_TINYDTLS - dtls_connection_t *connList; - lwm2m_context_t *lwm2mH; + dtls_connection_t * connList; + lwm2m_context_t * lwm2mH; #else - connection_t *connList; + connection_t * connList; #endif - int addressFamily; + int addressFamily; } client_data_t; -lwm2m_context_t *lwm2mH; -client_data_t data; +#if defined (__TINYARA__) +/* Private Functions */ +static void clear_client_globals(void); +static void prv_close_sock(void); +static void prv_update_server(client_data_t *dataP, uint16_t secObjInstID); +static void process_udpconn(int sockfd, fd_set *readfds, client_data_t data); +#endif /*__TINYARA__*/ -static void clear_client_globals(void) +static void prv_quit(char * buffer, + void * user_data) { - memset(g_bootstrapserverAddr, 0x00, IPADDRLEN_MAX); - memset(g_bootstrapserverPort, 0x00, 6); - if (lwm2mH->state == STATE_REGISTER_REQUIRED || - lwm2mH->state == STATE_REGISTERING || - lwm2mH->state == STATE_READY) { - printf("g_bootstrapRequested = false\n"); - g_bootstrapRequested = false; - } -} - -static void prv_update_server(client_data_t *dataP, - uint16_t secObjInstID) -{ - char *uri; - char *server_host; - char *server_port; - - uri = get_server_uri(dataP->securityObjP, secObjInstID); - - if (uri == NULL) { - return; - } - - // parse uri in the form "coaps://[server_host]:[port]" - if (0 == strncmp(uri, "coaps://", strlen("coaps://"))) { - server_host = uri + strlen("coaps://"); - } else if (0 == strncmp(uri, "coap://", strlen("coap://"))) { - server_host = uri + strlen("coap://"); - } else { - return; - } - server_port = strrchr(server_host, ':'); - if (server_port == NULL) { - return; - } - // remove brackets - if (server_host[0] == '[') { - server_host++; - if (*(server_port - 1) == ']') { - *(server_port - 1) = 0; - } else { - return; - } - } - // split strings - *server_port = 0; - server_port++; - - client_set_serverAddr(server_host, false); - client_set_serverPort(server_port, false); -} - - -static void prv_quit(char *buffer, - void *user_data) -{ - g_quit = 1; + g_quit = 1; } void handle_sigint(int signum) { - g_quit = 2; + g_quit = 2; } -void handle_value_changed(lwm2m_context_t *lwm2mH, - lwm2m_uri_t *uri, - const char *value, - size_t valueLength) +void handle_value_changed(lwm2m_context_t * lwm2mP, + lwm2m_uri_t * uri, + const char * value, + size_t valueLength) { - lwm2m_object_t *object = (lwm2m_object_t *)LWM2M_LIST_FIND(lwm2mH->objectList, uri->objectId); - - if (NULL != object) { - if (object->writeFunc != NULL) { - lwm2m_data_t *dataP; - int result; - - dataP = lwm2m_data_new(1); - if (dataP == NULL) { - fprintf(stderr, "Internal allocation failure !\n"); - return; - } - dataP->id = uri->resourceId; - lwm2m_data_encode_nstring(value, valueLength, dataP); - - result = object->writeFunc(uri->instanceId, 1, dataP, object); - if (COAP_405_METHOD_NOT_ALLOWED == result) { - switch (uri->objectId) { - case LWM2M_DEVICE_OBJECT_ID: - result = device_change(dataP, object); - break; - default: - break; - } - } - - if (COAP_204_CHANGED != result) { - fprintf(stderr, "Failed to change value!\n"); - } else { - fprintf(stderr, "value changed!\n"); - lwm2m_resource_value_changed(lwm2mH, uri); - } - lwm2m_data_free(1, dataP); - return; - } else { - fprintf(stderr, "write not supported for specified resource!\n"); - } - return; - } else { - fprintf(stderr, "Object not found !\n"); - } + lwm2m_object_t * object = (lwm2m_object_t *)LWM2M_LIST_FIND(lwm2mP->objectList, uri->objectId); + + if (NULL != object) + { + if (object->writeFunc != NULL) + { + lwm2m_data_t * dataP; + int result; + + dataP = lwm2m_data_new(1); + if (dataP == NULL) + { + fprintf(stderr, "Internal allocation failure !\n"); + return; + } + dataP->id = uri->resourceId; + lwm2m_data_encode_nstring(value, valueLength, dataP); + + result = object->writeFunc(uri->instanceId, 1, dataP, object); + if (COAP_405_METHOD_NOT_ALLOWED == result) + { + switch (uri->objectId) + { + case LWM2M_DEVICE_OBJECT_ID: + result = device_change(dataP, object); + break; + default: + break; + } + } + + if (COAP_204_CHANGED != result) + { + fprintf(stderr, "Failed to change value!\n"); + } + else + { + fprintf(stderr, "value changed!\n"); + lwm2m_resource_value_changed(lwm2mP, uri); + } + lwm2m_data_free(1, dataP); + return; + } + else + { + fprintf(stderr, "write not supported for specified resource!\n"); + } + return; + } + else + { + fprintf(stderr, "Object not found !\n"); + } } #ifdef WITH_TINYDTLS -void *lwm2m_connect_server(uint16_t secObjInstID, - void *userData) +void * lwm2m_connect_server(uint16_t secObjInstID, + void * userData) { - client_data_t *dataP; - lwm2m_list_t *instance; - dtls_connection_t *newConnP = NULL; - dataP = (client_data_t *)userData; - lwm2m_object_t *securityObj = dataP->securityObjP; - - instance = LWM2M_LIST_FIND(dataP->securityObjP->instanceList, secObjInstID); - if (instance == NULL) { - return NULL; - } - - - newConnP = connection_create(dataP->connList, dataP->sock, securityObj, instance->id, dataP->lwm2mH, dataP->addressFamily); - if (newConnP == NULL) { - fprintf(stderr, "Connection creation failed.\n"); - return NULL; - } - - dataP->connList = newConnP; - return (void *)newConnP; + client_data_t * dataP; + lwm2m_list_t * instance; + dtls_connection_t * newConnP = NULL; + dataP = (client_data_t *)userData; + lwm2m_object_t * securityObj = dataP->securityObjP; + + instance = LWM2M_LIST_FIND(dataP->securityObjP->instanceList, secObjInstID); + if (instance == NULL) return NULL; + + + newConnP = connection_create(dataP->connList, dataP->sock, securityObj, instance->id, dataP->lwm2mH, dataP->addressFamily); + if (newConnP == NULL) + { + fprintf(stderr, "Connection creation failed.\n"); + return NULL; + } + + dataP->connList = newConnP; + return (void *)newConnP; } #else -void *lwm2m_connect_server(uint16_t secObjInstID, - void *userData) +void * lwm2m_connect_server(uint16_t secObjInstID, + void * userData) { - client_data_t *dataP; - char *uri; - char *host; - char *port; - connection_t *newConnP = NULL; - - dataP = (client_data_t *)userData; - - uri = get_server_uri(dataP->securityObjP, secObjInstID); - - if (uri == NULL) { - return NULL; - } - - // parse uri in the form "coaps://[host]:[port]" - if (0 == strncmp(uri, "coaps://", strlen("coaps://"))) { - host = uri + strlen("coaps://"); - } else if (0 == strncmp(uri, "coap://", strlen("coap://"))) { - host = uri + strlen("coap://"); - } else { - goto exit; - } - port = strrchr(host, ':'); - if (port == NULL) { - goto exit; - } - // remove brackets - if (host[0] == '[') { - host++; - if (*(port - 1) == ']') { - *(port - 1) = 0; - } else { - goto exit; - } - } - // split strings - *port = 0; - port++; - - fprintf(stderr, "Opening connection to server at %s:%s\r\n", host, port); - newConnP = connection_create(dataP->connList, dataP->sock, host, port, dataP->addressFamily); - if (newConnP == NULL) { - fprintf(stderr, "Connection creation failed.\r\n"); - } else { - dataP->connList = newConnP; - } -#ifdef LWM2M_CLIENT_MODE - printf("lwm2mH->state = %d\n", lwm2mH->state); - if (lwm2mH->state == STATE_REGISTERING || - lwm2mH->state == STATE_REGISTER_REQUIRED) { - prv_update_server(dataP, secObjInstID); - } - -#endif + client_data_t * dataP; + char * uri; + char * host; + char * port; + connection_t * newConnP = NULL; + + dataP = (client_data_t *)userData; + + uri = get_server_uri(dataP->securityObjP, secObjInstID); + + if (uri == NULL) return NULL; + + // parse uri in the form "coaps://[host]:[port]" + if (0==strncmp(uri, "coaps://", strlen("coaps://"))) { + host = uri+strlen("coaps://"); + } + else if (0==strncmp(uri, "coap://", strlen("coap://"))) { + host = uri+strlen("coap://"); + } + else { + goto exit; + } + port = strrchr(host, ':'); + if (port == NULL) goto exit; + // remove brackets + if (host[0] == '[') + { + host++; + if (*(port - 1) == ']') + { + *(port - 1) = 0; + } + else goto exit; + } + // split strings + *port = 0; + port++; + + fprintf(stderr, "Opening connection to server at %s:%s\r\n", host, port); + newConnP = connection_create(dataP->connList, dataP->sock, host, port, dataP->addressFamily); + if (newConnP == NULL) { + fprintf(stderr, "Connection creation failed.\r\n"); + } + else { + dataP->connList = newConnP; + } exit: - lwm2m_free(uri); - return (void *)newConnP; + lwm2m_free(uri); + return (void *)newConnP; } #endif -void lwm2m_close_connection(void *sessionH, - void *userData) +void lwm2m_close_connection(void * sessionH, + void * userData) { - client_data_t *app_data; + client_data_t * app_data; #ifdef WITH_TINYDTLS - dtls_connection_t *targetP; + dtls_connection_t * targetP; #else - connection_t *targetP; + connection_t * targetP; #endif - app_data = (client_data_t *)userData; + app_data = (client_data_t *)userData; #ifdef WITH_TINYDTLS - targetP = (dtls_connection_t *)sessionH; + targetP = (dtls_connection_t *)sessionH; #else - targetP = (connection_t *)sessionH; + targetP = (connection_t *)sessionH; #endif - if (targetP == app_data->connList) { - app_data->connList = targetP->next; - lwm2m_free(targetP); - } else { + if (targetP == app_data->connList) + { + app_data->connList = targetP->next; + lwm2m_free(targetP); + } + else + { #ifdef WITH_TINYDTLS - dtls_connection_t *parentP; + dtls_connection_t * parentP; #else - connection_t *parentP; + connection_t * parentP; #endif - parentP = app_data->connList; - while (parentP != NULL && parentP->next != targetP) { - parentP = parentP->next; - } - if (parentP != NULL) { - parentP->next = targetP->next; - lwm2m_free(targetP); - } - } + parentP = app_data->connList; + while (parentP != NULL && parentP->next != targetP) + { + parentP = parentP->next; + } + if (parentP != NULL) + { + parentP->next = targetP->next; + lwm2m_free(targetP); + } + } } -#endif -static void prv_output_servers(char *buffer, - void *user_data) +static void prv_output_servers(char * buffer, + void * user_data) { - lwm2m_context_t *lwm2mH = (lwm2m_context_t *) user_data; - lwm2m_server_t *targetP; - - targetP = lwm2mH->bootstrapServerList; - - if (lwm2mH->bootstrapServerList == NULL) { - fprintf(stdout, "No Bootstrap Server.\r\n"); - } else { - fprintf(stdout, "Bootstrap Servers:\r\n"); - for (targetP = lwm2mH->bootstrapServerList ; targetP != NULL ; targetP = targetP->next) { - fprintf(stdout, " - Security Object ID %d", targetP->secObjInstID); - fprintf(stdout, "\tHold Off Time: %lu s", (unsigned long)targetP->lifetime); - fprintf(stdout, "\tstatus: "); - switch (targetP->status) { - case STATE_DEREGISTERED: - fprintf(stdout, "DEREGISTERED\r\n"); - break; - case STATE_BS_HOLD_OFF: - fprintf(stdout, "CLIENT HOLD OFF\r\n"); - break; - case STATE_BS_INITIATED: - fprintf(stdout, "BOOTSTRAP INITIATED\r\n"); - break; - case STATE_BS_PENDING: - fprintf(stdout, "BOOTSTRAP PENDING\r\n"); - break; - case STATE_BS_FINISHED: - fprintf(stdout, "BOOTSTRAP FINISHED\r\n"); - break; - case STATE_BS_FAILED: - fprintf(stdout, "BOOTSTRAP FAILED\r\n"); - break; - default: - fprintf(stdout, "INVALID (%d)\r\n", (int)targetP->status); - } - } - } - - if (lwm2mH->serverList == NULL) { - fprintf(stdout, "No LWM2M Server.\r\n"); - } else { - fprintf(stdout, "LWM2M Servers:\r\n"); - for (targetP = lwm2mH->serverList ; targetP != NULL ; targetP = targetP->next) { - fprintf(stdout, " - Server ID %d", targetP->shortID); - fprintf(stdout, "\tstatus: "); - switch (targetP->status) { - case STATE_DEREGISTERED: - fprintf(stdout, "DEREGISTERED\r\n"); - break; - case STATE_REG_PENDING: - fprintf(stdout, "REGISTRATION PENDING\r\n"); - break; - case STATE_REGISTERED: - fprintf(stdout, "REGISTERED\tlocation: \"%s\"\tLifetime: %lus\r\n", targetP->location, (unsigned long)targetP->lifetime); - break; - case STATE_REG_UPDATE_PENDING: - fprintf(stdout, "REGISTRATION UPDATE PENDING\r\n"); - break; - case STATE_DEREG_PENDING: - fprintf(stdout, "DEREGISTRATION PENDING\r\n"); - break; - case STATE_REG_FAILED: - fprintf(stdout, "REGISTRATION FAILED\r\n"); - break; - default: - fprintf(stdout, "INVALID (%d)\r\n", (int)targetP->status); - } - } - } + lwm2mH = (lwm2m_context_t *) user_data; + lwm2m_server_t * targetP; + + targetP = lwm2mH->bootstrapServerList; + + if (lwm2mH->bootstrapServerList == NULL) + { + fprintf(stdout, "No Bootstrap Server.\r\n"); + } + else + { + fprintf(stdout, "Bootstrap Servers:\r\n"); + for (targetP = lwm2mH->bootstrapServerList ; targetP != NULL ; targetP = targetP->next) + { + fprintf(stdout, " - Security Object ID %d", targetP->secObjInstID); + fprintf(stdout, "\tHold Off Time: %lu s", (unsigned long)targetP->lifetime); + fprintf(stdout, "\tstatus: "); + switch(targetP->status) + { + case STATE_DEREGISTERED: + fprintf(stdout, "DEREGISTERED\r\n"); + break; + case STATE_BS_HOLD_OFF: + fprintf(stdout, "CLIENT HOLD OFF\r\n"); + break; + case STATE_BS_INITIATED: + fprintf(stdout, "BOOTSTRAP INITIATED\r\n"); + break; + case STATE_BS_PENDING: + fprintf(stdout, "BOOTSTRAP PENDING\r\n"); + break; + case STATE_BS_FINISHED: + fprintf(stdout, "BOOTSTRAP FINISHED\r\n"); + break; + case STATE_BS_FAILED: + fprintf(stdout, "BOOTSTRAP FAILED\r\n"); + break; + default: + fprintf(stdout, "INVALID (%d)\r\n", (int)targetP->status); + } + } + } + + if (lwm2mH->serverList == NULL) + { + fprintf(stdout, "No LWM2M Server.\r\n"); + } + else + { + fprintf(stdout, "LWM2M Servers:\r\n"); + for (targetP = lwm2mH->serverList ; targetP != NULL ; targetP = targetP->next) + { + fprintf(stdout, " - Server ID %d", targetP->shortID); + fprintf(stdout, "\tstatus: "); + switch(targetP->status) + { + case STATE_DEREGISTERED: + fprintf(stdout, "DEREGISTERED\r\n"); + break; + case STATE_REG_PENDING: + fprintf(stdout, "REGISTRATION PENDING\r\n"); + break; + case STATE_REGISTERED: + fprintf(stdout, "REGISTERED\tlocation: \"%s\"\tLifetime: %lus\r\n", targetP->location, (unsigned long)targetP->lifetime); + break; + case STATE_REG_UPDATE_PENDING: + fprintf(stdout, "REGISTRATION UPDATE PENDING\r\n"); + break; + case STATE_DEREG_PENDING: + fprintf(stdout, "DEREGISTRATION PENDING\r\n"); + break; + case STATE_REG_FAILED: + fprintf(stdout, "REGISTRATION FAILED\r\n"); + break; + default: + fprintf(stdout, "INVALID (%d)\r\n", (int)targetP->status); + } + } + } } -static void prv_change(char *buffer, - void *user_data) +static void prv_change(char * buffer, + void * user_data) { - - lwm2m_uri_t uri; - char *end = NULL; - int result; - - end = get_end_of_arg(buffer); -// if (end[0] == 0) goto syntax_error; - - result = lwm2m_stringToUri(buffer, end - buffer, &uri); - if (result == 0) { - goto syntax_error; - } - - buffer = get_next_arg(end, &end); - - if (buffer[0] == 0) { - fprintf(stderr, "report change!\n"); - lwm2m_resource_value_changed(lwm2mH, &uri); - } else { - handle_value_changed(lwm2mH, &uri, buffer, end - buffer); - } - return; + lwm2mH = (lwm2m_context_t *) user_data; + lwm2m_uri_t uri; + char * end = NULL; + int result; + + end = get_end_of_arg(buffer); + if (end[0] == 0) goto syntax_error; + + result = lwm2m_stringToUri(buffer, end - buffer, &uri); + if (result == 0) goto syntax_error; + + buffer = get_next_arg(end, &end); + + if (buffer[0] == 0) + { + fprintf(stderr, "report change!\n"); + lwm2m_resource_value_changed(lwm2mH, &uri); + } + else + { + handle_value_changed(lwm2mH, &uri, buffer, end - buffer); + } + return; syntax_error: - fprintf(stdout, "Syntax error !\n"); + fprintf(stdout, "Syntax error !\n"); } -static void prv_object_list(char *buffer, - void *user_data) +static void prv_object_list(char * buffer, + void * user_data) { - lwm2m_context_t *lwm2mH = (lwm2m_context_t *)user_data; - lwm2m_object_t *objectP; - - for (objectP = lwm2mH->objectList; objectP != NULL; objectP = objectP->next) { - if (objectP->instanceList == NULL) { - fprintf(stdout, "/%d ", objectP->objID); - } else { - lwm2m_list_t *instanceP; - - for (instanceP = objectP->instanceList; instanceP != NULL ; instanceP = instanceP->next) { - fprintf(stdout, "/%d/%d ", objectP->objID, instanceP->id); - } - } - fprintf(stdout, "\r\n"); - } + lwm2mH = (lwm2m_context_t *)user_data; + lwm2m_object_t * objectP; + + for (objectP = lwm2mH->objectList; objectP != NULL; objectP = objectP->next) + { + if (objectP->instanceList == NULL) + { + fprintf(stdout, "/%d ", objectP->objID); + } + else + { + lwm2m_list_t * instanceP; + + for (instanceP = objectP->instanceList; instanceP != NULL ; instanceP = instanceP->next) + { + fprintf(stdout, "/%d/%d ", objectP->objID, instanceP->id); + } + } + fprintf(stdout, "\r\n"); + } } -static void prv_instance_dump(lwm2m_object_t *objectP, - uint16_t id) +static void prv_instance_dump(lwm2m_object_t * objectP, + uint16_t id) { - int numData; - lwm2m_data_t *dataArray; - uint16_t res; - - numData = 0; - res = objectP->readFunc(id, &numData, &dataArray, objectP); - if (res != COAP_205_CONTENT) { - printf("Error "); - print_status(stdout, res); - printf("\r\n"); - return; - } - - dump_tlv(stdout, numData, dataArray, 0); + int numData; + lwm2m_data_t * dataArray; + uint16_t res; + + numData = 0; + res = objectP->readFunc(id, &numData, &dataArray, objectP); + if (res != COAP_205_CONTENT) + { + printf("Error "); + print_status(stdout, res); + printf("\r\n"); + return; + } + + dump_tlv(stdout, numData, dataArray, 0); } -static void prv_object_dump(char *buffer, - void *user_data) +static void prv_object_dump(char * buffer, + void * user_data) { - lwm2m_context_t *lwm2mH = (lwm2m_context_t *) user_data; - lwm2m_uri_t uri; - char *end = NULL; - int result; - lwm2m_object_t *objectP; - - end = get_end_of_arg(buffer); - //if (end[0] == 0) goto syntax_error; - - result = lwm2m_stringToUri(buffer, end - buffer, &uri); - if (result == 0) { - goto syntax_error; - } - if (uri.flag & LWM2M_URI_FLAG_RESOURCE_ID) { - goto syntax_error; - } - - objectP = (lwm2m_object_t *)LWM2M_LIST_FIND(lwm2mH->objectList, uri.objectId); - if (objectP == NULL) { - fprintf(stdout, "Object not found.\n"); - return; - } - - if (uri.flag & LWM2M_URI_FLAG_INSTANCE_ID) { - prv_instance_dump(objectP, uri.instanceId); - } else { - lwm2m_list_t *instanceP; - - for (instanceP = objectP->instanceList; instanceP != NULL ; instanceP = instanceP->next) { - fprintf(stdout, "Instance %d:\r\n", instanceP->id); - prv_instance_dump(objectP, instanceP->id); - fprintf(stdout, "\r\n"); - } - } - - return; + lwm2mH = (lwm2m_context_t *) user_data; + lwm2m_uri_t uri; + char * end = NULL; + int result; + lwm2m_object_t * objectP; + + end = get_end_of_arg(buffer); + if (end[0] == 0) goto syntax_error; + + result = lwm2m_stringToUri(buffer, end - buffer, &uri); + if (result == 0) goto syntax_error; + if (uri.flag & LWM2M_URI_FLAG_RESOURCE_ID) goto syntax_error; + + objectP = (lwm2m_object_t *)LWM2M_LIST_FIND(lwm2mH->objectList, uri.objectId); + if (objectP == NULL) + { + fprintf(stdout, "Object not found.\n"); + return; + } + + if (uri.flag & LWM2M_URI_FLAG_INSTANCE_ID) + { + prv_instance_dump(objectP, uri.instanceId); + } + else + { + lwm2m_list_t * instanceP; + + for (instanceP = objectP->instanceList; instanceP != NULL ; instanceP = instanceP->next) + { + fprintf(stdout, "Instance %d:\r\n", instanceP->id); + prv_instance_dump(objectP, instanceP->id); + fprintf(stdout, "\r\n"); + } + } + + return; syntax_error: - fprintf(stdout, "Syntax error !\n"); + fprintf(stdout, "Syntax error !\n"); } -static void prv_update(char *buffer, - void *user_data) +static void prv_update(char * buffer, + void * user_data) { - lwm2m_context_t *lwm2mH = (lwm2m_context_t *)user_data; - if (buffer[0] == 0) { - goto syntax_error; - } - - uint16_t serverId = (uint16_t) atoi(buffer); - int res = lwm2m_update_registration(lwm2mH, serverId, false); - if (res != 0) { - fprintf(stdout, "Registration update error: "); - print_status(stdout, res); - fprintf(stdout, "\r\n"); - } - return; + lwm2mH = (lwm2m_context_t *)user_data; + if (buffer[0] == 0) goto syntax_error; + + uint16_t serverId = (uint16_t) atoi(buffer); + int res = lwm2m_update_registration(lwm2mH, serverId, false); + if (res != 0) + { + fprintf(stdout, "Registration update error: "); + print_status(stdout, res); + fprintf(stdout, "\r\n"); + } + return; syntax_error: - fprintf(stdout, "Syntax error !\n"); + fprintf(stdout, "Syntax error !\n"); } -static void update_battery_level(lwm2m_context_t *context) +static void update_battery_level(lwm2m_context_t * context) { - static time_t next_change_time = 0; - time_t tv_sec; - - tv_sec = lwm2m_gettime(); - if (tv_sec < 0) { - return; - } - - if (next_change_time < tv_sec) { - char value[15]; - int valueLength; - lwm2m_uri_t uri; - int level = rand() % 100; - - if (0 > level) { - level = -level; - } - if (lwm2m_stringToUri("/3/0/9", 6, &uri)) { - valueLength = sprintf(value, "%d", level); - fprintf(stderr, "New Battery Level: %d\n", level); - handle_value_changed(context, &uri, value, valueLength); - } - level = rand() % 20; - if (0 > level) { - level = -level; - } - next_change_time = tv_sec + level + 10; - } + static time_t next_change_time = 0; + time_t tv_sec; + + tv_sec = lwm2m_gettime(); + if (tv_sec < 0) return; + + if (next_change_time < tv_sec) + { + char value[15]; + int valueLength; + lwm2m_uri_t uri; + int level = rand() % 100; + + if (0 > level) level = -level; + if (lwm2m_stringToUri("/3/0/9", 6, &uri)) + { + valueLength = sprintf(value, "%d", level); + fprintf(stderr, "New Battery Level: %d\n", level); + handle_value_changed(context, &uri, value, valueLength); + } + level = rand() % 20; + if (0 > level) level = -level; + next_change_time = tv_sec + level + 10; + } } -static void prv_add(char *buffer, - void *user_data) +static void prv_add(char * buffer, + void * user_data) { - lwm2m_context_t *lwm2mH = (lwm2m_context_t *)user_data; - lwm2m_object_t *objectP; - int res; - - objectP = get_test_object(); - if (objectP == NULL) { - fprintf(stdout, "Creating object 1024 failed.\r\n"); - return; - } - res = lwm2m_add_object(lwm2mH, objectP); - if (res != 0) { - fprintf(stdout, "Adding object 1024 failed: "); - print_status(stdout, res); - fprintf(stdout, "\r\n"); - } else { - fprintf(stdout, "Object 1024 added.\r\n"); - } - return; + lwm2mH = (lwm2m_context_t *)user_data; + lwm2m_object_t * objectP; + int res; + + objectP = get_test_object(); + if (objectP == NULL) + { + fprintf(stdout, "Creating object 1024 failed.\r\n"); + return; + } + res = lwm2m_add_object(lwm2mH, objectP); + if (res != 0) + { + fprintf(stdout, "Adding object 1024 failed: "); + print_status(stdout, res); + fprintf(stdout, "\r\n"); + } + else + { + fprintf(stdout, "Object 1024 added.\r\n"); + } + return; } -static void prv_remove(char *buffer, - void *user_data) +static void prv_remove(char * buffer, + void * user_data) { - lwm2m_context_t *lwm2mH = (lwm2m_context_t *)user_data; - int res; - - res = lwm2m_remove_object(lwm2mH, 1024); - if (res != 0) { - fprintf(stdout, "Removing object 1024 failed: "); - print_status(stdout, res); - fprintf(stdout, "\r\n"); - } else { - fprintf(stdout, "Object 1024 removed.\r\n"); - } - return; + lwm2mH = (lwm2m_context_t *)user_data; + int res; + + res = lwm2m_remove_object(lwm2mH, 1024); + if (res != 0) + { + fprintf(stdout, "Removing object 1024 failed: "); + print_status(stdout, res); + fprintf(stdout, "\r\n"); + } + else + { + fprintf(stdout, "Object 1024 removed.\r\n"); + } + return; } #ifdef LWM2M_BOOTSTRAP -static void prv_initiate_bootstrap(char *buffer, - void *user_data) +static void prv_initiate_bootstrap(char * buffer, + void * user_data) { - lwm2m_context_t *lwm2mH = (lwm2m_context_t *)user_data; - lwm2m_server_t *targetP; - - // HACK !!! - lwm2mH->state = STATE_BOOTSTRAP_REQUIRED; - targetP = lwm2mH->bootstrapServerList; - while (targetP != NULL) { - targetP->lifetime = 0; - targetP = targetP->next; - } + lwm2mH = (lwm2m_context_t *)user_data; + lwm2m_server_t * targetP; + + // HACK !!! + lwm2mH->state = STATE_BOOTSTRAP_REQUIRED; + targetP = lwm2mH->bootstrapServerList; + while (targetP != NULL) + { + targetP->lifetime = 0; + targetP = targetP->next; + } } -static void prv_display_objects(char *buffer, - void *user_data) +static void prv_display_objects(char * buffer, + void * user_data) { - lwm2m_context_t *lwm2mH = (lwm2m_context_t *)user_data; - lwm2m_object_t *object; - - for (object = lwm2mH->objectList; object != NULL; object = object->next) { - if (NULL != object) { - switch (object->objID) { - case LWM2M_SECURITY_OBJECT_ID: - display_security_object(object); - break; - case LWM2M_SERVER_OBJECT_ID: - display_server_object(object); - break; - case LWM2M_ACL_OBJECT_ID: - break; - case LWM2M_DEVICE_OBJECT_ID: - display_device_object(object); - break; - case LWM2M_CONN_MONITOR_OBJECT_ID: - break; - case LWM2M_FIRMWARE_UPDATE_OBJECT_ID: - display_firmware_object(object); - break; - case LWM2M_LOCATION_OBJECT_ID: - display_location_object(object); - break; - case LWM2M_CONN_STATS_OBJECT_ID: - break; - case TEST_OBJECT_ID: - display_test_object(object); - break; - } - } - } + lwm2mH = (lwm2m_context_t *)user_data; + lwm2m_object_t * object; + + for (object = lwm2mH->objectList; object != NULL; object = object->next){ + if (NULL != object) { + switch (object->objID) + { + case LWM2M_SECURITY_OBJECT_ID: + display_security_object(object); + break; + case LWM2M_SERVER_OBJECT_ID: + display_server_object(object); + break; + case LWM2M_ACL_OBJECT_ID: + break; + case LWM2M_DEVICE_OBJECT_ID: + display_device_object(object); + break; + case LWM2M_CONN_MONITOR_OBJECT_ID: + break; + case LWM2M_FIRMWARE_UPDATE_OBJECT_ID: + display_firmware_object(object); + break; + case LWM2M_LOCATION_OBJECT_ID: + display_location_object(object); + break; + case LWM2M_CONN_STATS_OBJECT_ID: + break; + case TEST_OBJECT_ID: + display_test_object(object); + break; + } + } + } } -static void prv_display_backup(char *buffer, - void *user_data) +static void prv_display_backup(char * buffer, + void * user_data) { - if (NULL != backupObjectArray) { - int i; - for (i = 0 ; i < BACKUP_OBJECT_COUNT ; i++) { - lwm2m_object_t *object = backupObjectArray[i]; - if (NULL != object) { - switch (object->objID) { - case LWM2M_SECURITY_OBJECT_ID: - display_security_object(object); - break; - case LWM2M_SERVER_OBJECT_ID: - display_server_object(object); - break; - default: - break; - } - } - } - } + int i; + for (i = 0 ; i < BACKUP_OBJECT_COUNT ; i++) { + lwm2m_object_t * object = backupObjectArray[i]; + if (NULL != object) { + switch (object->objID) + { + case LWM2M_SECURITY_OBJECT_ID: + display_security_object(object); + break; + case LWM2M_SERVER_OBJECT_ID: + display_server_object(object); + break; + default: + break; + } + } + } } -static void prv_backup_objects(lwm2m_context_t *context) +static void prv_backup_objects(lwm2m_context_t * context) { - uint16_t i; - - for (i = 0; i < BACKUP_OBJECT_COUNT; i++) { - if (NULL != backupObjectArray[i]) { - switch (backupObjectArray[i]->objID) { - case LWM2M_SECURITY_OBJECT_ID: - clean_security_object(backupObjectArray[i]); - lwm2m_free(backupObjectArray[i]); - break; - case LWM2M_SERVER_OBJECT_ID: - clean_server_object(backupObjectArray[i]); - lwm2m_free(backupObjectArray[i]); - break; - default: - break; - } - } - backupObjectArray[i] = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t)); - memset(backupObjectArray[i], 0, sizeof(lwm2m_object_t)); - } - - /* - * Backup content of objects 0 (security) and 1 (server) - */ - copy_security_object(backupObjectArray[0], (lwm2m_object_t *)LWM2M_LIST_FIND(context->objectList, LWM2M_SECURITY_OBJECT_ID)); - copy_server_object(backupObjectArray[1], (lwm2m_object_t *)LWM2M_LIST_FIND(context->objectList, LWM2M_SERVER_OBJECT_ID)); + uint16_t i; + + for (i = 0; i < BACKUP_OBJECT_COUNT; i++) { + if (NULL != backupObjectArray[i]) { + switch (backupObjectArray[i]->objID) + { + case LWM2M_SECURITY_OBJECT_ID: + clean_security_object(backupObjectArray[i]); + lwm2m_free(backupObjectArray[i]); + break; + case LWM2M_SERVER_OBJECT_ID: + clean_server_object(backupObjectArray[i]); + lwm2m_free(backupObjectArray[i]); + break; + default: + break; + } + } + backupObjectArray[i] = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t)); + memset(backupObjectArray[i], 0, sizeof(lwm2m_object_t)); + } + + /* + * Backup content of objects 0 (security) and 1 (server) + */ + copy_security_object(backupObjectArray[0], (lwm2m_object_t *)LWM2M_LIST_FIND(context->objectList, LWM2M_SECURITY_OBJECT_ID)); + copy_server_object(backupObjectArray[1], (lwm2m_object_t *)LWM2M_LIST_FIND(context->objectList, LWM2M_SERVER_OBJECT_ID)); } -static void prv_restore_objects(lwm2m_context_t *context) +static void prv_restore_objects(lwm2m_context_t * context) { - lwm2m_object_t *targetP; - - /* - * Restore content of objects 0 (security) and 1 (server) - */ - targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(context->objectList, LWM2M_SECURITY_OBJECT_ID); - // first delete internal content - clean_security_object(targetP); - // then restore previous object - copy_security_object(targetP, backupObjectArray[0]); - - targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(context->objectList, LWM2M_SERVER_OBJECT_ID); - // first delete internal content - clean_server_object(targetP); - // then restore previous object - copy_server_object(targetP, backupObjectArray[1]); - - // restart the old servers - fprintf(stdout, "[BOOTSTRAP] ObjectList restored\r\n"); + lwm2m_object_t * targetP; + + /* + * Restore content of objects 0 (security) and 1 (server) + */ + targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(context->objectList, LWM2M_SECURITY_OBJECT_ID); + // first delete internal content + clean_security_object(targetP); + // then restore previous object + copy_security_object(targetP, backupObjectArray[0]); + + targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(context->objectList, LWM2M_SERVER_OBJECT_ID); + // first delete internal content + clean_server_object(targetP); + // then restore previous object + copy_server_object(targetP, backupObjectArray[1]); + + // restart the old servers + fprintf(stdout, "[BOOTSTRAP] ObjectList restored\r\n"); } -static void update_bootstrap_info(lwm2m_client_state_t *previousBootstrapState, - lwm2m_context_t *context) +static void update_bootstrap_info(lwm2m_client_state_t * previousBootstrapState, + lwm2m_context_t * context) { - if (*previousBootstrapState != context->state) { - *previousBootstrapState = context->state; - switch (context->state) { - case STATE_BOOTSTRAPPING: + if (*previousBootstrapState != context->state) + { + *previousBootstrapState = context->state; + switch(context->state) + { + case STATE_BOOTSTRAPPING: #ifdef WITH_LOGS - fprintf(stdout, "[BOOTSTRAP] backup security and server objects\r\n"); + fprintf(stdout, "[BOOTSTRAP] backup security and server objects\r\n"); #endif - prv_backup_objects(context); - break; - default: - break; - } - } + prv_backup_objects(context); + break; + default: + break; + } + } } static void close_backup_object() { - int i; - for (i = 0; i < BACKUP_OBJECT_COUNT; i++) { - if (NULL != backupObjectArray[i]) { - switch (backupObjectArray[i]->objID) { - case LWM2M_SECURITY_OBJECT_ID: - clean_security_object(backupObjectArray[i]); - lwm2m_free(backupObjectArray[i]); - break; - case LWM2M_SERVER_OBJECT_ID: - clean_server_object(backupObjectArray[i]); - lwm2m_free(backupObjectArray[i]); - break; - default: - break; - } - } - } + int i; + for (i = 0; i < BACKUP_OBJECT_COUNT; i++) { + switch (backupObjectArray[i]->objID) + { + case LWM2M_SECURITY_OBJECT_ID: + clean_security_object(backupObjectArray[i]); + lwm2m_free(backupObjectArray[i]); + break; + case LWM2M_SERVER_OBJECT_ID: + clean_server_object(backupObjectArray[i]); + lwm2m_free(backupObjectArray[i]); + break; + default: + break; + } + } } -#endif +#endif /* LWM2M_BOOTSTRAP */ + void print_usage(void) { - fprintf(stdout, "Usage: lwm2mclient [OPTION]\r\n"); - fprintf(stdout, "Launch a LWM2M client.\r\n"); - fprintf(stdout, "Options:\r\n"); - fprintf(stdout, " -n NAME\tSet the endpoint name of the Client. Default: testlwm2mclient\r\n"); - fprintf(stdout, " -l PORT\tSet the local UDP port of the Client. Default: 56830\r\n"); - fprintf(stdout, " -h HOST\tSet the hostname of the LWM2M Server to connect to. Default: localhost\r\n"); - fprintf(stdout, " -p PORT\tSet the port of the LWM2M Server to connect to. Default: "LWM2M_STANDARD_PORT_STR"\r\n"); - fprintf(stdout, " -4\t\tUse IPv4 connection. Default: IPv6 connection\r\n"); - fprintf(stdout, " -t TIME\tSet the lifetime of the Client. Default: 300\r\n"); - fprintf(stdout, " -b\t\tBootstrap requested.\r\n"); - fprintf(stdout, " -c\t\tChange battery level over time.\r\n"); -#ifdef WITH_TINYDTLS - fprintf(stdout, " -i STRING\tSet the device management or bootstrap server PSK identity. If not set use none secure mode\r\n"); - fprintf(stdout, " -s HEXSTRING\tSet the device management or bootstrap server Pre-Shared-Key. If not set use none secure mode\r\n"); + fprintf(stdout, "Usage: lwm2mclient [OPTION]\r\n"); + fprintf(stdout, "Launch a LWM2M client.\r\n"); + fprintf(stdout, "Options:\r\n"); + fprintf(stdout, " -n NAME\tSet the endpoint name of the Client. Default: testlwm2mclient\r\n"); + fprintf(stdout, " -l PORT\tSet the local UDP port of the Client. Default: 56830\r\n"); + fprintf(stdout, " -h HOST\tSet the hostname of the LWM2M Server to connect to. Default: localhost\r\n"); + fprintf(stdout, " -p PORT\tSet the port of the LWM2M Server to connect to. Default: "LWM2M_STANDARD_PORT_STR"\r\n"); + fprintf(stdout, " -4\t\tUse IPv4 connection. Default: IPv6 connection\r\n"); + fprintf(stdout, " -t TIME\tSet the lifetime of the Client. Default: 300\r\n"); + fprintf(stdout, " -b\t\tBootstrap requested.\r\n"); + fprintf(stdout, " -c\t\tChange battery level over time.\r\n"); +#ifdef WITH_TINYDTLS + fprintf(stdout, " -i STRING\tSet the device management or bootstrap server PSK identity. If not set use none secure mode\r\n"); + fprintf(stdout, " -s HEXSTRING\tSet the device management or bootstrap server Pre-Shared-Key. If not set use none secure mode\r\n"); #endif - fprintf(stdout, "\r\n"); + fprintf(stdout, "\r\n"); } +int lwm2m_client_main(int argc, char *argv[]) +{ + client_data_t data; + int result; + lwm2mH = NULL; + int i; + const char * localPort = "56830"; + const char * server = NULL; + const char * serverPort = LWM2M_STANDARD_PORT_STR; + char * name = "testlwm2mclient"; + int lifetime = 300; + int batterylevelchanging = 0; + time_t reboot_time = 0; + int opt; + bool bootstrapRequested = false; + bool serverPortChanged = false; + +#ifdef LWM2M_BOOTSTRAP + lwm2m_client_state_t previousState = STATE_INITIAL; +#endif + + char * pskId = NULL; + uint16_t pskLen = -1; + char * pskBuffer = NULL; + + /* + * The function start by setting up the command line interface (which may or not be useful depending on your project) + * + * This is an array of commands describes as { name, description, long description, callback, userdata }. + * The firsts tree are easy to understand, the callback is the function that will be called when this command is typed + * and in the last one will be stored the lwm2m context (allowing access to the server settings and the objects). + */ + command_desc_t commands[] = + { + {"list", "List known servers.", NULL, prv_output_servers, NULL}, + {"change", "Change the value of resource.", " change URI [DATA]\r\n" + " URI: uri of the resource such as /3/0, /3/0/2\r\n" + " DATA: (optional) new value\r\n", prv_change, NULL}, + {"update", "Trigger a registration update", " update SERVER\r\n" + " SERVER: short server id such as 123\r\n", prv_update, NULL}, +#ifdef LWM2M_BOOTSTRAP + {"bootstrap", "Initiate a DI bootstrap process", NULL, prv_initiate_bootstrap, NULL}, + {"dispb", "Display current backup of objects/instances/resources\r\n" + "\t(only security and server objects are backupped)", NULL, prv_display_backup, NULL}, + + {"disp", "Display current objects/instances/resources", NULL, prv_display_objects, NULL}, +#endif + {"ls", "List Objects and Instances", NULL, prv_object_list, NULL}, + {"dump", "Dump an Object", "dump URI" + "URI: uri of the Object or Instance such as /3/0, /1\r\n", prv_object_dump, NULL}, + {"add", "Add support of object 1024", NULL, prv_add, NULL}, + {"rm", "Remove support of object 1024", NULL, prv_remove, NULL}, + {"quit", "Quit the client gracefully.", NULL, prv_quit, NULL}, + {"^C", "Quit the client abruptly (without sending a de-register message).", NULL, NULL, NULL}, + + COMMAND_END_LIST + }; + + memset(&data, 0, sizeof(client_data_t)); + data.addressFamily = AF_INET; + + opt = 1; + while (opt < argc) + { + if (argv[opt] == NULL + || argv[opt][0] != '-' + || argv[opt][2] != 0) + { + print_usage(); + return 0; + } + switch (argv[opt][1]) + { + case 'b': + bootstrapRequested = true; + if (!serverPortChanged) serverPort = LWM2M_BSSERVER_PORT_STR; + break; + case 'c': + batterylevelchanging = 1; + break; + case 't': + opt++; + if (opt >= argc) + { + print_usage(); + return 0; + } + if (1 != sscanf(argv[opt], "%d", &lifetime)) + { + print_usage(); + return 0; + } + break; +#ifdef WITH_TINYDTLS + case 'i': + opt++; + if (opt >= argc) + { + print_usage(); + return 0; + } + pskId = argv[opt]; + break; + case 's': + opt++; + if (opt >= argc) + { + print_usage(); + return 0; + } + psk = argv[opt]; + break; +#endif + case 'n': + opt++; + if (opt >= argc) + { + print_usage(); + return 0; + } + name = argv[opt]; + break; + case 'l': + opt++; + if (opt >= argc) + { + print_usage(); + return 0; + } + localPort = argv[opt]; + break; + case 'h': + opt++; + if (opt >= argc) + { + print_usage(); + return 0; + } + server = argv[opt]; + break; + case 'p': + opt++; + if (opt >= argc) + { + print_usage(); + return 0; + } + serverPort = argv[opt]; + serverPortChanged = true; + break; + case '4': + data.addressFamily = AF_INET; + break; + default: + print_usage(); + return 0; + } + opt += 1; + } +#if defined (__TINYARA__) + if (argc == SET_PARAM_DM_FRAMEWORK) { + /* To handling parameters set through dm frameworks */ + name = DEFAULT_CLIENT_NAME; + lifetime = g_lifetime; + + bootstrapRequested = g_bootstrapRequested; + + if (bootstrapRequested) { + server = g_bootstrapserverAddr; + serverPort = g_bootstrapserverPort; + } else { + server = g_serverAddr; + serverPort = g_serverPort; + } + } +#endif /* __TINYARA__ */ + if (!server) + { + server = (AF_INET == data.addressFamily ? DEFAULT_SERVER_IPV4 : DEFAULT_SERVER_IPV6); + } + + /* + *This call an internal function that create an IPV6 socket on the port 5683. + */ + fprintf(stderr, "Trying to bind LWM2M Client to port %s\r\n", localPort); + data.sock = create_socket(localPort, data.addressFamily); + if (data.sock < 0) + { + fprintf(stderr, "Failed to open socket: %d %s\r\n", errno, strerror(errno)); + return -1; + } + + /* + * Now the main function fill an array with each object, this list will be later passed to liblwm2m. + * Those functions are located in their respective object file. + */ +#ifdef WITH_TINYDTLS + if (psk != NULL) + { + pskLen = strlen(psk) / 2; + pskBuffer = malloc(pskLen); + + if (NULL == pskBuffer) + { + fprintf(stderr, "Failed to create PSK binary buffer\r\n"); + return -1; + } + // Hex string to binary + char *h = psk; + char *b = pskBuffer; + char xlate[] = "0123456789ABCDEF"; + + for ( ; *h; h += 2, ++b) + { + char *l = strchr(xlate, toupper(*h)); + char *r = strchr(xlate, toupper(*(h+1))); + + if (!r || !l) + { + fprintf(stderr, "Failed to parse Pre-Shared-Key HEXSTRING\r\n"); + return -1; + } + + *b = ((l - xlate) << 4) + (r - xlate); + } + } +#endif + + char serverUri[50]; + int serverId = 123; + sprintf (serverUri, "coap://%s:%s", server, serverPort); +#ifdef LWM2M_BOOTSTRAP + objArray[0] = get_security_object(serverId, serverUri, pskId, pskBuffer, pskLen, bootstrapRequested); +#else + objArray[0] = get_security_object(serverId, serverUri, pskId, pskBuffer, pskLen, false); +#endif + if (NULL == objArray[0]) + { + fprintf(stderr, "Failed to create security object\r\n"); + return -1; + } + data.securityObjP = objArray[0]; + + objArray[1] = get_server_object(serverId, "U", lifetime, false); + if (NULL == objArray[1]) + { + fprintf(stderr, "Failed to create server object\r\n"); + return -1; + } + + objArray[2] = get_object_device(); + if (NULL == objArray[2]) + { + fprintf(stderr, "Failed to create Device object\r\n"); + return -1; + } + + objArray[3] = get_object_firmware(); + if (NULL == objArray[3]) + { + fprintf(stderr, "Failed to create Firmware object\r\n"); + return -1; + } + + objArray[4] = get_object_location(); + if (NULL == objArray[4]) + { + fprintf(stderr, "Failed to create location object\r\n"); + return -1; + } + + objArray[5] = get_test_object(); + if (NULL == objArray[5]) + { + fprintf(stderr, "Failed to create test object\r\n"); + return -1; + } + + objArray[6] = get_object_conn_m(); + if (NULL == objArray[6]) + { + fprintf(stderr, "Failed to create connectivity monitoring object\r\n"); + return -1; + } + + objArray[7] = get_object_conn_s(); + if (NULL == objArray[7]) + { + fprintf(stderr, "Failed to create connectivity statistics object\r\n"); + return -1; + } + + int instId = 0; + objArray[8] = acc_ctrl_create_object(); + if (NULL == objArray[8]) + { + fprintf(stderr, "Failed to create Access Control object\r\n"); + return -1; + } + else if (acc_ctrl_obj_add_inst(objArray[8], instId, 3, 0, serverId)==false) + { + fprintf(stderr, "Failed to create Access Control object instance\r\n"); + return -1; + } + else if (acc_ctrl_oi_add_ac_val(objArray[8], instId, 0, 0b000000000001111)==false) + { + fprintf(stderr, "Failed to create Access Control ACL default resource\r\n"); + return -1; + } + else if (acc_ctrl_oi_add_ac_val(objArray[8], instId, 999, 0b000000000000001)==false) + { + fprintf(stderr, "Failed to create Access Control ACL resource for serverId: 999\r\n"); + return -1; + } + /* + * The liblwm2m library is now initialized with the functions that will be in + * charge of communication + */ + lwm2mH = lwm2m_init(&data); + if (NULL == lwm2mH) + { + fprintf(stderr, "lwm2m_init() failed\r\n"); + return -1; + } + +#ifdef WITH_TINYDTLS + data.lwm2mH = lwm2mH; +#endif + + /* + * We configure the liblwm2m library with the name of the client - which shall be unique for each client - + * the number of objects we will be passing through and the objects array + */ + result = lwm2m_configure(lwm2mH, name, NULL, NULL, OBJ_COUNT, objArray); + if (result != 0) + { + fprintf(stderr, "lwm2m_configure() failed: 0x%X\r\n", result); + return -1; + } + + //signal(SIGINT, handle_sigint); + + /** + * Initialize value changed callback. + */ + init_value_change(lwm2mH); + + /* + * As you now have your lwm2m context complete you can pass it as an argument to all the command line functions + * precedently viewed (first point) + */ + for (i = 0 ; commands[i].name != NULL ; i++) + { + commands[i].userData = (void *)lwm2mH; + } + fprintf(stdout, "LWM2M Client \"%s\" started on port %s\r\n", name, localPort); + fprintf(stdout, "> "); fflush(stdout); + /* + * We now enter in a while loop that will handle the communications from the server + */ + while (0 == g_quit) + { + struct timeval tv; + fd_set readfds; + + if (g_reboot) + { + time_t tv_sec; + + tv_sec = lwm2m_gettime(); + + if (0 == reboot_time) + { + reboot_time = tv_sec + 5; + } + if (reboot_time < tv_sec) + { + /* + * Message should normally be lost with reboot ... + */ + fprintf(stderr, "reboot time expired, rebooting ..."); + system_reboot(); + } + else + { + tv.tv_sec = reboot_time - tv_sec; + } + } + else if (batterylevelchanging) + { + update_battery_level(lwm2mH); + tv.tv_sec = 5; + } + else + { + tv.tv_sec = 60; + } + tv.tv_usec = 0; + + FD_ZERO(&readfds); + FD_SET(data.sock, &readfds); +#if defined (__TINYARA__) + FD_SET(STDIN_FILENO, &readfds); +#else + FD_SET(stdin, &readfds); +#endif + + /* + * This function does two things: + * - first it does the work needed by liblwm2m (eg. (re)sending some packets). + * - Secondly it adjusts the timeout value (default 60s) depending on the state of the transaction + * (eg. retransmission) and the time between the next operation + */ + result = lwm2m_step(lwm2mH, &(tv.tv_sec)); + fprintf(stdout, " -> State: "); + switch (lwm2mH->state) + { + case STATE_INITIAL: + fprintf(stdout, "STATE_INITIAL\r\n"); + break; + case STATE_BOOTSTRAP_REQUIRED: + fprintf(stdout, "STATE_BOOTSTRAP_REQUIRED\r\n"); + break; + case STATE_BOOTSTRAPPING: + fprintf(stdout, "STATE_BOOTSTRAPPING\r\n"); + break; + case STATE_REGISTER_REQUIRED: + fprintf(stdout, "STATE_REGISTER_REQUIRED\r\n"); + break; + case STATE_REGISTERING: + fprintf(stdout, "STATE_REGISTERING\r\n"); + break; + case STATE_READY: + fprintf(stdout, "STATE_READY\r\n"); + break; + default: + fprintf(stdout, "Unknown...\r\n"); + break; + } + if (result != 0) + { + fprintf(stderr, "lwm2m_step() failed: 0x%X\r\n", result); +#ifdef LWM2M_BOOTSTRAP + if(previousState == STATE_BOOTSTRAPPING) + { +#ifdef WITH_LOGS + fprintf(stdout, "[BOOTSTRAP] restore security and server objects\r\n"); +#endif + prv_restore_objects(lwm2mH); + lwm2mH->state = STATE_INITIAL; + } + else +#endif /* LWM2M_BOOTSTRAP */ + return -1; + } +#ifdef LWM2M_BOOTSTRAP + update_bootstrap_info(&previousState, lwm2mH); +#endif + /* + * This part will set up an interruption until an event happen on SDTIN or the socket until "tv" timed out (set + * with the precedent function) + */ + result = select(FD_SETSIZE, &readfds, NULL, NULL, &tv); + + if (result < 0) + { + if (errno != EINTR) + { + fprintf(stderr, "Error in select(): %d %s\r\n", errno, strerror(errno)); + } + } + else if (result > 0) + { + uint8_t buffer[MAX_PACKET_SIZE]; + int numBytes; + + /* + * If an event happens on the socket + */ + if (FD_ISSET(data.sock, &readfds)) + { + struct sockaddr_storage addr; + socklen_t addrLen; + + addrLen = sizeof(addr); + + /* + * We retrieve the data received + */ + numBytes = recvfrom(data.sock, buffer, MAX_PACKET_SIZE, 0, (struct sockaddr *)&addr, &addrLen); + + if (0 > numBytes) + { + fprintf(stderr, "Error in recvfrom(): %d %s\r\n", errno, strerror(errno)); + } + else if (0 < numBytes) + { + char s[INET6_ADDRSTRLEN]; + in_port_t port; + +#ifdef WITH_TINYDTLS + dtls_connection_t * connP; +#else + connection_t * connP; +#endif + if (AF_INET == addr.ss_family) + { + struct sockaddr_in *saddr = (struct sockaddr_in *)&addr; + inet_ntop(saddr->sin_family, &saddr->sin_addr, s, INET6_ADDRSTRLEN); + port = saddr->sin_port; + } + else if (AF_INET6 == addr.ss_family) + { + struct sockaddr_in6 *saddr = (struct sockaddr_in6 *)&addr; + inet_ntop(saddr->sin6_family, &saddr->sin6_addr, s, INET6_ADDRSTRLEN); + port = saddr->sin6_port; + } + fprintf(stderr, "%d bytes received from [%s]:%hu\r\n", numBytes, s, ntohs(port)); + + /* + * Display it in the STDERR + */ + output_buffer(stderr, buffer, numBytes, 0); + + connP = connection_find(data.connList, &addr, addrLen); + if (connP != NULL) + { + /* + * Let liblwm2m respond to the query depending on the context + */ +#ifdef WITH_TINYDTLS + int result = connection_handle_packet(connP, buffer, numBytes); + if (0 != result) + { + printf("error handling message %d\n",result); + } +#else + lwm2m_handle_packet(lwm2mH, buffer, numBytes, connP); +#endif + conn_s_updateRxStatistic(objArray[7], numBytes, false); + } + else + { + fprintf(stderr, "received bytes ignored!\r\n"); + } + } + } + + /* + * If the event happened on the SDTIN + */ +#if defined (__TINYARA__) + else if (FD_ISSET(STDIN_FILENO, &readfds)) +#else + else if (FD_ISSET(stdin, &readfds)) +#endif + { +#if defined (__TINYARA__) + numBytes = read(STDIN_FILENO, buffer, MAX_PACKET_SIZE - 1); +#else + numBytes = read(stdin, buffer, MAX_PACKET_SIZE - 1); +#endif + + if (numBytes > 1) + { + buffer[numBytes] = 0; + /* + * We call the corresponding callback of the typed command passing it the buffer for further arguments + */ + handle_command(commands, (char*)buffer); + } + if (g_quit == 0) + { + fprintf(stdout, "\r\n> "); + fflush(stdout); + } + else + { + fprintf(stdout, "\r\n"); + } + } + } + } + + /* + * Finally when the loop is left smoothly - asked by user in the command line interface - we unregister our client from it + */ + if (g_quit == 1) + { +#ifdef LWM2M_BOOTSTRAP + close_backup_object(); +#endif + lwm2m_close(lwm2mH); + } + close(data.sock); + connection_free(data.connList); + + clean_security_object(objArray[0]); + lwm2m_free(objArray[0]); + clean_server_object(objArray[1]); + lwm2m_free(objArray[1]); + free_object_device(objArray[2]); + free_object_firmware(objArray[3]); + free_object_location(objArray[4]); + free_test_object(objArray[5]); + free_object_conn_m(objArray[6]); + free_object_conn_s(objArray[7]); + acl_ctrl_free_object(objArray[8]); + +#ifdef MEMORY_TRACE + if (g_quit == 1) + { + trace_print(0, 1); + } +#endif + + return 0; +} /**************************************************************************** - * API support + * TINYARA + * DM (Device Management) Frameworks supporting APIs ****************************************************************************/ -char *client_set_serverAddr(FAR const char *serverAddr, - bool isbootstrap) + +#if defined (__TINYARA__) + +/* Public APIs */ + +pthread_addr_t lwm2m_client_run(void) +{ + + lwm2m_client_main(SET_PARAM_DM_FRAMEWORK, NULL); + return 0; +} + +char *client_set_serverAddr(FAR const char *serverAddr, bool isbootstrap) { if (serverAddr) { if (isbootstrap) { @@ -900,9 +1504,7 @@ char *client_get_serverAddr(void) return g_serverAddr; } - -char *client_set_serverPort(FAR const char *serverPort, - bool isbootstrap) +char *client_set_serverPort(FAR const char *serverPort, bool isbootstrap) { if (serverPort) { if (isbootstrap) { @@ -919,14 +1521,11 @@ char *client_set_serverPort(FAR const char *serverPort, } } - char *client_get_serverPort(void) { return g_serverPort; - } - int client_set_lifetime(int lifetime) { g_lifetime = lifetime; @@ -949,7 +1548,7 @@ int client_change_resource(char *buffer, void *user_data) return 0; } -static void process_udpconn(int sockfd, fd_set *readfds) +static void process_udpconn(int sockfd, fd_set *readfds, client_data_t data) { uint8_t buffer[MAX_PACKET_SIZE]; int numBytes; @@ -1016,6 +1615,25 @@ static void process_udpconn(int sockfd, fd_set *readfds) } } + +lwm2m_context_t *wrapper_get_context(void) +{ + return lwm2mH; +} + +int client_object_dump(char *buffer) +{ + if (lwm2mH != NULL) { + prv_object_dump(buffer, lwm2mH); + return 0; + } else { + fprintf(stderr, "Error calling object dump\n"); + } + return -1; +} + +/* Private APIs */ + static void prv_close_sock(void) { connection_t *connPtr = NULL; @@ -1028,542 +1646,56 @@ static void prv_close_sock(void) } } -pthread_addr_t client_main(void) +static void clear_client_globals(void) { - int result; - int i; - - const char *localPort = "56830"; -#if 0 - const char *server = "192.168.0.4"; - const char *serverPort = LWM2M_STANDARD_PORT_STR; - char *name = "testlwm2mclient"; - int lifetime = 300; -#endif - char *server = g_serverAddr; - char *serverPort = g_serverPort; - char *name = "myawesomeclient"; - int lifetime = g_lifetime; - int batterylevelchanging = 0; - time_t reboot_time = 0; - int opt; - bool bootstrapRequested = g_bootstrapRequested; - bool serverPortChanged = false; - - if (bootstrapRequested) { - server = g_bootstrapserverAddr; - serverPort = g_bootstrapserverPort; - } else { - server = g_serverAddr; - serverPort = g_serverPort; - } - - -#ifdef LWM2M_BOOTSTRAP - lwm2m_client_state_t previousState = STATE_INITIAL; -#endif - - char *pskId = NULL; - char *psk = NULL; - uint16_t pskLen = -1; - char *pskBuffer = NULL; - - /* - * The function start by setting up the command line interface (which may or not be useful depending on your project) - * - * This is an array of commands describes as { name, description, long description, callback, userdata }. - * The firsts tree are easy to understand, the callback is the function that will be called when this command is typed - * and in the last one will be stored the lwm2m context (allowing access to the server settings and the objects). - */ - command_desc_t commands[] = { - {"list", "List known servers.", NULL, prv_output_servers, NULL}, - { - "change", "Change the value of resource.", " change URI [DATA]\r\n" - " URI: uri of the resource such as /3/0, /3/0/2\r\n" - " DATA: (optional) new value\r\n", prv_change, NULL - }, - { - "update", "Trigger a registration update", " update SERVER\r\n" - " SERVER: short server id such as 123\r\n", prv_update, NULL - }, -#ifdef LWM2M_BOOTSTRAP - {"bootstrap", "Initiate a DI bootstrap process", NULL, prv_initiate_bootstrap, NULL}, - { - "dispb", "Display current backup of objects/instances/resources\r\n" - "\t(only security and server objects are backupped)", NULL, prv_display_backup, NULL - }, -#endif - {"ls", "List Objects and Instances", NULL, prv_object_list, NULL}, - {"disp", "Display current objects/instances/resources", NULL, prv_display_objects, NULL}, - { - "dump", "Dump an Object", "dump URI" - "URI: uri of the Object or Instance such as /3/0, /1\r\n", prv_object_dump, NULL - }, - {"add", "Add support of object 1024", NULL, prv_add, NULL}, - {"rm", "Remove support of object 1024", NULL, prv_remove, NULL}, - {"quit", "Quit the client gracefully.", NULL, prv_quit, NULL}, - {"^C", "Quit the client abruptly (without sending a de-register message).", NULL, NULL, NULL}, - - COMMAND_END_LIST - }; - - printf("Inside client_main check serial\n"); - - memset(&data, 0, sizeof(client_data_t)); - data.addressFamily = AF_INET; -#if 0 - opt = 1; - while (opt < argc) { - if (argv[opt] == NULL - || argv[opt][0] != '-' - || argv[opt][2] != 0) { - print_usage(); - return 0; - } - switch (argv[opt][1]) { - case 'b': - bootstrapRequested = true; - if (!serverPortChanged) { - serverPort = LWM2M_BSSERVER_PORT_STR; - } - break; - case 'c': - batterylevelchanging = 1; - break; - case 't': - opt++; - if (opt >= argc) { - print_usage(); - return 0; - } - if (1 != sscanf(argv[opt], "%d", &lifetime)) { - print_usage(); - return 0; - } - break; -#ifdef WITH_TINYDTLS - case 'i': - opt++; - if (opt >= argc) { - print_usage(); - return 0; - } - pskId = argv[opt]; - break; - case 's': - opt++; - if (opt >= argc) { - print_usage(); - return 0; - } - psk = argv[opt]; - break; -#endif - case 'n': - opt++; - if (opt >= argc) { - print_usage(); - return 0; - } - name = argv[opt]; - break; - case 'l': - opt++; - if (opt >= argc) { - print_usage(); - return 0; - } - localPort = argv[opt]; - break; - case 'h': - opt++; - if (opt >= argc) { - print_usage(); - return 0; - } - server = argv[opt]; - break; - case 'p': - opt++; - if (opt >= argc) { - print_usage(); - return 0; - } - serverPort = argv[opt]; - serverPortChanged = true; - break; - case '4': - data.addressFamily = AF_INET; - break; - default: - print_usage(); - return 0; - } - opt += 1; - } -#endif - if (!server) { - server = (AF_INET == data.addressFamily ? DEFAULT_SERVER_IPV4 : DEFAULT_SERVER_IPV6); - } - - /* - *This call an internal function that create an IPV6 socket on the port 5683. - */ - fprintf(stderr, "Trying to bind LWM2M Client to port %s\r\n", localPort); - data.sock = create_socket(localPort, data.addressFamily); - if (data.sock < 0) { - fprintf(stderr, "Failed to open socket: %d %s\r\n", errno, strerror(errno)); - return -1; - } - - /* - * Now the main function fill an array with each object, this list will be later passed to liblwm2m. - * Those functions are located in their respective object file. - */ -#ifdef WITH_TINYDTLS - if (psk != NULL) { - pskLen = strlen(psk) / 2; - pskBuffer = malloc(pskLen); - - if (NULL == pskBuffer) { - fprintf(stderr, "Failed to create PSK binary buffer\r\n"); - return -1; - } - // Hex string to binary - char *h = psk; - char *b = pskBuffer; - char xlate[] = "0123456789ABCDEF"; - - for (; *h; h += 2, ++b) { - char *l = strchr(xlate, toupper(*h)); - char *r = strchr(xlate, toupper(*(h + 1))); - - if (!r || !l) { - fprintf(stderr, "Failed to parse Pre-Shared-Key HEXSTRING\r\n"); - return -1; - } - - *b = ((l - xlate) << 4) + (r - xlate); - } - } -#endif - - char serverUri[50]; - int serverId = 123; - sprintf(serverUri, "coap://%s:%s", server, serverPort); -#ifdef LWM2M_BOOTSTRAP - objArray[0] = get_security_object(serverId, serverUri, pskId, pskBuffer, pskLen, bootstrapRequested); -#else - objArray[0] = get_security_object(serverId, serverUri, pskId, pskBuffer, pskLen, false); -#endif - if (NULL == objArray[0]) { - fprintf(stderr, "Failed to create security object\r\n"); - return -1; - } - data.securityObjP = objArray[0]; - - objArray[1] = get_server_object(serverId, "U", lifetime, false); - if (NULL == objArray[1]) { - fprintf(stderr, "Failed to create server object\r\n"); - return -1; - } - - objArray[2] = get_object_device(); - if (NULL == objArray[2]) { - fprintf(stderr, "Failed to create Device object\r\n"); - return -1; - } - - objArray[3] = get_object_firmware(); - if (NULL == objArray[3]) { - fprintf(stderr, "Failed to create Firmware object\r\n"); - return -1; - } - - objArray[4] = get_object_location(); - if (NULL == objArray[4]) { - fprintf(stderr, "Failed to create location object\r\n"); - return -1; + memset(g_bootstrapserverAddr, 0x00, IPADDRLEN_MAX); + memset(g_bootstrapserverPort, 0x00, 6); + if (lwm2mH->state == STATE_REGISTER_REQUIRED || + lwm2mH->state == STATE_REGISTERING || + lwm2mH->state == STATE_READY) { + printf("g_bootstrapRequested = false\n"); + g_bootstrapRequested = false; } +} - objArray[5] = get_test_object(); - if (NULL == objArray[5]) { - fprintf(stderr, "Failed to create test object\r\n"); - return -1; - } +static void prv_update_server(client_data_t *dataP, uint16_t secObjInstID) +{ + char *uri; + char *server_host; + char *server_port; - objArray[6] = get_object_conn_m(); - if (NULL == objArray[6]) { - fprintf(stderr, "Failed to create connectivity monitoring object\r\n"); - return -1; - } + uri = get_server_uri(dataP->securityObjP, secObjInstID); - objArray[7] = get_object_conn_s(); - if (NULL == objArray[7]) { - fprintf(stderr, "Failed to create connectivity statistics object\r\n"); - return -1; + if (uri == NULL) { + return; } - int instId = 0; - objArray[8] = acc_ctrl_create_object(); - if (NULL == objArray[8]) { - fprintf(stderr, "Failed to create Access Control object\r\n"); - return -1; - } else if (acc_ctrl_obj_add_inst(objArray[8], instId, 3, 0, serverId) == false) { - fprintf(stderr, "Failed to create Access Control object instance\r\n"); - return -1; - } else if (acc_ctrl_oi_add_ac_val(objArray[8], instId, 0, 0b000000000001111) == false) { - fprintf(stderr, "Failed to create Access Control ACL default resource\r\n"); - return -1; - } else if (acc_ctrl_oi_add_ac_val(objArray[8], instId, 999, 0b000000000000001) == false) { - fprintf(stderr, "Failed to create Access Control ACL resource for serverId: 999\r\n"); - return -1; - } - objArray[9] = get_power_monitor_object(); - if (NULL == objArray[9]) { - fprintf(stderr, "Failed to create Power Monitoring object\r\n"); - return -1; + // parse uri in the form "coaps://[server_host]:[port]" + if (0 == strncmp(uri, "coaps://", strlen("coaps://"))) { + server_host = uri + strlen("coaps://"); + } else if (0 == strncmp(uri, "coap://", strlen("coap://"))) { + server_host = uri + strlen("coap://"); } else { - if (power_monitor_obj_add_inst(objArray[9], instId, 0) == false) { - fprintf(stderr, "Failed to create Power Monitoring object instance\r\n"); - return -1; - } - if (power_monitor_obj_add_inst(objArray[9], instId + 1, 0) == false) { - fprintf(stderr, "Failed to create Power Monitoring object instance\r\n"); - return -1; - } - if (power_monitor_obj_add_inst(objArray[9], instId + 2, 0) == false) { - fprintf(stderr, "Failed to create Power Monitoring object instance\r\n"); - return -1; - } - } - /* - * The liblwm2m library is now initialized with the functions that will be in - * charge of communication - */ - lwm2mH = lwm2m_init(&data); - if (NULL == lwm2mH) { - fprintf(stderr, "lwm2m_init() failed\r\n"); - return -1; - } - -#ifdef WITH_TINYDTLS - data.lwm2mH = lwm2mH; -#endif - - /* - * We configure the liblwm2m library with the name of the client - which shall be unique for each client - - * the number of objects we will be passing through and the objects array - */ - result = lwm2m_configure(lwm2mH, name, NULL, NULL, OBJ_COUNT, objArray); - if (result != 0) { - fprintf(stderr, "lwm2m_configure() failed: 0x%X\r\n", result); - return -1; + return; } - - //signal(SIGINT, handle_sigint); - printf("Instantiated objects\n"); - - /** - * Initialize value changed callback. - */ - init_value_change(lwm2mH); - - /* - * As you now have your lwm2m context complete you can pass it as an argument to all the command line functions - * precedently viewed (first point) - */ - for (i = 0 ; commands[i].name != NULL ; i++) { - commands[i].userData = (void *)lwm2mH; + server_port = strrchr(server_host, ':'); + if (server_port == NULL) { + return; } - fprintf(stdout, "LWM2M Client \"%s\" started on port %s\r\n", name, localPort); - fprintf(stdout, "> "); - fflush(stdout); - /* - * We now enter in a while loop that will handle the communications from the server - */ - while (0 == g_quit) { - struct timeval tv; - fd_set readfds; - int sockfd; - connection_t *connPtr = NULL; - - struct timespec tv1; - struct timespec tv2; - int ret_timestamp; - - if (g_reboot) { - time_t tv_sec; - - tv_sec = lwm2m_gettime(); - - if (0 == reboot_time) { - reboot_time = tv_sec + 5; - } - if (reboot_time < tv_sec) { - /* - * Message should normally be lost with reboot ... - */ - fprintf(stderr, "reboot time expired, rebooting ..."); - system_reboot(); - } else { - tv.tv_sec = reboot_time - tv_sec; - } - } else if (batterylevelchanging) { - update_battery_level(lwm2mH); - tv.tv_sec = 5; + // remove brackets + if (server_host[0] == '[') { + server_host++; + if (*(server_port - 1) == ']') { + *(server_port - 1) = 0; } else { - tv.tv_sec = 60; - } - tv.tv_usec = 0; - - FD_ZERO(&readfds); - connPtr = ((client_data_t *)(lwm2mH->userData))->connList; - while (connPtr != NULL) { - printf("setting %d\n", connPtr->sock); - FD_SET(connPtr->sock, &readfds); - connPtr = connPtr->next; - } - - ret_timestamp = clock_gettime(CLOCK_REALTIME, &tv1); - printf("checking lwm2m_step\n"); - usleep(20000); - - /* - * This function does two things: - * - first it does the work needed by liblwm2m (eg. (re)sending some packets). - * - Secondly it adjusts the timeout value (default 60s) depending on the state of the transaction - * (eg. retransmission) and the time between the next operation - */ - result = lwm2m_step(lwm2mH, &(tv.tv_sec)); - fprintf(stdout, " -> State: "); - switch (lwm2mH->state) { - case STATE_INITIAL: - fprintf(stdout, "STATE_INITIAL\r\n"); - break; - case STATE_BOOTSTRAP_REQUIRED: - fprintf(stdout, "STATE_BOOTSTRAP_REQUIRED\r\n"); - break; - case STATE_BOOTSTRAPPING: - fprintf(stdout, "STATE_BOOTSTRAPPING\r\n"); - break; - case STATE_REGISTER_REQUIRED: - fprintf(stdout, "STATE_REGISTER_REQUIRED\r\n"); - break; - case STATE_REGISTERING: - fprintf(stdout, "STATE_REGISTERING\r\n"); - break; - case STATE_READY: - fprintf(stdout, "STATE_READY\r\n"); - break; - default: - fprintf(stdout, "Unknown...\r\n"); - break; - } - if (result != 0) { - fprintf(stderr, "lwm2m_step() failed: 0x%X\r\n", result); - if (previousState == STATE_BOOTSTRAPPING) { -#ifdef WITH_LOGS - fprintf(stdout, "[BOOTSTRAP] restore security and server objects\r\n"); -#endif - prv_restore_objects(lwm2mH); - lwm2mH->state = STATE_INITIAL; - } else { - return -1; - } - } -#ifdef LWM2M_BOOTSTRAP - update_bootstrap_info(&previousState, lwm2mH); -#endif - printf("got connection, now trying select %d:%d, %lu:%lu\n", data.sock + 1, CONFIG_NSOCKET_DESCRIPTORS, - tv.tv_sec, tv.tv_usec); - usleep(20000); - /* - * This part will set up an interruption until an event happen on SDTIN or the socket until "tv" timed out (set - * with the precedent function) - */ - result = select(CONFIG_NFILE_DESCRIPTORS + - CONFIG_NSOCKET_DESCRIPTORS, &readfds, - NULL, NULL, &tv); - ret_timestamp = clock_gettime(CLOCK_REALTIME, &tv2); - printf("select exits with value %d\n", result); - usleep(20000); - printf("time diff %lu:%lu\n", tv2.tv_sec - tv1.tv_sec, - tv2.tv_nsec - tv1.tv_nsec); - usleep(20000); - if (result < 0) { - if (errno != EINTR) { - fprintf(stderr, "Error in select(): %d %s\r\n", errno, strerror(errno)); - } - } else if (result > 0) { - uint8_t buffer[MAX_PACKET_SIZE]; - int numBytes; - - /* - * If an event happens on the socket - */ - connPtr = ((client_data_t *)(lwm2mH->userData))->connList; - while (connPtr != NULL) { - process_udpconn(connPtr->sock, &readfds); - connPtr = connPtr->next; - } - } - } - - /* - * Finally when the loop is left smoothly - asked by user in the command line interface - we unregister our client from it - */ - if (g_quit == 1) { -#ifdef LWM2M_BOOTSTRAP - if (g_bootstrapRequested == true) { - close_backup_object(); + return; } -#endif - clear_client_globals(); - lwm2m_close(lwm2mH); } + // split strings + *server_port = 0; + server_port++; - close(data.sock); - prv_close_sock(); - connection_free(data.connList); - - clean_security_object(objArray[0]); - lwm2m_free(objArray[0]); - clean_server_object(objArray[1]); - lwm2m_free(objArray[1]); - free_object_device(objArray[2]); - free_object_firmware(objArray[3]); - free_object_location(objArray[4]); - free_test_object(objArray[5]); - free_object_conn_m(objArray[6]); - free_object_conn_s(objArray[7]); - acl_ctrl_free_object(objArray[8]); - power_monitor_free_object(objArray[9]); - -#ifdef MEMORY_TRACE - if (g_quit == 1) { - trace_print(0, 1); - } -#endif - - - printf("Exiting wakaama client thread\n"); - g_quit = 0; - return 0; -} - -lwm2m_context_t *wrapper_get_context(void) -{ - return lwm2mH; -} - -int client_object_dump(char *buffer) -{ - if (lwm2mH != NULL) { - prv_object_dump(buffer, lwm2mH); - return 0; - } else { - fprintf(stderr, "Error calling object dump\n"); - } - return -1; + client_set_serverAddr(server_host, false); + client_set_serverPort(server_port, false); } +#endif /* __TINYARA__ */ diff --git a/external/wakaama/examples/client/lwm2mclient.h b/external/wakaama/examples/client/lwm2mclient.h index f8660c7..c1cc7ae 100644 --- a/external/wakaama/examples/client/lwm2mclient.h +++ b/external/wakaama/examples/client/lwm2mclient.h @@ -27,103 +27,105 @@ #ifndef LWM2MCLIENT_H_ #define LWM2MCLIENT_H_ #include + #include "liblwm2m.h" extern int g_reboot; -extern char *ipaddr; -extern char *port; /* * object_device.c */ -lwm2m_object_t *get_object_device(void); -void free_object_device(lwm2m_object_t *objectP); -uint8_t device_change(lwm2m_data_t *dataArray, lwm2m_object_t *objectP); -void display_device_object(lwm2m_object_t *objectP); +lwm2m_object_t * get_object_device(void); +void free_object_device(lwm2m_object_t * objectP); +uint8_t device_change(lwm2m_data_t * dataArray, lwm2m_object_t * objectP); +void display_device_object(lwm2m_object_t * objectP); /* * object_firmware.c */ -lwm2m_object_t *get_object_firmware(void); -void free_object_firmware(lwm2m_object_t *objectP); -void display_firmware_object(lwm2m_object_t *objectP); +lwm2m_object_t * get_object_firmware(void); +void free_object_firmware(lwm2m_object_t * objectP); +void display_firmware_object(lwm2m_object_t * objectP); /* * object_location.c */ -lwm2m_object_t *get_object_location(void); -void free_object_location(lwm2m_object_t *object); -void display_location_object(lwm2m_object_t *objectP); +lwm2m_object_t * get_object_location(void); +void free_object_location(lwm2m_object_t * object); +void display_location_object(lwm2m_object_t * objectP); /* * object_test.c */ #define TEST_OBJECT_ID 1024 -lwm2m_object_t *get_test_object(void); -void free_test_object(lwm2m_object_t *object); -void display_test_object(lwm2m_object_t *objectP); +lwm2m_object_t * get_test_object(void); +void free_test_object(lwm2m_object_t * object); +void display_test_object(lwm2m_object_t * objectP); /* * object_server.c */ -lwm2m_object_t *get_server_object(int serverId, const char *binding, int lifetime, bool storing); -void clean_server_object(lwm2m_object_t *object); -void display_server_object(lwm2m_object_t *objectP); -void copy_server_object(lwm2m_object_t *objectDest, lwm2m_object_t *objectSrc); +lwm2m_object_t * get_server_object(int serverId, const char* binding, int lifetime, bool storing); +void clean_server_object(lwm2m_object_t * object); +void display_server_object(lwm2m_object_t * objectP); +void copy_server_object(lwm2m_object_t * objectDest, lwm2m_object_t * objectSrc); /* * object_connectivity_moni.c */ -lwm2m_object_t *get_object_conn_m(void); -void free_object_conn_m(lwm2m_object_t *objectP); -uint8_t connectivity_moni_change(lwm2m_data_t *dataArray, lwm2m_object_t *objectP); +lwm2m_object_t * get_object_conn_m(void); +void free_object_conn_m(lwm2m_object_t * objectP); +uint8_t connectivity_moni_change(lwm2m_data_t * dataArray, lwm2m_object_t * objectP); /* * object_connectivity_stat.c */ -extern lwm2m_object_t *get_object_conn_s(void); -void free_object_conn_s(lwm2m_object_t *objectP); -extern void conn_s_updateTxStatistic(lwm2m_object_t *objectP, uint16_t txDataByte, bool smsBased); -extern void conn_s_updateRxStatistic(lwm2m_object_t *objectP, uint16_t rxDataByte, bool smsBased); +extern lwm2m_object_t * get_object_conn_s(void); +void free_object_conn_s(lwm2m_object_t * objectP); +extern void conn_s_updateTxStatistic(lwm2m_object_t * objectP, uint16_t txDataByte, bool smsBased); +extern void conn_s_updateRxStatistic(lwm2m_object_t * objectP, uint16_t rxDataByte, bool smsBased); /* * object_access_control.c */ -lwm2m_object_t *acc_ctrl_create_object(void); -void acl_ctrl_free_object(lwm2m_object_t *objectP); -bool acc_ctrl_obj_add_inst(lwm2m_object_t *accCtrlObjP, uint16_t instId, - uint16_t acObjectId, uint16_t acObjInstId, uint16_t acOwner); -bool acc_ctrl_oi_add_ac_val(lwm2m_object_t *accCtrlObjP, uint16_t instId, - uint16_t aclResId, uint16_t acValue); +lwm2m_object_t* acc_ctrl_create_object(void); +void acl_ctrl_free_object(lwm2m_object_t * objectP); +bool acc_ctrl_obj_add_inst (lwm2m_object_t* accCtrlObjP, uint16_t instId, + uint16_t acObjectId, uint16_t acObjInstId, uint16_t acOwner); +bool acc_ctrl_oi_add_ac_val(lwm2m_object_t* accCtrlObjP, uint16_t instId, + uint16_t aclResId, uint16_t acValue); /* * lwm2mclient.c */ -void handle_value_changed(lwm2m_context_t *lwm2mH, lwm2m_uri_t *uri, const char *value, size_t valueLength); -/* - * system_api.c - */ -void init_value_change(lwm2m_context_t *lwm2m); -void system_reboot(void); +void handle_value_changed(lwm2m_context_t* lwm2mH, lwm2m_uri_t* uri, const char * value, size_t valueLength); /* - * object_security.c - */ -lwm2m_object_t *get_security_object(int serverId, const char *serverUri, char *bsPskId, char *psk, uint16_t pskLen, bool isBootstrap); -void clean_security_object(lwm2m_object_t *objectP); -char *get_server_uri(lwm2m_object_t *objectP, uint16_t secObjInstID); -void display_security_object(lwm2m_object_t *objectP); -void copy_security_object(lwm2m_object_t *objectDest, lwm2m_object_t *objectSrc); -pthread_addr_t client_main(void); - -/* - * Server IP address, Port + * TINYARA + * DM (Device Management) Frameworks APIs */ +pthread_addr_t lwm2m_client_run(void); char *client_set_serverAddr(FAR const char *serverAddr, bool isbootstrap); char *client_get_serverAddr(void); char *client_set_serverPort(FAR const char *serverPort, bool isbootstrap); char *client_get_serverPort(void); -int client_object_dump(char *buffer); - +int client_object_dump(char *buffer); int client_set_lifetime(int lifetime); +int client_change_resource(char *buffer, void *user_data); + void client_initiate_bootstrap(void); void client_close(void); -int client_change_resource(char *buffer, void *user_data); + +/* + * system_api.c + */ +void init_value_change(lwm2m_context_t * lwm2m); +void system_reboot(void); + +/* + * object_security.c + */ +lwm2m_object_t * get_security_object(int serverId, const char* serverUri, char * bsPskId, char * psk, uint16_t pskLen, bool isBootstrap); +void clean_security_object(lwm2m_object_t * objectP); +char * get_server_uri(lwm2m_object_t * objectP, uint16_t secObjInstID); +void display_security_object(lwm2m_object_t * objectP); +void copy_security_object(lwm2m_object_t * objectDest, lwm2m_object_t * objectSrc); + #endif /* LWM2MCLIENT_H_ */ diff --git a/external/wakaama/examples/client/object_connectivity_moni.c b/external/wakaama/examples/client/object_connectivity_moni.c index 696659e..4a06610 100644 --- a/external/wakaama/examples/client/object_connectivity_moni.c +++ b/external/wakaama/examples/client/object_connectivity_moni.c @@ -43,8 +43,6 @@ #include #include -#include "connectivity_interface.h" - // Resource Id's: #define RES_M_NETWORK_BEARER 0 #define RES_M_AVL_NETWORK_BEARER 1 @@ -57,15 +55,7 @@ #define RES_O_CELL_ID 8 #define RES_O_SMNC 9 #define RES_O_SMCC 10 -#define RES_O_RFCHANNEL 11 -#define RES_O_TX_POWER 12 -#define RES_O_LISTEN_INTERVAL 13 -#define RES_O_NOISE 14 -#define RES_O_RATE 15 -#define RES_O_LQI 16 -#define RES_O_WIFI_VERSION 17 - -#if 0 + #define VALUE_NETWORK_BEARER_GSM 0 //GSM see #define VALUE_AVL_NETWORK_BEARER_1 0 //GSM #define VALUE_AVL_NETWORK_BEARER_2 21 //WLAN @@ -84,407 +74,24 @@ #define VALUE_LINK_UTILIZATION 666 #define VALUE_SMNC 33 #define VALUE_SMCC 44 -#endif - - typedef struct { -#if 0 char ipAddresses[2][16]; // limited to 2! char routerIpAddresses[2][16]; // limited to 2! long cellId; int signalStrength; int linkQuality; int linkUtilization; - int rfChannel; - uint8_t txPower; - int listenInterval; - - int noise; - int rate; - int lqi; - char version; -#endif - char ipAddresses[2][16]; // limited to 2! - int signalStrength; - int rate; - int nwbearer; - int available_bearer; } conn_m_data_t; -/**************************************************************************** - * Private Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: fetch_network_bearer - * - * Description: - * To get the underlined network bearer for lwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ -#if 0 -static void fetch_network_bearer(int *value) -{ - (*value)=0; -} -#endif -/**************************************************************************** - * Name: fetch_avl_network_bearer - * - * Description: - * To get the available underlined network bearer for lwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ -#if 0 -static void fetch_avl_network_bearer(int *value) -{ - (*value)=0; -} -#endif -/**************************************************************************** - * Name: fetch_rssi - * - * Description: - * Get signal strength value from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ -#if 0 -static void fetch_rssi(int *value) -{ -#if defined(CONFIG_WICED) && (CONFIG_ARCH_CHIP_BCM4390X == 1) - wwd_wifi_get_rssi(value); - printf("address of rssi is %d\n", value); -#else - (*value)=get_signal_strength(); -#endif -} -#endif -/**************************************************************************** - * Name: fetch_channel - * - * Description: - * Get RF channel from driver - * - * Returned Value: - * - * - ****************************************************************************/ -#if 0 -static void fetch_channel(int *value) -{ -#if defined(CONFIG_WICED) && (CONFIG_ARCH_CHIP_BCM4390X == 1) - wwd_wifi_get_channel(WWD_STA_INTERFACE, value); -#else - *value = 0; -#endif - -} -#endif -/**************************************************************************** - * Name: fetch_lqi - * - * Description: - * Get link quality index value from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ -#if 0 - static void fetch_lqi(int *value) -{ -#if defined(CONFIG_WICED) && (CONFIG_ARCH_CHIP_BCM4390X == 1) - wwd_wifi_get_rssi(value); -#else - (*value)=get_signal_strength(); -#endif -} -#endif - -/**************************************************************************** - * Name: fetch_tx_power - * - * Description: - * Get tx power - * - * Returned Value: - * - * - ****************************************************************************/ -#if 0 -static void fetch_tx_power(uint8_t *value) -{ -#if defined(CONFIG_WICED) && (CONFIG_ARCH_CHIP_BCM4390X == 1) - wwd_wifi_get_tx_power(value); -#else - *value = 0; -#endif - -} -#endif -/**************************************************************************** - * Name: fetch_listen_interval - * - * Description: - * Get tx power - * - * Returned Value: - * - * - ****************************************************************************/ -#if 0 -static void fetch_listen_interval(wiced_listen_interval_t* value) -{ -#if defined(CONFIG_WICED) && (CONFIG_ARCH_CHIP_BCM4390X == 1) - wwd_wifi_get_listen_interval(value); -#else - *value = 0; -#endif - -} -#endif -/**************************************************************************** - * Name: fetch_noise - * - * Description: - * Get noise - * - * Returned Value: - * - * - ****************************************************************************/ -#if 0 -static void fetch_noise(int *value) -{ -#if defined(CONFIG_WICED) && (CONFIG_ARCH_CHIP_BCM4390X == 1) - wwd_wifi_get_noise(value); -#else - *value = 0; -#endif -} -#endif -/**************************************************************************** - * Name: fetch_rate - * - * Description: - * Get the transmision data rate for provided interface - * - * Returned Value: - * - * - ****************************************************************************/ -#if 0 -static void fetch_rate(int *value) -{ -#if defined(CONFIG_WICED) && (CONFIG_ARCH_CHIP_BCM4390X == 1) - wwd_wifi_get_rate(WWD_STA_INTERFACE,value); -#else - *value = 0; -#endif -} -#endif - -/**************************************************************************** - * Name: fetch_wifi_version - * - * Description: - * Get the transmision data rate for provided interface - * - * Returned Value: - * - * - ****************************************************************************/ -//static void fetch_wifi_version(char* value, uint8_t length) -//char fetch_wifi_version (char value, uint8_t length) -//{ -//#if defined(CONFIG_WICED) && (CONFIG_ARCH_CHIP_BCM4390X == 1) -// wwd_wifi_get_wifi_version(value, sizeof(value)); -// printf("wifi version called is %c\n", value); -//#else -// *value = a; -//#endif -// return value; -//} - -/**************************************************************************** - * Name: fetch_ip_address - * - * Description: - * Get the assinged IPv4/IPv6 address from Connectivity Manager - * - * Returned Value: - * - ****************************************************************************/ -#if 0 -static void fetch_ip_address(char *value) -{ - get_ip_address(value); -} -#endif -/**************************************************************************** - * Name: fetch_router_ip_address - * - * Description: - * Get the Router's IPv4/IPv6 address from Connectivity Manager - * - * Returned Value: - * - * - ****************************************************************************/ -#if 0 -static void fetch_router_ip_address(char *value) -{ - get_router_ip_address(value); -} -#endif -/**************************************************************************** - * Name: fetch_link_utilization - * - * Description: - * Get the link utilization statistics from Connectivity Manager - * - * Returned Value: - * - * - ****************************************************************************/ -#if 0 -static void fetch_link_utilization(int *value) -{ - (*value)=get_link_utilization(); -} -#endif -/**************************************************************************** - * Name: fetch_APN - * - * Description: - * Get APN value from Connectivity Manager - * - * Returned Value: - * - * - ****************************************************************************/ -#if 0 -static void fetch_APN(char *value) -{ - strcpy(value,"\0"); -} -#endif -/**************************************************************************** - * Name: fetch_cell_id - * - * Description: - * Get cell id value from Connectivity Manager - * - * Returned Value: - * - * - ****************************************************************************/ -#if 0 -static void fetch_cell_id(int *value) -{ - (*value)=0; -} -#endif -/**************************************************************************** - * Name: fetch_SMNC - * - * Description: - * - * - * Returned Value: - * - * - ****************************************************************************/ -#if 0 -static void fetch_SMNC(int *value) -{ - (*value)=0; -} -#endif -/**************************************************************************** - * Name: fetch_SMCC - * - * Description: - * - * - * Returned Value: - * - * - ****************************************************************************/ -#if 0 -static void fetch_SMCC(int *value) -{ - (*value)=0; -} -#endif -/**************************************************************************** - * Name: fetch_initial_values - * - * Description: - * Get initialization values from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ -static void fetch_initial_values(conn_m_data_t *myData) -{ -#if 0 - fetch_cell_id(&myData->cellId); - fetch_rssi(&myData->signalStrength); - fetch_lqi(&myData->linkQuality); - fetch_link_utilization(&myData->linkUtilization); - fetch_ip_address(*(myData->ipAddresses + 0)); - fetch_router_ip_address(*(myData->routerIpAddresses + 0)); - fetch_channel(&myData->rfChannel); - fetch_tx_power(&myData->txPower); - fetch_listen_interval(&myData->listenInterval); - fetch_noise(&myData->noise); - fetch_rate(&myData->rate); - fetch_lqi(&myData->lqi); -#endif - get_network_bearer(&myData->nwbearer); - get_avl_network_bearer(&myData->available_bearer); - get_signal_strength(&myData->signalStrength); - get_bitrate(&myData->rate); - get_ip_address(&myData->ipAddresses); -} - -/**************************************************************************** - * Name: prv_set_value - * - * Description: - * - * - * Returned Value: - * Return the appropriate error code or success code value - * - ****************************************************************************/ - static uint8_t prv_set_value(lwm2m_data_t * dataP, conn_m_data_t * connDataP) { - int value; - uint8_t tx_val; - char apn[20]; switch (dataP->id) { case RES_M_NETWORK_BEARER: - get_network_bearer(&value); - connDataP->nwbearer = value; - printf("nwbearer is %d\n", value); - lwm2m_data_encode_int(connDataP->nwbearer, dataP); + lwm2m_data_encode_int(VALUE_NETWORK_BEARER_GSM, dataP); return COAP_205_CONTENT; case RES_M_AVL_NETWORK_BEARER: @@ -493,25 +100,17 @@ static uint8_t prv_set_value(lwm2m_data_t * dataP, lwm2m_data_t * subTlvP; subTlvP = lwm2m_data_new(riCnt); subTlvP[0].id = 0; - get_avl_network_bearer(&value); - connDataP->available_bearer = value; - lwm2m_data_encode_int(connDataP->available_bearer, subTlvP); + lwm2m_data_encode_int(VALUE_AVL_NETWORK_BEARER_1, subTlvP); lwm2m_data_encode_instances(subTlvP, riCnt, dataP); return COAP_205_CONTENT ; } case RES_M_RADIO_SIGNAL_STRENGTH: //s-int - get_signal_strength(&value); - connDataP->signalStrength = value; lwm2m_data_encode_int(connDataP->signalStrength, dataP); return COAP_205_CONTENT; case RES_O_LINK_QUALITY: //s-int - /* TODO */ -#if 0 - connDataP->linkQuality=value; lwm2m_data_encode_int(connDataP->linkQuality, dataP); -#endif return COAP_205_CONTENT ; case RES_M_IP_ADDRESSES: @@ -521,7 +120,6 @@ static uint8_t prv_set_value(lwm2m_data_t * dataP, for (ri = 0; ri < riCnt; ri++) { subTlvP[ri].id = ri; - get_ip_address(*(connDataP->ipAddresses + ri)); lwm2m_data_encode_string(connDataP->ipAddresses[ri], subTlvP + ri); } lwm2m_data_encode_instances(subTlvP, riCnt, dataP); @@ -531,27 +129,20 @@ static uint8_t prv_set_value(lwm2m_data_t * dataP, case RES_O_ROUTER_IP_ADDRESS: { - /* TODO */ -#if 0 int ri, riCnt = 1; // reduced to 1 instance to fit in one block size lwm2m_data_t* subTlvP = lwm2m_data_new(riCnt); for (ri=0; rirouterIpAddresses[ri], subTlvP + ri); } lwm2m_data_encode_instances(subTlvP, riCnt, dataP); -#endif return COAP_205_CONTENT ; } break; case RES_O_LINK_UTILIZATION: - /* TODO */ -#if 0 lwm2m_data_encode_int(connDataP->linkUtilization, dataP); -#endif return COAP_205_CONTENT; case RES_O_APN: @@ -560,75 +151,24 @@ static uint8_t prv_set_value(lwm2m_data_t * dataP, lwm2m_data_t * subTlvP; subTlvP = lwm2m_data_new(riCnt); subTlvP[0].id = 0; - /* Not used */ - lwm2m_data_encode_string(apn, subTlvP); + lwm2m_data_encode_string(VALUE_APN_1, subTlvP); lwm2m_data_encode_instances(subTlvP, riCnt, dataP); return COAP_205_CONTENT; } break; case RES_O_CELL_ID: - /* Not used */ + lwm2m_data_encode_int(connDataP->cellId, dataP); return COAP_205_CONTENT ; case RES_O_SMNC: - /* Not used */ - lwm2m_data_encode_int(value, dataP); + lwm2m_data_encode_int(VALUE_SMNC, dataP); return COAP_205_CONTENT ; case RES_O_SMCC: - /* Not used */ - lwm2m_data_encode_int(value, dataP); + lwm2m_data_encode_int(VALUE_SMCC, dataP); return COAP_205_CONTENT ; - case RES_O_RFCHANNEL: - /* TODO */ - printf("channel: %d\n", value); - lwm2m_data_encode_int(value, dataP); - return COAP_205_CONTENT; - - case RES_O_TX_POWER: - /* TODO */ - return COAP_205_CONTENT; - - case RES_O_LISTEN_INTERVAL: -{ - /* TODO */ -#if 0 - wiced_listen_interval_t interval_value; - fetch_listen_interval(&interval_value); -#endif - lwm2m_data_encode_int(value, dataP); - return COAP_205_CONTENT; -} - - case RES_O_NOISE: - /* TODO */ - printf("Noise: %d dbm\n", value); - lwm2m_data_encode_int(value, dataP); - return COAP_205_CONTENT; - - case RES_O_RATE: - get_bitrate(&value); - printf("Rate: %d kbps\n ", value); - lwm2m_data_encode_int(value, dataP); - return COAP_205_CONTENT; - - case RES_O_LQI: - /* TODO */ - if (value < -100) - value = 0; - else{ - if (value > -50) - value = 100; - else{ - value = 2*(value+100); - } - } - printf("LQI: %d (%)\n", value); - lwm2m_data_encode_int(value, dataP); - return COAP_205_CONTENT; - default: return COAP_404_NOT_FOUND ; } @@ -652,7 +192,6 @@ static uint8_t prv_read(uint16_t instanceId, if (*numDataP == 0) { uint16_t resList[] = { -#if 0 RES_M_NETWORK_BEARER, RES_M_AVL_NETWORK_BEARER, RES_M_RADIO_SIGNAL_STRENGTH, @@ -663,14 +202,7 @@ static uint8_t prv_read(uint16_t instanceId, RES_O_APN, RES_O_CELL_ID, RES_O_SMNC, - RES_O_SMCC, - RES_O_RFCHANNEL -#endif - RES_M_NETWORK_BEARER, - RES_M_AVL_NETWORK_BEARER, - RES_M_RADIO_SIGNAL_STRENGTH, - RES_M_IP_ADDRESSES, - RES_O_RATE + RES_O_SMCC }; int nbRes = sizeof(resList) / sizeof(uint16_t); @@ -741,8 +273,7 @@ lwm2m_object_t * get_object_conn_m(void) */ if (NULL != connObj->userData) { - conn_m_data_t *myData = (conn_m_data_t*) connObj->userData; -#if 0 + conn_m_data_t *myData = (conn_m_data_t*) connObj->userData; myData->cellId = VALUE_CELL_ID; myData->signalStrength = VALUE_RADIO_SIGNAL_STRENGTH; myData->linkQuality = VALUE_LINK_QUALITY; @@ -751,9 +282,6 @@ lwm2m_object_t * get_object_conn_m(void) strcpy(myData->ipAddresses[1], VALUE_IP_ADDRESS_2); strcpy(myData->routerIpAddresses[0], VALUE_ROUTER_IP_ADDRESS_1); strcpy(myData->routerIpAddresses[1], VALUE_ROUTER_IP_ADDRESS_2); -#else - fetch_initial_values(myData); -#endif } else { @@ -795,7 +323,6 @@ uint8_t connectivity_moni_change(lwm2m_data_t * dataArray, break; case RES_O_LINK_QUALITY: -#if 0 if (1 == lwm2m_data_decode_int(dataArray, &value)) { data->linkQuality = value; @@ -805,7 +332,6 @@ uint8_t connectivity_moni_change(lwm2m_data_t * dataArray, { result = COAP_400_BAD_REQUEST; } -#endif break; case RES_M_IP_ADDRESSES: @@ -823,7 +349,6 @@ uint8_t connectivity_moni_change(lwm2m_data_t * dataArray, break; case RES_O_ROUTER_IP_ADDRESS: -#if 0 if (sizeof(data->routerIpAddresses[0]) <= dataArray->value.asBuffer.length) { result = COAP_400_BAD_REQUEST; @@ -835,11 +360,9 @@ uint8_t connectivity_moni_change(lwm2m_data_t * dataArray, data->routerIpAddresses[0][dataArray->value.asBuffer.length] = 0; result = COAP_204_CHANGED; } -#endif break; case RES_O_CELL_ID: -#if 0 if (1 == lwm2m_data_decode_int(dataArray, &value)) { data->cellId = value; @@ -849,7 +372,6 @@ uint8_t connectivity_moni_change(lwm2m_data_t * dataArray, { result = COAP_400_BAD_REQUEST; } -#endif break; default: @@ -858,3 +380,4 @@ uint8_t connectivity_moni_change(lwm2m_data_t * dataArray, return result; } + diff --git a/external/wakaama/examples/client/object_connectivity_stat.c b/external/wakaama/examples/client/object_connectivity_stat.c index 17f793a..939b32b 100644 --- a/external/wakaama/examples/client/object_connectivity_stat.c +++ b/external/wakaama/examples/client/object_connectivity_stat.c @@ -20,18 +20,18 @@ * * Resources: * - * Name | ID | Oper. | Inst. | Mand.| Type | Range | Units | Descripton | - * SMS Tx Counter | 0 | R | Single| No | Integer | | | | - * SMS Rx Counter | 1 | R | Single| No | Integer | | | | - * Tx Data | 2 | R | Single| No | Integer | | kByte | | - * Rx Data | 3 | R | Single| No | Integer | | kByte | | - * Max Message Size | 4 | R | Single| No | Integer | | Byte | | - * Average Message Size | 5 | R | Single| No | Integer | | Byte | | - * StartOrReset | 6 | E | Single| Yes | Integer | | | | + * Name | ID | Oper. | Inst. | Mand.| Type | Range | Units | Description | + * SMS Tx Counter | 0 | R | Single| No | Integer | | | | + * SMS Rx Counter | 1 | R | Single| No | Integer | | | | + * Tx Data | 2 | R | Single| No | Integer | | kByte | | + * Rx Data | 3 | R | Single| No | Integer | | kByte | | + * Max Message Size | 4 | R | Single| No | Integer | | Byte | | + * Average Message Size | 5 | R | Single| No | Integer | | Byte | | + * StartOrReset | 6 | E | Single| Yes | Integer | | | | */ #include "liblwm2m.h" -#include "tinyara/net/net.h" + #include #include #include @@ -45,7 +45,6 @@ #define RES_O_MAX_MESSAGE_SIZE 4 #define RES_O_AVERAGE_MESSAGE_SIZE 5 #define RES_M_START_OR_RESET 6 -#define RES_O_COLLECTION_PERIOD 7 typedef struct { @@ -57,240 +56,35 @@ typedef struct int64_t avrMessageSize; int64_t messageCount; // private for incremental average calc. bool collectDataStarted; - uint32_t collectionPeriod; } conn_s_data_t; - -/**************************************************************************** - * Name: fetch_smsTx - * - * Description: - * To get the smsTx statistic value for lwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ - void fetch_smsTx(int *value); - - /**************************************************************************** - * Name: fetch_smsRx - * - * Description: - * To get the smsRx statistic value forlwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ - void fetch_smsRx(int *value); - -/**************************************************************************** - * Name: fetch_txDataByte - * - * Description: - * To get the txDataByte value for lwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ - void fetch_txDataByte(int *value); - -/**************************************************************************** - * Name: fetch_rxDataByte - * - * Description: - * To get the rxDataByte value for lwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ - void fetch_rxDataByte(int *value); - -/**************************************************************************** - * Name: fetch_maxMessageSize - * - * Description: - * To get the maximum message size for lwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ - void fetch_maxMessageSize(int *value); - -/**************************************************************************** - * Name: fetch_avrMessageSize - * - * Description: - * To get the avegare message size for lwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ - void fetch_avrMessageSize(int *value); - - - -/**************************************************************************** - * Name: fetch_smsTx - * - * Description: - * To get the smsTx statistic value for lwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ - - void fetch_smsTx(int *value) -{ - (*value)=0; -} - - /**************************************************************************** - * Name: fetch_smsRx - * - * Description: - * To get the smsRx statistic value forlwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ - -void fetch_smsRx(int *value) -{ - (*value)=0; -} - - /**************************************************************************** - * Name: fetch_txDataByte - * - * Description: - * To get the txDataByte value for lwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ - -void fetch_txDataByte(int *value) -{ -#ifdef CONFIG_WL_WICED - (*value)= wifi_tx_count/1000; -#endif -#ifdef CONFIG_ENC28J60 - (*value)= eth_tx_count/1000; -#endif - -} - - /**************************************************************************** - * Name: fetch_rxDataByte - * - * Description: - * To get the rxDataByte value for lwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ - - void fetch_rxDataByte(int *value) -{ -#ifdef CONFIG_WL_WICED - (*value)=wifi_total_message_size/1000; -#endif -#ifdef CONFIG_ENC28J60 - (*value)=eth_total_message_size/1000; -#endif -} - - /**************************************************************************** - * Name: fetch_maxMessageSize - * - * Description: - * To get the maximum message size for lwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ - - void fetch_maxMessageSize(int *value) -{ -#ifdef CONFIG_WL_WICED - (*value)=wifi_max_message_size/1000; -#endif -#ifdef CONFIG_ENC28J60 - (*value)=eth_max_message_size/1000; -#endif -} - - /**************************************************************************** - * Name: fetch_avrMessageSize - * - * Description: - * To get the avegare message size for lwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ - - void fetch_avrMessageSize(int *value) -{ -#ifdef CONFIG_WL_WICED - (*value)=wifi_avg_message_size/1000; -#endif -#ifdef CONFIG_ENC28J60 - (*value)=eth_avg_message_size/1000; -#endif - -} - static uint8_t prv_set_tlv(lwm2m_data_t * dataP, conn_s_data_t * connStDataP) { switch (dataP->id) { case RES_O_SMS_TX_COUNTER: - //fetch_smsTx(&connStDataP->smsTxCounter); lwm2m_data_encode_int(connStDataP->smsTxCounter, dataP); return COAP_205_CONTENT; break; case RES_O_SMS_RX_COUNTER: - // fetch_smsRx(&connStDataP->smsRxCounter); lwm2m_data_encode_int(connStDataP->smsRxCounter, dataP); return COAP_205_CONTENT; break; case RES_O_TX_DATA: - //fetch_txDataByte(&connStDataP->txDataByte); lwm2m_data_encode_int(connStDataP->txDataByte/1024, dataP); return COAP_205_CONTENT; break; case RES_O_RX_DATA: - //fetch_rxDataByte(&connStDataP->rxDataByte); lwm2m_data_encode_int(connStDataP->rxDataByte/1024, dataP); return COAP_205_CONTENT; break; case RES_O_MAX_MESSAGE_SIZE: - //fetch_maxMessageSize(&connStDataP->maxMessageSize); lwm2m_data_encode_int(connStDataP->maxMessageSize, dataP); return COAP_205_CONTENT; break; case RES_O_AVERAGE_MESSAGE_SIZE: - //fetch_avrMessageSize(&connStDataP->avrMessageSize); lwm2m_data_encode_int(connStDataP->avrMessageSize, dataP); return COAP_205_CONTENT; break; - case RES_O_COLLECTION_PERIOD: - //fetch_avrMessageSize(&connStDataP->collectionPeriod); - lwm2m_data_encode_int(connStDataP->collectionPeriod, dataP); - return COAP_205_CONTENT; - break; default: return COAP_404_NOT_FOUND ; } @@ -316,8 +110,7 @@ static uint8_t prv_read(uint16_t instanceId, int * numDataP, lwm2m_data_t** data RES_O_TX_DATA, RES_O_RX_DATA, RES_O_MAX_MESSAGE_SIZE, - RES_O_AVERAGE_MESSAGE_SIZE, - RES_O_COLLECTION_PERIOD, + RES_O_AVERAGE_MESSAGE_SIZE }; int nbRes = sizeof(resList) / sizeof(uint16_t); @@ -351,23 +144,7 @@ static void prv_resetCounter(lwm2m_object_t* objectP, bool start) myData->maxMessageSize = 0; myData->avrMessageSize = 0; myData->messageCount = 0; - myData->collectionPeriod = 0; myData->collectDataStarted = start; -#ifdef CONFIG_WL_WICED - wifi_tx_count=0; - wifi_rx_count=0; - wifi_max_message_size=0; - wifi_avg_message_size=0; - wifi_total_message_size=0; -#endif -#ifdef CONFIG_ENC28J60 - eth_tx_count=0; - eth_rx_count=0; - eth_max_message_size=0; - eth_avg_message_size=0; - eth_total_message_size=0; -#endif - } static uint8_t prv_exec(uint16_t instanceId, uint16_t resourceId, @@ -391,7 +168,6 @@ static uint8_t prv_exec(uint16_t instanceId, uint16_t resourceId, } } -#if 1 void conn_s_updateTxStatistic(lwm2m_object_t * objectP, uint16_t txDataByte, bool smsBased) { conn_s_data_t* myData = (conn_s_data_t*) (objectP->userData); @@ -422,7 +198,7 @@ void conn_s_updateRxStatistic(lwm2m_object_t * objectP, uint16_t rxDataByte, boo if (smsBased) myData->smsRxCounter++; } } -#endif + lwm2m_object_t * get_object_conn_s(void) { diff --git a/external/wakaama/examples/client/object_connectivity_stat.h b/external/wakaama/examples/client/object_connectivity_stat.h deleted file mode 100644 index 069fa29..0000000 --- a/external/wakaama/examples/client/object_connectivity_stat.h +++ /dev/null @@ -1,120 +0,0 @@ - -/* - * This connectivity statistics object is optional and single instance only - * - * Resources: - * - * Name | ID | Oper. | Inst. | Mand.| Type | Range | Units | Descripton | - * SMS Tx Counter | 0 | R | Single| No | Integer | | | | - * SMS Rx Counter | 1 | R | Single| No | Integer | | | | - * Tx Data | 2 | R | Single| No | Integer | | kByte | | - * Rx Data | 3 | R | Single| No | Integer | | kByte | | - * Max Message Size | 4 | R | Single| No | Integer | | Byte | | - * Average Message Size | 5 | R | Single| No | Integer | | Byte | | - * StartOrReset | 6 | E | Single| Yes | Integer | | | | - */ - - -#include -#include -#include -#include - -#include "../../core/liblwm2m.h" -#include "../../../../os/include/tinyara/net/net.h" - - -// Resource Id's: -#define RES_O_SMS_TX_COUNTER 0 -#define RES_O_SMS_RX_COUNTER 1 -#define RES_O_TX_DATA 2 -#define RES_O_RX_DATA 3 -#define RES_O_MAX_MESSAGE_SIZE 4 -#define RES_O_AVERAGE_MESSAGE_SIZE 5 -#define RES_M_START_OR_RESET 6 -#define RES_O_COLLECTION_PERIOD 7 - -typedef struct -{ - int64_t smsTxCounter; - int64_t smsRxCounter; - int64_t txDataByte; // report in kByte! - int64_t rxDataByte; // report in kByte! - int64_t maxMessageSize; - int64_t avrMessageSize; - int64_t messageCount; // private for incremental average calc. - bool collectDataStarted; - uint32_t collectionPeriod; -} conn_s_data_t; - -/**************************************************************************** - * Name: fetch_smsTx - * - * Description: - * To get the smsTx statistic value for lwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ - void fetch_smsTx(int *value); - - /**************************************************************************** - * Name: fetch_smsRx - * - * Description: - * To get the smsRx statistic value forlwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ - void fetch_smsRx(int *value); - -/**************************************************************************** - * Name: fetch_txDataByte - * - * Description: - * To get the txDataByte value for lwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ - void fetch_txDataByte(int *value); - -/**************************************************************************** - * Name: fetch_rxDataByte - * - * Description: - * To get the rxDataByte value for lwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ - void fetch_rxDataByte(int *value); - -/**************************************************************************** - * Name: fetch_maxMessageSize - * - * Description: - * To get the maximum message size for lwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ - void fetch_maxMessageSize(int *value); - -/**************************************************************************** - * Name: fetch_avrMessageSize - * - * Description: - * To get the avegare message size for lwm2m from connectivity manager - * - * Returned Value: - * - * - ****************************************************************************/ - void fetch_avrMessageSize(int *value); diff --git a/external/wakaama/examples/client/object_device.c b/external/wakaama/examples/client/object_device.c index 9b31f9f..9e6e30c 100644 --- a/external/wakaama/examples/client/object_device.c +++ b/external/wakaama/examples/client/object_device.c @@ -57,7 +57,7 @@ #include "liblwm2m.h" #include "lwm2mclient.h" -#include "power_monitor_interface.h" + #include #include #include @@ -108,12 +108,6 @@ #define RES_O_SOFTWARE_VERSION 19 #define RES_O_BATTERY_STATUS 20 #define RES_O_MEMORY_TOTAL 21 -/* Added for Tinyara */ -#define RES_O_POWER_STATES 22 -#define RES_O_POWER_CURR_STATE 23 -#define RES_O_POWER_TIME_SPENT 24 -#define RES_O_POWER_EXPECTED_LIFETIME 25 - typedef struct @@ -123,9 +117,6 @@ typedef struct int64_t time; uint8_t battery_level; char time_offset[PRV_OFFSET_MAXLEN]; - char power_states[POWER_STATES_LEN]; - char battery_lifetime[BATTERY_LIFETIME_LEN]; - char battery_levels[BATTERY_LEVEL_LEN]; } device_data_t; @@ -247,9 +238,7 @@ static uint8_t prv_set_value(lwm2m_data_t * dataP, } case RES_O_BATTERY_LEVEL: - fetch_battery_level(devDataP->battery_levels); - lwm2m_data_encode_string(devDataP->battery_levels, dataP); - printf("power level = %s\n", devDataP->battery_levels); + lwm2m_data_encode_int(devDataP->battery_level, dataP); return COAP_205_CONTENT; case RES_O_MEMORY_FREE: @@ -287,26 +276,6 @@ static uint8_t prv_set_value(lwm2m_data_t * dataP, case RES_M_BINDING_MODES: lwm2m_data_encode_string(PRV_BINDING_MODE, dataP); return COAP_205_CONTENT; - - case RES_O_POWER_STATES: - fetch_power_states(devDataP->power_states); - lwm2m_data_encode_string(devDataP->power_states, dataP); - printf("power states = %s\n", devDataP->power_states); - return COAP_205_CONTENT; - - case RES_O_POWER_CURR_STATE: - - return COAP_205_CONTENT; - - case RES_O_POWER_TIME_SPENT: - - return COAP_205_CONTENT; - - case RES_O_POWER_EXPECTED_LIFETIME: - fetch_battery_lifetime(devDataP->battery_lifetime); - lwm2m_data_encode_string(devDataP->battery_lifetime, dataP); - printf("battery lifetime = %s\n", devDataP->battery_lifetime); - return COAP_205_CONTENT; default: return COAP_404_NOT_FOUND; @@ -347,11 +316,7 @@ static uint8_t prv_device_read(uint16_t instanceId, RES_O_CURRENT_TIME, RES_O_UTC_OFFSET, RES_O_TIMEZONE, - RES_M_BINDING_MODES, - RES_O_POWER_STATES, - RES_O_POWER_CURR_STATE, - RES_O_POWER_TIME_SPENT, - RES_O_POWER_EXPECTED_LIFETIME, + RES_M_BINDING_MODES }; int nbRes = sizeof(resList)/sizeof(uint16_t); @@ -514,13 +479,7 @@ static uint8_t prv_device_write(uint16_t instanceId, return result; } -static void prv_reboot(void) -{ - g_reboot = 1; -#ifdef CONFIG_ARCH_CHIP_S5JT200 - *(int*)0x80090400 = 1; -#endif -} + static uint8_t prv_device_execute(uint16_t instanceId, uint16_t resourceId, uint8_t * buffer, @@ -539,7 +498,7 @@ static uint8_t prv_device_execute(uint16_t instanceId, { case RES_M_REBOOT: fprintf(stdout, "\n\t REBOOT\r\n\n"); - prv_reboot(); + g_reboot = 1; return COAP_204_CHANGED; case RES_O_FACTORY_RESET: fprintf(stdout, "\n\t FACTORY RESET\r\n\n"); @@ -630,7 +589,6 @@ lwm2m_object_t * get_object_device() } } - mount_procfs(); return deviceObj; } diff --git a/external/wakaama/examples/client/object_location.c b/external/wakaama/examples/client/object_location.c index 40336bc..c8736c4 100644 --- a/external/wakaama/examples/client/object_location.c +++ b/external/wakaama/examples/client/object_location.c @@ -31,14 +31,17 @@ * Resources: * Name | ID | Oper.|Instances|Mand.| Type | Range | Units | Description | * -------------+-----+------+---------+-----+---------+-------+-------+----------------------------------------------------------------------------------+ - * Latitude | 0 | R | Single | Yes | String | | Deg | The decimal notation of latitude e.g. - 45.5723 [Worlds Geodetic System 1984].| - * Longitude | 1 | R | Single | Yes | String | | Deg | The decimal notation of longitude e.g. - 153.21760 [Worlds Geodetic System 1984].| - * Altidude | 2 | R | Single | No | String | | m | The decimal notation of altidude in meters above sea level. | - * Uncertainty | 3 | R | Single | No | String | | m | The accuracy of the position in meters. | + * Latitude | 0 | R | Single | Yes | Float | | Deg | The decimal notation of latitude e.g. - 45.5723 [Worlds Geodetic System 1984].| + * Longitude | 1 | R | Single | Yes | Float | | Deg | The decimal notation of longitude e.g. - 153.21760 [Worlds Geodetic System 1984].| + * Altitude | 2 | R | Single | No | Float | | m | The decimal notation of altitude in meters above sea level. | + * Radius | 3 | R | Single | No | Float | | m | The value in the Radius Resource indicates the size in meters of a circular area | + * | | | | | | | | around a point of geometry. | * Velocity | 4 | R | Single | No | Opaque | | * | The velocity of the device as defined in 3GPP 23.032 GAD specification(*). | * | | | | | | | | This set of values may not be available if the device is static. | * | | | | | | | | opaque: see OMA_TS 6.3.2 | * Timestamp | 5 | R | Single | Yes | Time | | s | The timestamp when the location measurement was performed. | + * Speed | 6 | R | Single | No | Float | | m/s | Speed is the time rate of change in position of a LwM2M Client without regard | + * | | | | | | | | for direction: the scalar component of velocity. | */ #include "liblwm2m.h" @@ -56,26 +59,27 @@ #define RES_M_LATITUDE 0 #define RES_M_LONGITUDE 1 #define RES_O_ALTITUDE 2 -#define RES_O_UNCERTAINTY 3 +#define RES_O_RADIUS 3 #define RES_O_VELOCITY 4 #define RES_M_TIMESTAMP 5 +#define RES_O_SPEED 6 //----- 3GPP TS 23.032 V11.0.0(2012-09) --------- #define HORIZONTAL_VELOCITY 0 // for Octet-1 upper half(..<<4) #define HORIZONTAL_VELOCITY_VERTICAL 1 // set vertical direction bit! #define HORIZONTAL_VELOCITY_WITH_UNCERTAINTY 2 -#define VELOCITY_OCTETS 5 // for HORITZOL_VELOCITY_WITH_UNCERTAINTY -#define DEG_DECIMAL_PLACES 6 // configuration: degree decimals implementation +#define VELOCITY_OCTETS 5 // for HORIZONTAL_VELOCITY_WITH_UNCERTAINTY typedef struct { - char latitude [5 + DEG_DECIMAL_PLACES]; //"359.12345" frag=5, 9+1=10! degrees +\0 - char longitude [5 + DEG_DECIMAL_PLACES]; - char altitude [5 + DEG_DECIMAL_PLACES]; - char uncertainty[5 + DEG_DECIMAL_PLACES]; - uint8_t velocity [VELOCITY_OCTETS]; //3GPP notation 1st step: HORITZOL_VELOCITY_WITH_UNCERTAINTY + float latitude; + float longitude; + float altitude; + float radius; + uint8_t velocity [VELOCITY_OCTETS]; //3GPP notation 1st step: HORIZONTAL_VELOCITY_WITH_UNCERTAINTY unsigned long timestamp; + float speed; } location_data_t; /** @@ -89,23 +93,26 @@ static uint8_t prv_res2tlv(lwm2m_data_t* dataP, switch (dataP->id) // location resourceId { case RES_M_LATITUDE: - lwm2m_data_encode_string(locDataP->latitude, dataP); + lwm2m_data_encode_float(locDataP->latitude, dataP); break; case RES_M_LONGITUDE: - lwm2m_data_encode_string(locDataP->longitude, dataP); + lwm2m_data_encode_float(locDataP->longitude, dataP); break; case RES_O_ALTITUDE: - lwm2m_data_encode_string(locDataP->altitude, dataP); + lwm2m_data_encode_float(locDataP->altitude, dataP); break; - case RES_O_UNCERTAINTY: - lwm2m_data_encode_string(locDataP->uncertainty, dataP); + case RES_O_RADIUS: + lwm2m_data_encode_float(locDataP->radius, dataP); break; case RES_O_VELOCITY: - lwm2m_data_encode_string(locDataP->velocity, dataP); + lwm2m_data_encode_string((const char*)locDataP->velocity, dataP); break; case RES_M_TIMESTAMP: lwm2m_data_encode_int(locDataP->timestamp, dataP); break; + case RES_O_SPEED: + lwm2m_data_encode_float(locDataP->speed, dataP); + break; default: ret = COAP_404_NOT_FOUND; break; @@ -145,9 +152,10 @@ static uint8_t prv_location_read(uint16_t objInstId, RES_M_LATITUDE, RES_M_LONGITUDE, RES_O_ALTITUDE, - RES_O_UNCERTAINTY, + RES_O_RADIUS, RES_O_VELOCITY, - RES_M_TIMESTAMP + RES_M_TIMESTAMP, + RES_O_SPEED }; // readable resources! *numDataP = sizeof(readResIds)/sizeof(uint16_t); @@ -177,8 +185,8 @@ void display_location_object(lwm2m_object_t * object) fprintf(stdout, " /%u: Location object:\r\n", object->objID); if (NULL != data) { - fprintf(stdout, " latitude: %s, longitude: %s, altitude: %s, uncertainty: %s, timestamp: %lu\r\n", - data->latitude, data->longitude, data->altitude, data->uncertainty, data->timestamp); + fprintf(stdout, " latitude: %.6f, longitude: %.6f, altitude: %.6f, radius: %.6f, timestamp: %lu, speed: %.6f\r\n", + data->latitude, data->longitude, data->altitude, data->radius, data->timestamp, data->speed); } #endif } @@ -225,16 +233,9 @@ void location_setLocationAtTime(lwm2m_object_t* locationObj, //-------------------------------------------------------------------- JH -- location_data_t* pData = locationObj->userData; -#if defined(ARDUINO) - dtostrf (latitude, -8, 6, pData->latitude); - dtostrf (longitude, -8, 6, pData->longitude); - dtostrf (altitude, -8, 4, pData->altitude); -#else - snprintf(pData->latitude, 5+DEG_DECIMAL_PLACES, "%-8.6f", (double)latitude); - snprintf(pData->longitude,5+DEG_DECIMAL_PLACES, "%-8.6f", (double)longitude); - snprintf(pData->altitude, 5+DEG_DECIMAL_PLACES, "%-8.4f", (double)altitude); -#endif - + pData->latitude = latitude; + pData->longitude = longitude; + pData->altitude = altitude; pData->timestamp = timestamp; } @@ -280,12 +281,13 @@ lwm2m_object_t * get_object_location(void) if (NULL != locationObj->userData) { location_data_t* data = (location_data_t*)locationObj->userData; - strcpy (data->latitude, "27.986065"); // Mount Everest :) - strcpy (data->longitude, "86.922623"); - strcpy (data->altitude, "8495.0000"); - strcpy (data->uncertainty, "0.01"); + data->latitude = 27.986065; // Mount Everest :) + data->longitude = 86.922623; + data->altitude = 8495.0000; + data->radius = 0.0; location_setVelocity(locationObj, 0, 0, 255); // 255: speedUncertainty not supported! data->timestamp = time(NULL); + data->speed = 0.0; } else { diff --git a/external/wakaama/examples/client/object_power_moni.c b/external/wakaama/examples/client/object_power_moni.c deleted file mode 100644 index dc91712..0000000 --- a/external/wakaama/examples/client/object_power_moni.c +++ /dev/null @@ -1,410 +0,0 @@ -/******************************************************************************* - * - * Copyright (c) 2014 Bosch Software Innovations GmbH Germany. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * and Eclipse Distribution License v1.0 which accompany this distribution. - * - * The Eclipse Public License is available at - * http://www.eclipse.org/legal/epl-v10.html - * The Eclipse Distribution License is available at - * http://www.eclipse.org/org/documents/edl-v10.php. - * - * Contributors: - * Bosch Software Innovations GmbH - Please refer to git log - * Pascal Rieux - Please refer to git log - * - *******************************************************************************/ - -#include "liblwm2m.h" - -#include -#include -#include -#include - -// Resource Id's: -#define RES_M_OBJ_ID 0 -#define RES_M_OBJINST_ID 1 -#define RES_O_STATE 2 -#define RES_O_CURRENT 3 -#define RES_O_TIME 4 - -struct power_m_data_s -{ - char state[10]; - int current; - int time; - int W; -}; - -typedef struct power_m_data_s power_m_data_t; - -struct power_monitor_oi_s -{ //linked list: - struct power_monitor_oi_s* next; // matches lwm2m_list_t::next - uint16_t objInstId; // matches lwm2m_list_t::id - // resources - power_m_data_t *power_monitor_resource; -}; - -typedef struct power_monitor_oi_s power_monitor_oi_t; - -typedef enum -{ - STATE_NORMAL, - STATE_IDLE, - STATE_STANDBY, - STATE_SLEEP, -} dm_lwm2m_power_state_e; - - -static const char *power_state_str[] = {"NORMAL", "IDLE", "STANDBY", "SLEEP"}; - -/**************************************************************************** - * Private Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: fetch_state - * - * Description: - * To get the state (idle, normal, sleep, standby) of a device - * - * Returned Value: - * - * -****************************************************************************/ -static void fetch_objID(int *value) -{ - (*value) = 8; -} -/****************************************************************************/ -static void fetch_objInstId(int *value) -{ - (*value) = 0; -} - -/*****************************************************************************/ -static void fetch_state(int *value) -{ - (*value) = STATE_NORMAL; -} - -/****************************************************************************/ - -static void fetch_time (int *value) -{ - (*value) = 1000; -} - -/****************************************************************************/ -static void fetch_current (int *value) -{ - (*value) = 1; -} -/****************************************************************************/ -static void fetch_write (int *value) -{ - - (*value) = 1; -} -/****************************************************************************/ - - -static uint8_t prv_set_value(lwm2m_data_t * dataP, power_m_data_t *powerDataP) -{ - int value; - - switch (dataP->id) - { - - case RES_O_STATE: - fetch_state(&value); - printf("state is %d\n", value); usleep(20000); - printf("Device power state is %s\n", power_state_str[value]); - strncpy(powerDataP->state, power_state_str[value], strlen(power_state_str[value])); - lwm2m_data_encode_string(powerDataP->state, dataP); - return COAP_205_CONTENT; - - case RES_O_CURRENT : - fetch_current(&value); - printf("Current consumption is %d\n", value); - powerDataP->current = value; - lwm2m_data_encode_int(powerDataP->current, dataP); - return COAP_205_CONTENT; - - case RES_O_TIME : - fetch_time(&value); - printf("Time spent in the state is %d\n", value); - powerDataP->time = value; - lwm2m_data_encode_int(powerDataP->time, dataP); - return COAP_205_CONTENT; - } -} - - - -static uint8_t prv_write_resources(uint16_t instanceId, int numData, - lwm2m_data_t* tlvArray, lwm2m_object_t* objectP, bool doCreate) -{ - int i; - uint8_t result; - int64_t value; - - power_monitor_oi_t* powerMonitorOiP = (power_monitor_oi_t *) - lwm2m_list_find(objectP->instanceList, instanceId); - if (NULL == powerMonitorOiP) - return COAP_404_NOT_FOUND ; - - i = 0; - do - { - switch (tlvArray[i].id) - { - case RES_O_STATE: - if (doCreate==false) - { - result = COAP_405_METHOD_NOT_ALLOWED; - } - else - { - if (1 != lwm2m_data_decode_int(&tlvArray[i], &value)) - { - result = COAP_400_BAD_REQUEST; - } - else - { - // TODO - } - } - break; - - case RES_O_CURRENT: - if (doCreate==false) - { - result = COAP_405_METHOD_NOT_ALLOWED; - } - else - { - if (1 != lwm2m_data_decode_int(&tlvArray[i], &value)) - { - result = COAP_400_BAD_REQUEST; - } - else - { - // TODO - } - } - break; - - case RES_O_TIME: - if (doCreate==false) - { - result = COAP_405_METHOD_NOT_ALLOWED; - } - else - { - if (1 != lwm2m_data_decode_int(&tlvArray[i], &value)) - { - result = COAP_400_BAD_REQUEST; - } - else - { - // TODO - } - } - break; - default: - return COAP_404_NOT_FOUND ; - } - i++; - } while (i < numData && result == COAP_204_CHANGED ); - - return result; -} - -static uint8_t prv_write(uint16_t instanceId, int numData, - lwm2m_data_t* tlvArray, lwm2m_object_t* objectP) -{ - return prv_write_resources(instanceId, numData, tlvArray, objectP, false); -} - -static uint8_t prv_delete(uint16_t id, lwm2m_object_t * objectP) -{ - power_monitor_oi_t* targetP; - - objectP->instanceList = lwm2m_list_remove(objectP->instanceList, id, - (lwm2m_list_t**)&targetP); - if (NULL == targetP) return COAP_404_NOT_FOUND; - -// LWM2M_LIST_FREE(targetP->accCtrlValList); - lwm2m_free(targetP); - - return COAP_202_DELETED; -} - -static uint8_t prv_read(uint16_t instanceId, - int * numDataP, - lwm2m_data_t ** dataArrayP, - lwm2m_object_t * objectP) -{ - uint8_t result; - int i; - - power_monitor_oi_t* powerMoniOiP = - (power_monitor_oi_t *)lwm2m_list_find(objectP->instanceList, instanceId); - printf("instance Id is %d\n", instanceId); - if (powerMoniOiP == NULL) - { - printf("No instance found\n"); - return COAP_404_NOT_FOUND ; - } - - - if (*numDataP == 0) - { - uint16_t resList[] = { - - RES_O_STATE, - RES_O_CURRENT, - RES_O_TIME - }; - int nbRes = sizeof(resList) / sizeof(uint16_t); - *dataArrayP = lwm2m_data_new(nbRes); - if (*dataArrayP == NULL) - return COAP_500_INTERNAL_SERVER_ERROR ; - *numDataP = nbRes; - for (i = 0; i < nbRes; i++) - { - (*dataArrayP)[i].id = resList[i]; - } - } - i = 0; - do - { - result = prv_set_value((*dataArrayP) + i, powerMoniOiP->power_monitor_resource); - i++; - } while (i < *numDataP && result == COAP_205_CONTENT); - return result; -} - -static uint8_t prv_create(uint16_t objInstId, int numData, - lwm2m_data_t * tlvArray, lwm2m_object_t * objectP) -{ - power_monitor_oi_t * targetP; - uint8_t result; - - targetP = (power_monitor_oi_t *)lwm2m_malloc(sizeof(power_monitor_oi_t)); - if (NULL == targetP) return COAP_500_INTERNAL_SERVER_ERROR; - memset(targetP, 0, sizeof(power_monitor_oi_t)); - - targetP->objInstId = objInstId; - objectP->instanceList = LWM2M_LIST_ADD(objectP->instanceList, targetP); - - result = prv_write_resources(objInstId, numData, tlvArray, objectP, true); - - if (result != COAP_204_CHANGED) - { - prv_delete(objInstId, objectP); - } - else - { - result = COAP_201_CREATED; - } - return result; -} - -lwm2m_object_t * get_power_monitor_object(void) -{ - lwm2m_object_t * powerObj; - - powerObj = (lwm2m_object_t *) malloc(sizeof(lwm2m_object_t)); - - if (powerObj != NULL) - { - memset(powerObj, 0x00, sizeof(lwm2m_object_t)); - - powerObj->objID = LWM2M_POWER_MONITOR_OBJECT_ID; - - powerObj->readFunc = prv_read; - powerObj->writeFunc = prv_write; - powerObj->createFunc = prv_create; - powerObj->deleteFunc = prv_delete; - powerObj->executeFunc = NULL; - } - - return powerObj; -} - - -bool power_monitor_obj_add_inst (lwm2m_object_t* powerMonitorObjP, uint16_t instId, - int domain_code) -{ - bool ret = false; - - if (NULL == powerMonitorObjP) - { - return ret; - } - else - { - // create an access control object instance - power_monitor_oi_t* powerMonitorOiP; - powerMonitorOiP = (power_monitor_oi_t *)lwm2m_malloc(sizeof(power_monitor_oi_t)); - if (NULL == powerMonitorOiP) - { - return ret; - } - else - { - memset(powerMonitorOiP, 0, sizeof(power_monitor_oi_t)); - // list: key - powerMonitorOiP->objInstId = instId; - // object instance data: - powerMonitorOiP->power_monitor_resource = (power_m_data_t *) - lwm2m_malloc(sizeof(power_m_data_t)); - powerMonitorOiP->power_monitor_resource->W = domain_code; - - powerMonitorObjP->instanceList = - LWM2M_LIST_ADD(powerMonitorObjP->instanceList, powerMonitorOiP); - ret = true; - } - } - return ret; -} -#if 0 -bool power_monitor_oi_add_ac_val (lwm2m_object_t* powerMonitorObjP, uint16_t instId, - uint16_t pmResId, uint16_t pmValue) -{ - bool ret = false; - - power_monitor_oi_t* powerMonitorOiP = (power_monitor_oi_t *) - lwm2m_list_find(powerMonitorObjP->instanceList, instId); - if (NULL == powerMonitorOiP) - return ret; - - return prv_add_ac_val (powerMonitorOiP, pmResId, pmValue); -} -#endif - -void power_monitor_free_object(lwm2m_object_t * objectP) -{ - power_monitor_oi_t *powermOiT; - power_monitor_oi_t *powermOiP = (power_monitor_oi_t*)objectP->instanceList; - while (powermOiP != NULL) - { - // first free acl (multiple resource!): - powermOiT = powermOiP; - powermOiP = powermOiP->next; - if (powermOiT->power_monitor_resource != NULL) - lwm2m_free(powermOiT->power_monitor_resource); - - lwm2m_free(powermOiT); - } - lwm2m_free(objectP); -} -/****************************************************************************/ - - - diff --git a/external/wakaama/examples/client/object_security.c b/external/wakaama/examples/client/object_security.c index 530711c..0ffb3f3 100644 --- a/external/wakaama/examples/client/object_security.c +++ b/external/wakaama/examples/client/object_security.c @@ -99,15 +99,15 @@ static uint8_t prv_get_value(lwm2m_data_t * dataP, return COAP_205_CONTENT; case LWM2M_SECURITY_PUBLIC_KEY_ID: - lwm2m_data_encode_opaque(targetP->publicIdentity, targetP->publicIdLen, dataP); + lwm2m_data_encode_opaque((uint8_t*)targetP->publicIdentity, targetP->publicIdLen, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SERVER_PUBLIC_KEY_ID: - lwm2m_data_encode_opaque(targetP->serverPublicKey, targetP->serverPublicKeyLen, dataP); + lwm2m_data_encode_opaque((uint8_t*)targetP->serverPublicKey, targetP->serverPublicKeyLen, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SECRET_KEY_ID: - lwm2m_data_encode_opaque(targetP->secretKey, targetP->secretKeyLen, dataP); + lwm2m_data_encode_opaque((uint8_t*)targetP->secretKey, targetP->secretKeyLen, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SMS_SECURITY_ID: @@ -115,11 +115,11 @@ static uint8_t prv_get_value(lwm2m_data_t * dataP, return COAP_205_CONTENT; case LWM2M_SECURITY_SMS_KEY_PARAM_ID: - lwm2m_data_encode_opaque(targetP->smsParams, targetP->smsParamsLen, dataP); + lwm2m_data_encode_opaque((uint8_t*)targetP->smsParams, targetP->smsParamsLen, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SMS_SECRET_KEY_ID: - lwm2m_data_encode_opaque(targetP->smsSecret, targetP->smsSecretLen, dataP); + lwm2m_data_encode_opaque((uint8_t*)targetP->smsSecret, targetP->smsSecretLen, dataP); return COAP_205_CONTENT; case LWM2M_SECURITY_SMS_SERVER_NUMBER_ID: diff --git a/external/wakaama/examples/client/power_monitor_interface.c b/external/wakaama/examples/client/power_monitor_interface.c deleted file mode 100644 index 40845cb..0000000 --- a/external/wakaama/examples/client/power_monitor_interface.c +++ /dev/null @@ -1,54 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include "power_monitor_interface.h" -#include "common_monitor_interface.h" - - -uint8_t pm_iobuffer[PROC_BUFFER_LEN]; - -void fetch_power_states(FAR char *powerstates) -{ - int ret; - uint8_t *filepath; - ret = asprintf(&filepath, "%s/power/system/states", PROC_MOUNTPOINT); - ret = readfile(filepath, pm_iobuffer, PROC_BUFFER_LEN); - if (ret == OK) - { - strncpy(powerstates, pm_iobuffer, strlen(pm_iobuffer)); - printf("powerstates %s:%s:%d\n", powerstates, pm_iobuffer, strlen(pm_iobuffer)); - } -} - -void fetch_battery_lifetime(FAR char *expectedlifetime) -{ - int ret; - uint8_t *filepath; - ret = mount(NULL, PROC_MOUNTPOINT, "procfs", 0, NULL); - printf("mount returns value %d\n", ret); - ret = asprintf(&filepath, "%s/power/battery/runtime", PROC_MOUNTPOINT); - ret = readfile(filepath, pm_iobuffer, PROC_BUFFER_LEN); - if (ret == OK) - { - strncpy(expectedlifetime, pm_iobuffer, strlen(pm_iobuffer)); - printf("expectedlifetime %s:%s:%d\n", expectedlifetime, pm_iobuffer, strlen(pm_iobuffer)); - } -} - -void fetch_battery_level(FAR char * batterylevel) -{ - int ret; - uint8_t *filepath; - ret = asprintf(&filepath, "%s/power/battery/life", PROC_MOUNTPOINT); - ret = readfile(filepath, pm_iobuffer, PROC_BUFFER_LEN); - if (ret == OK) - { - strncpy(batterylevel, pm_iobuffer, strlen(pm_iobuffer)); - printf("batterylevel %s:%s:%d\n", batterylevel, pm_iobuffer, strlen(pm_iobuffer)); - } -} \ No newline at end of file diff --git a/external/wakaama/examples/client/power_monitor_interface.h b/external/wakaama/examples/client/power_monitor_interface.h deleted file mode 100644 index d0732f7..0000000 --- a/external/wakaama/examples/client/power_monitor_interface.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _POWER_MONITOR_INTERFACE_H -#define _POWER_MONITOR_INTERFACE_H -enum power_state_e { - POWER_STATE_HIGH = 0, - POWER_STATE_MEDIUM, - POWER_STATE_LOW -}; - -#define POWER_STATES_LEN 64 -#define BATTERY_LIFETIME_LEN 32 -#define BATTERY_LEVEL_LEN 32 -void fetch_power_states(FAR char *powerstates); -void fetch_power_curr_state(char *currstate); -void fetch_power_time_spent(char *timespent); -void fetch_power_battery_state(char *batterystate); -void fetch_battery_lifetime(FAR char *expectedlifetime); -void fetch_battery_level(FAR char * batterylevel); -#endif \ No newline at end of file diff --git a/external/wakaama/examples/lightclient/CMakeLists.txt b/external/wakaama/examples/lightclient/CMakeLists.txt index 66592ea..7a00c04 100644 --- a/external/wakaama/examples/lightclient/CMakeLists.txt +++ b/external/wakaama/examples/lightclient/CMakeLists.txt @@ -15,11 +15,11 @@ add_definitions(${SHARED_DEFINITIONS} ${WAKAAMA_DEFINITIONS}) include_directories (${WAKAAMA_SOURCES_DIR} ${SHARED_INCLUDE_DIRS}) SET(SOURCES - lightclient.c - object_security.c - object_server.c - object_device.c - test_object.c + ${CMAKE_CURRENT_LIST_DIR}/lightclient.c + ${CMAKE_CURRENT_LIST_DIR}/object_security.c + ${CMAKE_CURRENT_LIST_DIR}/object_server.c + ${CMAKE_CURRENT_LIST_DIR}/object_device.c + ${CMAKE_CURRENT_LIST_DIR}/test_object.c ) add_executable(${PROJECT_NAME} ${SOURCES} ${WAKAAMA_SOURCES} ${SHARED_SOURCES}) diff --git a/external/wakaama/examples/lightclient/lightclient.c b/external/wakaama/examples/lightclient/lightclient.c index d1f9b00..5b72111 100644 --- a/external/wakaama/examples/lightclient/lightclient.c +++ b/external/wakaama/examples/lightclient/lightclient.c @@ -300,6 +300,9 @@ void print_state(lwm2m_context_t * lwm2mH) case STATE_REG_UPDATE_PENDING: fprintf(stderr, "REGISTRATION UPDATE PENDING\r\n"); break; + case STATE_REG_UPDATE_NEEDED: + fprintf(stderr, "REGISTRATION UPDATE REQUIRED\r\n"); + break; case STATE_DEREG_PENDING: fprintf(stderr, "DEREGISTRATION PENDING\r\n"); break; @@ -316,10 +319,8 @@ void print_state(lwm2m_context_t * lwm2mH) #define OBJ_COUNT 4 -int lightclient_main(int argc, char *argv[]) +int main(int argc, char *argv[]) { - app_main_dhcp(); - client_data_t data; lwm2m_context_t * lwm2mH = NULL; lwm2m_object_t * objArray[OBJ_COUNT]; @@ -332,7 +333,7 @@ int lightclient_main(int argc, char *argv[]) memset(&data, 0, sizeof(client_data_t)); - data.addressFamily = AF_INET; + data.addressFamily = AF_INET6; opt = 1; while (opt < argc) diff --git a/external/wakaama/examples/server/CMakeLists.txt b/external/wakaama/examples/server/CMakeLists.txt index 85b1da5..68873a0 100644 --- a/external/wakaama/examples/server/CMakeLists.txt +++ b/external/wakaama/examples/server/CMakeLists.txt @@ -15,7 +15,7 @@ add_definitions(${SHARED_DEFINITIONS} ${WAKAAMA_DEFINITIONS}) include_directories (${WAKAAMA_SOURCES_DIR} ${SHARED_INCLUDE_DIRS}) SET(SOURCES - lwm2mserver.c + ${CMAKE_CURRENT_LIST_DIR}/lwm2mserver.c ) add_executable(${PROJECT_NAME} ${SOURCES} ${WAKAAMA_SOURCES} ${SHARED_SOURCES}) diff --git a/external/wakaama/examples/shared/commandline.c b/external/wakaama/examples/shared/commandline.c index 8303487..0fa7ff5 100644 --- a/external/wakaama/examples/shared/commandline.c +++ b/external/wakaama/examples/shared/commandline.c @@ -181,6 +181,8 @@ void output_buffer(FILE * stream, if (length == 0) fprintf(stream, "\n"); + if (buffer == NULL) return; + i = 0; while (i < length) { @@ -271,12 +273,12 @@ void output_tlv(FILE * stream, tmp = buffer[length + dataIndex + dataLen]; buffer[length + dataIndex + dataLen] = 0; - if (0 < sscanf(buffer + length + dataIndex, "%"PRId64, &intValue)) + if (0 < sscanf((const char *)buffer + length + dataIndex, "%"PRId64, &intValue)) { print_indent(stream, indent+2); fprintf(stream, "data as Integer: %" PRId64 "\r\n", intValue); } - if (0 < sscanf(buffer + length + dataIndex, "%g", &floatValue)) + if (0 < sscanf((const char*)buffer + length + dataIndex, "%lg", &floatValue)) { print_indent(stream, indent+2); fprintf(stream, "data as Float: %.16g\r\n", floatValue); @@ -299,10 +301,9 @@ void output_data(FILE * stream, { int i; - if (data == NULL) return; - print_indent(stream, indent); fprintf(stream, "%d bytes received of type ", dataLength); + switch (format) { case LWM2M_CONTENT_TEXT: @@ -383,7 +384,7 @@ void dump_tlv(FILE * stream, case LWM2M_TYPE_STRING: fprintf(stream, "LWM2M_TYPE_STRING\r\n"); print_indent(stream, indent + 1); - fprintf(stream, "\"%.*s\"\r\n", dataP[i].value.asBuffer.length, dataP[i].value.asBuffer.buffer); + fprintf(stream, "\"%.*s\"\r\n", (int)dataP[i].value.asBuffer.length, dataP[i].value.asBuffer.buffer); break; case LWM2M_TYPE_OPAQUE: fprintf(stream, "LWM2M_TYPE_OPAQUE\r\n"); @@ -398,7 +399,7 @@ void dump_tlv(FILE * stream, case LWM2M_TYPE_FLOAT: fprintf(stream, "LWM2M_TYPE_FLOAT: "); print_indent(stream, indent + 1); - fprintf(stream, "%f", dataP[i].value.asInteger); + fprintf(stream, "%" PRId64, dataP[i].value.asInteger); fprintf(stream, "\r\n"); break; case LWM2M_TYPE_BOOLEAN: diff --git a/external/wakaama/examples/shared/connection.c b/external/wakaama/examples/shared/connection.c index 5efd23e..45e2d33 100644 --- a/external/wakaama/examples/shared/connection.c +++ b/external/wakaama/examples/shared/connection.c @@ -34,7 +34,7 @@ int create_socket(const char * portStr, int addressFamily) memset(&hints, 0, sizeof hints); hints.ai_family = addressFamily; hints.ai_socktype = SOCK_DGRAM; -// hints.ai_flags = AI_PASSIVE; + hints.ai_flags = AI_PASSIVE; if (0 != getaddrinfo(NULL, portStr, &hints, &res)) { @@ -126,9 +126,6 @@ connection_t * connection_create(connection_t * connList, if (s >= 0) { sa = p->ai_addr; -#if CONFIG_NET_LWIP - sa->sa_len = p->ai_addrlen; -#endif sl = p->ai_addrlen; if (-1 == connect(s, p->ai_addr, p->ai_addrlen)) { @@ -139,8 +136,8 @@ connection_t * connection_create(connection_t * connList, } if (s >= 0) { - connP = connection_new_incoming(connList, s, sa, sl); -// close(s); + connP = connection_new_incoming(connList, sock, sa, sl); + close(s); } if (NULL != servinfo) { #ifdef CONFIG_NET_LWIP diff --git a/external/wakaama/examples/shared/dtlsconnection.c b/external/wakaama/examples/shared/dtlsconnection.c index 9903886..c9ac973 100644 --- a/external/wakaama/examples/shared/dtlsconnection.c +++ b/external/wakaama/examples/shared/dtlsconnection.c @@ -78,7 +78,7 @@ char * security_get_public_id(lwm2m_object_t * obj, int instanceId, int * length dataP->type == LWM2M_TYPE_OPAQUE) { char * buff; - + buff = (char*)lwm2m_malloc(dataP->value.asBuffer.length); if (buff != 0) { @@ -88,7 +88,7 @@ char * security_get_public_id(lwm2m_object_t * obj, int instanceId, int * length lwm2m_data_free(size, dataP); return buff; - }else{ + } else { return NULL; } } @@ -114,7 +114,7 @@ char * security_get_secret_key(lwm2m_object_t * obj, int instanceId, int * lengt lwm2m_data_free(size, dataP); return buff; - }else{ + } else { return NULL; } } @@ -139,7 +139,7 @@ int send_data(dtls_connection_t *connP, struct sockaddr_in *saddr = (struct sockaddr_in *)&connP->addr; inet_ntop(saddr->sin_family, &saddr->sin_addr, s, INET6_ADDRSTRLEN); port = saddr->sin_port; -} + } else if (AF_INET6 == connP->addr.sin6_family) { struct sockaddr_in6 *saddr = (struct sockaddr_in6 *)&connP->addr; @@ -159,6 +159,7 @@ int send_data(dtls_connection_t *connP, if (nbSent == -1) return -1; offset += nbSent; } + connP->lastSend = lwm2m_gettime(); return 0; } @@ -167,8 +168,7 @@ int send_data(dtls_connection_t *connP, /* This function is the "key store" for tinyDTLS. It is called to * retrieve a key for the given identity within this particular * session. */ -static int -get_psk_info(struct dtls_context_t *ctx, +static int get_psk_info(struct dtls_context_t *ctx, const session_t *session, dtls_credentials_type_t type, const unsigned char *id, size_t id_len, @@ -221,8 +221,7 @@ get_psk_info(struct dtls_context_t *ctx, return dtls_alert_fatal_create(DTLS_ALERT_INTERNAL_ERROR); } -static int -send_to_peer(struct dtls_context_t *ctx, +static int send_to_peer(struct dtls_context_t *ctx, session_t *session, uint8 *data, size_t len) { // find connection @@ -231,6 +230,8 @@ send_to_peer(struct dtls_context_t *ctx, if (cnx != NULL) { // send data to peer + + // TODO: nat expiration? int err = send_data(cnx,data,len); if (COAP_NO_ERROR != err) { @@ -241,8 +242,7 @@ send_to_peer(struct dtls_context_t *ctx, return -1; } -static int -read_from_peer(struct dtls_context_t *ctx, +static int read_from_peer(struct dtls_context_t *ctx, session_t *session, uint8 *data, size_t len) { // find connection @@ -316,18 +316,13 @@ int sockaddr_cmp(struct sockaddr *x, struct sockaddr *y) // compare V4 with V4 return ((struct sockaddr_in *)x)->sin_addr.s_addr == ((struct sockaddr_in *)y)->sin_addr.s_addr; // is V6 mapped V4? - } -#ifdef IPv6 - else if (IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)y)->sin6_addr)) { + } else if (IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)y)->sin6_addr)) { struct in6_addr* addr6 = &((struct sockaddr_in6 *)y)->sin6_addr; uint32_t y6to4 = addr6->s6_addr[15] << 24 | addr6->s6_addr[14] << 16 | addr6->s6_addr[13] << 8 | addr6->s6_addr[12]; return y6to4 == ((struct sockaddr_in *)x)->sin_addr.s_addr; - } -#endif - else { + } else { return 0; } - } else if (x->sa_family == AF_INET6 && y->sa_family == AF_INET6) { // IPV6 with IPV6 compare return memcmp(((struct sockaddr_in6 *)x)->sin6_addr.s6_addr, ((struct sockaddr_in6 *)y)->sin6_addr.s6_addr, 16) == 0; @@ -348,7 +343,7 @@ int create_socket(const char * portStr, int ai_family) memset(&hints, 0, sizeof hints); hints.ai_family = ai_family; hints.ai_socktype = SOCK_DGRAM; -// hints.ai_flags = AI_PASSIVE; + hints.ai_flags = AI_PASSIVE; if (0 != getaddrinfo(NULL, portStr, &hints, &res)) { @@ -411,6 +406,7 @@ dtls_connection_t * connection_new_incoming(dtls_connection_t * connList, connP->dtlsSession = (session_t *)malloc(sizeof(session_t)); connP->dtlsSession->addr.sin6 = connP->addr; connP->dtlsSession->size = connP->addrLen; + connP->lastSend = lwm2m_gettime(); } return connP; @@ -503,9 +499,8 @@ dtls_connection_t * connection_create(dtls_connection_t * connList, } if (s >= 0) { - - connP = connection_new_incoming(connList, s, sa, sl); - // close(s); + connP = connection_new_incoming(connList, sock, sa, sl); + close(s); // do we need to start tinydtls? if (connP != NULL) @@ -527,11 +522,7 @@ dtls_connection_t * connection_create(dtls_connection_t * connList, } } - if (NULL != servinfo) { - free(servinfo); - - - } + if (NULL != servinfo) free(servinfo); return connP; } @@ -552,19 +543,26 @@ void connection_free(dtls_connection_t * connList) } int connection_send(dtls_connection_t *connP, uint8_t * buffer, size_t length){ - if (connP->dtlsSession == NULL) { // no security - - if ( 0 != send_data(connP, buffer, length)) { return -1 ; } } else { + if (DTLS_NAT_TIMEOUT > 0 && (lwm2m_gettime() - connP->lastSend) > DTLS_NAT_TIMEOUT) + { + // we need to rehandhake because our source IP/port probably changed for the server + if ( connection_rehandshake(connP, false) != 0 ) + { + printf("can't send due to rehandshake error\n"); + return -1; + } + } if (-1 == dtls_write(connP->dtlsContext, connP->dtlsSession, buffer, length)) { return -1; } } + return 0; } @@ -585,6 +583,32 @@ int connection_handle_packet(dtls_connection_t *connP, uint8_t * buffer, size_t } } +int connection_rehandshake(dtls_connection_t *connP, bool sendCloseNotify) { + + // if not a dtls connection we do nothing + if (connP->dtlsSession == NULL) { + return 0; + } + + // reset current session + dtls_peer_t * peer = dtls_get_peer(connP->dtlsContext, connP->dtlsSession); + if (peer != NULL) + { + if (!sendCloseNotify) + { + peer->state = DTLS_STATE_CLOSED; + } + dtls_reset_peer(connP->dtlsContext, peer); + } + + // start a fresh handshake + int result = dtls_connect(connP->dtlsContext, connP->dtlsSession); + if (result !=0) { + printf("error dtls reconnection %d\n",result); + } + return result; +} + uint8_t lwm2m_buffer_send(void * sessionH, uint8_t * buffer, size_t length, diff --git a/external/wakaama/examples/shared/dtlsconnection.h b/external/wakaama/examples/shared/dtlsconnection.h index 1869d41..aa0db20 100644 --- a/external/wakaama/examples/shared/dtlsconnection.h +++ b/external/wakaama/examples/shared/dtlsconnection.h @@ -40,6 +40,9 @@ #define LWM2M_BSSERVER_PORT_STR "5685" #define LWM2M_BSSERVER_PORT 5685 +// after 40sec of inactivity we rehandshake +#define DTLS_NAT_TIMEOUT 40 + typedef struct _dtls_connection_t { struct _dtls_connection_t * next; @@ -51,6 +54,7 @@ typedef struct _dtls_connection_t int securityInstId; lwm2m_context_t * lwm2mH; dtls_context_t * dtlsContext; + time_t lastSend; // last time a data was sent to the server (used for NAT timeouts) } dtls_connection_t; int create_socket(const char * portStr, int ai_family); @@ -64,4 +68,7 @@ void connection_free(dtls_connection_t * connList); int connection_send(dtls_connection_t *connP, uint8_t * buffer, size_t length); int connection_handle_packet(dtls_connection_t *connP, uint8_t * buffer, size_t length); +// rehandshake a connection, useful when your NAT timed out and your client has a new IP/PORT +int connection_rehandshake(dtls_connection_t *connP, bool sendCloseNotify); + #endif diff --git a/external/wakaama/examples/shared/tinydtls/config.status b/external/wakaama/examples/shared/tinydtls/config.status old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/configure b/external/wakaama/examples/shared/tinydtls/configure old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/configure.ac b/external/wakaama/examples/shared/tinydtls/configure.ac old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/Doxyfile.in b/external/wakaama/examples/shared/tinydtls/doc/Doxyfile.in old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/alert_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/alert_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/alert_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/alert_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/annotated.html b/external/wakaama/examples/shared/tinydtls/doc/html/annotated.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/bc_s.png b/external/wakaama/examples/shared/tinydtls/doc/html/bc_s.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/bdwn.png b/external/wakaama/examples/shared/tinydtls/doc/html/bdwn.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ccm_8c.html b/external/wakaama/examples/shared/tinydtls/doc/html/ccm_8c.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ccm_8c_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/ccm_8c_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ccm_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/ccm_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ccm_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/ccm_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/classes.html b/external/wakaama/examples/shared/tinydtls/doc/html/classes.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/closed.png b/external/wakaama/examples/shared/tinydtls/doc/html/closed.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/config_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/config_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/config_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/config_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/contiki-config_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/contiki-config_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/contiki-config_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/contiki-config_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/crypto_8c.html b/external/wakaama/examples/shared/tinydtls/doc/html/crypto_8c.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/crypto_8c_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/crypto_8c_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/crypto_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/crypto_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/crypto_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/crypto_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/debug_8c.html b/external/wakaama/examples/shared/tinydtls/doc/html/debug_8c.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/debug_8c_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/debug_8c_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/debug_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/debug_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/debug_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/debug_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/doxygen.css b/external/wakaama/examples/shared/tinydtls/doc/html/doxygen.css old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/doxygen.png b/external/wakaama/examples/shared/tinydtls/doc/html/doxygen.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/dtls_8c.html b/external/wakaama/examples/shared/tinydtls/doc/html/dtls_8c.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/dtls_8c_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/dtls_8c_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/dtls_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/dtls_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/dtls_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/dtls_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/dtls__config_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/dtls__config_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/dtls__config_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/dtls__config_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/dtls__time_8c.html b/external/wakaama/examples/shared/tinydtls/doc/html/dtls__time_8c.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/dtls__time_8c_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/dtls__time_8c_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/dtls__time_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/dtls__time_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/dtls__time_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/dtls__time_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/dynsections.js b/external/wakaama/examples/shared/tinydtls/doc/html/dynsections.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/files.html b/external/wakaama/examples/shared/tinydtls/doc/html/files.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ftv2blank.png b/external/wakaama/examples/shared/tinydtls/doc/html/ftv2blank.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ftv2cl.png b/external/wakaama/examples/shared/tinydtls/doc/html/ftv2cl.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ftv2doc.png b/external/wakaama/examples/shared/tinydtls/doc/html/ftv2doc.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ftv2folderclosed.png b/external/wakaama/examples/shared/tinydtls/doc/html/ftv2folderclosed.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ftv2folderopen.png b/external/wakaama/examples/shared/tinydtls/doc/html/ftv2folderopen.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ftv2lastnode.png b/external/wakaama/examples/shared/tinydtls/doc/html/ftv2lastnode.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ftv2link.png b/external/wakaama/examples/shared/tinydtls/doc/html/ftv2link.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ftv2mlastnode.png b/external/wakaama/examples/shared/tinydtls/doc/html/ftv2mlastnode.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ftv2mnode.png b/external/wakaama/examples/shared/tinydtls/doc/html/ftv2mnode.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ftv2mo.png b/external/wakaama/examples/shared/tinydtls/doc/html/ftv2mo.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ftv2node.png b/external/wakaama/examples/shared/tinydtls/doc/html/ftv2node.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ftv2ns.png b/external/wakaama/examples/shared/tinydtls/doc/html/ftv2ns.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ftv2plastnode.png b/external/wakaama/examples/shared/tinydtls/doc/html/ftv2plastnode.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ftv2pnode.png b/external/wakaama/examples/shared/tinydtls/doc/html/ftv2pnode.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ftv2splitbar.png b/external/wakaama/examples/shared/tinydtls/doc/html/ftv2splitbar.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/ftv2vertline.png b/external/wakaama/examples/shared/tinydtls/doc/html/ftv2vertline.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/functions.html b/external/wakaama/examples/shared/tinydtls/doc/html/functions.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/functions_func.html b/external/wakaama/examples/shared/tinydtls/doc/html/functions_func.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/functions_vars.html b/external/wakaama/examples/shared/tinydtls/doc/html/functions_vars.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/global_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/global_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/global_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/global_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_a.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_a.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_b.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_b.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_c.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_c.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_d.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_d.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_a.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_a.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_c.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_c.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_d.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_d.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_e.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_e.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_g.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_g.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_h.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_l.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_l.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_m.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_m.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_p.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_p.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_r.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_r.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_s.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_s.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_t.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_t.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_u.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_u.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_w.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_defs_w.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_e.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_e.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_enum.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_enum.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_eval.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_eval.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_f.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_f.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_func.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_func.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_a.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_a.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_b.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_b.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_c.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_c.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_d.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_d.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_e.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_e.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_f.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_f.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_h.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_i.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_i.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_k.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_k.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_l.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_l.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_m.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_m.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_n.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_n.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_p.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_p.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_u.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_u.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_v.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_func_v.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_g.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_g.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_h.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_i.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_i.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_k.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_k.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_l.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_l.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_m.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_m.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_n.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_n.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_p.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_p.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_r.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_r.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_s.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_s.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_t.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_t.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_type.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_type.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_u.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_u.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_v.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_v.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_vars.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_vars.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/globals_w.html b/external/wakaama/examples/shared/tinydtls/doc/html/globals_w.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/group__HMAC.html b/external/wakaama/examples/shared/tinydtls/doc/html/group__HMAC.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/group__clock.html b/external/wakaama/examples/shared/tinydtls/doc/html/group__clock.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/group__contiki.html b/external/wakaama/examples/shared/tinydtls/doc/html/group__contiki.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/group__dtls__usage.html b/external/wakaama/examples/shared/tinydtls/doc/html/group__dtls__usage.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/group__netq.html b/external/wakaama/examples/shared/tinydtls/doc/html/group__netq.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/group__prng.html b/external/wakaama/examples/shared/tinydtls/doc/html/group__prng.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/hmac_8c.html b/external/wakaama/examples/shared/tinydtls/doc/html/hmac_8c.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/hmac_8c_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/hmac_8c_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/hmac_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/hmac_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/hmac_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/hmac_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/index.html b/external/wakaama/examples/shared/tinydtls/doc/html/index.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/jquery.js b/external/wakaama/examples/shared/tinydtls/doc/html/jquery.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/modules.html b/external/wakaama/examples/shared/tinydtls/doc/html/modules.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/nav_f.png b/external/wakaama/examples/shared/tinydtls/doc/html/nav_f.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/nav_g.png b/external/wakaama/examples/shared/tinydtls/doc/html/nav_g.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/nav_h.png b/external/wakaama/examples/shared/tinydtls/doc/html/nav_h.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/netq_8c.html b/external/wakaama/examples/shared/tinydtls/doc/html/netq_8c.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/netq_8c_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/netq_8c_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/netq_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/netq_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/netq_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/netq_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/numeric_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/numeric_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/numeric_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/numeric_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/open.png b/external/wakaama/examples/shared/tinydtls/doc/html/open.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/peer_8c.html b/external/wakaama/examples/shared/tinydtls/doc/html/peer_8c.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/peer_8c_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/peer_8c_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/peer_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/peer_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/peer_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/peer_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/prng_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/prng_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/prng_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/prng_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_0.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_0.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_0.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_0.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_1.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_1.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_1.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_1.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_10.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_10.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_10.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_10.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_11.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_11.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_11.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_11.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_12.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_12.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_12.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_12.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_13.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_13.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_13.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_13.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_14.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_14.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_14.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_14.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_15.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_15.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_15.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_15.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_2.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_2.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_2.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_2.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_3.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_3.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_3.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_3.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_4.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_4.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_4.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_4.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_5.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_5.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_5.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_5.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_6.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_6.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_6.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_6.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_7.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_7.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_7.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_7.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_8.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_8.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_8.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_8.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_9.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_9.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_9.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_9.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_a.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_a.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_a.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_a.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_b.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_b.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_b.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_b.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_c.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_c.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_c.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_c.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_d.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_d.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_d.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_d.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_e.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_e.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_e.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_e.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_f.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_f.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/all_f.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/all_f.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_0.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_0.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_0.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_0.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_1.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_1.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_1.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_1.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_2.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_2.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_2.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_2.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_3.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_3.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_3.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_3.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_4.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_4.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_4.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_4.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_5.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_5.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_5.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/classes_5.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/close.png b/external/wakaama/examples/shared/tinydtls/doc/html/search/close.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_0.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_0.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_0.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_0.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_1.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_1.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_1.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_1.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_2.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_2.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_2.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_2.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_3.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_3.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_3.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_3.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_4.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_4.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_4.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_4.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_5.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_5.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_5.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_5.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_6.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_6.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_6.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_6.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_7.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_7.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_7.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_7.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_8.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_8.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_8.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_8.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_9.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_9.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_9.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_9.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_a.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_a.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_a.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_a.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_b.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_b.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_b.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_b.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_c.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_c.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_c.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_c.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_d.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_d.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_d.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_d.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_e.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_e.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_e.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/defines_e.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/enums_0.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/enums_0.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/enums_0.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/enums_0.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/enums_1.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/enums_1.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/enums_1.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/enums_1.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/enumvalues_0.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/enumvalues_0.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/enumvalues_0.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/enumvalues_0.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/enumvalues_1.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/enumvalues_1.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/enumvalues_1.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/enumvalues_1.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/enumvalues_2.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/enumvalues_2.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/enumvalues_2.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/enumvalues_2.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/enumvalues_3.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/enumvalues_3.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/enumvalues_3.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/enumvalues_3.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_0.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_0.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_0.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_0.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_1.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_1.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_1.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_1.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_2.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_2.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_2.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_2.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_3.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_3.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_3.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_3.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_4.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_4.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_4.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_4.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_5.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_5.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_5.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_5.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_6.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_6.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_6.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_6.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_7.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_7.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_7.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_7.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_8.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_8.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_8.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_8.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_9.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_9.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/files_9.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/files_9.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_0.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_0.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_0.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_0.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_1.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_1.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_1.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_1.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_2.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_2.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_2.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_2.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_3.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_3.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_3.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_3.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_4.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_4.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_4.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_4.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_5.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_5.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_5.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_5.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_6.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_6.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_6.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_6.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_7.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_7.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_7.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_7.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_8.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_8.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_8.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_8.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_9.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_9.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_9.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_9.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_a.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_a.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_a.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_a.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_b.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_b.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_b.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_b.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_c.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_c.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_c.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_c.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_d.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_d.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_d.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_d.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_e.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_e.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_e.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_e.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_f.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_f.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_f.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/functions_f.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_0.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_0.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_0.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_0.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_1.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_1.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_1.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_1.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_2.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_2.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_2.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_2.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_3.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_3.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_3.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_3.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_4.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_4.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_4.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/groups_4.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/mag_sel.png b/external/wakaama/examples/shared/tinydtls/doc/html/search/mag_sel.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/nomatches.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/nomatches.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/search.css b/external/wakaama/examples/shared/tinydtls/doc/html/search/search.css old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/search.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/search.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/search_l.png b/external/wakaama/examples/shared/tinydtls/doc/html/search/search_l.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/search_m.png b/external/wakaama/examples/shared/tinydtls/doc/html/search/search_m.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/search_r.png b/external/wakaama/examples/shared/tinydtls/doc/html/search/search_r.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_0.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_0.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_0.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_0.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_1.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_1.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_1.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_1.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_2.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_2.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_2.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_2.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_3.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_3.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_3.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_3.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_4.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_4.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_4.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/typedefs_4.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_0.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_0.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_0.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_0.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_1.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_1.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_1.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_1.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_10.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_10.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_10.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_10.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_2.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_2.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_2.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_2.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_3.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_3.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_3.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_3.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_4.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_4.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_4.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_4.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_5.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_5.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_5.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_5.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_6.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_6.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_6.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_6.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_7.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_7.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_7.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_7.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_8.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_8.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_8.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_8.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_9.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_9.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_9.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_9.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_a.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_a.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_a.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_a.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_b.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_b.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_b.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_b.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_c.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_c.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_c.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_c.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_d.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_d.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_d.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_d.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_e.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_e.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_e.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_e.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_f.html b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_f.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_f.js b/external/wakaama/examples/shared/tinydtls/doc/html/search/variables_f.js old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/session_8c.html b/external/wakaama/examples/shared/tinydtls/doc/html/session_8c.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/session_8c_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/session_8c_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/session_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/session_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/session_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/session_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/state_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/state_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/state_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/state_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/structUT__hash__bucket.html b/external/wakaama/examples/shared/tinydtls/doc/html/structUT__hash__bucket.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/structUT__hash__handle.html b/external/wakaama/examples/shared/tinydtls/doc/html/structUT__hash__handle.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/structUT__hash__table.html b/external/wakaama/examples/shared/tinydtls/doc/html/structUT__hash__table.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/structaes128__ccm__t.html b/external/wakaama/examples/shared/tinydtls/doc/html/structaes128__ccm__t.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__cipher__context__t.html b/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__cipher__context__t.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__context__t.html b/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__context__t.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__ecdsa__key__t.html b/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__ecdsa__key__t.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__handler__t.html b/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__handler__t.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__handshake__parameters__ecdsa__t.html b/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__handshake__parameters__ecdsa__t.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__handshake__parameters__psk__t.html b/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__handshake__parameters__psk__t.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__handshake__parameters__t.html b/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__handshake__parameters__t.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__hmac__context__t.html b/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__hmac__context__t.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__hs__state__t.html b/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__hs__state__t.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__peer__t.html b/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__peer__t.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__security__parameters__t.html b/external/wakaama/examples/shared/tinydtls/doc/html/structdtls__security__parameters__t.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/structlist.html b/external/wakaama/examples/shared/tinydtls/doc/html/structlist.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/structnetq__t.html b/external/wakaama/examples/shared/tinydtls/doc/html/structnetq__t.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/structsession__t.html b/external/wakaama/examples/shared/tinydtls/doc/html/structsession__t.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/sync_off.png b/external/wakaama/examples/shared/tinydtls/doc/html/sync_off.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/sync_on.png b/external/wakaama/examples/shared/tinydtls/doc/html/sync_on.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/t__list_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/t__list_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/t__list_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/t__list_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/tab_a.png b/external/wakaama/examples/shared/tinydtls/doc/html/tab_a.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/tab_b.png b/external/wakaama/examples/shared/tinydtls/doc/html/tab_b.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/tab_h.png b/external/wakaama/examples/shared/tinydtls/doc/html/tab_h.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/tab_s.png b/external/wakaama/examples/shared/tinydtls/doc/html/tab_s.png old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/tabs.css b/external/wakaama/examples/shared/tinydtls/doc/html/tabs.css old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/tinydtls_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/tinydtls_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/tinydtls_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/tinydtls_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/uthash_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/uthash_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/uthash_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/uthash_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/utlist_8h.html b/external/wakaama/examples/shared/tinydtls/doc/html/utlist_8h.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/doc/html/utlist_8h_source.html b/external/wakaama/examples/shared/tinydtls/doc/html/utlist_8h_source.html old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/README b/external/wakaama/examples/shared/tinydtls/sha2/README old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/sha2test.pl b/external/wakaama/examples/shared/tinydtls/sha2/sha2test.pl old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector001.dat b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector001.dat old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector001.info b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector001.info old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector002.dat b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector002.dat old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector002.info b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector002.info old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector003.dat b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector003.dat old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector003.info b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector003.info old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector004.dat b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector004.dat old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector004.info b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector004.info old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector005.dat b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector005.dat old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector005.info b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector005.info old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector006.dat b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector006.dat old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector006.info b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector006.info old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector007.dat b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector007.dat old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector007.info b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector007.info old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector008.dat b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector008.dat old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector008.info b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector008.info old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector009.dat b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector009.dat old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector009.info b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector009.info old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector010.dat b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector010.dat old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector010.info b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector010.info old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector011.dat b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector011.dat old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector011.info b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector011.info old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector012.dat b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector012.dat old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector012.info b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector012.info old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector013.dat b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector013.dat old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector013.info b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector013.info old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector014.dat b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector014.dat old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector014.info b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector014.info old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector015.dat b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector015.dat old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector015.info b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector015.info old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector016.dat b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector016.dat old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector016.info b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector016.info old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector017.dat b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector017.dat old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector017.info b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector017.info old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector018.dat b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector018.dat old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector018.info b/external/wakaama/examples/shared/tinydtls/sha2/testvectors/testvectors/vector018.info old mode 100755 new mode 100644 diff --git a/external/wakaama/examples/shared/tinydtls/tinydtls.h.in b/external/wakaama/examples/shared/tinydtls/tinydtls.h.in old mode 100755 new mode 100644 diff --git a/external/wakaama/tests/block1tests.c b/external/wakaama/tests/block1tests.c new file mode 100644 index 0000000..46ce446 --- /dev/null +++ b/external/wakaama/tests/block1tests.c @@ -0,0 +1,86 @@ +/******************************************************************************* + * + * Copyright (c) 2015 Bosch Software Innovations GmbH, Germany. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * and Eclipse Distribution License v1.0 which accompany this distribution. + * + * The Eclipse Public License is available at + * http://www.eclipse.org/legal/epl-v10.html + * The Eclipse Distribution License is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + * + * Contributors: + * Julien Vermillard - Please refer to git log + * + *******************************************************************************/ + +#include "tests.h" +#include "CUnit/Basic.h" +#include "internals.h" +#include "liblwm2m.h" + + +static void handle_12345(lwm2m_block1_data_t ** blk1, + uint16_t mid) { + uint8_t *buffer = "12345"; + size_t bsize; + uint8_t *resultBuffer = NULL; + + coap_status_t st = coap_block1_handler(blk1, mid, buffer, 5, 5, 0, true, &resultBuffer, &bsize); + CU_ASSERT_EQUAL(st, COAP_231_CONTINUE); + CU_ASSERT_PTR_NULL(resultBuffer); +} + +static void handle_67(lwm2m_block1_data_t ** blk1, + uint16_t mid) { + uint8_t *buffer = "67"; + size_t bsize; + uint8_t *resultBuffer = NULL; + + coap_status_t st = coap_block1_handler(blk1, mid, buffer, 2, 5, 1, false, &resultBuffer, &bsize); + CU_ASSERT_EQUAL(st, NO_ERROR); + CU_ASSERT_PTR_NOT_NULL(*resultBuffer); + CU_ASSERT_EQUAL(bsize, 7); + CU_ASSERT_NSTRING_EQUAL(resultBuffer, "1234567", 7); +} + + +static void test_block1_nominal(void) +{ + lwm2m_block1_data_t * blk1 = NULL; + + handle_12345(&blk1, 123); + handle_67(&blk1, 346); + + free_block1_buffer(blk1); +} + +static void test_block1_retransmit(void) +{ + lwm2m_block1_data_t * blk1 = NULL; + + handle_12345(&blk1, 1); + handle_12345(&blk1, 1); + handle_67(&blk1, 3); + handle_67(&blk1, 3); + handle_67(&blk1, 3); + + free_block1_buffer(blk1); +} + +static struct TestTable table[] = { + { "test of test_block1_nominal()", test_block1_nominal }, + { "test of test_block1_retransmit()", test_block1_retransmit }, + { NULL, NULL }, +}; + +CU_ErrorCode create_block1_suit() { + CU_pSuite pSuite = NULL; + pSuite = CU_add_suite("Suite_block1", NULL, NULL); + + if (NULL == pSuite) { + return CU_get_error(); + } + return add_tests(pSuite, table); +} diff --git a/external/wakaama/tests/tests.h b/external/wakaama/tests/tests.h index 14750b5..d8a3d15 100644 --- a/external/wakaama/tests/tests.h +++ b/external/wakaama/tests/tests.h @@ -31,5 +31,6 @@ CU_ErrorCode create_tlv_suit(); CU_ErrorCode create_object_read_suit(); CU_ErrorCode create_convert_numbers_suit(); CU_ErrorCode create_tlv_json_suit(); +CU_ErrorCode create_block1_suit(); #endif /* TESTS_H_ */ diff --git a/external/wakaama/tests/tlv_json_lwm2m_data_test.c b/external/wakaama/tests/tlv_json_lwm2m_data_test.c index 9eee649..26d37f4 100644 --- a/external/wakaama/tests/tlv_json_lwm2m_data_test.c +++ b/external/wakaama/tests/tlv_json_lwm2m_data_test.c @@ -46,7 +46,7 @@ static void test_data(const char * uriStr, } length = lwm2m_data_serialize((uriStr != NULL) ? &uri : NULL, size, tlvP, &format, &buffer); - if (length <= 0) + if (length < 0) { printf("Serialize lwm2m_data_t %s to %s failed.\n", id, format==LWM2M_CONTENT_JSON?"JSON":"TLV"); //dump_data_t(stdout, size, tlvP, 0); @@ -54,8 +54,8 @@ static void test_data(const char * uriStr, } else { - //printf("\n\nSerialize lwm2m_data_t %s:\n", id); - //output_buffer(stdout, buffer, length, 0); + printf("\n\nSerialize lwm2m_data_t %s:\n", id); + output_buffer(stdout, buffer, length, 0); lwm2m_free(buffer); } } @@ -214,7 +214,7 @@ static void test_raw_expected(const char * uriStr, // Serialize to the same format and compare to the input buffer test_data_and_compare(uriStr, format, tlvP, size, id, (uint8_t*)expectBuf, expectLen); - // Serialize to the other format respectivly. + // Serialize to the other format respectively. if (format == LWM2M_CONTENT_TLV) test_data(uriStr, LWM2M_CONTENT_JSON, tlvP, size, id); else if (format == LWM2M_CONTENT_JSON) @@ -326,7 +326,7 @@ static void test_7(void) }"; // We do a string comparison. Because parsing+serialization changes double value - // precision, we expect a slighty different output than input. + // precision, we expect a slightly different output than input. const char * expect = "{\"e\":[ \ {\"n\":\"0\",\"v\":1234}, \ {\"n\":\"1\",\"v\":56.78900146484375}, \ @@ -406,8 +406,8 @@ static void test_10(void) lwm2m_data_encode_bool(true, data1 + 15); lwm2m_data_encode_bool(false, data1 + 16); - test_data(NULL, LWM2M_CONTENT_TLV, data1, sizeof(data1)/sizeof(lwm2m_data_t), "1"); - test_data(NULL, LWM2M_CONTENT_JSON, data1, sizeof(data1)/sizeof(lwm2m_data_t), "1"); + test_data(NULL, LWM2M_CONTENT_TLV, data1, 17, "1"); + test_data(NULL, LWM2M_CONTENT_JSON, data1, 17, "1"); } static struct TestTable table[] = { diff --git a/external/wakaama/tests/unittests.c b/external/wakaama/tests/unittests.c index 0f48467..6a95a1a 100644 --- a/external/wakaama/tests/unittests.c +++ b/external/wakaama/tests/unittests.c @@ -66,6 +66,9 @@ int main() if (CUE_SUCCESS != create_tlv_json_suit()) { goto exit; } + if (CUE_SUCCESS != create_block1_suit()) { + goto exit; + } CU_basic_set_mode(CU_BRM_VERBOSE); CU_basic_run_tests(); diff --git a/framework/src/dm/dm_common_interface.c b/framework/src/dm/dm_common_interface.c index 21da886..a8f36e0 100644 --- a/framework/src/dm/dm_common_interface.c +++ b/framework/src/dm/dm_common_interface.c @@ -79,7 +79,6 @@ int readfile(FAR const char *filename, FAR char *buffer, uint8_t buflen) { FAR char *bufptr; size_t remaining; - ssize_t nread; ssize_t ntotal; int ret; diff --git a/framework/src/dm/dm_lwm2m.c b/framework/src/dm/dm_lwm2m.c index 6ad0d1a..08939fc 100644 --- a/framework/src/dm/dm_lwm2m.c +++ b/framework/src/dm/dm_lwm2m.c @@ -111,7 +111,7 @@ int dm_lwm2m_start_client(struct dm_lwm2m_context_s *dm_context) wakaama_sparam.sched_priority = SCHED_PRIORITY_DEFAULT; (void)pthread_attr_setschedparam(&wakaama_attr, &wakaama_sparam); (void)pthread_attr_setstacksize(&wakaama_attr, 4096); - ret = pthread_create(&wakaama_thread, &wakaama_attr, (pthread_startroutine_t)client_main, NULL); + ret = pthread_create(&wakaama_thread, &wakaama_attr, (pthread_startroutine_t)lwm2m_client_run, NULL); pthread_detach(wakaama_thread); /* Function return value */ if (ret != 0) {