Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
mbed-client/source/m2minterfaceimpl.cpp@0:06ee5f8a484a, 2017-03-18 (annotated)
- Committer:
- djmeyers
- Date:
- Sat Mar 18 22:37:16 2017 +0000
- Revision:
- 0:06ee5f8a484a
Initial commit
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |