mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-18 21:21:37 +00:00
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>
This commit is contained in:
parent
ece223b52a
commit
e711101581
4 changed files with 30 additions and 6 deletions
|
@ -449,6 +449,7 @@ extern int NetEthHdrSize(void);
|
||||||
|
|
||||||
/* Set ethernet header; returns the size of the header */
|
/* Set ethernet header; returns the size of the header */
|
||||||
extern int NetSetEther(uchar *, uchar *, uint);
|
extern int NetSetEther(uchar *, uchar *, uint);
|
||||||
|
extern int net_update_ether(struct ethernet_hdr *et, uchar *addr, uint prot);
|
||||||
|
|
||||||
/* Set IP header */
|
/* Set IP header */
|
||||||
extern void net_set_ip_header(uchar *pkt, IPaddr_t dest, IPaddr_t source);
|
extern void net_set_ip_header(uchar *pkt, IPaddr_t dest, IPaddr_t source);
|
||||||
|
|
|
@ -158,7 +158,7 @@ void ArpReceive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len)
|
||||||
/* reply with our IP address */
|
/* reply with our IP address */
|
||||||
debug("Got ARP REQUEST, return our IP\n");
|
debug("Got ARP REQUEST, return our IP\n");
|
||||||
pkt = (uchar *)et;
|
pkt = (uchar *)et;
|
||||||
eth_hdr_size = NetSetEther(pkt, et->et_src, PROT_ARP);
|
eth_hdr_size = net_update_ether(et, et->et_src, PROT_ARP);
|
||||||
pkt += eth_hdr_size;
|
pkt += eth_hdr_size;
|
||||||
arp->ar_op = htons(ARPOP_REPLY);
|
arp->ar_op = htons(ARPOP_REPLY);
|
||||||
memcpy(&arp->ar_tha, &arp->ar_sha, ARP_HLEN);
|
memcpy(&arp->ar_tha, &arp->ar_sha, ARP_HLEN);
|
||||||
|
|
23
net/net.c
23
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)
|
void net_set_ip_header(uchar *pkt, IPaddr_t dest, IPaddr_t source)
|
||||||
{
|
{
|
||||||
struct ip_udp_hdr *ip = (struct ip_udp_hdr *)pkt;
|
struct ip_udp_hdr *ip = (struct ip_udp_hdr *)pkt;
|
||||||
|
|
10
net/ping.c
10
net/ping.c
|
@ -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;
|
struct icmp_hdr *icmph = (struct icmp_hdr *)&ip->udp_src;
|
||||||
IPaddr_t src_ip;
|
IPaddr_t src_ip;
|
||||||
|
int eth_hdr_size;
|
||||||
|
|
||||||
switch (icmph->type) {
|
switch (icmph->type) {
|
||||||
case ICMP_ECHO_REPLY:
|
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);
|
net_set_state(NETLOOP_SUCCESS);
|
||||||
return;
|
return;
|
||||||
case ICMP_ECHO_REQUEST:
|
case ICMP_ECHO_REQUEST:
|
||||||
debug("Got ICMP ECHO REQUEST, return "
|
eth_hdr_size = net_update_ether(et, et->et_src, PROT_IP);
|
||||||
"%d bytes\n", ETHER_HDR_SIZE + len);
|
|
||||||
|
|
||||||
memcpy(&et->et_dest[0], &et->et_src[0], 6);
|
debug("Got ICMP ECHO REQUEST, return "
|
||||||
memcpy(&et->et_src[0], NetOurEther, 6);
|
"%d bytes\n", eth_hdr_size + len);
|
||||||
|
|
||||||
ip->ip_sum = 0;
|
ip->ip_sum = 0;
|
||||||
ip->ip_off = 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 = 0;
|
||||||
icmph->checksum = ~NetCksum((uchar *)icmph,
|
icmph->checksum = ~NetCksum((uchar *)icmph,
|
||||||
(len - IP_HDR_SIZE) >> 1);
|
(len - IP_HDR_SIZE) >> 1);
|
||||||
NetSendPacket((uchar *)et, ETHER_HDR_SIZE + len);
|
NetSendPacket((uchar *)et, eth_hdr_size + len);
|
||||||
return;
|
return;
|
||||||
/* default:
|
/* default:
|
||||||
return;*/
|
return;*/
|
||||||
|
|
Loading…
Add table
Reference in a new issue