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@61:b80d169da384, 2018-05-31 (annotated)
- Committer:
- mbed_official
- Date:
- Thu May 31 13:30:18 2018 +0100
- Revision:
- 61:b80d169da384
- Parent:
- 60:dfb13eee2b42
- Child:
- 63:d01e7341699d
Switch to EMAC drivers by default
Change JSON files to select EMAC driver, rather than native Nanostack.
This is currently a minor functional regression for K64F - the EMAC
driver doesn't start gracefully if the cable isn't connected.
.
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 | 61:b80d169da384 | 13 | #include "Nanostack.h" |
mbed_official | 61:b80d169da384 | 14 | #include "NanostackEthernetInterface.h" |
mbed_official | 61:b80d169da384 | 15 | #include "MeshInterfaceNanostack.h" |
mbed_official | 61:b80d169da384 | 16 | #include "EMACInterface.h" |
mbed_official | 61:b80d169da384 | 17 | #include "EMAC.h" |
mbed_official | 61:b80d169da384 | 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 | 61:b80d169da384 | 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 | 61:b80d169da384 | 40 | #define BOARD 1 |
mbed_official | 61:b80d169da384 | 41 | #define CONFIG 2 |
mbed_official | 61:b80d169da384 | 42 | #if MBED_CONF_APP_BACKHAUL_MAC_SRC == BOARD |
mbed_official | 61:b80d169da384 | 43 | static uint8_t mac[6]; |
mbed_official | 61:b80d169da384 | 44 | #elif MBED_CONF_APP_BACKHAUL_MAC_SRC == CONFIG |
mbed_official | 61:b80d169da384 | 45 | static const uint8_t mac[] = MBED_CONF_APP_BACKHAUL_MAC; |
mbed_official | 61:b80d169da384 | 46 | #else |
mbed_official | 61:b80d169da384 | 47 | #error "MAC address not defined" |
mbed_official | 61:b80d169da384 | 48 | #endif |
mbed_official | 61:b80d169da384 | 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 | 61:b80d169da384 | 69 | #undef ETH |
mbed_official | 61:b80d169da384 | 70 | #undef SLIP |
mbed_official | 61:b80d169da384 | 71 | #undef EMAC |
mbed_official | 61:b80d169da384 | 72 | #define ETH 1 |
mbed_official | 61:b80d169da384 | 73 | #define SLIP 2 |
mbed_official | 61:b80d169da384 | 74 | #define EMAC 3 |
mbed_official | 61:b80d169da384 | 75 | #if MBED_CONF_APP_BACKHAUL_DRIVER == EMAC |
mbed_official | 61:b80d169da384 | 76 | static void (*emac_actual_cb)(uint8_t, int8_t); |
mbed_official | 61:b80d169da384 | 77 | static int8_t emac_driver_id; |
mbed_official | 61:b80d169da384 | 78 | static void emac_link_cb(bool up) |
mbed_official | 61:b80d169da384 | 79 | { |
mbed_official | 61:b80d169da384 | 80 | if (emac_actual_cb) { |
mbed_official | 61:b80d169da384 | 81 | emac_actual_cb(up, emac_driver_id); |
mbed_official | 61:b80d169da384 | 82 | } |
mbed_official | 61:b80d169da384 | 83 | } |
mbed_official | 61:b80d169da384 | 84 | #endif |
mbed_official | 61:b80d169da384 | 85 | |
mbed_official | 0:85f4174a8e29 | 86 | /** |
mbed_official | 0:85f4174a8e29 | 87 | * \brief Initializes the SLIP 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 | 61:b80d169da384 | 121 | #elif MBED_CONF_APP_BACKHAUL_DRIVER == EMAC |
mbed_official | 61:b80d169da384 | 122 | #undef EMAC |
mbed_official | 61:b80d169da384 | 123 | tr_info("Using EMAC backhaul driver..."); |
mbed_official | 61:b80d169da384 | 124 | NetworkInterface *net = NetworkInterface::get_default_instance(); |
mbed_official | 61:b80d169da384 | 125 | if (!net) { |
mbed_official | 61:b80d169da384 | 126 | tr_error("Default network interface not found"); |
mbed_official | 61:b80d169da384 | 127 | exit(1); |
mbed_official | 61:b80d169da384 | 128 | } |
mbed_official | 61:b80d169da384 | 129 | EMACInterface *emacif = net->emacInterface(); |
mbed_official | 61:b80d169da384 | 130 | if (!emacif) { |
mbed_official | 61:b80d169da384 | 131 | tr_error("Default interface is not EMAC-based"); |
mbed_official | 61:b80d169da384 | 132 | exit(1); |
mbed_official | 61:b80d169da384 | 133 | } |
mbed_official | 61:b80d169da384 | 134 | EMAC &emac = emacif->get_emac(); |
mbed_official | 61:b80d169da384 | 135 | Nanostack::EthernetInterface *ns_if; |
mbed_official | 61:b80d169da384 | 136 | #if MBED_CONF_APP_BACKHAUL_MAC_SRC == BOARD |
mbed_official | 61:b80d169da384 | 137 | /* Let the core code choose address - either from board or EMAC (for |
mbed_official | 61:b80d169da384 | 138 | * ETH and SLIP we pass in the board address already in mac[]) */ |
mbed_official | 61:b80d169da384 | 139 | nsapi_error_t err = Nanostack::get_instance().add_ethernet_interface(emac, true, &ns_if); |
mbed_official | 61:b80d169da384 | 140 | /* Read back what they chose into our mac[] */ |
mbed_official | 61:b80d169da384 | 141 | ns_if->get_mac_address(mac); |
mbed_official | 61:b80d169da384 | 142 | #else |
mbed_official | 61:b80d169da384 | 143 | nsapi_error_t err = Nanostack::get_instance().add_ethernet_interface(emac, true, &ns_if, mac); |
mbed_official | 61:b80d169da384 | 144 | #endif |
mbed_official | 61:b80d169da384 | 145 | if (err < 0) { |
mbed_official | 61:b80d169da384 | 146 | tr_error("Backhaul driver init failed, retval = %d", err); |
mbed_official | 61:b80d169da384 | 147 | } else { |
mbed_official | 61:b80d169da384 | 148 | emac_actual_cb = backhaul_driver_status_cb; |
mbed_official | 61:b80d169da384 | 149 | emac_driver_id = ns_if->get_driver_id(); |
mbed_official | 61:b80d169da384 | 150 | emac.set_link_state_cb(emac_link_cb); |
mbed_official | 61:b80d169da384 | 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 | 61:b80d169da384 | 159 | #undef SLIP |
mbed_official | 61:b80d169da384 | 160 | #undef ETH |
mbed_official | 61:b80d169da384 | 161 | #undef EMAC |
mbed_official | 0:85f4174a8e29 | 162 | } |
mbed_official | 0:85f4174a8e29 | 163 | |
mbed_official | 0:85f4174a8e29 | 164 | /** |
mbed_official | 0:85f4174a8e29 | 165 | * \brief The entry point for this application. |
mbed_official | 0:85f4174a8e29 | 166 | * Sets up the application and starts the border router module. |
mbed_official | 0:85f4174a8e29 | 167 | */ |
mbed_official | 0:85f4174a8e29 | 168 | |
mbed_official | 0:85f4174a8e29 | 169 | int main(int argc, char **argv) |
mbed_official | 0:85f4174a8e29 | 170 | { |
mbed_official | 13:993808eb2e9c | 171 | ns_hal_init(app_stack_heap, APP_DEFINED_HEAP_SIZE, app_heap_error_handler, &heap_info); |
mbed_official | 0:85f4174a8e29 | 172 | |
mbed_official | 5:9c0320afe010 | 173 | mbed_trace_init(); // set up the tracing library |
mbed_official | 5:9c0320afe010 | 174 | mbed_trace_print_function_set(trace_printer); |
mbed_official | 15:173f354b131f | 175 | mbed_trace_config_set(TRACE_MODE_COLOR | APP_TRACE_LEVEL | TRACE_CARRIAGE_RETURN); |
mbed_official | 0:85f4174a8e29 | 176 | |
mbed_official | 61:b80d169da384 | 177 | // Have to let mesh_system do net_init_core in case we use |
mbed_official | 61:b80d169da384 | 178 | // Nanostack::add_ethernet_interface() |
mbed_official | 61:b80d169da384 | 179 | mesh_system_init(); |
mbed_official | 0:85f4174a8e29 | 180 | |
mbed_official | 0:85f4174a8e29 | 181 | #if MBED_CONF_APP_BACKHAUL_MAC_SRC == BOARD |
mbed_official | 0:85f4174a8e29 | 182 | mbed_mac_address((char *)mac); |
mbed_official | 0:85f4174a8e29 | 183 | #endif |
mbed_official | 0:85f4174a8e29 | 184 | |
mbed_official | 2:1411fd11ccdd | 185 | if (MBED_CONF_APP_LED != NC) { |
mbed_official | 2:1411fd11ccdd | 186 | led_ticker.attach_us(toggle_led1, 500000); |
mbed_official | 2:1411fd11ccdd | 187 | } |
mbed_official | 7:571f9a90b972 | 188 | border_router_tasklet_start(); |
mbed_official | 0:85f4174a8e29 | 189 | } |
mbed_official | 0:85f4174a8e29 | 190 | |
mbed_official | 0:85f4174a8e29 | 191 | /** |
mbed_official | 0:85f4174a8e29 | 192 | * \brief Error handler for errors in dynamic memory handling. |
mbed_official | 0:85f4174a8e29 | 193 | */ |
mbed_official | 0:85f4174a8e29 | 194 | static void app_heap_error_handler(heap_fail_t event) |
mbed_official | 0:85f4174a8e29 | 195 | { |
mbed_official | 0:85f4174a8e29 | 196 | tr_error("Dyn mem error %x", (int8_t)event); |
mbed_official | 0:85f4174a8e29 | 197 | |
mbed_official | 0:85f4174a8e29 | 198 | switch (event) { |
mbed_official | 0:85f4174a8e29 | 199 | case NS_DYN_MEM_NULL_FREE: |
mbed_official | 0:85f4174a8e29 | 200 | break; |
mbed_official | 0:85f4174a8e29 | 201 | case NS_DYN_MEM_DOUBLE_FREE: |
mbed_official | 0:85f4174a8e29 | 202 | break; |
mbed_official | 0:85f4174a8e29 | 203 | case NS_DYN_MEM_ALLOCATE_SIZE_NOT_VALID: |
mbed_official | 0:85f4174a8e29 | 204 | break; |
mbed_official | 0:85f4174a8e29 | 205 | case NS_DYN_MEM_POINTER_NOT_VALID: |
mbed_official | 0:85f4174a8e29 | 206 | break; |
mbed_official | 0:85f4174a8e29 | 207 | case NS_DYN_MEM_HEAP_SECTOR_CORRUPTED: |
mbed_official | 0:85f4174a8e29 | 208 | break; |
mbed_official | 0:85f4174a8e29 | 209 | case NS_DYN_MEM_HEAP_SECTOR_UNITIALIZED: |
mbed_official | 0:85f4174a8e29 | 210 | break; |
mbed_official | 0:85f4174a8e29 | 211 | default: |
mbed_official | 0:85f4174a8e29 | 212 | break; |
mbed_official | 0:85f4174a8e29 | 213 | } |
mbed_official | 0:85f4174a8e29 | 214 | |
mbed_official | 0:85f4174a8e29 | 215 | while (1); |
mbed_official | 0:85f4174a8e29 | 216 | } |
mbed_official | 13:993808eb2e9c | 217 |