diff --git a/src/init.cpp b/src/init.cpp index 5c244902153..8a260a3df2a 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1900,9 +1900,7 @@ bool AppInitMain(const util::Ref& context, NodeContext& node, interfaces::BlockA Discover(); // Map ports with UPnP - if (args.GetBoolArg("-upnp", DEFAULT_UPNP)) { - StartMapPort(); - } + StartMapPort(args.GetBoolArg("-upnp", DEFAULT_UPNP)); CConnman::Options connOptions; connOptions.nLocalServices = nLocalServices; diff --git a/src/mapport.cpp b/src/mapport.cpp index ced2b773f32..5091e9f44d8 100644 --- a/src/mapport.cpp +++ b/src/mapport.cpp @@ -25,6 +25,7 @@ static_assert(MINIUPNPC_API_VERSION >= 10, "miniUPnPc API version >= 10 assumed"); #endif +#include #include #include #include @@ -34,6 +35,7 @@ static_assert(MINIUPNPC_API_VERSION >= 10, "miniUPnPc API version >= 10 assumed" #ifdef USE_UPNP static CThreadInterrupt g_upnp_interrupt; static std::thread g_upnp_thread; +static std::atomic_uint g_mapport_target_proto{MapPortProtoFlag::NONE}; using namespace std::chrono_literals; static constexpr auto PORT_MAPPING_REANNOUNCE_PERIOD{20min}; @@ -117,7 +119,7 @@ static void ThreadMapPort() } while (g_upnp_interrupt.sleep_for(PORT_MAPPING_RETRY_PERIOD)); } -void StartMapPort() +void StartThreadMapPort() { if (!g_upnp_thread.joinable()) { assert(!g_upnp_interrupt); @@ -125,6 +127,31 @@ void StartMapPort() } } +static void DispatchMapPort() +{ + if (g_mapport_target_proto == MapPortProtoFlag::UPNP) { + StartThreadMapPort(); + } else { + InterruptMapPort(); + StopMapPort(); + } +} + +static void MapPortProtoSetEnabled(MapPortProtoFlag proto, bool enabled) +{ + if (enabled) { + g_mapport_target_proto |= proto; + } else { + g_mapport_target_proto &= ~proto; + } +} + +void StartMapPort(bool use_upnp) +{ + MapPortProtoSetEnabled(MapPortProtoFlag::UPNP, use_upnp); + DispatchMapPort(); +} + void InterruptMapPort() { if(g_upnp_thread.joinable()) { @@ -141,7 +168,7 @@ void StopMapPort() } #else -void StartMapPort() +void StartMapPort(bool use_upnp) { // Intentionally left blank. } diff --git a/src/mapport.h b/src/mapport.h index 25ff2fd1ebe..6e33b6ef74e 100644 --- a/src/mapport.h +++ b/src/mapport.h @@ -12,7 +12,12 @@ static const bool DEFAULT_UPNP = USE_UPNP; static const bool DEFAULT_UPNP = false; #endif -void StartMapPort(); +enum MapPortProtoFlag : unsigned int { + NONE = 0x00, + UPNP = 0x01, +}; + +void StartMapPort(bool use_upnp); void InterruptMapPort(); void StopMapPort(); diff --git a/src/node/interfaces.cpp b/src/node/interfaces.cpp index ff6c9bf6b37..6b84cb0f059 100644 --- a/src/node/interfaces.cpp +++ b/src/node/interfaces.cpp @@ -94,15 +94,7 @@ public: } } bool shutdownRequested() override { return ShutdownRequested(); } - void mapPort(bool use_upnp) override - { - if (use_upnp) { - StartMapPort(); - } else { - InterruptMapPort(); - StopMapPort(); - } - } + void mapPort(bool use_upnp) override { StartMapPort(use_upnp); } bool getProxy(Network net, proxyType& proxy_info) override { return GetProxy(net, proxy_info); } size_t getNodeCount(CConnman::NumConnections flags) override {