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:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user