Skip to content

Commit e1e0f89

Browse files
author
Arto Kinnunen
committed
MAC address set/get support for EMAC interface
Add support to set and get MAC address from EMAC interface.
1 parent a607be6 commit e1e0f89

File tree

8 files changed

+66
-8
lines changed

8 files changed

+66
-8
lines changed

connectivity/nanostack/include/nanostack-interface/Nanostack.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,10 @@ class Nanostack : public OnboardNetworkStack, private mbed::NonCopyable<Nanostac
4141

4242
/* Implement OnboardNetworkStack method */
4343
nsapi_error_t add_ethernet_interface(EMAC &emac, bool default_if, OnboardNetworkStack::Interface **interface_out) override;
44+
nsapi_error_t add_ethernet_interface(EMAC &emac, bool default_if, OnboardNetworkStack::Interface **interface_out, const uint8_t *mac_addr) override;
4445

45-
/* Local variant with stronger typing and manual address specification */
46-
nsapi_error_t add_ethernet_interface(EMAC &emac, bool default_if, Nanostack::EthernetInterface **interface_out, const uint8_t *mac_addr = NULL);
46+
/* Local variant */
47+
nsapi_error_t add_ethernet_interface_ns(EMAC &emac, bool default_if, Nanostack::EthernetInterface **interface_out, const uint8_t *mac_addr = NULL);
4748

4849
nsapi_error_t add_ppp_interface(PPP &ppp, bool default_if, OnboardNetworkStack::Interface **interface_out) override;
4950

connectivity/nanostack/mbed-mesh-api/mbed-mesh-api/NanostackEthernetInterface.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class Nanostack::EthernetInterface final : public Nanostack::Interface {
2828
nsapi_ip_stack_t stack = DEFAULT_STACK,
2929
bool blocking = true) override;
3030
nsapi_error_t bringdown() override;
31+
char *get_mac_address(char *buf, nsapi_size_t buflen) override;
3132

3233
char *get_interface_name(char *buf);
3334
private:

connectivity/nanostack/mbed-mesh-api/source/NanostackEMACInterface.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ void EMACPhy::set_mac_address(uint8_t *mac)
191191
memcpy(mac_addr, mac, sizeof mac_addr);
192192
}
193193

194-
nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, Nanostack::EthernetInterface **interface_out, const uint8_t *mac_addr)
194+
nsapi_error_t Nanostack::add_ethernet_interface_ns(EMAC &emac, bool default_if, Nanostack::EthernetInterface **interface_out, const uint8_t *mac_addr)
195195
{
196196
if (single_phy) {
197197
return NSAPI_ERROR_DEVICE_ERROR;
@@ -225,10 +225,15 @@ nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, Nan
225225

226226
}
227227

228-
nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, OnboardNetworkStack::Interface **interface_out)
228+
nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, OnboardNetworkStack::Interface **interface_out, const uint8_t *mac_addr)
229229
{
230230
Nanostack::EthernetInterface *interface;
231-
nsapi_error_t err = add_ethernet_interface(emac, default_if, &interface);
231+
nsapi_error_t err = add_ethernet_interface_ns(emac, default_if, &interface, mac_addr);
232232
*interface_out = interface;
233233
return err;
234234
}
235+
236+
nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, OnboardNetworkStack::Interface **interface_out)
237+
{
238+
return Nanostack::add_ethernet_interface(emac, default_if, interface_out, nullptr);
239+
}

connectivity/nanostack/mbed-mesh-api/source/NanostackEthernetInterface.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,3 +132,17 @@ char *Nanostack::EthernetInterface::get_interface_name(char *buf)
132132
sprintf(buf, "ETH%d", interface_id);
133133
return buf;
134134
};
135+
136+
char *Nanostack::EthernetInterface::get_mac_address(char *buf, nsapi_size_t buflen)
137+
{
138+
uint8_t mac_buf[NSAPI_MAC_BYTES];
139+
140+
if (!buf || buflen < NSAPI_MAC_SIZE) {
141+
return NULL;
142+
}
143+
144+
get_phy().get_mac_address(mac_buf);
145+
146+
snprintf(buf, buflen, "%02x:%02x:%02x:%02x:%02x:%02x", mac_buf[0], mac_buf[1], mac_buf[2], mac_buf[3], mac_buf[4], mac_buf[5]);
147+
return buf;
148+
}

