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-os/features/nanostack/mbed-mesh-api/source/thread_tasklet.c@0:8fdf9a60065b, 2018-10-10 (annotated)
- 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?
User | Revision | Line number | New 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 | } |