Net: Cut down on local IP aliasing.

This commit is contained in:
Unknown W. Brackets 2020-08-17 23:08:35 -07:00
parent 1e2f87a6d2
commit a89840f309
4 changed files with 24 additions and 19 deletions

View File

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

View File

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

View File

@ -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;
}
*/

View File

@ -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();