Jim Carver / Mbed OS mbed-cloud-workshop-connect-PIR

Dependencies:   HTS221

Fork of mbed-cloud-workshop-connect-HTS221 by Jim Carver

Committer:
JimCarver
Date:
Thu Oct 25 14:00:12 2018 +0000
Revision:
4:e518dde96e59
Parent:
0:6b753f761943
Simulated dispenser

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JimCarver 0:6b753f761943 1 /*
JimCarver 0:6b753f761943 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
JimCarver 0:6b753f761943 3 * SPDX-License-Identifier: Apache-2.0
JimCarver 0:6b753f761943 4 * Licensed under the Apache License, Version 2.0 (the License); you may
JimCarver 0:6b753f761943 5 * not use this file except in compliance with the License.
JimCarver 0:6b753f761943 6 * You may obtain a copy of the License at
JimCarver 0:6b753f761943 7 *
JimCarver 0:6b753f761943 8 * http://www.apache.org/licenses/LICENSE-2.0
JimCarver 0:6b753f761943 9 *
JimCarver 0:6b753f761943 10 * Unless required by applicable law or agreed to in writing, software
JimCarver 0:6b753f761943 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
JimCarver 0:6b753f761943 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
JimCarver 0:6b753f761943 13 * See the License for the specific language governing permissions and
JimCarver 0:6b753f761943 14 * limitations under the License.
JimCarver 0:6b753f761943 15 */
JimCarver 0:6b753f761943 16
JimCarver 0:6b753f761943 17 // Needed for PRIu64 on FreeRTOS
JimCarver 0:6b753f761943 18 #include <stdio.h>
JimCarver 0:6b753f761943 19 // Note: this macro is needed on armcc to get the the PRI*32 macros
JimCarver 0:6b753f761943 20 // from inttypes.h in a C++ code.
JimCarver 0:6b753f761943 21 #ifndef __STDC_FORMAT_MACROS
JimCarver 0:6b753f761943 22 #define __STDC_FORMAT_MACROS
JimCarver 0:6b753f761943 23 #endif
JimCarver 0:6b753f761943 24 #include <inttypes.h>
JimCarver 0:6b753f761943 25
JimCarver 0:6b753f761943 26 #include <assert.h>
JimCarver 0:6b753f761943 27 #include <stdlib.h>
JimCarver 0:6b753f761943 28 #include <stdio.h>
JimCarver 0:6b753f761943 29 #include <time.h>
JimCarver 0:6b753f761943 30 #include "include/m2minterfaceimpl.h"
JimCarver 0:6b753f761943 31 #include "include/eventdata.h"
JimCarver 0:6b753f761943 32 #include "mbed-client/m2minterfaceobserver.h"
JimCarver 0:6b753f761943 33 #include "mbed-client/m2mconnectionhandler.h"
JimCarver 0:6b753f761943 34 #include "mbed-client/m2mconnectionsecurity.h"
JimCarver 0:6b753f761943 35 #include "include/m2mnsdlinterface.h"
JimCarver 0:6b753f761943 36 #include "mbed-client/m2msecurity.h"
JimCarver 0:6b753f761943 37 #include "mbed-client/m2mtimer.h"
JimCarver 0:6b753f761943 38 #include "mbed-trace/mbed_trace.h"
JimCarver 0:6b753f761943 39 #include "randLIB.h"
JimCarver 0:6b753f761943 40
JimCarver 0:6b753f761943 41 #include <stdlib.h>
JimCarver 0:6b753f761943 42
JimCarver 0:6b753f761943 43 #define TRACE_GROUP "mClt"
JimCarver 0:6b753f761943 44
JimCarver 0:6b753f761943 45 #define RESOLVE_SEC_MODE(mode) ((mode == M2MInterface::TCP || mode == M2MInterface::TCP_QUEUE) ? M2MConnectionSecurity::TLS : M2MConnectionSecurity::DTLS)
JimCarver 0:6b753f761943 46
JimCarver 0:6b753f761943 47 M2MInterfaceImpl::M2MInterfaceImpl(M2MInterfaceObserver& observer,
JimCarver 0:6b753f761943 48 const String &ep_name,
JimCarver 0:6b753f761943 49 const String &ep_type,
JimCarver 0:6b753f761943 50 const int32_t l_time,
JimCarver 0:6b753f761943 51 const uint16_t listen_port,
JimCarver 0:6b753f761943 52 const String &dmn,
JimCarver 0:6b753f761943 53 M2MInterface::BindingMode mode,
JimCarver 0:6b753f761943 54 M2MInterface::NetworkStack stack,
JimCarver 0:6b753f761943 55 const String &con_addr)
JimCarver 0:6b753f761943 56 : _event_data(NULL),
JimCarver 0:6b753f761943 57 _registration_flow_timer(NULL),
JimCarver 0:6b753f761943 58 _server_port(0),
JimCarver 0:6b753f761943 59 _listen_port(listen_port),
JimCarver 0:6b753f761943 60 _life_time(l_time),
JimCarver 0:6b753f761943 61 _register_server(NULL),
JimCarver 0:6b753f761943 62 _queue_sleep_timer(*this),
JimCarver 0:6b753f761943 63 _retry_timer(*this),
JimCarver 0:6b753f761943 64 _callback_handler(NULL),
JimCarver 0:6b753f761943 65 _max_states( STATE_MAX_STATES ),
JimCarver 0:6b753f761943 66 _event_ignored(false),
JimCarver 0:6b753f761943 67 _event_generated(false),
JimCarver 0:6b753f761943 68 _reconnecting(false),
JimCarver 0:6b753f761943 69 _retry_timer_expired(false),
JimCarver 0:6b753f761943 70 _bootstrapped(true), // True as default to get it working with connector only configuration
JimCarver 0:6b753f761943 71 _bootstrap_finished(false),
JimCarver 0:6b753f761943 72 _queue_mode_timer_ongoing(false),
JimCarver 0:6b753f761943 73 _current_state(0),
JimCarver 0:6b753f761943 74 _binding_mode(mode),
JimCarver 0:6b753f761943 75 _reconnection_state(M2MInterfaceImpl::None),
JimCarver 0:6b753f761943 76 _observer(observer),
JimCarver 0:6b753f761943 77 _security_connection( new M2MConnectionSecurity( RESOLVE_SEC_MODE(mode) )),
JimCarver 0:6b753f761943 78 _connection_handler(*this, _security_connection, mode, stack),
JimCarver 0:6b753f761943 79 _nsdl_interface(*this, _connection_handler),
JimCarver 0:6b753f761943 80 _security(NULL)
JimCarver 0:6b753f761943 81 {
JimCarver 0:6b753f761943 82 tr_debug("M2MInterfaceImpl::M2MInterfaceImpl() -IN");
JimCarver 0:6b753f761943 83 //TODO:Increase the range from 1 to 100 seconds
JimCarver 0:6b753f761943 84 randLIB_seed_random();
JimCarver 0:6b753f761943 85 // Range is from 2 to 10
JimCarver 0:6b753f761943 86 _initial_reconnection_time = randLIB_get_random_in_range(2, 10);
JimCarver 0:6b753f761943 87
JimCarver 0:6b753f761943 88 tr_info("M2MInterfaceImpl::M2MInterfaceImpl() initial random time %d\n", _initial_reconnection_time);
JimCarver 0:6b753f761943 89 _reconnection_time = _initial_reconnection_time;
JimCarver 0:6b753f761943 90
JimCarver 0:6b753f761943 91 #ifndef DISABLE_ERROR_DESCRIPTION
JimCarver 0:6b753f761943 92 memset(_error_description, 0, sizeof(_error_description));
JimCarver 0:6b753f761943 93 #endif
JimCarver 0:6b753f761943 94
JimCarver 0:6b753f761943 95 _nsdl_interface.create_endpoint(ep_name,
JimCarver 0:6b753f761943 96 ep_type,
JimCarver 0:6b753f761943 97 _life_time,
JimCarver 0:6b753f761943 98 dmn,
JimCarver 0:6b753f761943 99 (uint8_t)_binding_mode,
JimCarver 0:6b753f761943 100 con_addr);
JimCarver 0:6b753f761943 101
JimCarver 0:6b753f761943 102 //Here we must use TCP still
JimCarver 0:6b753f761943 103 _connection_handler.bind_connection(_listen_port);
JimCarver 0:6b753f761943 104
JimCarver 0:6b753f761943 105 // We need this timer only in case of TCP
JimCarver 0:6b753f761943 106 if (_binding_mode == M2MInterface::TCP ||
JimCarver 0:6b753f761943 107 _binding_mode == M2MInterface::TCP_QUEUE ) {
JimCarver 0:6b753f761943 108 _registration_flow_timer = new M2MTimer(*this);
JimCarver 0:6b753f761943 109 }
JimCarver 0:6b753f761943 110 tr_debug("M2MInterfaceImpl::M2MInterfaceImpl() -OUT");
JimCarver 0:6b753f761943 111 }
JimCarver 0:6b753f761943 112
JimCarver 0:6b753f761943 113
JimCarver 0:6b753f761943 114 M2MInterfaceImpl::~M2MInterfaceImpl()
JimCarver 0:6b753f761943 115 {
JimCarver 0:6b753f761943 116 tr_debug("M2MInterfaceImpl::~M2MInterfaceImpl() - IN");
JimCarver 0:6b753f761943 117 delete _registration_flow_timer;
JimCarver 0:6b753f761943 118 _security_connection = NULL;
JimCarver 0:6b753f761943 119 tr_debug("M2MInterfaceImpl::~M2MInterfaceImpl() - OUT");
JimCarver 0:6b753f761943 120 }
JimCarver 0:6b753f761943 121
JimCarver 0:6b753f761943 122 void M2MInterfaceImpl::bootstrap(M2MSecurity *security)
JimCarver 0:6b753f761943 123 {
JimCarver 0:6b753f761943 124 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 125 tr_debug("M2MInterfaceImpl::bootstrap - IN - current state %d", _current_state);
JimCarver 0:6b753f761943 126 _retry_timer.stop_timer();
JimCarver 0:6b753f761943 127 _security = NULL;
JimCarver 0:6b753f761943 128 if(!security) {
JimCarver 0:6b753f761943 129 set_error_description(ERROR_REASON_1);
JimCarver 0:6b753f761943 130 _observer.error(M2MInterface::InvalidParameters);
JimCarver 0:6b753f761943 131 return;
JimCarver 0:6b753f761943 132 }
JimCarver 0:6b753f761943 133 // Transition to a new state based upon
JimCarver 0:6b753f761943 134 // the current state of the state machine
JimCarver 0:6b753f761943 135 _connection_handler.claim_mutex();
JimCarver 0:6b753f761943 136 M2MSecurityData data;
JimCarver 0:6b753f761943 137 data._object = security;
JimCarver 0:6b753f761943 138 BEGIN_TRANSITION_MAP // - Current State -
JimCarver 0:6b753f761943 139 TRANSITION_MAP_ENTRY (STATE_BOOTSTRAP) // state_idle
JimCarver 0:6b753f761943 140 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap
JimCarver 0:6b753f761943 141 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state__bootstrap_address_resolved
JimCarver 0:6b753f761943 142 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_resource_created
JimCarver 0:6b753f761943 143 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_wait
JimCarver 0:6b753f761943 144 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_error_wait
JimCarver 0:6b753f761943 145 TRANSITION_MAP_ENTRY (STATE_BOOTSTRAP) // state_bootstrapped
JimCarver 0:6b753f761943 146 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register
JimCarver 0:6b753f761943 147 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_address_resolved
JimCarver 0:6b753f761943 148 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_registered
JimCarver 0:6b753f761943 149 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_update_registration
JimCarver 0:6b753f761943 150 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregister
JimCarver 0:6b753f761943 151 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregistered
JimCarver 0:6b753f761943 152 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_sending_coap_data
JimCarver 0:6b753f761943 153 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_sent
JimCarver 0:6b753f761943 154 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_received
JimCarver 0:6b753f761943 155 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_processing_coap_data
JimCarver 0:6b753f761943 156 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_processed
JimCarver 0:6b753f761943 157 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_waiting
JimCarver 0:6b753f761943 158 END_TRANSITION_MAP(&data)
JimCarver 0:6b753f761943 159 if(_event_ignored) {
JimCarver 0:6b753f761943 160 _event_ignored = false;
JimCarver 0:6b753f761943 161 set_error_description(ERROR_REASON_2);
JimCarver 0:6b753f761943 162 _observer.error(M2MInterface::NotAllowed);
JimCarver 0:6b753f761943 163 }
JimCarver 0:6b753f761943 164 _connection_handler.release_mutex();
JimCarver 0:6b753f761943 165 tr_debug("M2MInterfaceImpl::bootstrap - OUT");
JimCarver 0:6b753f761943 166 #else
JimCarver 0:6b753f761943 167 set_error_description(ERROR_REASON_3);
JimCarver 0:6b753f761943 168 _observer.error(M2MInterface::NotAllowed);
JimCarver 0:6b753f761943 169 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 170
JimCarver 0:6b753f761943 171 }
JimCarver 0:6b753f761943 172
JimCarver 0:6b753f761943 173 void M2MInterfaceImpl::cancel_bootstrap()
JimCarver 0:6b753f761943 174 {
JimCarver 0:6b753f761943 175 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 176 //TODO: Do we need this ?
JimCarver 0:6b753f761943 177 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 178 }
JimCarver 0:6b753f761943 179
JimCarver 0:6b753f761943 180 void M2MInterfaceImpl::finish_bootstrap()
JimCarver 0:6b753f761943 181 {
JimCarver 0:6b753f761943 182 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 183 tr_debug("M2MInterfaceImpl::finish_bootstrap");
JimCarver 0:6b753f761943 184 _security = NULL;
JimCarver 0:6b753f761943 185 bootstrap_done();
JimCarver 0:6b753f761943 186 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 187 }
JimCarver 0:6b753f761943 188
JimCarver 0:6b753f761943 189 void M2MInterfaceImpl::register_object(M2MSecurity *security, const M2MObjectList &object_list)
JimCarver 0:6b753f761943 190 {
JimCarver 0:6b753f761943 191 M2MBaseList list;
JimCarver 0:6b753f761943 192 M2MObjectList::const_iterator it = object_list.begin();
JimCarver 0:6b753f761943 193 for ( ; it != object_list.end(); it++ ) {
JimCarver 0:6b753f761943 194 list.push_back(*it);
JimCarver 0:6b753f761943 195 }
JimCarver 0:6b753f761943 196 register_object(security, list);
JimCarver 0:6b753f761943 197 }
JimCarver 0:6b753f761943 198
JimCarver 0:6b753f761943 199 void M2MInterfaceImpl::register_object(M2MSecurity *security, const M2MBaseList &list)
JimCarver 0:6b753f761943 200 {
JimCarver 0:6b753f761943 201 tr_debug("M2MInterfaceImpl::register_object - IN - current state %d", _current_state);
JimCarver 0:6b753f761943 202 if(!security) {
JimCarver 0:6b753f761943 203 set_error_description(ERROR_REASON_4);
JimCarver 0:6b753f761943 204 _observer.error(M2MInterface::InvalidParameters);
JimCarver 0:6b753f761943 205 return;
JimCarver 0:6b753f761943 206 }
JimCarver 0:6b753f761943 207 // Transition to a new state based upon
JimCarver 0:6b753f761943 208 // the current state of the state machine
JimCarver 0:6b753f761943 209 //TODO: manage register object in a list.
JimCarver 0:6b753f761943 210 _connection_handler.claim_mutex();
JimCarver 0:6b753f761943 211 _register_server = security;
JimCarver 0:6b753f761943 212 M2MRegisterData data;
JimCarver 0:6b753f761943 213 data._object = security;
JimCarver 0:6b753f761943 214 data._base_list = list;
JimCarver 0:6b753f761943 215 BEGIN_TRANSITION_MAP // - Current State -
JimCarver 0:6b753f761943 216 TRANSITION_MAP_ENTRY (STATE_REGISTER) // state_idle
JimCarver 0:6b753f761943 217 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap
JimCarver 0:6b753f761943 218 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state__bootstrap_address_resolved
JimCarver 0:6b753f761943 219 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_resource_created
JimCarver 0:6b753f761943 220 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_wait
JimCarver 0:6b753f761943 221 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_error_wait
JimCarver 0:6b753f761943 222 TRANSITION_MAP_ENTRY (STATE_REGISTER) // state_bootstrapped
JimCarver 0:6b753f761943 223 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register
JimCarver 0:6b753f761943 224 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_address_resolved
JimCarver 0:6b753f761943 225 TRANSITION_MAP_ENTRY (STATE_REGISTER) // state_registered
JimCarver 0:6b753f761943 226 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_update_registration
JimCarver 0:6b753f761943 227 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregister
JimCarver 0:6b753f761943 228 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregistered
JimCarver 0:6b753f761943 229 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_sending_coap_data
JimCarver 0:6b753f761943 230 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_sent
JimCarver 0:6b753f761943 231 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_received
JimCarver 0:6b753f761943 232 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_processing_coap_data
JimCarver 0:6b753f761943 233 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_processed
JimCarver 0:6b753f761943 234 TRANSITION_MAP_ENTRY (STATE_REGISTER) // state_waiting
JimCarver 0:6b753f761943 235 END_TRANSITION_MAP(&data)
JimCarver 0:6b753f761943 236 if(_event_ignored) {
JimCarver 0:6b753f761943 237 _event_ignored = false;
JimCarver 0:6b753f761943 238 set_error_description(ERROR_REASON_5);
JimCarver 0:6b753f761943 239 _observer.error(M2MInterface::NotAllowed);
JimCarver 0:6b753f761943 240 }
JimCarver 0:6b753f761943 241 _connection_handler.release_mutex();
JimCarver 0:6b753f761943 242 tr_debug("M2MInterfaceImpl::register_object - OUT");
JimCarver 0:6b753f761943 243 }
JimCarver 0:6b753f761943 244
JimCarver 0:6b753f761943 245 void M2MInterfaceImpl::update_registration(M2MSecurity *security_object, const uint32_t lifetime)
JimCarver 0:6b753f761943 246 {
JimCarver 0:6b753f761943 247 tr_debug("M2MInterfaceImpl::update_registration()");
JimCarver 0:6b753f761943 248 _connection_handler.claim_mutex();
JimCarver 0:6b753f761943 249 M2MUpdateRegisterData data;
JimCarver 0:6b753f761943 250 data._object = security_object;
JimCarver 0:6b753f761943 251 data._lifetime = lifetime;
JimCarver 0:6b753f761943 252 start_register_update(&data);
JimCarver 0:6b753f761943 253 _connection_handler.release_mutex();
JimCarver 0:6b753f761943 254 }
JimCarver 0:6b753f761943 255
JimCarver 0:6b753f761943 256 void M2MInterfaceImpl::update_registration(M2MSecurity *security_object,
JimCarver 0:6b753f761943 257 const M2MObjectList &object_list,
JimCarver 0:6b753f761943 258 const uint32_t lifetime)
JimCarver 0:6b753f761943 259 {
JimCarver 0:6b753f761943 260 tr_debug("M2MInterfaceImpl::update_registration - with object list");
JimCarver 0:6b753f761943 261 _connection_handler.claim_mutex();
JimCarver 0:6b753f761943 262 M2MBaseList list;
JimCarver 0:6b753f761943 263 M2MObjectList::const_iterator it = object_list.begin();
JimCarver 0:6b753f761943 264 for ( ; it != object_list.end(); it++ ) {
JimCarver 0:6b753f761943 265 list.push_back(*it);
JimCarver 0:6b753f761943 266 }
JimCarver 0:6b753f761943 267 update_registration(security_object, list, lifetime);
JimCarver 0:6b753f761943 268 _connection_handler.release_mutex();
JimCarver 0:6b753f761943 269 }
JimCarver 0:6b753f761943 270
JimCarver 0:6b753f761943 271 void M2MInterfaceImpl::update_registration(M2MSecurity *security_object,
JimCarver 0:6b753f761943 272 const M2MBaseList &list,
JimCarver 0:6b753f761943 273 const uint32_t lifetime)
JimCarver 0:6b753f761943 274 {
JimCarver 0:6b753f761943 275 tr_debug("M2MInterfaceImpl::update_registration(M2MSecurity *security_object, const M2MObjectList &object_list, const uint32_t lifetime)");
JimCarver 0:6b753f761943 276 _connection_handler.claim_mutex();
JimCarver 0:6b753f761943 277 M2MUpdateRegisterData data;
JimCarver 0:6b753f761943 278 data._object = security_object;
JimCarver 0:6b753f761943 279 data._lifetime = lifetime;
JimCarver 0:6b753f761943 280 data._base_list = list;
JimCarver 0:6b753f761943 281 start_register_update(&data);
JimCarver 0:6b753f761943 282 _connection_handler.release_mutex();
JimCarver 0:6b753f761943 283 }
JimCarver 0:6b753f761943 284
JimCarver 0:6b753f761943 285 void M2MInterfaceImpl::unregister_object(M2MSecurity* /*security*/)
JimCarver 0:6b753f761943 286 {
JimCarver 0:6b753f761943 287 tr_debug("M2MInterfaceImpl::unregister_object - IN - current state %d", _current_state);
JimCarver 0:6b753f761943 288 if (_nsdl_interface.is_unregister_ongoing()) {
JimCarver 0:6b753f761943 289 set_error_description(ERROR_REASON_27);
JimCarver 0:6b753f761943 290 _observer.error(M2MInterface::NotAllowed);
JimCarver 0:6b753f761943 291 return;
JimCarver 0:6b753f761943 292 }
JimCarver 0:6b753f761943 293
JimCarver 0:6b753f761943 294 _connection_handler.claim_mutex();
JimCarver 0:6b753f761943 295 // Transition to a new state based upon
JimCarver 0:6b753f761943 296 // the current state of the state machine
JimCarver 0:6b753f761943 297 BEGIN_TRANSITION_MAP // - Current State -
JimCarver 0:6b753f761943 298 TRANSITION_MAP_ENTRY (STATE_UNREGISTERED) // state_idle
JimCarver 0:6b753f761943 299 TRANSITION_MAP_ENTRY (STATE_UNREGISTERED) // state_bootstrap
JimCarver 0:6b753f761943 300 TRANSITION_MAP_ENTRY (STATE_UNREGISTERED) // state__bootstrap_address_resolved
JimCarver 0:6b753f761943 301 TRANSITION_MAP_ENTRY (STATE_UNREGISTERED) // state_bootstrap_resource_created
JimCarver 0:6b753f761943 302 TRANSITION_MAP_ENTRY (STATE_UNREGISTERED) // state_bootstrap_wait
JimCarver 0:6b753f761943 303 TRANSITION_MAP_ENTRY (STATE_UNREGISTERED) // state_bootstrap_error_wait
JimCarver 0:6b753f761943 304 TRANSITION_MAP_ENTRY (STATE_UNREGISTERED) // state_bootstrapped
JimCarver 0:6b753f761943 305 TRANSITION_MAP_ENTRY (STATE_UNREGISTERED) // state_register
JimCarver 0:6b753f761943 306 TRANSITION_MAP_ENTRY (STATE_UNREGISTERED) // state_register_address_resolved
JimCarver 0:6b753f761943 307 TRANSITION_MAP_ENTRY (STATE_UNREGISTER) // state_registered
JimCarver 0:6b753f761943 308 TRANSITION_MAP_ENTRY (STATE_UNREGISTER) // state_update_registration
JimCarver 0:6b753f761943 309 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregister
JimCarver 0:6b753f761943 310 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregistered
JimCarver 0:6b753f761943 311 TRANSITION_MAP_ENTRY (STATE_UNREGISTER) // state_sending_coap_data
JimCarver 0:6b753f761943 312 TRANSITION_MAP_ENTRY (STATE_UNREGISTER) // state_coap_data_sent
JimCarver 0:6b753f761943 313 TRANSITION_MAP_ENTRY (STATE_UNREGISTER) // state_coap_data_received
JimCarver 0:6b753f761943 314 TRANSITION_MAP_ENTRY (STATE_UNREGISTER) // state_processing_coap_data
JimCarver 0:6b753f761943 315 TRANSITION_MAP_ENTRY (STATE_UNREGISTER) // state_coap_data_processed
JimCarver 0:6b753f761943 316 TRANSITION_MAP_ENTRY (STATE_UNREGISTER) // state_waiting
JimCarver 0:6b753f761943 317 END_TRANSITION_MAP(NULL)
JimCarver 0:6b753f761943 318
JimCarver 0:6b753f761943 319 _connection_handler.release_mutex();
JimCarver 0:6b753f761943 320 tr_debug("M2MInterfaceImpl::unregister_object - OUT");
JimCarver 0:6b753f761943 321 }
JimCarver 0:6b753f761943 322
JimCarver 0:6b753f761943 323 void M2MInterfaceImpl::set_queue_sleep_handler(callback_handler handler)
JimCarver 0:6b753f761943 324 {
JimCarver 0:6b753f761943 325 _callback_handler = handler;
JimCarver 0:6b753f761943 326 }
JimCarver 0:6b753f761943 327
JimCarver 0:6b753f761943 328 void M2MInterfaceImpl::set_random_number_callback(random_number_cb callback)
JimCarver 0:6b753f761943 329 {
JimCarver 0:6b753f761943 330 if(_security_connection) {
JimCarver 0:6b753f761943 331 _security_connection->set_random_number_callback(callback);
JimCarver 0:6b753f761943 332 }
JimCarver 0:6b753f761943 333 }
JimCarver 0:6b753f761943 334
JimCarver 0:6b753f761943 335 void M2MInterfaceImpl::set_entropy_callback(entropy_cb callback)
JimCarver 0:6b753f761943 336 {
JimCarver 0:6b753f761943 337 if(_security_connection) {
JimCarver 0:6b753f761943 338 _security_connection->set_entropy_callback(callback);
JimCarver 0:6b753f761943 339 }
JimCarver 0:6b753f761943 340 }
JimCarver 0:6b753f761943 341
JimCarver 0:6b753f761943 342 void M2MInterfaceImpl::set_platform_network_handler(void *handler)
JimCarver 0:6b753f761943 343 {
JimCarver 0:6b753f761943 344 _connection_handler.set_platform_network_handler(handler);
JimCarver 0:6b753f761943 345 }
JimCarver 0:6b753f761943 346
JimCarver 0:6b753f761943 347 void M2MInterfaceImpl::coap_message_ready(uint8_t *data_ptr,
JimCarver 0:6b753f761943 348 uint16_t data_len,
JimCarver 0:6b753f761943 349 sn_nsdl_addr_s *address_ptr)
JimCarver 0:6b753f761943 350 {
JimCarver 0:6b753f761943 351 tr_debug("M2MInterfaceImpl::coap_message_ready");
JimCarver 0:6b753f761943 352 if (_current_state != STATE_IDLE) {
JimCarver 0:6b753f761943 353 internal_event(STATE_SENDING_COAP_DATA);
JimCarver 0:6b753f761943 354 if(!_connection_handler.send_data(data_ptr,data_len,address_ptr)) {
JimCarver 0:6b753f761943 355 internal_event( STATE_IDLE);
JimCarver 0:6b753f761943 356 tr_error("M2MInterfaceImpl::coap_message_ready() - M2MInterface::NetworkError");
JimCarver 0:6b753f761943 357 if (!_reconnecting) {
JimCarver 0:6b753f761943 358 _queue_mode_timer_ongoing = false;
JimCarver 0:6b753f761943 359 socket_error(M2MConnectionHandler::SOCKET_SEND_ERROR, true);
JimCarver 0:6b753f761943 360 } else {
JimCarver 0:6b753f761943 361 socket_error(M2MConnectionHandler::SOCKET_ABORT);
JimCarver 0:6b753f761943 362 }
JimCarver 0:6b753f761943 363 }
JimCarver 0:6b753f761943 364 }
JimCarver 0:6b753f761943 365 }
JimCarver 0:6b753f761943 366
JimCarver 0:6b753f761943 367 void M2MInterfaceImpl::client_registered(M2MServer *server_object)
JimCarver 0:6b753f761943 368 {
JimCarver 0:6b753f761943 369 tr_info("M2MInterfaceImpl::client_registered");
JimCarver 0:6b753f761943 370 internal_event(STATE_REGISTERED);
JimCarver 0:6b753f761943 371 //Inform client is registered.
JimCarver 0:6b753f761943 372 //TODO: manage register object in a list.
JimCarver 0:6b753f761943 373 _observer.object_registered(_register_server,*server_object);
JimCarver 0:6b753f761943 374 }
JimCarver 0:6b753f761943 375
JimCarver 0:6b753f761943 376 void M2MInterfaceImpl::registration_updated(const M2MServer &server_object)
JimCarver 0:6b753f761943 377 {
JimCarver 0:6b753f761943 378 tr_info("M2MInterfaceImpl::registration_updated");
JimCarver 0:6b753f761943 379 internal_event(STATE_REGISTERED);
JimCarver 0:6b753f761943 380 _observer.registration_updated(_register_server,server_object);
JimCarver 0:6b753f761943 381 }
JimCarver 0:6b753f761943 382
JimCarver 0:6b753f761943 383 void M2MInterfaceImpl::registration_error(uint8_t error_code, bool retry)
JimCarver 0:6b753f761943 384 {
JimCarver 0:6b753f761943 385 tr_error("M2MInterfaceImpl::registration_error code [%d]", error_code);
JimCarver 0:6b753f761943 386
JimCarver 0:6b753f761943 387 _nsdl_interface.set_registration_status(false);
JimCarver 0:6b753f761943 388 // Try to register again
JimCarver 0:6b753f761943 389 if (retry) {
JimCarver 0:6b753f761943 390 _queue_mode_timer_ongoing = false;
JimCarver 0:6b753f761943 391 if (error_code == M2MInterface::UnregistrationFailed) {
JimCarver 0:6b753f761943 392 _reconnection_state = M2MInterfaceImpl::Unregistration;
JimCarver 0:6b753f761943 393 }
JimCarver 0:6b753f761943 394
JimCarver 0:6b753f761943 395 socket_error(M2MConnectionHandler::SOCKET_SEND_ERROR);
JimCarver 0:6b753f761943 396 } else {
JimCarver 0:6b753f761943 397 _security = NULL;
JimCarver 0:6b753f761943 398 internal_event(STATE_IDLE);
JimCarver 0:6b753f761943 399 if (error_code == M2MInterface::UnregistrationFailed) {
JimCarver 0:6b753f761943 400 set_error_description(ERROR_REASON_24);
JimCarver 0:6b753f761943 401 } else {
JimCarver 0:6b753f761943 402 set_error_description(ERROR_REASON_8);
JimCarver 0:6b753f761943 403 }
JimCarver 0:6b753f761943 404 _observer.error((M2MInterface::Error)error_code);
JimCarver 0:6b753f761943 405 }
JimCarver 0:6b753f761943 406 }
JimCarver 0:6b753f761943 407
JimCarver 0:6b753f761943 408 void M2MInterfaceImpl::client_unregistered()
JimCarver 0:6b753f761943 409 {
JimCarver 0:6b753f761943 410 tr_info("M2MInterfaceImpl::client_unregistered()");
JimCarver 0:6b753f761943 411 _nsdl_interface.set_registration_status(false);
JimCarver 0:6b753f761943 412
JimCarver 0:6b753f761943 413 // Zero the flag otherwise next registered response will start unregistration process
JimCarver 0:6b753f761943 414 _reconnection_state = M2MInterfaceImpl::None;
JimCarver 0:6b753f761943 415
JimCarver 0:6b753f761943 416 internal_event(STATE_UNREGISTERED);
JimCarver 0:6b753f761943 417 //TODO: manage register object in a list.
JimCarver 0:6b753f761943 418 }
JimCarver 0:6b753f761943 419
JimCarver 0:6b753f761943 420 void M2MInterfaceImpl::bootstrap_done()
JimCarver 0:6b753f761943 421 {
JimCarver 0:6b753f761943 422 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 423 tr_info("M2MInterfaceImpl::bootstrap_done");
JimCarver 0:6b753f761943 424 _reconnection_time = _initial_reconnection_time;
JimCarver 0:6b753f761943 425 _reconnecting = false;
JimCarver 0:6b753f761943 426 _reconnection_state = M2MInterfaceImpl::None;
JimCarver 0:6b753f761943 427 _bootstrapped = true;
JimCarver 0:6b753f761943 428
JimCarver 0:6b753f761943 429 if (_registration_flow_timer) {
JimCarver 0:6b753f761943 430 _registration_flow_timer->stop_timer();
JimCarver 0:6b753f761943 431 }
JimCarver 0:6b753f761943 432
JimCarver 0:6b753f761943 433 // Force close connection since either server already closed (sent PEER_CLOSE_NOTIFY)
JimCarver 0:6b753f761943 434 // or bootstrap flow has finished.
JimCarver 0:6b753f761943 435 _connection_handler.force_close();
JimCarver 0:6b753f761943 436
JimCarver 0:6b753f761943 437 if (_bootstrap_finished) {
JimCarver 0:6b753f761943 438 // Inform to observer only if bootstrap has already been finished
JimCarver 0:6b753f761943 439 // This has to be done like this since we might get bootstrap_done
JimCarver 0:6b753f761943 440 // callback BEFORE bootstrap_finish
JimCarver 0:6b753f761943 441 internal_event(STATE_BOOTSTRAPPED);
JimCarver 0:6b753f761943 442 _observer.bootstrap_done(_nsdl_interface.get_security_object());
JimCarver 0:6b753f761943 443 }
JimCarver 0:6b753f761943 444 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 445 }
JimCarver 0:6b753f761943 446
JimCarver 0:6b753f761943 447 void M2MInterfaceImpl::bootstrap_finish()
JimCarver 0:6b753f761943 448 {
JimCarver 0:6b753f761943 449 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 450 tr_info("M2MInterfaceImpl::bootstrap_finish");
JimCarver 0:6b753f761943 451 internal_event(STATE_BOOTSTRAP_WAIT);
JimCarver 0:6b753f761943 452 _observer.bootstrap_data_ready(_nsdl_interface.get_security_object());
JimCarver 0:6b753f761943 453 _bootstrap_finished = true;
JimCarver 0:6b753f761943 454
JimCarver 0:6b753f761943 455 if (_bootstrapped) {
JimCarver 0:6b753f761943 456 // If _bootstrapped is set, we have already received the bootstrap_done
JimCarver 0:6b753f761943 457 // callback so we must inform observer now
JimCarver 0:6b753f761943 458 bootstrap_done();
JimCarver 0:6b753f761943 459 }
JimCarver 0:6b753f761943 460 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 461 }
JimCarver 0:6b753f761943 462
JimCarver 0:6b753f761943 463 void M2MInterfaceImpl::bootstrap_wait()
JimCarver 0:6b753f761943 464 {
JimCarver 0:6b753f761943 465 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 466 tr_info("M2MInterfaceImpl::bootstrap_wait");
JimCarver 0:6b753f761943 467 internal_event(STATE_BOOTSTRAP_WAIT);
JimCarver 0:6b753f761943 468 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 469 }
JimCarver 0:6b753f761943 470
JimCarver 0:6b753f761943 471 void M2MInterfaceImpl::bootstrap_error_wait(const char *reason)
JimCarver 0:6b753f761943 472 {
JimCarver 0:6b753f761943 473 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 474 tr_error("M2MInterfaceImpl::bootstrap_error_wait");
JimCarver 0:6b753f761943 475 set_error_description(reason);
JimCarver 0:6b753f761943 476 internal_event(STATE_BOOTSTRAP_ERROR_WAIT);
JimCarver 0:6b753f761943 477 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 478 }
JimCarver 0:6b753f761943 479
JimCarver 0:6b753f761943 480 void M2MInterfaceImpl::bootstrap_error(const char *reason)
JimCarver 0:6b753f761943 481 {
JimCarver 0:6b753f761943 482 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 483 tr_error("M2MInterfaceImpl::bootstrap_error(%s)", reason);
JimCarver 0:6b753f761943 484 _bootstrapped = false;
JimCarver 0:6b753f761943 485 if (_registration_flow_timer) {
JimCarver 0:6b753f761943 486 _registration_flow_timer->stop_timer();
JimCarver 0:6b753f761943 487 }
JimCarver 0:6b753f761943 488
JimCarver 0:6b753f761943 489 _reconnection_state = M2MInterfaceImpl::None;
JimCarver 0:6b753f761943 490
JimCarver 0:6b753f761943 491 set_error_description(reason);
JimCarver 0:6b753f761943 492
JimCarver 0:6b753f761943 493 _observer.error(M2MInterface::BootstrapFailed);
JimCarver 0:6b753f761943 494
JimCarver 0:6b753f761943 495 internal_event(STATE_IDLE);
JimCarver 0:6b753f761943 496 _reconnecting = true;
JimCarver 0:6b753f761943 497 _connection_handler.stop_listening();
JimCarver 0:6b753f761943 498
JimCarver 0:6b753f761943 499 _retry_timer_expired = false;
JimCarver 0:6b753f761943 500 _retry_timer.start_timer(_reconnection_time * 1000,
JimCarver 0:6b753f761943 501 M2MTimerObserver::RetryTimer);
JimCarver 0:6b753f761943 502 tr_info("M2MInterfaceImpl::bootstrap_error - reconnecting in %" PRIu64 "(s)", _reconnection_time);
JimCarver 0:6b753f761943 503 _reconnection_time = _reconnection_time * RECONNECT_INCREMENT_FACTOR;
JimCarver 0:6b753f761943 504 if(_reconnection_time >= MAX_RECONNECT_TIMEOUT) {
JimCarver 0:6b753f761943 505 _reconnection_time = MAX_RECONNECT_TIMEOUT;
JimCarver 0:6b753f761943 506 }
JimCarver 0:6b753f761943 507 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 508 }
JimCarver 0:6b753f761943 509
JimCarver 0:6b753f761943 510 void M2MInterfaceImpl::coap_data_processed()
JimCarver 0:6b753f761943 511 {
JimCarver 0:6b753f761943 512 tr_debug("M2MInterfaceImpl::coap_data_processed()");
JimCarver 0:6b753f761943 513 internal_event(STATE_COAP_DATA_PROCESSED);
JimCarver 0:6b753f761943 514 }
JimCarver 0:6b753f761943 515
JimCarver 0:6b753f761943 516 void M2MInterfaceImpl::value_updated(M2MBase *base)
JimCarver 0:6b753f761943 517 {
JimCarver 0:6b753f761943 518 tr_debug("M2MInterfaceImpl::value_updated");
JimCarver 0:6b753f761943 519 if(base) {
JimCarver 0:6b753f761943 520 M2MBase::BaseType type = base->base_type();
JimCarver 0:6b753f761943 521 _observer.value_updated(base, type);
JimCarver 0:6b753f761943 522 }
JimCarver 0:6b753f761943 523 }
JimCarver 0:6b753f761943 524
JimCarver 0:6b753f761943 525 void M2MInterfaceImpl::data_available(uint8_t* data,
JimCarver 0:6b753f761943 526 uint16_t data_size,
JimCarver 0:6b753f761943 527 const M2MConnectionObserver::SocketAddress &address)
JimCarver 0:6b753f761943 528 {
JimCarver 0:6b753f761943 529 tr_debug("M2MInterfaceImpl::data_available");
JimCarver 0:6b753f761943 530 ReceivedData event;
JimCarver 0:6b753f761943 531 event._data = data;
JimCarver 0:6b753f761943 532 event._size = data_size;
JimCarver 0:6b753f761943 533 event._address = &address;
JimCarver 0:6b753f761943 534 internal_event(STATE_COAP_DATA_RECEIVED, &event);
JimCarver 0:6b753f761943 535 }
JimCarver 0:6b753f761943 536
JimCarver 0:6b753f761943 537 void M2MInterfaceImpl::socket_error(uint8_t error_code, bool retry)
JimCarver 0:6b753f761943 538 {
JimCarver 0:6b753f761943 539 // Bootstrap completed once PEER CLOSE notify received from the server.
JimCarver 0:6b753f761943 540 if (_current_state == STATE_BOOTSTRAP_WAIT &&
JimCarver 0:6b753f761943 541 error_code == M2MConnectionHandler::SSL_PEER_CLOSED) {
JimCarver 0:6b753f761943 542 _security = NULL;
JimCarver 0:6b753f761943 543 bootstrap_done();
JimCarver 0:6b753f761943 544 return;
JimCarver 0:6b753f761943 545 }
JimCarver 0:6b753f761943 546
JimCarver 0:6b753f761943 547 tr_error("M2MInterfaceImpl::socket_error: (%d), retry (%d), reconnecting (%d), reconnection_state (%d)",
JimCarver 0:6b753f761943 548 error_code, retry, _reconnecting, (int)_reconnection_state);
JimCarver 0:6b753f761943 549
JimCarver 0:6b753f761943 550 // Ignore errors while client is sleeping
JimCarver 0:6b753f761943 551 if (queue_mode()) {
JimCarver 0:6b753f761943 552 if(_callback_handler && _queue_mode_timer_ongoing) {
JimCarver 0:6b753f761943 553 tr_info("M2MInterfaceImpl::socket_error - Queue Mode - don't try to reconnect while in QueueMode");
JimCarver 0:6b753f761943 554 return;
JimCarver 0:6b753f761943 555 }
JimCarver 0:6b753f761943 556 }
JimCarver 0:6b753f761943 557 _queue_sleep_timer.stop_timer();
JimCarver 0:6b753f761943 558
JimCarver 0:6b753f761943 559 if (_registration_flow_timer) {
JimCarver 0:6b753f761943 560 _registration_flow_timer->stop_timer();
JimCarver 0:6b753f761943 561 }
JimCarver 0:6b753f761943 562
JimCarver 0:6b753f761943 563 const char *error_code_des;
JimCarver 0:6b753f761943 564 M2MInterface::Error error = M2MInterface::ErrorNone;
JimCarver 0:6b753f761943 565 switch (error_code) {
JimCarver 0:6b753f761943 566 case M2MConnectionHandler::SSL_CONNECTION_ERROR:
JimCarver 0:6b753f761943 567 error = M2MInterface::SecureConnectionFailed;
JimCarver 0:6b753f761943 568 error_code_des = ERROR_SECURE_CONNECTION;
JimCarver 0:6b753f761943 569 break;
JimCarver 0:6b753f761943 570 case M2MConnectionHandler::DNS_RESOLVING_ERROR:
JimCarver 0:6b753f761943 571 error = M2MInterface::DnsResolvingFailed;
JimCarver 0:6b753f761943 572 error_code_des = ERROR_DNS;
JimCarver 0:6b753f761943 573 break;
JimCarver 0:6b753f761943 574 case M2MConnectionHandler::SOCKET_READ_ERROR:
JimCarver 0:6b753f761943 575 error = M2MInterface::NetworkError;
JimCarver 0:6b753f761943 576 error_code_des = ERROR_NETWORK;
JimCarver 0:6b753f761943 577 break;
JimCarver 0:6b753f761943 578 case M2MConnectionHandler::SOCKET_SEND_ERROR:
JimCarver 0:6b753f761943 579 error = M2MInterface::NetworkError;
JimCarver 0:6b753f761943 580 error_code_des = ERROR_NETWORK;
JimCarver 0:6b753f761943 581 break;
JimCarver 0:6b753f761943 582 case M2MConnectionHandler::SSL_HANDSHAKE_ERROR:
JimCarver 0:6b753f761943 583 error = M2MInterface::SecureConnectionFailed;
JimCarver 0:6b753f761943 584 error_code_des = ERROR_SECURE_CONNECTION;
JimCarver 0:6b753f761943 585 break;
JimCarver 0:6b753f761943 586 case M2MConnectionHandler::SOCKET_ABORT:
JimCarver 0:6b753f761943 587 error = M2MInterface::NetworkError;
JimCarver 0:6b753f761943 588 error_code_des = ERROR_NETWORK;
JimCarver 0:6b753f761943 589 break;
JimCarver 0:6b753f761943 590 default:
JimCarver 0:6b753f761943 591 error_code_des = ERROR_NO;
JimCarver 0:6b753f761943 592 break;
JimCarver 0:6b753f761943 593 }
JimCarver 0:6b753f761943 594
JimCarver 0:6b753f761943 595 internal_event(STATE_IDLE);
JimCarver 0:6b753f761943 596 // Try to do reconnecting
JimCarver 0:6b753f761943 597 if (retry) {
JimCarver 0:6b753f761943 598 _nsdl_interface.set_request_context_to_be_resend();
JimCarver 0:6b753f761943 599 _reconnecting = true;
JimCarver 0:6b753f761943 600 _connection_handler.stop_listening();
JimCarver 0:6b753f761943 601 _retry_timer_expired = false;
JimCarver 0:6b753f761943 602 _retry_timer.start_timer(_reconnection_time * 1000,
JimCarver 0:6b753f761943 603 M2MTimerObserver::RetryTimer);
JimCarver 0:6b753f761943 604 tr_info("M2MInterfaceImpl::socket_error - reconnecting in %" PRIu64 "(s)", _reconnection_time);
JimCarver 0:6b753f761943 605 _reconnection_time = _reconnection_time * RECONNECT_INCREMENT_FACTOR;
JimCarver 0:6b753f761943 606 if(_reconnection_time >= MAX_RECONNECT_TIMEOUT) {
JimCarver 0:6b753f761943 607 _reconnection_time = MAX_RECONNECT_TIMEOUT;
JimCarver 0:6b753f761943 608 }
JimCarver 0:6b753f761943 609 #ifndef DISABLE_ERROR_DESCRIPTION
JimCarver 0:6b753f761943 610 snprintf(_error_description, sizeof(_error_description), ERROR_REASON_9, error_code_des);
JimCarver 0:6b753f761943 611 #endif
JimCarver 0:6b753f761943 612 }
JimCarver 0:6b753f761943 613 // Inform application
JimCarver 0:6b753f761943 614 if (!retry && M2MInterface::ErrorNone != error) {
JimCarver 0:6b753f761943 615 tr_info("M2MInterfaceImpl::socket_error - send error to application");
JimCarver 0:6b753f761943 616 _connection_handler.stop_listening();
JimCarver 0:6b753f761943 617 _retry_timer.stop_timer();
JimCarver 0:6b753f761943 618 _security = NULL;
JimCarver 0:6b753f761943 619 _reconnecting = false;
JimCarver 0:6b753f761943 620 _reconnection_time = _initial_reconnection_time;
JimCarver 0:6b753f761943 621 _reconnection_state = M2MInterfaceImpl::None;
JimCarver 0:6b753f761943 622 #ifndef DISABLE_ERROR_DESCRIPTION
JimCarver 0:6b753f761943 623 snprintf(_error_description, sizeof(_error_description), ERROR_REASON_10, error_code_des);
JimCarver 0:6b753f761943 624 #endif
JimCarver 0:6b753f761943 625 }
JimCarver 0:6b753f761943 626 if(M2MInterface::ErrorNone != error) {
JimCarver 0:6b753f761943 627 _observer.error(error);
JimCarver 0:6b753f761943 628 }
JimCarver 0:6b753f761943 629 }
JimCarver 0:6b753f761943 630
JimCarver 0:6b753f761943 631 void M2MInterfaceImpl::address_ready(const M2MConnectionObserver::SocketAddress &address,
JimCarver 0:6b753f761943 632 M2MConnectionObserver::ServerType server_type,
JimCarver 0:6b753f761943 633 const uint16_t server_port)
JimCarver 0:6b753f761943 634 {
JimCarver 0:6b753f761943 635 tr_debug("M2MInterfaceImpl::address_ready");
JimCarver 0:6b753f761943 636 ResolvedAddressData data;
JimCarver 0:6b753f761943 637 data._address = &address;
JimCarver 0:6b753f761943 638 data._port = server_port;
JimCarver 0:6b753f761943 639 if( M2MConnectionObserver::Bootstrap == server_type) {
JimCarver 0:6b753f761943 640 tr_info("M2MInterfaceImpl::address_ready() Server Type Bootstrap");
JimCarver 0:6b753f761943 641 internal_event(STATE_BOOTSTRAP_ADDRESS_RESOLVED, &data);
JimCarver 0:6b753f761943 642 } else {
JimCarver 0:6b753f761943 643 tr_info("M2MInterfaceImpl::address_ready() Server Type LWM2M");
JimCarver 0:6b753f761943 644 internal_event(STATE_REGISTER_ADDRESS_RESOLVED, &data);
JimCarver 0:6b753f761943 645 }
JimCarver 0:6b753f761943 646 }
JimCarver 0:6b753f761943 647
JimCarver 0:6b753f761943 648 void M2MInterfaceImpl::data_sent()
JimCarver 0:6b753f761943 649 {
JimCarver 0:6b753f761943 650 tr_debug("M2MInterfaceImpl::data_sent()");
JimCarver 0:6b753f761943 651 if(queue_mode()) {
JimCarver 0:6b753f761943 652 if(_callback_handler && (_nsdl_interface.is_unregister_ongoing() == false)) {
JimCarver 0:6b753f761943 653 _queue_sleep_timer.stop_timer();
JimCarver 0:6b753f761943 654 // Multiply by two to get enough time for coap retransmissions.
JimCarver 0:6b753f761943 655 _queue_sleep_timer.start_timer(_nsdl_interface.total_retransmission_time(_nsdl_interface.get_resend_count())*1000,
JimCarver 0:6b753f761943 656 M2MTimerObserver::QueueSleep);
JimCarver 0:6b753f761943 657 }
JimCarver 0:6b753f761943 658 }
JimCarver 0:6b753f761943 659
JimCarver 0:6b753f761943 660 if (_current_state == STATE_BOOTSTRAP_ERROR_WAIT) {
JimCarver 0:6b753f761943 661 // bootstrap_error to be called only after we have sent the last ACK.
JimCarver 0:6b753f761943 662 // Otherwise client will goto reconnection mode before ACK has sent.
JimCarver 0:6b753f761943 663 bootstrap_error(error_description());
JimCarver 0:6b753f761943 664 } else if (_current_state != STATE_BOOTSTRAP_WAIT) {
JimCarver 0:6b753f761943 665 internal_event(STATE_COAP_DATA_SENT);
JimCarver 0:6b753f761943 666 }
JimCarver 0:6b753f761943 667
JimCarver 0:6b753f761943 668 }
JimCarver 0:6b753f761943 669
JimCarver 0:6b753f761943 670 void M2MInterfaceImpl::timer_expired(M2MTimerObserver::Type type)
JimCarver 0:6b753f761943 671 {
JimCarver 0:6b753f761943 672 if (M2MTimerObserver::QueueSleep == type) {
JimCarver 0:6b753f761943 673 if (_reconnecting) {
JimCarver 0:6b753f761943 674 tr_debug("M2MInterfaceImpl::timer_expired() - reconnection ongoing, continue sleep timer");
JimCarver 0:6b753f761943 675 _queue_sleep_timer.start_timer(_nsdl_interface.total_retransmission_time(_nsdl_interface.get_resend_count())*1000,
JimCarver 0:6b753f761943 676 M2MTimerObserver::QueueSleep);
JimCarver 0:6b753f761943 677 } else {
JimCarver 0:6b753f761943 678 tr_debug("M2MInterfaceImpl::timer_expired() - sleep");
JimCarver 0:6b753f761943 679 M2MTimer &timer = _nsdl_interface.get_nsdl_execution_timer();
JimCarver 0:6b753f761943 680 timer.stop_timer();
JimCarver 0:6b753f761943 681 _queue_mode_timer_ongoing = true;
JimCarver 0:6b753f761943 682 if(_callback_handler) {
JimCarver 0:6b753f761943 683 _callback_handler();
JimCarver 0:6b753f761943 684 }
JimCarver 0:6b753f761943 685 }
JimCarver 0:6b753f761943 686 } else if (M2MTimerObserver::RetryTimer == type) {
JimCarver 0:6b753f761943 687 tr_debug("M2MInterfaceImpl::timer_expired() - retry");
JimCarver 0:6b753f761943 688 _retry_timer_expired = true;
JimCarver 0:6b753f761943 689 if (_bootstrapped) {
JimCarver 0:6b753f761943 690 internal_event(STATE_REGISTER);
JimCarver 0:6b753f761943 691 } else {
JimCarver 0:6b753f761943 692 internal_event(STATE_BOOTSTRAP);
JimCarver 0:6b753f761943 693 }
JimCarver 0:6b753f761943 694 } else if (M2MTimerObserver::BootstrapFlowTimer == type) {
JimCarver 0:6b753f761943 695 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 696 tr_debug("M2MInterfaceImpl::timer_expired() - bootstrap");
JimCarver 0:6b753f761943 697 _bootstrapped = false;
JimCarver 0:6b753f761943 698 if (_registration_flow_timer) {
JimCarver 0:6b753f761943 699 _registration_flow_timer->stop_timer();
JimCarver 0:6b753f761943 700 }
JimCarver 0:6b753f761943 701 bootstrap_error(ERROR_REASON_23);
JimCarver 0:6b753f761943 702 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 703 } else if (M2MTimerObserver::RegistrationFlowTimer == type) {
JimCarver 0:6b753f761943 704 tr_debug("M2MInterfaceImpl::timer_expired() - register");
JimCarver 0:6b753f761943 705 registration_error(M2MInterface::Timeout, true);
JimCarver 0:6b753f761943 706 }
JimCarver 0:6b753f761943 707 }
JimCarver 0:6b753f761943 708
JimCarver 0:6b753f761943 709 // state machine sits here.
JimCarver 0:6b753f761943 710 void M2MInterfaceImpl::state_idle(EventData* /*data*/)
JimCarver 0:6b753f761943 711 {
JimCarver 0:6b753f761943 712 tr_debug("M2MInterfaceImpl::state_idle");
JimCarver 0:6b753f761943 713 _nsdl_interface.stop_timers();
JimCarver 0:6b753f761943 714 _nsdl_interface.clear_sent_blockwise_messages();
JimCarver 0:6b753f761943 715 _queue_sleep_timer.stop_timer();
JimCarver 0:6b753f761943 716 }
JimCarver 0:6b753f761943 717
JimCarver 0:6b753f761943 718 void M2MInterfaceImpl::state_bootstrap(EventData *data)
JimCarver 0:6b753f761943 719 {
JimCarver 0:6b753f761943 720 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 721 tr_debug("M2MInterfaceImpl::state_bootstrap");
JimCarver 0:6b753f761943 722 // Start with bootstrapping preparation
JimCarver 0:6b753f761943 723 _bootstrapped = false;
JimCarver 0:6b753f761943 724 _bootstrap_finished = false;
JimCarver 0:6b753f761943 725 _nsdl_interface.set_registration_status(false);
JimCarver 0:6b753f761943 726 M2MSecurityData *event = static_cast<M2MSecurityData *> (data);
JimCarver 0:6b753f761943 727 if(!_security) {
JimCarver 0:6b753f761943 728 M2MInterface::Error error = M2MInterface::InvalidParameters;
JimCarver 0:6b753f761943 729 if (event) {
JimCarver 0:6b753f761943 730 _security = event->_object;
JimCarver 0:6b753f761943 731 if(_security) {
JimCarver 0:6b753f761943 732 int32_t bs_id = _security->get_security_instance_id(M2MSecurity::Bootstrap);
JimCarver 0:6b753f761943 733 tr_info("M2MInterfaceImpl::state_bootstrap - bs_id = %" PRId32 "(s)", bs_id);
JimCarver 0:6b753f761943 734 if(bs_id >= 0) {
JimCarver 0:6b753f761943 735 String server_address = _security->resource_value_string(M2MSecurity::M2MServerUri, bs_id);
JimCarver 0:6b753f761943 736 _nsdl_interface.set_server_address(server_address.c_str());
JimCarver 0:6b753f761943 737 tr_info("M2MInterfaceImpl::state_bootstrap - server_address %s", server_address.c_str());
JimCarver 0:6b753f761943 738 String coap;
JimCarver 0:6b753f761943 739 if(server_address.compare(0,sizeof(COAP)-1,COAP) == 0) {
JimCarver 0:6b753f761943 740 coap = COAP;
JimCarver 0:6b753f761943 741 }
JimCarver 0:6b753f761943 742 else if(server_address.compare(0,sizeof(COAPS)-1,COAPS) == 0) {
JimCarver 0:6b753f761943 743 _security->resource_value_int(M2MSecurity::SecurityMode, bs_id) != M2MSecurity::NoSecurity ? coap = COAPS: coap = "";
JimCarver 0:6b753f761943 744 }
JimCarver 0:6b753f761943 745 if(!coap.empty()) {
JimCarver 0:6b753f761943 746 server_address = server_address.substr(coap.size(),
JimCarver 0:6b753f761943 747 server_address.size()-coap.size());
JimCarver 0:6b753f761943 748
JimCarver 0:6b753f761943 749 process_address(server_address, _server_ip_address, _server_port);
JimCarver 0:6b753f761943 750
JimCarver 0:6b753f761943 751 tr_info("M2MInterfaceImpl::state_bootstrap - IP address %s, Port %d", _server_ip_address.c_str(), _server_port);
JimCarver 0:6b753f761943 752 // If bind and resolving server address succeed then proceed else
JimCarver 0:6b753f761943 753 // return error to the application and go to Idle state.
JimCarver 0:6b753f761943 754 if(!_server_ip_address.empty()) {
JimCarver 0:6b753f761943 755 error = M2MInterface::ErrorNone;
JimCarver 0:6b753f761943 756 if (_registration_flow_timer) {
JimCarver 0:6b753f761943 757 _registration_flow_timer->stop_timer();
JimCarver 0:6b753f761943 758 _registration_flow_timer->start_timer(MBED_CLIENT_RECONNECTION_COUNT * MBED_CLIENT_RECONNECTION_INTERVAL * 8 * 1000,
JimCarver 0:6b753f761943 759 M2MTimerObserver::BootstrapFlowTimer);
JimCarver 0:6b753f761943 760 }
JimCarver 0:6b753f761943 761 _connection_handler.resolve_server_address(_server_ip_address,
JimCarver 0:6b753f761943 762 _server_port,
JimCarver 0:6b753f761943 763 M2MConnectionObserver::Bootstrap,
JimCarver 0:6b753f761943 764 _security);
JimCarver 0:6b753f761943 765 }
JimCarver 0:6b753f761943 766 }
JimCarver 0:6b753f761943 767 }
JimCarver 0:6b753f761943 768 }
JimCarver 0:6b753f761943 769 }
JimCarver 0:6b753f761943 770 if (error != M2MInterface::ErrorNone) {
JimCarver 0:6b753f761943 771 tr_error("M2MInterfaceImpl::state_bootstrap - set error as M2MInterface::InvalidParameters");
JimCarver 0:6b753f761943 772 internal_event(STATE_IDLE);
JimCarver 0:6b753f761943 773 set_error_description(ERROR_REASON_11);
JimCarver 0:6b753f761943 774 _observer.error(error);
JimCarver 0:6b753f761943 775 }
JimCarver 0:6b753f761943 776 } else {
JimCarver 0:6b753f761943 777 _listen_port = 0;
JimCarver 0:6b753f761943 778 _connection_handler.bind_connection(_listen_port);
JimCarver 0:6b753f761943 779 if (_registration_flow_timer) {
JimCarver 0:6b753f761943 780 _registration_flow_timer->stop_timer();
JimCarver 0:6b753f761943 781 _registration_flow_timer->start_timer(MBED_CLIENT_RECONNECTION_COUNT * MBED_CLIENT_RECONNECTION_INTERVAL * 8 * 1000,
JimCarver 0:6b753f761943 782 M2MTimerObserver::BootstrapFlowTimer);
JimCarver 0:6b753f761943 783 }
JimCarver 0:6b753f761943 784 tr_info("M2MInterfaceImpl::state_bootstrap (reconnect) - IP address %s, Port %d", _server_ip_address.c_str(), _server_port);
JimCarver 0:6b753f761943 785 _connection_handler.resolve_server_address(_server_ip_address,
JimCarver 0:6b753f761943 786 _server_port,
JimCarver 0:6b753f761943 787 M2MConnectionObserver::Bootstrap,
JimCarver 0:6b753f761943 788 _security);
JimCarver 0:6b753f761943 789 }
JimCarver 0:6b753f761943 790 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 791 }
JimCarver 0:6b753f761943 792
JimCarver 0:6b753f761943 793 void M2MInterfaceImpl::state_bootstrap_address_resolved( EventData *data)
JimCarver 0:6b753f761943 794 {
JimCarver 0:6b753f761943 795 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 796 tr_debug("M2MInterfaceImpl::state_bootstrap_address_resolved");
JimCarver 0:6b753f761943 797 if (data) {
JimCarver 0:6b753f761943 798 ResolvedAddressData *event = static_cast<ResolvedAddressData *> (data);
JimCarver 0:6b753f761943 799 sn_nsdl_addr_s address;
JimCarver 0:6b753f761943 800
JimCarver 0:6b753f761943 801 M2MInterface::NetworkStack stack = event->_address->_stack;
JimCarver 0:6b753f761943 802
JimCarver 0:6b753f761943 803 if(M2MInterface::LwIP_IPv4 == stack) {
JimCarver 0:6b753f761943 804 tr_info("M2MInterfaceImpl::state_bootstrap_address_resolved : IPv4 address");
JimCarver 0:6b753f761943 805 address.type = SN_NSDL_ADDRESS_TYPE_IPV4;
JimCarver 0:6b753f761943 806 } else if((M2MInterface::LwIP_IPv6 == stack) ||
JimCarver 0:6b753f761943 807 (M2MInterface::Nanostack_IPv6 == stack)) {
JimCarver 0:6b753f761943 808 tr_info("M2MInterfaceImpl::state_bootstrap_address_resolved : IPv6 address");
JimCarver 0:6b753f761943 809 address.type = SN_NSDL_ADDRESS_TYPE_IPV6;
JimCarver 0:6b753f761943 810 }
JimCarver 0:6b753f761943 811 address.port = event->_port;
JimCarver 0:6b753f761943 812 address.addr_ptr = (uint8_t*)event->_address->_address;
JimCarver 0:6b753f761943 813 address.addr_len = event->_address->_length;
JimCarver 0:6b753f761943 814 _connection_handler.start_listening_for_data();
JimCarver 0:6b753f761943 815
JimCarver 0:6b753f761943 816 if(_nsdl_interface.create_bootstrap_resource(&address)) {
JimCarver 0:6b753f761943 817 internal_event(STATE_BOOTSTRAP_RESOURCE_CREATED);
JimCarver 0:6b753f761943 818 } else{
JimCarver 0:6b753f761943 819 // If resource creation fails then inform error to application
JimCarver 0:6b753f761943 820 tr_error("M2MInterfaceImpl::state_bootstrap_address_resolved : M2MInterface::InvalidParameters");
JimCarver 0:6b753f761943 821 internal_event(STATE_IDLE);
JimCarver 0:6b753f761943 822 set_error_description(ERROR_REASON_12);
JimCarver 0:6b753f761943 823 _observer.error(M2MInterface::InvalidParameters);
JimCarver 0:6b753f761943 824 }
JimCarver 0:6b753f761943 825 }
JimCarver 0:6b753f761943 826 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 827 }
JimCarver 0:6b753f761943 828
JimCarver 0:6b753f761943 829 void M2MInterfaceImpl::state_bootstrap_resource_created( EventData */*data*/)
JimCarver 0:6b753f761943 830 {
JimCarver 0:6b753f761943 831 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 832 tr_debug("M2MInterfaceImpl::state_bootstrap_resource_created");
JimCarver 0:6b753f761943 833 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 834 }
JimCarver 0:6b753f761943 835
JimCarver 0:6b753f761943 836 void M2MInterfaceImpl::state_bootstrapped( EventData */*data*/)
JimCarver 0:6b753f761943 837 {
JimCarver 0:6b753f761943 838 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 839 tr_debug("M2MInterfaceImpl::state_bootstrapped");
JimCarver 0:6b753f761943 840 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 841 }
JimCarver 0:6b753f761943 842
JimCarver 0:6b753f761943 843 void M2MInterfaceImpl::state_register(EventData *data)
JimCarver 0:6b753f761943 844 {
JimCarver 0:6b753f761943 845 tr_debug("M2MInterfaceImpl::state_register");
JimCarver 0:6b753f761943 846 _nsdl_interface.set_registration_status(false);
JimCarver 0:6b753f761943 847 M2MRegisterData *event = static_cast<M2MRegisterData *> (data);
JimCarver 0:6b753f761943 848 if (!_security) {
JimCarver 0:6b753f761943 849 M2MInterface::Error error = M2MInterface::InvalidParameters;
JimCarver 0:6b753f761943 850 // Start with registration preparation
JimCarver 0:6b753f761943 851 if(event) {
JimCarver 0:6b753f761943 852 _security = event->_object;
JimCarver 0:6b753f761943 853 if(_security) {
JimCarver 0:6b753f761943 854 int32_t m2m_id = _security->get_security_instance_id(M2MSecurity::M2MServer);
JimCarver 0:6b753f761943 855 if(m2m_id >= 0) {
JimCarver 0:6b753f761943 856 if(_nsdl_interface.create_nsdl_list_structure(event->_base_list)) {
JimCarver 0:6b753f761943 857 // If the nsdl resource structure is created successfully
JimCarver 0:6b753f761943 858 String server_address = _security->resource_value_string(M2MSecurity::M2MServerUri, m2m_id);
JimCarver 0:6b753f761943 859 _nsdl_interface.set_server_address(server_address.c_str());
JimCarver 0:6b753f761943 860 tr_info("M2MInterfaceImpl::state_register - server_address %s", server_address.c_str());
JimCarver 0:6b753f761943 861 String coap;
JimCarver 0:6b753f761943 862 if(server_address.compare(0,sizeof(COAP)-1,COAP) == 0) {
JimCarver 0:6b753f761943 863 coap = COAP;
JimCarver 0:6b753f761943 864 }
JimCarver 0:6b753f761943 865 else if(server_address.compare(0,sizeof(COAPS)-1,COAPS) == 0) {
JimCarver 0:6b753f761943 866 _security->resource_value_int(M2MSecurity::SecurityMode, m2m_id) != M2MSecurity::NoSecurity ? coap = COAPS: coap = "";
JimCarver 0:6b753f761943 867 }
JimCarver 0:6b753f761943 868 if(!coap.empty()) {
JimCarver 0:6b753f761943 869 server_address = server_address.substr(coap.size(),
JimCarver 0:6b753f761943 870 server_address.size() - coap.size());
JimCarver 0:6b753f761943 871 process_address(server_address, _server_ip_address, _server_port);
JimCarver 0:6b753f761943 872
JimCarver 0:6b753f761943 873 tr_info("M2MInterfaceImpl::state_register - IP address %s, Port %d", _server_ip_address.c_str(), _server_port);
JimCarver 0:6b753f761943 874 if(!_server_ip_address.empty()) {
JimCarver 0:6b753f761943 875 // Connection related errors are coming through callback
JimCarver 0:6b753f761943 876 if (_registration_flow_timer) {
JimCarver 0:6b753f761943 877 _registration_flow_timer->stop_timer();
JimCarver 0:6b753f761943 878 _registration_flow_timer->start_timer(MBED_CLIENT_RECONNECTION_COUNT * MBED_CLIENT_RECONNECTION_INTERVAL * 8 * 1000,
JimCarver 0:6b753f761943 879 M2MTimerObserver::RegistrationFlowTimer);
JimCarver 0:6b753f761943 880 }
JimCarver 0:6b753f761943 881 error = M2MInterface::ErrorNone;
JimCarver 0:6b753f761943 882 _connection_handler.resolve_server_address(_server_ip_address,_server_port,
JimCarver 0:6b753f761943 883 M2MConnectionObserver::LWM2MServer,
JimCarver 0:6b753f761943 884 _security);
JimCarver 0:6b753f761943 885 }
JimCarver 0:6b753f761943 886 }
JimCarver 0:6b753f761943 887 } else {
JimCarver 0:6b753f761943 888 tr_error("M2MInterfaceImpl::state_register - fail to create nsdl list structure!");
JimCarver 0:6b753f761943 889 }
JimCarver 0:6b753f761943 890 }
JimCarver 0:6b753f761943 891 }
JimCarver 0:6b753f761943 892 }
JimCarver 0:6b753f761943 893 if (error != M2MInterface::ErrorNone) {
JimCarver 0:6b753f761943 894 tr_error("M2MInterfaceImpl::state_register - set error as M2MInterface::InvalidParameters");
JimCarver 0:6b753f761943 895 internal_event(STATE_IDLE);
JimCarver 0:6b753f761943 896 set_error_description(ERROR_REASON_13);
JimCarver 0:6b753f761943 897 _observer.error(error);
JimCarver 0:6b753f761943 898 }
JimCarver 0:6b753f761943 899 } else {
JimCarver 0:6b753f761943 900 _listen_port = 0;
JimCarver 0:6b753f761943 901 if (event) {
JimCarver 0:6b753f761943 902 _nsdl_interface.create_nsdl_list_structure(event->_base_list);
JimCarver 0:6b753f761943 903 }
JimCarver 0:6b753f761943 904 _connection_handler.bind_connection(_listen_port);
JimCarver 0:6b753f761943 905 if (_registration_flow_timer) {
JimCarver 0:6b753f761943 906 _registration_flow_timer->stop_timer();
JimCarver 0:6b753f761943 907 _registration_flow_timer->start_timer(MBED_CLIENT_RECONNECTION_COUNT * MBED_CLIENT_RECONNECTION_INTERVAL * 8 * 1000,
JimCarver 0:6b753f761943 908 M2MTimerObserver::RegistrationFlowTimer);
JimCarver 0:6b753f761943 909 }
JimCarver 0:6b753f761943 910 tr_info("M2MInterfaceImpl::state_register (reconnect) - IP address %s, Port %d", _server_ip_address.c_str(), _server_port);
JimCarver 0:6b753f761943 911 _connection_handler.resolve_server_address(_server_ip_address,_server_port,
JimCarver 0:6b753f761943 912 M2MConnectionObserver::LWM2MServer,
JimCarver 0:6b753f761943 913 _security);
JimCarver 0:6b753f761943 914 }
JimCarver 0:6b753f761943 915 }
JimCarver 0:6b753f761943 916
JimCarver 0:6b753f761943 917 void M2MInterfaceImpl::process_address(const String& server_address, String& ip_address, uint16_t& port) {
JimCarver 0:6b753f761943 918
JimCarver 0:6b753f761943 919 int colonFound = server_address.find_last_of(':'); //10
JimCarver 0:6b753f761943 920 if(colonFound != -1) {
JimCarver 0:6b753f761943 921 ip_address = server_address.substr(0,colonFound);
JimCarver 0:6b753f761943 922 port = atoi(server_address.substr(colonFound+1,
JimCarver 0:6b753f761943 923 server_address.size()-ip_address.size()).c_str());
JimCarver 0:6b753f761943 924 colonFound = ip_address.find_last_of(']');
JimCarver 0:6b753f761943 925 if(ip_address.compare(0,1,"[") == 0) {
JimCarver 0:6b753f761943 926 if(colonFound == -1) {
JimCarver 0:6b753f761943 927 ip_address.clear();
JimCarver 0:6b753f761943 928 } else {
JimCarver 0:6b753f761943 929 ip_address = ip_address.substr(1,colonFound-1);
JimCarver 0:6b753f761943 930 }
JimCarver 0:6b753f761943 931 } else if(colonFound != -1) {
JimCarver 0:6b753f761943 932 ip_address.clear();
JimCarver 0:6b753f761943 933 }
JimCarver 0:6b753f761943 934 }
JimCarver 0:6b753f761943 935 }
JimCarver 0:6b753f761943 936
JimCarver 0:6b753f761943 937 void M2MInterfaceImpl::state_register_address_resolved( EventData *data)
JimCarver 0:6b753f761943 938 {
JimCarver 0:6b753f761943 939 tr_debug("M2MInterfaceImpl::state_register_address_resolved - reconnect status %d", _reconnection_state);
JimCarver 0:6b753f761943 940 if(data) {
JimCarver 0:6b753f761943 941 ResolvedAddressData *event = static_cast<ResolvedAddressData *> (data);
JimCarver 0:6b753f761943 942
JimCarver 0:6b753f761943 943 sn_nsdl_addr_type_e address_type = SN_NSDL_ADDRESS_TYPE_IPV6;
JimCarver 0:6b753f761943 944
JimCarver 0:6b753f761943 945 M2MInterface::NetworkStack stack = event->_address->_stack;
JimCarver 0:6b753f761943 946
JimCarver 0:6b753f761943 947 if(M2MInterface::LwIP_IPv4 == stack) {
JimCarver 0:6b753f761943 948 tr_info("M2MInterfaceImpl::state_register_address_resolved : IPv4 address");
JimCarver 0:6b753f761943 949 address_type = SN_NSDL_ADDRESS_TYPE_IPV4;
JimCarver 0:6b753f761943 950 } else if((M2MInterface::LwIP_IPv6 == stack) ||
JimCarver 0:6b753f761943 951 (M2MInterface::Nanostack_IPv6 == stack)) {
JimCarver 0:6b753f761943 952 tr_info("M2MInterfaceImpl::state_register_address_resolved : IPv6 address");
JimCarver 0:6b753f761943 953 address_type = SN_NSDL_ADDRESS_TYPE_IPV6;
JimCarver 0:6b753f761943 954 }
JimCarver 0:6b753f761943 955 _connection_handler.start_listening_for_data();
JimCarver 0:6b753f761943 956 _nsdl_interface.set_server_address((uint8_t*)event->_address->_address,event->_address->_length,
JimCarver 0:6b753f761943 957 event->_port, address_type);
JimCarver 0:6b753f761943 958 switch (_reconnection_state) {
JimCarver 0:6b753f761943 959 case M2MInterfaceImpl::None:
JimCarver 0:6b753f761943 960 if (!_nsdl_interface.send_register_message()) {
JimCarver 0:6b753f761943 961 // If resource creation fails then inform error to application
JimCarver 0:6b753f761943 962 tr_error("M2MInterfaceImpl::state_register_address_resolved : M2MInterface::MemoryFail");
JimCarver 0:6b753f761943 963 internal_event(STATE_IDLE);
JimCarver 0:6b753f761943 964 set_error_description(ERROR_REASON_25);
JimCarver 0:6b753f761943 965 _observer.error(M2MInterface::MemoryFail);
JimCarver 0:6b753f761943 966 }
JimCarver 0:6b753f761943 967 break;
JimCarver 0:6b753f761943 968 case M2MInterfaceImpl::Unregistration:
JimCarver 0:6b753f761943 969 case M2MInterfaceImpl::WithUpdate:
JimCarver 0:6b753f761943 970 // Start registration update in case it is reconnection logic because of network issue.
JimCarver 0:6b753f761943 971 internal_event(STATE_UPDATE_REGISTRATION);
JimCarver 0:6b753f761943 972 break;
JimCarver 0:6b753f761943 973 }
JimCarver 0:6b753f761943 974 }
JimCarver 0:6b753f761943 975 }
JimCarver 0:6b753f761943 976
JimCarver 0:6b753f761943 977 void M2MInterfaceImpl::state_registered( EventData */*data*/)
JimCarver 0:6b753f761943 978 {
JimCarver 0:6b753f761943 979 tr_info("M2MInterfaceImpl::state_registered");
JimCarver 0:6b753f761943 980 if (_registration_flow_timer) {
JimCarver 0:6b753f761943 981 _registration_flow_timer->stop_timer();
JimCarver 0:6b753f761943 982 }
JimCarver 0:6b753f761943 983 _reconnection_time = _initial_reconnection_time;
JimCarver 0:6b753f761943 984 _reconnecting = false;
JimCarver 0:6b753f761943 985 _nsdl_interface.set_registration_status(true);
JimCarver 0:6b753f761943 986 // Continue with the unregistration process if it has failed due to connection lost
JimCarver 0:6b753f761943 987 if (_reconnection_state == M2MInterfaceImpl::Unregistration) {
JimCarver 0:6b753f761943 988 internal_event(STATE_UNREGISTER);
JimCarver 0:6b753f761943 989 } else {
JimCarver 0:6b753f761943 990 _reconnection_state = M2MInterfaceImpl::WithUpdate;
JimCarver 0:6b753f761943 991 }
JimCarver 0:6b753f761943 992 }
JimCarver 0:6b753f761943 993
JimCarver 0:6b753f761943 994 void M2MInterfaceImpl::state_update_registration(EventData *data)
JimCarver 0:6b753f761943 995 {
JimCarver 0:6b753f761943 996 tr_debug("M2MInterfaceImpl::state_update_registration");
JimCarver 0:6b753f761943 997 uint32_t lifetime = 0;
JimCarver 0:6b753f761943 998 // Set to false to allow reconnection to work.
JimCarver 0:6b753f761943 999 _queue_mode_timer_ongoing = false;
JimCarver 0:6b753f761943 1000
JimCarver 0:6b753f761943 1001 if (data) {
JimCarver 0:6b753f761943 1002 M2MUpdateRegisterData *event = static_cast<M2MUpdateRegisterData *> (data);
JimCarver 0:6b753f761943 1003 // Create new resources if any
JimCarver 0:6b753f761943 1004 if (!event->_base_list.empty()) {
JimCarver 0:6b753f761943 1005 _nsdl_interface.create_nsdl_list_structure(event->_base_list);
JimCarver 0:6b753f761943 1006 }
JimCarver 0:6b753f761943 1007 lifetime = event->_lifetime;
JimCarver 0:6b753f761943 1008 }
JimCarver 0:6b753f761943 1009
JimCarver 0:6b753f761943 1010 bool success = _nsdl_interface.send_update_registration(lifetime);
JimCarver 0:6b753f761943 1011 if (!success) {
JimCarver 0:6b753f761943 1012 tr_error("M2MInterfaceImpl::state_update_registration : M2MInterface::MemoryFail");
JimCarver 0:6b753f761943 1013 internal_event(STATE_IDLE);
JimCarver 0:6b753f761943 1014 set_error_description(ERROR_REASON_25);
JimCarver 0:6b753f761943 1015 _observer.error(M2MInterface::MemoryFail);
JimCarver 0:6b753f761943 1016 }
JimCarver 0:6b753f761943 1017 }
JimCarver 0:6b753f761943 1018
JimCarver 0:6b753f761943 1019 void M2MInterfaceImpl::state_unregister(EventData */*data*/)
JimCarver 0:6b753f761943 1020 {
JimCarver 0:6b753f761943 1021 tr_debug("M2MInterfaceImpl::state_unregister");
JimCarver 0:6b753f761943 1022 internal_event(STATE_SENDING_COAP_DATA);
JimCarver 0:6b753f761943 1023 if(!_nsdl_interface.send_unregister_message()) {
JimCarver 0:6b753f761943 1024 tr_error("M2MInterfaceImpl::state_unregister : M2MInterface::NotRegistered");
JimCarver 0:6b753f761943 1025 internal_event(STATE_IDLE);
JimCarver 0:6b753f761943 1026 set_error_description(ERROR_REASON_16);
JimCarver 0:6b753f761943 1027 _observer.error(M2MInterface::NotRegistered);
JimCarver 0:6b753f761943 1028 }
JimCarver 0:6b753f761943 1029 }
JimCarver 0:6b753f761943 1030
JimCarver 0:6b753f761943 1031 void M2MInterfaceImpl::state_unregistered( EventData */*data*/)
JimCarver 0:6b753f761943 1032 {
JimCarver 0:6b753f761943 1033 tr_info("M2MInterfaceImpl::state_unregistered");
JimCarver 0:6b753f761943 1034 _reconnection_time = _initial_reconnection_time;
JimCarver 0:6b753f761943 1035 _connection_handler.force_close();
JimCarver 0:6b753f761943 1036 _security = NULL;
JimCarver 0:6b753f761943 1037 _observer.object_unregistered(_register_server);
JimCarver 0:6b753f761943 1038 internal_event(STATE_IDLE);
JimCarver 0:6b753f761943 1039 }
JimCarver 0:6b753f761943 1040
JimCarver 0:6b753f761943 1041 void M2MInterfaceImpl::state_sending_coap_data( EventData */*data*/)
JimCarver 0:6b753f761943 1042 {
JimCarver 0:6b753f761943 1043 tr_debug("M2MInterfaceImpl::state_sending_coap_data");
JimCarver 0:6b753f761943 1044 _nsdl_interface.start_nsdl_execution_timer();
JimCarver 0:6b753f761943 1045 internal_event(STATE_WAITING);
JimCarver 0:6b753f761943 1046 }
JimCarver 0:6b753f761943 1047
JimCarver 0:6b753f761943 1048 void M2MInterfaceImpl::state_coap_data_sent( EventData */*data*/)
JimCarver 0:6b753f761943 1049 {
JimCarver 0:6b753f761943 1050 tr_debug("M2MInterfaceImpl::state_coap_data_sent");
JimCarver 0:6b753f761943 1051 internal_event(STATE_WAITING);
JimCarver 0:6b753f761943 1052 }
JimCarver 0:6b753f761943 1053
JimCarver 0:6b753f761943 1054 void M2MInterfaceImpl::state_coap_data_received(EventData *data)
JimCarver 0:6b753f761943 1055 {
JimCarver 0:6b753f761943 1056 tr_debug("M2MInterfaceImpl::state_coap_data_received");
JimCarver 0:6b753f761943 1057 if(data) {
JimCarver 0:6b753f761943 1058 ReceivedData *event = static_cast<ReceivedData*> (data);
JimCarver 0:6b753f761943 1059 sn_nsdl_addr_s address;
JimCarver 0:6b753f761943 1060
JimCarver 0:6b753f761943 1061 M2MInterface::NetworkStack stack = event->_address->_stack;
JimCarver 0:6b753f761943 1062
JimCarver 0:6b753f761943 1063 if(M2MInterface::LwIP_IPv4 == stack) {
JimCarver 0:6b753f761943 1064 address.type = SN_NSDL_ADDRESS_TYPE_IPV4;
JimCarver 0:6b753f761943 1065 address.addr_len = 4;
JimCarver 0:6b753f761943 1066 } else if((M2MInterface::LwIP_IPv6 == stack) ||
JimCarver 0:6b753f761943 1067 (M2MInterface::Nanostack_IPv6 == stack)) {
JimCarver 0:6b753f761943 1068 address.type = SN_NSDL_ADDRESS_TYPE_IPV6;
JimCarver 0:6b753f761943 1069 address.addr_len = 16;
JimCarver 0:6b753f761943 1070 }
JimCarver 0:6b753f761943 1071 address.port = event->_address->_port;
JimCarver 0:6b753f761943 1072 address.addr_ptr = (uint8_t*)event->_address->_address;
JimCarver 0:6b753f761943 1073 address.addr_len = event->_address->_length;
JimCarver 0:6b753f761943 1074
JimCarver 0:6b753f761943 1075 // Process received data
JimCarver 0:6b753f761943 1076 internal_event(STATE_PROCESSING_COAP_DATA);
JimCarver 0:6b753f761943 1077 if(!_nsdl_interface.process_received_data(event->_data,
JimCarver 0:6b753f761943 1078 event->_size,
JimCarver 0:6b753f761943 1079 &address)) {
JimCarver 0:6b753f761943 1080 tr_error("M2MInterfaceImpl::state_coap_data_received : M2MInterface::ResponseParseFailed");
JimCarver 0:6b753f761943 1081 set_error_description(ERROR_REASON_17);
JimCarver 0:6b753f761943 1082 _observer.error(M2MInterface::ResponseParseFailed);
JimCarver 0:6b753f761943 1083 }
JimCarver 0:6b753f761943 1084 }
JimCarver 0:6b753f761943 1085 }
JimCarver 0:6b753f761943 1086
JimCarver 0:6b753f761943 1087 void M2MInterfaceImpl::state_processing_coap_data( EventData */*data*/)
JimCarver 0:6b753f761943 1088 {
JimCarver 0:6b753f761943 1089 tr_debug("M2MInterfaceImpl::state_processing_coap_data");
JimCarver 0:6b753f761943 1090 internal_event(STATE_WAITING);
JimCarver 0:6b753f761943 1091 }
JimCarver 0:6b753f761943 1092
JimCarver 0:6b753f761943 1093 void M2MInterfaceImpl::state_coap_data_processed( EventData */*data*/)
JimCarver 0:6b753f761943 1094 {
JimCarver 0:6b753f761943 1095 tr_debug("M2MInterfaceImpl::state_coap_data_processed");
JimCarver 0:6b753f761943 1096 internal_event(STATE_WAITING);
JimCarver 0:6b753f761943 1097 }
JimCarver 0:6b753f761943 1098
JimCarver 0:6b753f761943 1099 void M2MInterfaceImpl::state_waiting( EventData */*data*/)
JimCarver 0:6b753f761943 1100 {
JimCarver 0:6b753f761943 1101 tr_debug("M2MInterfaceImpl::state_waiting");
JimCarver 0:6b753f761943 1102 }
JimCarver 0:6b753f761943 1103
JimCarver 0:6b753f761943 1104 // generates an external event. called once per external event
JimCarver 0:6b753f761943 1105 // to start the state machine executing
JimCarver 0:6b753f761943 1106 void M2MInterfaceImpl::external_event(uint8_t new_state,
JimCarver 0:6b753f761943 1107 EventData* p_data)
JimCarver 0:6b753f761943 1108 {
JimCarver 0:6b753f761943 1109 tr_debug("M2MInterfaceImpl::external_event : new state %d", new_state);
JimCarver 0:6b753f761943 1110 // if we are supposed to ignore this event
JimCarver 0:6b753f761943 1111 if (new_state == EVENT_IGNORED) {
JimCarver 0:6b753f761943 1112 tr_debug("M2MInterfaceImpl::external_event : new state is EVENT_IGNORED");
JimCarver 0:6b753f761943 1113 _event_ignored = true;
JimCarver 0:6b753f761943 1114 }
JimCarver 0:6b753f761943 1115 else {
JimCarver 0:6b753f761943 1116 tr_debug("M2MInterfaceImpl::external_event : handle new state");
JimCarver 0:6b753f761943 1117 // generate the event and execute the state engine
JimCarver 0:6b753f761943 1118 internal_event(new_state, p_data);
JimCarver 0:6b753f761943 1119 }
JimCarver 0:6b753f761943 1120 }
JimCarver 0:6b753f761943 1121
JimCarver 0:6b753f761943 1122 // generates an internal event. called from within a state
JimCarver 0:6b753f761943 1123 // function to transition to a new state
JimCarver 0:6b753f761943 1124 void M2MInterfaceImpl::internal_event(uint8_t new_state,
JimCarver 0:6b753f761943 1125 EventData* p_data)
JimCarver 0:6b753f761943 1126 {
JimCarver 0:6b753f761943 1127 tr_debug("M2MInterfaceImpl::internal_event : new state %d", new_state);
JimCarver 0:6b753f761943 1128 _event_data = p_data;
JimCarver 0:6b753f761943 1129 _event_generated = true;
JimCarver 0:6b753f761943 1130 _current_state = new_state;
JimCarver 0:6b753f761943 1131 state_engine();
JimCarver 0:6b753f761943 1132 }
JimCarver 0:6b753f761943 1133
JimCarver 0:6b753f761943 1134 // the state engine executes the state machine states
JimCarver 0:6b753f761943 1135 void M2MInterfaceImpl::state_engine (void)
JimCarver 0:6b753f761943 1136 {
JimCarver 0:6b753f761943 1137 tr_debug("M2MInterfaceImpl::state_engine");
JimCarver 0:6b753f761943 1138 EventData* p_data_temp = NULL;
JimCarver 0:6b753f761943 1139
JimCarver 0:6b753f761943 1140 // while events are being generated keep executing states
JimCarver 0:6b753f761943 1141 while (_event_generated) {
JimCarver 0:6b753f761943 1142 p_data_temp = _event_data; // copy of event data pointer
JimCarver 0:6b753f761943 1143 _event_data = NULL; // event data used up, reset ptr
JimCarver 0:6b753f761943 1144 _event_generated = false; // event used up, reset flag
JimCarver 0:6b753f761943 1145
JimCarver 0:6b753f761943 1146 assert(_current_state < _max_states);
JimCarver 0:6b753f761943 1147
JimCarver 0:6b753f761943 1148 state_function( _current_state, p_data_temp );
JimCarver 0:6b753f761943 1149 }
JimCarver 0:6b753f761943 1150 }
JimCarver 0:6b753f761943 1151
JimCarver 0:6b753f761943 1152 void M2MInterfaceImpl::state_function( uint8_t current_state, EventData* data )
JimCarver 0:6b753f761943 1153 {
JimCarver 0:6b753f761943 1154 switch( current_state ) {
JimCarver 0:6b753f761943 1155 case STATE_IDLE:
JimCarver 0:6b753f761943 1156 M2MInterfaceImpl::state_idle(data);
JimCarver 0:6b753f761943 1157 break;
JimCarver 0:6b753f761943 1158 case STATE_BOOTSTRAP:
JimCarver 0:6b753f761943 1159 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 1160 M2MInterfaceImpl::state_bootstrap(data);
JimCarver 0:6b753f761943 1161 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 1162 break;
JimCarver 0:6b753f761943 1163 case STATE_BOOTSTRAP_ADDRESS_RESOLVED:
JimCarver 0:6b753f761943 1164 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 1165 M2MInterfaceImpl::state_bootstrap_address_resolved(data);
JimCarver 0:6b753f761943 1166 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 1167 break;
JimCarver 0:6b753f761943 1168 case STATE_BOOTSTRAP_RESOURCE_CREATED:
JimCarver 0:6b753f761943 1169 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 1170 M2MInterfaceImpl::state_bootstrap_resource_created(data);
JimCarver 0:6b753f761943 1171 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 1172 break;
JimCarver 0:6b753f761943 1173 case STATE_BOOTSTRAP_WAIT:
JimCarver 0:6b753f761943 1174 case STATE_BOOTSTRAP_ERROR_WAIT:
JimCarver 0:6b753f761943 1175 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 1176 // Do nothing, we're just waiting for data_sent callback
JimCarver 0:6b753f761943 1177 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 1178 break;
JimCarver 0:6b753f761943 1179 case STATE_BOOTSTRAPPED:
JimCarver 0:6b753f761943 1180 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 1181 M2MInterfaceImpl::state_bootstrapped(data);
JimCarver 0:6b753f761943 1182 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
JimCarver 0:6b753f761943 1183 break;
JimCarver 0:6b753f761943 1184 case STATE_REGISTER:
JimCarver 0:6b753f761943 1185 M2MInterfaceImpl::state_register(data);
JimCarver 0:6b753f761943 1186 break;
JimCarver 0:6b753f761943 1187 case STATE_REGISTER_ADDRESS_RESOLVED:
JimCarver 0:6b753f761943 1188 M2MInterfaceImpl::state_register_address_resolved(data);
JimCarver 0:6b753f761943 1189 break;
JimCarver 0:6b753f761943 1190 case STATE_REGISTERED:
JimCarver 0:6b753f761943 1191 M2MInterfaceImpl::state_registered(data);
JimCarver 0:6b753f761943 1192 break;
JimCarver 0:6b753f761943 1193 case STATE_UPDATE_REGISTRATION:
JimCarver 0:6b753f761943 1194 M2MInterfaceImpl::state_update_registration(data);
JimCarver 0:6b753f761943 1195 break;
JimCarver 0:6b753f761943 1196 case STATE_UNREGISTER:
JimCarver 0:6b753f761943 1197 M2MInterfaceImpl::state_unregister(data);
JimCarver 0:6b753f761943 1198 break;
JimCarver 0:6b753f761943 1199 case STATE_UNREGISTERED:
JimCarver 0:6b753f761943 1200 M2MInterfaceImpl::state_unregistered(data);
JimCarver 0:6b753f761943 1201 break;
JimCarver 0:6b753f761943 1202 case STATE_SENDING_COAP_DATA:
JimCarver 0:6b753f761943 1203 M2MInterfaceImpl::state_sending_coap_data(data);
JimCarver 0:6b753f761943 1204 break;
JimCarver 0:6b753f761943 1205 case STATE_COAP_DATA_SENT:
JimCarver 0:6b753f761943 1206 M2MInterfaceImpl::state_coap_data_sent(data);
JimCarver 0:6b753f761943 1207 break;
JimCarver 0:6b753f761943 1208 case STATE_COAP_DATA_RECEIVED:
JimCarver 0:6b753f761943 1209 M2MInterfaceImpl::state_coap_data_received(data);
JimCarver 0:6b753f761943 1210 break;
JimCarver 0:6b753f761943 1211 case STATE_PROCESSING_COAP_DATA:
JimCarver 0:6b753f761943 1212 M2MInterfaceImpl::state_processing_coap_data(data);
JimCarver 0:6b753f761943 1213 break;
JimCarver 0:6b753f761943 1214 case STATE_COAP_DATA_PROCESSED:
JimCarver 0:6b753f761943 1215 M2MInterfaceImpl::state_coap_data_processed(data);
JimCarver 0:6b753f761943 1216 break;
JimCarver 0:6b753f761943 1217 case STATE_WAITING:
JimCarver 0:6b753f761943 1218 M2MInterfaceImpl::state_waiting(data);
JimCarver 0:6b753f761943 1219 break;
JimCarver 0:6b753f761943 1220 }
JimCarver 0:6b753f761943 1221 }
JimCarver 0:6b753f761943 1222
JimCarver 0:6b753f761943 1223 void M2MInterfaceImpl::start_register_update(M2MUpdateRegisterData *data) {
JimCarver 0:6b753f761943 1224 tr_debug("M2MInterfaceImpl::start_register_update()");
JimCarver 0:6b753f761943 1225 if(!data || (data->_lifetime != 0 && (data->_lifetime < MINIMUM_REGISTRATION_TIME))) {
JimCarver 0:6b753f761943 1226 set_error_description(ERROR_REASON_18);
JimCarver 0:6b753f761943 1227 _observer.error(M2MInterface::InvalidParameters);
JimCarver 0:6b753f761943 1228 }
JimCarver 0:6b753f761943 1229
JimCarver 0:6b753f761943 1230 if (_reconnecting) {
JimCarver 0:6b753f761943 1231 //If client is in reconnection mode, ignore this call, state machine will reconnect on its own.
JimCarver 0:6b753f761943 1232 return;
JimCarver 0:6b753f761943 1233 } else if (_nsdl_interface.is_update_register_ongoing()) {
JimCarver 0:6b753f761943 1234 set_error_description(ERROR_REASON_27);
JimCarver 0:6b753f761943 1235 _observer.error(M2MInterface::NotAllowed);
JimCarver 0:6b753f761943 1236 return;
JimCarver 0:6b753f761943 1237 }
JimCarver 0:6b753f761943 1238
JimCarver 0:6b753f761943 1239 _reconnection_state = M2MInterfaceImpl::WithUpdate;
JimCarver 0:6b753f761943 1240 BEGIN_TRANSITION_MAP // - Current State -
JimCarver 0:6b753f761943 1241 TRANSITION_MAP_ENTRY (STATE_REGISTER) // state_idle
JimCarver 0:6b753f761943 1242 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap
JimCarver 0:6b753f761943 1243 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state__bootstrap_address_resolved
JimCarver 0:6b753f761943 1244 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_resource_created
JimCarver 0:6b753f761943 1245 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_wait
JimCarver 0:6b753f761943 1246 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_error_wait
JimCarver 0:6b753f761943 1247 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrapped
JimCarver 0:6b753f761943 1248 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register
JimCarver 0:6b753f761943 1249 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_address_resolved
JimCarver 0:6b753f761943 1250 TRANSITION_MAP_ENTRY (STATE_UPDATE_REGISTRATION) // state_registered
JimCarver 0:6b753f761943 1251 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_update_registration
JimCarver 0:6b753f761943 1252 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregister
JimCarver 0:6b753f761943 1253 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregistered
JimCarver 0:6b753f761943 1254 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_sending_coap_data
JimCarver 0:6b753f761943 1255 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_sent
JimCarver 0:6b753f761943 1256 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_received
JimCarver 0:6b753f761943 1257 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_processing_coap_data
JimCarver 0:6b753f761943 1258 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_processed
JimCarver 0:6b753f761943 1259 TRANSITION_MAP_ENTRY (STATE_UPDATE_REGISTRATION) // state_waiting
JimCarver 0:6b753f761943 1260 END_TRANSITION_MAP(data)
JimCarver 0:6b753f761943 1261 if(_event_ignored) {
JimCarver 0:6b753f761943 1262 _event_ignored = false;
JimCarver 0:6b753f761943 1263 if (!_reconnecting) {
JimCarver 0:6b753f761943 1264 set_error_description(ERROR_REASON_19);
JimCarver 0:6b753f761943 1265 _observer.error(M2MInterface::NotAllowed);
JimCarver 0:6b753f761943 1266 }
JimCarver 0:6b753f761943 1267 }
JimCarver 0:6b753f761943 1268 }
JimCarver 0:6b753f761943 1269
JimCarver 0:6b753f761943 1270 bool M2MInterfaceImpl::remove_object(M2MBase *object)
JimCarver 0:6b753f761943 1271 {
JimCarver 0:6b753f761943 1272 return _nsdl_interface.remove_object_from_list(object);
JimCarver 0:6b753f761943 1273 }
JimCarver 0:6b753f761943 1274
JimCarver 0:6b753f761943 1275 void M2MInterfaceImpl::update_endpoint(String &name) {
JimCarver 0:6b753f761943 1276 _nsdl_interface.update_endpoint(name);
JimCarver 0:6b753f761943 1277 }
JimCarver 0:6b753f761943 1278
JimCarver 0:6b753f761943 1279 void M2MInterfaceImpl::update_domain(String &domain)
JimCarver 0:6b753f761943 1280 {
JimCarver 0:6b753f761943 1281 _nsdl_interface.update_domain(domain);
JimCarver 0:6b753f761943 1282 }
JimCarver 0:6b753f761943 1283
JimCarver 0:6b753f761943 1284 const String M2MInterfaceImpl::internal_endpoint_name() const
JimCarver 0:6b753f761943 1285 {
JimCarver 0:6b753f761943 1286 return _nsdl_interface.internal_endpoint_name();
JimCarver 0:6b753f761943 1287 }
JimCarver 0:6b753f761943 1288
JimCarver 0:6b753f761943 1289 const char *M2MInterfaceImpl::error_description() const
JimCarver 0:6b753f761943 1290 {
JimCarver 0:6b753f761943 1291 #ifndef DISABLE_ERROR_DESCRIPTION
JimCarver 0:6b753f761943 1292 return _error_description;
JimCarver 0:6b753f761943 1293 #else
JimCarver 0:6b753f761943 1294 return "";
JimCarver 0:6b753f761943 1295 #endif
JimCarver 0:6b753f761943 1296 }
JimCarver 0:6b753f761943 1297
JimCarver 0:6b753f761943 1298 void M2MInterfaceImpl::set_error_description(const char *description)
JimCarver 0:6b753f761943 1299 {
JimCarver 0:6b753f761943 1300 #ifndef DISABLE_ERROR_DESCRIPTION
JimCarver 0:6b753f761943 1301 if (strncmp(_error_description, description, sizeof(_error_description)) != 0) {
JimCarver 0:6b753f761943 1302 strncpy(_error_description, description, MAX_ALLOWED_ERROR_STRING_LENGTH - 1);
JimCarver 0:6b753f761943 1303 }
JimCarver 0:6b753f761943 1304 #endif
JimCarver 0:6b753f761943 1305 }
JimCarver 0:6b753f761943 1306
JimCarver 0:6b753f761943 1307 bool M2MInterfaceImpl::queue_mode() const
JimCarver 0:6b753f761943 1308 {
JimCarver 0:6b753f761943 1309 return (_binding_mode == M2MInterface::UDP_QUEUE ||
JimCarver 0:6b753f761943 1310 _binding_mode == M2MInterface::TCP_QUEUE ||
JimCarver 0:6b753f761943 1311 _binding_mode == M2MInterface::SMS_QUEUE ||
JimCarver 0:6b753f761943 1312 _binding_mode == M2MInterface::UDP_SMS_QUEUE);
JimCarver 0:6b753f761943 1313 }
JimCarver 0:6b753f761943 1314
JimCarver 0:6b753f761943 1315 void M2MInterfaceImpl::get_data_request(const char *uri,
JimCarver 0:6b753f761943 1316 const size_t offset,
JimCarver 0:6b753f761943 1317 const bool async,
JimCarver 0:6b753f761943 1318 get_data_cb data_cb,
JimCarver 0:6b753f761943 1319 get_data_error_cb error_cb,
JimCarver 0:6b753f761943 1320 void *context)
JimCarver 0:6b753f761943 1321 {
JimCarver 0:6b753f761943 1322 get_data_req_error_e error = FAILED_TO_SEND_MSG;
JimCarver 0:6b753f761943 1323 if (uri) {
JimCarver 0:6b753f761943 1324 _nsdl_interface.send_request(uri, COAP_MSG_CODE_REQUEST_GET, offset, async, 0, NULL, data_cb, error_cb, context);
JimCarver 0:6b753f761943 1325 } else {
JimCarver 0:6b753f761943 1326 error_cb(error, context);
JimCarver 0:6b753f761943 1327 }
JimCarver 0:6b753f761943 1328 }
JimCarver 0:6b753f761943 1329
JimCarver 0:6b753f761943 1330 void M2MInterfaceImpl::post_data_request(const char *uri,
JimCarver 0:6b753f761943 1331 const bool async,
JimCarver 0:6b753f761943 1332 const uint16_t payload_len,
JimCarver 0:6b753f761943 1333 uint8_t *payload_ptr,
JimCarver 0:6b753f761943 1334 get_data_cb data_cb,
JimCarver 0:6b753f761943 1335 get_data_error_cb error_cb,
JimCarver 0:6b753f761943 1336 void *context)
JimCarver 0:6b753f761943 1337 {
JimCarver 0:6b753f761943 1338 get_data_req_error_e error = FAILED_TO_SEND_MSG;
JimCarver 0:6b753f761943 1339 if (uri) {
JimCarver 0:6b753f761943 1340 _nsdl_interface.send_request(uri, COAP_MSG_CODE_REQUEST_POST, 0, async, payload_len, payload_ptr, data_cb, error_cb, context);
JimCarver 0:6b753f761943 1341 } else {
JimCarver 0:6b753f761943 1342 error_cb(error, context);
JimCarver 0:6b753f761943 1343 }
JimCarver 0:6b753f761943 1344 }
JimCarver 0:6b753f761943 1345
JimCarver 0:6b753f761943 1346 bool M2MInterfaceImpl::set_uri_query_parameters(const char *uri_query_params)
JimCarver 0:6b753f761943 1347 {
JimCarver 0:6b753f761943 1348 return _nsdl_interface.set_uri_query_parameters(uri_query_params);
JimCarver 0:6b753f761943 1349 }