summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-08-05 11:54:44 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-08-05 11:54:44 +0000
commitc685ea9de9efdea119828ded02414f72b8271f31 (patch)
tree055e64aa8742f6e08e085751c146cb3a188a0d61 /src
parentcba1283aaed888f4602b3e1426b0edf5aaf823fe (diff)
2010-08-05 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added support for peers6 key in tracker response. Added added6, added6.f and dropped6 in ut_pex. * src/BtAnnounce.cc * src/BtAnnounce.h * src/DefaultBtAnnounce.cc * src/UTPexExtensionMessage.cc * src/UTPexExtensionMessage.h * test/DefaultBtAnnounceTest.cc * test/UTPexExtensionMessageTest.cc
Diffstat (limited to 'src')
-rw-r--r--src/BtAnnounce.cc2
-rw-r--r--src/BtAnnounce.h2
-rw-r--r--src/DefaultBtAnnounce.cc10
-rw-r--r--src/UTPexExtensionMessage.cc45
-rw-r--r--src/UTPexExtensionMessage.h4
5 files changed, 55 insertions, 8 deletions
diff --git a/src/BtAnnounce.cc b/src/BtAnnounce.cc
index 64976a26..25b321d7 100644
--- a/src/BtAnnounce.cc
+++ b/src/BtAnnounce.cc
@@ -52,4 +52,6 @@ const std::string BtAnnounce::INCOMPLETE("incomplete");
const std::string BtAnnounce::PEERS("peers");
+const std::string BtAnnounce::PEERS6("peers6");
+
} // namespace aria2
diff --git a/src/BtAnnounce.h b/src/BtAnnounce.h
index 4c25aa95..9d42b195 100644
--- a/src/BtAnnounce.h
+++ b/src/BtAnnounce.h
@@ -123,6 +123,8 @@ public:
static const std::string PEERS;
+ static const std::string PEERS6;
+
static const time_t DEFAULT_ANNOUNCE_INTERVAL = 120;
};
diff --git a/src/DefaultBtAnnounce.cc b/src/DefaultBtAnnounce.cc
index e47cf6b6..5ea3ebdc 100644
--- a/src/DefaultBtAnnounce.cc
+++ b/src/DefaultBtAnnounce.cc
@@ -280,6 +280,16 @@ DefaultBtAnnounce::processAnnounceResponse(const unsigned char* trackerResponse,
peerStorage_->addPeer(peers);
}
}
+ const SharedHandle<ValueBase>& peer6Data = dict->get(BtAnnounce::PEERS6);
+ if(peer6Data.isNull()) {
+ logger_->info("No peers6 received.");
+ } else {
+ if(!btRuntime_->isHalt() && btRuntime_->lessThanMinPeers()) {
+ std::vector<SharedHandle<Peer> > peers;
+ bittorrent::extractPeer(peer6Data, AF_INET6, std::back_inserter(peers));
+ peerStorage_->addPeer(peers);
+ }
+ }
}
bool DefaultBtAnnounce::noMoreAnnounce() {
diff --git a/src/UTPexExtensionMessage.cc b/src/UTPexExtensionMessage.cc
index 4618850f..3ac1e9a1 100644
--- a/src/UTPexExtensionMessage.cc
+++ b/src/UTPexExtensionMessage.cc
@@ -58,24 +58,41 @@ UTPexExtensionMessage::~UTPexExtensionMessage() {}
std::string UTPexExtensionMessage::getPayload()
{
- std::pair<std::string, std::string> freshPeerPair =
+ std::pair<std::pair<std::string, std::string>,
+ std::pair<std::string, std::string> > freshPeerPair =
createCompactPeerListAndFlag(freshPeers_);
- std::pair<std::string, std::string> droppedPeerPair =
+ std::pair<std::pair<std::string, std::string>,
+ std::pair<std::string, std::string> > droppedPeerPair =
createCompactPeerListAndFlag(droppedPeers_);
Dict dict;
- dict.put("added", freshPeerPair.first);
- dict.put("added.f", freshPeerPair.second);
- dict.put("dropped", droppedPeerPair.first);
+ if(!freshPeerPair.first.first.empty()) {
+ dict.put("added", freshPeerPair.first.first);
+ dict.put("added.f", freshPeerPair.first.second);
+ }
+ if(!droppedPeerPair.first.first.empty()) {
+ dict.put("dropped", droppedPeerPair.first.first);
+ }
+ if(!freshPeerPair.second.first.empty()) {
+ dict.put("added6", freshPeerPair.second.first);
+ dict.put("added6.f", freshPeerPair.second.second);
+ }
+ if(!droppedPeerPair.second.first.empty()) {
+ dict.put("dropped6", droppedPeerPair.second.first);
+ }
+
return bencode2::encode(&dict);
}
-std::pair<std::string, std::string>
+std::pair<std::pair<std::string, std::string>,
+ std::pair<std::string, std::string> >
UTPexExtensionMessage::createCompactPeerListAndFlag
(const std::vector<SharedHandle<Peer> >& peers)
{
std::string addrstring;
std::string flagstring;
+ std::string addrstring6;
+ std::string flagstring6;
for(std::vector<SharedHandle<Peer> >::const_iterator itr = peers.begin(),
eoi = peers.end(); itr != eoi; ++itr) {
unsigned char compact[COMPACT_LEN_IPV6];
@@ -84,9 +101,13 @@ UTPexExtensionMessage::createCompactPeerListAndFlag
if(compactlen == COMPACT_LEN_IPV4) {
addrstring.append(&compact[0], &compact[compactlen]);
flagstring += (*itr)->isSeeder() ? 0x02 : 0x00;
+ } else if(compactlen == COMPACT_LEN_IPV6) {
+ addrstring6.append(&compact[0], &compact[compactlen]);
+ flagstring6 += (*itr)->isSeeder() ? 0x02 : 0x00;
}
}
- return std::pair<std::string, std::string>(addrstring, flagstring);
+ return std::make_pair(std::make_pair(addrstring, flagstring),
+ std::make_pair(addrstring6, flagstring6));
}
std::string UTPexExtensionMessage::toString() const
@@ -172,6 +193,16 @@ UTPexExtensionMessage::create(const unsigned char* data, size_t len)
bittorrent::extractPeer
(dropped, AF_INET, std::back_inserter(msg->droppedPeers_));
}
+ const String* added6 = asString(dict->get("added6"));
+ if(added6) {
+ bittorrent::extractPeer
+ (added6, AF_INET6, std::back_inserter(msg->freshPeers_));
+ }
+ const String* dropped6 = asString(dict->get("dropped6"));
+ if(dropped6) {
+ bittorrent::extractPeer
+ (dropped6, AF_INET6, std::back_inserter(msg->droppedPeers_));
+ }
}
return msg;
}
diff --git a/src/UTPexExtensionMessage.h b/src/UTPexExtensionMessage.h
index 74b5f4fb..8c554b4c 100644
--- a/src/UTPexExtensionMessage.h
+++ b/src/UTPexExtensionMessage.h
@@ -65,7 +65,9 @@ private:
size_t maxDroppedPeer_;
- std::pair<std::string, std::string>
+
+ std::pair<std::pair<std::string, std::string>,
+ std::pair<std::string, std::string> >
createCompactPeerListAndFlag(const std::vector<SharedHandle<Peer> >& peers);
public: