update Window Scaling variables when a simultaneous open is ACKed.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@20730 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Hugo Santos
2007-04-17 01:25:08 +00:00
parent 58bef2f444
commit aa07700795
2 changed files with 18 additions and 15 deletions
@@ -802,13 +802,7 @@ TCPEndpoint::Spawn(TCPEndpoint *parent, tcp_segment_header &segment,
fSendMaxSegmentSize = segment.max_segment_size;
else
fReceiveMaxSegmentSize = TCP_DEFAULT_MAX_SEGMENT_SIZE;
if (segment.has_window_shift) {
fFlags |= FLAG_OPTION_WINDOW_SCALE;
fSendWindowShift = segment.window_shift;
} else {
fFlags &= ~FLAG_OPTION_WINDOW_SCALE;
fReceiveWindowShift = 0;
}
_CheckWindowScale(segment);
}
_UpdateTimestamps(segment, 0, false);
@@ -859,13 +853,8 @@ TCPEndpoint::_SynchronizeSentReceive(tcp_segment_header &segment, net_buffer *bu
fSendMaxSegmentSize = segment.max_segment_size;
else
fReceiveMaxSegmentSize = TCP_DEFAULT_MAX_SEGMENT_SIZE;
if (segment.has_window_shift) {
fFlags |= FLAG_OPTION_WINDOW_SCALE;
fSendWindowShift = segment.window_shift;
} else {
fFlags &= ~FLAG_OPTION_WINDOW_SCALE;
fReceiveWindowShift = 0;
}
_CheckWindowScale(segment);
if (segment.flags & TCP_FLAG_ACKNOWLEDGE) {
_MarkEstablished();
@@ -1394,8 +1383,8 @@ TCPEndpoint::_Receive(tcp_segment_header &segment, net_buffer *buffer)
if ((segment.flags & TCP_FLAG_ACKNOWLEDGE) != 0) {
// process acknowledged data
if (fState == SYNCHRONIZE_RECEIVED) {
// TODO: window scaling!
_MarkEstablished();
_CheckWindowScale(segment);
}
if (fSendMax < segment.acknowledge || fState == TIME_WAIT)
@@ -1589,6 +1578,19 @@ TCPEndpoint::_AddData(tcp_segment_header &segment, net_buffer *buffer)
}
void
TCPEndpoint::_CheckWindowScale(tcp_segment_header &segment)
{
if (segment.has_window_shift) {
fFlags |= FLAG_OPTION_WINDOW_SCALE;
fSendWindowShift = segment.window_shift;
} else {
fFlags &= ~FLAG_OPTION_WINDOW_SCALE;
fReceiveWindowShift = 0;
}
}
// #pragma mark - timer
@@ -102,6 +102,7 @@ class TCPEndpoint : public net_protocol {
void _MarkEstablished();
status_t _WaitForEstablished(RecursiveLocker &lock, bigtime_t timeout);
void _AddData(tcp_segment_header &segment, net_buffer *buffer);
void _CheckWindowScale(tcp_segment_header &segment);
static void _TimeWaitTimer(net_timer *timer, void *data);
static void _RetransmitTimer(net_timer *timer, void *data);