Merge pull request #7818 from kjbracey-arm/eui64_get_early

Allow ThreadInterface::device_eui64_get() before connect()
pull/7909/head
Martin Kojtal 2018-08-28 12:11:47 +02:00 committed by GitHub
commit b2a05511d0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 66 additions and 49 deletions

View File

@ -37,9 +37,10 @@ public:
*/ */
LoWPANNDInterface(NanostackRfPhy *phy) : MeshInterfaceNanostack(phy) { } LoWPANNDInterface(NanostackRfPhy *phy) : MeshInterfaceNanostack(phy) { }
virtual int connect();
virtual int disconnect();
bool getRouterIpAddress(char *address, int8_t len); bool getRouterIpAddress(char *address, int8_t len);
protected:
Nanostack::LoWPANNDInterface *get_interface() const;
virtual nsapi_error_t do_initialize();
}; };
#endif #endif

View File

@ -67,6 +67,18 @@ protected:
class InterfaceNanostack : public virtual NetworkInterface { class InterfaceNanostack : public virtual NetworkInterface {
public: public:
/** Start the interface
*
* @return 0 on success, negative error code on failure
*/
virtual nsapi_error_t connect();
/** Stop the interface
*
* @return 0 on success, negative error code on failure
*/
virtual nsapi_error_t disconnect();
/** Get the internally stored IP address /** Get the internally stored IP address
/return IP address of the interface or null if not yet connected /return IP address of the interface or null if not yet connected
*/ */
@ -109,6 +121,7 @@ protected:
InterfaceNanostack(); InterfaceNanostack();
virtual Nanostack *get_stack(void); virtual Nanostack *get_stack(void);
Nanostack::Interface *get_interface() const { return _interface; } Nanostack::Interface *get_interface() const { return _interface; }
virtual nsapi_error_t do_initialize() = 0;
Nanostack::Interface *_interface; Nanostack::Interface *_interface;

View File

@ -49,20 +49,9 @@ public:
nsapi_error_t initialize(NanostackEthernetPhy *phy); nsapi_error_t initialize(NanostackEthernetPhy *phy);
/** Start the interface
*
* @return 0 on success, negative on failure
*/
virtual nsapi_error_t connect();
/** Stop the interface
*
* @return 0 on success, negative on failure
*/
virtual nsapi_error_t disconnect();
protected: protected:
Nanostack::EthernetInterface *get_interface() const { return static_cast<Nanostack::EthernetInterface *>(_interface); } Nanostack::EthernetInterface *get_interface() const { return static_cast<Nanostack::EthernetInterface *>(_interface); }
virtual nsapi_error_t do_initialize();
}; };

View File

@ -62,10 +62,9 @@ public:
mesh_error_t device_pskd_set(const char *pskd); mesh_error_t device_pskd_set(const char *pskd);
virtual int connect();
virtual int disconnect();
protected: protected:
Nanostack::ThreadInterface *get_interface() const; Nanostack::ThreadInterface *get_interface() const;
virtual nsapi_error_t do_initialize();
}; };
#endif // THREADINTERFACE_H #endif // THREADINTERFACE_H

View File

