Skip to content

Commit 9454bb0

Browse files
authored
Merge pull request #13920 from artokin/mac_address_set_get_mbed_os_5_15
[mbed-os-5.15] Network interface MAC address set/get
2 parents 46a045b + 7199a3a commit 9454bb0

File tree

18 files changed

+174
-10
lines changed

18 files changed

+174
-10
lines changed

TESTS/network/emac/emac_TestNetworkStack.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,11 @@ char *EmacTestNetworkStack::Interface::get_mac_address(char *buf, nsapi_size_t b
155155
return NULL;
156156
}
157157

158+
nsapi_error_t EmacTestNetworkStack::Interface::set_mac_address(uint8_t *buf, nsapi_size_t buflen)
159+
{
160+
return NSAPI_STATUS_ERROR_UNSUPPORTED;
161+
}
162+
158163
nsapi_error_t EmacTestNetworkStack::Interface::get_ip_address(SocketAddress *address)
159164
{
160165
return NSAPI_ERROR_OK;

TESTS/network/emac/emac_TestNetworkStack.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,17 @@ class EmacTestNetworkStack : public OnboardNetworkStack, private mbed::NonCopyab
8686
*/
8787
virtual char *get_mac_address(char *buf, nsapi_size_t buflen);
8888

89+
/** Set MAC address on the network interface
90+
*
91+
* @param mac_addr Buffer containing the MAC address in hexadecimal format.
92+
* @param addr_len Length of provided buffer in bytes (6 or 8)
93+
* @retval NSAPI_ERROR_OK on success
94+
* @retval NSAPI_ERROR_UNSUPPORTED if this feature is not supported
95+
* @retval NSAPI_ERROR_PARAMETER if address is not valid
96+
* @retval NSAPI_ERROR_BUSY if address can't be set.
97+
*/
98+
virtual nsapi_error_t set_mac_address(uint8_t *mac_addr, nsapi_size_t addr_len);
99+
89100
/** Copies IP address of the network interface to user supplied buffer
90101
*
91102
* @param buf buffer to which IP address will be copied as "W:X:Y:Z"

UNITTESTS/features/netsocket/NetworkInterface/test_NetworkInterface.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@ TEST_F(TestNetworkInterface, get_mac_address)
7575
EXPECT_EQ(iface->get_mac_address(), n);
7676
}
7777

78+
TEST_F(TestNetworkInterface, set_mac_address)
79+
{
80+
uint8_t mac_buf[8];
81+
EXPECT_EQ(iface->set_mac_address(mac_buf, 8), NSAPI_ERROR_UNSUPPORTED);
82+
}
83+
7884
TEST_F(TestNetworkInterface, get_ip_address)
7985
{
8086
SocketAddress addr;

UNITTESTS/stubs/NetworkInterface_stub.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ const char *NetworkInterface::get_mac_address()
2626
return 0;
2727
}
2828

29+
nsapi_error_t NetworkInterface::set_mac_address(uint8_t *mac_addr, nsapi_size_t addr_len)
30+
{
31+
return NSAPI_ERROR_UNSUPPORTED;
32+
}
33+
2934
nsapi_error_t NetworkInterface::get_ip_address(SocketAddress *)
3035
{
3136
return NSAPI_ERROR_UNSUPPORTED;

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class Nanostack::Interface : public OnboardNetworkStack::Interface, private mbed
2929
MBED_DEPRECATED_SINCE("mbed-os-5.15", "String-based APIs are deprecated")
3030
virtual char *get_ip_address(char *buf, nsapi_size_t buflen);
3131
virtual char *get_mac_address(char *buf, nsapi_size_t buflen);
32+
virtual nsapi_error_t set_mac_address(uint8_t *buf, nsapi_size_t buflen);
3233
virtual nsapi_error_t get_netmask(SocketAddress *address);
3334
MBED_DEPRECATED_SINCE("mbed-os-5.15", "String-based APIs are deprecated")
3435
virtual char *get_netmask(char *buf, nsapi_size_t buflen);
@@ -37,14 +38,7 @@ class Nanostack::Interface : public OnboardNetworkStack::Interface, private mbed
3738
virtual char *get_gateway(char *buf, nsapi_size_t buflen);
3839
virtual void attach(mbed::Callback<void(nsapi_event_t, intptr_t)> status_cb);
3940
virtual nsapi_connection_status_t get_connection_status() const;
40-
41-
void get_mac_address(uint8_t *buf) const
42-
{
43-
NanostackMACPhy *phy = interface_phy.nanostack_mac_phy();
44-
if (phy) {
45-
phy->get_mac_address(buf);
46-
}
47-
}
41+
virtual void get_mac_address(uint8_t *buf) const;
4842

4943
/**
5044
* \brief Callback from C-layer
@@ -118,6 +112,9 @@ class InterfaceNanostack : public virtual NetworkInterface {
118112
*/
119113
virtual const char *get_mac_address();
120114

115+
/** @copydoc NetworkInterface::set_mac_address */
116+
virtual nsapi_error_t set_mac_address(uint8_t *mac_addr, nsapi_size_t addr_len);
117+
121118
/** Register callback for status reporting
122119
*
123120
* The specified status callback function will be called on status changes

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ 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 void get_mac_address(uint8_t *buf);
32+
virtual char *get_mac_address(char *buf, nsapi_size_t buflen);
3133

3234
char *get_interface_name(char *buf);
3335
private:

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,27 @@ char *Nanostack::Interface::get_mac_address(char *buf, nsapi_size_t buflen)
6161
}
6262
}
6363

64+
nsapi_error_t Nanostack::Interface::set_mac_address(uint8_t *buf, nsapi_size_t buflen)
65+
{
66+
if (buflen != 8) {
67+
/* Provided MAC is too short */
68+
return NSAPI_ERROR_PARAMETER;
69+
}
70+
71+
if (_device_id >= 0) {
72+
/* device is already registered, can't set MAC address anymore */
73+
return NSAPI_ERROR_BUSY;
74+
}
75+
76+
NanostackMACPhy *phy = interface_phy.nanostack_mac_phy();
77+
if (phy) {
78+
phy->set_mac_address(buf);
79+
return NSAPI_ERROR_OK;
80+
}
81+
82+
return NSAPI_ERROR_UNSUPPORTED;
83+
}
84+
6485
nsapi_error_t Nanostack::Interface::get_netmask(SocketAddress *address)
6586
{
6687
return NSAPI_ERROR_UNSUPPORTED;
@@ -86,6 +107,14 @@ nsapi_connection_status_t Nanostack::Interface::get_connection_status() const
86107
return _connect_status;
87108
}
88109

