|  | @@ -390,6 +390,7 @@ static void ncm_in_complete ( struct usb_endpoint *ep, struct io_buffer *iobuf,
 | 
		
	
		
			
			| 390 | 390 |  	size_t ndp_len;
 | 
		
	
		
			
			| 391 | 391 |  	size_t pkt_offset;
 | 
		
	
		
			
			| 392 | 392 |  	size_t pkt_len;
 | 
		
	
		
			
			|  | 393 | +	size_t headroom;
 | 
		
	
		
			
			| 393 | 394 |  	size_t len;
 | 
		
	
		
			
			| 394 | 395 |  
 | 
		
	
		
			
			| 395 | 396 |  	/* Profile overall bulk IN completion */
 | 
		
	
	
		
			
			|  | @@ -460,13 +461,22 @@ static void ncm_in_complete ( struct usb_endpoint *ep, struct io_buffer *iobuf,
 | 
		
	
		
			
			| 460 | 461 |  		 * while the device is running.  We therefore copy the
 | 
		
	
		
			
			| 461 | 462 |  		 * data to a new I/O buffer even if this is the only
 | 
		
	
		
			
			| 462 | 463 |  		 * (or last) packet within the buffer.
 | 
		
	
		
			
			|  | 464 | +		 *
 | 
		
	
		
			
			|  | 465 | +		 * We reserve enough space at the start of each buffer
 | 
		
	
		
			
			|  | 466 | +		 * to allow for our own transmission header, to
 | 
		
	
		
			
			|  | 467 | +		 * support protocols such as ARP which may modify the
 | 
		
	
		
			
			|  | 468 | +		 * received packet and reuse the same I/O buffer for
 | 
		
	
		
			
			|  | 469 | +		 * transmission.
 | 
		
	
		
			
			| 463 | 470 |  		 */
 | 
		
	
		
			
			| 464 |  | -		pkt = alloc_iob ( pkt_len );
 | 
		
	
		
			
			|  | 471 | +		headroom = ( sizeof ( struct ncm_ntb_header ) +
 | 
		
	
		
			
			|  | 472 | +			     ncm->out.padding );
 | 
		
	
		
			
			|  | 473 | +		pkt = alloc_iob ( headroom + pkt_len );
 | 
		
	
		
			
			| 465 | 474 |  		if ( ! pkt ) {
 | 
		
	
		
			
			| 466 | 475 |  			/* Record error and continue */
 | 
		
	
		
			
			| 467 | 476 |  			netdev_rx_err ( netdev, NULL, -ENOMEM );
 | 
		
	
		
			
			| 468 | 477 |  			continue;
 | 
		
	
		
			
			| 469 | 478 |  		}
 | 
		
	
		
			
			|  | 479 | +		iob_reserve ( pkt, headroom );
 | 
		
	
		
			
			| 470 | 480 |  		memcpy ( iob_put ( pkt, pkt_len ),
 | 
		
	
		
			
			| 471 | 481 |  			 ( iobuf->data + pkt_offset ), pkt_len );
 | 
		
	
		
			
			| 472 | 482 |  
 |