net: shell: Add support to set Ethernet MAC address
Add a shell command to set Ethernet MAC address, useful in configuring custom/local MAC addresses. Signed-off-by: Krishna T <krishna.t@nordicsemi.no>
This commit is contained in:
parent
6e3e10e6cd
commit
b59c89123c
1 changed files with 59 additions and 0 deletions
|
@ -27,6 +27,9 @@ LOG_MODULE_REGISTER(net_shell, LOG_LEVEL_DBG);
|
||||||
#include <zephyr/net/ppp.h>
|
#include <zephyr/net/ppp.h>
|
||||||
#include <zephyr/net/net_stats.h>
|
#include <zephyr/net/net_stats.h>
|
||||||
#include <zephyr/sys/printk.h>
|
#include <zephyr/sys/printk.h>
|
||||||
|
#if defined(CONFIG_NET_L2_ETHERNET)
|
||||||
|
#include <zephyr/net/ethernet.h>
|
||||||
|
#endif /* CONFIG_NET_L2_ETHERNET */
|
||||||
|
|
||||||
#include "route.h"
|
#include "route.h"
|
||||||
#include "icmpv6.h"
|
#include "icmpv6.h"
|
||||||
|
@ -3563,6 +3566,59 @@ static int cmd_net_iface(const struct shell *sh, size_t argc, char *argv[])
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int cmd_net_set_mac(const struct shell *sh, size_t argc, char *argv[])
|
||||||
|
{
|
||||||
|
#if !defined(CONFIG_NET_L2_ETHERNET)
|
||||||
|
PR_WARNING("Unsupported command, please enable CONFIG_NET_L2_ETHERNET\n");
|
||||||
|
return -ENOEXEC;
|
||||||
|
#else
|
||||||
|
struct net_if *iface;
|
||||||
|
struct net_eth_addr mac_addr;
|
||||||
|
int idx;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (argc < 3) {
|
||||||
|
PR_WARNING("Missing interface index and/or MAC address\n");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
idx = get_iface_idx(sh, argv[1]);
|
||||||
|
if (idx < 0) {
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
iface = net_if_get_by_index(idx);
|
||||||
|
if (!iface) {
|
||||||
|
PR_WARNING("No such interface in index %d\n", idx);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (net_if_l2(iface) != &NET_L2_GET_NAME(ETHERNET)) {
|
||||||
|
PR_WARNING("MAC address can be set only for Ethernet\n");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (net_bytes_from_str(mac_addr.addr, sizeof(mac_addr), argv[2]) < 0) {
|
||||||
|
PR_WARNING("Invalid MAC address\n");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = net_if_set_link_addr(iface, mac_addr.addr, sizeof(mac_addr), NET_LINK_ETHERNET);
|
||||||
|
if (ret < 0) {
|
||||||
|
if (ret == -EPERM) {
|
||||||
|
PR_WARNING("MAC address cannot be set when interface is operational\n");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
PR_WARNING("Failed to set MAC address (%d)\n", ret);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
err:
|
||||||
|
return -ENOEXEC;
|
||||||
|
#endif /* CONFIG_NET_L2_ETHERNET */
|
||||||
|
}
|
||||||
|
|
||||||
struct ctx_info {
|
struct ctx_info {
|
||||||
int pos;
|
int pos;
|
||||||
bool are_external_pools;
|
bool are_external_pools;
|
||||||
|
@ -5914,6 +5970,9 @@ SHELL_STATIC_SUBCMD_SET_CREATE(net_cmd_iface,
|
||||||
"'net iface <index>' shows network interface "
|
"'net iface <index>' shows network interface "
|
||||||
"information.",
|
"information.",
|
||||||
cmd_net_iface),
|
cmd_net_iface),
|
||||||
|
SHELL_CMD(set_mac, IFACE_DYN_CMD,
|
||||||
|
"'net iface set_mac <index> <MAC>' sets MAC address for the network interface.",
|
||||||
|
cmd_net_set_mac),
|
||||||
SHELL_SUBCMD_SET_END
|
SHELL_SUBCMD_SET_END
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue