From 1c6ae98948af69cbc7bd4aa7fc18dc6304c0c0bd Mon Sep 17 00:00:00 2001 From: Arnaud Date: Mon, 25 May 2026 17:44:01 +0400 Subject: [PATCH] Improve handleNatStatus case when dial back is none --- storage/nat.nim | 4 +++- tests/storage/testnat.nim | 14 +++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/storage/nat.nim b/storage/nat.nim index 6c8bd7b1..d4e0fa37 100644 --- a/storage/nat.nim +++ b/storage/nat.nim @@ -144,6 +144,8 @@ method handleNatStatus*( of Reachable: if dialBackAddr.isNone: warn "Got empty dialback address in AutoNat when node is Reachable" + # Reachable but no address to announce: incomplete information, do nothing + # and wait for the next AutoNAT cycle. return if autoRelayService.isRunning: @@ -152,8 +154,8 @@ method handleNatStatus*( else: debug "AutoRelayService stopped" - discovery.updateRecordsAndSpr(@[dialBackAddr.get], udpPort = discoveryPort) discovery.protocol.clientMode = false + discovery.updateRecordsAndSpr(@[dialBackAddr.get], udpPort = discoveryPort) of NotReachable: var hasPortMapping = false diff --git a/tests/storage/testnat.nim b/tests/storage/testnat.nim index ef5599e1..888d0b2f 100644 --- a/tests/storage/testnat.nim +++ b/tests/storage/testnat.nim @@ -54,6 +54,7 @@ asyncchecksuite "NAT - handleNatStatus": mappedPorts: some((Port(9000), Port(9001), MappingProtocol.UPnP)) ) + discard await autorelayservice.setup(autoRelay, sw) await mapper.handleNatStatus( NotReachable, Opt.some(dialBack), discoveryPort, disc, sw, autoRelay ) @@ -63,7 +64,7 @@ asyncchecksuite "NAT - handleNatStatus": check not autoRelay.isRunning check disc.protocol.clientMode - test "handleNatStatus starts autoRelay when NotReachable and UPnP failed": + test "handleNatStatus starts autoRelay when NotReachable and no dialBackAddr": let mapper = MockNatPortMapper(mappedPorts: none((Port, Port, MappingProtocol))) await mapper.handleNatStatus( @@ -73,7 +74,7 @@ asyncchecksuite "NAT - handleNatStatus": check autoRelay.isRunning check disc.protocol.clientMode - test "handleNatStatus starts autoRelay when NotReachable and mapping fails": + test "handleNatStatus starts autoRelay when NotReachable and dialBackAddr but no mapped ports": let dialBack = MultiAddress.init("/ip4/1.2.3.4/tcp/8080").expect("valid") let mapper = MockNatPortMapper(mappedPorts: none((Port, Port, MappingProtocol))) @@ -85,21 +86,24 @@ asyncchecksuite "NAT - handleNatStatus": check disc.announceAddrs == newSeq[MultiAddress]() check disc.protocol.clientMode - test "handleNatStatus does not announce address when Reachable and no dialBackAddr": + test "handleNatStatus does nothing when Reachable and no dialBackAddr": let mapper = MockNatPortMapper(mappedPorts: none((Port, Port, MappingProtocol))) + discard await autorelayservice.setup(autoRelay, sw) + disc.protocol.clientMode = true await mapper.handleNatStatus( Reachable, Opt.none(MultiAddress), discoveryPort, disc, sw, autoRelay ) + check autoRelay.isRunning check disc.announceAddrs == newSeq[MultiAddress]() - check not autoRelay.isRunning - check not disc.protocol.clientMode + check disc.protocol.clientMode test "handleNatStatus stops relay and announces dialBackAddr when Reachable": let dialBack = MultiAddress.init("/ip4/1.2.3.4/tcp/8080").expect("valid") let mapper = MockNatPortMapper(mappedPorts: none((Port, Port, MappingProtocol))) + disc.protocol.clientMode = true discard await autorelayservice.setup(autoRelay, sw) await mapper.handleNatStatus( Reachable, Opt.some(dialBack), discoveryPort, disc, sw, autoRelay