Skip to content

Commit e71e312

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 f6f0286 commit e71e312

File tree

8 files changed

+66
-8
lines changed

8 files changed

+66
-8
lines changed

features/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 : public Nanostack::Interface {
2828
nsapi_ip_stack_t stack = DEFAULT_STACK,
2929
bool blocking = true);
3030
virtual nsapi_error_t bringdown();
31+
virtual char *get_mac_address(char *buf, nsapi_size_t buflen);
3132

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

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ void EMACPhy::set_mac_address(uint8_t *mac)
178178
memcpy(mac_addr, mac, sizeof mac_addr);
179179
}
180180

181-
nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, Nanostack::EthernetInterface **interface_out, const uint8_t *mac_addr)
181+
nsapi_error_t Nanostack::add_ethernet_interface_ns(EMAC &emac, bool default_if, Nanostack::EthernetInterface **interface_out, const uint8_t *mac_addr)
182182
{
183183
if (single_phy) {
184184
return NSAPI_ERROR_DEVICE_ERROR;
@@ -212,10 +212,15 @@ nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, Nan
212212

213213
}
214214

215-
nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, OnboardNetworkStack::Interface **interface_out)
215+
nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, OnboardNetworkStack::Interface **interface_out, const uint8_t *mac_addr)
216216
{
217217
Nanostack::EthernetInterface *interface;
218-
nsapi_error_t err = add_ethernet_interface(emac, default_if, &interface);
218+
nsapi_error_t err = add_ethernet_interface_ns(emac, default_if, &interface, mac_addr);
219219
*interface_out = interface;
220220
return err;
221221
}
222+
223+
nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, OnboardNetworkStack::Interface **interface_out)
224+
{
225+
return Nanostack::add_ethernet_interface(emac, default_if, interface_out, nullptr);
226+
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,17 @@ char *Nanostack::EthernetInterface::get_interface_name(char *buf)
129129
sprintf(buf, "ETH%d", interface_id);
130130
return buf;
131131
};
132+
133+
char *Nanostack::EthernetInterface::get_mac_address(char *buf, nsapi_size_t buflen)
134+
{
135+
uint8_t mac_buf[NSAPI_MAC_BYTES];
136+
137+
if (!buf || buflen < NSAPI_MAC_SIZE) {
138+
return NULL;
139+
}
140+
141+
get_phy().get_mac_address(mac_buf);
142+
143+
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]);
144+
return buf;
145+
}

features/nanostack/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
virtual nsapi_error_t add_ethernet_interface(EMAC &emac, bool default_if, OnboardNetworkStack::Interface **interface_out);
44+
virtual nsapi_error_t add_ethernet_interface(EMAC &emac, bool default_if, OnboardNetworkStack::Interface **interface_out, const uint8_t *mac_addr);
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
virtual nsapi_error_t add_ppp_interface(PPP &ppp, bool default_if, OnboardNetworkStack::Interface **interface_out);
4950

features/netsocket/EMACInterface.cpp

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ EMACInterface::EMACInterface(EMAC &emac, OnboardNetworkStack &stack) :
2525
_interface(NULL),
2626
_dhcp(true),
2727
_blocking(true),
28+
_hw_mac_addr_set(false),
2829
_ip_address(),
2930
_netmask(),
3031
_gateway()
@@ -68,7 +69,13 @@ nsapi_error_t EMACInterface::set_dhcp(bool dhcp)
6869
nsapi_error_t EMACInterface::connect()
6970
{
7071
if (!_interface) {
71-
nsapi_error_t err = _stack.add_ethernet_interface(_emac, true, &_interface);
72+
nsapi_error_t err;
73+
if (_hw_mac_addr_set) {
74+
err = _stack.add_ethernet_interface(_emac, true, &_interface, _hw_mac_addr);
75+
} else {
76+
err = _stack.add_ethernet_interface(_emac, true, &_interface);
77+
}
78+
7279
if (err != NSAPI_ERROR_OK) {
7380
_interface = NULL;
7481
return err;
@@ -100,6 +107,23 @@ const char *EMACInterface::get_mac_address()
100107
return nullptr;
101108
}
102109

110+
nsapi_error_t EMACInterface::set_mac_address(uint8_t *mac_addr, size_t addr_len)
111+
{
112+
if (!mac_addr || addr_len != NSAPI_MAC_BYTES) {
113+
return NSAPI_ERROR_PARAMETER;
114+
}
115+
116+
if (_interface) {
117+
// can't set MAC address once initialized
118+
return NSAPI_ERROR_BUSY;
119+
}
120+
121+
memcpy(_hw_mac_addr, mac_addr, addr_len);
122+
_hw_mac_addr_set = true;
123+
124+
return NSAPI_ERROR_OK;
125+
}
126+
103127
nsapi_error_t EMACInterface::get_ip_address(SocketAddress *address)
104128
{
105129
if (_interface && _interface->get_ip_address(address) == NSAPI_ERROR_OK) {

features/netsocket/EMACInterface.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ class EMACInterface : public virtual NetworkInterface {
9999
*/
100100
virtual const char *get_mac_address();
101101

102+
virtual nsapi_error_t set_mac_address(uint8_t *mac_addr, size_t addr_len);
103+
102104
/** Get the local IP address
103105
*
104106
* @return Null-terminated representation of the local IP address
@@ -196,10 +198,12 @@ class EMACInterface : public virtual NetworkInterface {
196198
OnboardNetworkStack::Interface *_interface;
197199
bool _dhcp;
198200
bool _blocking;
201+
bool _hw_mac_addr_set;
199202
char _mac_address[NSAPI_MAC_SIZE];
200203
char _ip_address[NSAPI_IPv6_SIZE];
201204
char _netmask[NSAPI_IPv4_SIZE];
202205
char _gateway[NSAPI_IPv4_SIZE];
206+
uint8_t _hw_mac_addr[NSAPI_MAC_BYTES];
203207
mbed::Callback<void(nsapi_event_t, intptr_t)> _connection_status_cb;
204208
};
205209

features/netsocket/NetworkInterface.h

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

features/netsocket/OnboardNetworkStack.h

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

162+
virtual nsapi_error_t add_ethernet_interface(EMAC &emac, bool default_if, Interface **interface_out, const uint8_t *mac_addr)
163+
{
164+
return NSAPI_ERROR_UNSUPPORTED;
165+
}
166+
162167
virtual nsapi_error_t add_l3ip_interface(L3IP &l3ip, bool default_if, Interface **interface_out)
163168
{
164169
return NSAPI_ERROR_OK;

0 commit comments

Comments
 (0)