Skip to content

Commit 491ece7

Browse files
committed
Tweaks to UPnP and NAT-PMP detection
1 parent 2c1d346 commit 491ece7

2 files changed

Lines changed: 56 additions & 7 deletions

File tree

GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/NGMP_Helpers.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ void NetworkLog(const char* fmt, ...)
4747
logFile.close();
4848

4949
#if defined(GENERALS_ONLINE_BRANCH_JMARSHALL)
50-
DevConsole.AddLog(buffer);
50+
DevConsole.AddLog(strLogBuffer.c_str());
5151
#endif
5252

53-
OutputDebugString(buffer);
53+
OutputDebugString(strLogBuffer.c_str());
5454
OutputDebugString("\n");
5555
}

GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/PortMapper.cpp

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -202,9 +202,13 @@ void PortMapper::BackgroundThreadRun()
202202

203203
// TODO_NGMP: Do this on a background thread?
204204

205+
int64_t startTime = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::utc_clock::now().time_since_epoch()).count();
206+
205207
// UPnP
206208
int errorCode = 0;
207-
m_pCachedUPnPDevice = upnpDiscover(2000, nullptr, nullptr, 0, 0, 2, &errorCode);
209+
m_pCachedUPnPDevice = upnpDiscover(0, nullptr, nullptr, 0, 0, 2, &errorCode);
210+
211+
NetworkLog("[PortMapper]: UPnP device result: %d (errcode: %d)", m_pCachedUPnPDevice, errorCode);
208212

209213
char lan_address[64];
210214
char wan_address[64];
@@ -214,9 +218,25 @@ void PortMapper::BackgroundThreadRun()
214218

215219
m_capUPnP = (IGDStatus == 1) ? ECapabilityState::SUPPORTED : ECapabilityState::UNSUPPORTED;
216220

217-
NetworkLog("[PortMapper]: UPnP result: %d", m_capUPnP);
221+
NetworkLog("[PortMapper]: UPnP result: %s (LAN: %s, WAN: %s, Control URI)", m_capUPnP == ECapabilityState::SUPPORTED ? "Supported" : "Unsupported", lan_address, wan_address);
222+
NetworkLog("[PortMapper]: UPnP controlURL URI: %s", upnp_urls.controlURL);
223+
NetworkLog("[PortMapper]: UPnP ipcondescURL URI: %s", upnp_urls.ipcondescURL);
224+
NetworkLog("[PortMapper]: UPnP controlURL_CIF URI: %s", upnp_urls.controlURL_CIF);
225+
NetworkLog("[PortMapper]: UPnP controlURL_6FC URI: %s", upnp_urls.controlURL_6FC);
226+
NetworkLog("[PortMapper]: UPnP rootdescURL URI: %s", upnp_urls.rootdescURL);
227+
NetworkLog("[PortMapper]: UPnP cureltname URI: %s", upnp_data.cureltname);
228+
NetworkLog("[PortMapper]: UPnP urlbase URI: %s", upnp_data.urlbase);
229+
NetworkLog("[PortMapper]: UPnP presentationurl URI: %s", upnp_data.presentationurl);
230+
NetworkLog("[PortMapper]: UPnP cureltname URI: %s", upnp_data.cureltname);
231+
NetworkLog("[PortMapper]: UPnP cureltname URI: %s", upnp_data.cureltname);
232+
NetworkLog("[PortMapper]: UPnP cureltname URI: %s", upnp_data.cureltname);
233+
234+
int64_t endTime = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::utc_clock::now().time_since_epoch()).count();
235+
NetworkLog("[PortMapper]: UPnP took: %lld ms", endTime- startTime);
218236

219237
// NAT-PMP
238+
startTime = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::utc_clock::now().time_since_epoch()).count();
239+
220240
int res;
221241
natpmp_t natpmp;
222242
natpmpresp_t response;
@@ -229,18 +249,41 @@ void PortMapper::BackgroundThreadRun()
229249
struct timeval timeout;
230250
FD_ZERO(&fds);
231251
FD_SET(natpmp.s, &fds);
252+
232253
getnatpmprequesttimeout(&natpmp, &timeout);
233254
select(FD_SETSIZE, &fds, NULL, NULL, &timeout);
234255
res = readnatpmpresponseorretry(&natpmp, &response);
235-
} while (res == NATPMP_TRYAGAIN);
256+
257+
if (res == NATPMP_TRYAGAIN)
258+
{
259+
NetworkLog("[PortMapper]: NAT-PMP asked for try again");
260+
}
261+
262+
int64_t currTime = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::utc_clock::now().time_since_epoch()).count();
263+
int64_t timeSpentInNATPMP = currTime - startTime;
264+
265+
const int natpmpTimeout = 2000;
266+
if (timeSpentInNATPMP >= natpmpTimeout)
267+
{
268+
NetworkLog("[PortMapper]: NAT-PMP timeout reached, bailing");
269+
break;
270+
}
271+
}
272+
while (res == NATPMP_TRYAGAIN);
236273

237274
closenatpmp(&natpmp);
238275

276+
endTime = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::utc_clock::now().time_since_epoch()).count();
277+
NetworkLog("[PortMapper]: NAT-PMP took: %lld ms", endTime - startTime);
278+
239279
m_capNATPMP = (res == NATPMP_RESPTYPE_PUBLICADDRESS) ? ECapabilityState::SUPPORTED : ECapabilityState::UNSUPPORTED;;
240-
NetworkLog("[PortMapper]: NAT-PMP result: %d", m_capNATPMP);
280+
NetworkLog("[PortMapper]: NAT-PMP result: %s (%d)", m_capNATPMP == ECapabilityState::SUPPORTED ? "Supported" : "Unsupported", m_capNATPMP);
241281

242282
// open ports
283+
startTime = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::utc_clock::now().time_since_epoch()).count();
243284
TryForwardPreferredPorts();
285+
endTime = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::utc_clock::now().time_since_epoch()).count();
286+
NetworkLog("[PortMapper]: TryForwardPreferredPorts took: %lld ms", endTime - startTime);
244287

245288
m_bPortMapperWorkComplete.store(true);
246289
NetworkLog("[PortMapper] Background thread work is done");
@@ -292,6 +335,12 @@ void PortMapper::TryForwardPreferredPorts()
292335

293336
NetworkLog("PortMapper: Attempting to open ext port %d and forward to local port %d", m_PreferredPort, m_PreferredPort);
294337

338+
if (m_capUPnP != ECapabilityState::SUPPORTED && m_capNATPMP != ECapabilityState::SUPPORTED)
339+
{
340+
NetworkLog("PortMapper: No port mappers are supported.");
341+
return;
342+
}
343+
295344
// TODO_NGMP: If everything fails, try a new port?
296345

297346
// TODO_NGMP: Handle state where we are too early
@@ -442,7 +491,7 @@ bool PortMapper::ForwardPreferredPort_UPnP()
442491
}
443492

444493
// NOTE: dont hard fail here. not finding an exact match might be OK, some routers mangle data etc
445-
NetworkLog("PortMapper: UPnP Mapping was not validated on router");
494+
NetworkLog("PortMapper: UPnP Mapping was not validated on router, this is likely OK");
446495
m_bHasPortOpenedViaUPNP = true;
447496

448497
return true;

0 commit comments

Comments
 (0)