|
@@ -1060,6 +1060,7 @@ static int tcp_rx ( struct io_buffer *iobuf,
|
1060
|
1060
|
struct tcp_options options;
|
1061
|
1061
|
size_t hlen;
|
1062
|
1062
|
uint16_t csum;
|
|
1063
|
+ uint32_t start_seq;
|
1063
|
1064
|
uint32_t seq;
|
1064
|
1065
|
uint32_t ack;
|
1065
|
1066
|
uint32_t win;
|
|
@@ -1099,7 +1100,7 @@ static int tcp_rx ( struct io_buffer *iobuf,
|
1099
|
1100
|
|
1100
|
1101
|
/* Parse parameters from header and strip header */
|
1101
|
1102
|
tcp = tcp_demux ( ntohs ( tcphdr->dest ) );
|
1102
|
|
- seq = ntohl ( tcphdr->seq );
|
|
1103
|
+ seq = start_seq = ntohl ( tcphdr->seq );
|
1103
|
1104
|
ack = ntohl ( tcphdr->ack );
|
1104
|
1105
|
win = ntohs ( tcphdr->win );
|
1105
|
1106
|
flags = tcphdr->flags;
|
|
@@ -1125,10 +1126,6 @@ static int tcp_rx ( struct io_buffer *iobuf,
|
1125
|
1126
|
goto discard;
|
1126
|
1127
|
}
|
1127
|
1128
|
|
1128
|
|
- /* Update timestamp, if applicable */
|
1129
|
|
- if ( options.tsopt && tcp_in_window ( tcp->rcv_ack, seq, seq_len ) )
|
1130
|
|
- tcp->ts_recent = ntohl ( options.tsopt->tsval );
|
1131
|
|
-
|
1132
|
1129
|
/* Handle ACK, if present */
|
1133
|
1130
|
if ( flags & TCP_ACK ) {
|
1134
|
1131
|
if ( ( rc = tcp_rx_ack ( tcp, ack, win ) ) != 0 ) {
|
|
@@ -1155,6 +1152,12 @@ static int tcp_rx ( struct io_buffer *iobuf,
|
1155
|
1152
|
goto discard;
|
1156
|
1153
|
}
|
1157
|
1154
|
|
|
1155
|
+ /* Update timestamp, if applicable */
|
|
1156
|
+ if ( options.tsopt &&
|
|
1157
|
+ tcp_in_window ( tcp->rcv_ack, start_seq, seq_len ) ) {
|
|
1158
|
+ tcp->ts_recent = ntohl ( options.tsopt->tsval );
|
|
1159
|
+ }
|
|
1160
|
+
|
1158
|
1161
|
/* Enqueue received data */
|
1159
|
1162
|
tcp_rx_enqueue ( tcp, seq, flags, iob_disown ( iobuf ) );
|
1160
|
1163
|
|