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:
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?

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 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