summaryrefslogtreecommitdiff
path: root/net/net.c
diff options
context:
space:
mode:
authorJoe Hershberger <joe.hershberger@ni.com>2012-05-23 07:59:08 +0000
committerJoe Hershberger <joe.hershberger@ni.com>2012-05-23 17:46:18 -0500
commit9214637a56abd27863824bd53e602b7721b3cda6 (patch)
tree654d349c226ad6a50584be398cf5ab7216e446a7 /net/net.c
parent4b11c9166b86ccc5f8f02fda01ded0f9e9760df0 (diff)
downloadu-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.c44
1 files changed, 25 insertions, 19 deletions
diff --git a/net/net.c b/net/net.c
index 1c7bf608db..b29d372b89 100644
--- a/net/net.c
+++ b/net/net.c
@@ -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