diff options
author | Joe Hershberger <joe.hershberger@ni.com> | 2012-05-23 07:59:16 +0000 |
---|---|---|
committer | Joe Hershberger <joe.hershberger@ni.com> | 2012-05-23 17:53:04 -0500 |
commit | e71110158124009c043eac704db9d442db43b36d (patch) | |
tree | b7404ca02b7a7d831b8e8aeb9582f335a1df5e4d /net/ping.c | |
parent | ece223b52ae9ab94f7ae83a9ac49b9f6319a94cb (diff) | |
download | u-boot-imx-e71110158124009c043eac704db9d442db43b36d.zip u-boot-imx-e71110158124009c043eac704db9d442db43b36d.tar.gz u-boot-imx-e71110158124009c043eac704db9d442db43b36d.tar.bz2 |
net: Add net_update_ether() to handle ARP and Ping replies
When the network is VLAN or SNAP, net_update_ether() will preserve
the original Ethernet packet header and simply replace the src and
dest MACs and the protocol
Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Acked-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'net/ping.c')
-rw-r--r-- | net/ping.c | 10 |
1 files changed, 5 insertions, 5 deletions
@@ -87,6 +87,7 @@ void ping_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len) { struct icmp_hdr *icmph = (struct icmp_hdr *)&ip->udp_src; IPaddr_t src_ip; + int eth_hdr_size; switch (icmph->type) { case ICMP_ECHO_REPLY: @@ -95,11 +96,10 @@ void ping_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len) net_set_state(NETLOOP_SUCCESS); return; case ICMP_ECHO_REQUEST: - debug("Got ICMP ECHO REQUEST, return " - "%d bytes\n", ETHER_HDR_SIZE + len); + eth_hdr_size = net_update_ether(et, et->et_src, PROT_IP); - memcpy(&et->et_dest[0], &et->et_src[0], 6); - memcpy(&et->et_src[0], NetOurEther, 6); + debug("Got ICMP ECHO REQUEST, return " + "%d bytes\n", eth_hdr_size + len); ip->ip_sum = 0; ip->ip_off = 0; @@ -112,7 +112,7 @@ void ping_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len) icmph->checksum = 0; icmph->checksum = ~NetCksum((uchar *)icmph, (len - IP_HDR_SIZE) >> 1); - NetSendPacket((uchar *)et, ETHER_HDR_SIZE + len); + NetSendPacket((uchar *)et, eth_hdr_size + len); return; /* default: return;*/ |