void Peer::recvPeers(StellarMessage const& msg) { for (auto peer : msg.peers()) { stringstream ip; ip << (int)peer.ip[0] << "." << (int)peer.ip[1] << "." << (int)peer.ip[2] << "." << (int)peer.ip[3]; if (peer.port == 0 || peer.port > UINT16_MAX) { CLOG(DEBUG, "Overlay") << "ignoring peer with bad port"; continue; } PeerRecord pr{ip.str(), static_cast<unsigned short>(peer.port), mApp.getClock().now(), peer.numFailures, 1}; if (pr.isPrivateAddress()) { CLOG(DEBUG, "Overlay") << "ignoring flooded private address"; } else { pr.insertIfNew(mApp.getDatabase()); } } }
void Peer::sendPeers() { // send top 50 peers we know about vector<PeerRecord> peerList; PeerRecord::loadPeerRecords(mApp.getDatabase(), 50, mApp.getClock().now(), peerList); StellarMessage newMsg; newMsg.type(PEERS); newMsg.peers().resize(xdr::size32(peerList.size())); for (size_t n = 0; n < peerList.size(); n++) { if (!peerList[n].isPrivateAddress()) { peerList[n].toXdr(newMsg.peers()[n]); } } sendMessage(newMsg); }
void Peer::recvPeers(StellarMessage const& msg) { const uint32 NEW_PEER_WINDOW_SECONDS = 10; for (auto const& peer : msg.peers()) { if (peer.port == 0 || peer.port > UINT16_MAX) { CLOG(WARNING, "Overlay") << "ignoring received peer with bad port " << peer.port; continue; } if (peer.ip.type() == IPv6) { CLOG(WARNING, "Overlay") << "ignoring received IPv6 address" << " (not yet supported)"; continue; } // randomize when we'll try to connect to this peer next if we don't // know it auto defaultNextAttempt = mApp.getClock().now() + std::chrono::seconds(std::rand() % NEW_PEER_WINDOW_SECONDS); stringstream ip; ip << (int)peer.ip.ipv4()[0] << "." << (int)peer.ip.ipv4()[1] << "." << (int)peer.ip.ipv4()[2] << "." << (int)peer.ip.ipv4()[3]; // don't use peer.numFailures here as we may have better luck // (and we don't want to poison our failure count) PeerRecord pr{ip.str(), static_cast<unsigned short>(peer.port), defaultNextAttempt, 0}; if (pr.isPrivateAddress()) { CLOG(WARNING, "Overlay") << "ignoring received private address " << pr.toString(); } else if (pr.isSelfAddressAndPort(getIP(), mApp.getConfig().PEER_PORT)) { CLOG(WARNING, "Overlay") << "ignoring received self-address " << pr.toString(); } else if (pr.isLocalhost() && !mApp.getConfig().ALLOW_LOCALHOST_FOR_TESTING) { CLOG(WARNING, "Overlay") << "ignoring received localhost"; } else { pr.insertIfNew(mApp.getDatabase()); } } }
void Peer::sendPeers() { // send top 50 peers we know about vector<PeerRecord> peerList; PeerRecord::loadPeerRecords(mApp.getDatabase(), 50, mApp.getClock().now(), peerList); StellarMessage newMsg; newMsg.type(PEERS); newMsg.peers().reserve(peerList.size()); for (auto const& pr : peerList) { if (pr.isPrivateAddress() || pr.isSelfAddressAndPort(getIP(), mRemoteListeningPort)) { continue; } PeerAddress pa; pr.toXdr(pa); newMsg.peers().push_back(pa); } sendMessage(newMsg); }
void Peer::recvPeers(StellarMessage const& msg) { for (auto const& peer : msg.peers()) { if (peer.port == 0 || peer.port > UINT16_MAX) { CLOG(WARNING, "Overlay") << "ignoring received peer with bad port " << peer.port; continue; } if (peer.ip.type() == IPv6) { CLOG(WARNING, "Overlay") << "ignoring received IPv6 address" << " (not yet supported)"; continue; } stringstream ip; ip << (int)peer.ip.ipv4()[0] << "." << (int)peer.ip.ipv4()[1] << "." << (int)peer.ip.ipv4()[2] << "." << (int)peer.ip.ipv4()[3]; PeerRecord pr{ip.str(), static_cast<unsigned short>(peer.port), mApp.getClock().now(), peer.numFailures}; if (pr.isPrivateAddress()) { CLOG(WARNING, "Overlay") << "ignoring received private address " << pr.toString(); } else if (pr.isSelfAddressAndPort(getIP(), mApp.getConfig().PEER_PORT)) { CLOG(WARNING, "Overlay") << "ignoring received self-address " << pr.toString(); } else { pr.insertIfNew(mApp.getDatabase()); } } }