terence zhang / Mbed OS mbed-os-example-wakaama

Dependencies:   C12832 LM75B

Committer:
terencez
Date:
Sat May 06 11:21:27 2017 +0000
Revision:
14:ec9e195830ff
Parent:
12:cc4b0014fc3a
Child:
15:d0f20339c1ad
First compile version, registration success but could not handle request.

Who changed what in which revision?

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