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:
Wed May 23 14:15:16 2018 +0100
Revision:
60:dfb13eee2b42
Parent:
15:173f354b131f
Child:
61:b80d169da384
Avoid header clashes with undefs

.
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 0:85f4174a8e29 13 #ifdef MBED_CONF_APP_DEBUG_TRACE
mbed_official 0:85f4174a8e29 14 #if MBED_CONF_APP_DEBUG_TRACE == 1
mbed_official 0:85f4174a8e29 15 #define APP_TRACE_LEVEL TRACE_ACTIVE_LEVEL_DEBUG
mbed_official 0:85f4174a8e29 16 #else
mbed_official 0:85f4174a8e29 17 #define APP_TRACE_LEVEL TRACE_ACTIVE_LEVEL_INFO
mbed_official 0:85f4174a8e29 18 #endif
mbed_official 0:85f4174a8e29 19 #endif //MBED_CONF_APP_DEBUG_TRACE
mbed_official 0:85f4174a8e29 20
mbed_official 0:85f4174a8e29 21 #include "ns_hal_init.h"
mbed_official 0:85f4174a8e29 22 #include "cmsis_os.h"
mbed_official 0:85f4174a8e29 23 #include "arm_hal_interrupt.h"
mbed_official 0:85f4174a8e29 24
mbed_official 0:85f4174a8e29 25
mbed_official 5:9c0320afe010 26 #include "mbed_trace.h"
mbed_official 0:85f4174a8e29 27 #define TRACE_GROUP "app"
mbed_official 0:85f4174a8e29 28
mbed_official 0:85f4174a8e29 29 #define APP_DEFINED_HEAP_SIZE MBED_CONF_APP_HEAP_SIZE
mbed_official 0:85f4174a8e29 30 static uint8_t app_stack_heap[APP_DEFINED_HEAP_SIZE];
mbed_official 0:85f4174a8e29 31 static uint8_t mac[6] = {0};
mbed_official 13:993808eb2e9c 32 static mem_stat_t heap_info;
mbed_official 0:85f4174a8e29 33
mbed_official 0:85f4174a8e29 34 static DigitalOut led1(MBED_CONF_APP_LED);
mbed_official 0:85f4174a8e29 35
mbed_official 0:85f4174a8e29 36 static Ticker led_ticker;
mbed_official 0:85f4174a8e29 37
mbed_official 0:85f4174a8e29 38 static void app_heap_error_handler(heap_fail_t event);
mbed_official 0:85f4174a8e29 39
mbed_official 0:85f4174a8e29 40 static void toggle_led1()
mbed_official 0:85f4174a8e29 41 {
mbed_official 0:85f4174a8e29 42 led1 = !led1;
mbed_official 0:85f4174a8e29 43 }
mbed_official 0:85f4174a8e29 44
mbed_official 0:85f4174a8e29 45 /**
mbed_official 0:85f4174a8e29 46 * \brief Prints string to serial (adds CRLF).
mbed_official 0:85f4174a8e29 47 */
mbed_official 0:85f4174a8e29 48 static void trace_printer(const char *str)
mbed_official 0:85f4174a8e29 49 {
mbed_official 0:85f4174a8e29 50 printf("%s\n", str);
mbed_official 0:85f4174a8e29 51 }
mbed_official 0:85f4174a8e29 52
mbed_official 0:85f4174a8e29 53 /**
mbed_official 0:85f4174a8e29 54 * \brief Initializes the SLIP MAC backhaul driver.
mbed_official 0:85f4174a8e29 55 * This function is called by the border router module.
mbed_official 0:85f4174a8e29 56 */
mbed_official 0:85f4174a8e29 57 void backhaul_driver_init(void (*backhaul_driver_status_cb)(uint8_t, int8_t))
mbed_official 0:85f4174a8e29 58 {
mbed_official 0:85f4174a8e29 59 // Values allowed in "backhaul-driver" option
mbed_official 60:dfb13eee2b42 60 #undef ETH
mbed_official 60:dfb13eee2b42 61 #undef SLIP
mbed_official 0:85f4174a8e29 62 #define ETH 0
mbed_official 0:85f4174a8e29 63 #define SLIP 1
mbed_official 0:85f4174a8e29 64 #if MBED_CONF_APP_BACKHAUL_DRIVER == SLIP
mbed_official 0:85f4174a8e29 65 SlipMACDriver *pslipmacdriver;
mbed_official 0:85f4174a8e29 66 int8_t slipdrv_id = -1;
mbed_official 0:85f4174a8e29 67 #if defined(MBED_CONF_APP_SLIP_HW_FLOW_CONTROL)
mbed_official 0:85f4174a8e29 68 pslipmacdriver = new SlipMACDriver(SERIAL_TX, SERIAL_RX, SERIAL_RTS, SERIAL_CTS);
mbed_official 0:85f4174a8e29 69 #else
mbed_official 0:85f4174a8e29 70 pslipmacdriver = new SlipMACDriver(SERIAL_TX, SERIAL_RX);
mbed_official 0:85f4174a8e29 71 #endif
mbed_official 0:85f4174a8e29 72
mbed_official 0:85f4174a8e29 73 if (pslipmacdriver == NULL) {
mbed_official 0:85f4174a8e29 74 tr_error("Unable to create SLIP driver");
mbed_official 0:85f4174a8e29 75 return;
mbed_official 0:85f4174a8e29 76 }
mbed_official 0:85f4174a8e29 77
mbed_official 0:85f4174a8e29 78 tr_info("Using SLIP backhaul driver...");
mbed_official 0:85f4174a8e29 79
mbed_official 0:85f4174a8e29 80 #ifdef MBED_CONF_APP_SLIP_SERIAL_BAUD_RATE
mbed_official 0:85f4174a8e29 81 slipdrv_id = pslipmacdriver->Slip_Init(mac, MBED_CONF_APP_SLIP_SERIAL_BAUD_RATE);
mbed_official 0:85f4174a8e29 82 #else
mbed_official 0:85f4174a8e29 83 tr_warning("baud rate for slip not defined");
mbed_official 0:85f4174a8e29 84 #endif
mbed_official 0:85f4174a8e29 85
mbed_official 0:85f4174a8e29 86 if (slipdrv_id >= 0) {
mbed_official 0:85f4174a8e29 87 backhaul_driver_status_cb(1, slipdrv_id);
mbed_official 0:85f4174a8e29 88 return;
mbed_official 0:85f4174a8e29 89 }
mbed_official 0:85f4174a8e29 90
mbed_official 0:85f4174a8e29 91 tr_error("Backhaul driver init failed, retval = %d", slipdrv_id);
mbed_official 0:85f4174a8e29 92 #elif MBED_CONF_APP_BACKHAUL_DRIVER == ETH
mbed_official 0:85f4174a8e29 93 tr_info("Using ETH backhaul driver...");
mbed_official 0:85f4174a8e29 94 arm_eth_phy_device_register(mac, backhaul_driver_status_cb);
mbed_official 0:85f4174a8e29 95 return;
mbed_official 0:85f4174a8e29 96 #else
mbed_official 0:85f4174a8e29 97 #error "Unsupported backhaul driver"
mbed_official 0:85f4174a8e29 98 #endif
mbed_official 0:85f4174a8e29 99
mbed_official 0:85f4174a8e29 100 }
mbed_official 0:85f4174a8e29 101
mbed_official 0:85f4174a8e29 102 /**
mbed_official 0:85f4174a8e29 103 * \brief The entry point for this application.
mbed_official 0:85f4174a8e29 104 * Sets up the application and starts the border router module.
mbed_official 0:85f4174a8e29 105 */
mbed_official 0:85f4174a8e29 106
mbed_official 0:85f4174a8e29 107 int main(int argc, char **argv)
mbed_official 0:85f4174a8e29 108 {
mbed_official 13:993808eb2e9c 109 ns_hal_init(app_stack_heap, APP_DEFINED_HEAP_SIZE, app_heap_error_handler, &heap_info);
mbed_official 0:85f4174a8e29 110
mbed_official 5:9c0320afe010 111 mbed_trace_init(); // set up the tracing library
mbed_official 5:9c0320afe010 112 mbed_trace_print_function_set(trace_printer);
mbed_official 15:173f354b131f 113 mbed_trace_config_set(TRACE_MODE_COLOR | APP_TRACE_LEVEL | TRACE_CARRIAGE_RETURN);
mbed_official 0:85f4174a8e29 114
mbed_official 0:85f4174a8e29 115
mbed_official 0:85f4174a8e29 116 #define BOARD 0
mbed_official 0:85f4174a8e29 117 #define CONFIG 1
mbed_official 0:85f4174a8e29 118 #if MBED_CONF_APP_BACKHAUL_MAC_SRC == BOARD
mbed_official 0:85f4174a8e29 119 /* Setting the MAC Address from UID.
mbed_official 0:85f4174a8e29 120 * Takes UID Mid low and UID low and shuffles them around. */
mbed_official 0:85f4174a8e29 121 mbed_mac_address((char *)mac);
mbed_official 0:85f4174a8e29 122 #elif MBED_CONF_APP_BACKHAUL_MAC_SRC == CONFIG
mbed_official 0:85f4174a8e29 123 const uint8_t mac48[] = MBED_CONF_APP_BACKHAUL_MAC;
mbed_official 0:85f4174a8e29 124 for (uint32_t i = 0; i < sizeof(mac); ++i) {
mbed_official 0:85f4174a8e29 125 mac[i] = mac48[i];
mbed_official 0:85f4174a8e29 126 }
mbed_official 0:85f4174a8e29 127 #else
mbed_official 0:85f4174a8e29 128 #error "MAC address not defined"
mbed_official 0:85f4174a8e29 129 #endif
mbed_official 0:85f4174a8e29 130
mbed_official 2:1411fd11ccdd 131 if (MBED_CONF_APP_LED != NC) {
mbed_official 2:1411fd11ccdd 132 led_ticker.attach_us(toggle_led1, 500000);
mbed_official 2:1411fd11ccdd 133 }
mbed_official 7:571f9a90b972 134 border_router_tasklet_start();
mbed_official 0:85f4174a8e29 135 }
mbed_official 0:85f4174a8e29 136
mbed_official 0:85f4174a8e29 137 /**
mbed_official 0:85f4174a8e29 138 * \brief Error handler for errors in dynamic memory handling.
mbed_official 0:85f4174a8e29 139 */
mbed_official 0:85f4174a8e29 140 static void app_heap_error_handler(heap_fail_t event)
mbed_official 0:85f4174a8e29 141 {
mbed_official 0:85f4174a8e29 142 tr_error("Dyn mem error %x", (int8_t)event);
mbed_official 0:85f4174a8e29 143
mbed_official 0:85f4174a8e29 144 switch (event) {
mbed_official 0:85f4174a8e29 145 case NS_DYN_MEM_NULL_FREE:
mbed_official 0:85f4174a8e29 146 break;
mbed_official 0:85f4174a8e29 147 case NS_DYN_MEM_DOUBLE_FREE:
mbed_official 0:85f4174a8e29 148 break;
mbed_official 0:85f4174a8e29 149 case NS_DYN_MEM_ALLOCATE_SIZE_NOT_VALID:
mbed_official 0:85f4174a8e29 150 break;
mbed_official 0:85f4174a8e29 151 case NS_DYN_MEM_POINTER_NOT_VALID:
mbed_official 0:85f4174a8e29 152 break;
mbed_official 0:85f4174a8e29 153 case NS_DYN_MEM_HEAP_SECTOR_CORRUPTED:
mbed_official 0:85f4174a8e29 154 break;
mbed_official 0:85f4174a8e29 155 case NS_DYN_MEM_HEAP_SECTOR_UNITIALIZED:
mbed_official 0:85f4174a8e29 156 break;
mbed_official 0:85f4174a8e29 157 default:
mbed_official 0:85f4174a8e29 158 break;
mbed_official 0:85f4174a8e29 159 }
mbed_official 0:85f4174a8e29 160
mbed_official 0:85f4174a8e29 161 while (1);
mbed_official 0:85f4174a8e29 162 }
mbed_official 13:993808eb2e9c 163