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.
Diff: mbed-os/features/nanostack/mbed-mesh-api/source/LoWPANNDInterface.cpp
- Revision:
- 0:8fdf9a60065b
diff -r 000000000000 -r 8fdf9a60065b mbed-os/features/nanostack/mbed-mesh-api/source/LoWPANNDInterface.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-os/features/nanostack/mbed-mesh-api/source/LoWPANNDInterface.cpp Wed Oct 10 00:33:53 2018 +0000 @@ -0,0 +1,170 @@ +#include "LoWPANNDInterface.h" +#include "include/nd_tasklet.h" +#include "callback_handler.h" +#include "NanostackLockGuard.h" +#include "mesh_system.h" +#include "randLIB.h" + +#include "ns_trace.h" +#define TRACE_GROUP "nslp" + +class Nanostack::LoWPANNDInterface : public Nanostack::MeshInterface +{ +public: + virtual nsapi_error_t bringup(bool dhcp, const char *ip, + const char *netmask, const char *gw, + nsapi_ip_stack_t stack = IPV6_STACK, + bool blocking = true); + virtual nsapi_error_t bringdown(); + virtual char *get_gateway(char *buf, nsapi_size_t buflen); + + friend Nanostack; + friend class ::LoWPANNDInterface; +private: + LoWPANNDInterface(NanostackRfPhy &phy) : MeshInterface(phy) { } + mesh_error_t init(); + mesh_error_t mesh_connect(); + mesh_error_t mesh_disconnect(); +}; + +Nanostack::LoWPANNDInterface *LoWPANNDInterface::get_interface() const +{ + return static_cast<Nanostack::LoWPANNDInterface*>(_interface); +} + +nsapi_error_t LoWPANNDInterface::do_initialize() +{ + if (!_interface) { + _interface = new (nothrow) Nanostack::LoWPANNDInterface(*_phy); + if (!_interface) { + return NSAPI_ERROR_NO_MEMORY; + } + _interface->attach(_connection_status_cb); + } + return NSAPI_ERROR_OK; +} + +nsapi_error_t Nanostack::LoWPANNDInterface::bringup(bool dhcp, const char *ip, + const char *netmask, const char *gw, + nsapi_ip_stack_t stack, bool blocking) +{ + nanostack_lock(); + + if (register_phy() < 0) { + nanostack_unlock(); + return NSAPI_ERROR_DEVICE_ERROR; + } + + _blocking = blocking; + + // After the RF is up, we can seed the random from it. + randLIB_seed_random(); + + mesh_error_t status = init(); + if (status != MESH_ERROR_NONE) { + nanostack_unlock(); + return map_mesh_error(status); + } + + status = mesh_connect(); + if (status != MESH_ERROR_NONE) { + nanostack_unlock(); + return map_mesh_error(status); + } + + // Release mutex before blocking + nanostack_unlock(); + + if (blocking) { + // wait connection for ever + int32_t count = connect_semaphore.wait(osWaitForever); + + if (count <= 0) { + return NSAPI_ERROR_DHCP_FAILURE; // sort of... + } + } + return 0; + +} + +nsapi_error_t Nanostack::LoWPANNDInterface::bringdown() +{ + NanostackLockGuard lock; + + mesh_error_t status = mesh_disconnect(); + + return map_mesh_error(status); +} + +mesh_error_t Nanostack::LoWPANNDInterface::init() +{ + nd_tasklet_init(); + __mesh_handler_set_callback(this); + interface_id = nd_tasklet_network_init(_device_id); + + if (interface_id == -2) { + return MESH_ERROR_PARAM; + } else if (interface_id == -3) { + return MESH_ERROR_MEMORY; + } else if (interface_id < 0) { + return MESH_ERROR_UNKNOWN; + } + return MESH_ERROR_NONE; +} + +mesh_error_t Nanostack::LoWPANNDInterface::mesh_connect() +{ + int8_t status = -9; // init to unknown error + tr_debug("connect()"); + + status = nd_tasklet_connect(&__mesh_handler_c_callback, interface_id); + + if (status >= 0) { + return MESH_ERROR_NONE; + } else if (status == -1) { + return MESH_ERROR_PARAM; + } else if (status == -2) { + return MESH_ERROR_MEMORY; + } else if (status == -3) { + return MESH_ERROR_STATE; + } else { + return MESH_ERROR_UNKNOWN; + } +} + +mesh_error_t Nanostack::LoWPANNDInterface::mesh_disconnect() +{ + int8_t status = -1; + + status = nd_tasklet_disconnect(true); + + if (status >= 0) { + return MESH_ERROR_NONE; + } + + return MESH_ERROR_UNKNOWN; +} + +char *Nanostack::LoWPANNDInterface::get_gateway(char *buf, nsapi_size_t buflen) +{ + NanostackLockGuard lock; + if (nd_tasklet_get_router_ip_address(buf, buflen) == 0) { + return buf; + } + return NULL; +} + +bool LoWPANNDInterface::getRouterIpAddress(char *address, int8_t len) +{ + return _interface->get_gateway(address, len); +} + +#define LOWPAN 0x2345 +#if MBED_CONF_NSAPI_DEFAULT_MESH_TYPE == LOWPAN && DEVICE_802_15_4_PHY +MBED_WEAK MeshInterface *MeshInterface::get_target_default_instance() +{ + static LoWPANNDInterface lowpan(&NanostackRfPhy::get_default_instance()); + + return &lowpan; +} +#endif