From 86c6800fbdfab5df1f2fb7c8b6566da134a4c62e Mon Sep 17 00:00:00 2001 From: zzz <zzz@i2pmail.org> Date: Mon, 30 Jan 2023 11:11:48 -0500 Subject: [PATCH] NTCP2: Ensure we publish a "6" address on transition to firewalled Do not call restartListening() on transition to firewalled --- .../router/transport/ntcp/NTCPTransport.java | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java index e57fcbba97..43a1f1e726 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java @@ -1600,10 +1600,11 @@ public class NTCPTransport extends TransportImpl { */ private synchronized boolean externalAddressReceived(byte[] ip, boolean isIPv6, int port) { // FIXME just take first address for now - // FIXME if SSU set to hostname, NTCP will be set to IP + // Warning, this returns null when isIPv6 == true and it's an empty "46" address + // See below RouterAddress oldAddr = getCurrentAddress(isIPv6); if (_log.shouldLog(Log.INFO)) - _log.info("Changing NTCP Address? was " + oldAddr); + _log.info("Changing NTCP IPv" + (isIPv6 ? '6' : '4') + " Address? was " + oldAddr); OrderedProperties newProps = new OrderedProperties(); int cost; @@ -1703,6 +1704,25 @@ public class NTCPTransport extends TransportImpl { newAddr.setCost(DEFAULT_COST); changed = true; } else if (ohost == null || ohost.length() <= 0) { + // SSU2 told us to remove our IPv6 address + // getCurrentAddress(true) returns null for a "46" address + // Get v4 address and see if it has a "6" in it, + // if not, put in a "6" address + if (isIPv6 && _haveIPv6Address && oldAddr == null && ip == null && port <= 0) { + RouterAddress v4Addr = getCurrentAddress(false); + if (v4Addr != null) { + String caps = v4Addr.getOption("caps"); + if (caps != null && caps.contains(CAP_IPV6)) { + if (_log.shouldInfo()) + _log.info("No old host, no new host, no change to NTCP Address"); + return false; + } + } + if (_log.shouldInfo()) + _log.info("IPv6 now firewalled, adding 6 address"); + setOutboundNTCP2Address(true); + return true; + } if (_log.shouldInfo()) _log.info("No old host, no new host, no change to NTCP Address"); return false; @@ -1746,11 +1766,10 @@ public class NTCPTransport extends TransportImpl { } else { // IPv6 // We have an IPv4 address, IPv6 transitioned to firewalled, - // so just remove the v6 address - // TODO '6' address if (_log.shouldInfo()) - _log.info("IPv6 now firewalled"); - newAddr = null; + _log.info("IPv6 now firewalled, adding 6 address"); + setOutboundNTCP2Address(true); + return true; } // stopListening stops the pumper, readers, and writers, so required even if @@ -1767,7 +1786,10 @@ public class NTCPTransport extends TransportImpl { //while (isAlive()) { // try { Thread.sleep(5*1000); } catch (InterruptedException ie) {} //} - restartListening(newAddr, isIPv6); + + // do not restart on transition to firewalled + if (ip != null || port > 0) + restartListening(newAddr, isIPv6); if (_log.shouldLog(Log.WARN)) _log.warn("Updating NTCP Address (ipv6? " + isIPv6 + ") with " + newAddr); return true; -- GitLab