From dc5357554009c2a43669f7e9050cdf0e3d4c4d0f Mon Sep 17 00:00:00 2001 From: v2ray Date: Fri, 1 Jul 2016 12:12:32 +0200 Subject: [PATCH] bug fixes in sending window --- transport/internet/kcp/sending.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/transport/internet/kcp/sending.go b/transport/internet/kcp/sending.go index 281f2d715..2a761ef73 100644 --- a/transport/internet/kcp/sending.go +++ b/transport/internet/kcp/sending.go @@ -22,6 +22,7 @@ func NewSendingWindow(kcp *KCP, size uint32) *SendingWindow { data: make([]*DataSegment, size), prev: make([]uint32, size), next: make([]uint32, size), + kcp: kcp, } return window } @@ -46,16 +47,17 @@ func (this *SendingWindow) First() *DataSegment { } func (this *SendingWindow) Clear(una uint32) { - for this.Len() > 0 { - if this.data[this.start].Number < una { - this.Remove(0) - } + for this.Len() > 0 && this.data[this.start].Number < una { + this.Remove(0) } } func (this *SendingWindow) Remove(idx uint32) { pos := (this.start + idx) % this.cap seg := this.data[pos] + if seg == nil { + return + } seg.Release() this.data[pos] = nil if pos == this.start { @@ -77,6 +79,7 @@ func (this *SendingWindow) Remove(idx uint32) { } func (this *SendingWindow) HandleFastAck(number uint32) { + for i := this.start; ; i = this.next[i] { seg := this.data[i] if _itimediff(number, seg.Number) < 0 { @@ -92,6 +95,10 @@ func (this *SendingWindow) HandleFastAck(number uint32) { } func (this *SendingWindow) Flush() bool { + if this.Len() == 0 { + return false + } + current := this.kcp.current resent := uint32(this.kcp.fastresend) if this.kcp.fastresend <= 0 {