Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
mbed-os/features/nanostack/mbed-mesh-api/source/LoWPANNDInterface.cpp@0:8fdf9a60065b, 2018-10-10 (annotated)
- Committer:
- kadonotakashi
- Date:
- Wed Oct 10 00:33:53 2018 +0000
- Revision:
- 0:8fdf9a60065b
how to make mbed librry
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kadonotakashi | 0:8fdf9a60065b | 1 | #include "LoWPANNDInterface.h" |
kadonotakashi | 0:8fdf9a60065b | 2 | #include "include/nd_tasklet.h" |
kadonotakashi | 0:8fdf9a60065b | 3 | #include "callback_handler.h" |
kadonotakashi | 0:8fdf9a60065b | 4 | #include "NanostackLockGuard.h" |
kadonotakashi | 0:8fdf9a60065b | 5 | #include "mesh_system.h" |
kadonotakashi | 0:8fdf9a60065b | 6 | #include "randLIB.h" |
kadonotakashi | 0:8fdf9a60065b | 7 | |
kadonotakashi | 0:8fdf9a60065b | 8 | #include "ns_trace.h" |
kadonotakashi | 0:8fdf9a60065b | 9 | #define TRACE_GROUP "nslp" |
kadonotakashi | 0:8fdf9a60065b | 10 | |
kadonotakashi | 0:8fdf9a60065b | 11 | class Nanostack::LoWPANNDInterface : public Nanostack::MeshInterface |
kadonotakashi | 0:8fdf9a60065b | 12 | { |
kadonotakashi | 0:8fdf9a60065b | 13 | public: |
kadonotakashi | 0:8fdf9a60065b | 14 | virtual nsapi_error_t bringup(bool dhcp, const char *ip, |
kadonotakashi | 0:8fdf9a60065b | 15 | const char *netmask, const char *gw, |
kadonotakashi | 0:8fdf9a60065b | 16 | nsapi_ip_stack_t stack = IPV6_STACK, |
kadonotakashi | 0:8fdf9a60065b | 17 | bool blocking = true); |
kadonotakashi | 0:8fdf9a60065b | 18 | virtual nsapi_error_t bringdown(); |
kadonotakashi | 0:8fdf9a60065b | 19 | virtual char *get_gateway(char *buf, nsapi_size_t buflen); |
kadonotakashi | 0:8fdf9a60065b | 20 | |
kadonotakashi | 0:8fdf9a60065b | 21 | friend Nanostack; |
kadonotakashi | 0:8fdf9a60065b | 22 | friend class ::LoWPANNDInterface; |
kadonotakashi | 0:8fdf9a60065b | 23 | private: |
kadonotakashi | 0:8fdf9a60065b | 24 | LoWPANNDInterface(NanostackRfPhy &phy) : MeshInterface(phy) { } |
kadonotakashi | 0:8fdf9a60065b | 25 | mesh_error_t init(); |
kadonotakashi | 0:8fdf9a60065b | 26 | mesh_error_t mesh_connect(); |
kadonotakashi | 0:8fdf9a60065b | 27 | mesh_error_t mesh_disconnect(); |
kadonotakashi | 0:8fdf9a60065b | 28 | }; |
kadonotakashi | 0:8fdf9a60065b | 29 | |
kadonotakashi | 0:8fdf9a60065b | 30 | Nanostack::LoWPANNDInterface *LoWPANNDInterface::get_interface() const |
kadonotakashi | 0:8fdf9a60065b | 31 | { |
kadonotakashi | 0:8fdf9a60065b | 32 | return static_cast<Nanostack::LoWPANNDInterface*>(_interface); |
kadonotakashi | 0:8fdf9a60065b | 33 | } |
kadonotakashi | 0:8fdf9a60065b | 34 | |
kadonotakashi | 0:8fdf9a60065b | 35 | nsapi_error_t LoWPANNDInterface::do_initialize() |
kadonotakashi | 0:8fdf9a60065b | 36 | { |
kadonotakashi | 0:8fdf9a60065b | 37 | if (!_interface) { |
kadonotakashi | 0:8fdf9a60065b | 38 | _interface = new (nothrow) Nanostack::LoWPANNDInterface(*_phy); |
kadonotakashi | 0:8fdf9a60065b | 39 | if (!_interface) { |
kadonotakashi | 0:8fdf9a60065b | 40 | return NSAPI_ERROR_NO_MEMORY; |
kadonotakashi | 0:8fdf9a60065b | 41 | } |
kadonotakashi | 0:8fdf9a60065b | 42 | _interface->attach(_connection_status_cb); |
kadonotakashi | 0:8fdf9a60065b | 43 | } |
kadonotakashi | 0:8fdf9a60065b | 44 | return NSAPI_ERROR_OK; |
kadonotakashi | 0:8fdf9a60065b | 45 | } |
kadonotakashi | 0:8fdf9a60065b | 46 | |
kadonotakashi | 0:8fdf9a60065b | 47 | nsapi_error_t Nanostack::LoWPANNDInterface::bringup(bool dhcp, const char *ip, |
kadonotakashi | 0:8fdf9a60065b | 48 | const char *netmask, const char *gw, |
kadonotakashi | 0:8fdf9a60065b | 49 | nsapi_ip_stack_t stack, bool blocking) |
kadonotakashi | 0:8fdf9a60065b | 50 | { |
kadonotakashi | 0:8fdf9a60065b | 51 | nanostack_lock(); |
kadonotakashi | 0:8fdf9a60065b | 52 | |
kadonotakashi | 0:8fdf9a60065b | 53 | if (register_phy() < 0) { |
kadonotakashi | 0:8fdf9a60065b | 54 | nanostack_unlock(); |
kadonotakashi | 0:8fdf9a60065b | 55 | return NSAPI_ERROR_DEVICE_ERROR; |
kadonotakashi | 0:8fdf9a60065b | 56 | } |
kadonotakashi | 0:8fdf9a60065b | 57 | |
kadonotakashi | 0:8fdf9a60065b | 58 | _blocking = blocking; |
kadonotakashi | 0:8fdf9a60065b | 59 | |
kadonotakashi | 0:8fdf9a60065b | 60 | // After the RF is up, we can seed the random from it. |
kadonotakashi | 0:8fdf9a60065b | 61 | randLIB_seed_random(); |
kadonotakashi | 0:8fdf9a60065b | 62 | |
kadonotakashi | 0:8fdf9a60065b | 63 | mesh_error_t status = init(); |
kadonotakashi | 0:8fdf9a60065b | 64 | if (status != MESH_ERROR_NONE) { |
kadonotakashi | 0:8fdf9a60065b | 65 | nanostack_unlock(); |
kadonotakashi | 0:8fdf9a60065b | 66 | return map_mesh_error(status); |
kadonotakashi | 0:8fdf9a60065b | 67 | } |
kadonotakashi | 0:8fdf9a60065b | 68 | |
kadonotakashi | 0:8fdf9a60065b | 69 | status = mesh_connect(); |
kadonotakashi | 0:8fdf9a60065b | 70 | if (status != MESH_ERROR_NONE) { |
kadonotakashi | 0:8fdf9a60065b | 71 | nanostack_unlock(); |
kadonotakashi | 0:8fdf9a60065b | 72 | return map_mesh_error(status); |
kadonotakashi | 0:8fdf9a60065b | 73 | } |
kadonotakashi | 0:8fdf9a60065b | 74 | |
kadonotakashi | 0:8fdf9a60065b | 75 | // Release mutex before blocking |
kadonotakashi | 0:8fdf9a60065b | 76 | nanostack_unlock(); |
kadonotakashi | 0:8fdf9a60065b | 77 | |
kadonotakashi | 0:8fdf9a60065b | 78 | if (blocking) { |
kadonotakashi | 0:8fdf9a60065b | 79 | // wait connection for ever |
kadonotakashi | 0:8fdf9a60065b | 80 | int32_t count = connect_semaphore.wait(osWaitForever); |
kadonotakashi | 0:8fdf9a60065b | 81 | |
kadonotakashi | 0:8fdf9a60065b | 82 | if (count <= 0) { |
kadonotakashi | 0:8fdf9a60065b | 83 | return NSAPI_ERROR_DHCP_FAILURE; // sort of... |
kadonotakashi | 0:8fdf9a60065b | 84 | } |
kadonotakashi | 0:8fdf9a60065b | 85 | } |
kadonotakashi | 0:8fdf9a60065b | 86 | return 0; |
kadonotakashi | 0:8fdf9a60065b | 87 | |
kadonotakashi | 0:8fdf9a60065b | 88 | } |
kadonotakashi | 0:8fdf9a60065b | 89 | |
kadonotakashi | 0:8fdf9a60065b | 90 | nsapi_error_t Nanostack::LoWPANNDInterface::bringdown() |
kadonotakashi | 0:8fdf9a60065b | 91 | { |
kadonotakashi | 0:8fdf9a60065b | 92 | NanostackLockGuard lock; |
kadonotakashi | 0:8fdf9a60065b | 93 | |
kadonotakashi | 0:8fdf9a60065b | 94 | mesh_error_t status = mesh_disconnect(); |
kadonotakashi | 0:8fdf9a60065b | 95 | |
kadonotakashi | 0:8fdf9a60065b | 96 | return map_mesh_error(status); |
kadonotakashi | 0:8fdf9a60065b | 97 | } |
kadonotakashi | 0:8fdf9a60065b | 98 | |
kadonotakashi | 0:8fdf9a60065b | 99 | mesh_error_t Nanostack::LoWPANNDInterface::init() |
kadonotakashi | 0:8fdf9a60065b | 100 | { |
kadonotakashi | 0:8fdf9a60065b | 101 | nd_tasklet_init(); |
kadonotakashi | 0:8fdf9a60065b | 102 | __mesh_handler_set_callback(this); |
kadonotakashi | 0:8fdf9a60065b | 103 | interface_id = nd_tasklet_network_init(_device_id); |
kadonotakashi | 0:8fdf9a60065b | 104 | |
kadonotakashi | 0:8fdf9a60065b | 105 | if (interface_id == -2) { |
kadonotakashi | 0:8fdf9a60065b | 106 | return MESH_ERROR_PARAM; |
kadonotakashi | 0:8fdf9a60065b | 107 | } else if (interface_id == -3) { |
kadonotakashi | 0:8fdf9a60065b | 108 | return MESH_ERROR_MEMORY; |
kadonotakashi | 0:8fdf9a60065b | 109 | } else if (interface_id < 0) { |
kadonotakashi | 0:8fdf9a60065b | 110 | return MESH_ERROR_UNKNOWN; |
kadonotakashi | 0:8fdf9a60065b | 111 | } |
kadonotakashi | 0:8fdf9a60065b | 112 | return MESH_ERROR_NONE; |
kadonotakashi | 0:8fdf9a60065b | 113 | } |
kadonotakashi | 0:8fdf9a60065b | 114 | |
kadonotakashi | 0:8fdf9a60065b | 115 | mesh_error_t Nanostack::LoWPANNDInterface::mesh_connect() |
kadonotakashi | 0:8fdf9a60065b | 116 | { |
kadonotakashi | 0:8fdf9a60065b | 117 | int8_t status = -9; // init to unknown error |
kadonotakashi | 0:8fdf9a60065b | 118 | tr_debug("connect()"); |
kadonotakashi | 0:8fdf9a60065b | 119 | |
kadonotakashi | 0:8fdf9a60065b | 120 | status = nd_tasklet_connect(&__mesh_handler_c_callback, interface_id); |
kadonotakashi | 0:8fdf9a60065b | 121 | |
kadonotakashi | 0:8fdf9a60065b | 122 | if (status >= 0) { |
kadonotakashi | 0:8fdf9a60065b | 123 | return MESH_ERROR_NONE; |
kadonotakashi | 0:8fdf9a60065b | 124 | } else if (status == -1) { |
kadonotakashi | 0:8fdf9a60065b | 125 | return MESH_ERROR_PARAM; |
kadonotakashi | 0:8fdf9a60065b | 126 | } else if (status == -2) { |
kadonotakashi | 0:8fdf9a60065b | 127 | return MESH_ERROR_MEMORY; |
kadonotakashi | 0:8fdf9a60065b | 128 | } else if (status == -3) { |
kadonotakashi | 0:8fdf9a60065b | 129 | return MESH_ERROR_STATE; |
kadonotakashi | 0:8fdf9a60065b | 130 | } else { |
kadonotakashi | 0:8fdf9a60065b | 131 | return MESH_ERROR_UNKNOWN; |
kadonotakashi | 0:8fdf9a60065b | 132 | } |
kadonotakashi | 0:8fdf9a60065b | 133 | } |
kadonotakashi | 0:8fdf9a60065b | 134 | |
kadonotakashi | 0:8fdf9a60065b | 135 | mesh_error_t Nanostack::LoWPANNDInterface::mesh_disconnect() |
kadonotakashi | 0:8fdf9a60065b | 136 | { |
kadonotakashi | 0:8fdf9a60065b | 137 | int8_t status = -1; |
kadonotakashi | 0:8fdf9a60065b | 138 | |
kadonotakashi | 0:8fdf9a60065b | 139 | status = nd_tasklet_disconnect(true); |
kadonotakashi | 0:8fdf9a60065b | 140 | |
kadonotakashi | 0:8fdf9a60065b | 141 | if (status >= 0) { |
kadonotakashi | 0:8fdf9a60065b | 142 | return MESH_ERROR_NONE; |
kadonotakashi | 0:8fdf9a60065b | 143 | } |
kadonotakashi | 0:8fdf9a60065b | 144 | |
kadonotakashi | 0:8fdf9a60065b | 145 | return MESH_ERROR_UNKNOWN; |
kadonotakashi | 0:8fdf9a60065b | 146 | } |
kadonotakashi | 0:8fdf9a60065b | 147 | |
kadonotakashi | 0:8fdf9a60065b | 148 | char *Nanostack::LoWPANNDInterface::get_gateway(char *buf, nsapi_size_t buflen) |
kadonotakashi | 0:8fdf9a60065b | 149 | { |
kadonotakashi | 0:8fdf9a60065b | 150 | NanostackLockGuard lock; |
kadonotakashi | 0:8fdf9a60065b | 151 | if (nd_tasklet_get_router_ip_address(buf, buflen) == 0) { |
kadonotakashi | 0:8fdf9a60065b | 152 | return buf; |
kadonotakashi | 0:8fdf9a60065b | 153 | } |
kadonotakashi | 0:8fdf9a60065b | 154 | return NULL; |
kadonotakashi | 0:8fdf9a60065b | 155 | } |
kadonotakashi | 0:8fdf9a60065b | 156 | |
kadonotakashi | 0:8fdf9a60065b | 157 | bool LoWPANNDInterface::getRouterIpAddress(char *address, int8_t len) |
kadonotakashi | 0:8fdf9a60065b | 158 | { |
kadonotakashi | 0:8fdf9a60065b | 159 | return _interface->get_gateway(address, len); |
kadonotakashi | 0:8fdf9a60065b | 160 | } |
kadonotakashi | 0:8fdf9a60065b | 161 | |
kadonotakashi | 0:8fdf9a60065b | 162 | #define LOWPAN 0x2345 |
kadonotakashi | 0:8fdf9a60065b | 163 | #if MBED_CONF_NSAPI_DEFAULT_MESH_TYPE == LOWPAN && DEVICE_802_15_4_PHY |
kadonotakashi | 0:8fdf9a60065b | 164 | MBED_WEAK MeshInterface *MeshInterface::get_target_default_instance() |
kadonotakashi | 0:8fdf9a60065b | 165 | { |
kadonotakashi | 0:8fdf9a60065b | 166 | static LoWPANNDInterface lowpan(&NanostackRfPhy::get_default_instance()); |
kadonotakashi | 0:8fdf9a60065b | 167 | |
kadonotakashi | 0:8fdf9a60065b | 168 | return &lowpan; |
kadonotakashi | 0:8fdf9a60065b | 169 | } |
kadonotakashi | 0:8fdf9a60065b | 170 | #endif |