
I moved the v1 and v2 as "Superseeded" if that is what you mean.
Thanks
Joe Xue ________________________________ From: Sean Anderson sean.anderson@seco.com Sent: April 13, 2021 11:16 AM To: lgxue@hotmail.com lgxue@hotmail.com; u-boot@lists.denx.de u-boot@lists.denx.de Cc: bmeng.cn@gmail.com bmeng.cn@gmail.com; frederic.danis@collabora.com frederic.danis@collabora.com; xypron.glpk@gmx.de xypron.glpk@gmx.de; joe.hershberger@ni.com joe.hershberger@ni.com; Olaf.Krebs@emh-metering.com Olaf.Krebs@emh-metering.com; patrick.delaunay@foss.st.com patrick.delaunay@foss.st.com; peng.fan@nxp.com peng.fan@nxp.com; philippe.reynes@softathome.com philippe.reynes@softathome.com; rfried.dev@gmail.com rfried.dev@gmail.com; sjg@chromium.org sjg@chromium.org Subject: Re: [PATCH v3] cmd: net: Add the "arp" command
On 4/13/21 11:14 AM, lgxue@hotmail.com wrote:
From: Joe Xue lgxue@hotmail.com
The command is to query and show mac address of a specific ipAddress.
Signed-off-by: Joe Xue lgxue@hotmail.com
cmd/Kconfig | 6 ++++++ cmd/net.c | 37 +++++++++++++++++++++++++++++++++++++ doc/usage/arp.rst | 31 +++++++++++++++++++++++++++++++ include/net.h | 5 +++++ net/arp.c | 24 ++++++++++++++++++++++++ net/arp.h | 4 ++++ net/net.c | 8 ++++++++ 7 files changed, 115 insertions(+) create mode 100644 doc/usage/arp.rst
Do you have a list of changes you made since v1/v2?
--Sean
diff --git a/cmd/Kconfig b/cmd/Kconfig index 9bf5e863e4..1da4cb67f6 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -1587,6 +1587,12 @@ config CMD_PING help Send ICMP ECHO_REQUEST to network host
+config CMD_ARP
bool "arp"
help
Sends ARP_REQUEST to network host and shows the result if there is arp
response.
- config CMD_CDP bool "cdp" help
diff --git a/cmd/net.c b/cmd/net.c index beb2877dfd..56703e9641 100644 --- a/cmd/net.c +++ b/cmd/net.c @@ -480,3 +480,40 @@ U_BOOT_CMD( );
#endif /* CONFIG_CMD_LINK_LOCAL */
+#ifdef CONFIG_CMD_ARP +static int do_arp(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) +{
u8 *ethaddr = arp_query_ethaddr;
if (argc < 2)
return CMD_RET_USAGE;
arp_query_ip = string_to_ip(argv[1]);
if (arp_query_ip.s_addr == 0)
return CMD_RET_USAGE;
if ((arp_query_ip.s_addr & net_netmask.s_addr) !=
(net_ip.s_addr & net_netmask.s_addr)) {
printf("The host %s is not in the same network\n", argv[1]);
return CMD_RET_SUCCESS;
}
if (net_loop(ARP) < 0) {
printf("arp failed; host %s is not alive\n", argv[1]);
return CMD_RET_FAILURE;
}
printf("%s\t%02x:%02x:%02x:%02x:%02x:%02x\n", argv[1], ethaddr[0],
ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);
return CMD_RET_SUCCESS;
+}
+U_BOOT_CMD(
arp, 2, 1, do_arp,
"send ARP ARP_REQUEST to network host",
"ipAddress"
+);
+#endif /* CONFIG_CMD_ARP */ diff --git a/doc/usage/arp.rst b/doc/usage/arp.rst new file mode 100644 index 0000000000..b1f08a2ae9 --- /dev/null +++ b/doc/usage/arp.rst @@ -0,0 +1,31 @@ +arp command +===========
+Synopis +-------
+::
- arp ipAddress
+Description +-----------
+The arp command is used to send ARP_REQUEST to network host and show the result.
+ipAddress
- the host ip address
+Example +-------
+::
- => arp 192.168.0.1
- Using host_ens33 device
- 192.168.0.1 84:94:8c:5f:e1:62
+Return value +------------
+The return value $? is 0 if the comand running was successful else 1 diff --git a/include/net.h b/include/net.h index b95d6a6f60..60b4bf610e 100644 --- a/include/net.h +++ b/include/net.h @@ -580,6 +580,11 @@ extern char *net_dns_env_var; /* the env var to put the ip into */ extern struct in_addr net_ping_ip; /* the ip address to ping */ #endif
+#if defined(CONFIG_CMD_ARP) +extern u8 arp_query_ethaddr[6]; /* the arp query result */ +extern struct in_addr arp_query_ip; /* the ip address to arp query */ +#endif
- #if defined(CONFIG_CMD_CDP) /* when CDP completes these hold the return values */ extern ushort cdp_native_vlan; /* CDP returned native VLAN */
diff --git a/net/arp.c b/net/arp.c index 1d06ed2572..83c24072d7 100644 --- a/net/arp.c +++ b/net/arp.c @@ -220,11 +220,20 @@ void arp_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len) net_get_arp_handler()((uchar *)arp, 0, reply_ip_addr, 0, len);
+#ifdef CONFIG_CMD_ARP
if (arp_query_ip.s_addr != 0) {
arp_query_ip.s_addr = 0;
net_set_state(NETLOOP_SUCCESS);
} else {
+#endif /* set the mac address in the waiting packet's header and transmit it */ memcpy(((struct ethernet_hdr *)net_tx_packet)->et_dest, &arp->ar_sha, ARP_HLEN); net_send_packet(net_tx_packet, arp_wait_tx_packet_size); +#ifdef CONFIG_CMD_ARP
}
+#endif
/* no arp request pending now */ net_arp_wait_packet_ip.s_addr = 0;
@@ -243,3 +252,18 @@ bool arp_is_waiting(void) { return !!net_arp_wait_packet_ip.s_addr; }
+#ifdef CONFIG_CMD_ARP +u8 arp_query_ethaddr[6]; +struct in_addr arp_query_ip;
+void arp_query(void) +{
arp_wait_packet_ethaddr = arp_query_ethaddr;
net_arp_wait_packet_ip = arp_query_ip;
arp_wait_timer_start = get_timer(0);
printf("Using %s device\n", eth_get_name());
arp_request();
+} +#endif diff --git a/net/arp.h b/net/arp.h index 25b3c00d5c..f3e5cb8504 100644 --- a/net/arp.h +++ b/net/arp.h @@ -29,4 +29,8 @@ void arp_raw_request(struct in_addr source_ip, const uchar *targetEther, int arp_timeout_check(void); void arp_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len);
+#ifdef CONFIG_CMD_ARP +void arp_query(void); +#endif
- #endif /* __ARP_H__ */
diff --git a/net/net.c b/net/net.c index b58f3062b2..21623562e8 100644 --- a/net/net.c +++ b/net/net.c @@ -492,6 +492,11 @@ restart: rarp_request(); break; #endif +#if defined(CONFIG_CMD_ARP)
case ARP:
arp_query();
break;
+#endif #if defined(CONFIG_CMD_PING) case PING: ping_start(); @@ -1385,6 +1390,9 @@ common: case CDP: case DHCP: case LINKLOCAL: +#ifdef CONFIG_CMD_ARP
case ARP:
+#endif if (memcmp(net_ethaddr, "\0\0\0\0\0\0", 6) == 0) { int num = eth_get_dev_index();