@@ -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