summaryrefslogtreecommitdiff
path: root/net/net.c
diff options
context:
space:
mode:
authorJoe Hershberger <joe.hershberger@ni.com>2012-05-23 07:59:16 +0000
committerJoe Hershberger <joe.hershberger@ni.com>2012-05-23 17:53:04 -0500
commite71110158124009c043eac704db9d442db43b36d (patch)
treeb7404ca02b7a7d831b8e8aeb9582f335a1df5e4d /net/net.c
parentece223b52ae9ab94f7ae83a9ac49b9f6319a94cb (diff)
downloadu-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/net.c')
-rw-r--r--net/net.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/net/net.c b/net/net.c
index 72fafd8..651f3f7 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1276,6 +1276,29 @@ NetSetEther(uchar *xet, uchar * addr, uint prot)
}
}
+int net_update_ether(struct ethernet_hdr *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_hdr *vet =
+ (struct vlan_ethernet_hdr *)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 */
+ struct e802_hdr *et802 = (struct e802_hdr *)et;
+ et802->et_prot = htons(prot);
+ return E802_HDR_SIZE;
+ }
+}
+
void net_set_ip_header(uchar *pkt, IPaddr_t dest, IPaddr_t source)
{
struct ip_udp_hdr *ip = (struct ip_udp_hdr *)pkt;