From 5c232792cc30db3de8b752160fc19a4c75c0bc73 Mon Sep 17 00:00:00 2001
From: zzz <zzz@i2pmail.org>
Date: Wed, 10 Mar 2021 07:03:33 -0500
Subject: [PATCH] SSU: Don't change ports in some cases

---
 .../src/net/i2p/router/transport/udp/UDPTransport.java    | 8 ++++++++
 1 file changed, 8 insertions(+)

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 f4e78988ec..3e2cfbdf33 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
@@ -124,6 +124,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private Hash _lastFromv4, _lastFromv6;
     private byte[] _lastOurIPv4, _lastOurIPv6;
     private int _lastOurPortv4, _lastOurPortv6;
+    private boolean _haveUPnP;
     /** since we don't publish our IP/port if introduced anymore, we need
         to store it somewhere. */
     private RouterAddress _currentOurV4Address;
@@ -963,6 +964,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             // (we don't want to set this for Teredo, 6to4, ...)
             _haveIPv6Address = true;
         }
+        if (source == SOURCE_UPNP)
+            _haveUPnP = true;
         if (explicitAddressSpecified())
             return;
         String sources = _context.getProperty(PROP_SOURCES, DEFAULT_SOURCES);
@@ -1033,6 +1036,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
      */
     @Override
     public void forwardPortStatus(byte[] ip, int port, int externalPort, boolean success, String reason) {
+        if (success)
+            _haveUPnP = true;
         if (_log.shouldLog(Log.WARN)) {
             if (success)
                 _log.warn("UPnP has opened the SSU port: " + port + " via " + Addresses.toString(ip, externalPort));
@@ -1149,6 +1154,9 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
                 if (_log.shouldLog(Log.INFO))
                     _log.info(from + " and another peer agree we have the IP " 
                               + Addresses.toString(ourIP, ourPort) + ".  Changing address.");
+                // Never change port for IPv6 or if we have UPnP
+                if (_haveUPnP || ourIP.length == 16)
+                    ourPort = 0;
                 changeAddress(ourIP, ourPort);
             }
         }
-- 
GitLab