From: Victor Grishchenko Date: Tue, 16 Feb 2010 19:20:42 +0000 (+0100) Subject: Added the single swift app; X-Git-Url: http://p2p-next.cs.pub.ro/gitweb/?a=commitdiff_plain;h=9a4c065e2ed0d82aa4187cb9853cc7186163b544;p=swift-upb.git Added the single swift app; it runs as a seeder, leecher or hasher, depending on arguments. Added arguments for logging, waiting, etc etc --- diff --git a/SConstruct b/SConstruct index f4d2cd7..43cc065 100644 --- a/SConstruct +++ b/SConstruct @@ -17,7 +17,7 @@ TestDir='tests' target = 'swift' source = [ 'bin64.cpp','sha1.cpp','hashtree.cpp','datagram.cpp','bins.cpp', - 'transfer.cpp', 'swift.cpp', 'sendrecv.cpp', 'send_control.cpp', + 'transfer.cpp', 'channel.cpp', 'sendrecv.cpp', 'send_control.cpp', 'compat/hirestimeofday.cpp', 'compat.cpp', 'compat/util.cpp'] env = Environment() diff --git a/channel.cpp b/channel.cpp new file mode 100644 index 0000000..80dce25 --- /dev/null +++ b/channel.cpp @@ -0,0 +1,190 @@ +/* + * swift.cpp + * serp++ + * + * Created by Victor Grishchenko on 3/6/09. + * Copyright 2009 Delft University of Technology. All rights reserved. + * + */ + +#include +#include +#ifndef _WIN32 +#include +#include +#include +#include +#include +#endif +#include +#include + +//#include +#include "swift.h" +#include "datagram.h" + +using namespace std; +using namespace swift; + +swift::tint Channel::last_tick = 0; +int Channel::MAX_REORDERING = 4; +bool Channel::SELF_CONN_OK = false; +swift::tint Channel::TIMEOUT = TINT_SEC*60; +std::vector Channel::channels(1); +SOCKET Channel::sockets[8] = {0,0,0,0,0,0,0,0}; +int Channel::socket_count = 0; +Address Channel::tracker; +tbheap Channel::send_queue; +FILE* Channel::debug_file = NULL; +#include "ext/simple_selector.cpp" +PeerSelector* Channel::peer_selector = new SimpleSelector(); + +Channel::Channel (FileTransfer* transfer, int socket, Address peer_addr) : + transfer_(transfer), peer_(peer_addr), peer_channel_id_(0), pex_out_(0), + socket_(socket==-1?sockets[0]:socket), // FIXME + data_out_cap_(bin64_t::ALL), last_data_out_time_(0), last_data_in_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), + data_in_dbl_(bin64_t::NONE), hint_out_size_(0), + cwnd_(1), send_interval_(TINT_SEC), send_control_(PING_PONG_CONTROL), + sent_since_recv_(0), ack_rcvd_recent_(0), ack_not_rcvd_recent_(0), + last_loss_time_(0), owd_min_bin_(0), owd_min_bin_start_(NOW), + owd_cur_bin_(0), dgrams_sent_(0), dgrams_rcvd_(0), + data_in_(TINT_NEVER,bin64_t::NONE) +{ + if (peer_==Address()) + peer_ = tracker; + this->id_ = channels.size(); + channels.push_back(this); + transfer_->hs_in_.push_back(id_); + for(int i=0; i<4; i++) { + owd_min_bins_[i] = TINT_NEVER; + owd_current_[i] = TINT_NEVER; + } + Reschedule(); + dprintf("%s #%u init %s\n",tintstr(),id_,peer_.str()); +} + + +Channel::~Channel () { + channels[id_] = NULL; +} + + +void swift::SetTracker(const Address& tracker) { + Channel::tracker = tracker; +} + + +int Channel::DecodeID(int scrambled) { + return scrambled ^ (int)Datagram::start; +} +int Channel::EncodeID(int unscrambled) { + return unscrambled ^ (int)Datagram::start; +} + + +int swift::Listen (Address addr) { + int sock = Datagram::Bind(addr); + if (sock!=INVALID_SOCKET) + Channel::sockets[Channel::socket_count++] = sock; + return sock; +} + + +void swift::Shutdown (int sock_des) { + for(int i=0; ifile().file_descriptor()) { + + /*if (FileTransfer::files.size()file().file_descriptor(); + } else { + if (ft) + delete ft; + return -1; + } +} + + +void swift::Close (int fd) { + if (fdAddPeer(address,root); +} + + +uint64_t swift::Size (int fdes) { + if (FileTransfer::files.size()>fdes && FileTransfer::files[fdes]) + return FileTransfer::files[fdes]->file().size(); + else + return 0; +} + + +bool swift::IsComplete (int fdes) { + if (FileTransfer::files.size()>fdes && FileTransfer::files[fdes]) + return FileTransfer::files[fdes]->file().is_complete(); + else + return 0; +} + + +uint64_t swift::Complete (int fdes) { + if (FileTransfer::files.size()>fdes && FileTransfer::files[fdes]) + return FileTransfer::files[fdes]->file().complete(); + else + return 0; +} + + +uint64_t swift::SeqComplete (int fdes) { + if (FileTransfer::files.size()>fdes && FileTransfer::files[fdes]) + return FileTransfer::files[fdes]->file().seq_complete(); + else + return 0; +} + + +const Sha1Hash& swift::RootMerkleHash (int file) { + FileTransfer* trans = FileTransfer::file(file); + if (!trans) + return Sha1Hash::ZERO; + return trans->file().root_hash(); +} + + +/**

