| 
				
			 | 
			
			
				
				@@ -180,13 +180,16 @@ static void arp_destroy ( struct arp_entry *arp, int rc ) { 
			 | 
		
		
	
		
			
			| 
				180
			 | 
			
				180
			 | 
			
			
				
				 	struct net_device *netdev = arp->netdev; 
			 | 
		
		
	
		
			
			| 
				181
			 | 
			
				181
			 | 
			
			
				
				 	struct net_protocol *net_protocol = arp->net_protocol; 
			 | 
		
		
	
		
			
			| 
				182
			 | 
			
				182
			 | 
			
			
				
				 	struct io_buffer *iobuf; 
			 | 
		
		
	
		
			
			| 
				183
			 | 
			
				
			 | 
			
			
				
				-	struct io_buffer *tmp; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				183
			 | 
			
			
				
				+ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				184
			 | 
			
			
				
				+	/* Take ownership from cache */ 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				185
			 | 
			
			
				
				+	list_del ( &arp->list ); 
			 | 
		
		
	
		
			
			| 
				184
			 | 
			
				186
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				185
			 | 
			
				187
			 | 
			
			
				
				 	/* Stop timer */ 
			 | 
		
		
	
		
			
			| 
				186
			 | 
			
				188
			 | 
			
			
				
				 	stop_timer ( &arp->timer ); 
			 | 
		
		
	
		
			
			| 
				187
			 | 
			
				189
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				188
			 | 
			
				190
			 | 
			
			
				
				 	/* Discard any outstanding I/O buffers */ 
			 | 
		
		
	
		
			
			| 
				189
			 | 
			
				
			 | 
			
			
				
				-	list_for_each_entry_safe ( iobuf, tmp, &arp->tx_queue, list ) { 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				191
			 | 
			
			
				
				+	while ( ( iobuf = list_first_entry ( &arp->tx_queue, struct io_buffer, 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				192
			 | 
			
			
				
				+					     list ) ) != NULL ) { 
			 | 
		
		
	
		
			
			| 
				190
			 | 
			
				193
			 | 
			
			
				
				 		DBGC2 ( arp, "ARP %p %s %s %s discarding deferred packet: " 
			 | 
		
		
	
		
			
			| 
				191
			 | 
			
				194
			 | 
			
			
				
				 			"%s\n", arp, netdev->name, net_protocol->name, 
			 | 
		
		
	
		
			
			| 
				192
			 | 
			
				195
			 | 
			
			
				
				 			net_protocol->ntoa ( arp->net_dest ), strerror ( rc ) ); 
			 | 
		
		
	
	
		
			
			| 
				
			 | 
			
			
				
				@@ -198,8 +201,7 @@ static void arp_destroy ( struct arp_entry *arp, int rc ) { 
			 | 
		
		
	
		
			
			| 
				198
			 | 
			
				201
			 | 
			
			
				
				 	       net_protocol->name, net_protocol->ntoa ( arp->net_dest ), 
			 | 
		
		
	
		
			
			| 
				199
			 | 
			
				202
			 | 
			
			
				
				 	       strerror ( rc ) ); 
			 | 
		
		
	
		
			
			| 
				200
			 | 
			
				203
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				201
			 | 
			
				
			 | 
			
			
				
				-	/* Remove from cache and drop reference */ 
			 | 
		
		
	
		
			
			| 
				202
			 | 
			
				
			 | 
			
			
				
				-	list_del ( &arp->list ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				204
			 | 
			
			
				
				+	/* Drop remaining reference */ 
			 | 
		
		
	
		
			
			| 
				203
			 | 
			
				205
			 | 
			
			
				
				 	ref_put ( &arp->refcnt ); 
			 | 
		
		
	
		
			
			| 
				204
			 | 
			
				206
			 | 
			
			
				
				 } 
			 | 
		
		
	
		
			
			| 
				205
			 | 
			
				207
			 | 
			
			
				
				  
			 | 
		
		
	
	
		
			
			| 
				
			 | 
			
			
				
				@@ -518,12 +520,13 @@ static unsigned int arp_discard ( void ) { 
			 | 
		
		
	
		
			
			| 
				518
			 | 
			
				520
			 | 
			
			
				
				 	struct arp_entry *arp; 
			 | 
		
		
	
		
			
			| 
				519
			 | 
			
				521
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				520
			 | 
			
				522
			 | 
			
			
				
				 	/* Drop oldest cache entry, if any */ 
			 | 
		
		
	
		
			
			| 
				521
			 | 
			
				
			 | 
			
			
				
				-	list_for_each_entry_reverse ( arp, &arp_entries, list ) { 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				523
			 | 
			
			
				
				+	arp = list_last_entry ( &arp_entries, struct arp_entry, list ); 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				524
			 | 
			
			
				
				+	if ( arp ) { 
			 | 
		
		
	
		
			
			| 
				522
			 | 
			
				525
			 | 
			
			
				
				 		arp_destroy ( arp, -ENOBUFS ); 
			 | 
		
		
	
		
			
			| 
				523
			 | 
			
				526
			 | 
			
			
				
				 		return 1; 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				527
			 | 
			
			
				
				+	} else { 
			 | 
		
		
	
		
			
			| 
				
			 | 
			
				528
			 | 
			
			
				
				+		return 0; 
			 | 
		
		
	
		
			
			| 
				524
			 | 
			
				529
			 | 
			
			
				
				 	} 
			 | 
		
		
	
		
			
			| 
				525
			 | 
			
				
			 | 
			
			
				
				- 
			 | 
		
		
	
		
			
			| 
				526
			 | 
			
				
			 | 
			
			
				
				-	return 0; 
			 | 
		
		
	
		
			
			| 
				527
			 | 
			
				530
			 | 
			
			
				
				 } 
			 | 
		
		
	
		
			
			| 
				528
			 | 
			
				531
			 | 
			
			
				
				  
			 | 
		
		
	
		
			
			| 
				529
			 | 
			
				532
			 | 
			
			
				
				 /** ARP cache discarder 
			 |