pick up wakaama files from https://github.com/eclipse/wakaama

Committer:
terencez
Date:
Wed Apr 19 11:28:00 2017 +0000
Revision:
0:3f48af28ebcd
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
terencez 0:3f48af28ebcd 1 /*******************************************************************************
terencez 0:3f48af28ebcd 2 *
terencez 0:3f48af28ebcd 3 * Copyright (c) 2013, 2014 Intel Corporation and others.
terencez 0:3f48af28ebcd 4 * All rights reserved. This program and the accompanying materials
terencez 0:3f48af28ebcd 5 * are made available under the terms of the Eclipse Public License v1.0
terencez 0:3f48af28ebcd 6 * and Eclipse Distribution License v1.0 which accompany this distribution.
terencez 0:3f48af28ebcd 7 *
terencez 0:3f48af28ebcd 8 * The Eclipse Public License is available at
terencez 0:3f48af28ebcd 9 * http://www.eclipse.org/legal/epl-v10.html
terencez 0:3f48af28ebcd 10 * The Eclipse Distribution License is available at
terencez 0:3f48af28ebcd 11 * http://www.eclipse.org/org/documents/edl-v10.php.
terencez 0:3f48af28ebcd 12 *
terencez 0:3f48af28ebcd 13 * Contributors:
terencez 0:3f48af28ebcd 14 * David Navarro, Intel Corporation - initial API and implementation
terencez 0:3f48af28ebcd 15 * Fabien Fleutot - Please refer to git log
terencez 0:3f48af28ebcd 16 * Simon Bernard - Please refer to git log
terencez 0:3f48af28ebcd 17 * Toby Jaffey - Please refer to git log
terencez 0:3f48af28ebcd 18 * Pascal Rieux - Please refer to git log
terencez 0:3f48af28ebcd 19 *
terencez 0:3f48af28ebcd 20 *******************************************************************************/
terencez 0:3f48af28ebcd 21
terencez 0:3f48af28ebcd 22 /*
terencez 0:3f48af28ebcd 23 Copyright (c) 2013, 2014 Intel Corporation
terencez 0:3f48af28ebcd 24
terencez 0:3f48af28ebcd 25 Redistribution and use in source and binary forms, with or without modification,
terencez 0:3f48af28ebcd 26 are permitted provided that the following conditions are met:
terencez 0:3f48af28ebcd 27
terencez 0:3f48af28ebcd 28 * Redistributions of source code must retain the above copyright notice,
terencez 0:3f48af28ebcd 29 this list of conditions and the following disclaimer.
terencez 0:3f48af28ebcd 30 * Redistributions in binary form must reproduce the above copyright notice,
terencez 0:3f48af28ebcd 31 this list of conditions and the following disclaimer in the documentation
terencez 0:3f48af28ebcd 32 and/or other materials provided with the distribution.
terencez 0:3f48af28ebcd 33 * Neither the name of Intel Corporation nor the names of its contributors
terencez 0:3f48af28ebcd 34 may be used to endorse or promote products derived from this software
terencez 0:3f48af28ebcd 35 without specific prior written permission.
terencez 0:3f48af28ebcd 36
terencez 0:3f48af28ebcd 37 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
terencez 0:3f48af28ebcd 38 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
terencez 0:3f48af28ebcd 39 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
terencez 0:3f48af28ebcd 40 IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
terencez 0:3f48af28ebcd 41 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
terencez 0:3f48af28ebcd 42 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
terencez 0:3f48af28ebcd 43 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
terencez 0:3f48af28ebcd 44 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
terencez 0:3f48af28ebcd 45 OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
terencez 0:3f48af28ebcd 46 THE POSSIBILITY OF SUCH DAMAGE.
terencez 0:3f48af28ebcd 47
terencez 0:3f48af28ebcd 48 David Navarro <david.navarro@intel.com>
terencez 0:3f48af28ebcd 49
terencez 0:3f48af28ebcd 50 */
terencez 0:3f48af28ebcd 51
terencez 0:3f48af28ebcd 52 #include "internals.h"
terencez 0:3f48af28ebcd 53
terencez 0:3f48af28ebcd 54 #include <stdlib.h>
terencez 0:3f48af28ebcd 55 #include <string.h>
terencez 0:3f48af28ebcd 56
terencez 0:3f48af28ebcd 57 #include <stdio.h>
terencez 0:3f48af28ebcd 58
terencez 0:3f48af28ebcd 59
terencez 0:3f48af28ebcd 60 lwm2m_context_t * lwm2m_init(void * userData)
terencez 0:3f48af28ebcd 61 {
terencez 0:3f48af28ebcd 62 lwm2m_context_t * contextP;
terencez 0:3f48af28ebcd 63
terencez 0:3f48af28ebcd 64 LOG("Entering");
terencez 0:3f48af28ebcd 65 contextP = (lwm2m_context_t *)lwm2m_malloc(sizeof(lwm2m_context_t));
terencez 0:3f48af28ebcd 66 if (NULL != contextP)
terencez 0:3f48af28ebcd 67 {
terencez 0:3f48af28ebcd 68 memset(contextP, 0, sizeof(lwm2m_context_t));
terencez 0:3f48af28ebcd 69 contextP->userData = userData;
terencez 0:3f48af28ebcd 70 srand((int)lwm2m_gettime());
terencez 0:3f48af28ebcd 71 contextP->nextMID = rand();
terencez 0:3f48af28ebcd 72 }
terencez 0:3f48af28ebcd 73
terencez 0:3f48af28ebcd 74 return contextP;
terencez 0:3f48af28ebcd 75 }
terencez 0:3f48af28ebcd 76
terencez 0:3f48af28ebcd 77 #ifdef LWM2M_CLIENT_MODE
terencez 0:3f48af28ebcd 78 void lwm2m_deregister(lwm2m_context_t * context)
terencez 0:3f48af28ebcd 79 {
terencez 0:3f48af28ebcd 80 lwm2m_server_t * server = context->serverList;
terencez 0:3f48af28ebcd 81
terencez 0:3f48af28ebcd 82 LOG("Entering");
terencez 0:3f48af28ebcd 83 while (NULL != server)
terencez 0:3f48af28ebcd 84 {
terencez 0:3f48af28ebcd 85 registration_deregister(context, server);
terencez 0:3f48af28ebcd 86 server = server->next;
terencez 0:3f48af28ebcd 87 }
terencez 0:3f48af28ebcd 88 }
terencez 0:3f48af28ebcd 89
terencez 0:3f48af28ebcd 90 static void prv_deleteServer(lwm2m_server_t * serverP)
terencez 0:3f48af28ebcd 91 {
terencez 0:3f48af28ebcd 92 // TODO parse transaction and observation to remove the ones related to this server
terencez 0:3f48af28ebcd 93 if (NULL != serverP->location)
terencez 0:3f48af28ebcd 94 {
terencez 0:3f48af28ebcd 95 lwm2m_free(serverP->location);
terencez 0:3f48af28ebcd 96 }
terencez 0:3f48af28ebcd 97 free_block1_buffer(serverP->block1Data);
terencez 0:3f48af28ebcd 98 lwm2m_free(serverP);
terencez 0:3f48af28ebcd 99 }
terencez 0:3f48af28ebcd 100
terencez 0:3f48af28ebcd 101 static void prv_deleteServerList(lwm2m_context_t * context)
terencez 0:3f48af28ebcd 102 {
terencez 0:3f48af28ebcd 103 while (NULL != context->serverList)
terencez 0:3f48af28ebcd 104 {
terencez 0:3f48af28ebcd 105 lwm2m_server_t * server;
terencez 0:3f48af28ebcd 106 server = context->serverList;
terencez 0:3f48af28ebcd 107 context->serverList = server->next;
terencez 0:3f48af28ebcd 108 prv_deleteServer(server);
terencez 0:3f48af28ebcd 109 }
terencez 0:3f48af28ebcd 110 }
terencez 0:3f48af28ebcd 111
terencez 0:3f48af28ebcd 112 static void prv_deleteBootstrapServer(lwm2m_server_t * serverP)
terencez 0:3f48af28ebcd 113 {
terencez 0:3f48af28ebcd 114 // TODO should we free location as in prv_deleteServer ?
terencez 0:3f48af28ebcd 115 // TODO should we parse transaction and observation to remove the ones related to this server ?
terencez 0:3f48af28ebcd 116 free_block1_buffer(serverP->block1Data);
terencez 0:3f48af28ebcd 117 lwm2m_free(serverP);
terencez 0:3f48af28ebcd 118 }
terencez 0:3f48af28ebcd 119
terencez 0:3f48af28ebcd 120 static void prv_deleteBootstrapServerList(lwm2m_context_t * context)
terencez 0:3f48af28ebcd 121 {
terencez 0:3f48af28ebcd 122 while (NULL != context->bootstrapServerList)
terencez 0:3f48af28ebcd 123 {
terencez 0:3f48af28ebcd 124 lwm2m_server_t * server;
terencez 0:3f48af28ebcd 125 server = context->bootstrapServerList;
terencez 0:3f48af28ebcd 126 context->bootstrapServerList = server->next;
terencez 0:3f48af28ebcd 127 prv_deleteBootstrapServer(server);
terencez 0:3f48af28ebcd 128 }
terencez 0:3f48af28ebcd 129 }
terencez 0:3f48af28ebcd 130
terencez 0:3f48af28ebcd 131 static void prv_deleteObservedList(lwm2m_context_t * contextP)
terencez 0:3f48af28ebcd 132 {
terencez 0:3f48af28ebcd 133 while (NULL != contextP->observedList)
terencez 0:3f48af28ebcd 134 {
terencez 0:3f48af28ebcd 135 lwm2m_observed_t * targetP;
terencez 0:3f48af28ebcd 136 lwm2m_watcher_t * watcherP;
terencez 0:3f48af28ebcd 137
terencez 0:3f48af28ebcd 138 targetP = contextP->observedList;
terencez 0:3f48af28ebcd 139 contextP->observedList = contextP->observedList->next;
terencez 0:3f48af28ebcd 140
terencez 0:3f48af28ebcd 141 for (watcherP = targetP->watcherList ; watcherP != NULL ; watcherP = watcherP->next)
terencez 0:3f48af28ebcd 142 {
terencez 0:3f48af28ebcd 143 if (watcherP->parameters != NULL) lwm2m_free(watcherP->parameters);
terencez 0:3f48af28ebcd 144 }
terencez 0:3f48af28ebcd 145 LWM2M_LIST_FREE(targetP->watcherList);
terencez 0:3f48af28ebcd 146
terencez 0:3f48af28ebcd 147 lwm2m_free(targetP);
terencez 0:3f48af28ebcd 148 }
terencez 0:3f48af28ebcd 149 }
terencez 0:3f48af28ebcd 150 #endif
terencez 0:3f48af28ebcd 151
terencez 0:3f48af28ebcd 152 void prv_deleteTransactionList(lwm2m_context_t * context)
terencez 0:3f48af28ebcd 153 {
terencez 0:3f48af28ebcd 154 while (NULL != context->transactionList)
terencez 0:3f48af28ebcd 155 {
terencez 0:3f48af28ebcd 156 lwm2m_transaction_t * transaction;
terencez 0:3f48af28ebcd 157
terencez 0:3f48af28ebcd 158 transaction = context->transactionList;
terencez 0:3f48af28ebcd 159 context->transactionList = context->transactionList->next;
terencez 0:3f48af28ebcd 160 transaction_free(transaction);
terencez 0:3f48af28ebcd 161 }
terencez 0:3f48af28ebcd 162 }
terencez 0:3f48af28ebcd 163
terencez 0:3f48af28ebcd 164 void lwm2m_close(lwm2m_context_t * contextP)
terencez 0:3f48af28ebcd 165 {
terencez 0:3f48af28ebcd 166 #ifdef LWM2M_CLIENT_MODE
terencez 0:3f48af28ebcd 167
terencez 0:3f48af28ebcd 168 LOG("Entering");
terencez 0:3f48af28ebcd 169 lwm2m_deregister(contextP);
terencez 0:3f48af28ebcd 170 prv_deleteServerList(contextP);
terencez 0:3f48af28ebcd 171 prv_deleteBootstrapServerList(contextP);
terencez 0:3f48af28ebcd 172 prv_deleteObservedList(contextP);
terencez 0:3f48af28ebcd 173 lwm2m_free(contextP->endpointName);
terencez 0:3f48af28ebcd 174 if (contextP->msisdn != NULL)
terencez 0:3f48af28ebcd 175 {
terencez 0:3f48af28ebcd 176 lwm2m_free(contextP->msisdn);
terencez 0:3f48af28ebcd 177 }
terencez 0:3f48af28ebcd 178 if (contextP->altPath != NULL)
terencez 0:3f48af28ebcd 179 {
terencez 0:3f48af28ebcd 180 lwm2m_free(contextP->altPath);
terencez 0:3f48af28ebcd 181 }
terencez 0:3f48af28ebcd 182
terencez 0:3f48af28ebcd 183 #endif
terencez 0:3f48af28ebcd 184
terencez 0:3f48af28ebcd 185 #ifdef LWM2M_SERVER_MODE
terencez 0:3f48af28ebcd 186 while (NULL != contextP->clientList)
terencez 0:3f48af28ebcd 187 {
terencez 0:3f48af28ebcd 188 lwm2m_client_t * clientP;
terencez 0:3f48af28ebcd 189
terencez 0:3f48af28ebcd 190 clientP = contextP->clientList;
terencez 0:3f48af28ebcd 191 contextP->clientList = contextP->clientList->next;
terencez 0:3f48af28ebcd 192
terencez 0:3f48af28ebcd 193 registration_freeClient(clientP);
terencez 0:3f48af28ebcd 194 }
terencez 0:3f48af28ebcd 195 #endif
terencez 0:3f48af28ebcd 196
terencez 0:3f48af28ebcd 197 prv_deleteTransactionList(contextP);
terencez 0:3f48af28ebcd 198 lwm2m_free(contextP);
terencez 0:3f48af28ebcd 199 }
terencez 0:3f48af28ebcd 200
terencez 0:3f48af28ebcd 201 #ifdef LWM2M_CLIENT_MODE
terencez 0:3f48af28ebcd 202 static int prv_refreshServerList(lwm2m_context_t * contextP)
terencez 0:3f48af28ebcd 203 {
terencez 0:3f48af28ebcd 204 lwm2m_server_t * targetP;
terencez 0:3f48af28ebcd 205 lwm2m_server_t * nextP;
terencez 0:3f48af28ebcd 206
terencez 0:3f48af28ebcd 207 // Remove all servers marked as dirty
terencez 0:3f48af28ebcd 208 targetP = contextP->bootstrapServerList;
terencez 0:3f48af28ebcd 209 contextP->bootstrapServerList = NULL;
terencez 0:3f48af28ebcd 210 while (targetP != NULL)
terencez 0:3f48af28ebcd 211 {
terencez 0:3f48af28ebcd 212 nextP = targetP->next;
terencez 0:3f48af28ebcd 213 targetP->next = NULL;
terencez 0:3f48af28ebcd 214 if (!targetP->dirty)
terencez 0:3f48af28ebcd 215 {
terencez 0:3f48af28ebcd 216 targetP->status = STATE_DEREGISTERED;
terencez 0:3f48af28ebcd 217 contextP->bootstrapServerList = (lwm2m_server_t *)LWM2M_LIST_ADD(contextP->bootstrapServerList, targetP);
terencez 0:3f48af28ebcd 218 }
terencez 0:3f48af28ebcd 219 else
terencez 0:3f48af28ebcd 220 {
terencez 0:3f48af28ebcd 221 prv_deleteServer(targetP);
terencez 0:3f48af28ebcd 222 }
terencez 0:3f48af28ebcd 223 targetP = nextP;
terencez 0:3f48af28ebcd 224 }
terencez 0:3f48af28ebcd 225 targetP = contextP->serverList;
terencez 0:3f48af28ebcd 226 contextP->serverList = NULL;
terencez 0:3f48af28ebcd 227 while (targetP != NULL)
terencez 0:3f48af28ebcd 228 {
terencez 0:3f48af28ebcd 229 nextP = targetP->next;
terencez 0:3f48af28ebcd 230 targetP->next = NULL;
terencez 0:3f48af28ebcd 231 if (!targetP->dirty)
terencez 0:3f48af28ebcd 232 {
terencez 0:3f48af28ebcd 233 // TODO: Should we revert the status to STATE_DEREGISTERED ?
terencez 0:3f48af28ebcd 234 contextP->serverList = (lwm2m_server_t *)LWM2M_LIST_ADD(contextP->serverList, targetP);
terencez 0:3f48af28ebcd 235 }
terencez 0:3f48af28ebcd 236 else
terencez 0:3f48af28ebcd 237 {
terencez 0:3f48af28ebcd 238 prv_deleteServer(targetP);
terencez 0:3f48af28ebcd 239 }
terencez 0:3f48af28ebcd 240 targetP = nextP;
terencez 0:3f48af28ebcd 241 }
terencez 0:3f48af28ebcd 242
terencez 0:3f48af28ebcd 243 return object_getServers(contextP);
terencez 0:3f48af28ebcd 244 }
terencez 0:3f48af28ebcd 245
terencez 0:3f48af28ebcd 246 int lwm2m_configure(lwm2m_context_t * contextP,
terencez 0:3f48af28ebcd 247 const char * endpointName,
terencez 0:3f48af28ebcd 248 const char * msisdn,
terencez 0:3f48af28ebcd 249 const char * altPath,
terencez 0:3f48af28ebcd 250 uint16_t numObject,
terencez 0:3f48af28ebcd 251 lwm2m_object_t * objectList[])
terencez 0:3f48af28ebcd 252 {
terencez 0:3f48af28ebcd 253 int i;
terencez 0:3f48af28ebcd 254 uint8_t found;
terencez 0:3f48af28ebcd 255
terencez 0:3f48af28ebcd 256 LOG_ARG("endpointName: \"%s\", msisdn: \"%s\", altPath: \"%s\", numObject: %d", endpointName, msisdn, altPath, numObject);
terencez 0:3f48af28ebcd 257 // This API can be called only once for now
terencez 0:3f48af28ebcd 258 if (contextP->endpointName != NULL || contextP->objectList != NULL) return COAP_400_BAD_REQUEST;
terencez 0:3f48af28ebcd 259
terencez 0:3f48af28ebcd 260 if (endpointName == NULL) return COAP_400_BAD_REQUEST;
terencez 0:3f48af28ebcd 261 if (numObject < 3) return COAP_400_BAD_REQUEST;
terencez 0:3f48af28ebcd 262 // Check that mandatory objects are present
terencez 0:3f48af28ebcd 263 found = 0;
terencez 0:3f48af28ebcd 264 for (i = 0 ; i < numObject ; i++)
terencez 0:3f48af28ebcd 265 {
terencez 0:3f48af28ebcd 266 if (objectList[i]->objID == LWM2M_SECURITY_OBJECT_ID) found |= 0x01;
terencez 0:3f48af28ebcd 267 if (objectList[i]->objID == LWM2M_SERVER_OBJECT_ID) found |= 0x02;
terencez 0:3f48af28ebcd 268 if (objectList[i]->objID == LWM2M_DEVICE_OBJECT_ID) found |= 0x04;
terencez 0:3f48af28ebcd 269 }
terencez 0:3f48af28ebcd 270 if (found != 0x07) return COAP_400_BAD_REQUEST;
terencez 0:3f48af28ebcd 271 if (altPath != NULL)
terencez 0:3f48af28ebcd 272 {
terencez 0:3f48af28ebcd 273 if (0 == utils_isAltPathValid(altPath))
terencez 0:3f48af28ebcd 274 {
terencez 0:3f48af28ebcd 275 return COAP_400_BAD_REQUEST;
terencez 0:3f48af28ebcd 276 }
terencez 0:3f48af28ebcd 277 if (altPath[1] == 0)
terencez 0:3f48af28ebcd 278 {
terencez 0:3f48af28ebcd 279 altPath = NULL;
terencez 0:3f48af28ebcd 280 }
terencez 0:3f48af28ebcd 281 }
terencez 0:3f48af28ebcd 282 contextP->endpointName = lwm2m_strdup(endpointName);
terencez 0:3f48af28ebcd 283 if (contextP->endpointName == NULL)
terencez 0:3f48af28ebcd 284 {
terencez 0:3f48af28ebcd 285 return COAP_500_INTERNAL_SERVER_ERROR;
terencez 0:3f48af28ebcd 286 }
terencez 0:3f48af28ebcd 287
terencez 0:3f48af28ebcd 288 if (msisdn != NULL)
terencez 0:3f48af28ebcd 289 {
terencez 0:3f48af28ebcd 290 contextP->msisdn = lwm2m_strdup(msisdn);
terencez 0:3f48af28ebcd 291 if (contextP->msisdn == NULL)
terencez 0:3f48af28ebcd 292 {
terencez 0:3f48af28ebcd 293 return COAP_500_INTERNAL_SERVER_ERROR;
terencez 0:3f48af28ebcd 294 }
terencez 0:3f48af28ebcd 295 }
terencez 0:3f48af28ebcd 296
terencez 0:3f48af28ebcd 297 if (altPath != NULL)
terencez 0:3f48af28ebcd 298 {
terencez 0:3f48af28ebcd 299 contextP->altPath = lwm2m_strdup(altPath);
terencez 0:3f48af28ebcd 300 if (contextP->altPath == NULL)
terencez 0:3f48af28ebcd 301 {
terencez 0:3f48af28ebcd 302 return COAP_500_INTERNAL_SERVER_ERROR;
terencez 0:3f48af28ebcd 303 }
terencez 0:3f48af28ebcd 304 }
terencez 0:3f48af28ebcd 305
terencez 0:3f48af28ebcd 306 for (i = 0; i < numObject; i++)
terencez 0:3f48af28ebcd 307 {
terencez 0:3f48af28ebcd 308 objectList[i]->next = NULL;
terencez 0:3f48af28ebcd 309 contextP->objectList = (lwm2m_object_t *)LWM2M_LIST_ADD(contextP->objectList, objectList[i]);
terencez 0:3f48af28ebcd 310 }
terencez 0:3f48af28ebcd 311
terencez 0:3f48af28ebcd 312 return COAP_NO_ERROR;
terencez 0:3f48af28ebcd 313 }
terencez 0:3f48af28ebcd 314
terencez 0:3f48af28ebcd 315 int lwm2m_add_object(lwm2m_context_t * contextP,
terencez 0:3f48af28ebcd 316 lwm2m_object_t * objectP)
terencez 0:3f48af28ebcd 317 {
terencez 0:3f48af28ebcd 318 lwm2m_object_t * targetP;
terencez 0:3f48af28ebcd 319
terencez 0:3f48af28ebcd 320 LOG_ARG("ID: %d", objectP->objID);
terencez 0:3f48af28ebcd 321 targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, objectP->objID);
terencez 0:3f48af28ebcd 322 if (targetP != NULL) return COAP_406_NOT_ACCEPTABLE;
terencez 0:3f48af28ebcd 323 objectP->next = NULL;
terencez 0:3f48af28ebcd 324
terencez 0:3f48af28ebcd 325 contextP->objectList = (lwm2m_object_t *)LWM2M_LIST_ADD(contextP->objectList, objectP);
terencez 0:3f48af28ebcd 326
terencez 0:3f48af28ebcd 327 if (contextP->state == STATE_READY)
terencez 0:3f48af28ebcd 328 {
terencez 0:3f48af28ebcd 329 return lwm2m_update_registration(contextP, 0, true);
terencez 0:3f48af28ebcd 330 }
terencez 0:3f48af28ebcd 331
terencez 0:3f48af28ebcd 332 return COAP_NO_ERROR;
terencez 0:3f48af28ebcd 333 }
terencez 0:3f48af28ebcd 334
terencez 0:3f48af28ebcd 335 int lwm2m_remove_object(lwm2m_context_t * contextP,
terencez 0:3f48af28ebcd 336 uint16_t id)
terencez 0:3f48af28ebcd 337 {
terencez 0:3f48af28ebcd 338 lwm2m_object_t * targetP;
terencez 0:3f48af28ebcd 339
terencez 0:3f48af28ebcd 340 LOG_ARG("ID: %d", id);
terencez 0:3f48af28ebcd 341 contextP->objectList = (lwm2m_object_t *)LWM2M_LIST_RM(contextP->objectList, id, &targetP);
terencez 0:3f48af28ebcd 342
terencez 0:3f48af28ebcd 343 if (targetP == NULL) return COAP_404_NOT_FOUND;
terencez 0:3f48af28ebcd 344
terencez 0:3f48af28ebcd 345 if (contextP->state == STATE_READY)
terencez 0:3f48af28ebcd 346 {
terencez 0:3f48af28ebcd 347 return lwm2m_update_registration(contextP, 0, true);
terencez 0:3f48af28ebcd 348 }
terencez 0:3f48af28ebcd 349
terencez 0:3f48af28ebcd 350 return 0;
terencez 0:3f48af28ebcd 351 }
terencez 0:3f48af28ebcd 352
terencez 0:3f48af28ebcd 353 #endif
terencez 0:3f48af28ebcd 354
terencez 0:3f48af28ebcd 355
terencez 0:3f48af28ebcd 356 int lwm2m_step(lwm2m_context_t * contextP,
terencez 0:3f48af28ebcd 357 time_t * timeoutP)
terencez 0:3f48af28ebcd 358 {
terencez 0:3f48af28ebcd 359 time_t tv_sec;
terencez 0:3f48af28ebcd 360 int result;
terencez 0:3f48af28ebcd 361
terencez 0:3f48af28ebcd 362 LOG_ARG("timeoutP: %" PRId64, *timeoutP);
terencez 0:3f48af28ebcd 363 tv_sec = lwm2m_gettime();
terencez 0:3f48af28ebcd 364 if (tv_sec < 0) return COAP_500_INTERNAL_SERVER_ERROR;
terencez 0:3f48af28ebcd 365
terencez 0:3f48af28ebcd 366 #ifdef LWM2M_CLIENT_MODE
terencez 0:3f48af28ebcd 367 LOG_ARG("State: %s", STR_STATE(contextP->state));
terencez 0:3f48af28ebcd 368 // state can also be modified in bootstrap_handleCommand().
terencez 0:3f48af28ebcd 369
terencez 0:3f48af28ebcd 370 next_step:
terencez 0:3f48af28ebcd 371 switch (contextP->state)
terencez 0:3f48af28ebcd 372 {
terencez 0:3f48af28ebcd 373 case STATE_INITIAL:
terencez 0:3f48af28ebcd 374 if (0 != prv_refreshServerList(contextP)) return COAP_503_SERVICE_UNAVAILABLE;
terencez 0:3f48af28ebcd 375 if (contextP->serverList != NULL)
terencez 0:3f48af28ebcd 376 {
terencez 0:3f48af28ebcd 377 contextP->state = STATE_REGISTER_REQUIRED;
terencez 0:3f48af28ebcd 378 }
terencez 0:3f48af28ebcd 379 else
terencez 0:3f48af28ebcd 380 {
terencez 0:3f48af28ebcd 381 // Bootstrapping
terencez 0:3f48af28ebcd 382 contextP->state = STATE_BOOTSTRAP_REQUIRED;
terencez 0:3f48af28ebcd 383 }
terencez 0:3f48af28ebcd 384 goto next_step;
terencez 0:3f48af28ebcd 385 break;
terencez 0:3f48af28ebcd 386
terencez 0:3f48af28ebcd 387 case STATE_BOOTSTRAP_REQUIRED:
terencez 0:3f48af28ebcd 388 #ifdef LWM2M_BOOTSTRAP
terencez 0:3f48af28ebcd 389 if (contextP->bootstrapServerList != NULL)
terencez 0:3f48af28ebcd 390 {
terencez 0:3f48af28ebcd 391 bootstrap_start(contextP);
terencez 0:3f48af28ebcd 392 contextP->state = STATE_BOOTSTRAPPING;
terencez 0:3f48af28ebcd 393 bootstrap_step(contextP, tv_sec, timeoutP);
terencez 0:3f48af28ebcd 394 }
terencez 0:3f48af28ebcd 395 else
terencez 0:3f48af28ebcd 396 #endif
terencez 0:3f48af28ebcd 397 {
terencez 0:3f48af28ebcd 398 return COAP_503_SERVICE_UNAVAILABLE;
terencez 0:3f48af28ebcd 399 }
terencez 0:3f48af28ebcd 400 break;
terencez 0:3f48af28ebcd 401
terencez 0:3f48af28ebcd 402 #ifdef LWM2M_BOOTSTRAP
terencez 0:3f48af28ebcd 403 case STATE_BOOTSTRAPPING:
terencez 0:3f48af28ebcd 404 switch (bootstrap_getStatus(contextP))
terencez 0:3f48af28ebcd 405 {
terencez 0:3f48af28ebcd 406 case STATE_BS_FINISHED:
terencez 0:3f48af28ebcd 407 contextP->state = STATE_INITIAL;
terencez 0:3f48af28ebcd 408 goto next_step;
terencez 0:3f48af28ebcd 409 break;
terencez 0:3f48af28ebcd 410
terencez 0:3f48af28ebcd 411 case STATE_BS_FAILED:
terencez 0:3f48af28ebcd 412 return COAP_503_SERVICE_UNAVAILABLE;
terencez 0:3f48af28ebcd 413
terencez 0:3f48af28ebcd 414 default:
terencez 0:3f48af28ebcd 415 // keep on waiting
terencez 0:3f48af28ebcd 416 bootstrap_step(contextP, tv_sec, timeoutP);
terencez 0:3f48af28ebcd 417 break;
terencez 0:3f48af28ebcd 418 }
terencez 0:3f48af28ebcd 419 break;
terencez 0:3f48af28ebcd 420 #endif
terencez 0:3f48af28ebcd 421 case STATE_REGISTER_REQUIRED:
terencez 0:3f48af28ebcd 422 result = registration_start(contextP);
terencez 0:3f48af28ebcd 423 if (COAP_NO_ERROR != result) return result;
terencez 0:3f48af28ebcd 424 contextP->state = STATE_REGISTERING;
terencez 0:3f48af28ebcd 425 break;
terencez 0:3f48af28ebcd 426
terencez 0:3f48af28ebcd 427 case STATE_REGISTERING:
terencez 0:3f48af28ebcd 428 {
terencez 0:3f48af28ebcd 429 switch (registration_getStatus(contextP))
terencez 0:3f48af28ebcd 430 {
terencez 0:3f48af28ebcd 431 case STATE_REGISTERED:
terencez 0:3f48af28ebcd 432 contextP->state = STATE_READY;
terencez 0:3f48af28ebcd 433 break;
terencez 0:3f48af28ebcd 434
terencez 0:3f48af28ebcd 435 case STATE_REG_FAILED:
terencez 0:3f48af28ebcd 436 // TODO avoid infinite loop by checking the bootstrap info is different
terencez 0:3f48af28ebcd 437 contextP->state = STATE_BOOTSTRAP_REQUIRED;
terencez 0:3f48af28ebcd 438 goto next_step;
terencez 0:3f48af28ebcd 439 break;
terencez 0:3f48af28ebcd 440
terencez 0:3f48af28ebcd 441 case STATE_REG_PENDING:
terencez 0:3f48af28ebcd 442 default:
terencez 0:3f48af28ebcd 443 // keep on waiting
terencez 0:3f48af28ebcd 444 break;
terencez 0:3f48af28ebcd 445 }
terencez 0:3f48af28ebcd 446 }
terencez 0:3f48af28ebcd 447 break;
terencez 0:3f48af28ebcd 448
terencez 0:3f48af28ebcd 449 case STATE_READY:
terencez 0:3f48af28ebcd 450 if (registration_getStatus(contextP) == STATE_REG_FAILED)
terencez 0:3f48af28ebcd 451 {
terencez 0:3f48af28ebcd 452 // TODO avoid infinite loop by checking the bootstrap info is different
terencez 0:3f48af28ebcd 453 contextP->state = STATE_BOOTSTRAP_REQUIRED;
terencez 0:3f48af28ebcd 454 goto next_step;
terencez 0:3f48af28ebcd 455 break;
terencez 0:3f48af28ebcd 456 }
terencez 0:3f48af28ebcd 457 break;
terencez 0:3f48af28ebcd 458
terencez 0:3f48af28ebcd 459 default:
terencez 0:3f48af28ebcd 460 // do nothing
terencez 0:3f48af28ebcd 461 break;
terencez 0:3f48af28ebcd 462 }
terencez 0:3f48af28ebcd 463
terencez 0:3f48af28ebcd 464 observe_step(contextP, tv_sec, timeoutP);
terencez 0:3f48af28ebcd 465 #endif
terencez 0:3f48af28ebcd 466
terencez 0:3f48af28ebcd 467 registration_step(contextP, tv_sec, timeoutP);
terencez 0:3f48af28ebcd 468 transaction_step(contextP, tv_sec, timeoutP);
terencez 0:3f48af28ebcd 469
terencez 0:3f48af28ebcd 470 LOG_ARG("Final timeoutP: %" PRId64, *timeoutP);
terencez 0:3f48af28ebcd 471 #ifdef LWM2M_CLIENT_MODE
terencez 0:3f48af28ebcd 472 LOG_ARG("Final state: %s", STR_STATE(contextP->state));
terencez 0:3f48af28ebcd 473 #endif
terencez 0:3f48af28ebcd 474 return 0;
terencez 0:3f48af28ebcd 475 }