diff options
| author | Joe Hershberger <joe.hershberger@ni.com> | 2012-05-23 07:59:24 +0000 | 
|---|---|---|
| committer | Joe Hershberger <joe.hershberger@ni.com> | 2012-05-23 17:53:07 -0500 | 
| commit | e94070c443bdc9c0231abeca920d9f9362701aec (patch) | |
| tree | 070a846a4e5ec79753f6267ada3ac09c31ed1320 | |
| parent | d7310c7e63ca9ffd42527dc9735cb505cbe908b7 (diff) | |
| download | olio-uboot-2014.01-e94070c443bdc9c0231abeca920d9f9362701aec.tar.xz olio-uboot-2014.01-e94070c443bdc9c0231abeca920d9f9362701aec.zip | |
net: Don't copy every packet that waits for an ARP
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>
| -rw-r--r-- | include/net.h | 6 | ||||
| -rw-r--r-- | net/arp.c | 24 | ||||
| -rw-r--r-- | net/arp.h | 2 | ||||
| -rw-r--r-- | net/net.c | 24 | ||||
| -rw-r--r-- | net/ping.c | 5 | 
5 files changed, 23 insertions, 38 deletions
| diff --git a/include/net.h b/include/net.h index ec413664f..52b9a29b1 100644 --- a/include/net.h +++ b/include/net.h @@ -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 */ @@ -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; @@ -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; @@ -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; diff --git a/net/ping.c b/net/ping.c index 068aa96a7..2ba9f76e5 100644 --- a/net/ping.c +++ b/net/ping.c @@ -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); |