net: Don't copy every packet that waits for an ARP
authorJoe Hershberger <joe.hershberger@ni.com>
Wed, 23 May 2012 07:59:24 +0000 (07:59 +0000)
committerJoe Hershberger <joe.hershberger@ni.com>
Wed, 23 May 2012 22:53:07 +0000 (17:53 -0500)
Use the NetArpTxPacket for the ARP packet, not to hold what used to
be in NetTxPacket.
This saves a copy and makes the code easier to understand.

Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Acked-by: Simon Glass <sjg@chromium.org>
include/net.h
net/arp.c
net/arp.h
net/net.c
net/ping.c

index ec413664f7d9e61280aec5e36006b4fcb2c52754..52b9a29b18121762a78051255acf198f1d8eec32 100644 (file)
@@ -483,14 +483,14 @@ static inline void net_set_state(enum net_loop_state state)
        net_state = state;
 }
 
-/* Transmit "NetTxPacket" */
+/* Transmit a packet */
 static inline void NetSendPacket(uchar *pkt, int len)
 {
        (void) eth_send(pkt, len);
 }
 
 /*
- * Transmit UDP packet, performing ARP request if needed
+ * Transmit "NetTxPacket" as UDP packet, performing ARP request if needed
  *  (ether will be populated)
  *
  * @param ether Raw packet buffer
@@ -499,7 +499,7 @@ static inline void NetSendPacket(uchar *pkt, int len)
  * @param sport Source UDP port
  * @param payload_len Length of data after the UDP header
  */
-extern int     NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport,
+extern int NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport,
                        int sport, int payload_len);
 
 /* Processes a received packet */
index b2993eca5c56425f3f55b237e5b2e443cbe22323..4a73a0fb35f63b9825a9b00f3c90a371703ac384 100644 (file)
--- a/net/arp.c
+++ b/net/arp.c
@@ -30,22 +30,22 @@ IPaddr_t    NetArpWaitPacketIP;
 IPaddr_t       NetArpWaitReplyIP;
 /* MAC address of waiting packet's destination */
 uchar         *NetArpWaitPacketMAC;
-/* THE transmit packet */
-uchar         *NetArpWaitTxPacket;
 int            NetArpWaitTxPacketSize;
-uchar          NetArpWaitPacketBuf[PKTSIZE_ALIGN + PKTALIGN];
 ulong          NetArpWaitTimerStart;
 int            NetArpWaitTry;
 
+uchar         *NetArpTxPacket; /* THE ARP transmit packet */
+uchar          NetArpPacketBuf[PKTSIZE_ALIGN + PKTALIGN];
+
 void ArpInit(void)
 {
        /* XXX problem with bss workaround */
        NetArpWaitPacketMAC = NULL;
        NetArpWaitPacketIP = 0;
        NetArpWaitReplyIP = 0;
-       NetArpWaitTxPacket = &NetArpWaitPacketBuf[0] + (PKTALIGN - 1);
-       NetArpWaitTxPacket -= (ulong)NetArpWaitTxPacket % PKTALIGN;
        NetArpWaitTxPacketSize = 0;
+       NetArpTxPacket = &NetArpPacketBuf[0] + (PKTALIGN - 1);
+       NetArpTxPacket -= (ulong)NetArpTxPacket % PKTALIGN;
 }
 
 void ArpRequest(void)
@@ -56,7 +56,7 @@ void ArpRequest(void)
 
        debug("ARP broadcast %d\n", NetArpWaitTry);
 
-       pkt = NetTxPacket;
+       pkt = NetArpTxPacket;
 
        eth_hdr_size = NetSetEther(pkt, NetBcastAddr, PROT_ARP);
        pkt += eth_hdr_size;
@@ -88,7 +88,7 @@ void ArpRequest(void)
        }
 
        NetWriteIP(&arp->ar_tpa, NetArpWaitReplyIP);
-       NetSendPacket(NetTxPacket, eth_hdr_size + ARP_HDR_SIZE);
+       NetSendPacket(NetArpTxPacket, eth_hdr_size + ARP_HDR_SIZE);
 }
 
 void ArpTimeoutCheck(void)
