From d91ce53da1f9ae90ac431302ee61033246d5e7ef Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Mon, 30 Aug 2021 19:44:11 -0400 Subject: [PATCH] limit RC gossip to 20 peers max --- llarp/router/rc_gossiper.cpp | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/llarp/router/rc_gossiper.cpp b/llarp/router/rc_gossiper.cpp index e9f839cc1..42196cfe5 100644 --- a/llarp/router/rc_gossiper.cpp +++ b/llarp/router/rc_gossiper.cpp @@ -76,17 +76,38 @@ namespace llarp DHTImmediateMessage gossip; gossip.msgs.emplace_back(new dht::GotRouterMessage(dht::Key_t{}, 0, {rc}, false)); - // send it to everyone + constexpr size_t MaxGossipPeers = 20; + + std::unordered_set gossipTo; + + // connect peers to gossip to + m_LinkManager->ForEachPeer( + [&](const ILinkSession* peerSession, bool) { + // ensure connected session + if (not(peerSession && peerSession->IsEstablished())) + return; + // check if public router + const auto other_rc = peerSession->GetRemoteRC(); + if (not other_rc.IsPublicRouter()) + return; + + if (gossipTo.size() >= MaxGossipPeers) + return; + + gossipTo.insert(other_rc.pubkey); + }, + true); + m_LinkManager->ForEachPeer([&](ILinkSession* peerSession) { - // ensure connected session if (not(peerSession && peerSession->IsEstablished())) return; - // check if public router - const auto other_rc = peerSession->GetRemoteRC(); - if (not other_rc.IsPublicRouter()) + + // exclude from gossip as we have not selected to use it + if (gossipTo.count(peerSession->GetPubKey()) == 0) return; + // encode message - ILinkSession::Message_t msg; + ILinkSession::Message_t msg{}; msg.resize(MAX_LINK_MSG_SIZE / 2); llarp_buffer_t buf(msg); if (not gossip.BEncode(&buf))