This commit is contained in:
Antoine Poinsot 2025-01-08 20:46:49 +01:00 committed by GitHub
commit f7ca73d7b7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 10 additions and 61 deletions

View file

@ -121,7 +121,7 @@ public:
virtual void resetSettings() = 0;
//! Map port.
virtual void mapPort(bool use_pcp) = 0;
virtual void mapPort(bool enable) = 0;
//! Get proxy.
virtual bool getProxy(Network net, Proxy& proxy_info) = 0;

View file

@ -25,14 +25,12 @@
static CThreadInterrupt g_mapport_interrupt;
static std::thread g_mapport_thread;
static std::atomic_uint g_mapport_enabled_protos{MapPortProtoFlag::NONE};
static std::atomic<MapPortProtoFlag> g_mapport_current_proto{MapPortProtoFlag::NONE};
using namespace std::chrono_literals;
static constexpr auto PORT_MAPPING_REANNOUNCE_PERIOD{20min};
static constexpr auto PORT_MAPPING_RETRY_PERIOD{5min};
static bool ProcessPCP()
static void ProcessPCP()
{
// The same nonce is used for all mappings, this is allowed by the spec, and simplifies keeping track of them.
PCPMappingNonce pcp_nonce;
@ -108,7 +106,7 @@ static bool ProcessPCP()
// Sanity-check returned lifetime.
if (actual_lifetime < 30) {
LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "portmap: Got impossibly short mapping lifetime of %d seconds\n", actual_lifetime);
return false;
return;
}
// RFC6887 11.2.1 recommends that clients send their first renewal packet at a time chosen with uniform random
// distribution in the range 1/2 to 5/8 of expiration time.
@ -119,28 +117,13 @@ static bool ProcessPCP()
// We don't delete the mappings when the thread is interrupted because this would add additional complexity, so
// we rather just choose a fairly short expiry time.
return ret;
}
static void ThreadMapPort()
{
bool ok;
do {
ok = false;
if (g_mapport_enabled_protos & MapPortProtoFlag::PCP) {
g_mapport_current_proto = MapPortProtoFlag::PCP;
ok = ProcessPCP();
if (ok) continue;
}
g_mapport_current_proto = MapPortProtoFlag::NONE;
if (g_mapport_enabled_protos == MapPortProtoFlag::NONE) {
return;
}
} while (ok || g_mapport_interrupt.sleep_for(PORT_MAPPING_RETRY_PERIOD));
ProcessPCP();
} while (g_mapport_interrupt.sleep_for(PORT_MAPPING_RETRY_PERIOD));
}
void StartThreadMapPort()
@ -151,46 +134,18 @@ void StartThreadMapPort()
}
}
static void DispatchMapPort()
void StartMapPort(bool enable)
{
if (g_mapport_current_proto == MapPortProtoFlag::NONE && g_mapport_enabled_protos == MapPortProtoFlag::NONE) {
return;
}
if (g_mapport_current_proto == MapPortProtoFlag::NONE && g_mapport_enabled_protos != MapPortProtoFlag::NONE) {
if (enable) {
StartThreadMapPort();
return;
}
if (g_mapport_current_proto != MapPortProtoFlag::NONE && g_mapport_enabled_protos == MapPortProtoFlag::NONE) {
} else {
InterruptMapPort();
StopMapPort();
return;
}
if (g_mapport_enabled_protos & g_mapport_current_proto) {
return;
}
}
static void MapPortProtoSetEnabled(MapPortProtoFlag proto, bool enabled)
{
if (enabled) {
g_mapport_enabled_protos |= proto;
} else {
g_mapport_enabled_protos &= ~proto;
}
}
void StartMapPort(bool use_pcp)
{
MapPortProtoSetEnabled(MapPortProtoFlag::PCP, use_pcp);
DispatchMapPort();
}
void InterruptMapPort()
{
g_mapport_enabled_protos = MapPortProtoFlag::NONE;
if (g_mapport_thread.joinable()) {
g_mapport_interrupt();
}

View file

@ -7,13 +7,7 @@
static constexpr bool DEFAULT_NATPMP = false;
enum MapPortProtoFlag : unsigned int {
NONE = 0x00,
// 0x01 was for UPnP, for which we dropped support.
PCP = 0x02, // PCP with NAT-PMP fallback.
};
void StartMapPort(bool use_pcp);
void StartMapPort(bool enable);
void InterruptMapPort();
void StopMapPort();

View file

@ -187,7 +187,7 @@ public:
});
args().WriteSettingsFile();
}
void mapPort(bool use_pcp) override { StartMapPort(use_pcp); }
void mapPort(bool enable) override { StartMapPort(enable); }
bool getProxy(Network net, Proxy& proxy_info) override { return GetProxy(net, proxy_info); }
size_t getNodeCount(ConnectionDirection flags) override
{