Skip to content

Commit 8b50d1b

Browse files
committed
net: Keep trying to use UPnP when -upnp=1
1 parent 28e2961 commit 8b50d1b

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

src/mapport.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,11 @@ static std::thread g_upnp_thread;
3737

3838
using namespace std::chrono_literals;
3939
static constexpr auto PORT_MAPPING_REANNOUNCE_PERIOD{20min};
40+
static constexpr auto PORT_MAPPING_RETRY_PERIOD{5min};
4041

41-
static void ThreadMapPort()
42+
static bool ProcessUpnp()
4243
{
44+
bool ret = false;
4345
std::string port = strprintf("%u", GetListenPort());
4446
const char * multicastif = nullptr;
4547
const char * minissdpdpath = nullptr;
@@ -84,11 +86,15 @@ static void ThreadMapPort()
8486
r = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype, port.c_str(), port.c_str(), lanaddr, strDesc.c_str(), "TCP", 0, "0");
8587

8688
if (r != UPNPCOMMAND_SUCCESS) {
89+
ret = false;
8790
LogPrintf("AddPortMapping(%s, %s, %s) failed with code %d (%s)\n", port, port, lanaddr, r, strupnperror(r));
91+
break;
8892
} else {
93+
ret = true;
8994
LogPrintf("UPnP Port Mapping successful.\n");
9095
}
9196
} while (g_upnp_interrupt.sleep_for(PORT_MAPPING_REANNOUNCE_PERIOD));
97+
g_upnp_interrupt.reset();
9298

9399
r = UPNP_DeletePortMapping(urls.controlURL, data.first.servicetype, port.c_str(), "TCP", 0);
94100
LogPrintf("UPNP_DeletePortMapping() returned: %d\n", r);
@@ -100,6 +106,15 @@ static void ThreadMapPort()
100106
if (r != 0)
101107
FreeUPNPUrls(&urls);
102108
}
109+
110+
return ret;
111+
}
112+
113+
static void ThreadMapPort()
114+
{
115+
do {
116+
if (ProcessUpnp()) return;
117+
} while (g_upnp_interrupt.sleep_for(PORT_MAPPING_RETRY_PERIOD));
103118
}
104119

105120
void StartMapPort()

0 commit comments

Comments
 (0)