fast_fix
authorvictor <victor@e16421f0-f15b-0410-abcd-98678b794739>
Sun, 15 Nov 2009 08:01:20 +0000 (08:01 +0000)
committervictor <victor@e16421f0-f15b-0410-abcd-98678b794739>
Sun, 15 Nov 2009 08:01:20 +0000 (08:01 +0000)
git-svn-id: https://ttuki.vtt.fi/svn/p2p-next/TUD/p2tp/trunk@558 e16421f0-f15b-0410-abcd-98678b794739

p2tp.cpp
p2tp.h
sendrecv.cpp

index 2db3de2..491e04c 100644 (file)
--- a/p2tp.cpp
+++ b/p2tp.cpp
@@ -42,7 +42,8 @@ Channel::Channel      (FileTransfer* transfer, int socket, Address peer_addr) :
     socket_(socket==-1?sockets[0]:socket), // FIXME
     data_out_cap_(bin64_t::ALL), last_send_data_time_(0), last_recv_data_time_(0),
     own_id_mentioned_(false), next_send_time_(0), last_send_time_(0),
-    last_recv_time_(0), rtt_avg_(TINT_SEC), dev_avg_(0), dip_avg_(TINT_SEC)
+    last_recv_time_(0), rtt_avg_(TINT_SEC), dev_avg_(0), dip_avg_(TINT_SEC),
+    data_in_dbl_(bin64_t::NONE)
 {
     if (peer_==Address())
         peer_ = tracker;
diff --git a/p2tp.h b/p2tp.h
index 4681a56..5a1a715 100644 (file)
--- a/p2tp.h
+++ b/p2tp.h
@@ -272,6 +272,7 @@ namespace p2tp {
                bins            ack_in_;
                /**     Last data received; needs to be acked immediately. */
                tintbin         data_in_;
+        bin64_t     data_in_dbl_;
         /** The history of data sent and still unacknowledged. */
         tbqueue     data_out_;
         bin64_t     data_out_cap_;
index 5bd424c..c38634f 100644 (file)
@@ -61,13 +61,16 @@ bin64_t             Channel::DequeueHint () { // TODO: resilience
             continue;
         send = file().ack_out().find_filtered(ack_in_,hint,bins::FILLED);
         send = send.left_foot(); // single packet
-        dprintf("%s #%i dequeued %lli\n",tintstr(),id,send.base_offset());
         if (send!=bin64_t::NONE)
             while (send!=hint) {
                 hint = hint.towards(send);
                 hint_in_.push_front(hint.sibling());
             }
     }
+    uint64_t mass = 0;
+    for(int i=0; i<hint_in_.size(), i++)
+        mass += hint_in_[i].width();
+    dprintf("%s #%i dequeued %lli [%lli]\n",tintstr(),id,send.base_offset(),mass);
     return send;
 }
 
@@ -163,7 +166,7 @@ void        Channel::AddHint (Datagram& dgram) {
         if (hint!=bin64_t::NONE) {
             dgram.Push8(P2TP_HINT);
             dgram.Push32(hint);
-            dprintf("%s #%i +hint %s\n",tintstr(),id,hint.str());
+            dprintf("%s #%i +hint %s [%lli]\n",tintstr(),id,hint.str(),hint_out_mass);
             hint_out_.push_back(hint);
         } else
             printf("%s #%i Xhint\n",tintstr(),id);
@@ -221,11 +224,16 @@ bin64_t           Channel::AddData (Datagram& dgram) {
 void   Channel::AddTs (Datagram& dgram) {
     dgram.Push8(P2TP_TS);
     dgram.Push64(data_in_.time);
-    dprintf("%s #%i +ts %lli\n",tintstr(),id,data_in_.time);
+    dprintf("%s #%i +ts %s\n",tintstr(),id,tintstr(data_in_.time));
 }
 
 
 void   Channel::AddAck (Datagram& dgram) {
+    if (data_in_dbl_!=bin64_t::NONE) {
+               dgram.Push8(P2TP_ACK);
+               dgram.Push32(data_in_dbl_);
+        data_in_dbl_=bin64_t::NONE;
+    }
        if (data_in_.bin!=bin64_t::NONE) {
         AddTs(dgram);
         bin64_t pos = file().ack_out().cover(data_in_.bin);
@@ -235,6 +243,8 @@ void        Channel::AddAck (Datagram& dgram) {
         ack_out_.set(pos);
         dprintf("%s #%i +ack %s %s\n",tintstr(),id,pos.str(),tintstr(data_in_.time));
         data_in_ = tintbin(0,bin64_t::NONE);
+        if (pos.layer()>2)
+            data_in_dbl_ = pos;
        }
     for(int count=0; count<4; count++) {
         bin64_t ack = file().ack_out().find_filtered(ack_out_, bin64_t::ALL, bins::FILLED);
@@ -314,7 +324,7 @@ bin64_t Channel::OnData (Datagram& dgram) {
     uint8_t *data;
     int length = dgram.Pull(&data,1024);
     bool ok = (pos==bin64_t::NONE) || file().OfferData(pos, (char*)data, length) ;
-    dprintf("%s #%i %cdata (%lli)\n",tintstr(),id,ok?'-':'!',pos.offset());
+    dprintf("%s #%i %cdata %s\n",tintstr(),id,ok?'-':'!',pos.str());
     if (!ok) 
         return bin64_t::NONE;
     data_in_ = tintbin(NOW,pos);