110+
void Nanostack::Interface::get_mac_address(uint8_t *buf) const
111+
{
112+
NanostackMACPhy *phy = interface_phy.nanostack_mac_phy();
113+
if (phy) {
114+
phy->get_mac_address(buf);
115+
}
116+
}
117+
89118
void Nanostack::Interface::attach(
90119
mbed::Callback<void(nsapi_event_t, intptr_t)> status_cb)
91120
{
@@ -237,6 +266,11 @@ const char *InterfaceNanostack::get_mac_address()
237266
return NULL;
238267
}
239268

269+
nsapi_error_t InterfaceNanostack::set_mac_address(uint8_t *mac_addr, nsapi_size_t addr_len)
270+
{
271+
return _interface->set_mac_address(mac_addr, addr_len);
272+
}
273+
240274
nsapi_connection_status_t InterfaceNanostack::get_connection_status() const
241275
{
242276
if (_interface) {

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,14 @@ nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, Nan
209209
*interface_out = interface;
210210

211211
return NSAPI_ERROR_OK;
212+
}
212213

214+
nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, OnboardNetworkStack::Interface **interface_out, const uint8_t *mac_addr)
215+
{
216+
Nanostack::EthernetInterface *interface;
217+
nsapi_error_t err = add_ethernet_interface(emac, default_if, &interface, mac_addr);
218+
*interface_out = interface;
219+
return err;
213220
}
214221

215222
nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, OnboardNetworkStack::Interface **interface_out)
@@ -218,4 +225,4 @@ nsapi_error_t Nanostack::add_ethernet_interface(EMAC &emac, bool default_if, Onb
218225
nsapi_error_t err = add_ethernet_interface(emac, default_if, &interface);
219226
*interface_out = interface;
220227
return err;
221-
}
228+
}

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

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

features/nanostack/nanostack-interface/Nanostack.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ 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

4546
/* Local variant with stronger typing and manual address specification */
4647
nsapi_error_t add_ethernet_interface(EMAC &emac, bool default_if, Nanostack::EthernetInterface **interface_out, const uint8_t *mac_addr = NULL);

0 commit comments

Comments
 (0)