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; fSendMaxSegmentSize = segment.max_segment_size;
else else
fReceiveMaxSegmentSize = TCP_DEFAULT_MAX_SEGMENT_SIZE; fReceiveMaxSegmentSize = TCP_DEFAULT_MAX_SEGMENT_SIZE;
if (segment.has_window_shift) { _CheckWindowScale(segment);
fFlags |= FLAG_OPTION_WINDOW_SCALE;
fSendWindowShift = segment.window_shift;
} else {
fFlags &= ~FLAG_OPTION_WINDOW_SCALE;
fReceiveWindowShift = 0;
}
} }
_UpdateTimestamps(segment, 0, false); _UpdateTimestamps(segment, 0, false);
@@ -859,13 +853,8 @@ TCPEndpoint::_SynchronizeSentReceive(tcp_segment_header &segment, net_buffer *bu
fSendMaxSegmentSize = segment.max_segment_size; fSendMaxSegmentSize = segment.max_segment_size;
else else
fReceiveMaxSegmentSize = TCP_DEFAULT_MAX_SEGMENT_SIZE; fReceiveMaxSegmentSize = TCP_DEFAULT_MAX_SEGMENT_SIZE;
if (segment.has_window_shift) {
fFlags |= FLAG_OPTION_WINDOW_SCALE; _CheckWindowScale(segment);
fSendWindowShift = segment.window_shift;
} else {
fFlags &= ~FLAG_OPTION_WINDOW_SCALE;
fReceiveWindowShift = 0;
}
if (segment.flags & TCP_FLAG_ACKNOWLEDGE) { if (segment.flags & TCP_FLAG_ACKNOWLEDGE) {
_MarkEstablished(); _MarkEstablished();
@@ -1394,8 +1383,8 @@ TCPEndpoint::_Receive(tcp_segment_header &segment, net_buffer *buffer)
if ((segment.flags & TCP_FLAG_ACKNOWLEDGE) != 0) { if ((segment.flags & TCP_FLAG_ACKNOWLEDGE) != 0) {
// process acknowledged data // process acknowledged data
if (fState == SYNCHRONIZE_RECEIVED) { if (fState == SYNCHRONIZE_RECEIVED) {
// TODO: window scaling!
_MarkEstablished(); _MarkEstablished();
_CheckWindowScale(segment);
} }
if (fSendMax < segment.acknowledge || fState == TIME_WAIT) 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 // #pragma mark - timer
@@ -102,6 +102,7 @@ class TCPEndpoint : public net_protocol {
void _MarkEstablished(); void _MarkEstablished();
status_t _WaitForEstablished(RecursiveLocker &lock, bigtime_t timeout); status_t _WaitForEstablished(RecursiveLocker &lock, bigtime_t timeout);
void _AddData(tcp_segment_header &segment, net_buffer *buffer); 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 _TimeWaitTimer(net_timer *timer, void *data);
static void _RetransmitTimer(net_timer *timer, void *data); static void _RetransmitTimer(net_timer *timer, void *data);