sandbox / mbed-client

Fork of mbed-client by Christopher Haster

Committer:
Christopher Haster
Date:
Fri Jan 22 14:57:00 2016 -0600
Revision:
1:79b6cc67d8b4
Child:
4:ae5178938864
Initial move of mbed-client to mercurial

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Christopher Haster 1:79b6cc67d8b4 1 /*
Christopher Haster 1:79b6cc67d8b4 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
Christopher Haster 1:79b6cc67d8b4 3 * SPDX-License-Identifier: Apache-2.0
Christopher Haster 1:79b6cc67d8b4 4 * Licensed under the Apache License, Version 2.0 (the License); you may
Christopher Haster 1:79b6cc67d8b4 5 * not use this file except in compliance with the License.
Christopher Haster 1:79b6cc67d8b4 6 * You may obtain a copy of the License at
Christopher Haster 1:79b6cc67d8b4 7 *
Christopher Haster 1:79b6cc67d8b4 8 * http://www.apache.org/licenses/LICENSE-2.0
Christopher Haster 1:79b6cc67d8b4 9 *
Christopher Haster 1:79b6cc67d8b4 10 * Unless required by applicable law or agreed to in writing, software
Christopher Haster 1:79b6cc67d8b4 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
Christopher Haster 1:79b6cc67d8b4 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Christopher Haster 1:79b6cc67d8b4 13 * See the License for the specific language governing permissions and
Christopher Haster 1:79b6cc67d8b4 14 * limitations under the License.
Christopher Haster 1:79b6cc67d8b4 15 */
Christopher Haster 1:79b6cc67d8b4 16 #include <assert.h>
Christopher Haster 1:79b6cc67d8b4 17 #include "include/m2minterfaceimpl.h"
Christopher Haster 1:79b6cc67d8b4 18 #include "include/eventdata.h"
Christopher Haster 1:79b6cc67d8b4 19 #include "mbed-client/m2minterfaceobserver.h"
Christopher Haster 1:79b6cc67d8b4 20 #include "mbed-client/m2mconnectionhandler.h"
Christopher Haster 1:79b6cc67d8b4 21 #include "mbed-client/m2mconnectionsecurity.h"
Christopher Haster 1:79b6cc67d8b4 22 #include "include/m2mnsdlinterface.h"
Christopher Haster 1:79b6cc67d8b4 23 #include "mbed-client/m2msecurity.h"
Christopher Haster 1:79b6cc67d8b4 24 #include "mbed-client/m2mconstants.h"
Christopher Haster 1:79b6cc67d8b4 25 #include "mbed-client/m2mtimer.h"
Christopher Haster 1:79b6cc67d8b4 26 #include "ns_trace.h"
Christopher Haster 1:79b6cc67d8b4 27
Christopher Haster 1:79b6cc67d8b4 28 M2MInterfaceImpl::M2MInterfaceImpl(M2MInterfaceObserver& observer,
Christopher Haster 1:79b6cc67d8b4 29 const String &ep_name,
Christopher Haster 1:79b6cc67d8b4 30 const String &ep_type,
Christopher Haster 1:79b6cc67d8b4 31 const int32_t l_time,
Christopher Haster 1:79b6cc67d8b4 32 const uint16_t listen_port,
Christopher Haster 1:79b6cc67d8b4 33 const String &dmn,
Christopher Haster 1:79b6cc67d8b4 34 M2MInterface::BindingMode mode,
Christopher Haster 1:79b6cc67d8b4 35 M2MInterface::NetworkStack stack,
Christopher Haster 1:79b6cc67d8b4 36 const String &con_addr)
Christopher Haster 1:79b6cc67d8b4 37 : _observer(observer),
Christopher Haster 1:79b6cc67d8b4 38 _nsdl_interface(new M2MNsdlInterface(*this)),
Christopher Haster 1:79b6cc67d8b4 39 _current_state(0),
Christopher Haster 1:79b6cc67d8b4 40 _max_states( STATE_MAX_STATES ),
Christopher Haster 1:79b6cc67d8b4 41 _event_generated(false),
Christopher Haster 1:79b6cc67d8b4 42 _event_data(NULL),
Christopher Haster 1:79b6cc67d8b4 43 _endpoint_name(ep_name),
Christopher Haster 1:79b6cc67d8b4 44 _endpoint_type(ep_type),
Christopher Haster 1:79b6cc67d8b4 45 _domain( dmn),
Christopher Haster 1:79b6cc67d8b4 46 _life_time(l_time),
Christopher Haster 1:79b6cc67d8b4 47 _binding_mode(mode),
Christopher Haster 1:79b6cc67d8b4 48 _context_address(con_addr),
Christopher Haster 1:79b6cc67d8b4 49 _listen_port(listen_port),
Christopher Haster 1:79b6cc67d8b4 50 _register_server(NULL),
Christopher Haster 1:79b6cc67d8b4 51 _event_ignored(false),
Christopher Haster 1:79b6cc67d8b4 52 _register_ongoing(false),
Christopher Haster 1:79b6cc67d8b4 53 _update_register_ongoing(false),
Christopher Haster 1:79b6cc67d8b4 54 _queue_sleep_timer(new M2MTimer(*this)),
Christopher Haster 1:79b6cc67d8b4 55 _callback_handler(NULL)
Christopher Haster 1:79b6cc67d8b4 56 {
Christopher Haster 1:79b6cc67d8b4 57 M2MConnectionSecurity::SecurityMode sec_mode = M2MConnectionSecurity::DTLS;
Christopher Haster 1:79b6cc67d8b4 58 //Hack for now
Christopher Haster 1:79b6cc67d8b4 59 if( _binding_mode == M2MInterface::TCP ){
Christopher Haster 1:79b6cc67d8b4 60 _binding_mode = M2MInterface::UDP;
Christopher Haster 1:79b6cc67d8b4 61 sec_mode = M2MConnectionSecurity::TLS;
Christopher Haster 1:79b6cc67d8b4 62 }else if( _binding_mode == M2MInterface::TCP_QUEUE ){
Christopher Haster 1:79b6cc67d8b4 63 _binding_mode = M2MInterface::UDP_QUEUE;
Christopher Haster 1:79b6cc67d8b4 64 sec_mode = M2MConnectionSecurity::TLS;
Christopher Haster 1:79b6cc67d8b4 65 }
Christopher Haster 1:79b6cc67d8b4 66 tr_debug("M2MInterfaceImpl::M2MInterfaceImpl() -IN");
Christopher Haster 1:79b6cc67d8b4 67 _nsdl_interface->create_endpoint(_endpoint_name,
Christopher Haster 1:79b6cc67d8b4 68 _endpoint_type,
Christopher Haster 1:79b6cc67d8b4 69 _life_time,
Christopher Haster 1:79b6cc67d8b4 70 _domain,
Christopher Haster 1:79b6cc67d8b4 71 (uint8_t)_binding_mode,
Christopher Haster 1:79b6cc67d8b4 72 _context_address);
Christopher Haster 1:79b6cc67d8b4 73
Christopher Haster 1:79b6cc67d8b4 74 //Here we must use TCP still
Christopher Haster 1:79b6cc67d8b4 75 _connection_handler = new M2MConnectionHandler(*this, new M2MConnectionSecurity(sec_mode), mode, stack);
Christopher Haster 1:79b6cc67d8b4 76
Christopher Haster 1:79b6cc67d8b4 77 _connection_handler->bind_connection(_listen_port);
Christopher Haster 1:79b6cc67d8b4 78 tr_debug("M2MInterfaceImpl::M2MInterfaceImpl() -OUT");
Christopher Haster 1:79b6cc67d8b4 79 }
Christopher Haster 1:79b6cc67d8b4 80
Christopher Haster 1:79b6cc67d8b4 81
Christopher Haster 1:79b6cc67d8b4 82 M2MInterfaceImpl::~M2MInterfaceImpl()
Christopher Haster 1:79b6cc67d8b4 83 {
Christopher Haster 1:79b6cc67d8b4 84 tr_debug("M2MInterfaceImpl::~M2MInterfaceImpl() - IN");
Christopher Haster 1:79b6cc67d8b4 85 delete _queue_sleep_timer;
Christopher Haster 1:79b6cc67d8b4 86 delete _nsdl_interface;
Christopher Haster 1:79b6cc67d8b4 87 _connection_handler->stop_listening();
Christopher Haster 1:79b6cc67d8b4 88 delete _connection_handler;
Christopher Haster 1:79b6cc67d8b4 89 tr_debug("M2MInterfaceImpl::~M2MInterfaceImpl() - OUT");
Christopher Haster 1:79b6cc67d8b4 90 }
Christopher Haster 1:79b6cc67d8b4 91
Christopher Haster 1:79b6cc67d8b4 92 void M2MInterfaceImpl::bootstrap(M2MSecurity *security)
Christopher Haster 1:79b6cc67d8b4 93 {
Christopher Haster 1:79b6cc67d8b4 94 tr_debug("M2MInterfaceImpl::bootstrap(M2MSecurity *security) - IN");
Christopher Haster 1:79b6cc67d8b4 95 // Transition to a new state based upon
Christopher Haster 1:79b6cc67d8b4 96 // the current state of the state machine
Christopher Haster 1:79b6cc67d8b4 97 M2MSecurityData* data = new M2MSecurityData();
Christopher Haster 1:79b6cc67d8b4 98 data->_object = security;
Christopher Haster 1:79b6cc67d8b4 99 BEGIN_TRANSITION_MAP // - Current State -
Christopher Haster 1:79b6cc67d8b4 100 TRANSITION_MAP_ENTRY (STATE_BOOTSTRAP) // state_idle
Christopher Haster 1:79b6cc67d8b4 101 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap
Christopher Haster 1:79b6cc67d8b4 102 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state__bootstrap_address_resolved
Christopher Haster 1:79b6cc67d8b4 103 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_resource_created
Christopher Haster 1:79b6cc67d8b4 104 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrapped
Christopher Haster 1:79b6cc67d8b4 105 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register
Christopher Haster 1:79b6cc67d8b4 106 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_address_resolved
Christopher Haster 1:79b6cc67d8b4 107 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_resource_created
Christopher Haster 1:79b6cc67d8b4 108 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_registered
Christopher Haster 1:79b6cc67d8b4 109 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_update_registration
Christopher Haster 1:79b6cc67d8b4 110 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregister
Christopher Haster 1:79b6cc67d8b4 111 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregistered
Christopher Haster 1:79b6cc67d8b4 112 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_sending_coap_data
Christopher Haster 1:79b6cc67d8b4 113 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_sent
Christopher Haster 1:79b6cc67d8b4 114 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_received
Christopher Haster 1:79b6cc67d8b4 115 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_processing_coap_data
Christopher Haster 1:79b6cc67d8b4 116 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_processed
Christopher Haster 1:79b6cc67d8b4 117 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_waiting
Christopher Haster 1:79b6cc67d8b4 118 END_TRANSITION_MAP(data)
Christopher Haster 1:79b6cc67d8b4 119 if(_event_ignored) {
Christopher Haster 1:79b6cc67d8b4 120 _event_ignored = false;
Christopher Haster 1:79b6cc67d8b4 121 _observer.error(M2MInterface::NotAllowed);
Christopher Haster 1:79b6cc67d8b4 122 }
Christopher Haster 1:79b6cc67d8b4 123 tr_debug("M2MInterfaceImpl::bootstrap(M2MSecurity *security) - OUT");
Christopher Haster 1:79b6cc67d8b4 124 }
Christopher Haster 1:79b6cc67d8b4 125
Christopher Haster 1:79b6cc67d8b4 126 void M2MInterfaceImpl::cancel_bootstrap()
Christopher Haster 1:79b6cc67d8b4 127 {
Christopher Haster 1:79b6cc67d8b4 128 //TODO: Do we need this ?
Christopher Haster 1:79b6cc67d8b4 129 }
Christopher Haster 1:79b6cc67d8b4 130
Christopher Haster 1:79b6cc67d8b4 131 void M2MInterfaceImpl::register_object(M2MSecurity *security, const M2MObjectList &object_list)
Christopher Haster 1:79b6cc67d8b4 132 {
Christopher Haster 1:79b6cc67d8b4 133 tr_debug("M2MInterfaceImpl::register_object(M2MSecurity *security,const M2MObjectList &object_list) - IN");
Christopher Haster 1:79b6cc67d8b4 134 // Transition to a new state based upon
Christopher Haster 1:79b6cc67d8b4 135 // the current state of the state machine
Christopher Haster 1:79b6cc67d8b4 136 //TODO: manage register object in a list.
Christopher Haster 1:79b6cc67d8b4 137 if(!_register_ongoing) {
Christopher Haster 1:79b6cc67d8b4 138 _register_ongoing = true;
Christopher Haster 1:79b6cc67d8b4 139 _register_server = security;
Christopher Haster 1:79b6cc67d8b4 140 M2MRegisterData *data = new M2MRegisterData();
Christopher Haster 1:79b6cc67d8b4 141 data->_object = security;
Christopher Haster 1:79b6cc67d8b4 142 data->_object_list = object_list;
Christopher Haster 1:79b6cc67d8b4 143 BEGIN_TRANSITION_MAP // - Current State -
Christopher Haster 1:79b6cc67d8b4 144 TRANSITION_MAP_ENTRY (STATE_REGISTER) // state_idle
Christopher Haster 1:79b6cc67d8b4 145 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap
Christopher Haster 1:79b6cc67d8b4 146 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state__bootstrap_address_resolved
Christopher Haster 1:79b6cc67d8b4 147 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_resource_created
Christopher Haster 1:79b6cc67d8b4 148 TRANSITION_MAP_ENTRY (STATE_REGISTER) // state_bootstrapped
Christopher Haster 1:79b6cc67d8b4 149 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register
Christopher Haster 1:79b6cc67d8b4 150 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_address_resolved
Christopher Haster 1:79b6cc67d8b4 151 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_resource_created
Christopher Haster 1:79b6cc67d8b4 152 TRANSITION_MAP_ENTRY (STATE_REGISTER) // state_registered
Christopher Haster 1:79b6cc67d8b4 153 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_update_registration
Christopher Haster 1:79b6cc67d8b4 154 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregister
Christopher Haster 1:79b6cc67d8b4 155 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregistered
Christopher Haster 1:79b6cc67d8b4 156 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_sending_coap_data
Christopher Haster 1:79b6cc67d8b4 157 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_sent
Christopher Haster 1:79b6cc67d8b4 158 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_received
Christopher Haster 1:79b6cc67d8b4 159 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_processing_coap_data
Christopher Haster 1:79b6cc67d8b4 160 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_processed
Christopher Haster 1:79b6cc67d8b4 161 TRANSITION_MAP_ENTRY (STATE_REGISTER) // state_waiting
Christopher Haster 1:79b6cc67d8b4 162 END_TRANSITION_MAP(data)
Christopher Haster 1:79b6cc67d8b4 163 if(_event_ignored) {
Christopher Haster 1:79b6cc67d8b4 164 _event_ignored = false;
Christopher Haster 1:79b6cc67d8b4 165 _observer.error(M2MInterface::NotAllowed);
Christopher Haster 1:79b6cc67d8b4 166 }
Christopher Haster 1:79b6cc67d8b4 167 } else {
Christopher Haster 1:79b6cc67d8b4 168 tr_debug("M2MInterfaceImpl::register_object(M2MSecurity *security,const M2MObjectList &object_list) - NOT ALLOWED");
Christopher Haster 1:79b6cc67d8b4 169 _observer.error(M2MInterface::NotAllowed);
Christopher Haster 1:79b6cc67d8b4 170 }
Christopher Haster 1:79b6cc67d8b4 171 tr_debug("M2MInterfaceImpl::register_object(M2MSecurity *security,const M2MObjectList &object_list) - OUT");
Christopher Haster 1:79b6cc67d8b4 172 }
Christopher Haster 1:79b6cc67d8b4 173
Christopher Haster 1:79b6cc67d8b4 174 void M2MInterfaceImpl::update_registration(M2MSecurity *security_object, const uint32_t lifetime)
Christopher Haster 1:79b6cc67d8b4 175 {
Christopher Haster 1:79b6cc67d8b4 176 tr_debug("M2MInterfaceImpl::update_registration(M2MSecurity *security,const uint32_t lifetime) - IN");
Christopher Haster 1:79b6cc67d8b4 177 // Transition to a new state based upon
Christopher Haster 1:79b6cc67d8b4 178 // the current state of the state machine
Christopher Haster 1:79b6cc67d8b4 179 if(lifetime != 0 && (lifetime < MINIMUM_REGISTRATION_TIME)) {
Christopher Haster 1:79b6cc67d8b4 180 _observer.error(M2MInterface::InvalidParameters);
Christopher Haster 1:79b6cc67d8b4 181 } else if(!_update_register_ongoing){
Christopher Haster 1:79b6cc67d8b4 182 _update_register_ongoing = true;
Christopher Haster 1:79b6cc67d8b4 183 M2MUpdateRegisterData *data = new M2MUpdateRegisterData();
Christopher Haster 1:79b6cc67d8b4 184 data->_object = security_object;
Christopher Haster 1:79b6cc67d8b4 185 data->_lifetime = lifetime;
Christopher Haster 1:79b6cc67d8b4 186 BEGIN_TRANSITION_MAP // - Current State -
Christopher Haster 1:79b6cc67d8b4 187 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_idle
Christopher Haster 1:79b6cc67d8b4 188 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap
Christopher Haster 1:79b6cc67d8b4 189 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state__bootstrap_address_resolved
Christopher Haster 1:79b6cc67d8b4 190 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_resource_created
Christopher Haster 1:79b6cc67d8b4 191 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrapped
Christopher Haster 1:79b6cc67d8b4 192 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register
Christopher Haster 1:79b6cc67d8b4 193 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_address_resolved
Christopher Haster 1:79b6cc67d8b4 194 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_resource_created
Christopher Haster 1:79b6cc67d8b4 195 TRANSITION_MAP_ENTRY (STATE_UPDATE_REGISTRATION) // state_registered
Christopher Haster 1:79b6cc67d8b4 196 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_update_registration
Christopher Haster 1:79b6cc67d8b4 197 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregister
Christopher Haster 1:79b6cc67d8b4 198 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregistered
Christopher Haster 1:79b6cc67d8b4 199 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_sending_coap_data
Christopher Haster 1:79b6cc67d8b4 200 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_sent
Christopher Haster 1:79b6cc67d8b4 201 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_received
Christopher Haster 1:79b6cc67d8b4 202 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_processing_coap_data
Christopher Haster 1:79b6cc67d8b4 203 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_processed
Christopher Haster 1:79b6cc67d8b4 204 TRANSITION_MAP_ENTRY (STATE_UPDATE_REGISTRATION) // state_waiting
Christopher Haster 1:79b6cc67d8b4 205 END_TRANSITION_MAP(data)
Christopher Haster 1:79b6cc67d8b4 206 if(_event_ignored) {
Christopher Haster 1:79b6cc67d8b4 207 _event_ignored = false;
Christopher Haster 1:79b6cc67d8b4 208 _observer.error(M2MInterface::NotAllowed);
Christopher Haster 1:79b6cc67d8b4 209 }
Christopher Haster 1:79b6cc67d8b4 210 } else {
Christopher Haster 1:79b6cc67d8b4 211 tr_debug("M2MInterfaceImpl::update_registration(M2MSecurity *security,const M2MObjectList &object_list) - NOT ALLOWED");
Christopher Haster 1:79b6cc67d8b4 212 _observer.error(M2MInterface::NotAllowed);
Christopher Haster 1:79b6cc67d8b4 213 }
Christopher Haster 1:79b6cc67d8b4 214 tr_debug("M2MInterfaceImpl::update_registration(M2MSecurity *security,const uint32_t lifetime) - OUT");
Christopher Haster 1:79b6cc67d8b4 215 }
Christopher Haster 1:79b6cc67d8b4 216
Christopher Haster 1:79b6cc67d8b4 217 void M2MInterfaceImpl::unregister_object(M2MSecurity* /*security*/)
Christopher Haster 1:79b6cc67d8b4 218 {
Christopher Haster 1:79b6cc67d8b4 219 tr_debug("M2MInterfaceImpl::unregister_object(M2MSecurity *security) - IN");
Christopher Haster 1:79b6cc67d8b4 220 // Transition to a new state based upon
Christopher Haster 1:79b6cc67d8b4 221 // the current state of the state machine
Christopher Haster 1:79b6cc67d8b4 222 BEGIN_TRANSITION_MAP // - Current State -
Christopher Haster 1:79b6cc67d8b4 223 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_idle
Christopher Haster 1:79b6cc67d8b4 224 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap
Christopher Haster 1:79b6cc67d8b4 225 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state__bootstrap_address_resolved
Christopher Haster 1:79b6cc67d8b4 226 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrap_resource_created
Christopher Haster 1:79b6cc67d8b4 227 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_bootstrapped
Christopher Haster 1:79b6cc67d8b4 228 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register
Christopher Haster 1:79b6cc67d8b4 229 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_address_resolved
Christopher Haster 1:79b6cc67d8b4 230 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_register_resource_created
Christopher Haster 1:79b6cc67d8b4 231 TRANSITION_MAP_ENTRY (STATE_UNREGISTER) // state_registered
Christopher Haster 1:79b6cc67d8b4 232 TRANSITION_MAP_ENTRY (STATE_UNREGISTER) // state_update_registration
Christopher Haster 1:79b6cc67d8b4 233 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregister
Christopher Haster 1:79b6cc67d8b4 234 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_unregistered
Christopher Haster 1:79b6cc67d8b4 235 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_sending_coap_data
Christopher Haster 1:79b6cc67d8b4 236 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_sent
Christopher Haster 1:79b6cc67d8b4 237 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_received
Christopher Haster 1:79b6cc67d8b4 238 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_processing_coap_data
Christopher Haster 1:79b6cc67d8b4 239 TRANSITION_MAP_ENTRY (EVENT_IGNORED) // state_coap_data_processed
Christopher Haster 1:79b6cc67d8b4 240 TRANSITION_MAP_ENTRY (STATE_UNREGISTER) // state_waiting
Christopher Haster 1:79b6cc67d8b4 241 END_TRANSITION_MAP(NULL)
Christopher Haster 1:79b6cc67d8b4 242 if(_event_ignored) {
Christopher Haster 1:79b6cc67d8b4 243 _event_ignored = false;
Christopher Haster 1:79b6cc67d8b4 244 _observer.error(M2MInterface::NotAllowed);
Christopher Haster 1:79b6cc67d8b4 245 }
Christopher Haster 1:79b6cc67d8b4 246 tr_debug("M2MInterfaceImpl::unregister_object(M2MSecurity *security) - OUT");
Christopher Haster 1:79b6cc67d8b4 247 }
Christopher Haster 1:79b6cc67d8b4 248
Christopher Haster 1:79b6cc67d8b4 249 void M2MInterfaceImpl::set_queue_sleep_handler(callback_handler handler)
Christopher Haster 1:79b6cc67d8b4 250 {
Christopher Haster 1:79b6cc67d8b4 251 tr_debug("M2MInterfaceImpl::set_queue_sleep_handler()");
Christopher Haster 1:79b6cc67d8b4 252 _callback_handler = handler;
Christopher Haster 1:79b6cc67d8b4 253 }
Christopher Haster 1:79b6cc67d8b4 254
Christopher Haster 1:79b6cc67d8b4 255 void M2MInterfaceImpl::coap_message_ready(uint8_t *data_ptr,
Christopher Haster 1:79b6cc67d8b4 256 uint16_t data_len,
Christopher Haster 1:79b6cc67d8b4 257 sn_nsdl_addr_s *address_ptr)
Christopher Haster 1:79b6cc67d8b4 258 {
Christopher Haster 1:79b6cc67d8b4 259 tr_debug("M2MInterfaceImpl::coap_message_ready(uint8_t *data_ptr,uint16_t data_len,sn_nsdl_addr_s *address_ptr)");
Christopher Haster 1:79b6cc67d8b4 260 internal_event(STATE_SENDING_COAP_DATA);
Christopher Haster 1:79b6cc67d8b4 261 if(!_connection_handler->send_data(data_ptr,data_len,address_ptr)) {
Christopher Haster 1:79b6cc67d8b4 262 internal_event( STATE_IDLE);
Christopher Haster 1:79b6cc67d8b4 263 tr_error("M2MInterfaceImpl::coap_message_ready() - M2MInterface::NetworkError");
Christopher Haster 1:79b6cc67d8b4 264 _observer.error(M2MInterface::NetworkError);
Christopher Haster 1:79b6cc67d8b4 265 }
Christopher Haster 1:79b6cc67d8b4 266 }
Christopher Haster 1:79b6cc67d8b4 267
Christopher Haster 1:79b6cc67d8b4 268 void M2MInterfaceImpl::client_registered(M2MServer *server_object)
Christopher Haster 1:79b6cc67d8b4 269 {
Christopher Haster 1:79b6cc67d8b4 270 tr_debug("M2MInterfaceImpl::client_registered(M2MServer *server_object)");
Christopher Haster 1:79b6cc67d8b4 271 internal_event(STATE_REGISTERED);
Christopher Haster 1:79b6cc67d8b4 272 //Inform client is registered.
Christopher Haster 1:79b6cc67d8b4 273 //TODO: manage register object in a list.
Christopher Haster 1:79b6cc67d8b4 274 _observer.object_registered(_register_server,*server_object);
Christopher Haster 1:79b6cc67d8b4 275 }
Christopher Haster 1:79b6cc67d8b4 276
Christopher Haster 1:79b6cc67d8b4 277 void M2MInterfaceImpl::registration_updated(const M2MServer &server_object)
Christopher Haster 1:79b6cc67d8b4 278 {
Christopher Haster 1:79b6cc67d8b4 279 tr_debug("M2MInterfaceImpl::registration_updated(const M2MServer &server_object)");
Christopher Haster 1:79b6cc67d8b4 280 internal_event(STATE_REGISTERED);
Christopher Haster 1:79b6cc67d8b4 281 _observer.registration_updated(_register_server,server_object);
Christopher Haster 1:79b6cc67d8b4 282 }
Christopher Haster 1:79b6cc67d8b4 283
Christopher Haster 1:79b6cc67d8b4 284
Christopher Haster 1:79b6cc67d8b4 285 void M2MInterfaceImpl::registration_error(uint8_t error_code)
Christopher Haster 1:79b6cc67d8b4 286 {
Christopher Haster 1:79b6cc67d8b4 287 tr_debug("M2MInterfaceImpl::registration_error(uint8_t error_code) %d", error_code);
Christopher Haster 1:79b6cc67d8b4 288 internal_event(STATE_IDLE);
Christopher Haster 1:79b6cc67d8b4 289 _observer.error((M2MInterface::Error)error_code);
Christopher Haster 1:79b6cc67d8b4 290 }
Christopher Haster 1:79b6cc67d8b4 291
Christopher Haster 1:79b6cc67d8b4 292 void M2MInterfaceImpl::client_unregistered()
Christopher Haster 1:79b6cc67d8b4 293 {
Christopher Haster 1:79b6cc67d8b4 294 tr_debug("M2MInterfaceImpl::client_unregistered()");
Christopher Haster 1:79b6cc67d8b4 295 internal_event(STATE_UNREGISTERED);
Christopher Haster 1:79b6cc67d8b4 296 //TODO: manage register object in a list.
Christopher Haster 1:79b6cc67d8b4 297 _observer.object_unregistered(_register_server);
Christopher Haster 1:79b6cc67d8b4 298 }
Christopher Haster 1:79b6cc67d8b4 299
Christopher Haster 1:79b6cc67d8b4 300 void M2MInterfaceImpl::bootstrap_done(M2MSecurity *security_object)
Christopher Haster 1:79b6cc67d8b4 301 {
Christopher Haster 1:79b6cc67d8b4 302 tr_debug("M2MInterfaceImpl::bootstrap_done(M2MSecurity *security_object)");
Christopher Haster 1:79b6cc67d8b4 303 internal_event(STATE_BOOTSTRAPPED);
Christopher Haster 1:79b6cc67d8b4 304 _observer.bootstrap_done(security_object);
Christopher Haster 1:79b6cc67d8b4 305 }
Christopher Haster 1:79b6cc67d8b4 306
Christopher Haster 1:79b6cc67d8b4 307 void M2MInterfaceImpl::bootstrap_error()
Christopher Haster 1:79b6cc67d8b4 308 {
Christopher Haster 1:79b6cc67d8b4 309 tr_debug("M2MInterfaceImpl::bootstrap_error()");
Christopher Haster 1:79b6cc67d8b4 310 internal_event(STATE_IDLE);
Christopher Haster 1:79b6cc67d8b4 311 _observer.error(M2MInterface::BootstrapFailed);
Christopher Haster 1:79b6cc67d8b4 312 }
Christopher Haster 1:79b6cc67d8b4 313
Christopher Haster 1:79b6cc67d8b4 314 void M2MInterfaceImpl::coap_data_processed()
Christopher Haster 1:79b6cc67d8b4 315 {
Christopher Haster 1:79b6cc67d8b4 316 tr_debug("M2MInterfaceImpl::coap_data_processed()");
Christopher Haster 1:79b6cc67d8b4 317 internal_event(STATE_COAP_DATA_PROCESSED);
Christopher Haster 1:79b6cc67d8b4 318 }
Christopher Haster 1:79b6cc67d8b4 319
Christopher Haster 1:79b6cc67d8b4 320 void M2MInterfaceImpl::value_updated(M2MBase *base)
Christopher Haster 1:79b6cc67d8b4 321 {
Christopher Haster 1:79b6cc67d8b4 322 tr_debug("M2MInterfaceImpl::value_updated(M2MBase *base)");
Christopher Haster 1:79b6cc67d8b4 323 if(base) {
Christopher Haster 1:79b6cc67d8b4 324 M2MBase::BaseType type = base->base_type();
Christopher Haster 1:79b6cc67d8b4 325 _observer.value_updated(base, type);
Christopher Haster 1:79b6cc67d8b4 326 }
Christopher Haster 1:79b6cc67d8b4 327 }
Christopher Haster 1:79b6cc67d8b4 328
Christopher Haster 1:79b6cc67d8b4 329 void M2MInterfaceImpl::data_available(uint8_t* data,
Christopher Haster 1:79b6cc67d8b4 330 uint16_t data_size,
Christopher Haster 1:79b6cc67d8b4 331 const M2MConnectionObserver::SocketAddress &address)
Christopher Haster 1:79b6cc67d8b4 332 {
Christopher Haster 1:79b6cc67d8b4 333 tr_debug("M2MInterfaceImpl::data_available(uint8_t* data,uint16_t data_size,const M2MConnectionObserver::SocketAddress &address)");
Christopher Haster 1:79b6cc67d8b4 334 ReceivedData *event = new ReceivedData();
Christopher Haster 1:79b6cc67d8b4 335 event->_data = data;
Christopher Haster 1:79b6cc67d8b4 336 event->_size = data_size;
Christopher Haster 1:79b6cc67d8b4 337 event->_address = &address;
Christopher Haster 1:79b6cc67d8b4 338 internal_event(STATE_COAP_DATA_RECEIVED, event);
Christopher Haster 1:79b6cc67d8b4 339 }
Christopher Haster 1:79b6cc67d8b4 340
Christopher Haster 1:79b6cc67d8b4 341 void M2MInterfaceImpl::socket_error(uint8_t /*error_code*/)
Christopher Haster 1:79b6cc67d8b4 342 {
Christopher Haster 1:79b6cc67d8b4 343 tr_debug("M2MInterfaceImpl::socket_error(uint8_t error_code)");
Christopher Haster 1:79b6cc67d8b4 344 internal_event(STATE_IDLE);
Christopher Haster 1:79b6cc67d8b4 345 M2MInterface::Error error = M2MInterface::NetworkError;
Christopher Haster 1:79b6cc67d8b4 346 _observer.error(error);
Christopher Haster 1:79b6cc67d8b4 347 }
Christopher Haster 1:79b6cc67d8b4 348
Christopher Haster 1:79b6cc67d8b4 349 void M2MInterfaceImpl::address_ready(const M2MConnectionObserver::SocketAddress &address,
Christopher Haster 1:79b6cc67d8b4 350 M2MConnectionObserver::ServerType server_type,
Christopher Haster 1:79b6cc67d8b4 351 const uint16_t server_port)
Christopher Haster 1:79b6cc67d8b4 352 {
Christopher Haster 1:79b6cc67d8b4 353 tr_debug("M2MInterfaceImpl::address_ready(const M2MConnectionObserver::SocketAddress ,M2MConnectionObserver::ServerType,const uint16_t)");
Christopher Haster 1:79b6cc67d8b4 354 ResolvedAddressData *data = new ResolvedAddressData();
Christopher Haster 1:79b6cc67d8b4 355 data->_address = &address;
Christopher Haster 1:79b6cc67d8b4 356 data->_port = server_port;
Christopher Haster 1:79b6cc67d8b4 357 if( M2MConnectionObserver::Bootstrap == server_type) {
Christopher Haster 1:79b6cc67d8b4 358 tr_debug("M2MInterfaceImpl::address_ready() Server Type Bootstrap");
Christopher Haster 1:79b6cc67d8b4 359 internal_event(STATE_BOOTSTRAP_ADDRESS_RESOLVED, data);
Christopher Haster 1:79b6cc67d8b4 360 } else {
Christopher Haster 1:79b6cc67d8b4 361 tr_debug("M2MInterfaceImpl::address_ready() Server Type LWM2M");
Christopher Haster 1:79b6cc67d8b4 362 internal_event(STATE_REGISTER_ADDRESS_RESOLVED, data);
Christopher Haster 1:79b6cc67d8b4 363 }
Christopher Haster 1:79b6cc67d8b4 364 }
Christopher Haster 1:79b6cc67d8b4 365
Christopher Haster 1:79b6cc67d8b4 366 void M2MInterfaceImpl::data_sent()
Christopher Haster 1:79b6cc67d8b4 367 {
Christopher Haster 1:79b6cc67d8b4 368 tr_debug("M2MInterfaceImpl::data_sent()");
Christopher Haster 1:79b6cc67d8b4 369 if(_binding_mode == M2MInterface::UDP_QUEUE ||
Christopher Haster 1:79b6cc67d8b4 370 _binding_mode == M2MInterface::TCP_QUEUE ||
Christopher Haster 1:79b6cc67d8b4 371 _binding_mode == M2MInterface::SMS_QUEUE ||
Christopher Haster 1:79b6cc67d8b4 372 _binding_mode == M2MInterface::UDP_SMS_QUEUE) {
Christopher Haster 1:79b6cc67d8b4 373 if(_callback_handler) {
Christopher Haster 1:79b6cc67d8b4 374 _queue_sleep_timer->stop_timer();
Christopher Haster 1:79b6cc67d8b4 375 _queue_sleep_timer->start_timer(RETRY_COUNT*RETRY_INTERVAL*1000, M2MTimerObserver::QueueSleep);
Christopher Haster 1:79b6cc67d8b4 376 }
Christopher Haster 1:79b6cc67d8b4 377 }
Christopher Haster 1:79b6cc67d8b4 378 internal_event(STATE_COAP_DATA_SENT);
Christopher Haster 1:79b6cc67d8b4 379 }
Christopher Haster 1:79b6cc67d8b4 380
Christopher Haster 1:79b6cc67d8b4 381 void M2MInterfaceImpl::timer_expired(M2MTimerObserver::Type type)
Christopher Haster 1:79b6cc67d8b4 382 {
Christopher Haster 1:79b6cc67d8b4 383 tr_debug("M2MInterfaceImpl::timer_expired()");
Christopher Haster 1:79b6cc67d8b4 384 if(M2MTimerObserver::QueueSleep == type) {
Christopher Haster 1:79b6cc67d8b4 385 if(_callback_handler) {
Christopher Haster 1:79b6cc67d8b4 386 _callback_handler();
Christopher Haster 1:79b6cc67d8b4 387 }
Christopher Haster 1:79b6cc67d8b4 388 _queue_sleep_timer->stop_timer();
Christopher Haster 1:79b6cc67d8b4 389 }
Christopher Haster 1:79b6cc67d8b4 390 }
Christopher Haster 1:79b6cc67d8b4 391
Christopher Haster 1:79b6cc67d8b4 392 // state machine sits here.
Christopher Haster 1:79b6cc67d8b4 393 void M2MInterfaceImpl::state_idle(EventData* /*data*/)
Christopher Haster 1:79b6cc67d8b4 394 {
Christopher Haster 1:79b6cc67d8b4 395 // Handle Idle state here
Christopher Haster 1:79b6cc67d8b4 396 // Cleanup all resources, if necessary
Christopher Haster 1:79b6cc67d8b4 397 _connection_handler->stop_listening();
Christopher Haster 1:79b6cc67d8b4 398 _nsdl_interface->stop_timers();
Christopher Haster 1:79b6cc67d8b4 399 _register_ongoing = false;
Christopher Haster 1:79b6cc67d8b4 400 _update_register_ongoing = false;
Christopher Haster 1:79b6cc67d8b4 401 tr_debug("M2MInterfaceImpl::state_idle");
Christopher Haster 1:79b6cc67d8b4 402 }
Christopher Haster 1:79b6cc67d8b4 403
Christopher Haster 1:79b6cc67d8b4 404 void M2MInterfaceImpl::state_bootstrap( EventData *data)
Christopher Haster 1:79b6cc67d8b4 405 {
Christopher Haster 1:79b6cc67d8b4 406 tr_debug("M2MInterfaceImpl::state_bootstrap");
Christopher Haster 1:79b6cc67d8b4 407 // Start with bootstrapping preparation
Christopher Haster 1:79b6cc67d8b4 408 bool success = false;
Christopher Haster 1:79b6cc67d8b4 409 if(data) {
Christopher Haster 1:79b6cc67d8b4 410 M2MSecurityData *event = (M2MSecurityData *)data;
Christopher Haster 1:79b6cc67d8b4 411 M2MSecurity *security = event->_object;
Christopher Haster 1:79b6cc67d8b4 412 if(security) {
Christopher Haster 1:79b6cc67d8b4 413 if(M2MSecurity::Bootstrap == security->server_type()) {
Christopher Haster 1:79b6cc67d8b4 414 tr_debug("M2MInterfaceImpl::state_bootstrap - server_type : M2MSecurity::Bootstrap");
Christopher Haster 1:79b6cc67d8b4 415 String server_address = security->resource_value_string(M2MSecurity::M2MServerUri);
Christopher Haster 1:79b6cc67d8b4 416 tr_debug("M2MInterfaceImpl::state_bootstrap - server_address %s", server_address.c_str());
Christopher Haster 1:79b6cc67d8b4 417 String ip_address;
Christopher Haster 1:79b6cc67d8b4 418 uint16_t port;
Christopher Haster 1:79b6cc67d8b4 419 if(server_address.compare(0,COAP.size(),COAP) == 0) {
Christopher Haster 1:79b6cc67d8b4 420 server_address = server_address.substr(COAP.size(),
Christopher Haster 1:79b6cc67d8b4 421 server_address.size()-COAP.size());
Christopher Haster 1:79b6cc67d8b4 422 int colonFound = server_address.find_last_of(':');
Christopher Haster 1:79b6cc67d8b4 423 if(colonFound != -1) {
Christopher Haster 1:79b6cc67d8b4 424 ip_address = server_address.substr(0,colonFound);
Christopher Haster 1:79b6cc67d8b4 425 port = atoi(server_address.substr(colonFound+1,
Christopher Haster 1:79b6cc67d8b4 426 server_address.size()-ip_address.size()).c_str());
Christopher Haster 1:79b6cc67d8b4 427
Christopher Haster 1:79b6cc67d8b4 428 tr_debug("M2MInterfaceImpl::state_bootstrap - IP address %s , Port %d", ip_address.c_str(), port);
Christopher Haster 1:79b6cc67d8b4 429 // If bind and resolving server address succeed then proceed else
Christopher Haster 1:79b6cc67d8b4 430 // return error to the application and go to Idle state.
Christopher Haster 1:79b6cc67d8b4 431 if(_connection_handler->resolve_server_address(ip_address,
Christopher Haster 1:79b6cc67d8b4 432 port,
Christopher Haster 1:79b6cc67d8b4 433 M2MConnectionObserver::Bootstrap,
Christopher Haster 1:79b6cc67d8b4 434 security)) {
Christopher Haster 1:79b6cc67d8b4 435 tr_debug("M2MInterfaceImpl::state_bootstrap - resolve_server_address - success");
Christopher Haster 1:79b6cc67d8b4 436 success = true;
Christopher Haster 1:79b6cc67d8b4 437 }
Christopher Haster 1:79b6cc67d8b4 438 }
Christopher Haster 1:79b6cc67d8b4 439 }
Christopher Haster 1:79b6cc67d8b4 440 }
Christopher Haster 1:79b6cc67d8b4 441 }
Christopher Haster 1:79b6cc67d8b4 442 }
Christopher Haster 1:79b6cc67d8b4 443 if(!success) {
Christopher Haster 1:79b6cc67d8b4 444 tr_error("M2MInterfaceImpl::state_bootstrap - M2MInterface::InvalidParameters");
Christopher Haster 1:79b6cc67d8b4 445 _observer.error(M2MInterface::InvalidParameters);
Christopher Haster 1:79b6cc67d8b4 446 internal_event(STATE_IDLE);
Christopher Haster 1:79b6cc67d8b4 447 }
Christopher Haster 1:79b6cc67d8b4 448 }
Christopher Haster 1:79b6cc67d8b4 449
Christopher Haster 1:79b6cc67d8b4 450 void M2MInterfaceImpl::state_bootstrap_address_resolved( EventData *data)
Christopher Haster 1:79b6cc67d8b4 451 {
Christopher Haster 1:79b6cc67d8b4 452 tr_debug("M2MInterfaceImpl::state_bootstrap_address_resolved");
Christopher Haster 1:79b6cc67d8b4 453 ResolvedAddressData *event = (ResolvedAddressData *)data;
Christopher Haster 1:79b6cc67d8b4 454 sn_nsdl_addr_s address;
Christopher Haster 1:79b6cc67d8b4 455
Christopher Haster 1:79b6cc67d8b4 456 M2MInterface::NetworkStack stack = event->_address->_stack;
Christopher Haster 1:79b6cc67d8b4 457
Christopher Haster 1:79b6cc67d8b4 458 if(M2MInterface::LwIP_IPv4 == stack) {
Christopher Haster 1:79b6cc67d8b4 459 tr_debug("M2MInterfaceImpl::state_bootstrap_address_resolved : IPv4 address");
Christopher Haster 1:79b6cc67d8b4 460 address.type = SN_NSDL_ADDRESS_TYPE_IPV4;
Christopher Haster 1:79b6cc67d8b4 461 address.addr_len = 4;
Christopher Haster 1:79b6cc67d8b4 462 } else if((M2MInterface::LwIP_IPv6 == stack) ||
Christopher Haster 1:79b6cc67d8b4 463 (M2MInterface::Nanostack_IPv6 == stack)) {
Christopher Haster 1:79b6cc67d8b4 464 tr_debug("M2MInterfaceImpl::state_bootstrap_address_resolved : IPv6 address");
Christopher Haster 1:79b6cc67d8b4 465 address.type = SN_NSDL_ADDRESS_TYPE_IPV6;
Christopher Haster 1:79b6cc67d8b4 466 address.addr_len = 16;
Christopher Haster 1:79b6cc67d8b4 467 }
Christopher Haster 1:79b6cc67d8b4 468 address.port = event->_port;
Christopher Haster 1:79b6cc67d8b4 469 address.addr_ptr = (uint8_t*)event->_address->_address;
Christopher Haster 1:79b6cc67d8b4 470 _connection_handler->start_listening_for_data();
Christopher Haster 1:79b6cc67d8b4 471 if(_nsdl_interface->create_bootstrap_resource(&address)) {
Christopher Haster 1:79b6cc67d8b4 472 tr_debug("M2MInterfaceImpl::state_bootstrap_address_resolved : create_bootstrap_resource - success");
Christopher Haster 1:79b6cc67d8b4 473 internal_event(STATE_BOOTSTRAP_RESOURCE_CREATED);
Christopher Haster 1:79b6cc67d8b4 474 } else{
Christopher Haster 1:79b6cc67d8b4 475 // If resource creation fails then inform error to application
Christopher Haster 1:79b6cc67d8b4 476 tr_error("M2MInterfaceImpl::state_bootstrap_address_resolved : M2MInterface::InvalidParameters");
Christopher Haster 1:79b6cc67d8b4 477 internal_event(STATE_IDLE);
Christopher Haster 1:79b6cc67d8b4 478 _observer.error(M2MInterface::InvalidParameters);
Christopher Haster 1:79b6cc67d8b4 479 }
Christopher Haster 1:79b6cc67d8b4 480 }
Christopher Haster 1:79b6cc67d8b4 481
Christopher Haster 1:79b6cc67d8b4 482 void M2MInterfaceImpl::state_bootstrap_resource_created( EventData */*data*/)
Christopher Haster 1:79b6cc67d8b4 483 {
Christopher Haster 1:79b6cc67d8b4 484 tr_debug("M2MInterfaceImpl::state_bootstrap_resource_created");
Christopher Haster 1:79b6cc67d8b4 485 }
Christopher Haster 1:79b6cc67d8b4 486
Christopher Haster 1:79b6cc67d8b4 487 void M2MInterfaceImpl::state_bootstrapped( EventData */*data*/)
Christopher Haster 1:79b6cc67d8b4 488 {
Christopher Haster 1:79b6cc67d8b4 489 tr_debug("M2MInterfaceImpl::state_bootstrapped");
Christopher Haster 1:79b6cc67d8b4 490 }
Christopher Haster 1:79b6cc67d8b4 491
Christopher Haster 1:79b6cc67d8b4 492 void M2MInterfaceImpl::state_register( EventData *data)
Christopher Haster 1:79b6cc67d8b4 493 {
Christopher Haster 1:79b6cc67d8b4 494 tr_debug("M2MInterfaceImpl::state_register");
Christopher Haster 1:79b6cc67d8b4 495 // Start with registration preparation
Christopher Haster 1:79b6cc67d8b4 496 bool success = false;
Christopher Haster 1:79b6cc67d8b4 497 M2MInterface::Error error = M2MInterface::InvalidParameters;
Christopher Haster 1:79b6cc67d8b4 498 if(data) {
Christopher Haster 1:79b6cc67d8b4 499 M2MRegisterData *event = (M2MRegisterData *)data;
Christopher Haster 1:79b6cc67d8b4 500 M2MSecurity *security = event->_object;
Christopher Haster 1:79b6cc67d8b4 501 if(security) {
Christopher Haster 1:79b6cc67d8b4 502 if(M2MSecurity::M2MServer == security->server_type()) {
Christopher Haster 1:79b6cc67d8b4 503 tr_debug("M2MInterfaceImpl::state_register - server_type : M2MSecurity::M2MServer");
Christopher Haster 1:79b6cc67d8b4 504 if(_nsdl_interface->create_nsdl_list_structure(event->_object_list)) {
Christopher Haster 1:79b6cc67d8b4 505 tr_debug("M2MInterfaceImpl::state_register - create_nsdl_list_structure - success");
Christopher Haster 1:79b6cc67d8b4 506 // If the nsdl resource structure is created successfully
Christopher Haster 1:79b6cc67d8b4 507 String server_address = security->resource_value_string(M2MSecurity::M2MServerUri);
Christopher Haster 1:79b6cc67d8b4 508 tr_debug("M2MInterfaceImpl::state_register - server_address %s", server_address.c_str());
Christopher Haster 1:79b6cc67d8b4 509 String ip_address;
Christopher Haster 1:79b6cc67d8b4 510 uint16_t port;
Christopher Haster 1:79b6cc67d8b4 511 if(server_address.compare(0,COAP.size(),COAP) == 0) {
Christopher Haster 1:79b6cc67d8b4 512 server_address = server_address.substr(COAP.size(),
Christopher Haster 1:79b6cc67d8b4 513 server_address.size()-COAP.size());
Christopher Haster 1:79b6cc67d8b4 514 int colonFound = server_address.find_last_of(':'); //10
Christopher Haster 1:79b6cc67d8b4 515 if(colonFound != -1) {
Christopher Haster 1:79b6cc67d8b4 516 ip_address = server_address.substr(0,colonFound);
Christopher Haster 1:79b6cc67d8b4 517 port = atoi(server_address.substr(colonFound+1,
Christopher Haster 1:79b6cc67d8b4 518 server_address.size()-ip_address.size()).c_str());
Christopher Haster 1:79b6cc67d8b4 519
Christopher Haster 1:79b6cc67d8b4 520 tr_debug("M2MInterfaceImpl::state_register - IP address %s , Port %d", ip_address.c_str(), port);
Christopher Haster 1:79b6cc67d8b4 521 // If bind and resolving server address succeed then proceed else
Christopher Haster 1:79b6cc67d8b4 522 // return error to the application and go to Idle state.
Christopher Haster 1:79b6cc67d8b4 523 if(_connection_handler->resolve_server_address(ip_address,
Christopher Haster 1:79b6cc67d8b4 524 port,
Christopher Haster 1:79b6cc67d8b4 525 M2MConnectionObserver::LWM2MServer,
Christopher Haster 1:79b6cc67d8b4 526 security)) {
Christopher Haster 1:79b6cc67d8b4 527 tr_debug("M2MInterfaceImpl::state_register - resolve_server_address - success");
Christopher Haster 1:79b6cc67d8b4 528 success = true;
Christopher Haster 1:79b6cc67d8b4 529 } else {
Christopher Haster 1:79b6cc67d8b4 530 tr_error("M2MInterfaceImpl::state_register - set error as M2MInterface::NetworkError");
Christopher Haster 1:79b6cc67d8b4 531 error = M2MInterface::NetworkError;
Christopher Haster 1:79b6cc67d8b4 532 }
Christopher Haster 1:79b6cc67d8b4 533 }
Christopher Haster 1:79b6cc67d8b4 534 }
Christopher Haster 1:79b6cc67d8b4 535 }
Christopher Haster 1:79b6cc67d8b4 536 }
Christopher Haster 1:79b6cc67d8b4 537 }
Christopher Haster 1:79b6cc67d8b4 538 }
Christopher Haster 1:79b6cc67d8b4 539 if(!success) {
Christopher Haster 1:79b6cc67d8b4 540 tr_error("M2MInterfaceImpl::state_register - Error Occured %d", (int)error);
Christopher Haster 1:79b6cc67d8b4 541 internal_event(STATE_IDLE);
Christopher Haster 1:79b6cc67d8b4 542 _observer.error(error);
Christopher Haster 1:79b6cc67d8b4 543 }
Christopher Haster 1:79b6cc67d8b4 544 }
Christopher Haster 1:79b6cc67d8b4 545
Christopher Haster 1:79b6cc67d8b4 546 void M2MInterfaceImpl::state_register_address_resolved( EventData *data)
Christopher Haster 1:79b6cc67d8b4 547 {
Christopher Haster 1:79b6cc67d8b4 548 tr_debug("M2MInterfaceImpl::state_register_address_resolved");
Christopher Haster 1:79b6cc67d8b4 549 if(data) {
Christopher Haster 1:79b6cc67d8b4 550 ResolvedAddressData *event = (ResolvedAddressData *)data;
Christopher Haster 1:79b6cc67d8b4 551
Christopher Haster 1:79b6cc67d8b4 552 sn_nsdl_addr_type_e address_type = SN_NSDL_ADDRESS_TYPE_IPV6;
Christopher Haster 1:79b6cc67d8b4 553
Christopher Haster 1:79b6cc67d8b4 554 M2MInterface::NetworkStack stack = event->_address->_stack;
Christopher Haster 1:79b6cc67d8b4 555
Christopher Haster 1:79b6cc67d8b4 556 if(M2MInterface::LwIP_IPv4 == stack) {
Christopher Haster 1:79b6cc67d8b4 557 tr_debug("M2MInterfaceImpl::state_register_address_resolved : IPv4 address");
Christopher Haster 1:79b6cc67d8b4 558 address_type = SN_NSDL_ADDRESS_TYPE_IPV4;
Christopher Haster 1:79b6cc67d8b4 559 } else if((M2MInterface::LwIP_IPv6 == stack) ||
Christopher Haster 1:79b6cc67d8b4 560 (M2MInterface::Nanostack_IPv6 == stack)) {
Christopher Haster 1:79b6cc67d8b4 561 tr_debug("M2MInterfaceImpl::state_register_address_resolved : IPv6 address");
Christopher Haster 1:79b6cc67d8b4 562 address_type = SN_NSDL_ADDRESS_TYPE_IPV6;
Christopher Haster 1:79b6cc67d8b4 563 }
Christopher Haster 1:79b6cc67d8b4 564 internal_event(STATE_REGISTER_RESOURCE_CREATED);
Christopher Haster 1:79b6cc67d8b4 565 _connection_handler->start_listening_for_data();
Christopher Haster 1:79b6cc67d8b4 566 if(!_nsdl_interface->send_register_message((uint8_t*)event->_address->_address,event->_port, address_type)) {
Christopher Haster 1:79b6cc67d8b4 567 // If resource creation fails then inform error to application
Christopher Haster 1:79b6cc67d8b4 568 tr_error("M2MInterfaceImpl::state_register_address_resolved : M2MInterface::InvalidParameters");
Christopher Haster 1:79b6cc67d8b4 569 internal_event(STATE_IDLE);
Christopher Haster 1:79b6cc67d8b4 570 _observer.error(M2MInterface::InvalidParameters);
Christopher Haster 1:79b6cc67d8b4 571 }
Christopher Haster 1:79b6cc67d8b4 572 }
Christopher Haster 1:79b6cc67d8b4 573 }
Christopher Haster 1:79b6cc67d8b4 574
Christopher Haster 1:79b6cc67d8b4 575 void M2MInterfaceImpl::state_register_resource_created( EventData */*data*/)
Christopher Haster 1:79b6cc67d8b4 576 {
Christopher Haster 1:79b6cc67d8b4 577 tr_debug("M2MInterfaceImpl::state_register_resource_created");
Christopher Haster 1:79b6cc67d8b4 578 }
Christopher Haster 1:79b6cc67d8b4 579
Christopher Haster 1:79b6cc67d8b4 580 void M2MInterfaceImpl::state_registered( EventData */*data*/)
Christopher Haster 1:79b6cc67d8b4 581 {
Christopher Haster 1:79b6cc67d8b4 582 tr_debug("M2MInterfaceImpl::state_registered");
Christopher Haster 1:79b6cc67d8b4 583 _register_ongoing = false;
Christopher Haster 1:79b6cc67d8b4 584 _update_register_ongoing = false;
Christopher Haster 1:79b6cc67d8b4 585 }
Christopher Haster 1:79b6cc67d8b4 586
Christopher Haster 1:79b6cc67d8b4 587 void M2MInterfaceImpl::state_update_registration( EventData *data)
Christopher Haster 1:79b6cc67d8b4 588 {
Christopher Haster 1:79b6cc67d8b4 589 tr_debug("M2MInterfaceImpl::state_update_registration");
Christopher Haster 1:79b6cc67d8b4 590 // Start with registration preparation
Christopher Haster 1:79b6cc67d8b4 591 bool success = false;
Christopher Haster 1:79b6cc67d8b4 592 if(data) {
Christopher Haster 1:79b6cc67d8b4 593 M2MUpdateRegisterData *event = (M2MUpdateRegisterData *)data;
Christopher Haster 1:79b6cc67d8b4 594 success = _nsdl_interface->send_update_registration(event->_lifetime);
Christopher Haster 1:79b6cc67d8b4 595
Christopher Haster 1:79b6cc67d8b4 596 }
Christopher Haster 1:79b6cc67d8b4 597 if(!success) {
Christopher Haster 1:79b6cc67d8b4 598 tr_error("M2MInterfaceImpl::state_register_address_resolved : M2MInterface::InvalidParameters");
Christopher Haster 1:79b6cc67d8b4 599 internal_event(STATE_IDLE);
Christopher Haster 1:79b6cc67d8b4 600 _observer.error(M2MInterface::InvalidParameters);
Christopher Haster 1:79b6cc67d8b4 601 }
Christopher Haster 1:79b6cc67d8b4 602 }
Christopher Haster 1:79b6cc67d8b4 603
Christopher Haster 1:79b6cc67d8b4 604 void M2MInterfaceImpl::state_unregister( EventData */*data*/)
Christopher Haster 1:79b6cc67d8b4 605 {
Christopher Haster 1:79b6cc67d8b4 606 tr_debug("M2MInterfaceImpl::state_unregister");
Christopher Haster 1:79b6cc67d8b4 607 internal_event(STATE_SENDING_COAP_DATA);
Christopher Haster 1:79b6cc67d8b4 608 if(!_nsdl_interface->send_unregister_message()) {
Christopher Haster 1:79b6cc67d8b4 609 tr_error("M2MInterfaceImpl::state_unregister : M2MInterface::NotRegistered");
Christopher Haster 1:79b6cc67d8b4 610 internal_event(STATE_IDLE);
Christopher Haster 1:79b6cc67d8b4 611 _observer.error(M2MInterface::NotRegistered);
Christopher Haster 1:79b6cc67d8b4 612 }
Christopher Haster 1:79b6cc67d8b4 613 }
Christopher Haster 1:79b6cc67d8b4 614
Christopher Haster 1:79b6cc67d8b4 615 void M2MInterfaceImpl::state_unregistered( EventData */*data*/)
Christopher Haster 1:79b6cc67d8b4 616 {
Christopher Haster 1:79b6cc67d8b4 617 tr_debug("M2MInterfaceImpl::state_unregistered");
Christopher Haster 1:79b6cc67d8b4 618 internal_event(STATE_IDLE);
Christopher Haster 1:79b6cc67d8b4 619 }
Christopher Haster 1:79b6cc67d8b4 620
Christopher Haster 1:79b6cc67d8b4 621 void M2MInterfaceImpl::state_sending_coap_data( EventData */*data*/)
Christopher Haster 1:79b6cc67d8b4 622 {
Christopher Haster 1:79b6cc67d8b4 623 tr_debug("M2MInterfaceImpl::state_sending_coap_data");
Christopher Haster 1:79b6cc67d8b4 624 internal_event(STATE_WAITING);
Christopher Haster 1:79b6cc67d8b4 625 }
Christopher Haster 1:79b6cc67d8b4 626
Christopher Haster 1:79b6cc67d8b4 627 void M2MInterfaceImpl::state_coap_data_sent( EventData */*data*/)
Christopher Haster 1:79b6cc67d8b4 628 {
Christopher Haster 1:79b6cc67d8b4 629 tr_debug("M2MInterfaceImpl::state_coap_data_sent");
Christopher Haster 1:79b6cc67d8b4 630 internal_event(STATE_WAITING);
Christopher Haster 1:79b6cc67d8b4 631 }
Christopher Haster 1:79b6cc67d8b4 632
Christopher Haster 1:79b6cc67d8b4 633 void M2MInterfaceImpl::state_coap_data_received( EventData *data)
Christopher Haster 1:79b6cc67d8b4 634 {
Christopher Haster 1:79b6cc67d8b4 635 tr_debug("M2MInterfaceImpl::state_coap_data_received");
Christopher Haster 1:79b6cc67d8b4 636 if(data) {
Christopher Haster 1:79b6cc67d8b4 637 ReceivedData *event = (ReceivedData*)data;
Christopher Haster 1:79b6cc67d8b4 638 sn_nsdl_addr_s address;
Christopher Haster 1:79b6cc67d8b4 639
Christopher Haster 1:79b6cc67d8b4 640 M2MInterface::NetworkStack stack = event->_address->_stack;
Christopher Haster 1:79b6cc67d8b4 641
Christopher Haster 1:79b6cc67d8b4 642 if(M2MInterface::LwIP_IPv4 == stack) {
Christopher Haster 1:79b6cc67d8b4 643 tr_debug("M2MInterfaceImpl::state_coap_data_received : IPv4 address");
Christopher Haster 1:79b6cc67d8b4 644 address.type = SN_NSDL_ADDRESS_TYPE_IPV4;
Christopher Haster 1:79b6cc67d8b4 645 address.addr_len = 4;
Christopher Haster 1:79b6cc67d8b4 646 } else if((M2MInterface::LwIP_IPv6 == stack) ||
Christopher Haster 1:79b6cc67d8b4 647 (M2MInterface::Nanostack_IPv6 == stack)) {
Christopher Haster 1:79b6cc67d8b4 648 tr_debug("M2MInterfaceImpl::state_coap_data_received : IPv6 address");
Christopher Haster 1:79b6cc67d8b4 649 address.type = SN_NSDL_ADDRESS_TYPE_IPV6;
Christopher Haster 1:79b6cc67d8b4 650 address.addr_len = 16;
Christopher Haster 1:79b6cc67d8b4 651 }
Christopher Haster 1:79b6cc67d8b4 652 address.port = event->_address->_port;
Christopher Haster 1:79b6cc67d8b4 653 address.addr_ptr = (uint8_t*)event->_address->_address;
Christopher Haster 1:79b6cc67d8b4 654
Christopher Haster 1:79b6cc67d8b4 655 // Process received data
Christopher Haster 1:79b6cc67d8b4 656 internal_event(STATE_PROCESSING_COAP_DATA);
Christopher Haster 1:79b6cc67d8b4 657 if(!_nsdl_interface->process_received_data(event->_data,
Christopher Haster 1:79b6cc67d8b4 658 event->_size,
Christopher Haster 1:79b6cc67d8b4 659 &address)) {
Christopher Haster 1:79b6cc67d8b4 660 tr_error("M2MInterfaceImpl::state_coap_data_received : M2MInterface::ResponseParseFailed");
Christopher Haster 1:79b6cc67d8b4 661 _observer.error(M2MInterface::ResponseParseFailed);
Christopher Haster 1:79b6cc67d8b4 662 }
Christopher Haster 1:79b6cc67d8b4 663 }
Christopher Haster 1:79b6cc67d8b4 664 }
Christopher Haster 1:79b6cc67d8b4 665
Christopher Haster 1:79b6cc67d8b4 666 void M2MInterfaceImpl::state_processing_coap_data( EventData */*data*/)
Christopher Haster 1:79b6cc67d8b4 667 {
Christopher Haster 1:79b6cc67d8b4 668 tr_debug("M2MInterfaceImpl::state_processing_coap_data");
Christopher Haster 1:79b6cc67d8b4 669 internal_event(STATE_WAITING);
Christopher Haster 1:79b6cc67d8b4 670 }
Christopher Haster 1:79b6cc67d8b4 671
Christopher Haster 1:79b6cc67d8b4 672 void M2MInterfaceImpl::state_coap_data_processed( EventData */*data*/)
Christopher Haster 1:79b6cc67d8b4 673 {
Christopher Haster 1:79b6cc67d8b4 674 tr_debug("M2MInterfaceImpl::state_coap_data_processed");
Christopher Haster 1:79b6cc67d8b4 675 internal_event(STATE_WAITING);
Christopher Haster 1:79b6cc67d8b4 676 }
Christopher Haster 1:79b6cc67d8b4 677
Christopher Haster 1:79b6cc67d8b4 678 void M2MInterfaceImpl::state_waiting( EventData */*data*/)
Christopher Haster 1:79b6cc67d8b4 679 {
Christopher Haster 1:79b6cc67d8b4 680 tr_debug("M2MInterfaceImpl::state_waiting");
Christopher Haster 1:79b6cc67d8b4 681 }
Christopher Haster 1:79b6cc67d8b4 682
Christopher Haster 1:79b6cc67d8b4 683 // generates an external event. called once per external event
Christopher Haster 1:79b6cc67d8b4 684 // to start the state machine executing
Christopher Haster 1:79b6cc67d8b4 685 void M2MInterfaceImpl::external_event(uint8_t new_state,
Christopher Haster 1:79b6cc67d8b4 686 EventData* p_data)
Christopher Haster 1:79b6cc67d8b4 687 {
Christopher Haster 1:79b6cc67d8b4 688 tr_debug("M2MInterfaceImpl::external_event : new state %d", new_state);
Christopher Haster 1:79b6cc67d8b4 689 // if we are supposed to ignore this event
Christopher Haster 1:79b6cc67d8b4 690 if (new_state == EVENT_IGNORED) {
Christopher Haster 1:79b6cc67d8b4 691 tr_debug("M2MInterfaceImpl::external_event : new state is EVENT_IGNORED");
Christopher Haster 1:79b6cc67d8b4 692 // just delete the event data, if any
Christopher Haster 1:79b6cc67d8b4 693 if (p_data) {
Christopher Haster 1:79b6cc67d8b4 694 delete p_data;
Christopher Haster 1:79b6cc67d8b4 695 p_data = NULL;
Christopher Haster 1:79b6cc67d8b4 696 }
Christopher Haster 1:79b6cc67d8b4 697 _event_ignored = true;
Christopher Haster 1:79b6cc67d8b4 698 }
Christopher Haster 1:79b6cc67d8b4 699 else {
Christopher Haster 1:79b6cc67d8b4 700 tr_debug("M2MInterfaceImpl::external_event : handle new state");
Christopher Haster 1:79b6cc67d8b4 701 // generate the event and execute the state engine
Christopher Haster 1:79b6cc67d8b4 702 internal_event(new_state, p_data);
Christopher Haster 1:79b6cc67d8b4 703 }
Christopher Haster 1:79b6cc67d8b4 704 }
Christopher Haster 1:79b6cc67d8b4 705
Christopher Haster 1:79b6cc67d8b4 706 // generates an internal event. called from within a state
Christopher Haster 1:79b6cc67d8b4 707 // function to transition to a new state
Christopher Haster 1:79b6cc67d8b4 708 void M2MInterfaceImpl::internal_event(uint8_t new_state,
Christopher Haster 1:79b6cc67d8b4 709 EventData* p_data)
Christopher Haster 1:79b6cc67d8b4 710 {
Christopher Haster 1:79b6cc67d8b4 711 tr_debug("M2MInterfaceImpl::internal_event : new state %d", new_state);
Christopher Haster 1:79b6cc67d8b4 712 _event_data = p_data;
Christopher Haster 1:79b6cc67d8b4 713 _event_generated = true;
Christopher Haster 1:79b6cc67d8b4 714 _current_state = new_state;
Christopher Haster 1:79b6cc67d8b4 715 state_engine();
Christopher Haster 1:79b6cc67d8b4 716 }
Christopher Haster 1:79b6cc67d8b4 717
Christopher Haster 1:79b6cc67d8b4 718 // the state engine executes the state machine states
Christopher Haster 1:79b6cc67d8b4 719 void M2MInterfaceImpl::state_engine (void )
Christopher Haster 1:79b6cc67d8b4 720 {
Christopher Haster 1:79b6cc67d8b4 721 tr_debug("M2MInterfaceImpl::state_engine");
Christopher Haster 1:79b6cc67d8b4 722 EventData* p_data_temp = NULL;
Christopher Haster 1:79b6cc67d8b4 723
Christopher Haster 1:79b6cc67d8b4 724 // while events are being generated keep executing states
Christopher Haster 1:79b6cc67d8b4 725 while (_event_generated) {
Christopher Haster 1:79b6cc67d8b4 726 p_data_temp = _event_data; // copy of event data pointer
Christopher Haster 1:79b6cc67d8b4 727 _event_data = NULL; // event data used up, reset ptr
Christopher Haster 1:79b6cc67d8b4 728 _event_generated = false; // event used up, reset flag
Christopher Haster 1:79b6cc67d8b4 729
Christopher Haster 1:79b6cc67d8b4 730 assert(_current_state < _max_states);
Christopher Haster 1:79b6cc67d8b4 731
Christopher Haster 1:79b6cc67d8b4 732 state_function( _current_state, p_data_temp );
Christopher Haster 1:79b6cc67d8b4 733
Christopher Haster 1:79b6cc67d8b4 734 // if event data was used, then delete it
Christopher Haster 1:79b6cc67d8b4 735 if (p_data_temp) {
Christopher Haster 1:79b6cc67d8b4 736 delete p_data_temp;
Christopher Haster 1:79b6cc67d8b4 737 p_data_temp = NULL;
Christopher Haster 1:79b6cc67d8b4 738 }
Christopher Haster 1:79b6cc67d8b4 739 }
Christopher Haster 1:79b6cc67d8b4 740 }
Christopher Haster 1:79b6cc67d8b4 741
Christopher Haster 1:79b6cc67d8b4 742 void M2MInterfaceImpl::state_function( uint8_t current_state, EventData* data )
Christopher Haster 1:79b6cc67d8b4 743 {
Christopher Haster 1:79b6cc67d8b4 744 switch( current_state ) {
Christopher Haster 1:79b6cc67d8b4 745 case STATE_IDLE:
Christopher Haster 1:79b6cc67d8b4 746 M2MInterfaceImpl::state_idle(data);
Christopher Haster 1:79b6cc67d8b4 747 break;
Christopher Haster 1:79b6cc67d8b4 748 case STATE_BOOTSTRAP:
Christopher Haster 1:79b6cc67d8b4 749 M2MInterfaceImpl::state_bootstrap(data);
Christopher Haster 1:79b6cc67d8b4 750 break;
Christopher Haster 1:79b6cc67d8b4 751 case STATE_BOOTSTRAP_ADDRESS_RESOLVED:
Christopher Haster 1:79b6cc67d8b4 752 M2MInterfaceImpl::state_bootstrap_address_resolved(data);
Christopher Haster 1:79b6cc67d8b4 753 break;
Christopher Haster 1:79b6cc67d8b4 754 case STATE_BOOTSTRAP_RESOURCE_CREATED:
Christopher Haster 1:79b6cc67d8b4 755 M2MInterfaceImpl::state_bootstrap_resource_created(data);
Christopher Haster 1:79b6cc67d8b4 756 break;
Christopher Haster 1:79b6cc67d8b4 757 case STATE_BOOTSTRAPPED:
Christopher Haster 1:79b6cc67d8b4 758 M2MInterfaceImpl::state_bootstrapped(data);
Christopher Haster 1:79b6cc67d8b4 759 break;
Christopher Haster 1:79b6cc67d8b4 760 case STATE_REGISTER:
Christopher Haster 1:79b6cc67d8b4 761 M2MInterfaceImpl::state_register(data);
Christopher Haster 1:79b6cc67d8b4 762 break;
Christopher Haster 1:79b6cc67d8b4 763 case STATE_REGISTER_ADDRESS_RESOLVED:
Christopher Haster 1:79b6cc67d8b4 764 M2MInterfaceImpl::state_register_address_resolved(data);
Christopher Haster 1:79b6cc67d8b4 765 break;
Christopher Haster 1:79b6cc67d8b4 766 case STATE_REGISTER_RESOURCE_CREATED:
Christopher Haster 1:79b6cc67d8b4 767 M2MInterfaceImpl::state_register_resource_created(data);
Christopher Haster 1:79b6cc67d8b4 768 break;
Christopher Haster 1:79b6cc67d8b4 769 case STATE_REGISTERED:
Christopher Haster 1:79b6cc67d8b4 770 M2MInterfaceImpl::state_registered(data);
Christopher Haster 1:79b6cc67d8b4 771 break;
Christopher Haster 1:79b6cc67d8b4 772 case STATE_UPDATE_REGISTRATION:
Christopher Haster 1:79b6cc67d8b4 773 M2MInterfaceImpl::state_update_registration(data);
Christopher Haster 1:79b6cc67d8b4 774 break;
Christopher Haster 1:79b6cc67d8b4 775 case STATE_UNREGISTER:
Christopher Haster 1:79b6cc67d8b4 776 M2MInterfaceImpl::state_unregister(data);
Christopher Haster 1:79b6cc67d8b4 777 break;
Christopher Haster 1:79b6cc67d8b4 778 case STATE_UNREGISTERED:
Christopher Haster 1:79b6cc67d8b4 779 M2MInterfaceImpl::state_unregistered(data);
Christopher Haster 1:79b6cc67d8b4 780 break;
Christopher Haster 1:79b6cc67d8b4 781 case STATE_SENDING_COAP_DATA:
Christopher Haster 1:79b6cc67d8b4 782 M2MInterfaceImpl::state_sending_coap_data(data);
Christopher Haster 1:79b6cc67d8b4 783 break;
Christopher Haster 1:79b6cc67d8b4 784 case STATE_COAP_DATA_SENT:
Christopher Haster 1:79b6cc67d8b4 785 M2MInterfaceImpl::state_coap_data_sent(data);
Christopher Haster 1:79b6cc67d8b4 786 break;
Christopher Haster 1:79b6cc67d8b4 787 case STATE_COAP_DATA_RECEIVED:
Christopher Haster 1:79b6cc67d8b4 788 M2MInterfaceImpl::state_coap_data_received(data);
Christopher Haster 1:79b6cc67d8b4 789 break;
Christopher Haster 1:79b6cc67d8b4 790 case STATE_PROCESSING_COAP_DATA:
Christopher Haster 1:79b6cc67d8b4 791 M2MInterfaceImpl::state_processing_coap_data(data);
Christopher Haster 1:79b6cc67d8b4 792 break;
Christopher Haster 1:79b6cc67d8b4 793 case STATE_COAP_DATA_PROCESSED:
Christopher Haster 1:79b6cc67d8b4 794 M2MInterfaceImpl::state_coap_data_processed(data);
Christopher Haster 1:79b6cc67d8b4 795 break;
Christopher Haster 1:79b6cc67d8b4 796 case STATE_WAITING:
Christopher Haster 1:79b6cc67d8b4 797 M2MInterfaceImpl::state_waiting(data);
Christopher Haster 1:79b6cc67d8b4 798 break;
Christopher Haster 1:79b6cc67d8b4 799 }
Christopher Haster 1:79b6cc67d8b4 800 }