test: eth: Add a test for ARP requests

This tests that ARP requests made to this target's IP address are
responded-to by the target when it is doing other networking operations.

This currently corrupts the ongoing operation of the device if it
happens to be awaiting an ARP reply of its own to whatever serverip it
is attempting to communicate with. In the test, add an expectation that
the user operation (ping, in this case) will fail. A later patch will
address this problem.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
Joe Hershberger
2018-09-26 16:49:00 -05:00
parent 9cbe5972c3
commit 45988dae4c
3 changed files with 137 additions and 0 deletions

View File

@@ -160,6 +160,47 @@ int sandbox_eth_ping_req_to_reply(struct udevice *dev, void *packet,
return 0;
}
/*
* sandbox_eth_recv_arp_req()
*
* Inject an ARP request for this target
*
* returns 0 if injected, -EOVERFLOW if not
*/
int sandbox_eth_recv_arp_req(struct udevice *dev)
{
struct eth_sandbox_priv *priv = dev_get_priv(dev);
struct ethernet_hdr *eth_recv;
struct arp_hdr *arp_recv;
/* Don't allow the buffer to overrun */
if (priv->recv_packets >= PKTBUFSRX)
return -EOVERFLOW;
/* Formulate a fake request */
eth_recv = (void *)priv->recv_packet_buffer[priv->recv_packets];
memcpy(eth_recv->et_dest, net_bcast_ethaddr, ARP_HLEN);
memcpy(eth_recv->et_src, priv->fake_host_hwaddr, ARP_HLEN);
eth_recv->et_protlen = htons(PROT_ARP);
arp_recv = (void *)eth_recv + ETHER_HDR_SIZE;
arp_recv->ar_hrd = htons(ARP_ETHER);
arp_recv->ar_pro = htons(PROT_IP);
arp_recv->ar_hln = ARP_HLEN;
arp_recv->ar_pln = ARP_PLEN;
arp_recv->ar_op = htons(ARPOP_REQUEST);
memcpy(&arp_recv->ar_sha, priv->fake_host_hwaddr, ARP_HLEN);
net_write_ip(&arp_recv->ar_spa, priv->fake_host_ipaddr);
memcpy(&arp_recv->ar_tha, net_null_ethaddr, ARP_HLEN);
net_write_ip(&arp_recv->ar_tpa, net_ip);
priv->recv_packet_length[priv->recv_packets] =
ETHER_HDR_SIZE + ARP_HDR_SIZE;
++priv->recv_packets;
return 0;
}
/*
* sb_default_handler()
*