aboutsummaryrefslogtreecommitdiff
path: root/src/mapport.cpp
diff options
context:
space:
mode:
authorHennadii Stepanov <32963518+hebasto@users.noreply.github.com>2020-02-23 00:10:48 +0200
committerHennadii Stepanov <32963518+hebasto@users.noreply.github.com>2021-01-07 18:07:08 +0200
commit4e91b1e24d96e0cdccdd2a3ed034413f3ba6bae6 (patch)
tree01f7e01ff0f66e58d98b5f3805780f571570476c /src/mapport.cpp
parent8b50d1b5bb29b7d1ea0245ba75a8df3144e312dc (diff)
downloadbitcoin-4e91b1e24d96e0cdccdd2a3ed034413f3ba6bae6.tar.xz
net: Add flags for port mapping protocols
Diffstat (limited to 'src/mapport.cpp')
-rw-r--r--src/mapport.cpp31
1 files changed, 29 insertions, 2 deletions
diff --git a/src/mapport.cpp b/src/mapport.cpp
index ced2b773f3..5091e9f44d 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 <atomic>
#include <cassert>
#include <chrono>
#include <functional>
@@ -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.
}