Pfp Cybersecurity (Aka Power Fingerprinting, Inc.) / Mbed OS pfp-emon-nxp

Dependencies:   FXAS21002 FXOS8700Q

Committer:
vithyat
Date:
Fri Mar 20 20:15:18 2020 +0000
Revision:
2:990c985a69ae
Parent:
0:977e87915078
Update to work with P2Scan runtime

Who changed what in which revision?

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