mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
Fix peer tracking and scaning model.
This commit is contained in:
114
src/Peer.cpp
114
src/Peer.cpp
@@ -60,22 +60,32 @@ void Peer::handle_write(const boost::system::error_code& error, size_t bytes_tra
|
||||
void Peer::detach(const char *rsn)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
std::cerr << "DETACHING PEER: " << rsn << std::endl;
|
||||
std::cerr << "DETACHING PEER: " << rsn
|
||||
<< ": "
|
||||
<< (mNodePublic.isValid() ? mNodePublic.humanNodePublic() : "-")
|
||||
<< " " << getIP() << " " << getPort() << std::endl;
|
||||
#endif
|
||||
|
||||
boost::system::error_code ecCancel;
|
||||
|
||||
(void) mVerifyTimer.cancel();
|
||||
|
||||
mSendQ.clear();
|
||||
|
||||
if (mNodePublic.isValid())
|
||||
{
|
||||
theApp->getConnectionPool().peerDisconnected(shared_from_this(), mNodePublic);
|
||||
|
||||
mNodePublic.clear(); // Be idompotent.
|
||||
}
|
||||
|
||||
if (!mIpPort.first.empty())
|
||||
{
|
||||
if (mClientConnect)
|
||||
// Connection might be part of scanning. Inform connect failed.
|
||||
theApp->getConnectionPool().peerFailed(mIpPort.first, mIpPort.second);
|
||||
// Connection might be part of scanning. Inform connect failed.
|
||||
// Might need to scan. Inform connection disconnected.
|
||||
theApp->getConnectionPool().peerFailed(mIpPort.first, mIpPort.second);
|
||||
|
||||
theApp->getConnectionPool().peerDisconnected(shared_from_this(), mIpPort, mNodePublic);
|
||||
mIpPort.first.clear();
|
||||
mIpPort.first.empty(); // Be idompotent.
|
||||
}
|
||||
}
|
||||
|
||||
@@ -191,7 +201,8 @@ void Peer::handleConnect(const boost::system::error_code& error, boost::asio::ip
|
||||
}
|
||||
}
|
||||
|
||||
// Connect ssl as server.
|
||||
// Connect ssl as server to an inbound connection.
|
||||
// - We don't bother remembering the inbound IP or port. Only useful for debugging.
|
||||
void Peer::connected(const boost::system::error_code& error)
|
||||
{
|
||||
boost::asio::ip::tcp::endpoint ep = mSocketSsl.lowest_layer().remote_endpoint();
|
||||
@@ -208,21 +219,12 @@ void Peer::connected(const boost::system::error_code& error)
|
||||
std::cerr << "Remote peer: accept error: " << strIp << " " << iPort << " : " << error << std::endl;
|
||||
detach("ctd");
|
||||
}
|
||||
else if (!theApp->getConnectionPool().peerRegister(shared_from_this(), strIp, iPort))
|
||||
{
|
||||
std::cerr << "Remote peer: rejecting: " << strIp << " " << iPort << std::endl;
|
||||
// XXX Reject with a rejection message: already connected
|
||||
detach("ctd2");
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not redundant ip and port, add to connection list.
|
||||
|
||||
std::cerr << "Remote peer: accepted: " << strIp << " " << iPort << std::endl;
|
||||
|
||||
mIpPort = make_pair(strIp, iPort);
|
||||
assert(!mIpPort.first.empty());
|
||||
|
||||
mSocketSsl.set_verify_mode(boost::asio::ssl::verify_none);
|
||||
|
||||
mSocketSsl.async_handshake(boost::asio::ssl::stream<boost::asio::ip::tcp::socket>::server,
|
||||
@@ -241,9 +243,9 @@ void Peer::sendPacketForce(PackedMessage::pointer packet)
|
||||
|
||||
void Peer::sendPacket(PackedMessage::pointer packet)
|
||||
{
|
||||
if(packet)
|
||||
if (packet)
|
||||
{
|
||||
if(mSendingPacket)
|
||||
if (mSendingPacket)
|
||||
{
|
||||
mSendQ.push_back(packet);
|
||||
}
|
||||
@@ -279,7 +281,7 @@ void Peer::handle_read_header(const boost::system::error_code& error)
|
||||
{
|
||||
unsigned msg_len = PackedMessage::getLength(mReadbuf);
|
||||
// WRITEME: Compare to maximum message length, abort if too large
|
||||
if(msg_len>(32*1024*1024))
|
||||
if (msg_len>(32*1024*1024))
|
||||
{
|
||||
detach("hrh");
|
||||
return;
|
||||
@@ -307,7 +309,6 @@ void Peer::handle_read_body(const boost::system::error_code& error)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Peer::processReadBuffer()
|
||||
{
|
||||
int type = PackedMessage::getType(mReadbuf);
|
||||
@@ -330,7 +331,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtHELLO:
|
||||
{
|
||||
newcoin::TMHello msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvHello(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -339,7 +340,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtERROR_MSG:
|
||||
{
|
||||
newcoin::TMErrorMsg msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvErrorMessage(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -348,7 +349,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtPING:
|
||||
{
|
||||
newcoin::TMPing msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvPing(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -357,7 +358,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtGET_CONTACTS:
|
||||
{
|
||||
newcoin::TMGetContacts msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvGetContacts(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -366,7 +367,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtCONTACT:
|
||||
{
|
||||
newcoin::TMContact msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvContact(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -374,7 +375,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtGET_PEERS:
|
||||
{
|
||||
newcoin::TMGetPeers msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvGetPeers(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -382,7 +383,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtPEERS:
|
||||
{
|
||||
newcoin::TMPeers msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvPeers(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -391,7 +392,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtSEARCH_TRANSACTION:
|
||||
{
|
||||
newcoin::TMSearchTransaction msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvSearchTransaction(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -400,7 +401,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtGET_ACCOUNT:
|
||||
{
|
||||
newcoin::TMGetAccount msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvGetAccount(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -409,7 +410,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtACCOUNT:
|
||||
{
|
||||
newcoin::TMAccount msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvAccount(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -418,7 +419,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtTRANSACTION:
|
||||
{
|
||||
newcoin::TMTransaction msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvTransaction(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -427,7 +428,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtSTATUS_CHANGE:
|
||||
{
|
||||
newcoin::TMStatusChange msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvStatus(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -436,7 +437,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtPROPOSE_LEDGER:
|
||||
{
|
||||
newcoin::TMProposeSet msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvPropose(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -445,7 +446,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtGET_LEDGER:
|
||||
{
|
||||
newcoin::TMGetLedger msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvGetLedger(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -454,7 +455,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtLEDGER_DATA:
|
||||
{
|
||||
newcoin::TMLedgerData msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvLedger(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -463,7 +464,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtHAVE_SET:
|
||||
{
|
||||
newcoin::TMHaveTransactionSet msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvHaveTxSet(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -472,7 +473,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtVALIDATION:
|
||||
{
|
||||
newcoin::TMValidation msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvValidation(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -481,7 +482,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtGET_VALIDATION:
|
||||
{
|
||||
newcoin::TM msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recv(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -491,7 +492,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtGET_OBJECT:
|
||||
{
|
||||
newcoin::TMGetObjectByHash msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvGetObjectByHash(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -500,7 +501,7 @@ void Peer::processReadBuffer()
|
||||
case newcoin::mtOBJECT:
|
||||
{
|
||||
newcoin::TMObjectByHash msg;
|
||||
if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvObjectByHash(msg);
|
||||
else std::cerr << "parse error: " << type << std::endl;
|
||||
}
|
||||
@@ -529,18 +530,20 @@ void Peer::recvHello(newcoin::TMHello& packet)
|
||||
{ // Unable to verify they have private key for claimed public key.
|
||||
std::cerr << "Recv(Hello): Disconnect: Failed to verify session." << std::endl;
|
||||
}
|
||||
else if (!theApp->getConnectionPool().peerConnected(shared_from_this(), mNodePublic))
|
||||
else if (!theApp->getConnectionPool().peerConnected(shared_from_this(), mNodePublic, getIP(), getPort()))
|
||||
{ // Already connected, self, or some other reason.
|
||||
std::cerr << "Recv(Hello): Disconnect: Extraneous connection." << std::endl;
|
||||
}
|
||||
else
|
||||
{ // Successful connection.
|
||||
std::cerr << "Recv(Hello): Connect: " << mNodePublic.humanNodePublic() << std::endl;
|
||||
|
||||
// Cancel verification timeout.
|
||||
(void) mVerifyTimer.cancel();
|
||||
|
||||
if (mClientConnect)
|
||||
{
|
||||
// If we connected due to scan, no longer need to scan.
|
||||
theApp->getConnectionPool().peerVerified(mIpPort.first, mIpPort.second);
|
||||
|
||||
// No longer connecting as client.
|
||||
@@ -568,9 +571,6 @@ void Peer::recvHello(newcoin::TMHello& packet)
|
||||
mClosedLedgerTime = boost::posix_time::second_clock::universal_time();
|
||||
}
|
||||
|
||||
|
||||
theApp->getConnectionPool().savePeer(getIP(),packet.ipv4port(),'I');
|
||||
|
||||
bDetach = false;
|
||||
}
|
||||
|
||||
@@ -712,8 +712,10 @@ void Peer::recvGetContacts(newcoin::TMGetContacts& packet)
|
||||
void Peer::recvGetPeers(newcoin::TMGetPeers& packet)
|
||||
{
|
||||
std::vector<std::string> addrs;
|
||||
|
||||
theApp->getConnectionPool().getTopNAddrs(30,addrs);
|
||||
if(addrs.size())
|
||||
|
||||
if (addrs.size())
|
||||
{
|
||||
newcoin::TMPeers peers;
|
||||
|
||||
@@ -721,7 +723,9 @@ void Peer::recvGetPeers(newcoin::TMGetPeers& packet)
|
||||
{
|
||||
std::string strIP;
|
||||
int port;
|
||||
splitIpPort(addrs[n],strIP,port);
|
||||
|
||||
splitIpPort(addrs[n], strIP, port);
|
||||
|
||||
newcoin::TMIPv4EndPoint* addr=peers.add_nodes();
|
||||
addr->set_ipv4(inet_addr(strIP.c_str()));
|
||||
addr->set_ipv4port(port);
|
||||
@@ -734,21 +738,29 @@ void Peer::recvGetPeers(newcoin::TMGetPeers& packet)
|
||||
sendPacket(message);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: filter out all the LAN peers
|
||||
void Peer::recvPeers(newcoin::TMPeers& packet)
|
||||
{
|
||||
for(int i = 0; i < packet.nodes().size(); ++i)
|
||||
for (int i = 0; i < packet.nodes().size(); ++i)
|
||||
{
|
||||
in_addr addr;
|
||||
addr.s_addr=packet.nodes(i).ipv4();
|
||||
std::string strIP( inet_ntoa(addr));
|
||||
std::string strIP(inet_ntoa(addr));
|
||||
int port=packet.nodes(i).ipv4port();
|
||||
|
||||
std::cout << "Learning about: " << strIP << std::endl;
|
||||
if (strIP == "0.0.0.0")
|
||||
{
|
||||
strIP = mSocketSsl.lowest_layer().remote_endpoint().address().to_string();
|
||||
}
|
||||
|
||||
theApp->getConnectionPool().savePeer(strIP,port,'T');
|
||||
// if (strIP != "127.0.0.1")
|
||||
{
|
||||
std::cout << "Learning about: " << strIP << std::endl;
|
||||
|
||||
theApp->getConnectionPool().savePeer(strIP, port, 'T');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Peer::recvIndexedObject(newcoin::TMIndexedObject& packet)
|
||||
|
||||
Reference in New Issue
Block a user