From a0d0de8ef2db880e38bf9932cea3675457c5574f Mon Sep 17 00:00:00 2001 From: victor Date: Thu, 26 Nov 2009 10:33:20 +0000 Subject: [PATCH] bugs by Sasha the.zett git-svn-id: https://ttuki.vtt.fi/svn/p2p-next/TUD/p2tp/trunk@637 e16421f0-f15b-0410-abcd-98678b794739 --- datagram.cpp | 8 ++++---- sendrecv.cpp | 16 ++++++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/datagram.cpp b/datagram.cpp index f9bf857..76ec217 100644 --- a/datagram.cpp +++ b/datagram.cpp @@ -90,12 +90,12 @@ int Datagram::Send () { (struct sockaddr*)&(addr.addr),sizeof(struct sockaddr_in)); if (r<0) perror("can't send"); - //offset=0; - //length=0; dgrams_up++; bytes_up+=size(); - Time(); - return r; + offset=0; + length=0; + Time(); + return r; } int Datagram::Recv () { diff --git a/sendrecv.cpp b/sendrecv.cpp index 6ac587a..393a564 100644 --- a/sendrecv.cpp +++ b/sendrecv.cpp @@ -33,7 +33,7 @@ void Channel::AddPeakHashes (Datagram& dgram) { void Channel::AddUncleHashes (Datagram& dgram, bin64_t pos) { bin64_t peak = file().peak_for(pos); - while (pos!=peak && ((NOW&7)==7 || !data_out_cap_.within(pos.parent())) && + while (pos!=peak && ((NOW&3)==3 || !data_out_cap_.within(pos.parent())) && ack_in_.get(pos.parent())==bins::EMPTY) { bin64_t uncle = pos.sibling(); dgram.Push8(P2TP_HASH); @@ -52,8 +52,8 @@ bin64_t Channel::DequeueHint () { // TODO: resilience bin64_t hint = hint_in_.front().bin; tint time = hint_in_.front().time; hint_in_.pop_front(); - if (time < NOW-TINT_SEC*3/2 ) //NOW-8*rtt_avg_) - continue; + //if (time < NOW-TINT_SEC*3/2 ) //NOW-8*rtt_avg_) + // continue; // Totally flawed: // a. May empty the queue when you least expect // b. May lose parts of partially ACKd HINTs @@ -170,7 +170,13 @@ bin64_t Channel::AddData (Datagram& dgram) { if (ack_in_.is_empty() && file().size()) AddPeakHashes(dgram); AddUncleHashes(dgram,tosend); - data_out_cap_ = tosend; + if (!ack_in_.is_empty()) // TODO: cwnd_>1 + data_out_cap_ = tosend; + } + + if (dgram.size()>254) { + dgram.Send(); // kind of fragmentation + dgram.Push32(peer_channel_id_); } dgram.Push8(P2TP_DATA); @@ -363,6 +369,8 @@ void Channel::CleanDataOut (bin64_t ackd_pos) { } data_out_.pop_front(); } + while (!data_out_.empty() && data_out_.front().bin==bin64_t::NONE) + data_out_.pop_front(); } -- 2.20.1