diff --git a/src/i_tcp.c b/src/i_tcp.c index 387cf4f5ebbf13a74b597c0c9415be8e5e16e09a..05e678acdc4ad1665a98ad0ba8f7f470a3c28b40 100644 --- a/src/i_tcp.c +++ b/src/i_tcp.c @@ -268,23 +268,24 @@ static const char* inet_ntopA(short af, const void *cp, char *buf, socklen_t len #endif #ifdef HAVE_MINIUPNPC // based on old XChat patch +static void I_ShutdownUPnP(void); static struct UPNPUrls urls; static struct IGDdatas data; static char lanaddr[64]; -static void I_ShutdownUPnP(void) -{ - FreeUPNPUrls(&urls); -} - static inline void I_InitUPnP(void) { + const char * const deviceTypes[] = { + "urn:schemas-upnp-org:device:InternetGatewayDevice:2", + "urn:schemas-upnp-org:device:InternetGatewayDevice:1", + 0 + }; struct UPNPDev * devlist = NULL; int upnp_error = -2; int scope_id = 0; int status_code = 0; CONS_Printf(M_GetText("Looking for UPnP Internet Gateway Device\n")); - devlist = upnpDiscover(2000, NULL, NULL, 0, false, 2, &upnp_error); + devlist = upnpDiscoverDevices(deviceTypes, 500, NULL, NULL, 0, false, 2, &upnp_error, 0); if (devlist) { struct UPNPDev *dev = devlist; @@ -340,6 +341,12 @@ static inline void I_UPnP_rem(const char *port, const char * servicetype) UPNP_DeletePortMapping(urls.controlURL, data.first.servicetype, port, servicetype, NULL); } + +static void I_ShutdownUPnP(void) +{ + I_UPnP_rem(serverport_name, "UDP"); + FreeUPNPUrls(&urls); +} #endif static const char *SOCK_AddrToStr(mysockaddr_t *sk) @@ -1130,10 +1137,10 @@ boolean I_InitTcpDriver(void) { I_AddExitFunc(I_ShutdownTcpDriver); #ifdef HAVE_MINIUPNPC - if (M_CheckParm("-useUPnP")) - I_InitUPnP(); - else + if (M_CheckParm("-noUPnP")) UPNP_support = false; + else + I_InitUPnP(); #endif } return init_tcp_driver;