diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -579,6 +579,7 @@ interfaces/chain.cpp interfaces/node.cpp invrequest.cpp + mapport.cpp miner.cpp minerfund.cpp net.cpp diff --git a/src/init.cpp b/src/init.cpp --- a/src/init.cpp +++ b/src/init.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include diff --git a/src/interfaces/node.cpp b/src/interfaces/node.cpp --- a/src/interfaces/node.cpp +++ b/src/interfaces/node.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include diff --git a/src/mapport.h b/src/mapport.h new file mode 100644 --- /dev/null +++ b/src/mapport.h @@ -0,0 +1,19 @@ +// Copyright (c) 2011-2020 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_MAPPORT_H +#define BITCOIN_MAPPORT_H + +/** -upnp default */ +#ifdef USE_UPNP +static const bool DEFAULT_UPNP = USE_UPNP; +#else +static const bool DEFAULT_UPNP = false; +#endif + +void StartMapPort(); +void InterruptMapPort(); +void StopMapPort(); + +#endif // BITCOIN_MAPPORT_H diff --git a/src/mapport.cpp b/src/mapport.cpp new file mode 100644 --- /dev/null +++ b/src/mapport.cpp @@ -0,0 +1,141 @@ +// Copyright (c) 2011-2020 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#if defined(HAVE_CONFIG_H) +#include +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef USE_UPNP +#include +#include +#include +// The minimum supported miniUPnPc API version is set to 10. This keeps +// compatibility with Ubuntu 16.04 LTS and Debian 8 libminiupnpc-dev packages. +static_assert(MINIUPNPC_API_VERSION >= 10, + "miniUPnPc API version >= 10 assumed"); +#endif + +#include +#include +#include +#include +#include + +#ifdef USE_UPNP +static CThreadInterrupt g_upnp_interrupt; +static std::thread g_upnp_thread; +static void ThreadMapPort() { + std::string port = strprintf("%u", GetListenPort()); + const char *multicastif = nullptr; + const char *minissdpdpath = nullptr; + struct UPNPDev *devlist = nullptr; + char lanaddr[64]; + + int error = 0; +#if MINIUPNPC_API_VERSION < 14 + devlist = upnpDiscover(2000, multicastif, minissdpdpath, 0, 0, &error); +#else + devlist = upnpDiscover(2000, multicastif, minissdpdpath, 0, 0, 2, &error); +#endif + + struct UPNPUrls urls; + struct IGDdatas data; + int r; + + r = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr)); + if (r == 1) { + if (fDiscover) { + char externalIPAddress[40]; + r = UPNP_GetExternalIPAddress( + urls.controlURL, data.first.servicetype, externalIPAddress); + if (r != UPNPCOMMAND_SUCCESS) { + LogPrintf("UPnP: GetExternalIPAddress() returned %d\n", r); + } else { + if (externalIPAddress[0]) { + CNetAddr resolved; + if (LookupHost(externalIPAddress, resolved, false)) { + LogPrintf("UPnP: ExternalIPAddress = %s\n", + resolved.ToString()); + AddLocal(resolved, LOCAL_UPNP); + } + } else { + LogPrintf("UPnP: GetExternalIPAddress failed.\n"); + } + } + } + + std::string strDesc = PACKAGE_NAME " " + FormatFullVersion(); + + do { + r = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype, + port.c_str(), port.c_str(), lanaddr, + strDesc.c_str(), "TCP", 0, "0"); + + if (r != UPNPCOMMAND_SUCCESS) { + LogPrintf( + "AddPortMapping(%s, %s, %s) failed with code %d (%s)\n", + port, port, lanaddr, r, strupnperror(r)); + } else { + LogPrintf("UPnP Port Mapping successful.\n"); + } + } while (g_upnp_interrupt.sleep_for(std::chrono::minutes(20))); + + r = UPNP_DeletePortMapping(urls.controlURL, data.first.servicetype, + port.c_str(), "TCP", 0); + LogPrintf("UPNP_DeletePortMapping() returned: %d\n", r); + freeUPNPDevlist(devlist); + devlist = nullptr; + FreeUPNPUrls(&urls); + } else { + LogPrintf("No valid UPnP IGDs found\n"); + freeUPNPDevlist(devlist); + devlist = nullptr; + if (r != 0) { + FreeUPNPUrls(&urls); + } + } +} + +void StartMapPort() { + if (!g_upnp_thread.joinable()) { + assert(!g_upnp_interrupt); + g_upnp_thread = std::thread(&util::TraceThread, "upnp", &ThreadMapPort); + } +} + +void InterruptMapPort() { + if (g_upnp_thread.joinable()) { + g_upnp_interrupt(); + } +} + +void StopMapPort() { + if (g_upnp_thread.joinable()) { + g_upnp_thread.join(); + g_upnp_interrupt.reset(); + } +} + +#else +void StartMapPort() { + // Intentionally left blank. +} +void InterruptMapPort() { + // Intentionally left blank. +} +void StopMapPort() { + // Intentionally left blank. +} +#endif diff --git a/src/net.h b/src/net.h --- a/src/net.h +++ b/src/net.h @@ -83,12 +83,6 @@ static const int MAX_FEELER_CONNECTIONS = 1; /** -listen default */ static const bool DEFAULT_LISTEN = true; -/** -upnp default */ -#ifdef USE_UPNP -static const bool DEFAULT_UPNP = USE_UPNP; -#else -static const bool DEFAULT_UPNP = false; -#endif /** * The maximum number of peer connections to maintain. * This quantity might not be reachable on some systems, especially on platforms @@ -224,9 +218,6 @@ }; void Discover(); -void StartMapPort(); -void InterruptMapPort(); -void StopMapPort(); uint16_t GetListenPort(); enum { diff --git a/src/net.cpp b/src/net.cpp --- a/src/net.cpp +++ b/src/net.cpp @@ -39,16 +39,6 @@ #include #endif -#ifdef USE_UPNP -#include -#include -#include -// The minimum supported miniUPnPc API version is set to 10. This keeps -// compatibility with Ubuntu 16.04 LTS and Debian 8 libminiupnpc-dev packages. -static_assert(MINIUPNPC_API_VERSION >= 10, - "miniUPnPc API version >= 10 assumed"); -#endif - #include #include #include @@ -1926,113 +1916,6 @@ condMsgProc.notify_one(); } -#ifdef USE_UPNP -static CThreadInterrupt g_upnp_interrupt; -static std::thread g_upnp_thread; -static void ThreadMapPort() { - std::string port = strprintf("%u", GetListenPort()); - const char *multicastif = nullptr; - const char *minissdpdpath = nullptr; - struct UPNPDev *devlist = nullptr; - char lanaddr[64]; - - int error = 0; -#if MINIUPNPC_API_VERSION < 14 - devlist = upnpDiscover(2000, multicastif, minissdpdpath, 0, 0, &error); -#else - devlist = upnpDiscover(2000, multicastif, minissdpdpath, 0, 0, 2, &error); -#endif - - struct UPNPUrls urls; - struct IGDdatas data; - int r; - - r = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr)); - if (r == 1) { - if (fDiscover) { - char externalIPAddress[40]; - r = UPNP_GetExternalIPAddress( - urls.controlURL, data.first.servicetype, externalIPAddress); - if (r != UPNPCOMMAND_SUCCESS) { - LogPrintf("UPnP: GetExternalIPAddress() returned %d\n", r); - } else { - if (externalIPAddress[0]) { - CNetAddr resolved; - if (LookupHost(externalIPAddress, resolved, false)) { - LogPrintf("UPnP: ExternalIPAddress = %s\n", - resolved.ToString()); - AddLocal(resolved, LOCAL_UPNP); - } - } else { - LogPrintf("UPnP: GetExternalIPAddress failed.\n"); - } - } - } - - std::string strDesc = PACKAGE_NAME " " + FormatFullVersion(); - - do { - r = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype, - port.c_str(), port.c_str(), lanaddr, - strDesc.c_str(), "TCP", 0, "0"); - - if (r != UPNPCOMMAND_SUCCESS) { - LogPrintf( - "AddPortMapping(%s, %s, %s) failed with code %d (%s)\n", - port, port, lanaddr, r, strupnperror(r)); - } else { - LogPrintf("UPnP Port Mapping successful.\n"); - } - } while (g_upnp_interrupt.sleep_for(std::chrono::minutes(20))); - - r = UPNP_DeletePortMapping(urls.controlURL, data.first.servicetype, - port.c_str(), "TCP", 0); - LogPrintf("UPNP_DeletePortMapping() returned: %d\n", r); - freeUPNPDevlist(devlist); - devlist = nullptr; - FreeUPNPUrls(&urls); - } else { - LogPrintf("No valid UPnP IGDs found\n"); - freeUPNPDevlist(devlist); - devlist = nullptr; - if (r != 0) { - FreeUPNPUrls(&urls); - } - } -} - -void StartMapPort() { - if (!g_upnp_thread.joinable()) { - assert(!g_upnp_interrupt); - g_upnp_thread = std::thread(&util::TraceThread, "upnp", &ThreadMapPort); - } -} - -void InterruptMapPort() { - if (g_upnp_thread.joinable()) { - g_upnp_interrupt(); - } -} - -void StopMapPort() { - if (g_upnp_thread.joinable()) { - g_upnp_thread.join(); - g_upnp_interrupt.reset(); - } -} - -#else -void StartMapPort() { - // Intentionally left blank. -} -void InterruptMapPort() { - // Intentionally left blank. -} -void StopMapPort() { - // Intentionally left blank. -} -#endif - void CConnman::ThreadDNSAddressSeed() { FastRandomContext rng; std::vector seeds = diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp --- a/src/qt/optionsmodel.cpp +++ b/src/qt/optionsmodel.cpp @@ -9,6 +9,7 @@ #include #include +#include #include #include #include