diff --git a/libretro-common/include/net/net_natt.h b/libretro-common/include/net/net_natt.h index 74ca3164ac..8634dc3e73 100644 --- a/libretro-common/include/net/net_natt.h +++ b/libretro-common/include/net/net_natt.h @@ -62,7 +62,8 @@ struct natt_status /** * Initialize global NAT traversal structures (must be called once to use other * functions) */ -void natt_init(void); +void natt_init(struct natt_status *status, + uint16_t port, enum socket_protocol proto); /** Initialize a NAT traversal status object */ bool natt_new(struct natt_status *status); diff --git a/libretro-common/net/net_natt.c b/libretro-common/net/net_natt.c index c8ce68761f..a345af98dc 100644 --- a/libretro-common/net/net_natt.c +++ b/libretro-common/net/net_natt.c @@ -47,7 +47,13 @@ static struct UPNPUrls urls; static struct IGDdatas data; #endif -void natt_init(void) +/* + natt_open_port_any(ntsd->nat_traversal_state, + ntsd->port, SOCKET_PROTOCOL_TCP); +*/ + +void natt_init(struct natt_status *status, + uint16_t port, enum socket_protocol proto) { #ifndef HAVE_SOCKET_LEGACY #if HAVE_MINIUPNPC @@ -56,8 +62,6 @@ void natt_init(void) char * descXML; int descXMLsize = 0; int upnperror = 0; - memset(&urls, 0, sizeof(struct UPNPUrls)); - memset(&data, 0, sizeof(struct IGDdatas)); devlist = upnpDiscover(2000, NULL, NULL, 0, 0, 2, &upnperror); if (devlist) { @@ -65,22 +69,27 @@ void natt_init(void) while (dev) { if (strstr (dev->st, "InternetGatewayDevice")) - break; + { + memset(&urls, 0, sizeof(struct UPNPUrls)); + memset(&data, 0, sizeof(struct IGDdatas)); + descXML = (char *) miniwget(dev->descURL, &descXMLsize, 0, NULL); + if (descXML) + { + parserootdesc(descXML, descXMLsize, &data); + free (descXML); + descXML = 0; + + GetUPNPUrls (&urls, &data, dev->descURL, 0); + } + if(natt_open_port_any(status, port, proto)) + goto end; + + } dev = dev->pNext; } - if (!dev) - dev = devlist; - - descXML = (char *) miniwget(dev->descURL, &descXMLsize, 0, NULL); - if (descXML) - { - parserootdesc(descXML, descXMLsize, &data); - free (descXML); - descXML = 0; - GetUPNPUrls (&urls, &data, dev->descURL, 0); - } - freeUPNPDevlist(devlist); } +end: + freeUPNPDevlist(devlist); #endif #endif } diff --git a/tasks/task_netplay_nat_traversal.c b/tasks/task_netplay_nat_traversal.c index b645ef93d0..4068072df5 100644 --- a/tasks/task_netplay_nat_traversal.c +++ b/tasks/task_netplay_nat_traversal.c @@ -51,11 +51,8 @@ static void task_netplay_nat_traversal_handler(retro_task_t *task) struct nat_traversal_state_data *ntsd = (struct nat_traversal_state_data *) task->task_data; - natt_init(); - if (natt_new(ntsd->nat_traversal_state)) - natt_open_port_any(ntsd->nat_traversal_state, - ntsd->port, SOCKET_PROTOCOL_TCP); + natt_init(ntsd->nat_traversal_state, ntsd->port, SOCKET_PROTOCOL_TCP); task_set_progress(task, 100); task_set_finished(task, true);