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 1a58c1d944fa4f5c62256b6c8b22ceb88e145102..a075ed7f41ee3d2e2d39854227e1f771c2a1cf34 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -1885,11 +1885,6 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } } - // Should always be direct... except maybe for hidden mode? - // or do we always know the IP by now? - if (remoteId.getIP() == null && _log.shouldLog(Log.WARN)) - _log.warn("Add indirect: " + peer); - // don't do this twice PeerState oldPeer2 = _peersByRemoteHost.put(remoteId, peer); if (oldPeer2 != null && oldPeer2 != peer && oldPeer2 != oldPeer) { @@ -1953,6 +1948,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } } +/* synchronized(_rebuildLock) { rebuildIfNecessary(); Status status = getReachabilityStatus(); @@ -1961,6 +1957,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority _testEvent.forceRunSoon(peer.isIPv6()); } } +*/ return true; } @@ -3063,8 +3060,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if (_log.shouldLog(Log.WARN)) _log.warn("Wanted to rebuild my SSU address, but couldn't specify either the direct or indirect info (needs introducers? " + introducersRequired + - " ipv6? " + isIPv6 + - ')', new Exception()); + " ipv6? " + isIPv6 + ')'); _needsRebuild = true; // save the external address, even if we didn't publish it if (port > 0 && host != null) { @@ -3863,6 +3859,39 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority */ private void locked_setReachabilityStatus(Status newStatus, boolean isIPv6) { Status old = _reachabilityStatus; + if (newStatus == Status.UNKNOWN) { + // now that addRemotePeerState() doesn't schedule peer tests like crazy, + // we need to reschedule here + boolean runtest = false; + switch (old) { + case UNKNOWN: + runtest = true; + break; + + case IPV4_UNKNOWN_IPV6_OK: + case IPV4_UNKNOWN_IPV6_FIREWALLED: + if (!isIPv6) + runtest = true; + break; + + case IPV4_OK_IPV6_UNKNOWN: + case IPV4_DISABLED_IPV6_UNKNOWN: + case IPV4_FIREWALLED_IPV6_UNKNOWN: + case IPV4_SNAT_IPV6_UNKNOWN: + if (isIPv6) + runtest = true; + break; + } + if (runtest || old != _reachabilityStatusPending) { + if (_log.shouldWarn()) + _log.warn("Old status: " + old + " unchanged after update: UNKNOWN, reschedule test! ipv6? " + isIPv6); + _testEvent.forceRunSoon(isIPv6); + } else { + // run a little sooner than usual + _testEvent.forceRunSoon(isIPv6, 5*60*1000); + } + return; + } // merge new status into old Status status = Status.merge(old, newStatus); _testEvent.setLastTested(isIPv6);