* The check to remove bytes at the beginning happened twice.

* There was an off-by-one error that could well be responsible for bug
  #2594. Haven't tested it yet, though.
* Added an extra assert to make sure that "next" is set correctly.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28937 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2009-01-18 16:58:04 +00:00
parent b100149cb4
commit 0c1404badd
@@ -90,8 +90,7 @@ BufferQueue::Add(net_buffer *buffer, tcp_sequence sequence)
return;
}
if (sequence < fFirstSequence) {
// Remove the stuff we already have
// this buffer contains data that is already long gone - trim it
gBufferModule->remove_header(buffer, fFirstSequence - sequence);
sequence = fFirstSequence;
}
@@ -121,12 +120,6 @@ BufferQueue::Add(net_buffer *buffer, tcp_sequence sequence)
if (fLastSequence < sequence + buffer->size)
fLastSequence = sequence + buffer->size;
if (fFirstSequence > sequence) {
// this buffer contains data that is already long gone - trim it
gBufferModule->remove_header(buffer, fFirstSequence - sequence);
sequence = fFirstSequence;
}
// find the place where to insert the buffer into the queue
SegmentList::ReverseIterator iterator = fList.GetReverseIterator();
@@ -156,7 +149,7 @@ BufferQueue::Add(net_buffer *buffer, tcp_sequence sequence)
gBufferModule->free(previous);
}
} else if (tcp_sequence(previous->sequence + previous->size)
> sequence + buffer->size) {
>= sequence + buffer->size) {
// We already know this data
gBufferModule->free(buffer);
buffer = NULL;
@@ -169,6 +162,9 @@ BufferQueue::Add(net_buffer *buffer, tcp_sequence sequence)
}
}
// "next" always starts after the buffer sequence
ASSERT(next == NULL || buffer == NULL || next->sequence > sequence);
while (buffer != NULL && next != NULL
&& tcp_sequence(sequence + buffer->size) > next->sequence) {
// we already have at least part of this data