diff --git a/libretro-common/include/net/net_natt.h b/libretro-common/include/net/net_natt.h index 0b66ecdc5d..78bb239fc3 100644 --- a/libretro-common/include/net/net_natt.h +++ b/libretro-common/include/net/net_natt.h @@ -34,13 +34,13 @@ struct natt_status { /* True if we've resolved an external IPv4 address */ bool have_inet4; + /* External IPv4 address */ + struct sockaddr_in ext_inet4_addr; + +#if defined(AF_INET6) && !defined(HAVE_SOCKET_LEGACY) && !defined(_3DS) /* True if we've resolved an external IPv6 address */ bool have_inet6; - - /** External IPv4 address */ - struct sockaddr_in ext_inet4_addr; -#if defined(AF_INET6) && !defined(HAVE_SOCKET_LEGACY) && !defined(_3DS) - /** External IPv6 address */ + /* External IPv6 address */ struct sockaddr_in6 ext_inet6_addr; #endif }; diff --git a/libretro-common/net/net_natt.c b/libretro-common/net/net_natt.c index 6000d15593..94fc6cb2ed 100644 --- a/libretro-common/net/net_natt.c +++ b/libretro-common/net/net_natt.c @@ -173,7 +173,7 @@ static bool natt_open_port(struct natt_status *status, memcpy(&status->ext_inet4_addr, ext_addrinfo->ai_addr, sizeof(status->ext_inet4_addr)); } -#if defined(AF_INET6) && !defined(HAVE_SOCKET_LEGACY) +#if defined(AF_INET6) && !defined(_3DS) else if (ext_addrinfo->ai_family == AF_INET6 && ext_addrinfo->ai_addrlen >= sizeof(status->ext_inet6_addr)) { @@ -212,7 +212,6 @@ bool natt_open_port_any(struct natt_status *status, struct addrinfo *addr; char port_str[6]; struct addrinfo hints = {0}; - bool ret = false; /* get our interfaces */ if (!net_ifinfo_new(&list)) @@ -225,8 +224,11 @@ bool natt_open_port_any(struct natt_status *status, struct net_ifinfo_entry *entry = &list.entries[i]; /* ignore localhost */ - if (string_is_equal(entry->host, "127.0.0.1") || - string_is_equal(entry->host, "::1")) + if (string_is_equal(entry->host, "127.0.0.1")) + continue; + + /* ignore IPv6 for now */ + if (strchr(entry->host, ':')) continue; addr = NULL; @@ -237,17 +239,20 @@ bool natt_open_port_any(struct natt_status *status, /* make a request for this host */ if (natt_open_port(status, addr->ai_addr, addr->ai_addrlen, proto)) - ret = true; + { + freeaddrinfo_retro(addr); + net_ifinfo_free(&list); + + return true; + } freeaddrinfo_retro(addr); } net_ifinfo_free(&list); - - return ret; -#else - return false; #endif + + return false; } bool natt_close_port(struct natt_status *status, @@ -272,11 +277,13 @@ bool natt_close_port(struct natt_status *status, addr = (struct sockaddr *) &status->ext_inet4_addr; addrlen = sizeof(status->ext_inet4_addr); } +#if defined(AF_INET6) && !defined(_3DS) else if (status->have_inet6) { addr = (struct sockaddr *) &status->ext_inet6_addr; addrlen = sizeof(status->ext_inet6_addr); } +#endif else return false;