@@ -196,11 +196,11 @@ void ArpReceive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len)
                        net_get_arp_handler()((uchar *)arp, 0, reply_ip_addr,
                                0, len);
 
-                       /* modify header, and transmit it */
-                       memcpy(((struct ethernet_hdr *)NetArpWaitTxPacket)->
-                               et_dest, &arp->ar_sha, ARP_HLEN);
-                       NetSendPacket(NetArpWaitTxPacket,
-                                       NetArpWaitTxPacketSize);
+                       /* set the mac address in the waiting packet's header
+                          and transmit it */
+                       memcpy(((struct ethernet_hdr *)NetTxPacket)->et_dest,
+                               &arp->ar_sha, ARP_HLEN);
+                       NetSendPacket(NetTxPacket, NetArpWaitTxPacketSize);
 
                        /* no arp request pending now */
                        NetArpWaitPacketIP = 0;
index b7a1ac97d43306ea1aee52889afe1548cf37d717..956fc5e570f1800dba6bde2d2c29fdc2e37456b5 100644 (file)
--- a/net/arp.h
+++ b/net/arp.h
@@ -16,8 +16,6 @@
 extern IPaddr_t        NetArpWaitPacketIP;
 /* MAC address of waiting packet's destination */
 extern uchar *NetArpWaitPacketMAC;
-/* THE transmit packet */
-extern uchar *NetArpWaitTxPacket;
 extern int NetArpWaitTxPacketSize;
 extern ulong NetArpWaitTimerStart;
 extern int NetArpWaitTry;
index 4b4c0f1e5f4279e641ec006bf454855e759377f1..aa1ff488926f829f8ced0ed174ebe5f9ae070b12 100644 (file)
--- a/net/net.c
+++ b/net/net.c
@@ -442,6 +442,9 @@ restart:
                 *      Abort if ctrl-c was pressed.
                 */
                if (ctrlc()) {
+                       /* cancel any ARP that may not have completed */
+                       NetArpWaitPacketIP = 0;
+
                        net_cleanup_loop();
                        eth_halt();
                        puts("\nAbort\n");
@@ -632,7 +635,6 @@ 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;
 
@@ -649,35 +651,21 @@ int NetSendUDPPacket(uchar *ether, IPaddr_t dest, int dport, int sport,
        if (dest == 0xFFFFFFFF)
                ether = NetBcastAddr;
 
-       /*
-        * if MAC address was not discovered yet, save the packet and do
-        * an ARP request
-        */
-       if (memcmp(ether, NetEtherNullAddr, 6) == 0) {
-               need_arp = 1;
-               pkt = NetArpWaitTxPacket;
-       } else
-               pkt = (uchar *)NetTxPacket;
+       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;
 
-       if (need_arp) {
+       /* if MAC address was not discovered yet, do an ARP request */
+       if (memcmp(ether, NetEtherNullAddr, 6) == 0) {
                debug("sending ARP for %pI4\n", &dest);
 
                /* save the ip and eth addr for the packet to send after arp */
                NetArpWaitPacketIP = dest;
                NetArpWaitPacketMAC = ether;
 
-               /*
-                * Copy the packet data from the NetTxPacket into the
-                *   NetArpWaitTxPacket to send after arp
-                */
-               memcpy(pkt + IP_UDP_HDR_SIZE, (uchar *)NetTxPacket +
-                       pkt_hdr_size, payload_len);
-
                /* size of the waiting packet */
                NetArpWaitTxPacketSize = pkt_hdr_size + payload_len;
 
index 068aa96a74f27aa1e5f76ed2ac8863b4c5557bb7..2ba9f76e5a5b032ee7d194c4c941843d84c1b40d 100644 (file)
@@ -49,9 +49,8 @@ static int ping_send(void)
 
        NetArpWaitPacketIP = NetPingIP;
 
-       eth_hdr_size = NetSetEther(NetArpWaitTxPacket, NetEtherNullAddr,
-               PROT_IP);
-       pkt = NetArpWaitTxPacket + eth_hdr_size;
+       eth_hdr_size = NetSetEther(NetTxPacket, NetEtherNullAddr, PROT_IP);
+       pkt = (uchar *)NetTxPacket + eth_hdr_size;
 
        set_icmp_header(pkt, NetPingIP);