connectivity/netsocket/include/netsocket/EMACInterface.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ class EMACInterface : public virtual NetworkInterface {
8686
/** @copydoc NetworkInterface::get_mac_address */
8787
const char *get_mac_address() override;
8888

89+
/** @copydoc NetworkInterface::set_mac_address */
90+
nsapi_error_t set_mac_address(uint8_t *mac_addr, size_t addr_len);
91+
8992
/** @copydoc NetworkInterface::get_ip_address */
9093
nsapi_error_t get_ip_address(SocketAddress *address) override;
9194

@@ -143,10 +146,12 @@ class EMACInterface : public virtual NetworkInterface {
143146
OnboardNetworkStack::Interface *_interface = nullptr;
144147
bool _dhcp = true;
145148
bool _blocking = true;
149+
bool _hw_mac_addr_set = false;
146150
char _mac_address[NSAPI_MAC_SIZE];
147151
char _ip_address[NSAPI_IPv6_SIZE] {};
148152
char _netmask[NSAPI_IPv4_SIZE] {};
149153
char _gateway[NSAPI_IPv4_SIZE] {};
154+
uint8_t _hw_mac_addr[NSAPI_MAC_BYTES];
150155
mbed::Callback<void(nsapi_event_t, intptr_t)> _connection_status_cb;
151156
};
152157

connectivity/netsocket/include/netsocket/NetworkInterface.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,14 @@ class NetworkInterface: public DNS {
104104
/** Set the MAC address to the interface.
105105
*
106106
* Provided MAC address is set the the network interface. Address must be
107-
* set before using the interface connect() method.
107+
* set before calling the interface connect() method. EUI-48 MAC addresses
108+
* are used for Ethernet while Mesh interface is using 8-byte EUI-64 address.
109+
*
110+
* All interfaces are not supporting MAC address set. A call to connect()
111+
* will fail if MAC address is provided but not possible to use.
108112
*
109113
* @param mac_addr Buffer containing the MAC address
110-
* @param addr_len Length of provided buffer in bytes
114+
* @param addr_len Length of provided buffer in bytes (6 or 8 bytes)
111115
* @retval NSAPI_ERROR_OK on success
112116
* @retval NSAPI_ERROR_UNSUPPORTED if this feature is not supported
113117
* @retval NSAPI_ERROR_PARAMETER if address is not valid

connectivity/netsocket/include/netsocket/OnboardNetworkStack.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,11 @@ class OnboardNetworkStack : public NetworkStack {
162162
*/
163163
virtual nsapi_error_t add_ethernet_interface(EMAC &emac, bool default_if, Interface **interface_out) = 0;
164164

165+
virtual nsapi_error_t add_ethernet_interface(EMAC &emac, bool default_if, Interface **interface_out, const uint8_t *mac_addr)
166+
{
167+
return NSAPI_ERROR_UNSUPPORTED;
168+
}
169+
165170
virtual nsapi_error_t add_l3ip_interface(L3IP &l3ip, bool default_if, Interface **interface_out)
166171
{
167172
return NSAPI_ERROR_OK;

connectivity/netsocket/source/EMACInterface.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,13 @@ nsapi_error_t EMACInterface::set_dhcp(bool dhcp)
4949
nsapi_error_t EMACInterface::connect()
5050
{
5151
if (!_interface) {
52-
nsapi_error_t err = _stack.add_ethernet_interface(_emac, true, &_interface);
52+
nsapi_error_t err;
53+
if (_hw_mac_addr_set) {
54+
err = _stack.add_ethernet_interface(_emac, true, &_interface, _hw_mac_addr);
55+
} else {
56+
err = _stack.add_ethernet_interface(_emac, true, &_interface);
57+
}
58+
5359
if (err != NSAPI_ERROR_OK) {
5460
_interface = NULL;
5561
return err;
@@ -81,6 +87,23 @@ const char *EMACInterface::get_mac_address()
8187
return nullptr;
8288
}
8389

90+
nsapi_error_t EMACInterface::set_mac_address(uint8_t *mac_addr, size_t addr_len)
91+
{
92+
if (!mac_addr || addr_len != NSAPI_MAC_BYTES) {
93+
return NSAPI_ERROR_PARAMETER;
94+
}
95+
96+
if (_interface) {
97+
// can't set MAC address once initialized
98+
return NSAPI_ERROR_BUSY;
99+
}
100+
101+
memcpy(_hw_mac_addr, mac_addr, addr_len);
102+
_hw_mac_addr_set = true;
103+
104+
return NSAPI_ERROR_OK;
105+
}
106+
84107
nsapi_error_t EMACInterface::get_ip_address(SocketAddress *address)
85108
{
86109
if (_interface && _interface->get_ip_address(address) == NSAPI_ERROR_OK) {

0 commit comments

Comments
 (0)