diff --git a/src/xrpld/overlay/Slot.h b/src/xrpld/overlay/Slot.h index 63f7de6f09..eb117600e7 100644 --- a/src/xrpld/overlay/Slot.h +++ b/src/xrpld/overlay/Slot.h @@ -75,7 +75,7 @@ public: virtual ~SquelchHandler() { } - /** Squelch handler + /** Squelch handler for a single peer * @param validator Public key of the source validator * @param id Peer's id to squelch * @param duration Squelch duration in seconds @@ -83,6 +83,15 @@ public: virtual void squelch(PublicKey const& validator, Peer::id_t id, std::uint32_t duration) const = 0; + + /** Squelch for all peers, the method must call slots.squelchValidator + * to register that a (validator,peer) was squelched + * @param validator Public key of the source validator + * @param duration Squelch duration in seconds + */ + virtual void + squelchAll(PublicKey const& validator, std::uint32_t duration) = 0; + /** Unsquelch handler * @param validator Public key of the source validator * @param id Peer's id to unsquelch diff --git a/src/xrpld/overlay/detail/OverlayImpl.cpp b/src/xrpld/overlay/detail/OverlayImpl.cpp index ae0fb2c4c0..d79ec621f5 100644 --- a/src/xrpld/overlay/detail/OverlayImpl.cpp +++ b/src/xrpld/overlay/detail/OverlayImpl.cpp @@ -1410,6 +1410,15 @@ OverlayImpl::squelch( } } +void +OverlayImpl::squelchAll(PublicKey const& validator, uint32_t squelchDuration) +{ + for_each([&](std::shared_ptr&& p) { + slots_.squelchValidator(validator, p->id()); + p->send(makeSquelchMessage(validator, true, squelchDuration)); + }); +} + void OverlayImpl::updateSlotAndSquelch( uint256 const& key, diff --git a/src/xrpld/overlay/detail/OverlayImpl.h b/src/xrpld/overlay/detail/OverlayImpl.h index f6bb172b6c..b27d4a2570 100644 --- a/src/xrpld/overlay/detail/OverlayImpl.h +++ b/src/xrpld/overlay/detail/OverlayImpl.h @@ -451,6 +451,10 @@ private: Peer::id_t const id, std::uint32_t squelchDuration) const override; + void + squelchAll(PublicKey const& validator, std::uint32_t squelchDuration) + override; + void unsquelch(PublicKey const& validator, Peer::id_t id) const override;