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 | olio-uboot-2014.01-9214637a56abd27863824bd53e602b7721b3cda6.tar.xz olio-uboot-2014.01-9214637a56abd27863824bd53e602b7721b3cda6.zip | |
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 |