matt p's current wii-network changes

This commit is contained in:
Shawn Hoffman 2012-01-12 02:16:44 -08:00
parent cb03841b7f
commit 1df04e11a4
1 changed files with 93 additions and 40 deletions

View File

@ -209,7 +209,7 @@ CWII_IPC_HLE_Device_net_ncd_manage::CWII_IPC_HLE_Device_net_ncd_manage(u32 _Devi
m_Ifconfig.connection[0].ip[0] = 192; m_Ifconfig.connection[0].ip[0] = 192;
m_Ifconfig.connection[0].ip[1] = 168; m_Ifconfig.connection[0].ip[1] = 168;
m_Ifconfig.connection[0].ip[2] = 1; m_Ifconfig.connection[0].ip[2] = 1;
m_Ifconfig.connection[0].ip[3] = 1; m_Ifconfig.connection[0].ip[3] = 150;
m_Ifconfig.connection[0].netmask[0] = 255; m_Ifconfig.connection[0].netmask[0] = 255;
m_Ifconfig.connection[0].netmask[1] = 255; m_Ifconfig.connection[0].netmask[1] = 255;
m_Ifconfig.connection[0].netmask[2] = 255; m_Ifconfig.connection[0].netmask[2] = 255;
@ -217,16 +217,16 @@ CWII_IPC_HLE_Device_net_ncd_manage::CWII_IPC_HLE_Device_net_ncd_manage(u32 _Devi
m_Ifconfig.connection[0].gateway[0] = 192; m_Ifconfig.connection[0].gateway[0] = 192;
m_Ifconfig.connection[0].gateway[1] = 168; m_Ifconfig.connection[0].gateway[1] = 168;
m_Ifconfig.connection[0].gateway[2] = 1; m_Ifconfig.connection[0].gateway[2] = 1;
m_Ifconfig.connection[0].gateway[3] = 2; m_Ifconfig.connection[0].gateway[3] = 1;
m_Ifconfig.connection[0].dns1[0] = 10; m_Ifconfig.connection[0].dns1[0] = 8;
m_Ifconfig.connection[0].dns1[1] = 0; m_Ifconfig.connection[0].dns1[1] = 8;
m_Ifconfig.connection[0].dns1[2] = 1; m_Ifconfig.connection[0].dns1[2] = 8;
m_Ifconfig.connection[0].dns1[3] = 1; m_Ifconfig.connection[0].dns1[3] = 8;
m_Ifconfig.connection[1].flags = 167; m_Ifconfig.connection[1].flags = 167;
m_Ifconfig.connection[1].ip[0] = 192; m_Ifconfig.connection[1].ip[0] = 192;
m_Ifconfig.connection[1].ip[1] = 168; m_Ifconfig.connection[1].ip[1] = 168;
m_Ifconfig.connection[1].ip[2] = 1; m_Ifconfig.connection[1].ip[2] = 1;
m_Ifconfig.connection[1].ip[3] = 1; m_Ifconfig.connection[1].ip[3] = 150;
m_Ifconfig.connection[1].netmask[0] = 255; m_Ifconfig.connection[1].netmask[0] = 255;
m_Ifconfig.connection[1].netmask[1] = 255; m_Ifconfig.connection[1].netmask[1] = 255;
m_Ifconfig.connection[1].netmask[2] = 255; m_Ifconfig.connection[1].netmask[2] = 255;
@ -234,16 +234,16 @@ CWII_IPC_HLE_Device_net_ncd_manage::CWII_IPC_HLE_Device_net_ncd_manage(u32 _Devi
m_Ifconfig.connection[1].gateway[0] = 192; m_Ifconfig.connection[1].gateway[0] = 192;
m_Ifconfig.connection[1].gateway[1] = 168; m_Ifconfig.connection[1].gateway[1] = 168;
m_Ifconfig.connection[1].gateway[2] = 1; m_Ifconfig.connection[1].gateway[2] = 1;
m_Ifconfig.connection[1].gateway[3] = 2; m_Ifconfig.connection[1].gateway[3] = 1;
m_Ifconfig.connection[1].dns1[0] = 10; m_Ifconfig.connection[1].dns1[0] = 8;
m_Ifconfig.connection[1].dns1[1] = 0; m_Ifconfig.connection[1].dns1[1] = 8;
m_Ifconfig.connection[1].dns1[2] = 1; m_Ifconfig.connection[1].dns1[2] = 8;
m_Ifconfig.connection[1].dns1[3] = 1; m_Ifconfig.connection[1].dns1[3] = 8;
m_Ifconfig.connection[2].flags = 167; m_Ifconfig.connection[2].flags = 167;
m_Ifconfig.connection[2].ip[0] = 192; m_Ifconfig.connection[2].ip[0] = 192;
m_Ifconfig.connection[2].ip[1] = 168; m_Ifconfig.connection[2].ip[1] = 168;
m_Ifconfig.connection[2].ip[2] = 1; m_Ifconfig.connection[2].ip[2] = 1;
m_Ifconfig.connection[2].ip[3] = 1; m_Ifconfig.connection[2].ip[3] = 150;
m_Ifconfig.connection[2].netmask[0] = 255; m_Ifconfig.connection[2].netmask[0] = 255;
m_Ifconfig.connection[2].netmask[1] = 255; m_Ifconfig.connection[2].netmask[1] = 255;
m_Ifconfig.connection[2].netmask[2] = 255; m_Ifconfig.connection[2].netmask[2] = 255;
@ -251,11 +251,11 @@ CWII_IPC_HLE_Device_net_ncd_manage::CWII_IPC_HLE_Device_net_ncd_manage(u32 _Devi
m_Ifconfig.connection[2].gateway[0] = 192; m_Ifconfig.connection[2].gateway[0] = 192;
m_Ifconfig.connection[2].gateway[1] = 168; m_Ifconfig.connection[2].gateway[1] = 168;
m_Ifconfig.connection[2].gateway[2] = 1; m_Ifconfig.connection[2].gateway[2] = 1;
m_Ifconfig.connection[2].gateway[3] = 2; m_Ifconfig.connection[2].gateway[3] = 1;
m_Ifconfig.connection[2].dns1[0] = 10; m_Ifconfig.connection[2].dns1[0] = 8;
m_Ifconfig.connection[2].dns1[1] = 0; m_Ifconfig.connection[2].dns1[1] = 8;
m_Ifconfig.connection[2].dns1[2] = 1; m_Ifconfig.connection[2].dns1[2] = 8;
m_Ifconfig.connection[2].dns1[3] = 1; m_Ifconfig.connection[2].dns1[3] = 8;
} }
} }
@ -467,16 +467,18 @@ char *DecodeError(int ErrorCode)
static int getNetErrorCode(int ret, std::string caller) static int getNetErrorCode(int ret, std::string caller)
{ {
#ifdef _WIN32 #ifdef _WIN32
INFO_LOG(WII_IPC_NET, "%s failed with error %d: %s, ret= %d\n", int errorCode = WSAGetLastError();
caller.c_str(), WSAGetLastError(), DecodeError(WSAGetLastError()), ret);
if (ret>= 0) if (ret>= 0)
return ret; return ret;
switch (WSAGetLastError()) INFO_LOG(WII_IPC_NET, "%s failed with error %d: %s, ret= %d\n",
caller.c_str(), errorCode, DecodeError(errorCode), ret);
switch (errorCode)
{ {
case 10040: case 10040:
return 1; INFO_LOG(WII_IPC_NET, "Find out why this happened, looks like PEEK failure?\n");
return -1;
case 10054: case 10054:
return -15; return -15;
case 10035: case 10035:
@ -493,6 +495,17 @@ static int getNetErrorCode(int ret, std::string caller)
#endif #endif
} }
static int convertWiiSockOpt(int level, int optname)
{
switch (optname)
{
case 0x1009:
return 0x1007; //SO_ERROR
default:
return optname;
}
}
static int inet_pton(const char *src, unsigned char *dst) static int inet_pton(const char *src, unsigned char *dst)
{ {
static const char digits[] = "0123456789"; static const char digits[] = "0123456789";
@ -566,11 +579,11 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command,
serverAddr.sin_family = serverAddr.sin_family >> 8; serverAddr.sin_family = serverAddr.sin_family >> 8;
int ret = connect(Common::swap32(params.socket), (struct sockaddr *) &serverAddr, sizeof(serverAddr)); int ret = connect(Common::swap32(params.socket), (struct sockaddr *) &serverAddr, sizeof(serverAddr));
ret = getNetErrorCode(ret, "SO_CONNECT");
INFO_LOG(WII_IPC_NET,"/dev/net/ip/top::IOCtl request IOCTL_SO_CONNECT (%08x, %s:%d)", INFO_LOG(WII_IPC_NET,"/dev/net/ip/top::IOCtl request IOCTL_SO_CONNECT (%08x, %s:%d)",
Common::swap32(params.socket), inet_ntoa(serverAddr.sin_addr), Common::swap16(serverAddr.sin_port)); Common::swap32(params.socket), inet_ntoa(serverAddr.sin_addr), Common::swap16(serverAddr.sin_port));
return getNetErrorCode(ret, "SO_CONNECT"); return ret;
break; break;
} }
@ -667,16 +680,33 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command,
u32 sock = Memory::Read_U32(_BufferOut); u32 sock = Memory::Read_U32(_BufferOut);
u32 level = Memory::Read_U32(_BufferOut + 4); u32 level = Memory::Read_U32(_BufferOut + 4);
u32 optname = Memory::Read_U32(_BufferOut + 8); u32 optname = Memory::Read_U32(_BufferOut + 8);
INFO_LOG(WII_IPC_NET,"/dev/net/ip/top::IOCtl request IOCTL_SO_GETSOCKOPT(%08x, %08x, %08x)"
"BufferIn: (%08x, %i), BufferOut: (%08x, %i)",
sock, level, optname,
_BufferIn, BufferInSize, _BufferOut, BufferOutSize);
optname = convertWiiSockOpt(level,optname);
u8 optval[20]; u8 optval[20];
u32 optlen = 8; u32 optlen = 4;
//for(int i=0; i<BufferOutSize; i++) INFO_LOG(WII_IPC_NET,"%02x ", Memory::Read_U8(_BufferOut + i));
int ret = getsockopt (sock, level, optname, (char *) &optval, (socklen_t*)&optlen);
ret = getNetErrorCode(ret, "SO_GETSOCKOPT");
INFO_LOG(WII_IPC_NET,"/dev/net/ip/top::IOCtl request IOCTL_SO_GETSOCKOPT "
"Socket: %08x, BufferIn: (%08x, %i), BufferOut: (%08x, %i)",
sock, _BufferIn, BufferInSize, _BufferOut, BufferOutSize);
int ret = getsockopt (sock, level, optname, (char *) optval, (socklen_t*)&optlen);
Memory::Write_U32(optlen, _BufferOut + 0xC); Memory::Write_U32(optlen, _BufferOut + 0xC);
Memory::WriteBigEData((u8 *) optval, _BufferOut + 0x10, optlen); Memory::WriteBigEData((u8 *) optval, _BufferOut + 0x10, optlen);
if(optname == 0x1007){
s32 errorcode = Memory::Read_U32(_BufferOut + 0x10);
INFO_LOG(WII_IPC_NET,"/dev/net/ip/top::IOCtl request IOCTL_SO_GETSOCKOPT error code = %i", errorcode);
}
return ret; return ret;
} }
@ -689,12 +719,19 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command,
u8 optval[20]; u8 optval[20];
Memory::ReadBigEData(optval, _BufferIn + 0x10, optlen); Memory::ReadBigEData(optval, _BufferIn + 0x10, optlen);
INFO_LOG(WII_IPC_NET, "/dev/net/ip/top::IOCtl request IOCTL_SO_SETSOCKOPT " //TODO: bug booto about this, most likely timeout related, default value on wii is 180
"Socket: %08x, BufferIn: (%08x, %i), BufferOut: (%08x, %i)", if (level == 6 && optname == 0x2005){
S, _BufferIn, BufferInSize, _BufferOut, BufferOutSize); return 0;
}
INFO_LOG(WII_IPC_NET, "/dev/net/ip/top::IOCtl request IOCTL_SO_SETSOCKOPT(%08x, %08x, %08x, %08x) "
"BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
"%02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx",
S, level, optname, optlen, _BufferIn, BufferInSize, _BufferOut, BufferOutSize, optval[0], optval[1], optval[2], optval[3], optval[4], optval[5], optval[6], optval[7], optval[8], optval[9], optval[10], optval[11], optval[12], optval[13], optval[14], optval[15], optval[16], optval[17], optval[18], optval[19]);
int ret = setsockopt(S, level, optname, (char*)optval, optlen); int ret = setsockopt(S, level, optname, (char*)optval, optlen);
ret = getNetErrorCode(ret, "SO_SETSOCKOPT");
return ret; return ret;
} }
@ -799,6 +836,9 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command,
_BufferIn, BufferInSize, _BufferOut, BufferOutSize); _BufferIn, BufferInSize, _BufferOut, BufferOutSize);
} }
int ret = poll(ufds, nfds, timeout); int ret = poll(ufds, nfds, timeout);
ret = getNetErrorCode(ret, "SO_SETSOCKOPT");
for (int i = 0; i<nfds; i++) for (int i = 0; i<nfds; i++)
{ {
Memory::Write_U32(ufds[i].fd, _BufferOut + 0xc*i); Memory::Write_U32(ufds[i].fd, _BufferOut + 0xc*i);
@ -990,8 +1030,8 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommandV(u32 _Parameter, SIOCtlVBuffe
INFO_LOG(WII_IPC_NET, "DNS: %u.%u.%u.%u", INFO_LOG(WII_IPC_NET, "DNS: %u.%u.%u.%u",
(unsigned char)AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[2], (unsigned char)AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[2],
(unsigned char)AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[3], (unsigned char)AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[3],
(unsigned char)AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[5], (unsigned char)AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[4],
(unsigned char)AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[6]); (unsigned char)AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[5]);
address = Common::swap32(*(u32*)(&AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[2])); address = Common::swap32(*(u32*)(&AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[2]));
break; break;
} }
@ -1090,7 +1130,7 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommandV(u32 _Parameter, SIOCtlVBuffe
struct sockaddr_in addr; struct sockaddr_in addr;
socklen_t fromlen = 0; socklen_t fromlen = 0;
if (_BufferOut2 != 0) if (BufferOutSize2 != 0)
{ {
fromlen = BufferOutSize2 >= sizeof(struct sockaddr) ? BufferOutSize2 : sizeof(struct sockaddr); fromlen = BufferOutSize2 >= sizeof(struct sockaddr) ? BufferOutSize2 : sizeof(struct sockaddr);
} }
@ -1100,11 +1140,24 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommandV(u32 _Parameter, SIOCtlVBuffe
else else
flags = MSG_PEEK; flags = MSG_PEEK;
int ret;
#ifdef _WIN32
if(flags & MSG_PEEK){
unsigned long totallen = 0;
ioctlsocket(sock, FIONREAD, &totallen);
return totallen;
}else
#endif
if (fromlen){
ret = recvfrom(sock, buf, len, flags,
fromlen ? (struct sockaddr*) &addr : NULL, fromlen ? &fromlen : 0);
}else{
ret = recv(sock, buf, len, flags);
}
int ret = recvfrom(sock, buf, len, flags, if (BufferOutSize2 != 0)
fromlen ? (struct sockaddr*) &addr : NULL, fromlen ? &fromlen : NULL);
if (_BufferOut2 != 0)
{ {
//something not quite right below, need to verify
addr.sin_family = (addr.sin_family << 8) | (BufferOutSize2&0xFF); addr.sin_family = (addr.sin_family << 8) | (BufferOutSize2&0xFF);
Memory::WriteBigEData((u8*)&addr, _BufferOut2, BufferOutSize2); Memory::WriteBigEData((u8*)&addr, _BufferOut2, BufferOutSize2);
} }
@ -1137,7 +1190,7 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommandV(u32 _Parameter, SIOCtlVBuffe
if (BufferInSize2 > 0) if (BufferInSize2 > 0)
pServiceName = (char*)Memory::GetPointer(_BufferIn2); pServiceName = (char*)Memory::GetPointer(_BufferIn2);
int ret = getaddrinfo(pNodeName, pServiceName, &hints, &result); int ret = getaddrinfo(pNodeName, pServiceName, BufferInSize3 ? &hints : NULL, &result);
u32 addr = _BufferOut; u32 addr = _BufferOut;
u32 sockoffset = addr + 0x460; u32 sockoffset = addr + 0x460;
if (ret >= 0) if (ret >= 0)