Skip to content

Commit 6ba1000

Browse files
committed
NS EMAC adjustments for border router
1 parent d17ca69 commit 6ba1000

File tree

4 files changed

+58
-27
lines changed

4 files changed

+58
-27
lines changed

features/nanostack/FEATURE_NANOSTACK/mbed-mesh-api/mbed-mesh-api/MeshInterfaceNanostack.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,17 @@ class Nanostack::Interface : public OnboardNetworkStack::Interface, private mbed
3030
virtual char *get_netmask(char *buf, nsapi_size_t buflen);
3131
virtual char *get_gateway(char *buf, nsapi_size_t buflen);
3232

33+
void get_mac_address(uint8_t *buf) const { interface_phy.get_mac_address(buf); }
34+
3335
/**
3436
* \brief Callback from C-layer
3537
* \param state state of the network
3638
* */
3739
void network_handler(mesh_connection_status_t status);
3840

41+
int8_t get_interface_id() const { return interface_id; }
42+
int8_t get_driver_id() const { return _device_id; }
43+
3944
private:
4045
NanostackPhy &interface_phy;
4146
protected:

features/nanostack/FEATURE_NANOSTACK/mbed-mesh-api/source/NanostackEMACInterface.cpp

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
class EMACPhy : public NanostackEthernetPhy
1414
{
1515
public:
16-
EMACPhy(NanostackMemoryManager &mem, EMAC &m) : memory_manager(mem), emac(m), device_id(-1) { }
16+
EMACPhy(NanostackMemoryManager &mem, EMAC &m);
1717
virtual int8_t phy_register();
1818
virtual void get_mac_address(uint8_t *mac);
1919
virtual void set_mac_address(uint8_t *mac);
@@ -52,6 +52,25 @@ static int8_t emac_phy_tx(uint8_t *data_ptr, uint16_t data_len, uint8_t tx_handl
5252
return single_phy->tx(data_ptr, data_len, tx_handle, data_flow);
5353
}
5454

55+
EMACPhy::EMACPhy(NanostackMemoryManager &mem, EMAC &m) : memory_manager(mem), emac(m), device_id(-1)
56+
{
57+
/* Same default address logic as lwIP glue uses */
58+
#if (MBED_MAC_ADDRESS_SUM != MBED_MAC_ADDR_INTERFACE)
59+
mac_addr[0] = MBED_MAC_ADDR_0;
60+
mac_addr[1] = MBED_MAC_ADDR_1;
61+
mac_addr[2] = MBED_MAC_ADDR_2;
62+
mac_addr[3] = MBED_MAC_ADDR_3;
63+
mac_addr[4] = MBED_MAC_ADDR_4;
64+
mac_addr[5] = MBED_MAC_ADDR_5;
65+
#else
66+
mbed_mac_address((char *) mac_addr);
67+
#endif
68+
/* We have a default MAC address, so do don't force them to supply one */
69+
/* They may or may not update hwaddr with their address */
70+
emac.get_hwaddr(mac_addr);
71+
}
72+
73+
5574
void EMACPhy::emac_phy_rx(emac_mem_buf_t *mem)
5675
{
5776
const uint8_t *ptr = NULL;
@@ -115,23 +134,11 @@ int8_t EMACPhy::phy_register()
115134
return -1;
116135
}
117136

118-
/* Same default address logic as lwIP glue uses */
119-
#if (MBED_MAC_ADDRESS_SUM != MBED_MAC_ADDR_INTERFACE)
120-
mac_addr[0] = MBED_MAC_ADDR_0;
121-
mac_addr[1] = MBED_MAC_ADDR_1;
122-
mac_addr[2] = MBED_MAC_ADDR_2;
123-
mac_addr[3] = MBED_MAC_ADDR_3;
124-
mac_addr[4] = MBED_MAC_ADDR_4;
125-
mac_addr[5] = MBED_MAC_ADDR_5;
126-
#else
127-
mbed_mac_address((char *) mac_addr);
128-
#endif
129-
130137
phy.phy_MTU = emac.get_mtu_size();
131-
/* We have a default MAC address, so do don't force them to supply one */
132-
/* They may or may not update hwaddr with their address */
133-
emac.get_hwaddr(mac_addr);
134-
/* Then we write back either what they gave us, or our default */
138+
/* Set the address - this could be either board default, what they
139+
* told us with EMAC::get_mac_address, or something manually specified
140+
* with EMACPhy::set_mac_address
141+
*/
135142
emac.set_hwaddr(mac_addr);
136143

137144
emac.set_all_multicast(true);
@@ -171,7 +178,7 @@ void EMACPhy::set_mac_address(uint8_t *mac)
171178
memcpy(mac_addr, mac, sizeof mac_addr);
172179
}
173180

