diff options
Diffstat (limited to 'net/arp.c')
| -rw-r--r-- | net/arp.c | 20 | 
1 files changed, 13 insertions, 7 deletions
| diff --git a/net/arp.c b/net/arp.c index b8a71684cd7..b49c3d3ced9 100644 --- a/net/arp.c +++ b/net/arp.c @@ -34,8 +34,7 @@ uchar	       *arp_wait_packet_ethaddr;  int		arp_wait_tx_packet_size;  ulong		arp_wait_timer_start;  int		arp_wait_try; - -static uchar   *arp_tx_packet;	/* THE ARP transmit packet */ +uchar	       *arp_tx_packet; /* THE ARP transmit packet */  static uchar	arp_tx_packet_buf[PKTSIZE_ALIGN + PKTALIGN];  void arp_init(void) @@ -100,7 +99,7 @@ int arp_timeout_check(void)  {  	ulong t; -	if (!net_arp_wait_packet_ip.s_addr) +	if (!arp_is_waiting())  		return 0;  	t = get_timer(0); @@ -126,6 +125,7 @@ void arp_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len)  	struct arp_hdr *arp;  	struct in_addr reply_ip_addr;  	int eth_hdr_size; +	uchar *tx_packet;  	/*  	 * We have to deal with two types of ARP packets: @@ -182,13 +182,14 @@ void arp_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len)  		    (net_read_ip(&arp->ar_spa).s_addr & net_netmask.s_addr))  			udelay(5000);  #endif -		memcpy(net_tx_packet, et, eth_hdr_size + ARP_HDR_SIZE); -		net_send_packet(net_tx_packet, eth_hdr_size + ARP_HDR_SIZE); +		tx_packet = net_get_async_tx_pkt_buf(); +		memcpy(tx_packet, et, eth_hdr_size + ARP_HDR_SIZE); +		net_send_packet(tx_packet, eth_hdr_size + ARP_HDR_SIZE);  		return;  	case ARPOP_REPLY:		/* arp reply */ -		/* are we waiting for a reply */ -		if (!net_arp_wait_packet_ip.s_addr) +		/* are we waiting for a reply? */ +		if (!arp_is_waiting())  			break;  #ifdef CONFIG_KEEP_SERVERADDR @@ -233,3 +234,8 @@ void arp_receive(struct ethernet_hdr *et, struct ip_udp_hdr *ip, int len)  		return;  	}  } + +bool arp_is_waiting(void) +{ +	return !!net_arp_wait_packet_ip.s_addr; +} | 
