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