mirror of
https://github.com/apache/nuttx-apps.git
synced 2025-10-20 04:26:04 +08:00
cmd_arp: add device input for arp interface
Signed-off-by: zhanghongyu <zhanghongyu@xiaomi.com>
This commit is contained in:
@@ -43,6 +43,7 @@
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <debug.h>
|
||||
#include <getopt.h>
|
||||
|
||||
#if defined(CONFIG_LIBC_NETDB) && !defined(CONFIG_NSH_DISABLE_NSLOOKUP)
|
||||
# include <netdb.h>
|
||||
@@ -1038,21 +1039,61 @@ int cmd_nslookup(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv)
|
||||
#if defined(CONFIG_NET_ARP) && !defined(CONFIG_NSH_DISABLE_ARP)
|
||||
int cmd_arp(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv)
|
||||
{
|
||||
enum opt_type_e
|
||||
{
|
||||
OPT_TYPE_ARP_LIST,
|
||||
OPT_TYPE_ARP_GET,
|
||||
OPT_TYPE_ARP_DELETE,
|
||||
OPT_TYPE_ARP_SET
|
||||
} opt_type = OPT_TYPE_ARP_LIST;
|
||||
|
||||
struct sockaddr_in inaddr;
|
||||
struct ether_addr mac;
|
||||
FAR const char *ifname = NULL;
|
||||
int option;
|
||||
int ret;
|
||||
|
||||
/* Forms:
|
||||
*
|
||||
* arp -t
|
||||
* arp -a <ipaddr>
|
||||
* arp -d <ipdaddr>
|
||||
* arp -s <ipaddr> <hwaddr>
|
||||
* arp [-i <ifname>]
|
||||
* arp [-i <ifname>] -a <ipaddr>
|
||||
* arp [-i <ifname>] -d <ipdaddr>
|
||||
* arp [-i <ifname>] -s <ipaddr> <hwaddr>
|
||||
*/
|
||||
|
||||
memset(&inaddr, 0, sizeof(inaddr));
|
||||
|
||||
while ((option = getopt(argc, argv, "adsi:")) != ERROR)
|
||||
{
|
||||
switch (option)
|
||||
{
|
||||
case 'a':
|
||||
opt_type = OPT_TYPE_ARP_GET;
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
opt_type = OPT_TYPE_ARP_DELETE;
|
||||
break;
|
||||
|
||||
case 's':
|
||||
opt_type = OPT_TYPE_ARP_SET;
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
ifname = optarg;
|
||||
break;
|
||||
|
||||
case ':':
|
||||
goto errout_missing;
|
||||
|
||||
case '?':
|
||||
default:
|
||||
goto errout_invalid;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NETLINK_ROUTE
|
||||
if (strcmp(argv[1], "-t") == 0)
|
||||
if (opt_type == OPT_TYPE_ARP_LIST)
|
||||
{
|
||||
FAR struct arp_entry_s *arptab;
|
||||
size_t arpsize;
|
||||
@@ -1061,11 +1102,6 @@ int cmd_arp(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv)
|
||||
char ethaddr[24];
|
||||
int i;
|
||||
|
||||
if (argc != 2)
|
||||
{
|
||||
goto errout_toomany;
|
||||
}
|
||||
|
||||
/* Allocate a buffer to hold the ARP table */
|
||||
|
||||
arpsize = CONFIG_NET_ARPTAB_SIZE * sizeof(struct arp_entry_s);
|
||||
@@ -1129,22 +1165,22 @@ int cmd_arp(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv)
|
||||
}
|
||||
else
|
||||
#endif
|
||||
if (strcmp(argv[1], "-a") == 0)
|
||||
if (opt_type == OPT_TYPE_ARP_GET)
|
||||
{
|
||||
char hwaddr[20];
|
||||
|
||||
if (argc != 3)
|
||||
if (argc - optind < 1)
|
||||
{
|
||||
goto errout_toomany;
|
||||
goto errout_missing;
|
||||
}
|
||||
|
||||
/* Show the corresponding hardware address */
|
||||
|
||||
inaddr.sin_family = AF_INET;
|
||||
inaddr.sin_port = 0;
|
||||
inaddr.sin_addr.s_addr = inet_addr(argv[2]);
|
||||
inaddr.sin_addr.s_addr = inet_addr(argv[optind]);
|
||||
|
||||
ret = netlib_get_arpmapping(&inaddr, mac.ether_addr_octet);
|
||||
ret = netlib_get_arpmapping(&inaddr, mac.ether_addr_octet, ifname);
|
||||
if (ret < 0)
|
||||
{
|
||||
goto errout_cmdfaild;
|
||||
@@ -1152,35 +1188,35 @@ int cmd_arp(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv)
|
||||
|
||||
nsh_output(vtbl, "HWaddr: %s\n", ether_ntoa_r(&mac, hwaddr));
|
||||
}
|
||||
else if (strcmp(argv[1], "-d") == 0)
|
||||
else if (opt_type == OPT_TYPE_ARP_DELETE)
|
||||
{
|
||||
if (argc != 3)
|
||||
if (argc - optind < 1)
|
||||
{
|
||||
goto errout_toomany;
|
||||
goto errout_missing;
|
||||
}
|
||||
|
||||
/* Delete the corresponding address mapping from the arp table */
|
||||
|
||||
inaddr.sin_family = AF_INET;
|
||||
inaddr.sin_port = 0;
|
||||
inaddr.sin_addr.s_addr = inet_addr(argv[2]);
|
||||
inaddr.sin_addr.s_addr = inet_addr(argv[optind]);
|
||||
|
||||
ret = netlib_del_arpmapping(&inaddr);
|
||||
ret = netlib_del_arpmapping(&inaddr, ifname);
|
||||
if (ret < 0)
|
||||
{
|
||||
goto errout_cmdfaild;
|
||||
}
|
||||
}
|
||||
else if (strcmp(argv[1], "-s") == 0)
|
||||
else if (opt_type == OPT_TYPE_ARP_SET)
|
||||
{
|
||||
if (argc != 4)
|
||||
if (argc - optind < 2)
|
||||
{
|
||||
goto errout_missing;
|
||||
}
|
||||
|
||||
/* Convert the MAC address string to a binary */
|
||||
|
||||
if (!netlib_ethaddrconv(argv[3], mac.ether_addr_octet))
|
||||
if (!netlib_ethaddrconv(argv[optind + 1], mac.ether_addr_octet))
|
||||
{
|
||||
goto errout_invalid;
|
||||
}
|
||||
@@ -1189,9 +1225,9 @@ int cmd_arp(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv)
|
||||
|
||||
inaddr.sin_family = AF_INET;
|
||||
inaddr.sin_port = 0;
|
||||
inaddr.sin_addr.s_addr = inet_addr(argv[2]);
|
||||
inaddr.sin_addr.s_addr = inet_addr(argv[optind]);
|
||||
|
||||
ret = netlib_set_arpmapping(&inaddr, mac.ether_addr_octet);
|
||||
ret = netlib_set_arpmapping(&inaddr, mac.ether_addr_octet, ifname);
|
||||
if (ret < 0)
|
||||
{
|
||||
goto errout_cmdfaild;
|
||||
@@ -1209,7 +1245,7 @@ int cmd_arp(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv)
|
||||
errout_cmdfaild:
|
||||
if (ret == -ENOENT)
|
||||
{
|
||||
nsh_error(vtbl, g_fmtnosuch, argv[0], "ARP entry", argv[2]);
|
||||
nsh_error(vtbl, g_fmtnosuch, argv[0], "ARP entry", argv[optind]);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1219,10 +1255,6 @@ errout_cmdfaild:
|
||||
return ERROR;
|
||||
|
||||
errout_missing:
|
||||
nsh_error(vtbl, g_fmttoomanyargs, argv[0]);
|
||||
return ERROR;
|
||||
|
||||
errout_toomany:
|
||||
nsh_error(vtbl, g_fmtargrequired, argv[0]);
|
||||
return ERROR;
|
||||
|
||||
|
Reference in New Issue
Block a user