Nanostack Border Router is a generic mbed border router implementation that provides the 6LoWPAN ND or Thread border router initialization logic.

Committer:
mbed_official
Date:
Tue Jun 12 07:30:28 2018 +0100
Revision:
65:92e581c01e8c
Parent:
63:d01e7341699d
Child:
82:3d9e3b7b3dcf
Merge branch 'mbed-os-5.9.0-oob'

* mbed-os-5.9.0-oob:
Updating mbed-os to mbed-os-5.9.0-rc3
Add Known Issues to README (#118)
Add file system instructions to README (#117)
?Update Thread configuration (#116)
Updating mbed-os to mbed-os-5.9.0-rc2
Revert "Revert support for EMAC backhaul driver"
Update configuration files
Updating mbed-os to mbed-os-5.9.0-rc1

.
Commit copied from https://github.com/ARMmbed/nanostack-border-router

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:85f4174a8e29 1 /*
mbed_official 0:85f4174a8e29 2 * Copyright (c) 2016 ARM Limited. All rights reserved.
mbed_official 0:85f4174a8e29 3 */
mbed_official 0:85f4174a8e29 4
mbed_official 0:85f4174a8e29 5 #define LOWPAN_ND 0
mbed_official 0:85f4174a8e29 6 #define THREAD 1
mbed_official 0:85f4174a8e29 7 #if MBED_CONF_APP_MESH_MODE == LOWPAN_ND
mbed_official 0:85f4174a8e29 8
mbed_official 0:85f4174a8e29 9 #include <string.h>
mbed_official 0:85f4174a8e29 10 #include <stdlib.h>
mbed_official 0:85f4174a8e29 11 #include "ns_types.h"
mbed_official 0:85f4174a8e29 12 #include "eventOS_event.h"
mbed_official 0:85f4174a8e29 13 #include "eventOS_event_timer.h"
mbed_official 0:85f4174a8e29 14 #include "eventOS_scheduler.h"
mbed_official 0:85f4174a8e29 15 #include "multicast_api.h"
mbed_official 0:85f4174a8e29 16 #include "whiteboard_api.h"
mbed_official 0:85f4174a8e29 17 #include "platform/arm_hal_timer.h"
mbed_official 0:85f4174a8e29 18 #include "borderrouter_tasklet.h"
mbed_official 0:85f4174a8e29 19 #include "borderrouter_helpers.h"
mbed_official 0:85f4174a8e29 20 #include "net_interface.h"
mbed_official 0:85f4174a8e29 21 #include "cfg_parser.h"
mbed_official 0:85f4174a8e29 22 #include "rf_wrapper.h"
mbed_official 0:85f4174a8e29 23 #include "nwk_stats_api.h"
mbed_official 0:85f4174a8e29 24 #include "net_interface.h"
mbed_official 0:85f4174a8e29 25 #include "ip6string.h"
mbed_official 0:85f4174a8e29 26 #include "net_rpl.h"
mbed_official 0:85f4174a8e29 27 #include "mac_api.h"
mbed_official 0:85f4174a8e29 28 #include "ethernet_mac_api.h"
mbed_official 0:85f4174a8e29 29 #include "sw_mac.h"
mbed_official 0:85f4174a8e29 30
mbed_official 0:85f4174a8e29 31 #include "static_6lowpan_config.h"
mbed_official 0:85f4174a8e29 32
mbed_official 0:85f4174a8e29 33 #include "ns_trace.h"
mbed_official 0:85f4174a8e29 34 #define TRACE_GROUP "brro"
mbed_official 0:85f4174a8e29 35
mbed_official 0:85f4174a8e29 36 #define NR_BACKHAUL_INTERFACE_PHY_DRIVER_READY 2
mbed_official 0:85f4174a8e29 37 #define NR_BACKHAUL_INTERFACE_PHY_DOWN 3
mbed_official 0:85f4174a8e29 38
mbed_official 0:85f4174a8e29 39 static mac_api_t *api;
mbed_official 0:85f4174a8e29 40 static eth_mac_api_t *eth_mac_api;
mbed_official 0:85f4174a8e29 41
mbed_official 0:85f4174a8e29 42 /* The border router tasklet runs in grounded/non-storing mode */
mbed_official 0:85f4174a8e29 43 #define RPL_FLAGS RPL_GROUNDED | BR_DODAG_MOP_NON_STORING | RPL_DODAG_PREF(0)
mbed_official 0:85f4174a8e29 44
mbed_official 0:85f4174a8e29 45 typedef enum interface_bootstrap_state {
mbed_official 0:85f4174a8e29 46 INTERFACE_IDLE_PHY_NOT_READY,
mbed_official 0:85f4174a8e29 47 INTERFACE_IDLE_STATE,
mbed_official 0:85f4174a8e29 48 INTERFACE_BOOTSTRAP_ACTIVE,
mbed_official 0:85f4174a8e29 49 INTERFACE_CONNECTED
mbed_official 0:85f4174a8e29 50 } interface_bootstrap_state_e;
mbed_official 0:85f4174a8e29 51
mbed_official 0:85f4174a8e29 52 typedef struct {
mbed_official 0:85f4174a8e29 53 uint8_t DODAG_ID[16];
mbed_official 0:85f4174a8e29 54 uint8_t rpl_instance_id;
mbed_official 0:85f4174a8e29 55 uint8_t rpl_setups;
mbed_official 0:85f4174a8e29 56 } rpl_setup_info_t;
mbed_official 0:85f4174a8e29 57
mbed_official 0:85f4174a8e29 58 typedef struct {
mbed_official 0:85f4174a8e29 59 int8_t prefix_len;
mbed_official 0:85f4174a8e29 60 uint8_t prefix[16];
mbed_official 0:85f4174a8e29 61 uint8_t next_hop[16];
mbed_official 0:85f4174a8e29 62 } route_info_t;
mbed_official 0:85f4174a8e29 63
mbed_official 0:85f4174a8e29 64 /* Border router channel list */
mbed_official 0:85f4174a8e29 65 static channel_list_s channel_list;
mbed_official 0:85f4174a8e29 66
mbed_official 0:85f4174a8e29 67 /* Channel masks for different RF types */
mbed_official 0:85f4174a8e29 68 static const uint32_t channel_mask_0_2_4ghz = 0x07fff800;
mbed_official 0:85f4174a8e29 69
mbed_official 0:85f4174a8e29 70 /* Border router settings */
mbed_official 0:85f4174a8e29 71 static border_router_setup_s br;
mbed_official 0:85f4174a8e29 72
mbed_official 0:85f4174a8e29 73 /* RPL routing settings */
mbed_official 0:85f4174a8e29 74 static rpl_setup_info_t rpl_setup_info;
mbed_official 0:85f4174a8e29 75
mbed_official 0:85f4174a8e29 76 /* DODAG configuration */
mbed_official 0:85f4174a8e29 77 static dodag_config_t dodag_config;
mbed_official 0:85f4174a8e29 78
mbed_official 0:85f4174a8e29 79 /* Backhaul prefix */
mbed_official 0:85f4174a8e29 80 static uint8_t backhaul_prefix[16] = {0};
mbed_official 0:85f4174a8e29 81
mbed_official 0:85f4174a8e29 82 /* Backhaul default route information */
mbed_official 0:85f4174a8e29 83 static route_info_t backhaul_route;
mbed_official 0:85f4174a8e29 84
mbed_official 0:85f4174a8e29 85 /* Should prefix on the backhaul used for PAN as well? */
mbed_official 0:85f4174a8e29 86 static uint8_t rf_prefix_from_backhaul = 0;
mbed_official 0:85f4174a8e29 87
mbed_official 0:85f4174a8e29 88 static net_6lowpan_mode_e operating_mode = NET_6LOWPAN_BORDER_ROUTER;
mbed_official 0:85f4174a8e29 89 static net_6lowpan_mode_extension_e operating_mode_extension = NET_6LOWPAN_ND_WITH_MLE;
mbed_official 0:85f4174a8e29 90 static interface_bootstrap_state_e net_6lowpan_state = INTERFACE_IDLE_PHY_NOT_READY;
mbed_official 0:85f4174a8e29 91 static interface_bootstrap_state_e net_backhaul_state = INTERFACE_IDLE_PHY_NOT_READY;
mbed_official 0:85f4174a8e29 92 static net_ipv6_mode_e backhaul_bootstrap_mode = NET_IPV6_BOOTSTRAP_STATIC;
mbed_official 0:85f4174a8e29 93
mbed_official 0:85f4174a8e29 94 static const uint8_t gp16_address_suffix[6] = {0x00, 0x00, 0x00, 0xff, 0xfe, 0x00};
mbed_official 0:85f4174a8e29 95
mbed_official 0:85f4174a8e29 96 static int8_t br_tasklet_id = -1;
mbed_official 0:85f4174a8e29 97 static int8_t net_6lowpan_id = -1;
mbed_official 0:85f4174a8e29 98 static int8_t backhaul_if_id = -1;
mbed_official 0:85f4174a8e29 99
mbed_official 0:85f4174a8e29 100 /* Network statistics */
mbed_official 0:85f4174a8e29 101 static nwk_stats_t nwk_stats;
mbed_official 0:85f4174a8e29 102
mbed_official 0:85f4174a8e29 103 /* Link layer security information */
mbed_official 0:85f4174a8e29 104 static net_6lowpan_link_layer_sec_mode_e link_security_mode;
mbed_official 0:85f4174a8e29 105 static net_link_layer_psk_security_info_s link_layer_psk;
mbed_official 0:85f4174a8e29 106 static net_tls_cipher_e pana_security_suite;
mbed_official 0:85f4174a8e29 107
mbed_official 0:85f4174a8e29 108 static uint8_t multicast_addr[16] = {0};
mbed_official 0:85f4174a8e29 109
mbed_official 0:85f4174a8e29 110 /* Function forward declarations */
mbed_official 0:85f4174a8e29 111 static void app_parse_network_event(arm_event_s *event);
mbed_official 0:85f4174a8e29 112 static void borderrouter_tasklet(arm_event_s *event);
mbed_official 0:85f4174a8e29 113 static void initialize_channel_list(uint32_t channel);
mbed_official 0:85f4174a8e29 114 static void start_6lowpan(const uint8_t *backhaul_address);
mbed_official 0:85f4174a8e29 115 static int8_t rf_interface_init(void);
mbed_official 0:85f4174a8e29 116 static void load_config(void);
mbed_official 0:85f4174a8e29 117
mbed_official 7:571f9a90b972 118 void border_router_tasklet_start(void)
mbed_official 0:85f4174a8e29 119 {
mbed_official 0:85f4174a8e29 120 /* initialize Radio module*/
mbed_official 0:85f4174a8e29 121 net_6lowpan_id = rf_interface_init();
mbed_official 0:85f4174a8e29 122
mbed_official 37:465118eec099 123 load_config();
mbed_official 37:465118eec099 124
mbed_official 0:85f4174a8e29 125 protocol_stats_start(&nwk_stats);
mbed_official 0:85f4174a8e29 126
mbed_official 0:85f4174a8e29 127 eventOS_event_handler_create(
mbed_official 0:85f4174a8e29 128 &borderrouter_tasklet,
mbed_official 0:85f4174a8e29 129 ARM_LIB_TASKLET_INIT_EVENT);
mbed_official 0:85f4174a8e29 130 }
mbed_official 0:85f4174a8e29 131
mbed_official 0:85f4174a8e29 132 static void print_interface_addr(int id)
mbed_official 0:85f4174a8e29 133 {
mbed_official 0:85f4174a8e29 134 uint8_t address_buf[128];
mbed_official 0:85f4174a8e29 135 int address_count = 0;
mbed_official 0:85f4174a8e29 136 char buf[128];
mbed_official 0:85f4174a8e29 137
mbed_official 0:85f4174a8e29 138 if (arm_net_address_list_get(id, 128, address_buf, &address_count) == 0) {
mbed_official 0:85f4174a8e29 139 uint8_t *t_buf = address_buf;
mbed_official 0:85f4174a8e29 140 for (int i = 0; i < address_count; ++i) {
mbed_official 0:85f4174a8e29 141 ip6tos(t_buf, buf);
mbed_official 0:85f4174a8e29 142 tr_info(" [%d] %s", i, buf);
mbed_official 0:85f4174a8e29 143 t_buf += 16;
mbed_official 0:85f4174a8e29 144 }
mbed_official 0:85f4174a8e29 145 }
mbed_official 0:85f4174a8e29 146 }
mbed_official 0:85f4174a8e29 147
mbed_official 0:85f4174a8e29 148 static void initialize_channel_list(uint32_t channel)
mbed_official 0:85f4174a8e29 149 {
mbed_official 0:85f4174a8e29 150 const int_fast8_t word_index = channel / 32;
mbed_official 0:85f4174a8e29 151 const int_fast8_t bit_index = channel % 32;
mbed_official 0:85f4174a8e29 152
mbed_official 0:85f4174a8e29 153 if (channel > 0) {
mbed_official 0:85f4174a8e29 154 /* Zero channel value means listen all channels */
mbed_official 0:85f4174a8e29 155 memset(&channel_list.channel_mask, 0, sizeof(channel_list.channel_mask));
mbed_official 0:85f4174a8e29 156 channel_list.channel_mask[word_index] |= ((uint32_t) 1 << bit_index);
mbed_official 0:85f4174a8e29 157 }
mbed_official 0:85f4174a8e29 158 }
mbed_official 0:85f4174a8e29 159
mbed_official 0:85f4174a8e29 160 static void load_config(void)
mbed_official 0:85f4174a8e29 161 {
mbed_official 0:85f4174a8e29 162 const char *prefix, *psk;
mbed_official 0:85f4174a8e29 163 uint8_t nd_prefix[16];
mbed_official 0:85f4174a8e29 164
mbed_official 0:85f4174a8e29 165 prefix = cfg_string(global_config, "PREFIX", NULL);
mbed_official 0:85f4174a8e29 166
mbed_official 0:85f4174a8e29 167 if (!prefix) {
mbed_official 0:85f4174a8e29 168 tr_error("No RF prefix in configuration!");
mbed_official 0:85f4174a8e29 169 return;
mbed_official 0:85f4174a8e29 170 }
mbed_official 0:85f4174a8e29 171
mbed_official 0:85f4174a8e29 172 stoip6(prefix, strlen(prefix), nd_prefix);
mbed_official 0:85f4174a8e29 173
mbed_official 0:85f4174a8e29 174 prefix = cfg_string(global_config, "BACKHAUL_PREFIX", NULL);
mbed_official 0:85f4174a8e29 175 if (!prefix) {
mbed_official 0:85f4174a8e29 176 tr_error("No backhaul prefix in configuration!");
mbed_official 0:85f4174a8e29 177 return;
mbed_official 0:85f4174a8e29 178 }
mbed_official 0:85f4174a8e29 179
mbed_official 0:85f4174a8e29 180 stoip6(prefix, strlen(prefix), backhaul_prefix);
mbed_official 0:85f4174a8e29 181 memset(&backhaul_prefix[8], 0, 8);
mbed_official 0:85f4174a8e29 182
mbed_official 0:85f4174a8e29 183 prefix = cfg_string(global_config, "MULTICAST_ADDR", NULL);
mbed_official 0:85f4174a8e29 184 if (!prefix) {
mbed_official 0:85f4174a8e29 185 tr_error("No multicast address in configuration!");
mbed_official 0:85f4174a8e29 186 return;
mbed_official 0:85f4174a8e29 187 }
mbed_official 0:85f4174a8e29 188
mbed_official 0:85f4174a8e29 189 stoip6(prefix, strlen(prefix), multicast_addr);
mbed_official 0:85f4174a8e29 190
mbed_official 0:85f4174a8e29 191 /* Set up channel page and channgel mask */
mbed_official 0:85f4174a8e29 192 memset(&channel_list, 0, sizeof(channel_list));
mbed_official 0:85f4174a8e29 193 channel_list.channel_page = (channel_page_e)cfg_int(global_config, "RF_CHANNEL_PAGE", CHANNEL_PAGE_0);
mbed_official 0:85f4174a8e29 194 channel_list.channel_mask[0] = cfg_int(global_config, "RF_CHANNEL_MASK", channel_mask_0_2_4ghz);
mbed_official 0:85f4174a8e29 195
mbed_official 0:85f4174a8e29 196 prefix = cfg_string(global_config, "NETWORK_ID", "NETWORK000000000");
mbed_official 0:85f4174a8e29 197 memcpy(br.network_id, prefix, 16);
mbed_official 0:85f4174a8e29 198
mbed_official 0:85f4174a8e29 199 br.mac_panid = cfg_int(global_config, "PAN_ID", 0x0691);
mbed_official 0:85f4174a8e29 200 tr_info("PANID: %x", br.mac_panid);
mbed_official 0:85f4174a8e29 201 br.mac_short_adr = cfg_int(global_config, "SHORT_MAC_ADDRESS", 0xffff);
mbed_official 0:85f4174a8e29 202 br.ra_life_time = cfg_int(global_config, "RA_ROUTER_LIFETIME", 1024);
mbed_official 0:85f4174a8e29 203 br.beacon_protocol_id = cfg_int(global_config, "BEACON_PROTOCOL_ID", 4);
mbed_official 0:85f4174a8e29 204
mbed_official 0:85f4174a8e29 205 memcpy(br.lowpan_nd_prefix, nd_prefix, 8);
mbed_official 0:85f4174a8e29 206 br.abro_version_num = 0;
mbed_official 0:85f4174a8e29 207
mbed_official 0:85f4174a8e29 208 /* RPL routing setup */
mbed_official 0:85f4174a8e29 209 rpl_setup_info.rpl_instance_id = cfg_int(global_config, "RPL_INSTANCE_ID", 1);
mbed_official 0:85f4174a8e29 210 rpl_setup_info.rpl_setups = RPL_FLAGS;
mbed_official 0:85f4174a8e29 211
mbed_official 0:85f4174a8e29 212 /* generate DODAG ID */
mbed_official 0:85f4174a8e29 213 memcpy(rpl_setup_info.DODAG_ID, nd_prefix, 8);
mbed_official 37:465118eec099 214 if (br.mac_short_adr < 0xfffe) {
mbed_official 37:465118eec099 215 memcpy(&rpl_setup_info.DODAG_ID[8], gp16_address_suffix, 6);
mbed_official 37:465118eec099 216 rpl_setup_info.DODAG_ID[14] = (br.mac_short_adr >> 8);
mbed_official 37:465118eec099 217 rpl_setup_info.DODAG_ID[15] = br.mac_short_adr;
mbed_official 37:465118eec099 218 } else {
mbed_official 37:465118eec099 219 rf_read_mac_address(&rpl_setup_info.DODAG_ID[8]);
mbed_official 37:465118eec099 220 rpl_setup_info.DODAG_ID[8] ^= 2;
mbed_official 37:465118eec099 221 }
mbed_official 0:85f4174a8e29 222
mbed_official 0:85f4174a8e29 223 /* DODAG configuration */
mbed_official 0:85f4174a8e29 224 dodag_config.DAG_DIO_INT_DOUB = cfg_int(global_config, "RPL_IDOUBLINGS", 12);
mbed_official 0:85f4174a8e29 225 dodag_config.DAG_DIO_INT_MIN = cfg_int(global_config, "RPL_IMIN", 9);
mbed_official 0:85f4174a8e29 226 dodag_config.DAG_DIO_REDU = cfg_int(global_config, "RPL_K", 10);
mbed_official 0:85f4174a8e29 227 dodag_config.DAG_MAX_RANK_INC = cfg_int(global_config, "RPL_MAX_RANK_INC", 2048);
mbed_official 0:85f4174a8e29 228 dodag_config.DAG_MIN_HOP_RANK_INC = cfg_int(global_config, "RPL_MIN_HOP_RANK_INC", 128);
mbed_official 0:85f4174a8e29 229 dodag_config.LIFE_IN_SECONDS = cfg_int(global_config, "RPL_LIFETIME_UNIT", 64);
mbed_official 0:85f4174a8e29 230 dodag_config.LIFETIME_UNIT = cfg_int(global_config, "RPL_DEFAULT_LIFETIME", 60);
mbed_official 0:85f4174a8e29 231 dodag_config.DAG_SEC_PCS = cfg_int(global_config, "RPL_PCS", 1);
mbed_official 0:85f4174a8e29 232 dodag_config.DAG_OCP = cfg_int(global_config, "RPL_OCP", 1);
mbed_official 0:85f4174a8e29 233
mbed_official 0:85f4174a8e29 234 bool dynamic_bootstrap = (net_ipv6_mode_e)cfg_int(global_config, "BACKHAUL_DYNAMIC_BOOTSTRAP", 0);
mbed_official 0:85f4174a8e29 235
mbed_official 0:85f4174a8e29 236 if (dynamic_bootstrap == 1) {
mbed_official 0:85f4174a8e29 237 backhaul_bootstrap_mode = NET_IPV6_BOOTSTRAP_AUTONOMOUS;
mbed_official 0:85f4174a8e29 238 tr_info("NET_IPV6_BOOTSTRAP_AUTONOMOUS");
mbed_official 0:85f4174a8e29 239 } else {
mbed_official 0:85f4174a8e29 240 tr_info("NET_IPV6_BOOTSTRAP_STATIC");
mbed_official 0:85f4174a8e29 241 backhaul_bootstrap_mode = NET_IPV6_BOOTSTRAP_STATIC;
mbed_official 0:85f4174a8e29 242 }
mbed_official 0:85f4174a8e29 243
mbed_official 0:85f4174a8e29 244 /* Bootstrap mode for the backhaul interface */
mbed_official 0:85f4174a8e29 245 rf_prefix_from_backhaul = cfg_int(global_config, "PREFIX_FROM_BACKHAUL", 0);
mbed_official 0:85f4174a8e29 246
mbed_official 0:85f4174a8e29 247 /* Backhaul default route */
mbed_official 0:85f4174a8e29 248 memset(&backhaul_route, 0, sizeof(backhaul_route));
mbed_official 0:85f4174a8e29 249 psk = cfg_string(global_config, "BACKHAUL_NEXT_HOP", NULL);
mbed_official 0:85f4174a8e29 250
mbed_official 0:85f4174a8e29 251 if (psk) {
mbed_official 0:85f4174a8e29 252 stoip6(psk, strlen(psk), backhaul_route.next_hop);
mbed_official 0:85f4174a8e29 253 }
mbed_official 0:85f4174a8e29 254
mbed_official 0:85f4174a8e29 255 psk = cfg_string(global_config, "BACKHAUL_DEFAULT_ROUTE", NULL);
mbed_official 0:85f4174a8e29 256
mbed_official 0:85f4174a8e29 257 if (psk) {
mbed_official 0:85f4174a8e29 258 char *prefix, route_buf[255] = {0};
mbed_official 0:85f4174a8e29 259
mbed_official 0:85f4174a8e29 260 /* copy the config value to a non-const buffer */
mbed_official 0:85f4174a8e29 261 strncpy(route_buf, psk, sizeof(route_buf) - 1);
mbed_official 0:85f4174a8e29 262 prefix = strtok(route_buf, "/");
mbed_official 0:85f4174a8e29 263 backhaul_route.prefix_len = atoi(strtok(NULL, "/"));
mbed_official 0:85f4174a8e29 264
mbed_official 0:85f4174a8e29 265 stoip6(prefix, strlen(prefix), backhaul_route.prefix);
mbed_official 0:85f4174a8e29 266 }
mbed_official 0:85f4174a8e29 267
mbed_official 0:85f4174a8e29 268 prefix = cfg_string(global_config, "SECURITY_MODE", "NONE");
mbed_official 0:85f4174a8e29 269
mbed_official 0:85f4174a8e29 270 if (strcmp(prefix, "NONE") == 0) {
mbed_official 0:85f4174a8e29 271 link_security_mode = NET_SEC_MODE_NO_LINK_SECURITY;
mbed_official 0:85f4174a8e29 272 tr_warn("Security NOT enabled");
mbed_official 0:85f4174a8e29 273 return;
mbed_official 0:85f4174a8e29 274 }
mbed_official 0:85f4174a8e29 275
mbed_official 0:85f4174a8e29 276 psk = cfg_string(global_config, "PSK_KEY", NULL);
mbed_official 0:85f4174a8e29 277
mbed_official 0:85f4174a8e29 278 if (!psk) {
mbed_official 0:85f4174a8e29 279 tr_error("No PSK set in configuration!");
mbed_official 0:85f4174a8e29 280 return;
mbed_official 0:85f4174a8e29 281 }
mbed_official 0:85f4174a8e29 282
mbed_official 0:85f4174a8e29 283 link_layer_psk.key_id = cfg_int(global_config, "PSK_KEY_ID", 1);
mbed_official 0:85f4174a8e29 284 memcpy(link_layer_psk.security_key, psk, 16);
mbed_official 0:85f4174a8e29 285
mbed_official 0:85f4174a8e29 286 if (strcmp(prefix, "PSK") == 0) {
mbed_official 0:85f4174a8e29 287 tr_debug("Using PSK security mode, key ID = %d", link_layer_psk.key_id);
mbed_official 0:85f4174a8e29 288 link_security_mode = NET_SEC_MODE_PSK_LINK_SECURITY;
mbed_official 0:85f4174a8e29 289 } else if (strcmp(prefix, "PANA") == 0) {
mbed_official 0:85f4174a8e29 290 const char *mode = cfg_string(global_config, "PANA_MODE", "PSK");
mbed_official 0:85f4174a8e29 291 link_security_mode = NET_SEC_MODE_PANA_LINK_SECURITY;
mbed_official 0:85f4174a8e29 292 if (strcmp(mode, "ECC") == 0) {
mbed_official 0:85f4174a8e29 293 pana_security_suite = NET_TLS_ECC_CIPHER;
mbed_official 0:85f4174a8e29 294 } else if (strcmp(mode, "ECC+PSK") == 0) {
mbed_official 0:85f4174a8e29 295 pana_security_suite = NET_TLS_PSK_AND_ECC_CIPHER;
mbed_official 0:85f4174a8e29 296 } else {
mbed_official 0:85f4174a8e29 297 pana_security_suite = NET_TLS_PSK_CIPHER;
mbed_official 0:85f4174a8e29 298 }
mbed_official 0:85f4174a8e29 299 }
mbed_official 0:85f4174a8e29 300 }
mbed_official 0:85f4174a8e29 301
mbed_official 0:85f4174a8e29 302 static int8_t rf_interface_init(void)
mbed_official 0:85f4174a8e29 303 {
mbed_official 0:85f4174a8e29 304 static char phy_name[] = "mesh0";
mbed_official 0:85f4174a8e29 305 int8_t rfid = -1;
mbed_official 0:85f4174a8e29 306 int8_t rf_phy_device_register_id = rf_device_register();
mbed_official 0:85f4174a8e29 307 tr_debug("RF device ID: %d", rf_phy_device_register_id);
mbed_official 0:85f4174a8e29 308
mbed_official 0:85f4174a8e29 309 if (rf_phy_device_register_id >= 0) {
mbed_official 0:85f4174a8e29 310 mac_description_storage_size_t storage_sizes;
mbed_official 0:85f4174a8e29 311 storage_sizes.device_decription_table_size = 32;
mbed_official 0:85f4174a8e29 312 storage_sizes.key_description_table_size = 3;
mbed_official 0:85f4174a8e29 313 storage_sizes.key_lookup_size = 1;
mbed_official 0:85f4174a8e29 314 storage_sizes.key_usage_size = 3;
mbed_official 0:85f4174a8e29 315 if (!api) {
mbed_official 0:85f4174a8e29 316 api = ns_sw_mac_create(rf_phy_device_register_id, &storage_sizes);
mbed_official 0:85f4174a8e29 317 }
mbed_official 0:85f4174a8e29 318 rfid = arm_nwk_interface_lowpan_init(api, phy_name);
mbed_official 0:85f4174a8e29 319 tr_debug("RF interface ID: %d", rfid);
mbed_official 0:85f4174a8e29 320 }
mbed_official 0:85f4174a8e29 321
mbed_official 0:85f4174a8e29 322 return rfid;
mbed_official 0:85f4174a8e29 323 }
mbed_official 0:85f4174a8e29 324
mbed_official 0:85f4174a8e29 325 static void borderrouter_backhaul_phy_status_cb(uint8_t link_up, int8_t driver_id)
mbed_official 0:85f4174a8e29 326 {
mbed_official 0:85f4174a8e29 327 arm_event_s event = {
mbed_official 0:85f4174a8e29 328 .sender = br_tasklet_id,
mbed_official 0:85f4174a8e29 329 .receiver = br_tasklet_id,
mbed_official 0:85f4174a8e29 330 .priority = ARM_LIB_MED_PRIORITY_EVENT,
mbed_official 0:85f4174a8e29 331 .event_type = APPLICATION_EVENT,
mbed_official 0:85f4174a8e29 332 .event_data = driver_id
mbed_official 0:85f4174a8e29 333 };
mbed_official 0:85f4174a8e29 334
mbed_official 0:85f4174a8e29 335 if (link_up) {
mbed_official 0:85f4174a8e29 336 event.event_id = NR_BACKHAUL_INTERFACE_PHY_DRIVER_READY;
mbed_official 0:85f4174a8e29 337 } else {
mbed_official 0:85f4174a8e29 338 event.event_id = NR_BACKHAUL_INTERFACE_PHY_DOWN;
mbed_official 0:85f4174a8e29 339 }
mbed_official 0:85f4174a8e29 340
mbed_official 0:85f4174a8e29 341 tr_debug("Backhaul driver ID: %d", driver_id);
mbed_official 0:85f4174a8e29 342
mbed_official 0:85f4174a8e29 343 eventOS_event_send(&event);
mbed_official 0:85f4174a8e29 344 }
mbed_official 0:85f4174a8e29 345
mbed_official 0:85f4174a8e29 346 static int backhaul_interface_up(int8_t driver_id)
mbed_official 0:85f4174a8e29 347 {
mbed_official 0:85f4174a8e29 348 int retval = -1;
mbed_official 0:85f4174a8e29 349 if (backhaul_if_id != -1) {
mbed_official 0:85f4174a8e29 350 tr_debug("Border RouterInterface already at active state\n");
mbed_official 0:85f4174a8e29 351 } else {
mbed_official 0:85f4174a8e29 352 if (!eth_mac_api) {
mbed_official 0:85f4174a8e29 353 eth_mac_api = ethernet_mac_create(driver_id);
mbed_official 0:85f4174a8e29 354 }
mbed_official 0:85f4174a8e29 355
mbed_official 0:85f4174a8e29 356 backhaul_if_id = arm_nwk_interface_ethernet_init(eth_mac_api, "bh0");
mbed_official 0:85f4174a8e29 357
mbed_official 0:85f4174a8e29 358 if (backhaul_if_id >= 0) {
mbed_official 0:85f4174a8e29 359 tr_debug("Backhaul interface ID: %d", backhaul_if_id);
mbed_official 0:85f4174a8e29 360 if (memcmp(backhaul_prefix, (const uint8_t[8]) { 0 }, 8) == 0) {
mbed_official 0:85f4174a8e29 361 memcpy(backhaul_prefix, rpl_setup_info.DODAG_ID, 8);
mbed_official 0:85f4174a8e29 362 }
mbed_official 0:85f4174a8e29 363 arm_nwk_interface_configure_ipv6_bootstrap_set(
mbed_official 0:85f4174a8e29 364 backhaul_if_id, backhaul_bootstrap_mode, backhaul_prefix);
mbed_official 0:85f4174a8e29 365 arm_nwk_interface_up(backhaul_if_id);
mbed_official 0:85f4174a8e29 366 retval = 0;
mbed_official 0:85f4174a8e29 367 }
mbed_official 0:85f4174a8e29 368 }
mbed_official 0:85f4174a8e29 369 return retval;
mbed_official 0:85f4174a8e29 370 }
mbed_official 0:85f4174a8e29 371
mbed_official 0:85f4174a8e29 372 static int backhaul_interface_down(void)
mbed_official 0:85f4174a8e29 373 {
mbed_official 0:85f4174a8e29 374 int retval = -1;
mbed_official 0:85f4174a8e29 375 if (backhaul_if_id != -1) {
mbed_official 0:85f4174a8e29 376 arm_nwk_interface_down(backhaul_if_id);
mbed_official 0:85f4174a8e29 377 backhaul_if_id = -1;
mbed_official 0:85f4174a8e29 378 retval = 0;
mbed_official 0:85f4174a8e29 379 }
mbed_official 0:85f4174a8e29 380 return retval;
mbed_official 0:85f4174a8e29 381 }
mbed_official 0:85f4174a8e29 382
mbed_official 0:85f4174a8e29 383 /**
mbed_official 0:85f4174a8e29 384 * \brief Border Router Main Tasklet
mbed_official 0:85f4174a8e29 385 *
mbed_official 0:85f4174a8e29 386 * Tasklet Handle next items:
mbed_official 0:85f4174a8e29 387 *
mbed_official 0:85f4174a8e29 388 * - EV_INIT event: Set Certificate Chain, RF Interface Boot UP, multicast Init
mbed_official 0:85f4174a8e29 389 * - SYSTEM_TIMER event: For RF interface Handshake purpose
mbed_official 0:85f4174a8e29 390 *
mbed_official 0:85f4174a8e29 391 */
mbed_official 0:85f4174a8e29 392 static void borderrouter_tasklet(arm_event_s *event)
mbed_official 0:85f4174a8e29 393 {
mbed_official 0:85f4174a8e29 394 arm_library_event_type_e event_type;
mbed_official 0:85f4174a8e29 395 event_type = (arm_library_event_type_e)event->event_type;
mbed_official 0:85f4174a8e29 396
mbed_official 0:85f4174a8e29 397 switch (event_type) {
mbed_official 0:85f4174a8e29 398 case ARM_LIB_NWK_INTERFACE_EVENT:
mbed_official 0:85f4174a8e29 399 app_parse_network_event(event);
mbed_official 0:85f4174a8e29 400 break;
mbed_official 0:85f4174a8e29 401
mbed_official 0:85f4174a8e29 402 case APPLICATION_EVENT:
mbed_official 0:85f4174a8e29 403 if (event->event_id == NR_BACKHAUL_INTERFACE_PHY_DRIVER_READY) {
mbed_official 0:85f4174a8e29 404 int8_t net_backhaul_id = (int8_t) event->event_data;
mbed_official 0:85f4174a8e29 405 if (net_backhaul_state == INTERFACE_IDLE_PHY_NOT_READY) {
mbed_official 0:85f4174a8e29 406 net_backhaul_state = INTERFACE_IDLE_STATE;
mbed_official 0:85f4174a8e29 407 }
mbed_official 0:85f4174a8e29 408
mbed_official 0:85f4174a8e29 409 if (backhaul_interface_up(net_backhaul_id) != 0) {
mbed_official 0:85f4174a8e29 410 tr_debug("Backhaul bootstrap start failed");
mbed_official 0:85f4174a8e29 411 } else {
mbed_official 0:85f4174a8e29 412 tr_debug("Backhaul bootstrap started");
mbed_official 0:85f4174a8e29 413 net_backhaul_state = INTERFACE_BOOTSTRAP_ACTIVE;
mbed_official 0:85f4174a8e29 414 }
mbed_official 0:85f4174a8e29 415 } else if (event->event_id == NR_BACKHAUL_INTERFACE_PHY_DOWN) {
mbed_official 0:85f4174a8e29 416 if (backhaul_interface_down() != 0) {
mbed_official 0:85f4174a8e29 417 tr_error("Backhaul interface down failed");
mbed_official 0:85f4174a8e29 418 } else {
mbed_official 0:85f4174a8e29 419 tr_debug("Backhaul interface is down");
mbed_official 0:85f4174a8e29 420 backhaul_if_id = -1;
mbed_official 0:85f4174a8e29 421 net_backhaul_state = INTERFACE_IDLE_STATE;
mbed_official 0:85f4174a8e29 422 }
mbed_official 0:85f4174a8e29 423 }
mbed_official 0:85f4174a8e29 424 break;
mbed_official 0:85f4174a8e29 425
mbed_official 0:85f4174a8e29 426 case ARM_LIB_TASKLET_INIT_EVENT:
mbed_official 0:85f4174a8e29 427 print_appl_info();
mbed_official 0:85f4174a8e29 428 br_tasklet_id = event->receiver;
mbed_official 0:85f4174a8e29 429
mbed_official 0:85f4174a8e29 430 /* initialize the backhaul interface */
mbed_official 0:85f4174a8e29 431 backhaul_driver_init(borderrouter_backhaul_phy_status_cb);
mbed_official 0:85f4174a8e29 432
mbed_official 0:85f4174a8e29 433 if (net_6lowpan_id < 0) {
mbed_official 0:85f4174a8e29 434 tr_error("RF interface initialization failed");
mbed_official 0:85f4174a8e29 435 return;
mbed_official 0:85f4174a8e29 436 }
mbed_official 0:85f4174a8e29 437 net_6lowpan_state = INTERFACE_IDLE_STATE;
mbed_official 0:85f4174a8e29 438 eventOS_event_timer_request(9, ARM_LIB_SYSTEM_TIMER_EVENT, br_tasklet_id, 20000);
mbed_official 0:85f4174a8e29 439 break;
mbed_official 0:85f4174a8e29 440
mbed_official 0:85f4174a8e29 441 case ARM_LIB_SYSTEM_TIMER_EVENT:
mbed_official 0:85f4174a8e29 442 eventOS_event_timer_cancel(event->event_id, event->receiver);
mbed_official 0:85f4174a8e29 443
mbed_official 0:85f4174a8e29 444 if (event->event_id == 9) {
mbed_official 0:85f4174a8e29 445 #ifdef MBED_CONF_APP_DEBUG_TRACE
mbed_official 0:85f4174a8e29 446 #if MBED_CONF_APP_DEBUG_TRACE == 1
mbed_official 0:85f4174a8e29 447 arm_print_routing_table();
mbed_official 0:85f4174a8e29 448 arm_print_neigh_cache();
mbed_official 13:993808eb2e9c 449 print_memory_stats();
mbed_official 0:85f4174a8e29 450 #endif
mbed_official 0:85f4174a8e29 451 #endif
mbed_official 0:85f4174a8e29 452 eventOS_event_timer_request(9, ARM_LIB_SYSTEM_TIMER_EVENT, br_tasklet_id, 20000);
mbed_official 0:85f4174a8e29 453 }
mbed_official 0:85f4174a8e29 454 break;
mbed_official 0:85f4174a8e29 455
mbed_official 0:85f4174a8e29 456 default:
mbed_official 0:85f4174a8e29 457 break;
mbed_official 0:85f4174a8e29 458 }
mbed_official 0:85f4174a8e29 459 }
mbed_official 0:85f4174a8e29 460
mbed_official 0:85f4174a8e29 461 static void start_6lowpan(const uint8_t *backhaul_address)
mbed_official 0:85f4174a8e29 462 {
mbed_official 0:85f4174a8e29 463 uint8_t p[16] = {0};
mbed_official 0:85f4174a8e29 464
mbed_official 0:85f4174a8e29 465 if (arm_net_address_get(backhaul_if_id, ADDR_IPV6_GP, p) == 0) {
mbed_official 0:85f4174a8e29 466 uint32_t lifetime = 0xffffffff; // infinite
mbed_official 0:85f4174a8e29 467 uint8_t prefix_len = 0;
mbed_official 0:85f4174a8e29 468 uint8_t t_flags = 0;
mbed_official 0:85f4174a8e29 469 int8_t retval = -1;
mbed_official 0:85f4174a8e29 470
mbed_official 0:85f4174a8e29 471 /* Channel list: listen to a channel (default: all channels) */
mbed_official 0:85f4174a8e29 472 uint32_t channel = cfg_int(global_config, "RF_CHANNEL", 0);
mbed_official 13:993808eb2e9c 473 tr_info("RF channel: %d", (int)channel);
mbed_official 0:85f4174a8e29 474 initialize_channel_list(channel);
mbed_official 0:85f4174a8e29 475
mbed_official 0:85f4174a8e29 476 // configure as border router and set the operation mode
mbed_official 0:85f4174a8e29 477 retval = arm_nwk_interface_configure_6lowpan_bootstrap_set(net_6lowpan_id,
mbed_official 0:85f4174a8e29 478 operating_mode, operating_mode_extension);
mbed_official 0:85f4174a8e29 479
mbed_official 0:85f4174a8e29 480 if (retval < 0) {
mbed_official 0:85f4174a8e29 481 tr_error("Configuring 6LoWPAN bootstrap failed, retval = %d", retval);
mbed_official 0:85f4174a8e29 482 return;
mbed_official 0:85f4174a8e29 483 }
mbed_official 0:85f4174a8e29 484
mbed_official 0:85f4174a8e29 485 retval = arm_nwk_link_layer_security_mode(net_6lowpan_id, link_security_mode, 5, &link_layer_psk);
mbed_official 0:85f4174a8e29 486
mbed_official 0:85f4174a8e29 487 if (retval < 0) {
mbed_official 0:85f4174a8e29 488 tr_error("Failed to set link layer security mode, retval = %d", retval);
mbed_official 0:85f4174a8e29 489 return;
mbed_official 0:85f4174a8e29 490 }
mbed_official 0:85f4174a8e29 491
mbed_official 0:85f4174a8e29 492 /* Should we use the backhaul prefix on the PAN as well? */
mbed_official 0:85f4174a8e29 493 if (backhaul_address && rf_prefix_from_backhaul) {
mbed_official 0:85f4174a8e29 494 memcpy(br.lowpan_nd_prefix, p, 8);
mbed_official 0:85f4174a8e29 495 memcpy(rpl_setup_info.DODAG_ID, br.lowpan_nd_prefix, 8);
mbed_official 0:85f4174a8e29 496 }
mbed_official 0:85f4174a8e29 497
mbed_official 0:85f4174a8e29 498 retval = arm_nwk_6lowpan_border_router_init(net_6lowpan_id, &br);
mbed_official 0:85f4174a8e29 499
mbed_official 0:85f4174a8e29 500 if (retval < 0) {
mbed_official 0:85f4174a8e29 501 tr_error("Initializing 6LoWPAN border router failed, retval = %d", retval);
mbed_official 0:85f4174a8e29 502 return;
mbed_official 0:85f4174a8e29 503 }
mbed_official 0:85f4174a8e29 504
mbed_official 0:85f4174a8e29 505 /* configure both /64 and /128 context prefixes */
mbed_official 0:85f4174a8e29 506 retval = arm_nwk_6lowpan_border_router_context_update(net_6lowpan_id, ((1 << 4) | 0x03),
mbed_official 0:85f4174a8e29 507 128, 0xffff, rpl_setup_info.DODAG_ID);
mbed_official 0:85f4174a8e29 508
mbed_official 0:85f4174a8e29 509 if (retval < 0) {
mbed_official 0:85f4174a8e29 510 tr_error("Setting ND context failed, retval = %d", retval);
mbed_official 0:85f4174a8e29 511 return;
mbed_official 0:85f4174a8e29 512 }
mbed_official 0:85f4174a8e29 513
mbed_official 0:85f4174a8e29 514 // configure the RPL routing protocol for the 6LoWPAN mesh network
mbed_official 0:85f4174a8e29 515 if (arm_nwk_6lowpan_rpl_dodag_init(net_6lowpan_id, rpl_setup_info.DODAG_ID,
mbed_official 0:85f4174a8e29 516 &dodag_config, rpl_setup_info.rpl_instance_id,
mbed_official 0:85f4174a8e29 517 rpl_setup_info.rpl_setups) == 0) {
mbed_official 0:85f4174a8e29 518 prefix_len = 64;
mbed_official 0:85f4174a8e29 519 t_flags = RPL_PREFIX_ROUTER_ADDRESS_FLAG;
mbed_official 0:85f4174a8e29 520 /* add "/64" prefix with the full BR address (DODAG ID) */
mbed_official 0:85f4174a8e29 521 arm_nwk_6lowpan_rpl_dodag_prefix_update(net_6lowpan_id, rpl_setup_info.DODAG_ID,
mbed_official 0:85f4174a8e29 522 prefix_len, t_flags, lifetime);
mbed_official 0:85f4174a8e29 523
mbed_official 0:85f4174a8e29 524 t_flags = 0;
mbed_official 0:85f4174a8e29 525 prefix_len = 0;
mbed_official 0:85f4174a8e29 526 /* add default route "::/0" */
mbed_official 0:85f4174a8e29 527 arm_nwk_6lowpan_rpl_dodag_route_update(net_6lowpan_id, rpl_setup_info.DODAG_ID,
mbed_official 0:85f4174a8e29 528 prefix_len, t_flags, lifetime);
mbed_official 0:85f4174a8e29 529 }
mbed_official 0:85f4174a8e29 530
mbed_official 0:85f4174a8e29 531 if (link_security_mode == NET_SEC_MODE_PANA_LINK_SECURITY) {
mbed_official 0:85f4174a8e29 532 uint8_t *psk = (uint8_t *)cfg_string(global_config, "TLS_PSK_KEY", NULL);
mbed_official 0:85f4174a8e29 533
mbed_official 0:85f4174a8e29 534 if (!psk) {
mbed_official 0:85f4174a8e29 535 tr_error("No TLS PSK key set in configuration");
mbed_official 0:85f4174a8e29 536 return;
mbed_official 0:85f4174a8e29 537 }
mbed_official 0:85f4174a8e29 538
mbed_official 0:85f4174a8e29 539 if (arm_tls_add_psk_key(psk, cfg_int(global_config, "TLS_PSK_KEY_ID", 0)) != 0) {
mbed_official 0:85f4174a8e29 540 tr_error("No TLS PSK key ID set in configuration");
mbed_official 0:85f4174a8e29 541 return;
mbed_official 0:85f4174a8e29 542 }
mbed_official 0:85f4174a8e29 543
mbed_official 0:85f4174a8e29 544 retval = arm_pana_server_library_init(net_6lowpan_id, pana_security_suite, NULL, 120);
mbed_official 0:85f4174a8e29 545
mbed_official 0:85f4174a8e29 546 if (retval) {
mbed_official 0:85f4174a8e29 547 tr_error("Failed to initialize PANA server library, retval = %d", retval);
mbed_official 0:85f4174a8e29 548 return;
mbed_official 0:85f4174a8e29 549 }
mbed_official 0:85f4174a8e29 550 }
mbed_official 0:85f4174a8e29 551
mbed_official 0:85f4174a8e29 552 retval = arm_nwk_set_channel_list(net_6lowpan_id, &channel_list);
mbed_official 0:85f4174a8e29 553
mbed_official 0:85f4174a8e29 554 if (retval) {
mbed_official 0:85f4174a8e29 555 tr_error("Failed to set channel list, retval = %d", retval);
mbed_official 0:85f4174a8e29 556 return;
mbed_official 0:85f4174a8e29 557 }
mbed_official 0:85f4174a8e29 558
mbed_official 0:85f4174a8e29 559 retval = arm_nwk_interface_up(net_6lowpan_id);
mbed_official 0:85f4174a8e29 560
mbed_official 0:85f4174a8e29 561 if (retval < 0) {
mbed_official 0:85f4174a8e29 562 tr_error("Failed to bring up the RF interface, retval = %d", retval);
mbed_official 0:85f4174a8e29 563 return;
mbed_official 0:85f4174a8e29 564 }
mbed_official 0:85f4174a8e29 565
mbed_official 0:85f4174a8e29 566 /* mark the RF interface active */
mbed_official 0:85f4174a8e29 567 net_6lowpan_state = INTERFACE_BOOTSTRAP_ACTIVE;
mbed_official 0:85f4174a8e29 568
mbed_official 0:85f4174a8e29 569 multicast_set_parameters(10, 0, 20, 3, 75);
mbed_official 0:85f4174a8e29 570 multicast_add_address(multicast_addr, 1);
mbed_official 0:85f4174a8e29 571 }
mbed_official 0:85f4174a8e29 572 }
mbed_official 0:85f4174a8e29 573
mbed_official 0:85f4174a8e29 574 /**
mbed_official 0:85f4174a8e29 575 * \brief Network state event handler.
mbed_official 0:85f4174a8e29 576 * \param event show network start response or current network state.
mbed_official 0:85f4174a8e29 577 *
mbed_official 0:85f4174a8e29 578 */
mbed_official 0:85f4174a8e29 579 static void app_parse_network_event(arm_event_s *event)
mbed_official 0:85f4174a8e29 580 {
mbed_official 0:85f4174a8e29 581 switch ((arm_nwk_interface_status_type_e)event->event_data) {
mbed_official 0:85f4174a8e29 582 case ARM_NWK_BOOTSTRAP_READY: {
mbed_official 0:85f4174a8e29 583 bool gp_address_available;
mbed_official 0:85f4174a8e29 584 uint8_t p[16];
mbed_official 0:85f4174a8e29 585 char buf[128];
mbed_official 0:85f4174a8e29 586 if (0 == arm_net_address_get(event->event_id, ADDR_IPV6_GP, p)) {
mbed_official 0:85f4174a8e29 587 ip6tos(p, buf);
mbed_official 0:85f4174a8e29 588 gp_address_available = true;
mbed_official 0:85f4174a8e29 589 } else {
mbed_official 0:85f4174a8e29 590 gp_address_available = false;
mbed_official 0:85f4174a8e29 591 }
mbed_official 0:85f4174a8e29 592
mbed_official 0:85f4174a8e29 593 if (backhaul_if_id == event->event_id) {
mbed_official 0:85f4174a8e29 594
mbed_official 0:85f4174a8e29 595 if (gp_address_available) {
mbed_official 0:85f4174a8e29 596 tr_info("Backhaul bootstrap ready, IPv6 = %s", buf);
mbed_official 0:85f4174a8e29 597 } else {
mbed_official 0:85f4174a8e29 598 tr_info("Backhaul interface in ULA Mode");
mbed_official 0:85f4174a8e29 599 }
mbed_official 0:85f4174a8e29 600
mbed_official 0:85f4174a8e29 601 if (backhaul_bootstrap_mode == NET_IPV6_BOOTSTRAP_STATIC) {
mbed_official 0:85f4174a8e29 602 int8_t retval;
mbed_official 0:85f4174a8e29 603 uint8_t *next_hop_ptr;
mbed_official 0:85f4174a8e29 604
mbed_official 0:85f4174a8e29 605 if (memcmp(backhaul_route.next_hop, (const uint8_t[16]) {0}, 16) == 0) {
mbed_official 0:85f4174a8e29 606 tr_info("Next hop not defined");
mbed_official 0:85f4174a8e29 607 next_hop_ptr = NULL;
mbed_official 0:85f4174a8e29 608 }
mbed_official 0:85f4174a8e29 609 else {
mbed_official 0:85f4174a8e29 610 next_hop_ptr = backhaul_route.next_hop;
mbed_official 0:85f4174a8e29 611 }
mbed_official 0:85f4174a8e29 612
mbed_official 0:85f4174a8e29 613 tr_info("Backhaul default route:");
mbed_official 0:85f4174a8e29 614 tr_info(" prefix: %s", print_ipv6_prefix(backhaul_route.prefix, backhaul_route.prefix_len));
mbed_official 0:85f4174a8e29 615 tr_info(" next hop: %s", next_hop_ptr ? print_ipv6(backhaul_route.next_hop) : "on-link");
mbed_official 0:85f4174a8e29 616
mbed_official 0:85f4174a8e29 617 retval = arm_net_route_add(backhaul_route.prefix, backhaul_route.prefix_len,
mbed_official 0:85f4174a8e29 618 next_hop_ptr, 0xffffffff, 128, backhaul_if_id);
mbed_official 0:85f4174a8e29 619
mbed_official 0:85f4174a8e29 620 if (retval < 0) {
mbed_official 0:85f4174a8e29 621 tr_error("Failed to add backhaul default route, retval = %d", retval);
mbed_official 0:85f4174a8e29 622 }
mbed_official 0:85f4174a8e29 623 }
mbed_official 0:85f4174a8e29 624
mbed_official 0:85f4174a8e29 625 tr_info("Backhaul interface addresses:");
mbed_official 0:85f4174a8e29 626 print_interface_addr(backhaul_if_id);
mbed_official 0:85f4174a8e29 627
mbed_official 0:85f4174a8e29 628 net_backhaul_state = INTERFACE_CONNECTED;
mbed_official 0:85f4174a8e29 629 if (net_6lowpan_state == INTERFACE_IDLE_STATE) {
mbed_official 0:85f4174a8e29 630 //Start 6lowpan
mbed_official 0:85f4174a8e29 631 start_6lowpan(p);
mbed_official 0:85f4174a8e29 632 }
mbed_official 0:85f4174a8e29 633 } else {
mbed_official 0:85f4174a8e29 634 tr_info("RF bootstrap ready, IPv6 = %s", buf);
mbed_official 0:85f4174a8e29 635 arm_nwk_6lowpan_rpl_dodag_start(net_6lowpan_id);
mbed_official 0:85f4174a8e29 636 net_6lowpan_state = INTERFACE_CONNECTED;
mbed_official 0:85f4174a8e29 637 tr_info("RF interface addresses:");
mbed_official 0:85f4174a8e29 638 print_interface_addr(net_6lowpan_id);
mbed_official 0:85f4174a8e29 639 tr_info("6LoWPAN Border Router Bootstrap Complete.");
mbed_official 0:85f4174a8e29 640 }
mbed_official 0:85f4174a8e29 641 }
mbed_official 0:85f4174a8e29 642 /* Network connection Ready */
mbed_official 0:85f4174a8e29 643 break;
mbed_official 0:85f4174a8e29 644 case ARM_NWK_NWK_SCAN_FAIL:
mbed_official 0:85f4174a8e29 645 /* Link Layer Active Scan Fail, Stack is Already in Idle state */
mbed_official 0:85f4174a8e29 646 break;
mbed_official 0:85f4174a8e29 647 case ARM_NWK_IP_ADDRESS_ALLOCATION_FAIL:
mbed_official 0:85f4174a8e29 648 /* No ND Router at current Channel Stack is Already at Idle state */
mbed_official 0:85f4174a8e29 649 break;
mbed_official 0:85f4174a8e29 650 case ARM_NWK_NWK_CONNECTION_DOWN:
mbed_official 0:85f4174a8e29 651 /* Connection to Access point is lost wait for Scan Result */
mbed_official 0:85f4174a8e29 652 break;
mbed_official 0:85f4174a8e29 653 case ARM_NWK_NWK_PARENT_POLL_FAIL:
mbed_official 0:85f4174a8e29 654 break;
mbed_official 0:85f4174a8e29 655 case ARM_NWK_AUHTENTICATION_FAIL:
mbed_official 0:85f4174a8e29 656 /* Network authentication fail */
mbed_official 0:85f4174a8e29 657 break;
mbed_official 0:85f4174a8e29 658 case ARM_NWK_DUPLICATE_ADDRESS_DETECTED:
mbed_official 0:85f4174a8e29 659 if (backhaul_if_id == event->event_id) {
mbed_official 0:85f4174a8e29 660 tr_error("Backhaul DAD failed.");
mbed_official 0:85f4174a8e29 661 }
mbed_official 0:85f4174a8e29 662 break;
mbed_official 0:85f4174a8e29 663 default:
mbed_official 0:85f4174a8e29 664 /* Unknow event */
mbed_official 0:85f4174a8e29 665 break;
mbed_official 0:85f4174a8e29 666 }
mbed_official 0:85f4174a8e29 667 }
mbed_official 0:85f4174a8e29 668
mbed_official 0:85f4174a8e29 669 #endif // MBED_CONF_APP_MESH_MODE