From c875f1d105c55e77054a46157ae884457294a996 Mon Sep 17 00:00:00 2001
From: zzz <zzz@i2pmail.org>
Date: Thu, 30 Jun 2022 17:15:33 -0400
Subject: [PATCH] SSU2: Fix last check of local RI for relay

Expire relay token quickly
Log tweaks
---
 .../router/transport/udp/EstablishmentManager.java   | 12 +++++++++++-
 .../router/transport/udp/IntroductionManager.java    |  8 ++++++--
 .../net/i2p/router/transport/udp/PacketBuilder2.java |  2 +-
 .../src/net/i2p/router/transport/udp/PeerState.java  |  1 +
 .../src/net/i2p/router/transport/udp/PeerState2.java |  9 +++++----
 .../net/i2p/router/transport/udp/UDPTransport.java   |  8 ++++----
 6 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
index 91758a8ec5..292bfe0846 100644
--- a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
@@ -2523,12 +2523,22 @@ class EstablishmentManager {
      *  @since 0.9.54
      */
     public Token getInboundToken(RemoteHostId peer) {
+        return getInboundToken(peer, IB_TOKEN_EXPIRATION);
+    }
+
+    /**
+     *  Get a token that can be used later for the peer to connect to us
+     *
+     *  @param expiration time from now
+     *  @since 0.9.55
+     */
+    public Token getInboundToken(RemoteHostId peer, long expiration) {
         long token;
         do {
             token = _context.random().nextLong();
         } while (token == 0);
         // TODO shorten expiration based on _inboundTokens size
-        long expires = _context.clock().now() + IB_TOKEN_EXPIRATION;
+        long expires = _context.clock().now() + expiration;
         Token tok = new Token(token, expires);
         synchronized(_inboundTokens) {
             _inboundTokens.put(peer, tok);
diff --git a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
index 69b6856266..85d64c9d57 100644
--- a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
@@ -904,7 +904,10 @@ class IntroductionManager {
      */
     private boolean receiveRelayIntro(PeerState2 bob, Hash alice, byte[] data, int retryCount) {
         RouterInfo aliceRI = null;
-        if (retryCount < 5 && !_context.banlist().isBanlisted(alice)) {
+        if (retryCount >= 5) {
+            // last chance
+            aliceRI = _context.netDb().lookupRouterInfoLocally(alice);
+        } else if (!_context.banlist().isBanlisted(alice)) {
             aliceRI = _context.netDb().lookupRouterInfoLocally(alice);
             if (aliceRI == null) {
                 if (_log.shouldInfo())
@@ -1044,7 +1047,7 @@ class IntroductionManager {
         long token;
         if (rcode == SSU2Util.RELAY_ACCEPT) {
             RemoteHostId aliceID = new RemoteHostId(testIP, testPort);
-            EstablishmentManager.Token tok = _transport.getEstablisher().getInboundToken(aliceID);
+            EstablishmentManager.Token tok = _transport.getEstablisher().getInboundToken(aliceID, 60*1000);
             token = tok.token;
         } else {
             token = 0;
@@ -1060,6 +1063,7 @@ class IntroductionManager {
         UDPPacket packet = _builder2.buildRelayResponse(data, bob);
         if (_log.shouldInfo())
             _log.info("Send relay response " + rcode + " as charlie " + " nonce " + nonce + " to bob " + bob +
+                      " with token " + token +
                       " for alice " + Addresses.toString(testIP, testPort) + ' ' + aliceRI);
         _transport.send(packet);
         if (rcode == SSU2Util.RELAY_ACCEPT) {
diff --git a/router/java/src/net/i2p/router/transport/udp/PacketBuilder2.java b/router/java/src/net/i2p/router/transport/udp/PacketBuilder2.java
index 7c20f84ab4..dbf1df53ba 100644
--- a/router/java/src/net/i2p/router/transport/udp/PacketBuilder2.java
+++ b/router/java/src/net/i2p/router/transport/udp/PacketBuilder2.java
@@ -286,7 +286,7 @@ class PacketBuilder2 {
                        " data size " + dataSize +
                        " pkt size " + (off + ipHeaderSize) +
                        " MTU " + currentMTU +
-                       " Fragments: " + DataHelper.toString(fragments), new Exception());
+                       " Fragments: " + DataHelper.toString(fragments) /* , new Exception() */ );
             }
         }
         
diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState.java b/router/java/src/net/i2p/router/transport/udp/PeerState.java
index 45a663bbaf..920df4232d 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerState.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java
@@ -1329,6 +1329,7 @@ public class PeerState {
      */
     synchronized void packetReceived(int size) {
         _packetsReceived++;
+        // SSU2 overhead header + MAC == SSU overhead IV + MAC
         if (_remoteIP.length == 4) {
             size += OVERHEAD_SIZE;
         } else {
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 097eb1a0ab..0645e16ca6 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerState2.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerState2.java
@@ -377,8 +377,8 @@ 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");
+        if (_log.shouldInfo())
+            _log.info("Got RI in data phase " + ri + "\non: " + this);
         try {
             Hash h = ri.getHash();
             if (h.equals(_context.routerHash()))
@@ -481,8 +481,9 @@ public class PeerState2 extends PeerState implements SSU2Payload.PayloadCallback
     }
 
     public void gotFragment(byte[] data, int off, int len, long messageId, int frag, boolean isLast) throws DataFormatException {
-        if (_log.shouldDebug())
-            _log.debug("Got FRAGMENT block: " + messageId + " fragment " + frag + " isLast? " + isLast);
+        if (_log.shouldInfo())
+            _log.info("Got FRAGMENT block: " + messageId + " fragment " + frag + " len " + len +
+                      " isLast? " + isLast + " on " + _remotePeer.toBase64());
         InboundMessageState state;
         boolean messageComplete = false;
         boolean messageExpired = false;
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 8c79876c62..1b24fed607 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
@@ -2064,16 +2064,16 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             for (int i = 0; i < count; i++) {
                 long exp = ua.getIntroducerExpiration(i);
                 if (exp > 0 && exp < now + INTRODUCER_EXPIRATION_MARGIN) {
-                    if (_log.shouldWarn())
-                        _log.warn((ipv6 ? "IPv6" : "IPv4") + " Introducer " + i + " expiring soon, need to replace");
+                    if (_log.shouldInfo())
+                        _log.info((ipv6 ? "IPv6" : "IPv4") + " Introducer " + i + " expiring soon, need to replace");
                     continue;
                 }
                 long tag = ua.getIntroducerTag(i);
                 if (_introManager.isInboundTagValid(tag)) {
                     valid++;
                 } else {
-                    if (_log.shouldWarn())
-                        _log.warn((ipv6 ? "IPv6" : "IPv4") + " Introducer " + i + " no longer connected, need to replace");
+                    if (_log.shouldInfo())
+                        _log.info((ipv6 ? "IPv6" : "IPv4") + " Introducer " + i + " no longer connected, need to replace");
                 }
             }
             long sinceSelected = now - (ipv6 ? _v6IntroducersSelectedOn : _v4IntroducersSelectedOn);
-- 
GitLab