From ac799b7ffad0be1950854cfb0ecf3b7560dcd61a Mon Sep 17 00:00:00 2001 From: zzz Date: Thu, 22 Dec 2022 09:50:39 -0500 Subject: [PATCH] SSU2: Further restrict states when we will be a peer test Charlie and also use those states for when to publish B cap --- .../router/transport/udp/PeerTestManager.java | 2 +- .../router/transport/udp/UDPTransport.java | 38 ++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) 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 6e2c0a490..137de2b5d 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java @@ -1225,7 +1225,7 @@ class PeerTestManager { SessionKey aliceIntroKey = null; int rcode; PeerState aps = _transport.getPeerState(h); - if (_transport.isSnatted()) { + if (!_transport.canTestAsCharlie(isIPv6)) { rcode = SSU2Util.TEST_REJECT_CHARLIE_ADDRESS; } else if (aps != null && aps.isIPv6() == isIPv6) { rcode = SSU2Util.TEST_REJECT_CHARLIE_CONNECTED; 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 c2b8bdc8c..89c5be07a 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -334,6 +334,29 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority Status.IPV4_SNAT_IPV6_OK, Status.IPV4_SNAT_IPV6_UNKNOWN); + // States where we cannot be a v4 Charlie + private static final Set STATUS_IPV4_NO_TEST = EnumSet.of(Status.DIFFERENT, + Status.DISCONNECTED, + Status.HOSED, + Status.UNKNOWN, + Status.IPV4_UNKNOWN_IPV6_OK, + Status.IPV4_UNKNOWN_IPV6_FIREWALLED, + Status.IPV4_DISABLED_IPV6_OK, + Status.IPV4_DISABLED_IPV6_UNKNOWN, + Status.IPV4_DISABLED_IPV6_FIREWALLED, + Status.IPV4_SNAT_IPV6_OK, + Status.IPV4_SNAT_IPV6_UNKNOWN); + + // States where we cannot be a v6 Charlie + private static final Set STATUS_IPV6_NO_TEST = EnumSet.of(Status.DIFFERENT, + Status.DISCONNECTED, + Status.HOSED, + Status.UNKNOWN, + Status.IPV4_OK_IPV6_UNKNOWN, + Status.IPV4_FIREWALLED_IPV6_UNKNOWN, + Status.IPV4_DISABLED_IPV6_UNKNOWN, + Status.IPV4_SNAT_IPV6_UNKNOWN); + /** * @param dh non-null to enable SSU1 @@ -2980,7 +3003,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority // if we have explicit external addresses, they had better be reachable String caps; - if (isSnatted()) { + if (!canTestAsCharlie(isIPv6)) { + // we could still be a Bob, but we don't have separate caps for Bob and Charlie caps = isIPv6 ? CAP_IPV6 : CAP_IPV4; } else if (introducersRequired || !canIntroduce(isIPv6)) { if (!directIncluded) { @@ -4045,6 +4069,18 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority return STATUS_IPV4_SNAT.contains(getReachabilityStatus()); } + /** + * Can we be a Charlie right now? + * @return true if we can participate + * @since 0.9.57 + */ + boolean canTestAsCharlie(boolean ipv6) { + Status status = getReachabilityStatus(); + if (ipv6) + return !STATUS_IPV6_NO_TEST.contains(status); + return !STATUS_IPV4_NO_TEST.contains(status); + } + /** * @deprecated unused */