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

Committer:
mbed_official
Date:
Mon Mar 11 14:02:41 2019 +0000
Revision:
93:6c98c32f59e1
Parent:
82:3d9e3b7b3dcf
Child:
105:d9f83743ed4f
Merge pull request #161 from ARMmbed/IOTTHD-3286

Allow compilation with non K64F/K66F boards
.
Commit copied from https://github.com/ARMmbed/nanostack-border-router

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:85f4174a8e29 1 /*
mbed_official 0:85f4174a8e29 2 * Copyright (c) 2016 ARM Limited. All rights reserved.
mbed_official 0:85f4174a8e29 3 */
mbed_official 0:85f4174a8e29 4
mbed_official 0:85f4174a8e29 5 #include <string.h>
mbed_official 0:85f4174a8e29 6
mbed_official 0:85f4174a8e29 7
mbed_official 0:85f4174a8e29 8 #include "mbed.h"
mbed_official 0:85f4174a8e29 9 #include "borderrouter_tasklet.h"
mbed_official 0:85f4174a8e29 10 #include "drivers/eth_driver.h"
mbed_official 0:85f4174a8e29 11 #include "sal-stack-nanostack-slip/Slip.h"
mbed_official 0:85f4174a8e29 12
mbed_official 65:92e581c01e8c 13 #include "Nanostack.h"
mbed_official 65:92e581c01e8c 14 #include "NanostackEthernetInterface.h"
mbed_official 65:92e581c01e8c 15 #include "MeshInterfaceNanostack.h"
mbed_official 65:92e581c01e8c 16 #include "EMACInterface.h"
mbed_official 65:92e581c01e8c 17 #include "EMAC.h"
mbed_official 65:92e581c01e8c 18
mbed_official 0:85f4174a8e29 19 #ifdef MBED_CONF_APP_DEBUG_TRACE
mbed_official 0:85f4174a8e29 20 #if MBED_CONF_APP_DEBUG_TRACE == 1
mbed_official 0:85f4174a8e29 21 #define APP_TRACE_LEVEL TRACE_ACTIVE_LEVEL_DEBUG
mbed_official 0:85f4174a8e29 22 #else
mbed_official 0:85f4174a8e29 23 #define APP_TRACE_LEVEL TRACE_ACTIVE_LEVEL_INFO
mbed_official 0:85f4174a8e29 24 #endif
mbed_official 0:85f4174a8e29 25 #endif //MBED_CONF_APP_DEBUG_TRACE
mbed_official 0:85f4174a8e29 26
mbed_official 0:85f4174a8e29 27 #include "ns_hal_init.h"
mbed_official 65:92e581c01e8c 28 #include "mesh_system.h"
mbed_official 0:85f4174a8e29 29 #include "cmsis_os.h"
mbed_official 0:85f4174a8e29 30 #include "arm_hal_interrupt.h"
mbed_official 0:85f4174a8e29 31
mbed_official 0:85f4174a8e29 32
mbed_official 5:9c0320afe010 33 #include "mbed_trace.h"
mbed_official 0:85f4174a8e29 34 #define TRACE_GROUP "app"
mbed_official 0:85f4174a8e29 35
mbed_official 0:85f4174a8e29 36 #define APP_DEFINED_HEAP_SIZE MBED_CONF_APP_HEAP_SIZE
mbed_official 0:85f4174a8e29 37 static uint8_t app_stack_heap[APP_DEFINED_HEAP_SIZE];
mbed_official 13:993808eb2e9c 38 static mem_stat_t heap_info;
mbed_official 0:85f4174a8e29 39
mbed_official 65:92e581c01e8c 40 #define BOARD 1
mbed_official 65:92e581c01e8c 41 #define CONFIG 2
mbed_official 65:92e581c01e8c 42 #if MBED_CONF_APP_BACKHAUL_MAC_SRC == BOARD
mbed_official 65:92e581c01e8c 43 static uint8_t mac[6];
mbed_official 65:92e581c01e8c 44 #elif MBED_CONF_APP_BACKHAUL_MAC_SRC == CONFIG
mbed_official 65:92e581c01e8c 45 static const uint8_t mac[] = MBED_CONF_APP_BACKHAUL_MAC;
mbed_official 65:92e581c01e8c 46 #else
mbed_official 65:92e581c01e8c 47 #error "MAC address not defined"
mbed_official 65:92e581c01e8c 48 #endif
mbed_official 65:92e581c01e8c 49
mbed_official 0:85f4174a8e29 50 static DigitalOut led1(MBED_CONF_APP_LED);
mbed_official 0:85f4174a8e29 51
mbed_official 0:85f4174a8e29 52 static Ticker led_ticker;
mbed_official 0:85f4174a8e29 53
mbed_official 0:85f4174a8e29 54 static void app_heap_error_handler(heap_fail_t event);
mbed_official 0:85f4174a8e29 55
mbed_official 0:85f4174a8e29 56 static void toggle_led1()
mbed_official 0:85f4174a8e29 57 {
mbed_official 0:85f4174a8e29 58 led1 = !led1;
mbed_official 0:85f4174a8e29 59 }
mbed_official 0:85f4174a8e29 60
mbed_official 0:85f4174a8e29 61 /**
mbed_official 0:85f4174a8e29 62 * \brief Prints string to serial (adds CRLF).
mbed_official 0:85f4174a8e29 63 */
mbed_official 0:85f4174a8e29 64 static void trace_printer(const char *str)
mbed_official 0:85f4174a8e29 65 {
mbed_official 0:85f4174a8e29 66 printf("%s\n", str);
mbed_official 0:85f4174a8e29 67 }
mbed_official 0:85f4174a8e29 68
mbed_official 65:92e581c01e8c 69 #undef ETH
mbed_official 65:92e581c01e8c 70 #undef SLIP
mbed_official 65:92e581c01e8c 71 #undef EMAC
mbed_official 65:92e581c01e8c 72 #define ETH 1
mbed_official 65:92e581c01e8c 73 #define SLIP 2
mbed_official 65:92e581c01e8c 74 #define EMAC 3
mbed_official 65:92e581c01e8c 75 #if MBED_CONF_APP_BACKHAUL_DRIVER == EMAC
mbed_official 65:92e581c01e8c 76 static void (*emac_actual_cb)(uint8_t, int8_t);
mbed_official 65:92e581c01e8c 77 static int8_t emac_driver_id;
mbed_official 65:92e581c01e8c 78 static void emac_link_cb(bool up)
mbed_official 65:92e581c01e8c 79 {
mbed_official 65:92e581c01e8c 80 if (emac_actual_cb) {
mbed_official 65:92e581c01e8c 81 emac_actual_cb(up, emac_driver_id);
mbed_official 65:92e581c01e8c 82 }
mbed_official 65:92e581c01e8c 83 }
mbed_official 65:92e581c01e8c 84 #endif
mbed_official 65:92e581c01e8c 85
mbed_official 0:85f4174a8e29 86 /**
mbed_official 82:3d9e3b7b3dcf 87 * \brief Initializes the MAC backhaul driver.
mbed_official 0:85f4174a8e29 88 * This function is called by the border router module.
mbed_official 0:85f4174a8e29 89 */
mbed_official 0:85f4174a8e29 90 void backhaul_driver_init(void (*backhaul_driver_status_cb)(uint8_t, int8_t))
mbed_official 0:85f4174a8e29 91 {
mbed_official 0:85f4174a8e29 92 // Values allowed in "backhaul-driver" option
mbed_official 0:85f4174a8e29 93 #if MBED_CONF_APP_BACKHAUL_DRIVER == SLIP
mbed_official 0:85f4174a8e29 94 SlipMACDriver *pslipmacdriver;
mbed_official 0:85f4174a8e29 95 int8_t slipdrv_id = -1;
mbed_official 0:85f4174a8e29 96 #if defined(MBED_CONF_APP_SLIP_HW_FLOW_CONTROL)
mbed_official 0:85f4174a8e29 97 pslipmacdriver = new SlipMACDriver(SERIAL_TX, SERIAL_RX, SERIAL_RTS, SERIAL_CTS);
mbed_official 0:85f4174a8e29 98 #else
mbed_official 0:85f4174a8e29 99 pslipmacdriver = new SlipMACDriver(SERIAL_TX, SERIAL_RX);
mbed_official 0:85f4174a8e29 100 #endif
mbed_official 0:85f4174a8e29 101
mbed_official 0:85f4174a8e29 102 if (pslipmacdriver == NULL) {
mbed_official 0:85f4174a8e29 103 tr_error("Unable to create SLIP driver");
mbed_official 0:85f4174a8e29 104 return;
mbed_official 0:85f4174a8e29 105 }
mbed_official 0:85f4174a8e29 106
mbed_official 0:85f4174a8e29 107 tr_info("Using SLIP backhaul driver...");
mbed_official 0:85f4174a8e29 108
mbed_official 0:85f4174a8e29 109 #ifdef MBED_CONF_APP_SLIP_SERIAL_BAUD_RATE
mbed_official 0:85f4174a8e29 110 slipdrv_id = pslipmacdriver->Slip_Init(mac, MBED_CONF_APP_SLIP_SERIAL_BAUD_RATE);
mbed_official 0:85f4174a8e29 111 #else
mbed_official 0:85f4174a8e29 112 tr_warning("baud rate for slip not defined");
mbed_official 0:85f4174a8e29 113 #endif
mbed_official 0:85f4174a8e29 114
mbed_official 0:85f4174a8e29 115 if (slipdrv_id >= 0) {
mbed_official 0:85f4174a8e29 116 backhaul_driver_status_cb(1, slipdrv_id);
mbed_official 0:85f4174a8e29 117 return;
mbed_official 0:85f4174a8e29 118 }
mbed_official 0:85f4174a8e29 119
mbed_official 0:85f4174a8e29 120 tr_error("Backhaul driver init failed, retval = %d", slipdrv_id);
mbed_official 65:92e581c01e8c 121 #elif MBED_CONF_APP_BACKHAUL_DRIVER == EMAC
mbed_official 65:92e581c01e8c 122 #undef EMAC
mbed_official 65:92e581c01e8c 123 tr_info("Using EMAC backhaul driver...");
mbed_official 65:92e581c01e8c 124 NetworkInterface *net = NetworkInterface::get_default_instance();
mbed_official 65:92e581c01e8c 125 if (!net) {
mbed_official 65:92e581c01e8c 126 tr_error("Default network interface not found");
mbed_official 65:92e581c01e8c 127 exit(1);
mbed_official 65:92e581c01e8c 128 }
mbed_official 65:92e581c01e8c 129 EMACInterface *emacif = net->emacInterface();
mbed_official 65:92e581c01e8c 130 if (!emacif) {
mbed_official 65:92e581c01e8c 131 tr_error("Default interface is not EMAC-based");
mbed_official 65:92e581c01e8c 132 exit(1);
mbed_official 65:92e581c01e8c 133 }
mbed_official 65:92e581c01e8c 134 EMAC &emac = emacif->get_emac();
mbed_official 65:92e581c01e8c 135 Nanostack::EthernetInterface *ns_if;
mbed_official 65:92e581c01e8c 136 #if MBED_CONF_APP_BACKHAUL_MAC_SRC == BOARD
mbed_official 65:92e581c01e8c 137 /* Let the core code choose address - either from board or EMAC (for
mbed_official 65:92e581c01e8c 138 * ETH and SLIP we pass in the board address already in mac[]) */
mbed_official 65:92e581c01e8c 139 nsapi_error_t err = Nanostack::get_instance().add_ethernet_interface(emac, true, &ns_if);
mbed_official 65:92e581c01e8c 140 /* Read back what they chose into our mac[] */
mbed_official 65:92e581c01e8c 141 ns_if->get_mac_address(mac);
mbed_official 65:92e581c01e8c 142 #else
mbed_official 65:92e581c01e8c 143 nsapi_error_t err = Nanostack::get_instance().add_ethernet_interface(emac, true, &ns_if, mac);
mbed_official 65:92e581c01e8c 144 #endif
mbed_official 65:92e581c01e8c 145 if (err < 0) {
mbed_official 65:92e581c01e8c 146 tr_error("Backhaul driver init failed, retval = %d", err);
mbed_official 65:92e581c01e8c 147 } else {
mbed_official 65:92e581c01e8c 148 emac_actual_cb = backhaul_driver_status_cb;
mbed_official 65:92e581c01e8c 149 emac_driver_id = ns_if->get_driver_id();
mbed_official 65:92e581c01e8c 150 emac.set_link_state_cb(emac_link_cb);
mbed_official 65:92e581c01e8c 151 }
mbed_official 0:85f4174a8e29 152 #elif MBED_CONF_APP_BACKHAUL_DRIVER == ETH
mbed_official 0:85f4174a8e29 153 tr_info("Using ETH backhaul driver...");
mbed_official 0:85f4174a8e29 154 arm_eth_phy_device_register(mac, backhaul_driver_status_cb);
mbed_official 0:85f4174a8e29 155 return;
mbed_official 0:85f4174a8e29 156 #else
mbed_official 0:85f4174a8e29 157 #error "Unsupported backhaul driver"
mbed_official 0:85f4174a8e29 158 #endif
mbed_official 65:92e581c01e8c 159 #undef SLIP
mbed_official 65:92e581c01e8c 160 #undef ETH
mbed_official 65:92e581c01e8c 161 #undef EMAC
mbed_official 0:85f4174a8e29 162 }
mbed_official 0:85f4174a8e29 163
mbed_official 82:3d9e3b7b3dcf 164
mbed_official 82:3d9e3b7b3dcf 165 void appl_info_trace(void)
mbed_official 82:3d9e3b7b3dcf 166 {
mbed_official 82:3d9e3b7b3dcf 167 tr_info("Starting NanoStack Border Router...");
mbed_official 82:3d9e3b7b3dcf 168 tr_info("Build date: %s %s", __DATE__, __TIME__);
mbed_official 82:3d9e3b7b3dcf 169 #ifdef MBED_MAJOR_VERSION
mbed_official 93:6c98c32f59e1 170 tr_info("Mbed OS: %d", MBED_VERSION);
mbed_official 93:6c98c32f59e1 171 #endif
mbed_official 93:6c98c32f59e1 172
mbed_official 93:6c98c32f59e1 173 #if defined(MBED_SYS_STATS_ENABLED)
mbed_official 93:6c98c32f59e1 174 mbed_stats_sys_t stats;
mbed_official 93:6c98c32f59e1 175 mbed_stats_sys_get(&stats);
mbed_official 93:6c98c32f59e1 176
mbed_official 93:6c98c32f59e1 177 /* ARM = 1, GCC_ARM = 2, IAR = 3 */
mbed_official 93:6c98c32f59e1 178 tr_info("Compiler ID: %d", stats.compiler_id);
mbed_official 93:6c98c32f59e1 179 /* Compiler versions:
mbed_official 93:6c98c32f59e1 180 ARM: PVVbbbb (P = Major; VV = Minor; bbbb = build number)
mbed_official 93:6c98c32f59e1 181 GCC: VVRRPP (VV = Version; RR = Revision; PP = Patch)
mbed_official 93:6c98c32f59e1 182 IAR: VRRRPPP (V = Version; RRR = Revision; PPP = Patch)
mbed_official 93:6c98c32f59e1 183 */
mbed_official 93:6c98c32f59e1 184 tr_info("Compiler Version: %d", stats.compiler_version);
mbed_official 82:3d9e3b7b3dcf 185 #endif
mbed_official 82:3d9e3b7b3dcf 186 }
mbed_official 82:3d9e3b7b3dcf 187
mbed_official 0:85f4174a8e29 188 /**
mbed_official 0:85f4174a8e29 189 * \brief The entry point for this application.
mbed_official 0:85f4174a8e29 190 * Sets up the application and starts the border router module.
mbed_official 0:85f4174a8e29 191 */
mbed_official 0:85f4174a8e29 192 int main(int argc, char **argv)
mbed_official 0:85f4174a8e29 193 {
mbed_official 13:993808eb2e9c 194 ns_hal_init(app_stack_heap, APP_DEFINED_HEAP_SIZE, app_heap_error_handler, &heap_info);
mbed_official 0:85f4174a8e29 195
mbed_official 5:9c0320afe010 196 mbed_trace_init(); // set up the tracing library
mbed_official 5:9c0320afe010 197 mbed_trace_print_function_set(trace_printer);
mbed_official 15:173f354b131f 198 mbed_trace_config_set(TRACE_MODE_COLOR | APP_TRACE_LEVEL | TRACE_CARRIAGE_RETURN);
mbed_official 0:85f4174a8e29 199
mbed_official 65:92e581c01e8c 200 // Have to let mesh_system do net_init_core in case we use
mbed_official 65:92e581c01e8c 201 // Nanostack::add_ethernet_interface()
mbed_official 65:92e581c01e8c 202 mesh_system_init();
mbed_official 0:85f4174a8e29 203
mbed_official 0:85f4174a8e29 204 #if MBED_CONF_APP_BACKHAUL_MAC_SRC == BOARD
mbed_official 0:85f4174a8e29 205 mbed_mac_address((char *)mac);
mbed_official 0:85f4174a8e29 206 #endif
mbed_official 0:85f4174a8e29 207
mbed_official 2:1411fd11ccdd 208 if (MBED_CONF_APP_LED != NC) {
mbed_official 2:1411fd11ccdd 209 led_ticker.attach_us(toggle_led1, 500000);
mbed_official 2:1411fd11ccdd 210 }
mbed_official 7:571f9a90b972 211 border_router_tasklet_start();
mbed_official 0:85f4174a8e29 212 }
mbed_official 0:85f4174a8e29 213
mbed_official 0:85f4174a8e29 214 /**
mbed_official 0:85f4174a8e29 215 * \brief Error handler for errors in dynamic memory handling.
mbed_official 0:85f4174a8e29 216 */
mbed_official 0:85f4174a8e29 217 static void app_heap_error_handler(heap_fail_t event)
mbed_official 0:85f4174a8e29 218 {
mbed_official 0:85f4174a8e29 219 tr_error("Dyn mem error %x", (int8_t)event);
mbed_official 0:85f4174a8e29 220
mbed_official 0:85f4174a8e29 221 switch (event) {
mbed_official 0:85f4174a8e29 222 case NS_DYN_MEM_NULL_FREE:
mbed_official 0:85f4174a8e29 223 break;
mbed_official 0:85f4174a8e29 224 case NS_DYN_MEM_DOUBLE_FREE:
mbed_official 0:85f4174a8e29 225 break;
mbed_official 0:85f4174a8e29 226 case NS_DYN_MEM_ALLOCATE_SIZE_NOT_VALID:
mbed_official 0:85f4174a8e29 227 break;
mbed_official 0:85f4174a8e29 228 case NS_DYN_MEM_POINTER_NOT_VALID:
mbed_official 0:85f4174a8e29 229 break;
mbed_official 0:85f4174a8e29 230 case NS_DYN_MEM_HEAP_SECTOR_CORRUPTED:
mbed_official 0:85f4174a8e29 231 break;
mbed_official 0:85f4174a8e29 232 case NS_DYN_MEM_HEAP_SECTOR_UNITIALIZED:
mbed_official 0:85f4174a8e29 233 break;
mbed_official 0:85f4174a8e29 234 default:
mbed_official 0:85f4174a8e29 235 break;
mbed_official 0:85f4174a8e29 236 }
mbed_official 0:85f4174a8e29 237
mbed_official 0:85f4174a8e29 238 while (1);
mbed_official 0:85f4174a8e29 239 }
mbed_official 13:993808eb2e9c 240