From a89840f309229da7a1860d3941984e1faa3bca58 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 17 Aug 2020 23:08:35 -0700 Subject: [PATCH] Net: Cut down on local IP aliasing. --- Core/HLE/proAdhoc.cpp | 22 +++++++++++----------- Core/HLE/proAdhoc.h | 7 ++++++- Core/HLE/proAdhocServer.cpp | 2 +- Core/HLE/sceNet.cpp | 12 ++++++------ 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index 681e11e493..6b9621c72a 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -76,7 +76,7 @@ bool updateChatScreen = false; int newChat = 0; bool isOriPort = false; bool isLocalServer = false; -sockaddr LocalhostIP; +SockAddrIN4 g_localhostIP; sockaddr LocalIP; int defaultWlanChannel = PSP_SYSTEMPARAM_ADHOC_CHANNEL_1; // Don't put 0(Auto) here, it needed to be a valid/actual channel number @@ -1535,7 +1535,7 @@ int getLocalIp(sockaddr_in* SocketAddress) { socklen_t addrLen = sizeof(localAddr); if (SOCKET_ERROR != getsockname(metasocket, (struct sockaddr*) & localAddr, &addrLen)) { if (isLocalServer) { - localAddr.sin_addr = ((sockaddr_in*)&LocalhostIP)->sin_addr; + localAddr.sin_addr = g_localhostIP.in.sin_addr; } SocketAddress->sin_addr = localAddr.sin_addr; return 0; @@ -1556,7 +1556,7 @@ int getLocalIp(sockaddr_in* SocketAddress) { if (pHost) { memcpy(&SocketAddress->sin_addr, pHost->h_addr_list[0], pHost->h_length); if (isLocalServer) { - SocketAddress->sin_addr = ((sockaddr_in*)&LocalhostIP)->sin_addr; + SocketAddress->sin_addr = g_localhostIP.in.sin_addr; } return 0; } @@ -1580,7 +1580,7 @@ int getLocalIp(sockaddr_in* SocketAddress) { } freeifaddrs(ifAddrStruct); if (isLocalServer) { - SocketAddress->sin_addr = ((sockaddr_in*)&LocalhostIP)->sin_addr; + SocketAddress->sin_addr = g_localhostIP.in.sin_addr; } return 0; } @@ -1606,7 +1606,7 @@ int getLocalIp(sockaddr_in* SocketAddress) { SocketAddress->sin_addr = name.sin_addr; // May be we should cache this so it doesn't need to use connect all the time, or even better cache it when connecting to adhoc server to get an accurate IP closesocket(sock); if (isLocalServer) { - SocketAddress->sin_addr = ((sockaddr_in*)&LocalhostIP)->sin_addr; + SocketAddress->sin_addr = g_localhostIP.in.sin_addr; } return 0; } @@ -1623,7 +1623,7 @@ uint32_t getLocalIp(int sock) { socklen_t addrLen = sizeof(localAddr); getsockname(sock, (struct sockaddr*)&localAddr, &addrLen); if (isLocalServer) { - localAddr.sin_addr = ((sockaddr_in*)&LocalhostIP)->sin_addr; + localAddr.sin_addr = g_localhostIP.in.sin_addr; } return localAddr.sin_addr.s_addr; } @@ -1843,12 +1843,12 @@ int initNetwork(SceNetAdhocctlAdhocId *adhoc_id){ setsockopt(metasocket, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on)); setsockopt(metasocket, SOL_SOCKET, SO_DONTROUTE, (const char*)&on, sizeof(on)); - ((struct sockaddr_in*) & LocalhostIP)->sin_port = 0; + g_localhostIP.in.sin_port = 0; // Bind Local Address to Socket - iResult = bind(metasocket, (struct sockaddr*) & LocalhostIP, sizeof(sockaddr)); + iResult = bind(metasocket, &g_localhostIP.addr, sizeof(sockaddr)); if (iResult == SOCKET_ERROR) { - ERROR_LOG(SCENET, "Bind to alternate localhost[%s] failed(%i).", inet_ntoa(((struct sockaddr_in*) & LocalhostIP)->sin_addr), iResult); - host->NotifyUserMessage(std::string(n->T("Failed to Bind Localhost IP")) + " " + inet_ntoa(((struct sockaddr_in*) & LocalhostIP)->sin_addr), 2.0, 0x0000ff); + ERROR_LOG(SCENET, "Bind to alternate localhost[%s] failed(%i).", inet_ntoa(g_localhostIP.in.sin_addr), iResult); + host->NotifyUserMessage(std::string(n->T("Failed to Bind Localhost IP")) + " " + inet_ntoa(g_localhostIP.in.sin_addr), 2.0, 0x0000ff); } } @@ -1917,7 +1917,7 @@ bool resolveIP(uint32_t ip, SceNetEtherAddr * mac) { getLocalIp(&addr); uint32_t localIp = addr.sin_addr.s_addr; - if (ip == localIp || ip == ((sockaddr_in*)&LocalhostIP)->sin_addr.s_addr){ + if (ip == localIp || ip == g_localhostIP.in.sin_addr.s_addr) { getLocalMac(mac); return true; } diff --git a/Core/HLE/proAdhoc.h b/Core/HLE/proAdhoc.h index e5d39745ee..4657700fbe 100644 --- a/Core/HLE/proAdhoc.h +++ b/Core/HLE/proAdhoc.h @@ -829,11 +829,16 @@ extern std::recursive_mutex peerlock; extern SceNetAdhocPdpStat * pdp[255]; extern SceNetAdhocPtpStat * ptp[255]; +union SockAddrIN4 { + sockaddr addr; + sockaddr_in in; +}; + extern uint16_t portOffset; extern uint32_t minSocketTimeoutUS; extern bool isOriPort; extern bool isLocalServer; -extern sockaddr LocalhostIP; // Used to differentiate localhost IP on multiple-instance +extern SockAddrIN4 g_localhostIP; // Used to differentiate localhost IP on multiple-instance extern sockaddr LocalIP; // IP of Network Adapter used to connect to Adhoc Server (LAN/WAN) extern int defaultWlanChannel; // Default WLAN Channel for Auto, JPCSP uses 11 diff --git a/Core/HLE/proAdhocServer.cpp b/Core/HLE/proAdhocServer.cpp index 85d4f2d56a..07ddaf29eb 100644 --- a/Core/HLE/proAdhocServer.cpp +++ b/Core/HLE/proAdhocServer.cpp @@ -1826,7 +1826,7 @@ int create_listen_socket(uint16_t port) //Should only bind to specific IP for the 2nd or more instance of PPSSPP to prevent communication interference issue when sharing the same port. Doesn't work well when PPSSPP_ID reseted everytime emulation restarted. /* if (PPSSPP_ID > 1) { - local.sin_addr = ((sockaddr_in *)&LocalhostIP)->sin_addr; + local.sin_addr = g_localhostIP.in.sin_addr; } */ diff --git a/Core/HLE/sceNet.cpp b/Core/HLE/sceNet.cpp index 1b3f900aeb..1b848df461 100644 --- a/Core/HLE/sceNet.cpp +++ b/Core/HLE/sceNet.cpp @@ -123,19 +123,19 @@ static int InitLocalhostIP() { if (iResult != 0) { ERROR_LOG(SCENET, "DNS Error (%s) result: %d\n", ipstr, iResult); //osm.Show("DNS Error, can't resolve client bind " + ipstr, 8.0f); - ((sockaddr_in*)&LocalhostIP)->sin_family = AF_INET; - ((sockaddr_in*)&LocalhostIP)->sin_addr.s_addr = inet_addr(ipstr); //"127.0.0.1" - ((sockaddr_in*)&LocalhostIP)->sin_port = 0; + g_localhostIP.in.sin_family = AF_INET; + g_localhostIP.in.sin_addr.s_addr = inet_addr(ipstr); //"127.0.0.1" + g_localhostIP.in.sin_port = 0; return iResult; } for (ptr = localAddr; ptr != NULL; ptr = ptr->ai_next) { switch (ptr->ai_family) { case AF_INET: - memcpy(&LocalhostIP, ptr->ai_addr, sizeof(sockaddr)); + memcpy(&g_localhostIP.addr, ptr->ai_addr, sizeof(sockaddr)); break; } } - ((sockaddr_in*)&LocalhostIP)->sin_port = 0; + g_localhostIP.in.sin_port = 0; freeaddrinfo(localAddr); // Resolve server dns @@ -198,7 +198,7 @@ void __NetInit() { SceNetEtherAddr mac; getLocalMac(&mac); - INFO_LOG(SCENET, "LocalHost IP will be %s [%s]", inet_ntoa(((sockaddr_in*)&LocalhostIP)->sin_addr), mac2str(&mac).c_str()); + INFO_LOG(SCENET, "LocalHost IP will be %s [%s]", inet_ntoa(g_localhostIP.in.sin_addr), mac2str(&mac).c_str()); // TODO: May be we should initialize & cleanup somewhere else than here for PortManager to be used as general purpose for whatever port forwarding PPSSPP needed __UPnPInit();