From: victor Date: Sat, 7 Nov 2009 12:31:50 +0000 (+0000) Subject: totally twisted X-Git-Url: http://p2p-next.cs.pub.ro/gitweb/?a=commitdiff_plain;h=9e10683827addcd0776eec859a504c1b18794b8f;p=swift-upb.git totally twisted git-svn-id: https://ttuki.vtt.fi/svn/p2p-next/TUD/p2tp/trunk@509 e16421f0-f15b-0410-abcd-98678b794739 --- diff --git a/bin64.h b/bin64.h index 8ca1d6f..ecc0b9b 100644 --- a/bin64.h +++ b/bin64.h @@ -106,6 +106,10 @@ struct bin64_t { else return right(); } + + bin64_t twisted (uint64_t mask) const { + return bin64_t( v ^ ((mask<<1)&~tail_bits()) ); + } bin64_t parent () const { uint64_t tbs = tail_bits(), ntbs = (tbs+1)|tbs; diff --git a/ext/seq_picker.cpp b/ext/seq_picker.cpp index 4070b55..c9b4da2 100644 --- a/ext/seq_picker.cpp +++ b/ext/seq_picker.cpp @@ -15,17 +15,33 @@ class SeqPiecePicker : public PiecePicker { bins ack_hint_out_; FileTransfer* file_; + uint64_t twist_; public: - SeqPiecePicker (FileTransfer* file_to_pick_from) : file_(file_to_pick_from), ack_hint_out_() { + SeqPiecePicker (FileTransfer* file_to_pick_from) : + file_(file_to_pick_from), ack_hint_out_(), twist_(0) { ack_hint_out_.copy_range(file_->ack_out(),bin64_t::ALL); } + virtual void Randomize (uint64_t twist) { + twist_ = twist; + } + virtual bin64_t Pick (bins& offer, uint8_t layer) { - + if (twist_) { + offer.twist(twist_); + ack_hint_out_.twist(twist_); + } bin64_t hint = offer.find_filtered - (ack_hint_out_,bin64_t::ALL,layer,bins::FILLED); + (ack_hint_out_,bin64_t::ALL,layer,bins::FILLED); + if (twist_) { + hint = hint.twisted(twist_); + //dprintf("found twisted by %lli fixed to (%i,%lli)\n", + // twist_,hint.layer(),hint.offset()); + offer.twist(0); + ack_hint_out_.twist(0); + } if (hint==bin64_t::NONE) return hint; // TODO: end-game mode while (hint.layer()>layer) diff --git a/p2tp.h b/p2tp.h index 2e8c8e7..589a7e5 100644 --- a/p2tp.h +++ b/p2tp.h @@ -219,6 +219,7 @@ namespace p2tp { class PiecePicker { public: + virtual void Randomize (uint64_t twist) = 0; virtual bin64_t Pick (bins& offered, uint8_t layer) = 0; virtual void Expired (bin64_t b) = 0; virtual void Received (bin64_t b) = 0; diff --git a/tests/binstest2.cpp b/tests/binstest2.cpp index d3f7a81..cb3950c 100755 --- a/tests/binstest2.cpp +++ b/tests/binstest2.cpp @@ -295,6 +295,9 @@ TEST(BinsTest,Twist) { b.twist(1<<3); EXPECT_EQ(bins::FILLED,b.get(bin64_t(3,3))); EXPECT_EQ(bins::EMPTY,b.get(bin64_t(3,2))); + bin64_t tw = b.find(bin64_t(5,0),3,bins::FILLED); + tw = tw.twisted(1<<3); + EXPECT_EQ(bin64_t(3,2),tw); b.twist(0); EXPECT_EQ(bins::FILLED,b.get(bin64_t(3,2))); EXPECT_EQ(bins::EMPTY,b.get(bin64_t(3,3))); diff --git a/tests/transfertest.cpp b/tests/transfertest.cpp index 334f9a8..432f990 100644 --- a/tests/transfertest.cpp +++ b/tests/transfertest.cpp @@ -53,6 +53,7 @@ TEST(TransferTest,TransferFile) { unlink("copy"); FileTransfer::instance = 1; FileTransfer* leech = new FileTransfer("copy",seed->root_hash()); + leech->picker().Randomize(0); // transfer peak hashes for(int i=0; ipeak_count(); i++) leech->OfferHash(seed->peak(i),seed->peak_hash(i)); @@ -70,6 +71,7 @@ TEST(TransferTest,TransferFile) { delete leech; FileTransfer::instance = 1; leech = new FileTransfer("copy",seed->root_hash()); + leech->picker().Randomize(0); EXPECT_EQ(2,leech->complete_kilo()); } bin64_t next = leech->picker().Pick(seed->ack_out(),0); diff --git a/transfer.cpp b/transfer.cpp index f0983f4..4e45484 100644 --- a/transfer.cpp +++ b/transfer.cpp @@ -44,6 +44,7 @@ FileTransfer::FileTransfer (const char* filename, const Sha1Hash& _root_hash) : else RecoverProgress(); picker_ = new SeqPiecePicker(this); + picker_->Randomize(Datagram::Time()&7); }