From 73c8ee826e8d35d482c1b7710e38f6fb90d47ea4 Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 9 Jul 2022 07:31:46 -0400 Subject: [PATCH] SSU2: Support other reason codes in destroy message --- .../i2p/router/transport/udp/MessageReceiver.java | 2 +- .../net/i2p/router/transport/udp/PacketHandler.java | 4 ++-- .../net/i2p/router/transport/udp/UDPTransport.java | 13 +++++++------ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java index 27b942ade..17e2e0b50 100644 --- a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java +++ b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java @@ -231,7 +231,7 @@ class MessageReceiver { PeerState ps = _transport.getPeerState(state.getFrom()); if (ps != null && ps.getRemotePort() == 65520) { // distinct port of buggy router - _transport.sendDestroy(ps); + _transport.sendDestroy(ps, SSU2Util.REASON_BANNED); _transport.dropPeer(ps, true, "Corrupt DSM"); _context.banlist().banlistRouterForever(state.getFrom(), "Sent corrupt message"); // don't bother translating diff --git a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java index 64d5e9ff2..5d6e33d69 100644 --- a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java +++ b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java @@ -590,7 +590,7 @@ class PacketHandler { if (skew > GRACE_PERIOD) { _context.statManager().addRateData("udp.droppedInvalidSkew", skew); if (state != null && skew > 4 * GRACE_PERIOD && state.getPacketsReceived() <= 0) { - _transport.sendDestroy(state); + _transport.sendDestroy(state, SSU2Util.REASON_SKEW); _transport.dropPeer(state, true, "Clock skew"); if (state.getRemotePort() == 65520) { // distinct port of buggy router @@ -615,7 +615,7 @@ class PacketHandler { } else if (skew < 0 - GRACE_PERIOD) { _context.statManager().addRateData("udp.droppedInvalidSkew", 0-skew); if (state != null && skew < 0 - (4 * GRACE_PERIOD) && state.getPacketsReceived() <= 0) { - _transport.sendDestroy(state); + _transport.sendDestroy(state, SSU2Util.REASON_SKEW); _transport.dropPeer(state, true, "Clock skew"); if (state.getRemotePort() == 65520) { // distinct port of buggy router diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java index ce93baafb..2ff4925a5 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -1870,7 +1870,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority else _context.banlist().banlistRouterForever(peerHash, "Not in our network: " + id); if (peer != null) - sendDestroy(peer); + sendDestroy(peer, SSU2Util.REASON_NETID); dropPeer(peerHash, false, "Not in our network"); if (_log.shouldLog(Log.WARN)) _log.warn("Not in our network: " + entry, new Exception()); @@ -2142,9 +2142,10 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority * Send a session destroy message, bypassing OMF and PacketPusher. * BLOCKING if OB queue is full. * + * @param reasonCode SSU2 only, ignored for SSU1 * @since 0.8.9 */ - void sendDestroy(PeerState peer) { + void sendDestroy(PeerState peer, int reasonCode) { UDPPacket pkt; if (peer.getVersion() == 1) { // peer must be fully established @@ -2152,7 +2153,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority return; pkt = _packetBuilder.buildSessionDestroyPacket(peer); } else { - pkt = _packetBuilder2.buildSessionDestroyPacket(SSU2Util.REASON_TIMEOUT, (PeerState2) peer); + pkt = _packetBuilder2.buildSessionDestroyPacket(reasonCode, (PeerState2) peer); } if (_log.shouldLog(Log.DEBUG)) _log.debug("Sending destroy to : " + peer); @@ -2180,7 +2181,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if (_log.shouldInfo()) _log.info("Sending destroy to : " + howMany + " peers"); for (PeerState peer : _peersByIdent.values()) { - sendDestroy(peer); + sendDestroy(peer, SSU2Util.REASON_TIMEOUT); // 1000 per second * 48 bytes = 400 KBps if ((++count) % burst == 0) { try { @@ -3242,7 +3243,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority // ok, a few conseutive failures, but we /are/ getting through to them } else { _context.statManager().addRateData("udp.dropPeerConsecutiveFailures", consecutive, msg.getPeer().getInactivityTime()); - sendDestroy(msg.getPeer()); + sendDestroy(msg.getPeer(), SSU2Util.REASON_FRAME_TIMEOUT); dropPeer(msg.getPeer(), false, "too many failures"); } //if ( (consecutive > MAX_CONSECUTIVE_FAILED) && (msg.getPeer().getInactivityTime() > DROP_INACTIVITY_TIME)) @@ -3620,7 +3621,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if (_log.shouldDebug()) _log.debug("Expiring " + _expireBuffer.size() + " peers"); for (PeerState peer : _expireBuffer) { - sendDestroy(peer); + sendDestroy(peer, SSU2Util.REASON_TIMEOUT); dropPeer(peer, false, "idle too long"); // TODO sleep to limit burst like in destroyAll() ?? // but we are on the timer thread...