Changeset View
Changeset View
Standalone View
Standalone View
src/net.cpp
Show First 20 Lines • Show All 1,530 Lines • ▼ Show 20 Lines | void CConnman::WakeMessageHandler() { | ||||
{ | { | ||||
std::lock_guard<std::mutex> lock(mutexMsgProc); | std::lock_guard<std::mutex> lock(mutexMsgProc); | ||||
fMsgProcWake = true; | fMsgProcWake = true; | ||||
} | } | ||||
condMsgProc.notify_one(); | condMsgProc.notify_one(); | ||||
} | } | ||||
#ifdef USE_UPNP | #ifdef USE_UPNP | ||||
static CThreadInterrupt g_upnp_interrupt; | |||||
static std::thread g_upnp_thread; | |||||
void ThreadMapPort() { | void ThreadMapPort() { | ||||
std::string port = strprintf("%u", GetListenPort()); | std::string port = strprintf("%u", GetListenPort()); | ||||
const char *multicastif = 0; | const char *multicastif = 0; | ||||
const char *minissdpdpath = 0; | const char *minissdpdpath = 0; | ||||
struct UPNPDev *devlist = 0; | struct UPNPDev *devlist = 0; | ||||
char lanaddr[64]; | char lanaddr[64]; | ||||
#ifndef UPNPDISCOVER_SUCCESS | #ifndef UPNPDISCOVER_SUCCESS | ||||
Show All 32 Lines | if (r == 1) { | ||||
} else { | } else { | ||||
LogPrintf("UPnP: GetExternalIPAddress failed.\n"); | LogPrintf("UPnP: GetExternalIPAddress failed.\n"); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
std::string strDesc = "Bitcoin " + FormatFullVersion(); | std::string strDesc = "Bitcoin " + FormatFullVersion(); | ||||
try { | do { | ||||
while (true) { | |||||
#ifndef UPNPDISCOVER_SUCCESS | #ifndef UPNPDISCOVER_SUCCESS | ||||
/* miniupnpc 1.5 */ | /* miniupnpc 1.5 */ | ||||
r = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype, | r = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype, | ||||
port.c_str(), port.c_str(), lanaddr, | port.c_str(), port.c_str(), lanaddr, | ||||
strDesc.c_str(), "TCP", 0); | strDesc.c_str(), "TCP", 0); | ||||
#else | #else | ||||
/* miniupnpc 1.6 */ | /* miniupnpc 1.6 */ | ||||
r = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype, | r = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype, | ||||
port.c_str(), port.c_str(), lanaddr, | port.c_str(), port.c_str(), lanaddr, | ||||
strDesc.c_str(), "TCP", 0, "0"); | strDesc.c_str(), "TCP", 0, "0"); | ||||
#endif | #endif | ||||
if (r != UPNPCOMMAND_SUCCESS) { | if (r != UPNPCOMMAND_SUCCESS) { | ||||
LogPrintf( | LogPrintf( | ||||
"AddPortMapping(%s, %s, %s) failed with code %d (%s)\n", | "AddPortMapping(%s, %s, %s) failed with code %d (%s)\n", | ||||
port, port, lanaddr, r, strupnperror(r)); | port, port, lanaddr, r, strupnperror(r)); | ||||
} else { | } else { | ||||
LogPrintf("UPnP Port Mapping successful.\n"); | LogPrintf("UPnP Port Mapping successful.\n"); | ||||
} | } | ||||
// Refresh every 20 minutes | |||||
MilliSleep(20 * 60 * 1000); | |||||
} | } | ||||
} catch (const boost::thread_interrupted &) { | |||||
while (g_upnp_interrupt.sleep_for(std::chrono::minutes(20))); | |||||
r = UPNP_DeletePortMapping(urls.controlURL, data.first.servicetype, | r = UPNP_DeletePortMapping(urls.controlURL, data.first.servicetype, | ||||
port.c_str(), "TCP", 0); | port.c_str(), "TCP", 0); | ||||
LogPrintf("UPNP_DeletePortMapping() returned: %d\n", r); | LogPrintf("UPNP_DeletePortMapping() returned: %d\n", r); | ||||
freeUPNPDevlist(devlist); | freeUPNPDevlist(devlist); | ||||
devlist = 0; | devlist = nullptr; | ||||
FreeUPNPUrls(&urls); | FreeUPNPUrls(&urls); | ||||
throw; | |||||
} | |||||
} else { | } else { | ||||
LogPrintf("No valid UPnP IGDs found\n"); | LogPrintf("No valid UPnP IGDs found\n"); | ||||
freeUPNPDevlist(devlist); | freeUPNPDevlist(devlist); | ||||
devlist = 0; | devlist = 0; | ||||
if (r != 0) { | if (r != 0) { | ||||
FreeUPNPUrls(&urls); | FreeUPNPUrls(&urls); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
void MapPort(bool fUseUPnP) { | void StartMapPort() { | ||||
static boost::thread *upnp_thread = nullptr; | 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(); | |||||
} | |||||
} | |||||
if (fUseUPnP) { | void StopMapPort() { | ||||
if (upnp_thread) { | if (g_upnp_thread.joinable()) { | ||||
upnp_thread->interrupt(); | g_upnp_thread.join(); | ||||
upnp_thread->join(); | g_upnp_interrupt.reset(); | ||||
delete upnp_thread; | |||||
} | |||||
upnp_thread = new boost::thread( | |||||
boost::bind(&TraceThread<void (*)()>, "upnp", &ThreadMapPort)); | |||||
} else if (upnp_thread) { | |||||
upnp_thread->interrupt(); | |||||
upnp_thread->join(); | |||||
delete upnp_thread; | |||||
upnp_thread = nullptr; | |||||
} | } | ||||
} | } | ||||
#else | #else | ||||
void MapPort(bool) { | void StartMapPort() { | ||||
// Intentionally left blank. | |||||
} | |||||
void InterruptMapPort() { | |||||
// Intentionally left blank. | |||||
} | |||||
void StopMapPort() { | |||||
// Intentionally left blank. | // Intentionally left blank. | ||||
} | } | ||||
#endif | #endif | ||||
static std::string GetDNSHost(const CDNSSeedData &data, | static std::string GetDNSHost(const CDNSSeedData &data, | ||||
ServiceFlags *requiredServiceBits) { | ServiceFlags *requiredServiceBits) { | ||||
// use default host for non-filter-capable seeds or if we use the default | // use default host for non-filter-capable seeds or if we use the default | ||||
// service bits (NODE_NETWORK) | // service bits (NODE_NETWORK) | ||||
▲ Show 20 Lines • Show All 1,448 Lines • Show Last 20 Lines |