void Peer::sendHello() { CLOG(DEBUG,"Overlay") << "Peer::sendHello to " << toString(); StellarMessage msg; msg.type(HELLO); msg.hello().protocolVersion = mApp.getConfig().PROTOCOL_VERSION; msg.hello().versionStr = mApp.getConfig().VERSION_STR; msg.hello().listeningPort = mApp.getConfig().PEER_PORT; msg.hello().peerID = mApp.getConfig().PEER_PUBLIC_KEY; sendMessage(msg); }
void Peer::sendHello() { LOG(DEBUG) << "Peer::sendHello " << "@" << mApp.getConfig().PEER_PORT << " to " << mRemoteListeningPort; StellarMessage msg; msg.type(HELLO); msg.hello().protocolVersion = mApp.getConfig().PROTOCOL_VERSION; msg.hello().versionStr = mApp.getConfig().VERSION_STR; msg.hello().listeningPort = mApp.getConfig().PEER_PORT; msg.hello().peerID = mApp.getConfig().PEER_PUBLIC_KEY; sendMessage(msg); }
void Peer::sendHello() { CLOG(DEBUG, "Overlay") << "Peer::sendHello to " << toString(); StellarMessage msg; msg.type(HELLO); msg.hello().ledgerVersion = mApp.getConfig().LEDGER_PROTOCOL_VERSION; msg.hello().overlayVersion = mApp.getConfig().OVERLAY_PROTOCOL_VERSION; msg.hello().versionStr = mApp.getConfig().VERSION_STR; msg.hello().networkID = mApp.getNetworkID(); msg.hello().listeningPort = mApp.getConfig().PEER_PORT; msg.hello().peerID = mApp.getConfig().NODE_SEED.getPublicKey(); msg.hello().cert = this->getAuthCert(); msg.hello().nonce = mSendNonce; sendMessage(msg); mSendHelloMeter.Mark(); }
bool Peer::recvHello(StellarMessage const& msg) { if (msg.hello().peerID == mApp.getConfig().PEER_PUBLIC_KEY) { CLOG(DEBUG, "Overlay") << "connecting to self"; drop(); return false; } mRemoteProtocolVersion = msg.hello().protocolVersion; mRemoteVersion = msg.hello().versionStr; if (msg.hello().listeningPort <= 0 || msg.hello().listeningPort > UINT16_MAX) { CLOG(DEBUG, "Overlay") << "bad port in recvHello"; drop(); return false; } mRemoteListeningPort = static_cast<unsigned short>(msg.hello().listeningPort); CLOG(INFO, "Overlay") << "recvHello " << "@" << mApp.getConfig().PEER_PORT << " from: " << mRemoteProtocolVersion << " " << mRemoteVersion << " " << mRemoteListeningPort; mState = GOT_HELLO; mPeerID = msg.hello().peerID; return true; }
bool Peer::recvHello(StellarMessage const& msg) { if (msg.hello().peerID == mApp.getConfig().PEER_PUBLIC_KEY) { CLOG(DEBUG, "Overlay") << "connecting to self"; drop(); return false; } mRemoteOverlayVersion = msg.hello().overlayVersion; mRemoteVersion = msg.hello().versionStr; if (msg.hello().listeningPort <= 0 || msg.hello().listeningPort > UINT16_MAX) { CLOG(DEBUG, "Overlay") << "bad port in recvHello"; drop(); return false; } mRemoteListeningPort = static_cast<unsigned short>(msg.hello().listeningPort); CLOG(DEBUG, "Overlay") << "recvHello from " << toString(); mState = GOT_HELLO; mPeerID = msg.hello().peerID; if (mRole == INITIATOR) { PeerRecord pr(getIP(), mRemoteListeningPort, mApp.getClock().now(), 0, 1); pr.insertIfNew(mApp.getDatabase()); } return true; }
void Peer::recvHello(StellarMessage const& msg) { using xdr::operator==; if (mState >= GOT_HELLO) { CLOG(ERROR, "Overlay") << "received unexpected HELLO"; mDropInRecvHelloUnexpectedMeter.Mark(); drop(); return; } auto& peerAuth = mApp.getOverlayManager().getPeerAuth(); if (!peerAuth.verifyRemoteAuthCert(msg.hello().peerID, msg.hello().cert)) { CLOG(ERROR, "Overlay") << "failed to verify remote peer auth cert"; mDropInRecvHelloCertMeter.Mark(); drop(); return; } mRemoteListeningPort = static_cast<unsigned short>(msg.hello().listeningPort); mRemoteOverlayVersion = msg.hello().overlayVersion; mRemoteVersion = msg.hello().versionStr; mPeerID = msg.hello().peerID; mRecvNonce = msg.hello().nonce; mSendMacSeq = 0; mRecvMacSeq = 0; mSendMacKey = peerAuth.getSendingMacKey(msg.hello().cert.pubkey, mSendNonce, mRecvNonce, mRole); mRecvMacKey = peerAuth.getReceivingMacKey(msg.hello().cert.pubkey, mSendNonce, mRecvNonce, mRole); mState = GOT_HELLO; CLOG(DEBUG, "Overlay") << "recvHello from " << toString(); if (mRole == REMOTE_CALLED_US) { // Send a HELLO back, even if it's going to be followed // immediately by ERROR, because ERROR is an authenticated // message type and the caller won't decode it right if // still waiting for an unauthenticated HELLO. sendHello(); } if (msg.hello().overlayVersion != mApp.getConfig().OVERLAY_PROTOCOL_VERSION) { CLOG(ERROR, "Overlay") << "connection from peer with different overlay protocol version"; CLOG(DEBUG, "Overlay") << "Protocol = " << msg.hello().overlayVersion << " expected: " << mApp.getConfig().OVERLAY_PROTOCOL_VERSION; mDropInRecvHelloVersionMeter.Mark(); drop(ERR_CONF, "wrong protocol version"); return; } if (msg.hello().peerID == mApp.getConfig().NODE_SEED.getPublicKey()) { CLOG(WARNING, "Overlay") << "connecting to self"; mDropInRecvHelloSelfMeter.Mark(); drop(ERR_CONF, "connecting to self"); return; } if (msg.hello().networkID != mApp.getNetworkID()) { CLOG(WARNING, "Overlay") << "connection from peer with different NetworkID"; CLOG(DEBUG, "Overlay") << "NetworkID = " << hexAbbrev(msg.hello().networkID) << " expected: " << hexAbbrev(mApp.getNetworkID()); mDropInRecvHelloNetMeter.Mark(); drop(ERR_CONF, "wrong network passphrase"); return; } for (auto const& p : mApp.getOverlayManager().getPeers()) { if (&(p->mPeerID) == &mPeerID) { continue; } if (p->getPeerID() == mPeerID) { CLOG(WARNING, "Overlay") << "connection from already-connected peerID " << PubKeyUtils::toShortString(mPeerID); mDropInRecvHelloPeerIDMeter.Mark(); drop(ERR_CONF, "connecting already-connected peer"); return; } } if (msg.hello().listeningPort <= 0 || msg.hello().listeningPort > UINT16_MAX) { CLOG(WARNING, "Overlay") << "bad port in recvHello"; mDropInRecvHelloPortMeter.Mark(); drop(ERR_CONF, "bad port number"); return; } if (mRole == WE_CALLED_REMOTE) { sendAuth(); } }
void Peer::recvMessage(StellarMessage const& stellarMsg) { if (shouldAbort()) { return; } CLOG(TRACE, "Overlay") << "(" << mApp.getConfig().toShortString( mApp.getConfig().NODE_SEED.getPublicKey()) << ") recv: " << stellarMsg.type() << " from:" << mApp.getConfig().toShortString(mPeerID); if (!isAuthenticated() && (stellarMsg.type() != HELLO) && (stellarMsg.type() != HELLO2) && (stellarMsg.type() != AUTH) && (stellarMsg.type() != ERROR_MSG)) { CLOG(WARNING, "Overlay") << "recv: " << stellarMsg.type() << " before completed handshake"; mDropInRecvMessageUnauthMeter.Mark(); drop(); return; } assert(isAuthenticated() || stellarMsg.type() == HELLO || stellarMsg.type() == HELLO2 || stellarMsg.type() == AUTH || stellarMsg.type() == ERROR_MSG); switch (stellarMsg.type()) { case ERROR_MSG: { auto t = mRecvErrorTimer.TimeScope(); recvError(stellarMsg); } break; case HELLO: { auto t = mRecvHelloTimer.TimeScope(); this->recvHello(stellarMsg.hello()); } break; case HELLO2: { auto t = mRecvHelloTimer.TimeScope(); this->recvHello2(stellarMsg.hello2()); } break; case AUTH: { auto t = mRecvAuthTimer.TimeScope(); this->recvAuth(stellarMsg); } break; case DONT_HAVE: { auto t = mRecvDontHaveTimer.TimeScope(); recvDontHave(stellarMsg); } break; case GET_PEERS: { auto t = mRecvGetPeersTimer.TimeScope(); recvGetPeers(stellarMsg); } break; case PEERS: { auto t = mRecvPeersTimer.TimeScope(); recvPeers(stellarMsg); } break; case GET_TX_SET: { auto t = mRecvGetTxSetTimer.TimeScope(); recvGetTxSet(stellarMsg); } break; case TX_SET: { auto t = mRecvTxSetTimer.TimeScope(); recvTxSet(stellarMsg); } break; case TRANSACTION: { auto t = mRecvTransactionTimer.TimeScope(); recvTransaction(stellarMsg); } break; case GET_SCP_QUORUMSET: { auto t = mRecvGetSCPQuorumSetTimer.TimeScope(); recvGetSCPQuorumSet(stellarMsg); } break; case SCP_QUORUMSET: { auto t = mRecvSCPQuorumSetTimer.TimeScope(); recvSCPQuorumSet(stellarMsg); } break; case SCP_MESSAGE: { auto t = mRecvSCPMessageTimer.TimeScope(); recvSCPMessage(stellarMsg); } break; case GET_SCP_STATE: { auto t = mRecvGetSCPStateTimer.TimeScope(); recvGetSCPState(stellarMsg); } break; } }