@@ -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
@@ -479,4 +479,40 @@ U_BOOT_CMD(
""
);
+#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
+
#endif /* CONFIG_CMD_LINK_LOCAL */
@@ -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 */
@@ -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
@@ -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__ */
@@ -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();