|
@@ -1155,6 +1155,7 @@ static int tcp_rx ( struct io_buffer *iobuf,
|
1155
|
1155
|
uint16_t csum;
|
1156
|
1156
|
uint32_t seq;
|
1157
|
1157
|
uint32_t ack;
|
|
1158
|
+ uint16_t raw_win;
|
1158
|
1159
|
uint32_t win;
|
1159
|
1160
|
unsigned int flags;
|
1160
|
1161
|
size_t len;
|
|
@@ -1195,7 +1196,7 @@ static int tcp_rx ( struct io_buffer *iobuf,
|
1195
|
1196
|
tcp = tcp_demux ( ntohs ( tcphdr->dest ) );
|
1196
|
1197
|
seq = ntohl ( tcphdr->seq );
|
1197
|
1198
|
ack = ntohl ( tcphdr->ack );
|
1198
|
|
- win = ( ntohs ( tcphdr->win ) << tcp->snd_win_scale );
|
|
1199
|
+ raw_win = ntohs ( tcphdr->win );
|
1199
|
1200
|
flags = tcphdr->flags;
|
1200
|
1201
|
tcp_rx_opts ( tcp, ( ( ( void * ) tcphdr ) + sizeof ( *tcphdr ) ),
|
1201
|
1202
|
( hlen - sizeof ( *tcphdr ) ), &options );
|
|
@@ -1226,6 +1227,7 @@ static int tcp_rx ( struct io_buffer *iobuf,
|
1226
|
1227
|
|
1227
|
1228
|
/* Handle ACK, if present */
|
1228
|
1229
|
if ( flags & TCP_ACK ) {
|
|
1230
|
+ win = ( raw_win << tcp->snd_win_scale );
|
1229
|
1231
|
if ( ( rc = tcp_rx_ack ( tcp, ack, win ) ) != 0 ) {
|
1230
|
1232
|
tcp_xmit_reset ( tcp, st_src, tcphdr );
|
1231
|
1233
|
goto discard;
|