Nanostack Border Router is a generic mbed border router implementation that provides the 6LoWPAN ND or Thread border router initialization logic.
source/border_router_main.cpp@93:6c98c32f59e1, 2019-03-11 (annotated)
- 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?
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 | #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 |