174-
nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, OnboardNetworkStack::Interface **interface_out)
181+
nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, Nanostack::EthernetInterface **interface_out, const uint8_t *mac_addr)
175182
{
176183
if (single_phy) {
177184
return NSAPI_ERROR_DEVICE_ERROR;
@@ -182,6 +189,10 @@ nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, Onb
182189
return NSAPI_ERROR_NO_MEMORY;
183190
}
184191

192+
if (mac_addr) {
193+
single_phy->set_mac_address(const_cast<uint8_t*>(mac_addr));
194+
}
195+
185196
Nanostack::EthernetInterface *interface;
186197

187198
interface = new (nothrow) Nanostack::EthernetInterface(*single_phy);
@@ -197,5 +208,14 @@ nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, Onb
197208
*interface_out = interface;
198209

199210
return NSAPI_ERROR_OK;
211+
212+
}
213+
214+
nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, OnboardNetworkStack::Interface **interface_out)
215+
{
216+
Nanostack::EthernetInterface *interface;
217+
nsapi_error_t err = add_ethernet_interface(emac, default_if, &interface);
218+
*interface_out = interface;
219+
return err;
200220
}
201221
#endif

features/nanostack/FEATURE_NANOSTACK/mbed-mesh-api/source/NanostackEthernetInterface.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,9 @@ nsapi_error_t Nanostack::EthernetInterface::initialize()
2727
return NSAPI_ERROR_DEVICE_ERROR;
2828
}
2929

30-
enet_tasklet_init();
31-
__mesh_handler_set_callback(this);
32-
interface_id = enet_tasklet_network_init(_device_id);
33-
3430
nanostack_unlock();
3531

36-
if (interface_id < 0)
37-
return NSAPI_ERROR_DEVICE_ERROR;
38-
else
39-
return NSAPI_ERROR_OK;
32+
return NSAPI_ERROR_OK;
4033
}
4134

4235
#if 0
@@ -72,7 +65,15 @@ nsapi_error_t Nanostack::EthernetInterface::bringup(bool dhcp, const char *ip,
7265
}
7366

7467
nanostack_lock();
75-
int8_t status = enet_tasklet_connect(&__mesh_handler_c_callback, interface_id);
68+
if (interface_id < 0) {
69+
enet_tasklet_init();
70+
__mesh_handler_set_callback(this);
71+
interface_id = enet_tasklet_network_init(_device_id);
72+
}
73+
int8_t status = -1;
74+
if (interface_id >= 0) {
75+
status = enet_tasklet_connect(&__mesh_handler_c_callback, interface_id);
76+
}
7677
nanostack_unlock();
7778

7879
if (status == -1) {

features/nanostack/FEATURE_NANOSTACK/nanostack-interface/Nanostack.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,12 @@ class Nanostack : public OnboardNetworkStack, private mbed::NonCopyable<Nanostac
3737
class LoWPANNDInterface;
3838
class ThreadInterface;
3939

40+
/* Implement OnboardNetworkStack method */
4041
virtual nsapi_error_t add_ethernet_interface(EMAC &emac, bool default_if, OnboardNetworkStack::Interface **interface_out);
42+
43+
/* Local variant with stronger typing and manual address specification */
44+
nsapi_error_t add_ethernet_interface(EMAC &emac, bool default_if, Nanostack::EthernetInterface **interface_out, const uint8_t *mac_addr = NULL);
45+
4146
protected:
4247

4348
/** Get the local IP address

0 commit comments

Comments
 (0)