Donald Meyers / Mbed OS evan
Committer:
djmeyers
Date:
Sat Mar 18 22:37:16 2017 +0000
Revision:
0:06ee5f8a484a
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
djmeyers 0:06ee5f8a484a 1 /*
djmeyers 0:06ee5f8a484a 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
djmeyers 0:06ee5f8a484a 3 * SPDX-License-Identifier: Apache-2.0
djmeyers 0:06ee5f8a484a 4 * Licensed under the Apache License, Version 2.0 (the License); you may
djmeyers 0:06ee5f8a484a 5 * not use this file except in compliance with the License.
djmeyers 0:06ee5f8a484a 6 * You may obtain a copy of the License at
djmeyers 0:06ee5f8a484a 7 *
djmeyers 0:06ee5f8a484a 8 * http://www.apache.org/licenses/LICENSE-2.0
djmeyers 0:06ee5f8a484a 9 *
djmeyers 0:06ee5f8a484a 10 * Unless required by applicable law or agreed to in writing, software
djmeyers 0:06ee5f8a484a 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
djmeyers 0:06ee5f8a484a 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
djmeyers 0:06ee5f8a484a 13 * See the License for the specific language governing permissions and
djmeyers 0:06ee5f8a484a 14 * limitations under the License.
djmeyers 0:06ee5f8a484a 15 */
djmeyers 0:06ee5f8a484a 16 #include <assert.h>
djmeyers 0:06ee5f8a484a 17 #include <stdlib.h>
djmeyers 0:06ee5f8a484a 18 #include "include/m2minterfaceimpl.h"
djmeyers 0:06ee5f8a484a 19 #include "include/eventdata.h"
djmeyers 0:06ee5f8a484a 20 #include "mbed-client/m2minterfaceobserver.h"
djmeyers 0:06ee5f8a484a 21 #include "mbed-client/m2mconnectionhandler.h"
djmeyers 0:06ee5f8a484a 22 #include "mbed-client/m2mconnectionsecurity.h"
djmeyers 0:06ee5f8a484a 23 #include "include/m2mnsdlinterface.h"
djmeyers 0:06ee5f8a484a 24 #include "include/nsdlaccesshelper.h"
djmeyers 0:06ee5f8a484a 25 #include "mbed-client/m2msecurity.h"
djmeyers 0:06ee5f8a484a 26 #include "mbed-client/m2mconstants.h"
djmeyers 0:06ee5f8a484a 27 #include "mbed-client/m2mtimer.h"
djmeyers 0:06ee5f8a484a 28 #include "mbed-trace/mbed_trace.h"
djmeyers 0:06ee5f8a484a 29
djmeyers 0:06ee5f8a484a 30 #include <stdlib.h>
djmeyers 0:06ee5f8a484a 31
djmeyers 0:06ee5f8a484a 32 #define TRACE_GROUP "mClt"
djmeyers 0:06ee5f8a484a 33
djmeyers 0:06ee5f8a484a 34 #define RESOLVE_SEC_MODE(mode) ((mode == M2MInterface::TCP || mode == M2MInterface::TCP_QUEUE) ? M2MConnectionSecurity::TLS : M2MConnectionSecurity::DTLS)
djmeyers 0:06ee5f8a484a 35
djmeyers 0:06ee5f8a484a 36 M2MInterfaceImpl::M2MInterfaceImpl(M2MInterfaceObserver& observer,
djmeyers 0:06ee5f8a484a 37 const String &ep_name,
djmeyers 0:06ee5f8a484a 38 const String &ep_type,
djmeyers 0:06ee5f8a484a 39 const int32_t l_time,
djmeyers 0:06ee5f8a484a 40 const uint16_t listen_port,
djmeyers 0:06ee5f8a484a 41 const String &dmn,
djmeyers 0:06ee5f8a484a 42 M2MInterface::BindingMode mode,
djmeyers 0:06ee5f8a484a 43 M2MInterface::NetworkStack stack,
djmeyers 0:06ee5f8a484a 44 const String &con_addr)
djmeyers 0:06ee5f8a484a 45 : _event_data(NULL),
djmeyers 0:06ee5f8a484a 46 _bootstrap_timer(NULL),
djmeyers 0:06ee5f8a484a 47 _server_port(0),
djmeyers 0:06ee5f8a484a 48 _listen_port(listen_port),
djmeyers 0:06ee5f8a484a 49 _endpoint_type(ep_type),
djmeyers 0:06ee5f8a484a 50 _domain( dmn),
djmeyers 0:06ee5f8a484a 51 _life_time(l_time),
djmeyers 0:06ee5f8a484a 52 _context_address(con_addr),
djmeyers 0:06ee5f8a484a 53 _register_server(NULL),
djmeyers 0:06ee5f8a484a 54 _queue_sleep_timer(*this),
djmeyers 0:06ee5f8a484a 55 _retry_timer(*this),
djmeyers 0:06ee5f8a484a 56 _callback_handler(NULL),
djmeyers 0:06ee5f8a484a 57 _max_states( STATE_MAX_STATES ),
djmeyers 0:06ee5f8a484a 58 _event_ignored(false),
djmeyers 0:06ee5f8a484a 59 _event_generated(false),
djmeyers 0:06ee5f8a484a 60 _reconnecting(false),
djmeyers 0:06ee5f8a484a 61 _retry_timer_expired(false),
djmeyers 0:06ee5f8a484a 62 _bootstrapped(true), // True as default to get it working with connector only configuration
djmeyers 0:06ee5f8a484a 63 _current_state(0),
djmeyers 0:06ee5f8a484a 64 _retry_count(0),
djmeyers 0:06ee5f8a484a 65 _binding_mode(mode),
djmeyers 0:06ee5f8a484a 66 _observer(observer),
djmeyers 0:06ee5f8a484a 67 _security_connection( new M2MConnectionSecurity( RESOLVE_SEC_MODE(mode) )),
djmeyers 0:06ee5f8a484a 68 _connection_handler(*this, _security_connection, mode, stack),
djmeyers 0:06ee5f8a484a 69 _nsdl_interface(*this),
djmeyers 0:06ee5f8a484a 70 _security(NULL)
djmeyers 0:06ee5f8a484a 71 {
djmeyers 0:06ee5f8a484a 72 tr_debug("M2MInterfaceImpl::M2MInterfaceImpl() -IN");
djmeyers 0:06ee5f8a484a 73 _nsdl_interface.create_endpoint(ep_name,
djmeyers 0:06ee5f8a484a 74 _endpoint_type,
djmeyers 0:06ee5f8a484a 75 _life_time,
djmeyers 0:06ee5f8a484a 76 _domain,
djmeyers 0:06ee5f8a484a 77 (uint8_t)_binding_mode & 0x07, // nsdl binding mode is only 3 least significant bits
djmeyers 0:06ee5f8a484a 78 _context_address);
djmeyers 0:06ee5f8a484a 79
djmeyers 0:06ee5f8a484a 80 //Here we must use TCP still
djmeyers 0:06ee5f8a484a 81 __connection_handler = &_connection_handler;
djmeyers 0:06ee5f8a484a 82 _connection_handler.bind_connection(_listen_port);
djmeyers 0:06ee5f8a484a 83 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 84 _bootstrap_timer = new M2MTimer(*this);
djmeyers 0:06ee5f8a484a 85 #endif
djmeyers 0:06ee5f8a484a 86 tr_debug("M2MInterfaceImpl::M2MInterfaceImpl() -OUT");
djmeyers 0:06ee5f8a484a 87 }
djmeyers 0:06ee5f8a484a 88
djmeyers 0:06ee5f8a484a 89
djmeyers 0:06ee5f8a484a 90 M2MInterfaceImpl::~M2MInterfaceImpl()
djmeyers 0:06ee5f8a484a 91 {
djmeyers 0:06ee5f8a484a 92 tr_debug("M2MInterfaceImpl::~M2MInterfaceImpl() - IN");
djmeyers 0:06ee5f8a484a 93 _connection_handler.stop_listening();
djmeyers 0:06ee5f8a484a 94 delete _bootstrap_timer;
djmeyers 0:06ee5f8a484a 95 _security_connection = NULL;
djmeyers 0:06ee5f8a484a 96 tr_debug("M2MInterfaceImpl::~M2MInterfaceImpl() - OUT");
djmeyers 0:06ee5f8a484a 97 }
djmeyers 0:06ee5f8a484a 98
djmeyers 0:06ee5f8a484a 99 void M2MInterfaceImpl::bootstrap(M2MSecurity *security)
djmeyers 0:06ee5f8a484a 100 {
djmeyers 0:06ee5f8a484a 101 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 102 tr_debug("M2MInterfaceImpl::bootstrap(M2MSecurity *security) - IN");
djmeyers 0:06ee5f8a484a 103 if(!security) {
djmeyers 0:06ee5f8a484a 104 _observer.error(M2MInterface::InvalidParameters);
djmeyers 0:06ee5f8a484a 105 return;
djmeyers 0:06ee5f8a484a 106 }
djmeyers 0:06ee5f8a484a 107 // Transition to a new state based upon
djmeyers 0:06ee5f8a484a 108 // the current state of the state machine
djmeyers 0:06ee5f8a484a 109 M2MSecurityData* data = new M2MSecurityData();
djmeyers 0:06ee5f8a484a 110 data->_object = security;
djmeyers 0:06ee5f8a484a 111 BEGIN_TRANSITION_MAP // - Current State -
djmeyers 0:06ee5f8a484a 112 TRANSITION_MAP_ENTRY (STATE_BOOTSTRAP) // state_idle
djmeyers 0:06ee5f8a484a 113 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap
djmeyers 0:06ee5f8a484a 114 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state__bootstrap_address_resolved
djmeyers 0:06ee5f8a484a 115 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_resource_created
djmeyers 0:06ee5f8a484a 116 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_wait
djmeyers 0:06ee5f8a484a 117 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrapped
djmeyers 0:06ee5f8a484a 118 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register
djmeyers 0:06ee5f8a484a 119 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_address_resolved
djmeyers 0:06ee5f8a484a 120 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_registered
djmeyers 0:06ee5f8a484a 121 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_update_registration
djmeyers 0:06ee5f8a484a 122 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregister
djmeyers 0:06ee5f8a484a 123 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregistered
djmeyers 0:06ee5f8a484a 124 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_sending_coap_data
djmeyers 0:06ee5f8a484a 125 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_sent
djmeyers 0:06ee5f8a484a 126 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_received
djmeyers 0:06ee5f8a484a 127 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_processing_coap_data
djmeyers 0:06ee5f8a484a 128 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_processed
djmeyers 0:06ee5f8a484a 129 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_waiting
djmeyers 0:06ee5f8a484a 130 END_TRANSITION_MAP(data)
djmeyers 0:06ee5f8a484a 131 if(_event_ignored) {
djmeyers 0:06ee5f8a484a 132 _event_ignored = false;
djmeyers 0:06ee5f8a484a 133 _observer.error(M2MInterface::NotAllowed);
djmeyers 0:06ee5f8a484a 134 }
djmeyers 0:06ee5f8a484a 135 tr_debug("M2MInterfaceImpl::bootstrap(M2MSecurity *security) - OUT");
djmeyers 0:06ee5f8a484a 136 #else
djmeyers 0:06ee5f8a484a 137 _observer.error(M2MInterface::NotAllowed);
djmeyers 0:06ee5f8a484a 138 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 139 }
djmeyers 0:06ee5f8a484a 140
djmeyers 0:06ee5f8a484a 141 void M2MInterfaceImpl::cancel_bootstrap()
djmeyers 0:06ee5f8a484a 142 {
djmeyers 0:06ee5f8a484a 143 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 144 //TODO: Do we need this ?
djmeyers 0:06ee5f8a484a 145 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 146 }
djmeyers 0:06ee5f8a484a 147
djmeyers 0:06ee5f8a484a 148 void M2MInterfaceImpl::register_object(M2MSecurity *security, const M2MObjectList &object_list)
djmeyers 0:06ee5f8a484a 149 {
djmeyers 0:06ee5f8a484a 150 tr_debug("M2MInterfaceImpl::register_object - IN");
djmeyers 0:06ee5f8a484a 151 if(!security) {
djmeyers 0:06ee5f8a484a 152 _observer.error(M2MInterface::InvalidParameters);
djmeyers 0:06ee5f8a484a 153 return;
djmeyers 0:06ee5f8a484a 154 }
djmeyers 0:06ee5f8a484a 155 // Transition to a new state based upon
djmeyers 0:06ee5f8a484a 156 // the current state of the state machine
djmeyers 0:06ee5f8a484a 157 //TODO: manage register object in a list.
djmeyers 0:06ee5f8a484a 158 _register_server = security;
djmeyers 0:06ee5f8a484a 159 M2MRegisterData *data = new M2MRegisterData();
djmeyers 0:06ee5f8a484a 160 data->_object = security;
djmeyers 0:06ee5f8a484a 161 data->_object_list = object_list;
djmeyers 0:06ee5f8a484a 162 BEGIN_TRANSITION_MAP // - Current State -
djmeyers 0:06ee5f8a484a 163 TRANSITION_MAP_ENTRY (STATE_REGISTER) // state_idle
djmeyers 0:06ee5f8a484a 164 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap
djmeyers 0:06ee5f8a484a 165 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state__bootstrap_address_resolved
djmeyers 0:06ee5f8a484a 166 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_resource_created
djmeyers 0:06ee5f8a484a 167 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_wait
djmeyers 0:06ee5f8a484a 168 TRANSITION_MAP_ENTRY (STATE_REGISTER) // state_bootstrapped
djmeyers 0:06ee5f8a484a 169 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register
djmeyers 0:06ee5f8a484a 170 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_address_resolved
djmeyers 0:06ee5f8a484a 171 TRANSITION_MAP_ENTRY (STATE_REGISTER) // state_registered
djmeyers 0:06ee5f8a484a 172 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_update_registration
djmeyers 0:06ee5f8a484a 173 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregister
djmeyers 0:06ee5f8a484a 174 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregistered
djmeyers 0:06ee5f8a484a 175 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_sending_coap_data
djmeyers 0:06ee5f8a484a 176 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_sent
djmeyers 0:06ee5f8a484a 177 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_received
djmeyers 0:06ee5f8a484a 178 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_processing_coap_data
djmeyers 0:06ee5f8a484a 179 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_processed
djmeyers 0:06ee5f8a484a 180 TRANSITION_MAP_ENTRY (STATE_REGISTER) // state_waiting
djmeyers 0:06ee5f8a484a 181 END_TRANSITION_MAP(data)
djmeyers 0:06ee5f8a484a 182 if(_event_ignored) {
djmeyers 0:06ee5f8a484a 183 _event_ignored = false;
djmeyers 0:06ee5f8a484a 184 _observer.error(M2MInterface::NotAllowed);
djmeyers 0:06ee5f8a484a 185 }
djmeyers 0:06ee5f8a484a 186 tr_debug("M2MInterfaceImpl::register_object - OUT");
djmeyers 0:06ee5f8a484a 187 }
djmeyers 0:06ee5f8a484a 188
djmeyers 0:06ee5f8a484a 189 void M2MInterfaceImpl::update_registration(M2MSecurity *security_object, const uint32_t lifetime)
djmeyers 0:06ee5f8a484a 190 {
djmeyers 0:06ee5f8a484a 191 tr_debug("M2MInterfaceImpl::update_registration(M2MSecurity *security_object, const uint32_t lifetime)");
djmeyers 0:06ee5f8a484a 192 M2MUpdateRegisterData *data = new M2MUpdateRegisterData();
djmeyers 0:06ee5f8a484a 193 data->_object = security_object;
djmeyers 0:06ee5f8a484a 194 data->_lifetime = lifetime;
djmeyers 0:06ee5f8a484a 195 start_register_update(data);
djmeyers 0:06ee5f8a484a 196 }
djmeyers 0:06ee5f8a484a 197
djmeyers 0:06ee5f8a484a 198 void M2MInterfaceImpl::update_registration(M2MSecurity *security_object,
djmeyers 0:06ee5f8a484a 199 const M2MObjectList &object_list,
djmeyers 0:06ee5f8a484a 200 const uint32_t lifetime)
djmeyers 0:06ee5f8a484a 201 {
djmeyers 0:06ee5f8a484a 202 tr_debug("M2MInterfaceImpl::update_registration(M2MSecurity *security_object, const M2MObjectList &object_list, const uint32_t lifetime)");
djmeyers 0:06ee5f8a484a 203 M2MUpdateRegisterData *data = new M2MUpdateRegisterData();
djmeyers 0:06ee5f8a484a 204 data->_object = security_object;
djmeyers 0:06ee5f8a484a 205 data->_lifetime = lifetime;
djmeyers 0:06ee5f8a484a 206 data->_object_list = object_list;
djmeyers 0:06ee5f8a484a 207 start_register_update(data);
djmeyers 0:06ee5f8a484a 208 }
djmeyers 0:06ee5f8a484a 209
djmeyers 0:06ee5f8a484a 210 void M2MInterfaceImpl::unregister_object(M2MSecurity* /*security*/)
djmeyers 0:06ee5f8a484a 211 {
djmeyers 0:06ee5f8a484a 212 tr_debug("M2MInterfaceImpl::unregister_object - IN");
djmeyers 0:06ee5f8a484a 213 tr_debug("M2MInterfaceImpl::unregister_object - current state %d", _current_state);
djmeyers 0:06ee5f8a484a 214 // Transition to a new state based upon
djmeyers 0:06ee5f8a484a 215 // the current state of the state machine
djmeyers 0:06ee5f8a484a 216 BEGIN_TRANSITION_MAP // - Current State -
djmeyers 0:06ee5f8a484a 217 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_idle
djmeyers 0:06ee5f8a484a 218 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap
djmeyers 0:06ee5f8a484a 219 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state__bootstrap_address_resolved
djmeyers 0:06ee5f8a484a 220 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_resource_created
djmeyers 0:06ee5f8a484a 221 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_wait
djmeyers 0:06ee5f8a484a 222 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrapped
djmeyers 0:06ee5f8a484a 223 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register
djmeyers 0:06ee5f8a484a 224 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_address_resolved
djmeyers 0:06ee5f8a484a 225 TRANSITION_MAP_ENTRY (STATE_UNREGISTER) // state_registered
djmeyers 0:06ee5f8a484a 226 TRANSITION_MAP_ENTRY (STATE_UNREGISTER) // state_update_registration
djmeyers 0:06ee5f8a484a 227 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregister
djmeyers 0:06ee5f8a484a 228 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregistered
djmeyers 0:06ee5f8a484a 229 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_sending_coap_data
djmeyers 0:06ee5f8a484a 230 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_sent
djmeyers 0:06ee5f8a484a 231 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_received
djmeyers 0:06ee5f8a484a 232 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_processing_coap_data
djmeyers 0:06ee5f8a484a 233 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_processed
djmeyers 0:06ee5f8a484a 234 TRANSITION_MAP_ENTRY (STATE_UNREGISTER) // state_waiting
djmeyers 0:06ee5f8a484a 235 END_TRANSITION_MAP(NULL)
djmeyers 0:06ee5f8a484a 236 if(_event_ignored) {
djmeyers 0:06ee5f8a484a 237 _event_ignored = false;
djmeyers 0:06ee5f8a484a 238 _observer.error(M2MInterface::NotAllowed);
djmeyers 0:06ee5f8a484a 239 }
djmeyers 0:06ee5f8a484a 240 tr_debug("M2MInterfaceImpl::unregister_object - OUT");
djmeyers 0:06ee5f8a484a 241 }
djmeyers 0:06ee5f8a484a 242
djmeyers 0:06ee5f8a484a 243 void M2MInterfaceImpl::set_queue_sleep_handler(callback_handler handler)
djmeyers 0:06ee5f8a484a 244 {
djmeyers 0:06ee5f8a484a 245 tr_debug("M2MInterfaceImpl::set_queue_sleep_handler()");
djmeyers 0:06ee5f8a484a 246 _callback_handler = handler;
djmeyers 0:06ee5f8a484a 247 }
djmeyers 0:06ee5f8a484a 248
djmeyers 0:06ee5f8a484a 249 void M2MInterfaceImpl::set_random_number_callback(random_number_cb callback)
djmeyers 0:06ee5f8a484a 250 {
djmeyers 0:06ee5f8a484a 251 if(_security_connection) {
djmeyers 0:06ee5f8a484a 252 _security_connection->set_random_number_callback(callback);
djmeyers 0:06ee5f8a484a 253 }
djmeyers 0:06ee5f8a484a 254 }
djmeyers 0:06ee5f8a484a 255
djmeyers 0:06ee5f8a484a 256 void M2MInterfaceImpl::set_entropy_callback(entropy_cb callback)
djmeyers 0:06ee5f8a484a 257 {
djmeyers 0:06ee5f8a484a 258 if(_security_connection) {
djmeyers 0:06ee5f8a484a 259 _security_connection->set_entropy_callback(callback);
djmeyers 0:06ee5f8a484a 260 }
djmeyers 0:06ee5f8a484a 261 }
djmeyers 0:06ee5f8a484a 262
djmeyers 0:06ee5f8a484a 263 void M2MInterfaceImpl::set_platform_network_handler(void *handler)
djmeyers 0:06ee5f8a484a 264 {
djmeyers 0:06ee5f8a484a 265 tr_debug("M2MInterfaceImpl::set_platform_network_handler()");
djmeyers 0:06ee5f8a484a 266 _connection_handler.set_platform_network_handler(handler);
djmeyers 0:06ee5f8a484a 267 }
djmeyers 0:06ee5f8a484a 268
djmeyers 0:06ee5f8a484a 269 void M2MInterfaceImpl::coap_message_ready(uint8_t *data_ptr,
djmeyers 0:06ee5f8a484a 270 uint16_t data_len,
djmeyers 0:06ee5f8a484a 271 sn_nsdl_addr_s *address_ptr)
djmeyers 0:06ee5f8a484a 272 {
djmeyers 0:06ee5f8a484a 273 tr_debug("M2MInterfaceImpl::coap_message_ready");
djmeyers 0:06ee5f8a484a 274 if (_current_state != STATE_IDLE) {
djmeyers 0:06ee5f8a484a 275 internal_event(STATE_SENDING_COAP_DATA);
djmeyers 0:06ee5f8a484a 276 if(!_connection_handler.send_data(data_ptr,data_len,address_ptr)) {
djmeyers 0:06ee5f8a484a 277 internal_event( STATE_IDLE);
djmeyers 0:06ee5f8a484a 278 tr_error("M2MInterfaceImpl::coap_message_ready() - M2MInterface::NetworkError");
djmeyers 0:06ee5f8a484a 279 if (!_reconnecting) {
djmeyers 0:06ee5f8a484a 280 _observer.error(M2MInterface::NetworkError);
djmeyers 0:06ee5f8a484a 281 }
djmeyers 0:06ee5f8a484a 282 }
djmeyers 0:06ee5f8a484a 283 }
djmeyers 0:06ee5f8a484a 284 }
djmeyers 0:06ee5f8a484a 285
djmeyers 0:06ee5f8a484a 286 void M2MInterfaceImpl::client_registered(M2MServer *server_object)
djmeyers 0:06ee5f8a484a 287 {
djmeyers 0:06ee5f8a484a 288 tr_debug("M2MInterfaceImpl::client_registered");
djmeyers 0:06ee5f8a484a 289 _retry_count = 0;
djmeyers 0:06ee5f8a484a 290 internal_event(STATE_REGISTERED);
djmeyers 0:06ee5f8a484a 291 //Inform client is registered.
djmeyers 0:06ee5f8a484a 292 //TODO: manage register object in a list.
djmeyers 0:06ee5f8a484a 293 _observer.object_registered(_register_server,*server_object);
djmeyers 0:06ee5f8a484a 294 }
djmeyers 0:06ee5f8a484a 295
djmeyers 0:06ee5f8a484a 296 void M2MInterfaceImpl::registration_updated(const M2MServer &server_object)
djmeyers 0:06ee5f8a484a 297 {
djmeyers 0:06ee5f8a484a 298 tr_debug("M2MInterfaceImpl::registration_updated");
djmeyers 0:06ee5f8a484a 299 internal_event(STATE_REGISTERED);
djmeyers 0:06ee5f8a484a 300 _observer.registration_updated(_register_server,server_object);
djmeyers 0:06ee5f8a484a 301 }
djmeyers 0:06ee5f8a484a 302
djmeyers 0:06ee5f8a484a 303 void M2MInterfaceImpl::registration_error(uint8_t error_code, bool retry)
djmeyers 0:06ee5f8a484a 304 {
djmeyers 0:06ee5f8a484a 305 tr_debug("M2MInterfaceImpl::registration_error code [%d]", error_code);
djmeyers 0:06ee5f8a484a 306 // Try to register again
djmeyers 0:06ee5f8a484a 307 if (retry) {
djmeyers 0:06ee5f8a484a 308 socket_error(M2MConnectionHandler::SOCKET_SEND_ERROR);
djmeyers 0:06ee5f8a484a 309 } else {
djmeyers 0:06ee5f8a484a 310 internal_event(STATE_IDLE);
djmeyers 0:06ee5f8a484a 311 _observer.error((M2MInterface::Error)error_code);
djmeyers 0:06ee5f8a484a 312 }
djmeyers 0:06ee5f8a484a 313 }
djmeyers 0:06ee5f8a484a 314
djmeyers 0:06ee5f8a484a 315 void M2MInterfaceImpl::client_unregistered()
djmeyers 0:06ee5f8a484a 316 {
djmeyers 0:06ee5f8a484a 317 tr_debug("M2MInterfaceImpl::client_unregistered()");
djmeyers 0:06ee5f8a484a 318 internal_event(STATE_UNREGISTERED);
djmeyers 0:06ee5f8a484a 319 //TODO: manage register object in a list.
djmeyers 0:06ee5f8a484a 320 _observer.object_unregistered(_register_server);
djmeyers 0:06ee5f8a484a 321 }
djmeyers 0:06ee5f8a484a 322
djmeyers 0:06ee5f8a484a 323 void M2MInterfaceImpl::bootstrap_done(M2MSecurity *security_object)
djmeyers 0:06ee5f8a484a 324 {
djmeyers 0:06ee5f8a484a 325 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 326 tr_debug("M2MInterfaceImpl::bootstrap_done");
djmeyers 0:06ee5f8a484a 327 _retry_count = 0;
djmeyers 0:06ee5f8a484a 328 _reconnecting = false;
djmeyers 0:06ee5f8a484a 329 _bootstrapped = true;
djmeyers 0:06ee5f8a484a 330 _bootstrap_timer->stop_timer();
djmeyers 0:06ee5f8a484a 331 internal_event(STATE_BOOTSTRAPPED);
djmeyers 0:06ee5f8a484a 332 _observer.bootstrap_done(security_object);
djmeyers 0:06ee5f8a484a 333 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 334 }
djmeyers 0:06ee5f8a484a 335
djmeyers 0:06ee5f8a484a 336 void M2MInterfaceImpl::bootstrap_wait(M2MSecurity *security_object)
djmeyers 0:06ee5f8a484a 337 {
djmeyers 0:06ee5f8a484a 338 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 339 tr_debug("M2MInterfaceImpl::bootstrap_wait");
djmeyers 0:06ee5f8a484a 340 _security = security_object;
djmeyers 0:06ee5f8a484a 341 internal_event(STATE_BOOTSTRAP_WAIT);
djmeyers 0:06ee5f8a484a 342 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 343 }
djmeyers 0:06ee5f8a484a 344
djmeyers 0:06ee5f8a484a 345 void M2MInterfaceImpl::bootstrap_error()
djmeyers 0:06ee5f8a484a 346 {
djmeyers 0:06ee5f8a484a 347 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 348 tr_debug("M2MInterfaceImpl::bootstrap_error()");
djmeyers 0:06ee5f8a484a 349 _bootstrapped = false;
djmeyers 0:06ee5f8a484a 350 _bootstrap_timer->stop_timer();
djmeyers 0:06ee5f8a484a 351 internal_event(STATE_IDLE);
djmeyers 0:06ee5f8a484a 352 _observer.error(M2MInterface::BootstrapFailed);
djmeyers 0:06ee5f8a484a 353 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 354 }
djmeyers 0:06ee5f8a484a 355
djmeyers 0:06ee5f8a484a 356 void M2MInterfaceImpl::coap_data_processed()
djmeyers 0:06ee5f8a484a 357 {
djmeyers 0:06ee5f8a484a 358 tr_debug("M2MInterfaceImpl::coap_data_processed()");
djmeyers 0:06ee5f8a484a 359 internal_event(STATE_COAP_DATA_PROCESSED);
djmeyers 0:06ee5f8a484a 360 }
djmeyers 0:06ee5f8a484a 361
djmeyers 0:06ee5f8a484a 362 void M2MInterfaceImpl::value_updated(M2MBase *base)
djmeyers 0:06ee5f8a484a 363 {
djmeyers 0:06ee5f8a484a 364 tr_debug("M2MInterfaceImpl::value_updated");
djmeyers 0:06ee5f8a484a 365 if(base) {
djmeyers 0:06ee5f8a484a 366 M2MBase::BaseType type = base->base_type();
djmeyers 0:06ee5f8a484a 367 _observer.value_updated(base, type);
djmeyers 0:06ee5f8a484a 368 }
djmeyers 0:06ee5f8a484a 369 }
djmeyers 0:06ee5f8a484a 370
djmeyers 0:06ee5f8a484a 371 void M2MInterfaceImpl::data_available(uint8_t* data,
djmeyers 0:06ee5f8a484a 372 uint16_t data_size,
djmeyers 0:06ee5f8a484a 373 const M2MConnectionObserver::SocketAddress &address)
djmeyers 0:06ee5f8a484a 374 {
djmeyers 0:06ee5f8a484a 375 tr_debug("M2MInterfaceImpl::data_available");
djmeyers 0:06ee5f8a484a 376 ReceivedData *event = new ReceivedData();
djmeyers 0:06ee5f8a484a 377 event->_data = data;
djmeyers 0:06ee5f8a484a 378 event->_size = data_size;
djmeyers 0:06ee5f8a484a 379 event->_address = &address;
djmeyers 0:06ee5f8a484a 380 internal_event(STATE_COAP_DATA_RECEIVED, event);
djmeyers 0:06ee5f8a484a 381 }
djmeyers 0:06ee5f8a484a 382
djmeyers 0:06ee5f8a484a 383 void M2MInterfaceImpl::socket_error(uint8_t error_code, bool retry)
djmeyers 0:06ee5f8a484a 384 {
djmeyers 0:06ee5f8a484a 385 tr_debug("M2MInterfaceImpl::socket_error: (%d), retry (%d), reconnecting (%d)", error_code, retry, _reconnecting);
djmeyers 0:06ee5f8a484a 386 #if MBED_CLIENT_RECONNECTION_LOOP < 1
djmeyers 0:06ee5f8a484a 387 if (!_retry_timer_expired && _reconnecting) {
djmeyers 0:06ee5f8a484a 388 tr_debug("M2MInterfaceImpl::socket_error - retry timer running - return");
djmeyers 0:06ee5f8a484a 389 return;
djmeyers 0:06ee5f8a484a 390 }
djmeyers 0:06ee5f8a484a 391 #endif
djmeyers 0:06ee5f8a484a 392
djmeyers 0:06ee5f8a484a 393 M2MInterface::Error error = M2MInterface::ErrorNone;
djmeyers 0:06ee5f8a484a 394 switch (error_code) {
djmeyers 0:06ee5f8a484a 395 case M2MConnectionHandler::SSL_CONNECTION_ERROR:
djmeyers 0:06ee5f8a484a 396 error = M2MInterface::SecureConnectionFailed;
djmeyers 0:06ee5f8a484a 397 break;
djmeyers 0:06ee5f8a484a 398 case M2MConnectionHandler::DNS_RESOLVING_ERROR:
djmeyers 0:06ee5f8a484a 399 error = M2MInterface::DnsResolvingFailed;
djmeyers 0:06ee5f8a484a 400 break;
djmeyers 0:06ee5f8a484a 401 case M2MConnectionHandler::SOCKET_READ_ERROR:
djmeyers 0:06ee5f8a484a 402 error = M2MInterface::NetworkError;
djmeyers 0:06ee5f8a484a 403 break;
djmeyers 0:06ee5f8a484a 404 case M2MConnectionHandler::SOCKET_SEND_ERROR:
djmeyers 0:06ee5f8a484a 405 error = M2MInterface::NetworkError;
djmeyers 0:06ee5f8a484a 406 break;
djmeyers 0:06ee5f8a484a 407 case M2MConnectionHandler::SSL_HANDSHAKE_ERROR:
djmeyers 0:06ee5f8a484a 408 error = M2MInterface::SecureConnectionFailed;
djmeyers 0:06ee5f8a484a 409 break;
djmeyers 0:06ee5f8a484a 410 case M2MConnectionHandler::SOCKET_ABORT:
djmeyers 0:06ee5f8a484a 411 error = M2MInterface::NetworkError;
djmeyers 0:06ee5f8a484a 412 break;
djmeyers 0:06ee5f8a484a 413 default:
djmeyers 0:06ee5f8a484a 414 break;
djmeyers 0:06ee5f8a484a 415 }
djmeyers 0:06ee5f8a484a 416
djmeyers 0:06ee5f8a484a 417 // Try to do reconnecting
djmeyers 0:06ee5f8a484a 418 if (retry) {
djmeyers 0:06ee5f8a484a 419 if (_retry_count < MBED_CLIENT_RECONNECTION_COUNT) {
djmeyers 0:06ee5f8a484a 420 _retry_count++;
djmeyers 0:06ee5f8a484a 421 }
djmeyers 0:06ee5f8a484a 422 #if MBED_CLIENT_RECONNECTION_LOOP > 0
djmeyers 0:06ee5f8a484a 423 else {
djmeyers 0:06ee5f8a484a 424 tr_debug("M2MInterfaceImpl::socket_error - start again");
djmeyers 0:06ee5f8a484a 425 _retry_count = 1;
djmeyers 0:06ee5f8a484a 426 _observer.error(error);
djmeyers 0:06ee5f8a484a 427 }
djmeyers 0:06ee5f8a484a 428 #else
djmeyers 0:06ee5f8a484a 429 else {
djmeyers 0:06ee5f8a484a 430 tr_debug("M2MInterfaceImpl::socket_error - no more retries");
djmeyers 0:06ee5f8a484a 431 _connection_handler.stop_listening();
djmeyers 0:06ee5f8a484a 432 _retry_timer.stop_timer();
djmeyers 0:06ee5f8a484a 433 retry = false;
djmeyers 0:06ee5f8a484a 434 }
djmeyers 0:06ee5f8a484a 435 #endif
djmeyers 0:06ee5f8a484a 436 if (retry) {
djmeyers 0:06ee5f8a484a 437 internal_event(STATE_IDLE);
djmeyers 0:06ee5f8a484a 438 _reconnecting = true;
djmeyers 0:06ee5f8a484a 439 _connection_handler.stop_listening();
djmeyers 0:06ee5f8a484a 440 int retry_time = MBED_CLIENT_RECONNECTION_INTERVAL *
djmeyers 0:06ee5f8a484a 441 MBED_CLIENT_RECONNECTION_COUNT * _retry_count * 1000;
djmeyers 0:06ee5f8a484a 442 _retry_timer_expired = false;
djmeyers 0:06ee5f8a484a 443 _retry_timer.start_timer(retry_time,
djmeyers 0:06ee5f8a484a 444 M2MTimerObserver::RetryTimer);
djmeyers 0:06ee5f8a484a 445 tr_debug("M2MInterfaceImpl::socket_error - reconnecting in %d(s), count %d/%d", retry_time / 1000,
djmeyers 0:06ee5f8a484a 446 _retry_count, MBED_CLIENT_RECONNECTION_COUNT);
djmeyers 0:06ee5f8a484a 447 }
djmeyers 0:06ee5f8a484a 448 }
djmeyers 0:06ee5f8a484a 449 // Inform application
djmeyers 0:06ee5f8a484a 450 if (!retry && M2MInterface::ErrorNone != error) {
djmeyers 0:06ee5f8a484a 451 tr_debug("M2MInterfaceImpl::socket_error - send error to application");
djmeyers 0:06ee5f8a484a 452 _connection_handler.stop_listening();
djmeyers 0:06ee5f8a484a 453 _retry_timer.stop_timer();
djmeyers 0:06ee5f8a484a 454 _retry_count = 0;
djmeyers 0:06ee5f8a484a 455 _reconnecting = false;
djmeyers 0:06ee5f8a484a 456 _observer.error(error);
djmeyers 0:06ee5f8a484a 457 internal_event(STATE_IDLE);
djmeyers 0:06ee5f8a484a 458 }
djmeyers 0:06ee5f8a484a 459 }
djmeyers 0:06ee5f8a484a 460
djmeyers 0:06ee5f8a484a 461 void M2MInterfaceImpl::address_ready(const M2MConnectionObserver::SocketAddress &address,
djmeyers 0:06ee5f8a484a 462 M2MConnectionObserver::ServerType server_type,
djmeyers 0:06ee5f8a484a 463 const uint16_t server_port)
djmeyers 0:06ee5f8a484a 464 {
djmeyers 0:06ee5f8a484a 465 tr_debug("M2MInterfaceImpl::address_ready");
djmeyers 0:06ee5f8a484a 466 ResolvedAddressData *data = new ResolvedAddressData();
djmeyers 0:06ee5f8a484a 467 data->_address = &address;
djmeyers 0:06ee5f8a484a 468 data->_port = server_port;
djmeyers 0:06ee5f8a484a 469 if( M2MConnectionObserver::Bootstrap == server_type) {
djmeyers 0:06ee5f8a484a 470 tr_debug("M2MInterfaceImpl::address_ready() Server Type Bootstrap");
djmeyers 0:06ee5f8a484a 471 internal_event(STATE_BOOTSTRAP_ADDRESS_RESOLVED, data);
djmeyers 0:06ee5f8a484a 472 } else {
djmeyers 0:06ee5f8a484a 473 tr_debug("M2MInterfaceImpl::address_ready() Server Type LWM2M");
djmeyers 0:06ee5f8a484a 474 internal_event(STATE_REGISTER_ADDRESS_RESOLVED, data);
djmeyers 0:06ee5f8a484a 475 }
djmeyers 0:06ee5f8a484a 476 }
djmeyers 0:06ee5f8a484a 477
djmeyers 0:06ee5f8a484a 478 void M2MInterfaceImpl::data_sent()
djmeyers 0:06ee5f8a484a 479 {
djmeyers 0:06ee5f8a484a 480 tr_debug("M2MInterfaceImpl::data_sent()");
djmeyers 0:06ee5f8a484a 481 if(_binding_mode == M2MInterface::UDP_QUEUE ||
djmeyers 0:06ee5f8a484a 482 _binding_mode == M2MInterface::TCP_QUEUE ||
djmeyers 0:06ee5f8a484a 483 _binding_mode == M2MInterface::SMS_QUEUE ||
djmeyers 0:06ee5f8a484a 484 _binding_mode == M2MInterface::UDP_SMS_QUEUE) {
djmeyers 0:06ee5f8a484a 485 if(_callback_handler) {
djmeyers 0:06ee5f8a484a 486 _queue_sleep_timer.stop_timer();
djmeyers 0:06ee5f8a484a 487 _queue_sleep_timer.start_timer(MBED_CLIENT_RECONNECTION_COUNT*MBED_CLIENT_RECONNECTION_INTERVAL*1000,
djmeyers 0:06ee5f8a484a 488 M2MTimerObserver::QueueSleep);
djmeyers 0:06ee5f8a484a 489 }
djmeyers 0:06ee5f8a484a 490 }
djmeyers 0:06ee5f8a484a 491 if (_current_state == STATE_BOOTSTRAP_WAIT) {
djmeyers 0:06ee5f8a484a 492 // For bootstrap we need to call bootstrap_done callback ONLY after we have
djmeyers 0:06ee5f8a484a 493 // sent the last ACK and ended in STATE_BOOTSTRAP_WAIT
djmeyers 0:06ee5f8a484a 494 M2MSecurity *sec = _security;
djmeyers 0:06ee5f8a484a 495 _security = NULL;
djmeyers 0:06ee5f8a484a 496 bootstrap_done(sec);
djmeyers 0:06ee5f8a484a 497 }
djmeyers 0:06ee5f8a484a 498 else {
djmeyers 0:06ee5f8a484a 499 internal_event(STATE_COAP_DATA_SENT);
djmeyers 0:06ee5f8a484a 500 }
djmeyers 0:06ee5f8a484a 501 }
djmeyers 0:06ee5f8a484a 502
djmeyers 0:06ee5f8a484a 503 void M2MInterfaceImpl::timer_expired(M2MTimerObserver::Type type)
djmeyers 0:06ee5f8a484a 504 {
djmeyers 0:06ee5f8a484a 505 tr_debug("M2MInterfaceImpl::timer_expired()");
djmeyers 0:06ee5f8a484a 506 if(M2MTimerObserver::QueueSleep == type) {
djmeyers 0:06ee5f8a484a 507 if(_callback_handler) {
djmeyers 0:06ee5f8a484a 508 _callback_handler();
djmeyers 0:06ee5f8a484a 509 }
djmeyers 0:06ee5f8a484a 510 }
djmeyers 0:06ee5f8a484a 511 else if (M2MTimerObserver::RetryTimer == type) {
djmeyers 0:06ee5f8a484a 512 _retry_timer_expired = true;
djmeyers 0:06ee5f8a484a 513 if (_bootstrapped) {
djmeyers 0:06ee5f8a484a 514 internal_event(STATE_REGISTER);
djmeyers 0:06ee5f8a484a 515 } else {
djmeyers 0:06ee5f8a484a 516 internal_event(STATE_BOOTSTRAP);
djmeyers 0:06ee5f8a484a 517 }
djmeyers 0:06ee5f8a484a 518 }
djmeyers 0:06ee5f8a484a 519 else if (M2MTimerObserver::BootstrapTimer == type) {
djmeyers 0:06ee5f8a484a 520 bootstrap_error();
djmeyers 0:06ee5f8a484a 521 }
djmeyers 0:06ee5f8a484a 522 }
djmeyers 0:06ee5f8a484a 523
djmeyers 0:06ee5f8a484a 524 // state machine sits here.
djmeyers 0:06ee5f8a484a 525 void M2MInterfaceImpl::state_idle(EventData* /*data*/)
djmeyers 0:06ee5f8a484a 526 {
djmeyers 0:06ee5f8a484a 527 tr_debug("M2MInterfaceImpl::state_idle");
djmeyers 0:06ee5f8a484a 528 _nsdl_interface.stop_timers();
djmeyers 0:06ee5f8a484a 529 }
djmeyers 0:06ee5f8a484a 530
djmeyers 0:06ee5f8a484a 531 void M2MInterfaceImpl::state_bootstrap(EventData *data)
djmeyers 0:06ee5f8a484a 532 {
djmeyers 0:06ee5f8a484a 533 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 534 tr_debug("M2MInterfaceImpl::state_bootstrap");
djmeyers 0:06ee5f8a484a 535 // Start with bootstrapping preparation
djmeyers 0:06ee5f8a484a 536 _bootstrapped = false;
djmeyers 0:06ee5f8a484a 537 M2MSecurityData *event = static_cast<M2MSecurityData *> (data);
djmeyers 0:06ee5f8a484a 538 if(!_security) {
djmeyers 0:06ee5f8a484a 539 M2MInterface::Error error = M2MInterface::InvalidParameters;
djmeyers 0:06ee5f8a484a 540 if (event) {
djmeyers 0:06ee5f8a484a 541 _security = event->_object;
djmeyers 0:06ee5f8a484a 542 if(_security) {
djmeyers 0:06ee5f8a484a 543 if(M2MSecurity::Bootstrap == _security->server_type()) {
djmeyers 0:06ee5f8a484a 544 tr_debug("M2MInterfaceImpl::state_bootstrap - server_type : M2MSecurity::Bootstrap");
djmeyers 0:06ee5f8a484a 545 String server_address = _security->resource_value_string(M2MSecurity::M2MServerUri);
djmeyers 0:06ee5f8a484a 546 tr_debug("M2MInterfaceImpl::state_bootstrap - server_address %s", server_address.c_str());
djmeyers 0:06ee5f8a484a 547 _bootstrap_timer->start_timer(MBED_CLIENT_RECONNECTION_COUNT * MBED_CLIENT_RECONNECTION_INTERVAL * 8 * 1000,
djmeyers 0:06ee5f8a484a 548 M2MTimerObserver::BootstrapTimer);
djmeyers 0:06ee5f8a484a 549 String coap;
djmeyers 0:06ee5f8a484a 550 if(server_address.compare(0,sizeof(COAP)-1,COAP) == 0) {
djmeyers 0:06ee5f8a484a 551 coap = COAP;
djmeyers 0:06ee5f8a484a 552 }
djmeyers 0:06ee5f8a484a 553 else if(server_address.compare(0,sizeof(COAPS)-1,COAPS) == 0) {
djmeyers 0:06ee5f8a484a 554 _security->resource_value_int(M2MSecurity::SecurityMode) != M2MSecurity::NoSecurity ? coap = COAPS: coap = "";
djmeyers 0:06ee5f8a484a 555 }
djmeyers 0:06ee5f8a484a 556 if(!coap.empty()) {
djmeyers 0:06ee5f8a484a 557 server_address = server_address.substr(coap.size(),
djmeyers 0:06ee5f8a484a 558 server_address.size()-coap.size());
djmeyers 0:06ee5f8a484a 559
djmeyers 0:06ee5f8a484a 560 process_address(server_address, _server_ip_address, _server_port);
djmeyers 0:06ee5f8a484a 561
djmeyers 0:06ee5f8a484a 562 tr_debug("M2MInterfaceImpl::state_bootstrap - IP address %s , Port %d", _server_ip_address.c_str(), _server_port);
djmeyers 0:06ee5f8a484a 563 // If bind and resolving server address succeed then proceed else
djmeyers 0:06ee5f8a484a 564 // return error to the application and go to Idle state.
djmeyers 0:06ee5f8a484a 565 if(!_server_ip_address.empty()) {
djmeyers 0:06ee5f8a484a 566 error = M2MInterface::ErrorNone;
djmeyers 0:06ee5f8a484a 567 _connection_handler.resolve_server_address(_server_ip_address,
djmeyers 0:06ee5f8a484a 568 _server_port,
djmeyers 0:06ee5f8a484a 569 M2MConnectionObserver::Bootstrap,
djmeyers 0:06ee5f8a484a 570 _security);
djmeyers 0:06ee5f8a484a 571 }
djmeyers 0:06ee5f8a484a 572 }
djmeyers 0:06ee5f8a484a 573 }
djmeyers 0:06ee5f8a484a 574 }
djmeyers 0:06ee5f8a484a 575 }
djmeyers 0:06ee5f8a484a 576 if (error != M2MInterface::ErrorNone) {
djmeyers 0:06ee5f8a484a 577 tr_error("M2MInterfaceImpl::state_bootstrap - set error as M2MInterface::InvalidParameters");
djmeyers 0:06ee5f8a484a 578 internal_event(STATE_IDLE);
djmeyers 0:06ee5f8a484a 579 _observer.error(error);
djmeyers 0:06ee5f8a484a 580 }
djmeyers 0:06ee5f8a484a 581 } else {
djmeyers 0:06ee5f8a484a 582 _listen_port = rand() % 64511 + 1024;
djmeyers 0:06ee5f8a484a 583 _connection_handler.stop_listening();
djmeyers 0:06ee5f8a484a 584 _connection_handler.bind_connection(_listen_port);
djmeyers 0:06ee5f8a484a 585 _connection_handler.resolve_server_address(_server_ip_address,
djmeyers 0:06ee5f8a484a 586 _server_port,
djmeyers 0:06ee5f8a484a 587 M2MConnectionObserver::Bootstrap,
djmeyers 0:06ee5f8a484a 588 _security);
djmeyers 0:06ee5f8a484a 589 }
djmeyers 0:06ee5f8a484a 590 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 591 }
djmeyers 0:06ee5f8a484a 592
djmeyers 0:06ee5f8a484a 593 void M2MInterfaceImpl::state_bootstrap_address_resolved( EventData *data)
djmeyers 0:06ee5f8a484a 594 {
djmeyers 0:06ee5f8a484a 595 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 596 tr_debug("M2MInterfaceImpl::state_bootstrap_address_resolved");
djmeyers 0:06ee5f8a484a 597 if (data) {
djmeyers 0:06ee5f8a484a 598 ResolvedAddressData *event = static_cast<ResolvedAddressData *> (data);
djmeyers 0:06ee5f8a484a 599 sn_nsdl_addr_s address;
djmeyers 0:06ee5f8a484a 600
djmeyers 0:06ee5f8a484a 601 M2MInterface::NetworkStack stack = event->_address->_stack;
djmeyers 0:06ee5f8a484a 602
djmeyers 0:06ee5f8a484a 603 if(M2MInterface::LwIP_IPv4 == stack) {
djmeyers 0:06ee5f8a484a 604 tr_debug("M2MInterfaceImpl::state_bootstrap_address_resolved : IPv4 address");
djmeyers 0:06ee5f8a484a 605 address.type = SN_NSDL_ADDRESS_TYPE_IPV4;
djmeyers 0:06ee5f8a484a 606 } else if((M2MInterface::LwIP_IPv6 == stack) ||
djmeyers 0:06ee5f8a484a 607 (M2MInterface::Nanostack_IPv6 == stack)) {
djmeyers 0:06ee5f8a484a 608 tr_debug("M2MInterfaceImpl::state_bootstrap_address_resolved : IPv6 address");
djmeyers 0:06ee5f8a484a 609 address.type = SN_NSDL_ADDRESS_TYPE_IPV6;
djmeyers 0:06ee5f8a484a 610 }
djmeyers 0:06ee5f8a484a 611 address.port = event->_port;
djmeyers 0:06ee5f8a484a 612 address.addr_ptr = (uint8_t*)event->_address->_address;
djmeyers 0:06ee5f8a484a 613 address.addr_len = event->_address->_length;
djmeyers 0:06ee5f8a484a 614 _connection_handler.start_listening_for_data();
djmeyers 0:06ee5f8a484a 615
djmeyers 0:06ee5f8a484a 616 // Include domain id to be part of endpoint name
djmeyers 0:06ee5f8a484a 617 StringBuffer<M2MBase::MAX_PATH_SIZE> new_ep_name;
djmeyers 0:06ee5f8a484a 618
djmeyers 0:06ee5f8a484a 619 if(!new_ep_name.ensure_space(_nsdl_interface.endpoint_name().size() + 1))
djmeyers 0:06ee5f8a484a 620 {
djmeyers 0:06ee5f8a484a 621 tr_error("MM2MInterfaceImpl::state_bootstrap_address_resolved : name too long");
djmeyers 0:06ee5f8a484a 622 _observer.error(M2MInterface::InvalidParameters);
djmeyers 0:06ee5f8a484a 623 return;
djmeyers 0:06ee5f8a484a 624 }
djmeyers 0:06ee5f8a484a 625
djmeyers 0:06ee5f8a484a 626 new_ep_name.append(_nsdl_interface.endpoint_name().c_str());
djmeyers 0:06ee5f8a484a 627
djmeyers 0:06ee5f8a484a 628 if (!_domain.empty()) {
djmeyers 0:06ee5f8a484a 629
djmeyers 0:06ee5f8a484a 630 if(!new_ep_name.ensure_space(_nsdl_interface.endpoint_name().size() + 1 + _domain.size() + 1))
djmeyers 0:06ee5f8a484a 631 {
djmeyers 0:06ee5f8a484a 632 tr_error("MM2MInterfaceImpl::state_bootstrap_address_resolved : name + domain too long");
djmeyers 0:06ee5f8a484a 633 _observer.error(M2MInterface::InvalidParameters);
djmeyers 0:06ee5f8a484a 634 return;
djmeyers 0:06ee5f8a484a 635 }
djmeyers 0:06ee5f8a484a 636
djmeyers 0:06ee5f8a484a 637 new_ep_name.append('@');
djmeyers 0:06ee5f8a484a 638 new_ep_name.append(_domain.c_str());
djmeyers 0:06ee5f8a484a 639
djmeyers 0:06ee5f8a484a 640 }
djmeyers 0:06ee5f8a484a 641 if(_nsdl_interface.create_bootstrap_resource(&address, new_ep_name.c_str())) {
djmeyers 0:06ee5f8a484a 642 tr_debug("M2MInterfaceImpl::state_bootstrap_address_resolved : create_bootstrap_resource - success");
djmeyers 0:06ee5f8a484a 643 internal_event(STATE_BOOTSTRAP_RESOURCE_CREATED);
djmeyers 0:06ee5f8a484a 644 } else{
djmeyers 0:06ee5f8a484a 645 // If resource creation fails then inform error to application
djmeyers 0:06ee5f8a484a 646 tr_error("M2MInterfaceImpl::state_bootstrap_address_resolved : M2MInterface::InvalidParameters");
djmeyers 0:06ee5f8a484a 647 internal_event(STATE_IDLE);
djmeyers 0:06ee5f8a484a 648 _observer.error(M2MInterface::InvalidParameters);
djmeyers 0:06ee5f8a484a 649 }
djmeyers 0:06ee5f8a484a 650 }
djmeyers 0:06ee5f8a484a 651 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 652 }
djmeyers 0:06ee5f8a484a 653
djmeyers 0:06ee5f8a484a 654 void M2MInterfaceImpl::state_bootstrap_resource_created( EventData */*data*/)
djmeyers 0:06ee5f8a484a 655 {
djmeyers 0:06ee5f8a484a 656 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 657 tr_debug("M2MInterfaceImpl::state_bootstrap_resource_created");
djmeyers 0:06ee5f8a484a 658 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 659 }
djmeyers 0:06ee5f8a484a 660
djmeyers 0:06ee5f8a484a 661 void M2MInterfaceImpl::state_bootstrapped( EventData */*data*/)
djmeyers 0:06ee5f8a484a 662 {
djmeyers 0:06ee5f8a484a 663 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 664 tr_debug("M2MInterfaceImpl::state_bootstrapped");
djmeyers 0:06ee5f8a484a 665 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 666 }
djmeyers 0:06ee5f8a484a 667
djmeyers 0:06ee5f8a484a 668 void M2MInterfaceImpl::state_register(EventData *data)
djmeyers 0:06ee5f8a484a 669 {
djmeyers 0:06ee5f8a484a 670 tr_debug("M2MInterfaceImpl::state_register");
djmeyers 0:06ee5f8a484a 671 M2MRegisterData *event = static_cast<M2MRegisterData *> (data);
djmeyers 0:06ee5f8a484a 672 if (!_security) {
djmeyers 0:06ee5f8a484a 673 M2MInterface::Error error = M2MInterface::InvalidParameters;
djmeyers 0:06ee5f8a484a 674 // Start with registration preparation
djmeyers 0:06ee5f8a484a 675 if(event) {
djmeyers 0:06ee5f8a484a 676 _security = event->_object;
djmeyers 0:06ee5f8a484a 677 if(_security) {
djmeyers 0:06ee5f8a484a 678 if(M2MSecurity::M2MServer == _security->server_type()) {
djmeyers 0:06ee5f8a484a 679 tr_debug("M2MInterfaceImpl::state_register - server_type : M2MSecurity::M2MServer");
djmeyers 0:06ee5f8a484a 680 if(_nsdl_interface.create_nsdl_list_structure(event->_object_list)) {
djmeyers 0:06ee5f8a484a 681 tr_debug("M2MInterfaceImpl::state_register - create_nsdl_list_structure - success");
djmeyers 0:06ee5f8a484a 682 // If the nsdl resource structure is created successfully
djmeyers 0:06ee5f8a484a 683 String server_address = _security->resource_value_string(M2MSecurity::M2MServerUri);
djmeyers 0:06ee5f8a484a 684 tr_debug("M2MInterfaceImpl::state_register - server_address %s", server_address.c_str());
djmeyers 0:06ee5f8a484a 685 String coap;
djmeyers 0:06ee5f8a484a 686 if(server_address.compare(0,sizeof(COAP)-1,COAP) == 0) {
djmeyers 0:06ee5f8a484a 687 coap = COAP;
djmeyers 0:06ee5f8a484a 688 }
djmeyers 0:06ee5f8a484a 689 else if(server_address.compare(0,sizeof(COAPS)-1,COAPS) == 0) {
djmeyers 0:06ee5f8a484a 690 _security->resource_value_int(M2MSecurity::SecurityMode) != M2MSecurity::NoSecurity ? coap = COAPS: coap = "";
djmeyers 0:06ee5f8a484a 691 }
djmeyers 0:06ee5f8a484a 692 if(!coap.empty()) {
djmeyers 0:06ee5f8a484a 693 server_address = server_address.substr(coap.size(),
djmeyers 0:06ee5f8a484a 694 server_address.size() - coap.size());
djmeyers 0:06ee5f8a484a 695 process_address(server_address, _server_ip_address, _server_port);
djmeyers 0:06ee5f8a484a 696
djmeyers 0:06ee5f8a484a 697 tr_debug("M2MInterfaceImpl::state_register - IP address %s , Port %d", _server_ip_address.c_str(), _server_port);
djmeyers 0:06ee5f8a484a 698 if(!_server_ip_address.empty()) {
djmeyers 0:06ee5f8a484a 699 // Connection related errors are coming through callback
djmeyers 0:06ee5f8a484a 700 error = M2MInterface::ErrorNone;
djmeyers 0:06ee5f8a484a 701 _connection_handler.resolve_server_address(_server_ip_address,_server_port,
djmeyers 0:06ee5f8a484a 702 M2MConnectionObserver::LWM2MServer,
djmeyers 0:06ee5f8a484a 703 _security);
djmeyers 0:06ee5f8a484a 704 }
djmeyers 0:06ee5f8a484a 705 }
djmeyers 0:06ee5f8a484a 706 }
djmeyers 0:06ee5f8a484a 707 }
djmeyers 0:06ee5f8a484a 708 }
djmeyers 0:06ee5f8a484a 709 }
djmeyers 0:06ee5f8a484a 710 if (error != M2MInterface::ErrorNone) {
djmeyers 0:06ee5f8a484a 711 tr_error("M2MInterfaceImpl::state_register - set error as M2MInterface::InvalidParameters");
djmeyers 0:06ee5f8a484a 712 internal_event(STATE_IDLE);
djmeyers 0:06ee5f8a484a 713 _observer.error(error);
djmeyers 0:06ee5f8a484a 714 }
djmeyers 0:06ee5f8a484a 715 } else {
djmeyers 0:06ee5f8a484a 716 _listen_port = rand() % 64511 + 1024;
djmeyers 0:06ee5f8a484a 717 _connection_handler.stop_listening();
djmeyers 0:06ee5f8a484a 718 if (event) {
djmeyers 0:06ee5f8a484a 719 _nsdl_interface.create_nsdl_list_structure(event->_object_list);
djmeyers 0:06ee5f8a484a 720 }
djmeyers 0:06ee5f8a484a 721 _connection_handler.bind_connection(_listen_port);
djmeyers 0:06ee5f8a484a 722 _connection_handler.resolve_server_address(_server_ip_address,_server_port,
djmeyers 0:06ee5f8a484a 723 M2MConnectionObserver::LWM2MServer,
djmeyers 0:06ee5f8a484a 724 _security);
djmeyers 0:06ee5f8a484a 725 }
djmeyers 0:06ee5f8a484a 726 }
djmeyers 0:06ee5f8a484a 727
djmeyers 0:06ee5f8a484a 728 void M2MInterfaceImpl::process_address(const String& server_address, String& ip_address, uint16_t& port) {
djmeyers 0:06ee5f8a484a 729
djmeyers 0:06ee5f8a484a 730 int colonFound = server_address.find_last_of(':'); //10
djmeyers 0:06ee5f8a484a 731 if(colonFound != -1) {
djmeyers 0:06ee5f8a484a 732 ip_address = server_address.substr(0,colonFound);
djmeyers 0:06ee5f8a484a 733 port = atoi(server_address.substr(colonFound+1,
djmeyers 0:06ee5f8a484a 734 server_address.size()-ip_address.size()).c_str());
djmeyers 0:06ee5f8a484a 735 colonFound = ip_address.find_last_of(']');
djmeyers 0:06ee5f8a484a 736 if(ip_address.compare(0,1,"[") == 0) {
djmeyers 0:06ee5f8a484a 737 if(colonFound == -1) {
djmeyers 0:06ee5f8a484a 738 ip_address.clear();
djmeyers 0:06ee5f8a484a 739 } else {
djmeyers 0:06ee5f8a484a 740 ip_address = ip_address.substr(1,colonFound-1);
djmeyers 0:06ee5f8a484a 741 }
djmeyers 0:06ee5f8a484a 742 } else if(colonFound != -1) {
djmeyers 0:06ee5f8a484a 743 ip_address.clear();
djmeyers 0:06ee5f8a484a 744 }
djmeyers 0:06ee5f8a484a 745 }
djmeyers 0:06ee5f8a484a 746 }
djmeyers 0:06ee5f8a484a 747
djmeyers 0:06ee5f8a484a 748 void M2MInterfaceImpl::state_register_address_resolved( EventData *data)
djmeyers 0:06ee5f8a484a 749 {
djmeyers 0:06ee5f8a484a 750 tr_debug("M2MInterfaceImpl::state_register_address_resolved");
djmeyers 0:06ee5f8a484a 751 if(data) {
djmeyers 0:06ee5f8a484a 752 ResolvedAddressData *event = static_cast<ResolvedAddressData *> (data);
djmeyers 0:06ee5f8a484a 753
djmeyers 0:06ee5f8a484a 754 sn_nsdl_addr_type_e address_type = SN_NSDL_ADDRESS_TYPE_IPV6;
djmeyers 0:06ee5f8a484a 755
djmeyers 0:06ee5f8a484a 756 M2MInterface::NetworkStack stack = event->_address->_stack;
djmeyers 0:06ee5f8a484a 757
djmeyers 0:06ee5f8a484a 758 if(M2MInterface::LwIP_IPv4 == stack) {
djmeyers 0:06ee5f8a484a 759 tr_debug("M2MInterfaceImpl::state_register_address_resolved : IPv4 address");
djmeyers 0:06ee5f8a484a 760 address_type = SN_NSDL_ADDRESS_TYPE_IPV4;
djmeyers 0:06ee5f8a484a 761 } else if((M2MInterface::LwIP_IPv6 == stack) ||
djmeyers 0:06ee5f8a484a 762 (M2MInterface::Nanostack_IPv6 == stack)) {
djmeyers 0:06ee5f8a484a 763 tr_debug("M2MInterfaceImpl::state_register_address_resolved : IPv6 address");
djmeyers 0:06ee5f8a484a 764 address_type = SN_NSDL_ADDRESS_TYPE_IPV6;
djmeyers 0:06ee5f8a484a 765 }
djmeyers 0:06ee5f8a484a 766 _connection_handler.start_listening_for_data();
djmeyers 0:06ee5f8a484a 767 if(!_nsdl_interface.send_register_message((uint8_t*)event->_address->_address,event->_address->_length,
djmeyers 0:06ee5f8a484a 768 event->_port, address_type)) {
djmeyers 0:06ee5f8a484a 769 // If resource creation fails then inform error to application
djmeyers 0:06ee5f8a484a 770 tr_error("M2MInterfaceImpl::state_register_address_resolved : M2MInterface::InvalidParameters");
djmeyers 0:06ee5f8a484a 771 internal_event(STATE_IDLE);
djmeyers 0:06ee5f8a484a 772 _observer.error(M2MInterface::InvalidParameters);
djmeyers 0:06ee5f8a484a 773 }
djmeyers 0:06ee5f8a484a 774 }
djmeyers 0:06ee5f8a484a 775 }
djmeyers 0:06ee5f8a484a 776
djmeyers 0:06ee5f8a484a 777 void M2MInterfaceImpl::state_registered( EventData */*data*/)
djmeyers 0:06ee5f8a484a 778 {
djmeyers 0:06ee5f8a484a 779 tr_debug("M2MInterfaceImpl::state_registered");
djmeyers 0:06ee5f8a484a 780 _retry_count = 0;
djmeyers 0:06ee5f8a484a 781 _reconnecting = false;
djmeyers 0:06ee5f8a484a 782 }
djmeyers 0:06ee5f8a484a 783
djmeyers 0:06ee5f8a484a 784 void M2MInterfaceImpl::state_update_registration(EventData *data)
djmeyers 0:06ee5f8a484a 785 {
djmeyers 0:06ee5f8a484a 786 tr_debug("M2MInterfaceImpl::state_update_registration");
djmeyers 0:06ee5f8a484a 787 if(data) {
djmeyers 0:06ee5f8a484a 788 M2MUpdateRegisterData *event = static_cast<M2MUpdateRegisterData *> (data);
djmeyers 0:06ee5f8a484a 789 // Create new resources if any
djmeyers 0:06ee5f8a484a 790 if (!event->_object_list.empty()) {
djmeyers 0:06ee5f8a484a 791 _nsdl_interface.create_nsdl_list_structure(event->_object_list);
djmeyers 0:06ee5f8a484a 792 }
djmeyers 0:06ee5f8a484a 793 _nsdl_interface.send_update_registration(event->_lifetime);
djmeyers 0:06ee5f8a484a 794 }
djmeyers 0:06ee5f8a484a 795 }
djmeyers 0:06ee5f8a484a 796
djmeyers 0:06ee5f8a484a 797 void M2MInterfaceImpl::state_unregister( EventData */*data*/)
djmeyers 0:06ee5f8a484a 798 {
djmeyers 0:06ee5f8a484a 799 tr_debug("M2MInterfaceImpl::state_unregister");
djmeyers 0:06ee5f8a484a 800 internal_event(STATE_SENDING_COAP_DATA);
djmeyers 0:06ee5f8a484a 801 if(!_nsdl_interface.send_unregister_message()) {
djmeyers 0:06ee5f8a484a 802 tr_error("M2MInterfaceImpl::state_unregister : M2MInterface::NotRegistered");
djmeyers 0:06ee5f8a484a 803 internal_event(STATE_IDLE);
djmeyers 0:06ee5f8a484a 804 _observer.error(M2MInterface::NotRegistered);
djmeyers 0:06ee5f8a484a 805 }
djmeyers 0:06ee5f8a484a 806 }
djmeyers 0:06ee5f8a484a 807
djmeyers 0:06ee5f8a484a 808 void M2MInterfaceImpl::state_unregistered( EventData */*data*/)
djmeyers 0:06ee5f8a484a 809 {
djmeyers 0:06ee5f8a484a 810 tr_debug("M2MInterfaceImpl::state_unregistered");
djmeyers 0:06ee5f8a484a 811 internal_event(STATE_IDLE);
djmeyers 0:06ee5f8a484a 812 }
djmeyers 0:06ee5f8a484a 813
djmeyers 0:06ee5f8a484a 814 void M2MInterfaceImpl::state_sending_coap_data( EventData */*data*/)
djmeyers 0:06ee5f8a484a 815 {
djmeyers 0:06ee5f8a484a 816 tr_debug("M2MInterfaceImpl::state_sending_coap_data");
djmeyers 0:06ee5f8a484a 817 internal_event(STATE_WAITING);
djmeyers 0:06ee5f8a484a 818 }
djmeyers 0:06ee5f8a484a 819
djmeyers 0:06ee5f8a484a 820 void M2MInterfaceImpl::state_coap_data_sent( EventData */*data*/)
djmeyers 0:06ee5f8a484a 821 {
djmeyers 0:06ee5f8a484a 822 tr_debug("M2MInterfaceImpl::state_coap_data_sent");
djmeyers 0:06ee5f8a484a 823 internal_event(STATE_WAITING);
djmeyers 0:06ee5f8a484a 824 }
djmeyers 0:06ee5f8a484a 825
djmeyers 0:06ee5f8a484a 826 void M2MInterfaceImpl::state_coap_data_received( EventData *data)
djmeyers 0:06ee5f8a484a 827 {
djmeyers 0:06ee5f8a484a 828 tr_debug("M2MInterfaceImpl::state_coap_data_received");
djmeyers 0:06ee5f8a484a 829 if(data) {
djmeyers 0:06ee5f8a484a 830 ReceivedData *event = static_cast<ReceivedData*> (data);
djmeyers 0:06ee5f8a484a 831 sn_nsdl_addr_s address;
djmeyers 0:06ee5f8a484a 832
djmeyers 0:06ee5f8a484a 833 M2MInterface::NetworkStack stack = event->_address->_stack;
djmeyers 0:06ee5f8a484a 834
djmeyers 0:06ee5f8a484a 835 if(M2MInterface::LwIP_IPv4 == stack) {
djmeyers 0:06ee5f8a484a 836 tr_debug("M2MInterfaceImpl::state_coap_data_received : IPv4 address");
djmeyers 0:06ee5f8a484a 837 address.type = SN_NSDL_ADDRESS_TYPE_IPV4;
djmeyers 0:06ee5f8a484a 838 address.addr_len = 4;
djmeyers 0:06ee5f8a484a 839 } else if((M2MInterface::LwIP_IPv6 == stack) ||
djmeyers 0:06ee5f8a484a 840 (M2MInterface::Nanostack_IPv6 == stack)) {
djmeyers 0:06ee5f8a484a 841 tr_debug("M2MInterfaceImpl::state_coap_data_received : IPv6 address");
djmeyers 0:06ee5f8a484a 842 address.type = SN_NSDL_ADDRESS_TYPE_IPV6;
djmeyers 0:06ee5f8a484a 843 address.addr_len = 16;
djmeyers 0:06ee5f8a484a 844 }
djmeyers 0:06ee5f8a484a 845 address.port = event->_address->_port;
djmeyers 0:06ee5f8a484a 846 address.addr_ptr = (uint8_t*)event->_address->_address;
djmeyers 0:06ee5f8a484a 847 address.addr_len = event->_address->_length;
djmeyers 0:06ee5f8a484a 848
djmeyers 0:06ee5f8a484a 849 // Process received data
djmeyers 0:06ee5f8a484a 850 internal_event(STATE_PROCESSING_COAP_DATA);
djmeyers 0:06ee5f8a484a 851 if(!_nsdl_interface.process_received_data(event->_data,
djmeyers 0:06ee5f8a484a 852 event->_size,
djmeyers 0:06ee5f8a484a 853 &address)) {
djmeyers 0:06ee5f8a484a 854 tr_error("M2MInterfaceImpl::state_coap_data_received : M2MInterface::ResponseParseFailed");
djmeyers 0:06ee5f8a484a 855 _observer.error(M2MInterface::ResponseParseFailed);
djmeyers 0:06ee5f8a484a 856 }
djmeyers 0:06ee5f8a484a 857 }
djmeyers 0:06ee5f8a484a 858 }
djmeyers 0:06ee5f8a484a 859
djmeyers 0:06ee5f8a484a 860 void M2MInterfaceImpl::state_processing_coap_data( EventData */*data*/)
djmeyers 0:06ee5f8a484a 861 {
djmeyers 0:06ee5f8a484a 862 tr_debug("M2MInterfaceImpl::state_processing_coap_data");
djmeyers 0:06ee5f8a484a 863 internal_event(STATE_WAITING);
djmeyers 0:06ee5f8a484a 864 }
djmeyers 0:06ee5f8a484a 865
djmeyers 0:06ee5f8a484a 866 void M2MInterfaceImpl::state_coap_data_processed( EventData */*data*/)
djmeyers 0:06ee5f8a484a 867 {
djmeyers 0:06ee5f8a484a 868 tr_debug("M2MInterfaceImpl::state_coap_data_processed");
djmeyers 0:06ee5f8a484a 869 internal_event(STATE_WAITING);
djmeyers 0:06ee5f8a484a 870 }
djmeyers 0:06ee5f8a484a 871
djmeyers 0:06ee5f8a484a 872 void M2MInterfaceImpl::state_waiting( EventData */*data*/)
djmeyers 0:06ee5f8a484a 873 {
djmeyers 0:06ee5f8a484a 874 tr_debug("M2MInterfaceImpl::state_waiting");
djmeyers 0:06ee5f8a484a 875 }
djmeyers 0:06ee5f8a484a 876
djmeyers 0:06ee5f8a484a 877 // generates an external event. called once per external event
djmeyers 0:06ee5f8a484a 878 // to start the state machine executing
djmeyers 0:06ee5f8a484a 879 void M2MInterfaceImpl::external_event(uint8_t new_state,
djmeyers 0:06ee5f8a484a 880 EventData* p_data)
djmeyers 0:06ee5f8a484a 881 {
djmeyers 0:06ee5f8a484a 882 tr_debug("M2MInterfaceImpl::external_event : new state %d", new_state);
djmeyers 0:06ee5f8a484a 883 // if we are supposed to ignore this event
djmeyers 0:06ee5f8a484a 884 if (new_state == EVENT_IGNORED) {
djmeyers 0:06ee5f8a484a 885 tr_debug("M2MInterfaceImpl::external_event : new state is EVENT_IGNORED");
djmeyers 0:06ee5f8a484a 886 // just delete the event data, if any
djmeyers 0:06ee5f8a484a 887 if (p_data) {
djmeyers 0:06ee5f8a484a 888 delete p_data;
djmeyers 0:06ee5f8a484a 889 p_data = NULL;
djmeyers 0:06ee5f8a484a 890 }
djmeyers 0:06ee5f8a484a 891 _event_ignored = true;
djmeyers 0:06ee5f8a484a 892 }
djmeyers 0:06ee5f8a484a 893 else {
djmeyers 0:06ee5f8a484a 894 tr_debug("M2MInterfaceImpl::external_event : handle new state");
djmeyers 0:06ee5f8a484a 895 // generate the event and execute the state engine
djmeyers 0:06ee5f8a484a 896 internal_event(new_state, p_data);
djmeyers 0:06ee5f8a484a 897 }
djmeyers 0:06ee5f8a484a 898 }
djmeyers 0:06ee5f8a484a 899
djmeyers 0:06ee5f8a484a 900 // generates an internal event. called from within a state
djmeyers 0:06ee5f8a484a 901 // function to transition to a new state
djmeyers 0:06ee5f8a484a 902 void M2MInterfaceImpl::internal_event(uint8_t new_state,
djmeyers 0:06ee5f8a484a 903 EventData* p_data)
djmeyers 0:06ee5f8a484a 904 {
djmeyers 0:06ee5f8a484a 905 tr_debug("M2MInterfaceImpl::internal_event : new state %d", new_state);
djmeyers 0:06ee5f8a484a 906 _event_data = p_data;
djmeyers 0:06ee5f8a484a 907 _event_generated = true;
djmeyers 0:06ee5f8a484a 908 _current_state = new_state;
djmeyers 0:06ee5f8a484a 909 state_engine();
djmeyers 0:06ee5f8a484a 910 }
djmeyers 0:06ee5f8a484a 911
djmeyers 0:06ee5f8a484a 912 // the state engine executes the state machine states
djmeyers 0:06ee5f8a484a 913 void M2MInterfaceImpl::state_engine (void)
djmeyers 0:06ee5f8a484a 914 {
djmeyers 0:06ee5f8a484a 915 tr_debug("M2MInterfaceImpl::state_engine");
djmeyers 0:06ee5f8a484a 916 EventData* p_data_temp = NULL;
djmeyers 0:06ee5f8a484a 917
djmeyers 0:06ee5f8a484a 918 // while events are being generated keep executing states
djmeyers 0:06ee5f8a484a 919 while (_event_generated) {
djmeyers 0:06ee5f8a484a 920 p_data_temp = _event_data; // copy of event data pointer
djmeyers 0:06ee5f8a484a 921 _event_data = NULL; // event data used up, reset ptr
djmeyers 0:06ee5f8a484a 922 _event_generated = false; // event used up, reset flag
djmeyers 0:06ee5f8a484a 923
djmeyers 0:06ee5f8a484a 924 assert(_current_state < _max_states);
djmeyers 0:06ee5f8a484a 925
djmeyers 0:06ee5f8a484a 926 state_function( _current_state, p_data_temp );
djmeyers 0:06ee5f8a484a 927
djmeyers 0:06ee5f8a484a 928 // if event data was used, then delete it
djmeyers 0:06ee5f8a484a 929 if (p_data_temp) {
djmeyers 0:06ee5f8a484a 930 delete p_data_temp;
djmeyers 0:06ee5f8a484a 931 p_data_temp = NULL;
djmeyers 0:06ee5f8a484a 932 }
djmeyers 0:06ee5f8a484a 933 }
djmeyers 0:06ee5f8a484a 934 }
djmeyers 0:06ee5f8a484a 935
djmeyers 0:06ee5f8a484a 936 void M2MInterfaceImpl::state_function( uint8_t current_state, EventData* data )
djmeyers 0:06ee5f8a484a 937 {
djmeyers 0:06ee5f8a484a 938 switch( current_state ) {
djmeyers 0:06ee5f8a484a 939 case STATE_IDLE:
djmeyers 0:06ee5f8a484a 940 M2MInterfaceImpl::state_idle(data);
djmeyers 0:06ee5f8a484a 941 break;
djmeyers 0:06ee5f8a484a 942 case STATE_BOOTSTRAP:
djmeyers 0:06ee5f8a484a 943 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 944 M2MInterfaceImpl::state_bootstrap(data);
djmeyers 0:06ee5f8a484a 945 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 946 break;
djmeyers 0:06ee5f8a484a 947 case STATE_BOOTSTRAP_ADDRESS_RESOLVED:
djmeyers 0:06ee5f8a484a 948 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 949 M2MInterfaceImpl::state_bootstrap_address_resolved(data);
djmeyers 0:06ee5f8a484a 950 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 951 break;
djmeyers 0:06ee5f8a484a 952 case STATE_BOOTSTRAP_RESOURCE_CREATED:
djmeyers 0:06ee5f8a484a 953 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 954 M2MInterfaceImpl::state_bootstrap_resource_created(data);
djmeyers 0:06ee5f8a484a 955 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 956 break;
djmeyers 0:06ee5f8a484a 957 case STATE_BOOTSTRAP_WAIT:
djmeyers 0:06ee5f8a484a 958 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 959 // Do nothing, we're just waiting for data_sent callback
djmeyers 0:06ee5f8a484a 960 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 961 break;
djmeyers 0:06ee5f8a484a 962 case STATE_BOOTSTRAPPED:
djmeyers 0:06ee5f8a484a 963 #ifndef MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 964 M2MInterfaceImpl::state_bootstrapped(data);
djmeyers 0:06ee5f8a484a 965 #endif //MBED_CLIENT_DISABLE_BOOTSTRAP_FEATURE
djmeyers 0:06ee5f8a484a 966 break;
djmeyers 0:06ee5f8a484a 967 case STATE_REGISTER:
djmeyers 0:06ee5f8a484a 968 M2MInterfaceImpl::state_register(data);
djmeyers 0:06ee5f8a484a 969 break;
djmeyers 0:06ee5f8a484a 970 case STATE_REGISTER_ADDRESS_RESOLVED:
djmeyers 0:06ee5f8a484a 971 M2MInterfaceImpl::state_register_address_resolved(data);
djmeyers 0:06ee5f8a484a 972 break;
djmeyers 0:06ee5f8a484a 973 case STATE_REGISTERED:
djmeyers 0:06ee5f8a484a 974 M2MInterfaceImpl::state_registered(data);
djmeyers 0:06ee5f8a484a 975 break;
djmeyers 0:06ee5f8a484a 976 case STATE_UPDATE_REGISTRATION:
djmeyers 0:06ee5f8a484a 977 M2MInterfaceImpl::state_update_registration(data);
djmeyers 0:06ee5f8a484a 978 break;
djmeyers 0:06ee5f8a484a 979 case STATE_UNREGISTER:
djmeyers 0:06ee5f8a484a 980 M2MInterfaceImpl::state_unregister(data);
djmeyers 0:06ee5f8a484a 981 break;
djmeyers 0:06ee5f8a484a 982 case STATE_UNREGISTERED:
djmeyers 0:06ee5f8a484a 983 M2MInterfaceImpl::state_unregistered(data);
djmeyers 0:06ee5f8a484a 984 break;
djmeyers 0:06ee5f8a484a 985 case STATE_SENDING_COAP_DATA:
djmeyers 0:06ee5f8a484a 986 M2MInterfaceImpl::state_sending_coap_data(data);
djmeyers 0:06ee5f8a484a 987 break;
djmeyers 0:06ee5f8a484a 988 case STATE_COAP_DATA_SENT:
djmeyers 0:06ee5f8a484a 989 M2MInterfaceImpl::state_coap_data_sent(data);
djmeyers 0:06ee5f8a484a 990 break;
djmeyers 0:06ee5f8a484a 991 case STATE_COAP_DATA_RECEIVED:
djmeyers 0:06ee5f8a484a 992 M2MInterfaceImpl::state_coap_data_received(data);
djmeyers 0:06ee5f8a484a 993 break;
djmeyers 0:06ee5f8a484a 994 case STATE_PROCESSING_COAP_DATA:
djmeyers 0:06ee5f8a484a 995 M2MInterfaceImpl::state_processing_coap_data(data);
djmeyers 0:06ee5f8a484a 996 break;
djmeyers 0:06ee5f8a484a 997 case STATE_COAP_DATA_PROCESSED:
djmeyers 0:06ee5f8a484a 998 M2MInterfaceImpl::state_coap_data_processed(data);
djmeyers 0:06ee5f8a484a 999 break;
djmeyers 0:06ee5f8a484a 1000 case STATE_WAITING:
djmeyers 0:06ee5f8a484a 1001 M2MInterfaceImpl::state_waiting(data);
djmeyers 0:06ee5f8a484a 1002 break;
djmeyers 0:06ee5f8a484a 1003 }
djmeyers 0:06ee5f8a484a 1004 }
djmeyers 0:06ee5f8a484a 1005
djmeyers 0:06ee5f8a484a 1006 void M2MInterfaceImpl::start_register_update(M2MUpdateRegisterData *data) {
djmeyers 0:06ee5f8a484a 1007 tr_debug("M2MInterfaceImpl::start_register_update - IN");
djmeyers 0:06ee5f8a484a 1008 if(!data || (data->_lifetime != 0 && (data->_lifetime < MINIMUM_REGISTRATION_TIME))) {
djmeyers 0:06ee5f8a484a 1009 _observer.error(M2MInterface::InvalidParameters);
djmeyers 0:06ee5f8a484a 1010 }
djmeyers 0:06ee5f8a484a 1011 BEGIN_TRANSITION_MAP // - Current State -
djmeyers 0:06ee5f8a484a 1012 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_idle
djmeyers 0:06ee5f8a484a 1013 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap
djmeyers 0:06ee5f8a484a 1014 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state__bootstrap_address_resolved
djmeyers 0:06ee5f8a484a 1015 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_resource_created
djmeyers 0:06ee5f8a484a 1016 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_wait
djmeyers 0:06ee5f8a484a 1017 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrapped
djmeyers 0:06ee5f8a484a 1018 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register
djmeyers 0:06ee5f8a484a 1019 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_address_resolved
djmeyers 0:06ee5f8a484a 1020 TRANSITION_MAP_ENTRY (STATE_UPDATE_REGISTRATION) // state_registered
djmeyers 0:06ee5f8a484a 1021 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_update_registration
djmeyers 0:06ee5f8a484a 1022 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregister
djmeyers 0:06ee5f8a484a 1023 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregistered
djmeyers 0:06ee5f8a484a 1024 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_sending_coap_data
djmeyers 0:06ee5f8a484a 1025 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_sent
djmeyers 0:06ee5f8a484a 1026 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_received
djmeyers 0:06ee5f8a484a 1027 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_processing_coap_data
djmeyers 0:06ee5f8a484a 1028 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_processed
djmeyers 0:06ee5f8a484a 1029 TRANSITION_MAP_ENTRY (STATE_UPDATE_REGISTRATION) // state_waiting
djmeyers 0:06ee5f8a484a 1030 END_TRANSITION_MAP(data)
djmeyers 0:06ee5f8a484a 1031 if(_event_ignored) {
djmeyers 0:06ee5f8a484a 1032 _event_ignored = false;
djmeyers 0:06ee5f8a484a 1033 if (!_reconnecting)
djmeyers 0:06ee5f8a484a 1034 _observer.error(M2MInterface::NotAllowed);
djmeyers 0:06ee5f8a484a 1035 }
djmeyers 0:06ee5f8a484a 1036 }