@ -27,7 +27,12 @@ private:
mesh_error_t mesh_disconnect(); mesh_error_t mesh_disconnect();
}; };
int LoWPANNDInterface::connect() Nanostack::LoWPANNDInterface *LoWPANNDInterface::get_interface() const
{
return static_cast<Nanostack::LoWPANNDInterface*>(_interface);
}
nsapi_error_t LoWPANNDInterface::do_initialize()
{ {
if (!_interface) { if (!_interface) {
_interface = new (nothrow) Nanostack::LoWPANNDInterface(*_phy); _interface = new (nothrow) Nanostack::LoWPANNDInterface(*_phy);
@ -36,9 +41,7 @@ int LoWPANNDInterface::connect()
} }
_interface->attach(_connection_status_cb); _interface->attach(_connection_status_cb);
} }
return NSAPI_ERROR_OK;
return _interface->bringup(false, NULL, NULL, NULL, IPV6_STACK, _blocking);
} }
nsapi_error_t Nanostack::LoWPANNDInterface::bringup(bool dhcp, const char *ip, nsapi_error_t Nanostack::LoWPANNDInterface::bringup(bool dhcp, const char *ip,
@ -84,11 +87,6 @@ nsapi_error_t Nanostack::LoWPANNDInterface::bringup(bool dhcp, const char *ip,
} }
int LoWPANNDInterface::disconnect()
{
return _interface->bringdown();
}
nsapi_error_t Nanostack::LoWPANNDInterface::bringdown() nsapi_error_t Nanostack::LoWPANNDInterface::bringdown()
{ {
NanostackLockGuard lock; NanostackLockGuard lock;

View File

@ -82,17 +82,40 @@ InterfaceNanostack::InterfaceNanostack()
// Nothing to do // Nothing to do
} }
int InterfaceNanostack::connect()
{
nsapi_error_t error = do_initialize();
if (error) {
return error;
}
return _interface->bringup(false, NULL, NULL, NULL, IPV6_STACK, _blocking);
}
int InterfaceNanostack::disconnect()
{
if (!_interface) {
return NSAPI_ERROR_NO_CONNECTION;
}
return _interface->bringdown();
}
nsapi_error_t MeshInterfaceNanostack::initialize(NanostackRfPhy *phy) nsapi_error_t MeshInterfaceNanostack::initialize(NanostackRfPhy *phy)
{ {
if (_phy) { if (_phy && phy && _phy != phy) {
error("Phy already set"); error("Phy already set");
return NSAPI_ERROR_IS_CONNECTED; return NSAPI_ERROR_IS_CONNECTED;
} }
_phy = phy; if (phy) {
return NSAPI_ERROR_OK; _phy = phy;
}
if (_phy) {
return do_initialize();
} else {
return NSAPI_ERROR_PARAMETER;
}
} }
void Nanostack::Interface::network_handler(mesh_connection_status_t status) void Nanostack::Interface::network_handler(mesh_connection_status_t status)
{ {
if ((status == MESH_CONNECTED || status == MESH_CONNECTED_LOCAL || if ((status == MESH_CONNECTED || status == MESH_CONNECTED_LOCAL ||
@ -130,7 +153,9 @@ nsapi_error_t Nanostack::Interface::register_phy()
{ {
NanostackLockGuard lock; NanostackLockGuard lock;
_device_id = interface_phy.phy_register(); if (_device_id < 0) {
_device_id = interface_phy.phy_register();
}
if (_device_id < 0) { if (_device_id < 0) {
return NSAPI_ERROR_DEVICE_ERROR; return NSAPI_ERROR_DEVICE_ERROR;
} }

View File

@ -87,12 +87,12 @@ nsapi_error_t Nanostack::EthernetInterface::bringup(bool dhcp, const char *ip,
return 0; return 0;
} }
int NanostackEthernetInterface::connect() nsapi_error_t NanostackEthernetInterface::do_initialize()
{ {
if (!_interface) { if (!_interface) {
return NSAPI_ERROR_PARAMETER; return NSAPI_ERROR_PARAMETER;
} }
return _interface->bringup(false, NULL, NULL, NULL, IPV6_STACK, _blocking); return NSAPI_ERROR_OK;
} }
nsapi_error_t Nanostack::EthernetInterface::bringdown() nsapi_error_t Nanostack::EthernetInterface::bringdown()
@ -100,12 +100,3 @@ nsapi_error_t Nanostack::EthernetInterface::bringdown()
enet_tasklet_disconnect(); enet_tasklet_disconnect();
return 0; return 0;
} }
int NanostackEthernetInterface::disconnect()
{
if (!_interface) {
return NSAPI_ERROR_NO_CONNECTION;
}
return _interface->bringdown();
}

View File

@ -76,7 +76,7 @@ Nanostack::ThreadInterface *ThreadInterface::get_interface() const
return static_cast<Nanostack::ThreadInterface*>(_interface); return static_cast<Nanostack::ThreadInterface*>(_interface);
} }
int ThreadInterface::connect() nsapi_error_t ThreadInterface::do_initialize()
{ {
if (!_interface) { if (!_interface) {
_interface = new (nothrow) Nanostack::ThreadInterface(*_phy); _interface = new (nothrow) Nanostack::ThreadInterface(*_phy);
@ -85,8 +85,7 @@ int ThreadInterface::connect()
} }
_interface->attach(_connection_status_cb); _interface->attach(_connection_status_cb);
} }
return NSAPI_ERROR_OK;
return _interface->bringup(false, NULL, NULL, NULL, IPV6_STACK, _blocking);
} }
nsapi_error_t Nanostack::ThreadInterface::bringup(bool dhcp, const char *ip, nsapi_error_t Nanostack::ThreadInterface::bringup(bool dhcp, const char *ip,
@ -146,11 +145,6 @@ nsapi_error_t Nanostack::ThreadInterface::bringup(bool dhcp, const char *ip,
return 0; return 0;
} }
int ThreadInterface::disconnect()
{
return _interface->bringdown();
}
nsapi_error_t Nanostack::ThreadInterface::bringdown() nsapi_error_t Nanostack::ThreadInterface::bringdown()
{ {
nanostack_lock(); nanostack_lock();
@ -219,6 +213,10 @@ void ThreadInterface::device_eui64_set(const uint8_t *eui64)
void ThreadInterface::device_eui64_get(uint8_t *eui64) void ThreadInterface::device_eui64_get(uint8_t *eui64)
{ {
memset(eui64, 0, 8);
if (!get_interface()) {
return;
}
get_interface()->device_eui64_get(eui64); get_interface()->device_eui64_get(eui64);
} }
@ -232,6 +230,9 @@ void Nanostack::ThreadInterface::device_eui64_get(uint8_t *eui64)
{ {
if (!eui64_set) { if (!eui64_set) {
uint8_t eui64_buf[8]; uint8_t eui64_buf[8];
if (register_phy() < 0) {
return;
}
get_phy().get_mac_address(eui64_buf); get_phy().get_mac_address(eui64_buf);
device_eui64_set(eui64_buf); device_eui64_set(eui64_buf);
} }