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