diff --git a/src/ConnectionPool.cpp b/src/ConnectionPool.cpp index a6e1a99241..79f0c82a8b 100644 --- a/src/ConnectionPool.cpp +++ b/src/ConnectionPool.cpp @@ -29,6 +29,7 @@ void splitIpPort(const std::string& strIpPort, std::string& strIp, int& iPort) } ConnectionPool::ConnectionPool(boost::asio::io_service& io_service) : + mLastPeer(0), mCtx(boost::asio::ssl::context::sslv23), mScanTimer(io_service), mPolicyTimer(io_service) @@ -237,7 +238,7 @@ int ConnectionPool::relayMessage(Peer* fromPeer, const PackedMessage::pointer& m BOOST_FOREACH(naPeer pair, mConnectedMap) { - Peer::pointer peer = pair.second; + Peer::ref peer = pair.second; if (!peer) std::cerr << "CP::RM null peer in list" << std::endl; else if ((!fromPeer || !(peer.get() == fromPeer)) && peer->isConnected()) @@ -250,6 +251,24 @@ int ConnectionPool::relayMessage(Peer* fromPeer, const PackedMessage::pointer& m return sentTo; } +int ConnectionPool::relayMessage(const std::set& fromPeers, const PackedMessage::pointer& msg) +{ + int sentTo = 0; + boost::mutex::scoped_lock sl(mPeerLock); + + BOOST_FOREACH(naPeer pair, mConnectedMap) + { + Peer::ref peer = pair.second; + if (peer->isConnected() && (fromPeers.count(peer->getPeerId()) == 0)) + { + ++sentTo; + peer->sendPacket(msg); + } + } + + return sentTo; +} + // Schedule a connection via scanning. // // Add or modify into PeerIps as a manual entry for immediate scanning. @@ -354,6 +373,12 @@ std::vector ConnectionPool::getPeerVector() return ret; } +uint64 ConnectionPool::assignPeerId() +{ + boost::mutex::scoped_lock sl(mPeerLock); + return ++mLastPeer; +} + // Now know peer's node public key. Determine if we want to stay connected. // <-- bNew: false = redundant bool ConnectionPool::peerConnected(Peer::ref peer, const RippleAddress& naPeer, diff --git a/src/ConnectionPool.h b/src/ConnectionPool.h index 1b909f626a..f230bd0eca 100644 --- a/src/ConnectionPool.h +++ b/src/ConnectionPool.h @@ -1,6 +1,8 @@ #ifndef __CONNECTION_POOL__ #define __CONNECTION_POOL__ +#include + #include #include @@ -14,7 +16,8 @@ class ConnectionPool { private: - boost::mutex mPeerLock; + boost::mutex mPeerLock; + uint64 mLastPeer; typedef std::pair naPeer; typedef std::pair pipPeer; @@ -59,6 +62,7 @@ public: // Send message to network. int relayMessage(Peer* fromPeer, const PackedMessage::pointer& msg); + int relayMessage(const std::set& fromPeers, const PackedMessage::pointer& msg); // Manual connection request. // Queue for immediate scanning. @@ -87,6 +91,9 @@ public: Json::Value getPeersJson(); std::vector getPeerVector(); + // Peer 64-bit ID function + uint64 assignPeerId(); + // // Scanning // diff --git a/src/Peer.cpp b/src/Peer.cpp index 491991c23f..3b8a10f88c 100644 --- a/src/Peer.cpp +++ b/src/Peer.cpp @@ -30,7 +30,8 @@ Peer::Peer(boost::asio::io_service& io_service, boost::asio::ssl::context& ctx) mSocketSsl(io_service, ctx), mVerifyTimer(io_service) { - // cLog(lsDEBUG) << "CREATING PEER: " << ADDRESS(this); + cLog(lsDEBUG) << "CREATING PEER: " << ADDRESS(this); + mPeerId = theApp->getConnectionPool().assignPeerId(); } void Peer::handle_write(const boost::system::error_code& error, size_t bytes_transferred) diff --git a/src/Peer.h b/src/Peer.h index cc3a525c5b..49857e3e6f 100644 --- a/src/Peer.h +++ b/src/Peer.h @@ -46,6 +46,7 @@ private: ipPort mIpPort; ipPort mIpPortConnect; uint256 mCookieHash; + uint64 mPeerId; uint256 mClosedLedgerHash, mPreviousLedgerHash; std::list mRecentLedgers; @@ -162,6 +163,8 @@ public: uint256 getClosedLedgerHash() const { return mClosedLedgerHash; } bool hasLedger(const uint256& hash) const; bool hasTxSet(const uint256& hash) const; + uint64 getPeerId() const { return mPeerId; } + RippleAddress getNodePublic() const { return mNodePublic; } void cycleStatus() { mPreviousLedgerHash = mClosedLedgerHash; mClosedLedgerHash.zero(); } };