From aa0770079557f4401daf7dc7e18a253d5b70c688 Mon Sep 17 00:00:00 2001 From: Hugo Santos Date: Tue, 17 Apr 2007 01:25:08 +0000 Subject: [PATCH] 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 --- .../network/protocols/tcp/TCPEndpoint.cpp | 32 ++++++++++--------- .../network/protocols/tcp/TCPEndpoint.h | 1 + 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp index 24a9135e26..f7c53b8176 100644 --- a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp +++ b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.cpp @@ -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 diff --git a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h index 54f8ad5a1b..9a40886a31 100644 --- a/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h +++ b/src/add-ons/kernel/network/protocols/tcp/TCPEndpoint.h @@ -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);