|  | @@ -900,6 +900,7 @@ static int tcp_rx ( struct io_buffer *iobuf,
 | 
		
	
		
			
			| 900 | 900 |  	uint32_t seq;
 | 
		
	
		
			
			| 901 | 901 |  	uint32_t ack;
 | 
		
	
		
			
			| 902 | 902 |  	uint32_t win;
 | 
		
	
		
			
			|  | 903 | +	uint32_t ts_recent;
 | 
		
	
		
			
			| 903 | 904 |  	unsigned int flags;
 | 
		
	
		
			
			| 904 | 905 |  	size_t len;
 | 
		
	
		
			
			| 905 | 906 |  	int rc;
 | 
		
	
	
		
			
			|  | @@ -941,6 +942,8 @@ static int tcp_rx ( struct io_buffer *iobuf,
 | 
		
	
		
			
			| 941 | 942 |  	flags = tcphdr->flags;
 | 
		
	
		
			
			| 942 | 943 |  	tcp_rx_opts ( tcp, ( ( ( void * ) tcphdr ) + sizeof ( *tcphdr ) ),
 | 
		
	
		
			
			| 943 | 944 |  		      ( hlen - sizeof ( *tcphdr ) ), &options );
 | 
		
	
		
			
			|  | 945 | +	ts_recent = ( options.tsopt ?
 | 
		
	
		
			
			|  | 946 | +		      ntohl ( options.tsopt->tsval ) : tcp->ts_recent );
 | 
		
	
		
			
			| 944 | 947 |  	iob_pull ( iobuf, hlen );
 | 
		
	
		
			
			| 945 | 948 |  	len = iob_len ( iobuf );
 | 
		
	
		
			
			| 946 | 949 |  
 | 
		
	
	
		
			
			|  | @@ -981,7 +984,7 @@ static int tcp_rx ( struct io_buffer *iobuf,
 | 
		
	
		
			
			| 981 | 984 |  	}
 | 
		
	
		
			
			| 982 | 985 |  
 | 
		
	
		
			
			| 983 | 986 |  	/* Handle new data, if any */
 | 
		
	
		
			
			| 984 |  | -	tcp_rx_data ( tcp, seq, iobuf );
 | 
		
	
		
			
			|  | 987 | +	tcp_rx_data ( tcp, seq, iob_disown ( iobuf ) );
 | 
		
	
		
			
			| 985 | 988 |  	seq += len;
 | 
		
	
		
			
			| 986 | 989 |  
 | 
		
	
		
			
			| 987 | 990 |  	/* Handle FIN, if present */
 | 
		
	
	
		
			
			|  | @@ -990,9 +993,9 @@ static int tcp_rx ( struct io_buffer *iobuf,
 | 
		
	
		
			
			| 990 | 993 |  		seq++;
 | 
		
	
		
			
			| 991 | 994 |  	}
 | 
		
	
		
			
			| 992 | 995 |  
 | 
		
	
		
			
			| 993 |  | -	/* Update timestamp, if present and applicable */
 | 
		
	
		
			
			| 994 |  | -	if ( ( seq == tcp->rcv_ack ) && options.tsopt )
 | 
		
	
		
			
			| 995 |  | -		tcp->ts_recent = ntohl ( options.tsopt->tsval );
 | 
		
	
		
			
			|  | 996 | +	/* Update timestamp, if applicable */
 | 
		
	
		
			
			|  | 997 | +	if ( seq == tcp->rcv_ack )
 | 
		
	
		
			
			|  | 998 | +		tcp->ts_recent = ts_recent;
 | 
		
	
		
			
			| 996 | 999 |  
 | 
		
	
		
			
			| 997 | 1000 |  	/* Dump out any state change as a result of the received packet */
 | 
		
	
		
			
			| 998 | 1001 |  	tcp_dump_state ( tcp );
 |