swift handshake

+ Basic rules: +
    +
  • to send a datagram, a channel must be created + (channels are cheap and easily recycled) +
  • a datagram must contain either the receiving + channel id (scrambled) or the root hash +
+ Note: + */ diff --git a/compat.h b/compat.h index 67a0125..4ab9379 100644 --- a/compat.h +++ b/compat.h @@ -42,7 +42,7 @@ typedef int64_t tint; #define TINT_SEC ((tint)1000000) #define TINT_MSEC ((tint)1000) #define TINT_uSEC ((tint)1) -#define TINT_NEVER ((tint)0x7fffffffffffffffLL) +#define TINT_NEVER ((tint)0x3fffffffffffffffLL) size_t file_size (int fd); diff --git a/datagram.cpp b/datagram.cpp index 116b495..e99d620 100644 --- a/datagram.cpp +++ b/datagram.cpp @@ -181,7 +181,6 @@ SOCKET Datagram::Bind (Address addr_) { } setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int)); #endif - dprintf("socket buffers: %i send %i recv\n",sndbuf,rcvbuf); if (::bind(fd, (sockaddr*)&addr, len) != 0) { print_error("bind fails"); return INVALID_SOCKET; diff --git a/datagram.h b/datagram.h index 30a9ec3..a7a162e 100644 --- a/datagram.h +++ b/datagram.h @@ -222,13 +222,6 @@ public: const char* tintstr(tint t=0); std::string sock2str (struct sockaddr_in addr); -#ifdef DEBUG -#define dprintf(...) printf(__VA_ARGS__) -#else -#define dprintf(...) {} -#endif -#define eprintf(...) fprintf(stderr,__VA_ARGS__) -//#define dprintf(...) {} } diff --git a/ext/simple_selector.cpp b/ext/simple_selector.cpp index 3b51e98..8620c18 100644 --- a/ext/simple_selector.cpp +++ b/ext/simple_selector.cpp @@ -26,9 +26,9 @@ public: //uint32_t fp = for_root.fingerprint(); for(peer_queue_t::iterator i=peers.begin(); i!=peers.end(); i++) if (i->second==for_root) { - i->second = 0; + i->second = Sha1Hash::ZERO; // horror TODO rewrite sockaddr_in ret = i->first; - while (peers.begin()->second==0) + while (peers.begin()->second==Sha1Hash::ZERO) peers.pop_front(); return ret; } diff --git a/hashtree.cpp b/hashtree.cpp index 538d05d..3e772eb 100644 --- a/hashtree.cpp +++ b/hashtree.cpp @@ -58,7 +58,10 @@ Sha1Hash::Sha1Hash(bool hex, const char* hash) { int val; for(int i=0; ihex()==std::string(hash)); @@ -257,7 +260,6 @@ Sha1Hash HashTree::DeriveRoot () { p = p.parent(); c--; } - //dprintf("p %lli %s\n",(uint64_t)p,hash.hex().c_str()); } return hash; } diff --git a/mfold/report.css b/mfold/report.css index 75fb34f..a1a64f7 100644 --- a/mfold/report.css +++ b/mfold/report.css @@ -24,3 +24,11 @@ pp { tr.bytes { background: #fed; } + +img.thumb { + width: 150pt; +} + +table#main tr td { + vertical-align: top; +} diff --git a/sendrecv.cpp b/sendrecv.cpp index 6a56bce..9f74a2a 100644 --- a/sendrecv.cpp +++ b/sendrecv.cpp @@ -186,12 +186,12 @@ bin64_t Channel::AddData (Datagram& dgram) { if (data_out_.size()NOW-TINT_SEC || data_out_.empty())) return bin64_t::NONE; // once in a while, empty data is sent just to check rtt FIXED @@ -274,7 +274,7 @@ void Channel::Recv (Datagram& dgram) { rtt_avg_ = NOW - last_send_time_; dev_avg_ = rtt_avg_; dip_avg_ = rtt_avg_; - dprintf("%s #%u rtt init %lli\n",tintstr(),id_,rtt_avg_); + dprintf("%s #%u sendctrl rtt init %lli\n",tintstr(),id_,rtt_avg_); } bin64_t data = dgram.size() ? bin64_t::NONE : bin64_t::ALL; while (dgram.size()) { @@ -377,7 +377,7 @@ void Channel::CleanDataOut (bin64_t ackd_pos) { // TODO: isn't it too long? owd_min_bins_[owd_min_bin_] = owd; peer_send_time_ = 0; } - dprintf("%s #%u rtt %lli dev %lli based on %s\n", + dprintf("%s #%u sendctrl rtt %lli dev %lli based on %s\n", tintstr(),id_,rtt_avg_,dev_avg_,data_out_[i].bin.str()); bin64_t pos = data_out_[i].bin; ack_rcvd_recent_++; @@ -570,7 +570,7 @@ void Channel::Loop (tint howlong) { } else { // it's too early, wait tint towait = min(limit,send_time) - NOW; - dprintf("%s waiting %lliusec\n",tintstr(),towait); + dprintf("%s #0 waiting %lliusec\n",tintstr(),towait); int rd = Datagram::Wait(socket_count,sockets,towait); if (rd!=INVALID_SOCKET) { // in meantime, received something Channel* receiver = RecvDatagram(rd); @@ -597,7 +597,7 @@ void Channel::Reschedule () { if (next_send_time_!=TINT_NEVER) { assert(next_send_time_ #include -#include -#ifndef _WIN32 -#include -#include -#include -#include -#include -#endif -#include -#include - -//#include +#include #include "swift.h" -#include "datagram.h" -using namespace std; using namespace swift; -swift::tint Channel::last_tick = 0; -int Channel::MAX_REORDERING = 4; -bool Channel::SELF_CONN_OK = false; -swift::tint Channel::TIMEOUT = TINT_SEC*60; -std::vector Channel::channels(1); -SOCKET Channel::sockets[8] = {0,0,0,0,0,0,0,0}; -int Channel::socket_count = 0; -Address Channel::tracker; -tbheap Channel::send_queue; -#include "ext/simple_selector.cpp" -PeerSelector* Channel::peer_selector = new SimpleSelector(); - -Channel::Channel (FileTransfer* transfer, int socket, Address peer_addr) : - transfer_(transfer), peer_(peer_addr), peer_channel_id_(0), pex_out_(0), - socket_(socket==-1?sockets[0]:socket), // FIXME - data_out_cap_(bin64_t::ALL), last_data_out_time_(0), last_data_in_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), - data_in_dbl_(bin64_t::NONE), hint_out_size_(0), - cwnd_(1), send_interval_(TINT_SEC), send_control_(PING_PONG_CONTROL), - sent_since_recv_(0), ack_rcvd_recent_(0), ack_not_rcvd_recent_(0), - last_loss_time_(0), owd_min_bin_(0), owd_min_bin_start_(NOW), - owd_cur_bin_(0), dgrams_sent_(0), dgrams_rcvd_(0), - data_in_(TINT_NEVER,bin64_t::NONE) -{ - if (peer_==Address()) - peer_ = tracker; - this->id_ = channels.size(); - channels.push_back(this); - transfer_->hs_in_.push_back(id_); - for(int i=0; i<4; i++) { - owd_min_bins_[i] = TINT_NEVER; - owd_current_[i] = TINT_NEVER; - } - Reschedule(); - dprintf("%s #%u init %s\n",tintstr(),id_,peer_.str()); -} - - -Channel::~Channel () { - channels[id_] = NULL; -} - - -void swift::SetTracker(const Address& tracker) { - Channel::tracker = tracker; -} - - -int Channel::DecodeID(int scrambled) { - return scrambled ^ (int)Datagram::start; -} -int Channel::EncodeID(int unscrambled) { - return unscrambled ^ (int)Datagram::start; -} - - -int swift::Listen (Address addr) { - int sock = Datagram::Bind(addr); - if (sock!=INVALID_SOCKET) - Channel::sockets[Channel::socket_count++] = sock; - return sock; -} - - -void swift::Shutdown (int sock_des) { - for(int i=0; ifile().file_descriptor()) { - - /*if (FileTransfer::files.size()file().file_descriptor(); + } // arguments parsed + + LibraryInit(); + + int file = Open(filename,root_hash); + // FIXME open err + printf("Root hash: %s\n", RootMerkleHash(file).hex().c_str()); + + if (root_hash==Sha1Hash() && bindaddr==Address()) + exit(0); + + if (bindaddr!=Address()) { // seeding + if (Listen(bindaddr)<=0) + quit("cant listen to %s\n",bindaddr.str()) + if (wait_time==0) + wait_time=TINT_NEVER; } else { - if (ft) - delete ft; - return -1; + int base = rand()%10000, i; + for (i=0; i<100 && Listen(Address(INADDR_ANY,i*7+base))<=0; i++); + if (i==100) + quit("cant listen to a port\n"); } + + + if (tracker!=Address()) + SetTracker(tracker); + + tint start_time = NOW; + tint end_time = TINT_NEVER; + + while (NOWAddPeer(address,root); -} - - -uint64_t swift::Size (int fdes) { - if (FileTransfer::files.size()>fdes && FileTransfer::files[fdes]) - return FileTransfer::files[fdes]->file().size(); - else - return 0; -} - - -bool swift::IsComplete (int fdes) { - if (FileTransfer::files.size()>fdes && FileTransfer::files[fdes]) - return FileTransfer::files[fdes]->file().is_complete(); - else - return 0; -} - - -uint64_t swift::Complete (int fdes) { - if (FileTransfer::files.size()>fdes && FileTransfer::files[fdes]) - return FileTransfer::files[fdes]->file().complete(); - else - return 0; -} - - -uint64_t swift::SeqComplete (int fdes) { - if (FileTransfer::files.size()>fdes && FileTransfer::files[fdes]) - return FileTransfer::files[fdes]->file().seq_complete(); - else - return 0; -} - - -const Sha1Hash& swift::RootMerkleHash (int file) { - FileTransfer* trans = FileTransfer::file(file); - if (!trans) - return Sha1Hash::ZERO; - return trans->file().root_hash(); -} - - -/**

swift handshake

- Basic rules: -
    -
  • to send a datagram, a channel must be created - (channels are cheap and easily recycled) -
  • a datagram must contain either the receiving - channel id (scrambled) or the root hash -
- Note: - */ diff --git a/swift.h b/swift.h index dd74f64..d833c3d 100644 --- a/swift.h +++ b/swift.h @@ -302,6 +302,7 @@ namespace swift { static tint LEDBAT_DELAY_BIN; static bool SELF_CONN_OK; static tint MAX_POSSIBLE_RTT; + static FILE* debug_file; const std::string id_string () const; /** A channel is "established" if had already sent and received packets. */ @@ -461,5 +462,11 @@ namespace swift { } // namespace end +#ifndef SWIFT_MUTE +#define dprintf(...) { if (Channel::debug_file) fprintf(Channel::debug_file,__VA_ARGS__); } +#else +#define dprintf(...) {} +#endif +#define eprintf(...) fprintf(stderr,__VA_ARGS__) #endif