forked from dashpay/dash
-
Notifications
You must be signed in to change notification settings - Fork 718
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor: Move port mapping code to its own module
This commit does not change behavior.
- Loading branch information
Showing
8 changed files
with
163 additions
and
124 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,138 @@ | ||
// Copyright (c) 2011-2020 The Bitcoin Core developers | ||
// Copyright (c) 2021 The PIVX 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 "config/pivx-config.h" | ||
#endif | ||
|
||
#include "mapport.h" | ||
|
||
#include "clientversion.h" | ||
#include "logging.h" | ||
#include "net.h" | ||
#include "netaddress.h" | ||
#include "netbase.h" | ||
#include "threadinterrupt.h" | ||
#include "util/system.h" | ||
|
||
#ifdef USE_UPNP | ||
#include <miniupnpc/miniupnpc.h> | ||
#include <miniupnpc/upnpcommands.h> | ||
#include <miniupnpc/upnperrors.h> | ||
// 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 <cassert> | ||
#include <chrono> | ||
#include <functional> | ||
#include <string> | ||
#include <thread> | ||
|
||
#ifdef USE_UPNP | ||
static CThreadInterrupt g_upnp_interrupt; | ||
static std::thread g_upnp_thread; | ||
void ThreadMapPort() | ||
{ | ||
std::string port = strprintf("%u", GetListenPort()); | ||
const char* multicastif = 0; | ||
const char* minissdpdpath = 0; | ||
struct UPNPDev* devlist = 0; | ||
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().c_str()); | ||
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 = 0; | ||
if (r != 0) | ||
FreeUPNPUrls(&urls); | ||
} | ||
} | ||
|
||
void StartMapPort() | ||
{ | ||
if (!g_upnp_thread.joinable()) { | ||
assert(!g_upnp_interrupt); | ||
g_upnp_thread = std::thread(std::bind(&TraceThread<void (*)()>, "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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
// Copyright (c) 2011-2020 The Bitcoin Core developers | ||
// Copyright (c) 2021 The PIVX developers | ||
// Distributed under the MIT software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
#ifndef PIVX_MAPPORT_H | ||
#define PIVX_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 //PIVX_MAPPORT_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters