takashi kadono / Mbed OS Nucleo_446

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Wed Oct 10 00:33:53 2018 +0000
Revision:
0:8fdf9a60065b
how to make mbed librry

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kadonotakashi 0:8fdf9a60065b 1 /*
kadonotakashi 0:8fdf9a60065b 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
kadonotakashi 0:8fdf9a60065b 3 * SPDX-License-Identifier: Apache-2.0
kadonotakashi 0:8fdf9a60065b 4 * Licensed under the Apache License, Version 2.0 (the License); you may
kadonotakashi 0:8fdf9a60065b 5 * not use this file except in compliance with the License.
kadonotakashi 0:8fdf9a60065b 6 * You may obtain a copy of the License at
kadonotakashi 0:8fdf9a60065b 7 *
kadonotakashi 0:8fdf9a60065b 8 * http://www.apache.org/licenses/LICENSE-2.0
kadonotakashi 0:8fdf9a60065b 9 *
kadonotakashi 0:8fdf9a60065b 10 * Unless required by applicable law or agreed to in writing, software
kadonotakashi 0:8fdf9a60065b 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
kadonotakashi 0:8fdf9a60065b 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kadonotakashi 0:8fdf9a60065b 13 * See the License for the specific language governing permissions and
kadonotakashi 0:8fdf9a60065b 14 * limitations under the License.
kadonotakashi 0:8fdf9a60065b 15 */
kadonotakashi 0:8fdf9a60065b 16
kadonotakashi 0:8fdf9a60065b 17 #include <string.h> //memset
kadonotakashi 0:8fdf9a60065b 18 #include "eventOS_event_timer.h"
kadonotakashi 0:8fdf9a60065b 19 #include "common_functions.h"
kadonotakashi 0:8fdf9a60065b 20 #include "net_interface.h"
kadonotakashi 0:8fdf9a60065b 21 #include "ip6string.h" //ip6tos
kadonotakashi 0:8fdf9a60065b 22 #include "nsdynmemLIB.h"
kadonotakashi 0:8fdf9a60065b 23 #include "thread_management_if.h"
kadonotakashi 0:8fdf9a60065b 24 #include "net_polling_api.h"
kadonotakashi 0:8fdf9a60065b 25 #include "include/thread_tasklet.h"
kadonotakashi 0:8fdf9a60065b 26 #include "include/mesh_system.h"
kadonotakashi 0:8fdf9a60065b 27 #include <mbed_assert.h>
kadonotakashi 0:8fdf9a60065b 28 #include "ns_event_loop.h"
kadonotakashi 0:8fdf9a60065b 29
kadonotakashi 0:8fdf9a60065b 30 // For tracing we need to define flag, have include and define group
kadonotakashi 0:8fdf9a60065b 31 #define HAVE_DEBUG 1
kadonotakashi 0:8fdf9a60065b 32 #include "ns_trace.h"
kadonotakashi 0:8fdf9a60065b 33 #define TRACE_GROUP "m6Thread"
kadonotakashi 0:8fdf9a60065b 34
kadonotakashi 0:8fdf9a60065b 35 #include "mac_api.h"
kadonotakashi 0:8fdf9a60065b 36 #include "sw_mac.h"
kadonotakashi 0:8fdf9a60065b 37
kadonotakashi 0:8fdf9a60065b 38 #define DETAILED_TRACES
kadonotakashi 0:8fdf9a60065b 39 #ifdef DETAILED_TRACES
kadonotakashi 0:8fdf9a60065b 40 #define TRACE_DETAIL tr_debug
kadonotakashi 0:8fdf9a60065b 41 #else
kadonotakashi 0:8fdf9a60065b 42 #define TRACE_DETAIL(...)
kadonotakashi 0:8fdf9a60065b 43 #endif
kadonotakashi 0:8fdf9a60065b 44
kadonotakashi 0:8fdf9a60065b 45 #define INTERFACE_NAME "6L-THREAD"
kadonotakashi 0:8fdf9a60065b 46
kadonotakashi 0:8fdf9a60065b 47 // Tasklet timer events
kadonotakashi 0:8fdf9a60065b 48 #define TIMER_EVENT_START_BOOTSTRAP 1
kadonotakashi 0:8fdf9a60065b 49
kadonotakashi 0:8fdf9a60065b 50 #define INVALID_INTERFACE_ID (-1)
kadonotakashi 0:8fdf9a60065b 51
kadonotakashi 0:8fdf9a60065b 52 /*
kadonotakashi 0:8fdf9a60065b 53 * Thread tasklet states.
kadonotakashi 0:8fdf9a60065b 54 */
kadonotakashi 0:8fdf9a60065b 55 typedef enum {
kadonotakashi 0:8fdf9a60065b 56 TASKLET_STATE_CREATED = 0,
kadonotakashi 0:8fdf9a60065b 57 TASKLET_STATE_INITIALIZED,
kadonotakashi 0:8fdf9a60065b 58 TASKLET_STATE_BOOTSTRAP_STARTED,
kadonotakashi 0:8fdf9a60065b 59 TASKLET_STATE_BOOTSTRAP_FAILED,
kadonotakashi 0:8fdf9a60065b 60 TASKLET_STATE_BOOTSTRAP_READY
kadonotakashi 0:8fdf9a60065b 61 } tasklet_state_t;
kadonotakashi 0:8fdf9a60065b 62
kadonotakashi 0:8fdf9a60065b 63 /*
kadonotakashi 0:8fdf9a60065b 64 * Mesh tasklet data structure.
kadonotakashi 0:8fdf9a60065b 65 */
kadonotakashi 0:8fdf9a60065b 66 typedef struct {
kadonotakashi 0:8fdf9a60065b 67 void (*mesh_api_cb)(mesh_connection_status_t nwk_status);
kadonotakashi 0:8fdf9a60065b 68 channel_list_s channel_list;
kadonotakashi 0:8fdf9a60065b 69 tasklet_state_t tasklet_state;
kadonotakashi 0:8fdf9a60065b 70 mesh_connection_status_t connection_status;
kadonotakashi 0:8fdf9a60065b 71 timeout_t *poll_network_status_timeout;
kadonotakashi 0:8fdf9a60065b 72 int8_t tasklet;
kadonotakashi 0:8fdf9a60065b 73
kadonotakashi 0:8fdf9a60065b 74 net_6lowpan_mode_e operating_mode;
kadonotakashi 0:8fdf9a60065b 75 int8_t nwk_if_id;
kadonotakashi 0:8fdf9a60065b 76 link_configuration_s link_config;
kadonotakashi 0:8fdf9a60065b 77
kadonotakashi 0:8fdf9a60065b 78 /** Default network ID*/
kadonotakashi 0:8fdf9a60065b 79 uint8_t networkid[16];
kadonotakashi 0:8fdf9a60065b 80 uint8_t extented_panid[8];
kadonotakashi 0:8fdf9a60065b 81 uint8_t ip[16];
kadonotakashi 0:8fdf9a60065b 82 } thread_tasklet_data_str_t;
kadonotakashi 0:8fdf9a60065b 83
kadonotakashi 0:8fdf9a60065b 84
kadonotakashi 0:8fdf9a60065b 85 /* Tasklet data */
kadonotakashi 0:8fdf9a60065b 86 static thread_tasklet_data_str_t *thread_tasklet_data_ptr = NULL;
kadonotakashi 0:8fdf9a60065b 87 static mac_api_t *mac_api = NULL;
kadonotakashi 0:8fdf9a60065b 88 static device_configuration_s device_configuration;
kadonotakashi 0:8fdf9a60065b 89
kadonotakashi 0:8fdf9a60065b 90 /* private function prototypes */
kadonotakashi 0:8fdf9a60065b 91 void thread_tasklet_main(arm_event_s *event);
kadonotakashi 0:8fdf9a60065b 92 void thread_tasklet_network_state_changed(mesh_connection_status_t status);
kadonotakashi 0:8fdf9a60065b 93 void thread_tasklet_parse_network_event(arm_event_s *event);
kadonotakashi 0:8fdf9a60065b 94 void thread_tasklet_configure_and_connect_to_network(void);
kadonotakashi 0:8fdf9a60065b 95 void thread_tasklet_poll_network_status(void *param);
kadonotakashi 0:8fdf9a60065b 96 #define TRACE_THREAD_TASKLET
kadonotakashi 0:8fdf9a60065b 97 #ifndef TRACE_THREAD_TASKLET
kadonotakashi 0:8fdf9a60065b 98 #define thread_tasklet_trace_bootstrap_info() ((void) 0)
kadonotakashi 0:8fdf9a60065b 99 #else
kadonotakashi 0:8fdf9a60065b 100 void thread_tasklet_trace_bootstrap_info(void);
kadonotakashi 0:8fdf9a60065b 101 #endif
kadonotakashi 0:8fdf9a60065b 102
kadonotakashi 0:8fdf9a60065b 103 /*
kadonotakashi 0:8fdf9a60065b 104 * \brief A function which will be eventually called by NanoStack OS when ever the OS has an event to deliver.
kadonotakashi 0:8fdf9a60065b 105 * @param event, describes the sender, receiver and event type.
kadonotakashi 0:8fdf9a60065b 106 *
kadonotakashi 0:8fdf9a60065b 107 * NOTE: Interrupts requested by HW are possible during this function!
kadonotakashi 0:8fdf9a60065b 108 */
kadonotakashi 0:8fdf9a60065b 109 void thread_tasklet_main(arm_event_s *event)
kadonotakashi 0:8fdf9a60065b 110 {
kadonotakashi 0:8fdf9a60065b 111 arm_library_event_type_e event_type;
kadonotakashi 0:8fdf9a60065b 112 event_type = (arm_library_event_type_e) event->event_type;
kadonotakashi 0:8fdf9a60065b 113
kadonotakashi 0:8fdf9a60065b 114 switch (event_type) {
kadonotakashi 0:8fdf9a60065b 115 case ARM_LIB_NWK_INTERFACE_EVENT:
kadonotakashi 0:8fdf9a60065b 116 /* This event is delivered every and each time when there is new
kadonotakashi 0:8fdf9a60065b 117 * information of network connectivity.
kadonotakashi 0:8fdf9a60065b 118 */
kadonotakashi 0:8fdf9a60065b 119 thread_tasklet_parse_network_event(event);
kadonotakashi 0:8fdf9a60065b 120 break;
kadonotakashi 0:8fdf9a60065b 121
kadonotakashi 0:8fdf9a60065b 122 case ARM_LIB_TASKLET_INIT_EVENT:
kadonotakashi 0:8fdf9a60065b 123 /* Event with type EV_INIT is an initializer event of NanoStack OS.
kadonotakashi 0:8fdf9a60065b 124 * The event is delivered when the NanoStack OS is running fine.
kadonotakashi 0:8fdf9a60065b 125 * This event should be delivered ONLY ONCE.
kadonotakashi 0:8fdf9a60065b 126 */
kadonotakashi 0:8fdf9a60065b 127 mesh_system_send_connect_event(thread_tasklet_data_ptr->tasklet);
kadonotakashi 0:8fdf9a60065b 128 break;
kadonotakashi 0:8fdf9a60065b 129
kadonotakashi 0:8fdf9a60065b 130 case ARM_LIB_SYSTEM_TIMER_EVENT:
kadonotakashi 0:8fdf9a60065b 131 eventOS_event_timer_cancel(event->event_id,
kadonotakashi 0:8fdf9a60065b 132 thread_tasklet_data_ptr->tasklet);
kadonotakashi 0:8fdf9a60065b 133
kadonotakashi 0:8fdf9a60065b 134 if (event->event_id == TIMER_EVENT_START_BOOTSTRAP) {
kadonotakashi 0:8fdf9a60065b 135 int8_t status;
kadonotakashi 0:8fdf9a60065b 136 tr_debug("Restart bootstrap");
kadonotakashi 0:8fdf9a60065b 137 status = arm_nwk_interface_up(thread_tasklet_data_ptr->nwk_if_id);
kadonotakashi 0:8fdf9a60065b 138
kadonotakashi 0:8fdf9a60065b 139 if (status >= 0) {
kadonotakashi 0:8fdf9a60065b 140 thread_tasklet_data_ptr->tasklet_state = TASKLET_STATE_BOOTSTRAP_STARTED;
kadonotakashi 0:8fdf9a60065b 141 tr_info("Start Thread bootstrap (%s mode)", thread_tasklet_data_ptr->operating_mode == NET_6LOWPAN_SLEEPY_HOST ? "SED" : "Router");
kadonotakashi 0:8fdf9a60065b 142 thread_tasklet_network_state_changed(MESH_BOOTSTRAP_STARTED);
kadonotakashi 0:8fdf9a60065b 143 } else {
kadonotakashi 0:8fdf9a60065b 144 thread_tasklet_data_ptr->tasklet_state = TASKLET_STATE_BOOTSTRAP_FAILED;
kadonotakashi 0:8fdf9a60065b 145 tr_err("Bootstrap start failed, %d", status);
kadonotakashi 0:8fdf9a60065b 146 thread_tasklet_network_state_changed(MESH_BOOTSTRAP_START_FAILED);
kadonotakashi 0:8fdf9a60065b 147 }
kadonotakashi 0:8fdf9a60065b 148 }
kadonotakashi 0:8fdf9a60065b 149 break;
kadonotakashi 0:8fdf9a60065b 150
kadonotakashi 0:8fdf9a60065b 151 case APPLICATION_EVENT:
kadonotakashi 0:8fdf9a60065b 152 if (event->event_id == APPL_EVENT_CONNECT) {
kadonotakashi 0:8fdf9a60065b 153 thread_tasklet_configure_and_connect_to_network();
kadonotakashi 0:8fdf9a60065b 154 }
kadonotakashi 0:8fdf9a60065b 155 break;
kadonotakashi 0:8fdf9a60065b 156
kadonotakashi 0:8fdf9a60065b 157 default:
kadonotakashi 0:8fdf9a60065b 158 break;
kadonotakashi 0:8fdf9a60065b 159 } // switch(event_type)
kadonotakashi 0:8fdf9a60065b 160 }
kadonotakashi 0:8fdf9a60065b 161
kadonotakashi 0:8fdf9a60065b 162 /**
kadonotakashi 0:8fdf9a60065b 163 * \brief Network state event handler.
kadonotakashi 0:8fdf9a60065b 164 * \param event show network start response or current network state.
kadonotakashi 0:8fdf9a60065b 165 *
kadonotakashi 0:8fdf9a60065b 166 * - ARM_NWK_BOOTSTRAP_READY: Save NVK persistent data to NVM and Net role
kadonotakashi 0:8fdf9a60065b 167 * - ARM_NWK_NWK_SCAN_FAIL: Link Layer Active Scan Fail, Stack is Already at Idle state
kadonotakashi 0:8fdf9a60065b 168 * - ARM_NWK_IP_ADDRESS_ALLOCATION_FAIL: No ND Router at current Channel Stack is Already at Idle state
kadonotakashi 0:8fdf9a60065b 169 * - ARM_NWK_NWK_CONNECTION_DOWN: Connection to Access point is lost wait for Scan Result
kadonotakashi 0:8fdf9a60065b 170 * - ARM_NWK_NWK_PARENT_POLL_FAIL: Host should run net start without any PAN-id filter and all channels
kadonotakashi 0:8fdf9a60065b 171 * - ARM_NWK_AUHTENTICATION_FAIL: Pana Authentication fail, Stack is Already at Idle state
kadonotakashi 0:8fdf9a60065b 172 */
kadonotakashi 0:8fdf9a60065b 173 void thread_tasklet_parse_network_event(arm_event_s *event)
kadonotakashi 0:8fdf9a60065b 174 {
kadonotakashi 0:8fdf9a60065b 175 arm_nwk_interface_status_type_e status = (arm_nwk_interface_status_type_e) event->event_data;
kadonotakashi 0:8fdf9a60065b 176 tr_debug("app_parse_network_event() %d", status);
kadonotakashi 0:8fdf9a60065b 177 switch (status) {
kadonotakashi 0:8fdf9a60065b 178 case ARM_NWK_BOOTSTRAP_READY:
kadonotakashi 0:8fdf9a60065b 179 /* Network is ready and node is connected to Access Point */
kadonotakashi 0:8fdf9a60065b 180 if (thread_tasklet_data_ptr->tasklet_state != TASKLET_STATE_BOOTSTRAP_READY) {
kadonotakashi 0:8fdf9a60065b 181 tr_info("Thread bootstrap ready");
kadonotakashi 0:8fdf9a60065b 182 thread_tasklet_data_ptr->tasklet_state = TASKLET_STATE_BOOTSTRAP_READY;
kadonotakashi 0:8fdf9a60065b 183 thread_tasklet_trace_bootstrap_info();
kadonotakashi 0:8fdf9a60065b 184 /* We are connected, for Local or Global IP */
kadonotakashi 0:8fdf9a60065b 185 thread_tasklet_poll_network_status(NULL);
kadonotakashi 0:8fdf9a60065b 186 }
kadonotakashi 0:8fdf9a60065b 187 break;
kadonotakashi 0:8fdf9a60065b 188 case ARM_NWK_NWK_SCAN_FAIL:
kadonotakashi 0:8fdf9a60065b 189 /* Link Layer Active Scan Fail, Stack is Already at Idle state */
kadonotakashi 0:8fdf9a60065b 190 tr_debug("Link Layer Scan Fail: No Beacons");
kadonotakashi 0:8fdf9a60065b 191 thread_tasklet_data_ptr->tasklet_state = TASKLET_STATE_BOOTSTRAP_FAILED;
kadonotakashi 0:8fdf9a60065b 192 thread_tasklet_network_state_changed(MESH_DISCONNECTED);
kadonotakashi 0:8fdf9a60065b 193 break;
kadonotakashi 0:8fdf9a60065b 194 case ARM_NWK_IP_ADDRESS_ALLOCATION_FAIL:
kadonotakashi 0:8fdf9a60065b 195 /* No ND Router at current Channel Stack is Already at Idle state */
kadonotakashi 0:8fdf9a60065b 196 tr_debug("ND Scan/ GP REG fail");
kadonotakashi 0:8fdf9a60065b 197 thread_tasklet_data_ptr->tasklet_state = TASKLET_STATE_BOOTSTRAP_FAILED;
kadonotakashi 0:8fdf9a60065b 198 thread_tasklet_network_state_changed(MESH_DISCONNECTED);
kadonotakashi 0:8fdf9a60065b 199 break;
kadonotakashi 0:8fdf9a60065b 200 case ARM_NWK_NWK_CONNECTION_DOWN:
kadonotakashi 0:8fdf9a60065b 201 /* Connection to Access point is lost wait for Scan Result */
kadonotakashi 0:8fdf9a60065b 202 tr_debug("ND/RPL scan new network");
kadonotakashi 0:8fdf9a60065b 203 thread_tasklet_data_ptr->tasklet_state = TASKLET_STATE_BOOTSTRAP_FAILED;
kadonotakashi 0:8fdf9a60065b 204 thread_tasklet_network_state_changed(MESH_DISCONNECTED);
kadonotakashi 0:8fdf9a60065b 205 break;
kadonotakashi 0:8fdf9a60065b 206 case ARM_NWK_NWK_PARENT_POLL_FAIL:
kadonotakashi 0:8fdf9a60065b 207 thread_tasklet_data_ptr->tasklet_state = TASKLET_STATE_BOOTSTRAP_FAILED;
kadonotakashi 0:8fdf9a60065b 208 thread_tasklet_network_state_changed(MESH_DISCONNECTED);
kadonotakashi 0:8fdf9a60065b 209 break;
kadonotakashi 0:8fdf9a60065b 210 case ARM_NWK_AUHTENTICATION_FAIL:
kadonotakashi 0:8fdf9a60065b 211 tr_debug("Network authentication fail");
kadonotakashi 0:8fdf9a60065b 212 thread_tasklet_data_ptr->tasklet_state = TASKLET_STATE_BOOTSTRAP_FAILED;
kadonotakashi 0:8fdf9a60065b 213 thread_tasklet_network_state_changed(MESH_DISCONNECTED);
kadonotakashi 0:8fdf9a60065b 214 break;
kadonotakashi 0:8fdf9a60065b 215 default:
kadonotakashi 0:8fdf9a60065b 216 tr_warn("Unknown event %d", status);
kadonotakashi 0:8fdf9a60065b 217 break;
kadonotakashi 0:8fdf9a60065b 218 }
kadonotakashi 0:8fdf9a60065b 219
kadonotakashi 0:8fdf9a60065b 220 if (thread_tasklet_data_ptr->tasklet_state != TASKLET_STATE_BOOTSTRAP_READY &&
kadonotakashi 0:8fdf9a60065b 221 thread_tasklet_data_ptr->nwk_if_id != INVALID_INTERFACE_ID) {
kadonotakashi 0:8fdf9a60065b 222 // Set 5s timer for a new network scan
kadonotakashi 0:8fdf9a60065b 223 eventOS_event_timer_request(TIMER_EVENT_START_BOOTSTRAP,
kadonotakashi 0:8fdf9a60065b 224 ARM_LIB_SYSTEM_TIMER_EVENT,
kadonotakashi 0:8fdf9a60065b 225 thread_tasklet_data_ptr->tasklet,
kadonotakashi 0:8fdf9a60065b 226 5000);
kadonotakashi 0:8fdf9a60065b 227 }
kadonotakashi 0:8fdf9a60065b 228 }
kadonotakashi 0:8fdf9a60065b 229
kadonotakashi 0:8fdf9a60065b 230 void thread_tasklet_poll_network_status(void *param)
kadonotakashi 0:8fdf9a60065b 231 {
kadonotakashi 0:8fdf9a60065b 232 /* Check if we do have an IP */
kadonotakashi 0:8fdf9a60065b 233 uint8_t temp_ipv6[16];
kadonotakashi 0:8fdf9a60065b 234 if (arm_net_address_get(thread_tasklet_data_ptr->nwk_if_id, ADDR_IPV6_GP, temp_ipv6) == 0) {
kadonotakashi 0:8fdf9a60065b 235 /* Check if this is the same IP than previously */
kadonotakashi 0:8fdf9a60065b 236 if (memcmp(temp_ipv6, thread_tasklet_data_ptr->ip, 16) == 0) {
kadonotakashi 0:8fdf9a60065b 237 return;
kadonotakashi 0:8fdf9a60065b 238 } else {
kadonotakashi 0:8fdf9a60065b 239 memcpy(thread_tasklet_data_ptr->ip, temp_ipv6, 16);
kadonotakashi 0:8fdf9a60065b 240 link_configuration_s *link_cfg = thread_management_configuration_get(thread_tasklet_data_ptr->nwk_if_id);
kadonotakashi 0:8fdf9a60065b 241 if (memcmp(thread_tasklet_data_ptr->ip, link_cfg->mesh_local_ula_prefix, 8) == 0) {
kadonotakashi 0:8fdf9a60065b 242 thread_tasklet_network_state_changed(MESH_CONNECTED_LOCAL);
kadonotakashi 0:8fdf9a60065b 243 } else {
kadonotakashi 0:8fdf9a60065b 244 thread_tasklet_network_state_changed(MESH_CONNECTED_GLOBAL);
kadonotakashi 0:8fdf9a60065b 245 }
kadonotakashi 0:8fdf9a60065b 246 }
kadonotakashi 0:8fdf9a60065b 247 } else {
kadonotakashi 0:8fdf9a60065b 248 if (thread_tasklet_data_ptr->connection_status != MESH_DISCONNECTED &&
kadonotakashi 0:8fdf9a60065b 249 thread_tasklet_data_ptr->connection_status != MESH_BOOTSTRAP_STARTED)
kadonotakashi 0:8fdf9a60065b 250 thread_tasklet_network_state_changed(MESH_DISCONNECTED);
kadonotakashi 0:8fdf9a60065b 251 }
kadonotakashi 0:8fdf9a60065b 252 }
kadonotakashi 0:8fdf9a60065b 253
kadonotakashi 0:8fdf9a60065b 254 void read_link_configuration() {
kadonotakashi 0:8fdf9a60065b 255
kadonotakashi 0:8fdf9a60065b 256 thread_tasklet_data_ptr->link_config.panId = MBED_CONF_MBED_MESH_API_THREAD_CONFIG_PANID;
kadonotakashi 0:8fdf9a60065b 257 TRACE_DETAIL("PANID %x", thread_tasklet_data_ptr->link_config.panId);
kadonotakashi 0:8fdf9a60065b 258
kadonotakashi 0:8fdf9a60065b 259 thread_tasklet_data_ptr->link_config.rfChannel = MBED_CONF_MBED_MESH_API_THREAD_CONFIG_CHANNEL;
kadonotakashi 0:8fdf9a60065b 260 TRACE_DETAIL("channel: %d", thread_tasklet_data_ptr->link_config.rfChannel);
kadonotakashi 0:8fdf9a60065b 261
kadonotakashi 0:8fdf9a60065b 262 // Mesh prefix
kadonotakashi 0:8fdf9a60065b 263 const uint8_t mesh_local_prefix[] = MBED_CONF_MBED_MESH_API_THREAD_CONFIG_ML_PREFIX;
kadonotakashi 0:8fdf9a60065b 264 MBED_ASSERT(sizeof(mesh_local_prefix) == 8);
kadonotakashi 0:8fdf9a60065b 265
kadonotakashi 0:8fdf9a60065b 266 memcpy(thread_tasklet_data_ptr->link_config.mesh_local_ula_prefix, mesh_local_prefix, 8);
kadonotakashi 0:8fdf9a60065b 267 TRACE_DETAIL("Mesh prefix: %s", trace_array(mesh_local_prefix, 8));
kadonotakashi 0:8fdf9a60065b 268
kadonotakashi 0:8fdf9a60065b 269 // Master Key
kadonotakashi 0:8fdf9a60065b 270 const uint8_t master_key[] = MBED_CONF_MBED_MESH_API_THREAD_MASTER_KEY;
kadonotakashi 0:8fdf9a60065b 271 MBED_ASSERT(sizeof(master_key) == 16);
kadonotakashi 0:8fdf9a60065b 272 memcpy(thread_tasklet_data_ptr->link_config.master_key, master_key, 16);
kadonotakashi 0:8fdf9a60065b 273
kadonotakashi 0:8fdf9a60065b 274 // PSKc
kadonotakashi 0:8fdf9a60065b 275 const uint8_t PSKc[] = MBED_CONF_MBED_MESH_API_THREAD_CONFIG_PSKC;
kadonotakashi 0:8fdf9a60065b 276 MBED_ASSERT(sizeof(PSKc) == 16);
kadonotakashi 0:8fdf9a60065b 277 memcpy(thread_tasklet_data_ptr->link_config.PSKc, PSKc, 16);
kadonotakashi 0:8fdf9a60065b 278
kadonotakashi 0:8fdf9a60065b 279 thread_tasklet_data_ptr->link_config.key_rotation = 3600;
kadonotakashi 0:8fdf9a60065b 280 thread_tasklet_data_ptr->link_config.key_sequence = 0;
kadonotakashi 0:8fdf9a60065b 281
kadonotakashi 0:8fdf9a60065b 282 thread_tasklet_data_ptr->link_config.securityPolicy = MBED_CONF_MBED_MESH_API_THREAD_SECURITY_POLICY;
kadonotakashi 0:8fdf9a60065b 283
kadonotakashi 0:8fdf9a60065b 284 // network name
kadonotakashi 0:8fdf9a60065b 285 MBED_ASSERT(strlen(MBED_CONF_MBED_MESH_API_THREAD_CONFIG_NETWORK_NAME) > 0 && strlen(MBED_CONF_MBED_MESH_API_THREAD_CONFIG_NETWORK_NAME) < 17);
kadonotakashi 0:8fdf9a60065b 286 memcpy(thread_tasklet_data_ptr->link_config.name, MBED_CONF_MBED_MESH_API_THREAD_CONFIG_NETWORK_NAME, strlen(MBED_CONF_MBED_MESH_API_THREAD_CONFIG_NETWORK_NAME));
kadonotakashi 0:8fdf9a60065b 287
kadonotakashi 0:8fdf9a60065b 288 thread_tasklet_data_ptr->link_config.timestamp = MBED_CONF_MBED_MESH_API_THREAD_CONFIG_COMMISSIONING_DATASET_TIMESTAMP;
kadonotakashi 0:8fdf9a60065b 289
kadonotakashi 0:8fdf9a60065b 290 // extended pan-id
kadonotakashi 0:8fdf9a60065b 291 const uint8_t extented_panid[] = MBED_CONF_MBED_MESH_API_THREAD_CONFIG_EXTENDED_PANID;
kadonotakashi 0:8fdf9a60065b 292 MBED_ASSERT(sizeof(extented_panid) == 8);
kadonotakashi 0:8fdf9a60065b 293 memcpy(thread_tasklet_data_ptr->link_config.extented_pan_id, extented_panid, sizeof(extented_panid));
kadonotakashi 0:8fdf9a60065b 294 }
kadonotakashi 0:8fdf9a60065b 295
kadonotakashi 0:8fdf9a60065b 296 /*
kadonotakashi 0:8fdf9a60065b 297 * \brief Configure mesh network
kadonotakashi 0:8fdf9a60065b 298 *
kadonotakashi 0:8fdf9a60065b 299 */
kadonotakashi 0:8fdf9a60065b 300 void thread_tasklet_configure_and_connect_to_network(void)
kadonotakashi 0:8fdf9a60065b 301 {
kadonotakashi 0:8fdf9a60065b 302 int8_t status;
kadonotakashi 0:8fdf9a60065b 303 link_configuration_s* temp_link_config=NULL;
kadonotakashi 0:8fdf9a60065b 304
kadonotakashi 0:8fdf9a60065b 305
kadonotakashi 0:8fdf9a60065b 306 if (MBED_CONF_MBED_MESH_API_THREAD_DEVICE_TYPE == MESH_DEVICE_TYPE_THREAD_MINIMAL_END_DEVICE) {
kadonotakashi 0:8fdf9a60065b 307 thread_tasklet_data_ptr->operating_mode = NET_6LOWPAN_HOST;
kadonotakashi 0:8fdf9a60065b 308 }
kadonotakashi 0:8fdf9a60065b 309 else if (MBED_CONF_MBED_MESH_API_THREAD_DEVICE_TYPE == MESH_DEVICE_TYPE_THREAD_SLEEPY_END_DEVICE) {
kadonotakashi 0:8fdf9a60065b 310 thread_tasklet_data_ptr->operating_mode = NET_6LOWPAN_SLEEPY_HOST;
kadonotakashi 0:8fdf9a60065b 311 } else {
kadonotakashi 0:8fdf9a60065b 312 thread_tasklet_data_ptr->operating_mode = NET_6LOWPAN_ROUTER;
kadonotakashi 0:8fdf9a60065b 313 }
kadonotakashi 0:8fdf9a60065b 314
kadonotakashi 0:8fdf9a60065b 315 arm_nwk_interface_configure_6lowpan_bootstrap_set(
kadonotakashi 0:8fdf9a60065b 316 thread_tasklet_data_ptr->nwk_if_id,
kadonotakashi 0:8fdf9a60065b 317 thread_tasklet_data_ptr->operating_mode,
kadonotakashi 0:8fdf9a60065b 318 NET_6LOWPAN_THREAD);
kadonotakashi 0:8fdf9a60065b 319
kadonotakashi 0:8fdf9a60065b 320 thread_tasklet_data_ptr->channel_list.channel_page = (channel_page_e)MBED_CONF_MBED_MESH_API_THREAD_CONFIG_CHANNEL_PAGE;
kadonotakashi 0:8fdf9a60065b 321 thread_tasklet_data_ptr->channel_list.channel_mask[0] = MBED_CONF_MBED_MESH_API_THREAD_CONFIG_CHANNEL_MASK;
kadonotakashi 0:8fdf9a60065b 322
kadonotakashi 0:8fdf9a60065b 323 TRACE_DETAIL("channel page: %d", thread_tasklet_data_ptr->channel_list.channel_page);
kadonotakashi 0:8fdf9a60065b 324 TRACE_DETAIL("channel mask: 0x%.8lx", thread_tasklet_data_ptr->channel_list.channel_mask[0]);
kadonotakashi 0:8fdf9a60065b 325
kadonotakashi 0:8fdf9a60065b 326 // PSKd
kadonotakashi 0:8fdf9a60065b 327 const char PSKd[] = MBED_CONF_MBED_MESH_API_THREAD_PSKD;
kadonotakashi 0:8fdf9a60065b 328 if(device_configuration.PSKd_len==0) {
kadonotakashi 0:8fdf9a60065b 329 int ret = thread_tasklet_device_pskd_set(PSKd);
kadonotakashi 0:8fdf9a60065b 330 MBED_ASSERT(!ret);
kadonotakashi 0:8fdf9a60065b 331 }
kadonotakashi 0:8fdf9a60065b 332
kadonotakashi 0:8fdf9a60065b 333 if (true == MBED_CONF_MBED_MESH_API_THREAD_USE_STATIC_LINK_CONFIG) {
kadonotakashi 0:8fdf9a60065b 334 read_link_configuration();
kadonotakashi 0:8fdf9a60065b 335 temp_link_config = &thread_tasklet_data_ptr->link_config;
kadonotakashi 0:8fdf9a60065b 336 }
kadonotakashi 0:8fdf9a60065b 337
kadonotakashi 0:8fdf9a60065b 338 thread_management_node_init(thread_tasklet_data_ptr->nwk_if_id,
kadonotakashi 0:8fdf9a60065b 339 &thread_tasklet_data_ptr->channel_list,
kadonotakashi 0:8fdf9a60065b 340 &device_configuration,
kadonotakashi 0:8fdf9a60065b 341 temp_link_config);
kadonotakashi 0:8fdf9a60065b 342
kadonotakashi 0:8fdf9a60065b 343 status = arm_nwk_interface_up(thread_tasklet_data_ptr->nwk_if_id);
kadonotakashi 0:8fdf9a60065b 344
kadonotakashi 0:8fdf9a60065b 345 if (status >= 0) {
kadonotakashi 0:8fdf9a60065b 346 thread_tasklet_data_ptr->tasklet_state = TASKLET_STATE_BOOTSTRAP_STARTED;
kadonotakashi 0:8fdf9a60065b 347 tr_info("Start Thread bootstrap (%s mode)", thread_tasklet_data_ptr->operating_mode == NET_6LOWPAN_SLEEPY_HOST ? "SED" : "Router");
kadonotakashi 0:8fdf9a60065b 348 thread_tasklet_network_state_changed(MESH_BOOTSTRAP_STARTED);
kadonotakashi 0:8fdf9a60065b 349 } else {
kadonotakashi 0:8fdf9a60065b 350 thread_tasklet_data_ptr->tasklet_state = TASKLET_STATE_BOOTSTRAP_FAILED;
kadonotakashi 0:8fdf9a60065b 351 tr_err("Bootstrap start failed, %d", status);
kadonotakashi 0:8fdf9a60065b 352 thread_tasklet_network_state_changed(MESH_BOOTSTRAP_START_FAILED);
kadonotakashi 0:8fdf9a60065b 353 }
kadonotakashi 0:8fdf9a60065b 354 }
kadonotakashi 0:8fdf9a60065b 355
kadonotakashi 0:8fdf9a60065b 356 /*
kadonotakashi 0:8fdf9a60065b 357 * Inform application about network state change
kadonotakashi 0:8fdf9a60065b 358 */
kadonotakashi 0:8fdf9a60065b 359 void thread_tasklet_network_state_changed(mesh_connection_status_t status)
kadonotakashi 0:8fdf9a60065b 360 {
kadonotakashi 0:8fdf9a60065b 361 thread_tasklet_data_ptr->connection_status = status;
kadonotakashi 0:8fdf9a60065b 362 if (thread_tasklet_data_ptr->mesh_api_cb) {
kadonotakashi 0:8fdf9a60065b 363 (thread_tasklet_data_ptr->mesh_api_cb)(status);
kadonotakashi 0:8fdf9a60065b 364 }
kadonotakashi 0:8fdf9a60065b 365 }
kadonotakashi 0:8fdf9a60065b 366
kadonotakashi 0:8fdf9a60065b 367 /*
kadonotakashi 0:8fdf9a60065b 368 * Trace bootstrap information.
kadonotakashi 0:8fdf9a60065b 369 */
kadonotakashi 0:8fdf9a60065b 370 #ifdef TRACE_THREAD_TASKLET
kadonotakashi 0:8fdf9a60065b 371 void thread_tasklet_trace_bootstrap_info()
kadonotakashi 0:8fdf9a60065b 372 {
kadonotakashi 0:8fdf9a60065b 373 link_layer_address_s app_link_address_info;
kadonotakashi 0:8fdf9a60065b 374 uint8_t temp_ipv6[16];
kadonotakashi 0:8fdf9a60065b 375 if (arm_net_address_get(thread_tasklet_data_ptr->nwk_if_id,
kadonotakashi 0:8fdf9a60065b 376 ADDR_IPV6_GP, temp_ipv6) == 0) {
kadonotakashi 0:8fdf9a60065b 377 tr_debug("GP IPv6: %s", trace_ipv6(temp_ipv6));
kadonotakashi 0:8fdf9a60065b 378 }
kadonotakashi 0:8fdf9a60065b 379
kadonotakashi 0:8fdf9a60065b 380 if (arm_nwk_mac_address_read(thread_tasklet_data_ptr->nwk_if_id,
kadonotakashi 0:8fdf9a60065b 381 &app_link_address_info) != 0) {
kadonotakashi 0:8fdf9a60065b 382 tr_error("MAC Address read fail\n");
kadonotakashi 0:8fdf9a60065b 383 } else {
kadonotakashi 0:8fdf9a60065b 384 uint8_t temp[2];
kadonotakashi 0:8fdf9a60065b 385 common_write_16_bit(app_link_address_info.mac_short,temp);
kadonotakashi 0:8fdf9a60065b 386 tr_debug("MAC 16-bit: %s", trace_array(temp, 2));
kadonotakashi 0:8fdf9a60065b 387 common_write_16_bit(app_link_address_info.PANId, temp);
kadonotakashi 0:8fdf9a60065b 388 tr_debug("PAN ID: %s", trace_array(temp, 2));
kadonotakashi 0:8fdf9a60065b 389 tr_debug("MAC 64-bit: %s", trace_array(app_link_address_info.mac_long, 8));
kadonotakashi 0:8fdf9a60065b 390 tr_debug("IID (Based on MAC 64-bit address): %s", trace_array(app_link_address_info.iid_eui64, 8));
kadonotakashi 0:8fdf9a60065b 391 }
kadonotakashi 0:8fdf9a60065b 392 }
kadonotakashi 0:8fdf9a60065b 393 #endif /* #define TRACE_THREAD_TASKLET */
kadonotakashi 0:8fdf9a60065b 394
kadonotakashi 0:8fdf9a60065b 395 int8_t thread_tasklet_connect(mesh_interface_cb callback, int8_t nwk_interface_id)
kadonotakashi 0:8fdf9a60065b 396 {
kadonotakashi 0:8fdf9a60065b 397 int8_t re_connecting = true;
kadonotakashi 0:8fdf9a60065b 398 int8_t tasklet = thread_tasklet_data_ptr->tasklet;
kadonotakashi 0:8fdf9a60065b 399
kadonotakashi 0:8fdf9a60065b 400 if (thread_tasklet_data_ptr->nwk_if_id != INVALID_INTERFACE_ID) {
kadonotakashi 0:8fdf9a60065b 401 return -3; // already connected to network
kadonotakashi 0:8fdf9a60065b 402 }
kadonotakashi 0:8fdf9a60065b 403
kadonotakashi 0:8fdf9a60065b 404 if (thread_tasklet_data_ptr->tasklet_state == TASKLET_STATE_CREATED) {
kadonotakashi 0:8fdf9a60065b 405 re_connecting = false;
kadonotakashi 0:8fdf9a60065b 406 }
kadonotakashi 0:8fdf9a60065b 407
kadonotakashi 0:8fdf9a60065b 408 memset(thread_tasklet_data_ptr, 0, sizeof(thread_tasklet_data_str_t));
kadonotakashi 0:8fdf9a60065b 409 thread_tasklet_data_ptr->mesh_api_cb = callback;
kadonotakashi 0:8fdf9a60065b 410 thread_tasklet_data_ptr->nwk_if_id = nwk_interface_id;
kadonotakashi 0:8fdf9a60065b 411 thread_tasklet_data_ptr->tasklet_state = TASKLET_STATE_INITIALIZED;
kadonotakashi 0:8fdf9a60065b 412 thread_tasklet_data_ptr->poll_network_status_timeout =
kadonotakashi 0:8fdf9a60065b 413 eventOS_timeout_every_ms(thread_tasklet_poll_network_status, 2000, NULL);
kadonotakashi 0:8fdf9a60065b 414
kadonotakashi 0:8fdf9a60065b 415 if (re_connecting == false) {
kadonotakashi 0:8fdf9a60065b 416 thread_tasklet_data_ptr->tasklet = eventOS_event_handler_create(&thread_tasklet_main,
kadonotakashi 0:8fdf9a60065b 417 ARM_LIB_TASKLET_INIT_EVENT);
kadonotakashi 0:8fdf9a60065b 418 if (thread_tasklet_data_ptr->tasklet < 0) {
kadonotakashi 0:8fdf9a60065b 419 // -1 handler already used by other tasklet
kadonotakashi 0:8fdf9a60065b 420 // -2 memory allocation failure
kadonotakashi 0:8fdf9a60065b 421 return thread_tasklet_data_ptr->tasklet;
kadonotakashi 0:8fdf9a60065b 422 }
kadonotakashi 0:8fdf9a60065b 423 } else {
kadonotakashi 0:8fdf9a60065b 424 thread_tasklet_data_ptr->tasklet = tasklet;
kadonotakashi 0:8fdf9a60065b 425 mesh_system_send_connect_event(thread_tasklet_data_ptr->tasklet);
kadonotakashi 0:8fdf9a60065b 426 }
kadonotakashi 0:8fdf9a60065b 427
kadonotakashi 0:8fdf9a60065b 428 return thread_tasklet_data_ptr->tasklet;
kadonotakashi 0:8fdf9a60065b 429 }
kadonotakashi 0:8fdf9a60065b 430
kadonotakashi 0:8fdf9a60065b 431 int8_t thread_tasklet_disconnect(bool send_cb)
kadonotakashi 0:8fdf9a60065b 432 {
kadonotakashi 0:8fdf9a60065b 433 int8_t status = -1;
kadonotakashi 0:8fdf9a60065b 434 // check that module is initialized
kadonotakashi 0:8fdf9a60065b 435 if (thread_tasklet_data_ptr != NULL) {
kadonotakashi 0:8fdf9a60065b 436 if (thread_tasklet_data_ptr->nwk_if_id != INVALID_INTERFACE_ID) {
kadonotakashi 0:8fdf9a60065b 437 status = arm_nwk_interface_down(thread_tasklet_data_ptr->nwk_if_id);
kadonotakashi 0:8fdf9a60065b 438 thread_tasklet_data_ptr->nwk_if_id = INVALID_INTERFACE_ID;
kadonotakashi 0:8fdf9a60065b 439 if (send_cb == true) {
kadonotakashi 0:8fdf9a60065b 440 thread_tasklet_network_state_changed(MESH_DISCONNECTED);
kadonotakashi 0:8fdf9a60065b 441 }
kadonotakashi 0:8fdf9a60065b 442 }
kadonotakashi 0:8fdf9a60065b 443
kadonotakashi 0:8fdf9a60065b 444 // Clear callback, it will be set again in next connect
kadonotakashi 0:8fdf9a60065b 445 thread_tasklet_data_ptr->mesh_api_cb = NULL;
kadonotakashi 0:8fdf9a60065b 446 // Cancel the callback timeout
kadonotakashi 0:8fdf9a60065b 447 eventOS_timeout_cancel(thread_tasklet_data_ptr->poll_network_status_timeout);
kadonotakashi 0:8fdf9a60065b 448 }
kadonotakashi 0:8fdf9a60065b 449 return status;
kadonotakashi 0:8fdf9a60065b 450 }
kadonotakashi 0:8fdf9a60065b 451
kadonotakashi 0:8fdf9a60065b 452 void thread_tasklet_init(void)
kadonotakashi 0:8fdf9a60065b 453 {
kadonotakashi 0:8fdf9a60065b 454 if (thread_tasklet_data_ptr == NULL) {
kadonotakashi 0:8fdf9a60065b 455 thread_tasklet_data_ptr = ns_dyn_mem_alloc(sizeof(thread_tasklet_data_str_t));
kadonotakashi 0:8fdf9a60065b 456 memset(thread_tasklet_data_ptr, 0, sizeof(thread_tasklet_data_str_t));
kadonotakashi 0:8fdf9a60065b 457 thread_tasklet_data_ptr->tasklet_state = TASKLET_STATE_CREATED;
kadonotakashi 0:8fdf9a60065b 458 thread_tasklet_data_ptr->nwk_if_id = INVALID_INTERFACE_ID;
kadonotakashi 0:8fdf9a60065b 459 }
kadonotakashi 0:8fdf9a60065b 460 }
kadonotakashi 0:8fdf9a60065b 461
kadonotakashi 0:8fdf9a60065b 462 int8_t thread_tasklet_network_init(int8_t device_id)
kadonotakashi 0:8fdf9a60065b 463 {
kadonotakashi 0:8fdf9a60065b 464 // TODO, read interface name from configuration
kadonotakashi 0:8fdf9a60065b 465 mac_description_storage_size_t storage_sizes;
kadonotakashi 0:8fdf9a60065b 466 storage_sizes.device_decription_table_size = 32;
kadonotakashi 0:8fdf9a60065b 467 storage_sizes.key_description_table_size = 6;
kadonotakashi 0:8fdf9a60065b 468 storage_sizes.key_lookup_size = 1;
kadonotakashi 0:8fdf9a60065b 469 storage_sizes.key_usage_size = 3;
kadonotakashi 0:8fdf9a60065b 470 if (!mac_api) {
kadonotakashi 0:8fdf9a60065b 471 mac_api = ns_sw_mac_create(device_id, &storage_sizes);
kadonotakashi 0:8fdf9a60065b 472 }
kadonotakashi 0:8fdf9a60065b 473 return arm_nwk_interface_lowpan_init(mac_api, INTERFACE_NAME);
kadonotakashi 0:8fdf9a60065b 474 }
kadonotakashi 0:8fdf9a60065b 475
kadonotakashi 0:8fdf9a60065b 476 void thread_tasklet_device_eui64_set(const uint8_t *eui64)
kadonotakashi 0:8fdf9a60065b 477 {
kadonotakashi 0:8fdf9a60065b 478 memcpy(device_configuration.eui64, eui64, 8);
kadonotakashi 0:8fdf9a60065b 479 }
kadonotakashi 0:8fdf9a60065b 480
kadonotakashi 0:8fdf9a60065b 481 void thread_tasklet_device_eui64_get(uint8_t *eui64)
kadonotakashi 0:8fdf9a60065b 482 {
kadonotakashi 0:8fdf9a60065b 483 memcpy(eui64, device_configuration.eui64, 8);
kadonotakashi 0:8fdf9a60065b 484 }
kadonotakashi 0:8fdf9a60065b 485
kadonotakashi 0:8fdf9a60065b 486 uint8_t thread_tasklet_device_pskd_set(const char *pskd)
kadonotakashi 0:8fdf9a60065b 487 {
kadonotakashi 0:8fdf9a60065b 488 int len = strlen(pskd);
kadonotakashi 0:8fdf9a60065b 489 if(len < 6 || len > 32) {
kadonotakashi 0:8fdf9a60065b 490 return MESH_ERROR_PARAM;
kadonotakashi 0:8fdf9a60065b 491 }
kadonotakashi 0:8fdf9a60065b 492 char *dyn_buf = ns_dyn_mem_alloc(strlen(pskd)+1);
kadonotakashi 0:8fdf9a60065b 493 if (!dyn_buf) {
kadonotakashi 0:8fdf9a60065b 494 return MESH_ERROR_MEMORY;
kadonotakashi 0:8fdf9a60065b 495 }
kadonotakashi 0:8fdf9a60065b 496 strcpy(dyn_buf, pskd);
kadonotakashi 0:8fdf9a60065b 497 ns_dyn_mem_free(device_configuration.PSKd_ptr);
kadonotakashi 0:8fdf9a60065b 498 device_configuration.PSKd_ptr = (uint8_t*)dyn_buf;
kadonotakashi 0:8fdf9a60065b 499 device_configuration.PSKd_len = strlen(pskd);
kadonotakashi 0:8fdf9a60065b 500 return 0;
kadonotakashi 0:8fdf9a60065b 501 }
kadonotakashi 0:8fdf9a60065b 502
kadonotakashi 0:8fdf9a60065b 503
kadonotakashi 0:8fdf9a60065b 504 int8_t thread_tasklet_data_poll_rate_set(uint32_t timeout)
kadonotakashi 0:8fdf9a60065b 505 {
kadonotakashi 0:8fdf9a60065b 506 int8_t status = -1;
kadonotakashi 0:8fdf9a60065b 507 if (thread_tasklet_data_ptr) {
kadonotakashi 0:8fdf9a60065b 508 if (timeout != 0) {
kadonotakashi 0:8fdf9a60065b 509 status = arm_nwk_host_mode_set(thread_tasklet_data_ptr->nwk_if_id, NET_HOST_SLOW_POLL_MODE, timeout);
kadonotakashi 0:8fdf9a60065b 510 } else {
kadonotakashi 0:8fdf9a60065b 511 status = arm_nwk_host_mode_set(thread_tasklet_data_ptr->nwk_if_id, NET_HOST_RX_ON_IDLE, timeout);
kadonotakashi 0:8fdf9a60065b 512 }
kadonotakashi 0:8fdf9a60065b 513 }
kadonotakashi 0:8fdf9a60065b 514
kadonotakashi 0:8fdf9a60065b 515 return status;
kadonotakashi 0:8fdf9a60065b 516 }