NetUpdateEther() will preserve the original Ethernet packet header
   and simply replace the src and dest MACs and the protocol

Signed-off-by: Joe Hershberger <joe.hershber...@ni.com>
Cc: Joe Hershberger <joe.hershber...@gmail.com>
Cc: Wolfgang Denk <w...@denx.de>
---
 include/net.h |    1 +
 net/arp.c     |    2 +-
 net/net.c     |   22 ++++++++++++++++++++++
 net/ping.c    |   10 +++++-----
 4 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/include/net.h b/include/net.h
index dca8e1c..af6a803 100644
--- a/include/net.h
+++ b/include/net.h
@@ -413,6 +413,7 @@ extern int  NetEthHdrSize(void);
 
 /* Set ethernet header; returns the size of the header */
 extern int NetSetEther(uchar *, uchar *, uint);
+extern int NetUpdateEther(struct Ethernet_t *et, uchar *addr, uint prot);
 
 /* Set IP header */
 extern void NetSetIPHeader(uchar *pkt, IPaddr_t dest, IPaddr_t source);
diff --git a/net/arp.c b/net/arp.c
index 5b6c787..8c3557b 100644
--- a/net/arp.c
+++ b/net/arp.c
@@ -158,7 +158,7 @@ void ArpReceive(struct Ethernet_t *et, struct IP_UDP_t *ip, 
int len)
                /* reply with our IP address */
                debug("Got ARP REQUEST, return our IP\n");
                pkt = (uchar *)et;
-               eth_hdr_size = NetSetEther(pkt, et->et_src, PROT_ARP);
+               eth_hdr_size = NetUpdateEther(et, et->et_src, PROT_ARP);
                pkt += eth_hdr_size;
                arp->ar_op = htons(ARPOP_REPLY);
                memcpy(&arp->ar_tha, &arp->ar_sha, ARP_HLEN);
diff --git a/net/net.c b/net/net.c
index 2dc49f5..1c0c822 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1274,6 +1274,28 @@ NetSetEther(uchar *xet, uchar * addr, uint prot)
        }
 }
 
+int
+NetUpdateEther(struct Ethernet_t *et, uchar *addr, uint prot)
+{
+       ushort protlen;
+
+       memcpy(et->et_dest, addr, 6);
+       memcpy(et->et_src, NetOurEther, 6);
+       protlen = ntohs(et->et_protlen);
+       if (protlen == PROT_VLAN) {
+               struct VLAN_Ethernet_t *vet = (struct VLAN_Ethernet_t *)et;
+               vet->vet_type = htons(prot);
+               return VLAN_ETHER_HDR_SIZE;
+       } else if (protlen > 1514) {
+               et->et_protlen = htons(prot);
+               return ETHER_HDR_SIZE;
+       } else {
+               /* 802.2 + SNAP */
+               et->et_prot = htons(prot);
+               return E802_HDR_SIZE;
+       }
+}
+
 void
 NetSetIPHeader(uchar *pkt, IPaddr_t dest, IPaddr_t source)
 {
diff --git a/net/ping.c b/net/ping.c
index 795d5c9..913506b 100644
--- a/net/ping.c
+++ b/net/ping.c
@@ -89,6 +89,7 @@ void PingReceive(struct Ethernet_t *et, struct IP_UDP_t *ip, 
int len)
 {
        struct ICMP_t *icmph = (struct ICMP_t *)&(ip->udp_src);
        IPaddr_t src_ip;
+       int eth_hdr_size;
 
        switch (icmph->type) {
        case ICMP_ECHO_REPLY:
@@ -97,11 +98,10 @@ void PingReceive(struct Ethernet_t *et, struct IP_UDP_t 
*ip, int len)
                        NetSetState(NETLOOP_SUCCESS);
                return;
        case ICMP_ECHO_REQUEST:
-               debug("Got ICMP ECHO REQUEST, return "
-                       "%d bytes\n", ETHER_HDR_SIZE + len);
+               eth_hdr_size = NetUpdateEther(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;
@@ -114,7 +114,7 @@ void PingReceive(struct Ethernet_t *et, struct IP_UDP_t 
*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;*/
-- 
1.6.0.2

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to