diff options
author | Joe Hershberger <joe.hershberger@ni.com> | 2012-05-23 07:59:08 +0000 |
---|---|---|
committer | Joe Hershberger <joe.hershberger@ni.com> | 2012-05-23 17:46:18 -0500 |
commit | 9214637a56abd27863824bd53e602b7721b3cda6 (patch) | |
tree | 654d349c226ad6a50584be398cf5ab7216e446a7 /net/net.c | |
parent | 4b11c9166b86ccc5f8f02fda01ded0f9e9760df0 (diff) | |
download | u-boot-9214637a56abd27863824bd53e602b7721b3cda6.tar.gz |
net: Refactor NetSendUDPPacket to share more code
Share more of the code that is common between ARP vs not.
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.c | 44 |
1 files changed, 25 insertions, 19 deletions
@@ -595,6 +595,9 @@ int NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport, int payload_len) { uchar *pkt; + int need_arp = 0; + int eth_hdr_size; + int pkt_hdr_size; /* convert to new style broadcast */ if (dest == 0) @@ -609,40 +612,43 @@ int NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport, * an ARP request */ if (memcmp(ether, NetEtherNullAddr, 6) == 0) { + need_arp = 1; + pkt = NetArpWaitTxPacket; + } else + pkt = (uchar *)NetTxPacket; + + eth_hdr_size = NetSetEther(pkt, ether, PROT_IP); + pkt += eth_hdr_size; + net_set_udp_header(pkt, dest, dport, sport, payload_len); + pkt_hdr_size = eth_hdr_size + IP_UDP_HDR_SIZE; - debug("sending ARP for %08x\n", dest); + if (need_arp) { + debug("sending ARP for %pI4\n", &dest); + /* save the ip and eth addr for the packet to send after arp */ NetArpWaitPacketIP = dest; NetArpWaitPacketMAC = ether; - pkt = NetArpWaitTxPacket; - pkt += NetSetEther(pkt, NetArpWaitPacketMAC, PROT_IP); - - net_set_udp_header(pkt, dest, dport, sport, payload_len); + /* + * Copy the packet data from the NetTxPacket into the + * NetArpWaitTxPacket to send after arp + */ memcpy(pkt + IP_UDP_HDR_SIZE, (uchar *)NetTxPacket + - (pkt - (uchar *)NetArpWaitTxPacket) + - IP_UDP_HDR_SIZE, payload_len); + pkt_hdr_size, payload_len); /* size of the waiting packet */ - NetArpWaitTxPacketSize = (pkt - NetArpWaitTxPacket) + - IP_UDP_HDR_SIZE + payload_len; + NetArpWaitTxPacketSize = pkt_hdr_size + payload_len; /* and do the ARP request */ NetArpWaitTry = 1; NetArpWaitTimerStart = get_timer(0); ArpRequest(); return 1; /* waiting */ + } else { + debug("sending UDP to %pI4/%pM\n", &dest, ether); + eth_send(NetTxPacket, pkt_hdr_size + payload_len); + return 0; /* transmitted */ } - - debug("sending UDP to %08x/%pM\n", dest, ether); - - pkt = (uchar *)NetTxPacket; - pkt += NetSetEther(pkt, ether, PROT_IP); - net_set_udp_header(pkt, dest, dport, sport, payload_len); - eth_send(NetTxPacket, (pkt - NetTxPacket) + IP_UDP_HDR_SIZE + - payload_len); - - return 0; /* transmitted */ } #ifdef CONFIG_IP_DEFRAG |