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 01499cc984621e8f8d4f5f79f4f74801e7f5b2c0..4d1f03c2837dda9ee373ca1ccba3fddc66a2be6e 100644 --- a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java +++ b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java @@ -914,7 +914,8 @@ class PacketHandler { } else if (type == SSU2Util.PEER_TEST_FLAG_BYTE) { if (_log.shouldDebug()) _log.debug("Got a Peer Test"); - _testManager.receiveTest(from, packet); + if (SSU2Util.ENABLE_PEER_TEST) + _testManager.receiveTest(from, packet); } else { if (_log.shouldWarn()) _log.warn("Got unknown message " + header + " on " + state); diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState2.java b/router/java/src/net/i2p/router/transport/udp/PeerState2.java index 0acb3d75f294be375c15ec50c26bbe9968df107c..e1f43f338b433736e4c7ec9e4a2ddcd28a8e9dae 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerState2.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerState2.java @@ -23,6 +23,7 @@ import net.i2p.data.i2np.I2NPMessage; import net.i2p.data.i2np.I2NPMessageException; import net.i2p.data.i2np.I2NPMessageImpl; import net.i2p.router.RouterContext; +import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; import net.i2p.router.transport.udp.InboundMessageFragments.ModifiableLong; import static net.i2p.router.transport.udp.SSU2Util.*; import net.i2p.util.HexDump; @@ -380,6 +381,28 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback } public void gotRI(RouterInfo ri, boolean isHandshake, boolean flood) throws DataFormatException { + if (_log.shouldDebug()) + _log.debug("Got updated RI"); + try { + Hash h = ri.getHash(); + if (h.equals(_context.routerHash())) + return; + RouterInfo old = _context.netDb().store(h, ri); + if (flood && !ri.equals(old)) { + FloodfillNetworkDatabaseFacade fndf = (FloodfillNetworkDatabaseFacade) _context.netDb(); + if ((old == null || ri.getPublished() > old.getPublished()) && + fndf.floodConditional(ri)) { + if (_log.shouldDebug()) + _log.debug("Flooded the RI: " + h); + } else { + if (_log.shouldInfo()) + _log.info("Flood request but we didn't: " + h); + } + } + } catch (IllegalArgumentException iae) { + if (_log.shouldWarn()) + _log.warn("RI store fail: " + ri, iae); + } } public void gotRIFragment(byte[] data, boolean isHandshake, boolean flood, boolean isGzipped, int frag, int totalFrags) { diff --git a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java index 51b3521812ea1e412854362c99e7db823345db8d..52cad4b9e7eb539a417f9c4e6d77469d12344cc7 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java @@ -1700,7 +1700,16 @@ class PeerTestManager { public void gotOptions(byte[] options, boolean isHandshake) {} public void gotRI(RouterInfo ri, boolean isHandshake, boolean flood) { - throw new IllegalStateException("Bad block in PT"); + try { + Hash h = ri.getHash(); + if (h.equals(_context.routerHash())) + return; + _context.netDb().store(h, ri); + // ignore flood request + } catch (IllegalArgumentException iae) { + if (_log.shouldWarn()) + _log.warn("RI store fail: " + ri, iae); + } } public void gotRIFragment(byte[] data, boolean isHandshake, boolean flood, boolean isGzipped, int frag, int totalFrags) {