net: Refactor NetSendUDPPacket to share more code
authorJoe Hershberger <joe.hershberger@ni.com>
Wed, 23 May 2012 07:59:08 +0000 (07:59 +0000)
committerJoe Hershberger <joe.hershberger@ni.com>
Wed, 23 May 2012 22:46:18 +0000 (17:46 -0500)
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>
net/net.c

index 1c7bf608db981389db772eb9fb935dc47296b2eb..b29d372b89ad3d1532205cd58396fc5ebb5d018e 100644 (file)
--- 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