summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Parlane <parlane@gmail.com>2012-01-26 23:34:56 +1300
committerMatthew Parlane <parlane@gmail.com>2012-01-26 23:34:56 +1300
commit6b4c5c468569a82ea38e5fbd05ab395902a709a7 (patch)
treea380c6239f5e339f576ddd084a4a21c3182e6358
parentde11c592f26cadd7f9e81248cdf4afce26167c95 (diff)
Multitude of fixes for networking.
-rw-r--r--Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp36
-rw-r--r--Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net_ssl.cpp122
2 files changed, 134 insertions, 24 deletions
diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp
index c213a179d3..aad1b4489b 100644
--- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp
+++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp
@@ -464,7 +464,7 @@ char *DecodeError(int ErrorCode)
}
#endif
-static int getNetErrorCode(int ret, std::string caller)
+static int getNetErrorCode(int ret, std::string caller, bool isRW)
{
#ifdef _WIN32
int errorCode = WSAGetLastError();
@@ -484,7 +484,11 @@ static int getNetErrorCode(int ret, std::string caller)
case 10056:
return -30;
case 10035:
- return -26;
+ if(isRW){
+ return -6;
+ }else{
+ return -26;
+ }
case 6:
return -26;
default:
@@ -581,7 +585,7 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command,
serverAddr.sin_family = serverAddr.sin_family >> 8;
int ret = connect(Common::swap32(params.socket), (struct sockaddr *) &serverAddr, sizeof(serverAddr));
- ret = getNetErrorCode(ret, "SO_CONNECT");
+ ret = getNetErrorCode(ret, "SO_CONNECT", false);
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));
@@ -598,7 +602,7 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command,
u32 sock = Memory::Read_U32(_BufferIn);
u32 how = Memory::Read_U32(_BufferIn+4);
int ret = shutdown(sock, how);
- return getNetErrorCode(ret, "SO_SHUTDOWN");
+ return getNetErrorCode(ret, "SO_SHUTDOWN", false);
break;
}
@@ -610,7 +614,7 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command,
#ifdef _WIN32
u32 ret = closesocket(sock);
- return getNetErrorCode(ret, "IOCTL_SO_CLOSE");
+ return getNetErrorCode(ret, "IOCTL_SO_CLOSE", false);
#else
return close(sock);
#endif
@@ -626,7 +630,7 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command,
INFO_LOG(WII_IPC_NET, "/dev/net/ip/top::IOCtl request IOCTL_SO_SOCKET "
"Socket: %08x (%d,%d,%d), BufferIn: (%08x, %i), BufferOut: (%08x, %i)",
s, AF, TYPE, PROT, _BufferIn, BufferInSize, _BufferOut, BufferOutSize);
- return getNetErrorCode(s, "SO_SOCKET");
+ return getNetErrorCode(s, "SO_SOCKET", false);
break;
}
@@ -646,7 +650,7 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command,
inet_ntoa(address.sin_addr), Common::swap16(address.sin_port),
Common::swap32(addr->socket), _BufferIn, BufferInSize, _BufferOut, BufferOutSize);
- return getNetErrorCode(ret, "SO_BIND");
+ return getNetErrorCode(ret, "SO_BIND", false);
break;
}
@@ -659,7 +663,7 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command,
u32 S = Memory::Read_U32(_BufferIn);
u32 BACKLOG = Memory::Read_U32(_BufferIn + 0x04);
u32 ret = listen(S, BACKLOG);
- return getNetErrorCode(ret, "SO_LISTEN");
+ return getNetErrorCode(ret, "SO_LISTEN", false);
break;
}
@@ -674,7 +678,7 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command,
socklen_t* addrlen = (socklen_t*) Memory::GetPointer(BufferOutSize);
*addrlen = sizeof(struct sockaddr);
int ret = accept(S, addr, addrlen);
- return getNetErrorCode(ret, "SO_ACCEPT");
+ return getNetErrorCode(ret, "SO_ACCEPT", false);
}
case IOCTL_SO_GETSOCKOPT:
@@ -699,7 +703,7 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command,
int ret = getsockopt (sock, level, optname, (char *) &optval, (socklen_t*)&optlen);
- ret = getNetErrorCode(ret, "SO_GETSOCKOPT");
+ ret = getNetErrorCode(ret, "SO_GETSOCKOPT", false);
Memory::Write_U32(optlen, _BufferOut + 0xC);
@@ -732,7 +736,7 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command,
int ret = setsockopt(S, level, optname, (char*)optval, optlen);
- ret = getNetErrorCode(ret, "SO_SETSOCKOPT");
+ ret = getNetErrorCode(ret, "SO_SETSOCKOPT", false);
return ret;
}
@@ -761,7 +765,7 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command,
if (arg & F_NONBLOCK)
iMode = 1;
int ioctlret = ioctlsocket(sock, FIONBIO, &iMode);
- return getNetErrorCode(ioctlret, "SO_FCNTL");
+ return getNetErrorCode(ioctlret, "SO_FCNTL", false);
}
else
{
@@ -839,7 +843,7 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommand(u32 _Command,
}
int ret = poll(ufds, nfds, timeout);
- ret = getNetErrorCode(ret, "SO_SETSOCKOPT");
+ ret = getNetErrorCode(ret, "SO_SETSOCKOPT", false);
for (int i = 0; i<nfds; i++)
{
@@ -1107,13 +1111,13 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommandV(u32 _Parameter, SIOCtlVBuffe
addr->sin_family = addr->sin_family >> 8;
int ret = sendto(Common::swap32(params.socket), (char*)Memory::GetPointer(_BufferIn),
BufferInSize, Common::swap32(params.flags), (struct sockaddr*)addr, len);
- return getNetErrorCode(ret, "SO_SENDTO");
+ return getNetErrorCode(ret, "SO_SENDTO", true);
}
else
{
int ret = send(Common::swap32(params.socket), (char*)Memory::GetPointer(_BufferIn),
BufferInSize, Common::swap32(params.flags));
- return getNetErrorCode(ret, "SO_SEND");
+ return getNetErrorCode(ret, "SO_SEND", true);
}
break;
}
@@ -1162,7 +1166,7 @@ u32 CWII_IPC_HLE_Device_net_ip_top::ExecuteCommandV(u32 _Parameter, SIOCtlVBuffe
addr.sin_family = (addr.sin_family << 8) | (BufferOutSize2&0xFF);
Memory::WriteBigEData((u8*)&addr, _BufferOut2, BufferOutSize2);
}
- return getNetErrorCode(ret, "SO_RECVFROM");
+ return getNetErrorCode(ret, "SO_RECVFROM", true);
break;
}
diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net_ssl.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net_ssl.cpp
index 7e59eb715a..f07f372dc1 100644
--- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net_ssl.cpp
+++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net_ssl.cpp
@@ -23,6 +23,7 @@
#include <openssl/err.h>
#include "FileUtil.h"
#include "WII_IPC_HLE_Device_net_ssl.h"
+#include "../Debugger/Debugger_SymbolMap.h"
CWII_IPC_HLE_Device_net_ssl::CWII_IPC_HLE_Device_net_ssl(u32 _DeviceID, const std::string& _rDeviceName)
: IWII_IPC_HLE_Device(_DeviceID, _rDeviceName)
@@ -189,6 +190,63 @@ u32 CWII_IPC_HLE_Device_net_ssl::ExecuteCommandV(u32 _Parameter, SIOCtlVBuffer C
_BufferOut2, BufferOutSize2, _BufferOut3, BufferOutSize3);
break;
}
+ // a BufferIn: (007ad6a0, 32), BufferIn2: (00000000, 0), BufferIn3: (00000000, 0), BufferOut: (007ad680, 32), BufferOut2: (00765920, 924), BufferOut3: (00000000, 0)
+ case IOCTLV_NET_SSL_SETROOTCA:
+ {
+ INFO_LOG(WII_IPC_NET, "/dev/net/ssl::IOCtlV request IOCTLV_NET_SSL_SETROOTCA "
+ "BufferIn: (%08x, %i), BufferIn2: (%08x, %i), "
+ "BufferIn3: (%08x, %i), BufferOut: (%08x, %i), "
+ "BufferOut2: (%08x, %i), BufferOut3: (%08x, %i)",
+ _BufferIn, BufferInSize, _BufferIn2, BufferInSize2,
+ _BufferIn3, BufferInSize3, _BufferOut, BufferOutSize,
+ _BufferOut2, BufferOutSize2, _BufferOut3, BufferOutSize3);
+
+//Dolphin_Debugger::PrintCallstack(LogTypes::WII_IPC_NET, LogTypes::LINFO);
+
+ int sslID = Memory::Read_U32(_BufferOut) - 1;
+ void* certca = malloc(BufferOutSize2);
+ if (sslID >= 0 && sslID < NET_SSL_MAXINSTANCES && sslfds[sslID] != NULL)
+ {
+
+ std::string cert_base_path(File::GetUserPath(D_WIIUSER_IDX));
+
+ SSL* ssl = sslfds[sslID];
+
+
+ FILE *wiiclientca = fopen((cert_base_path + "clientca.cer").c_str(), "rb");
+ if (wiiclientca == NULL)
+ break;
+
+ X509 *cert = d2i_X509_fp(wiiclientca, NULL);
+ fclose(wiiclientca);
+ if (SSL_use_certificate(ssl,cert) <= 0)
+ break;
+ if (cert)
+ X509_free(cert);
+
+
+
+ FILE * clientcakey = fopen((cert_base_path + "clientcakey.der").c_str(), "rb");
+ if (clientcakey == NULL)
+ break;
+
+ EVP_PKEY * key = d2i_PrivateKey_fp(clientcakey, NULL);
+
+ if (SSL_use_PrivateKey(ssl,key) <= 0)
+ break;
+ if (!SSL_check_private_key(ssl))
+ break;
+
+
+ if (key)
+ EVP_PKEY_free(key);
+
+ Memory::Write_U32(0, _BufferIn);
+ }
+ free(certca);
+ break;
+ }
+
case IOCTLV_NET_SSL_SETBUILTINCLIENTCERT:
{
@@ -331,6 +389,16 @@ u32 CWII_IPC_HLE_Device_net_ssl::ExecuteCommandV(u32 _Parameter, SIOCtlVBuffer C
int sock = Memory::Read_U32(_BufferOut2);
SSL* ssl = sslfds[sslID];
SSL_set_fd(ssl,sock);
+
+ FILE *ssl_write = fopen("ssl_write.txt", "ab");
+ fprintf(ssl_write, "%s", "###############\n");
+ fclose(ssl_write);
+
+ FILE *ssl_read = fopen("ssl_read.txt", "ab");
+ fprintf(ssl_read, "%s", "###############\n");
+ fclose(ssl_read);
+
+
returnValue = SSL_connect(ssl);
Memory::Write_U32(0, _BufferIn);
}
@@ -355,8 +423,13 @@ u32 CWII_IPC_HLE_Device_net_ssl::ExecuteCommandV(u32 _Parameter, SIOCtlVBuffer C
if (sslID >= 0 && sslID < NET_SSL_MAXINSTANCES && sslfds[sslID] != NULL)
{
SSL* ssl = sslfds[sslID];
+ SSL_set_verify(ssl, SSL_VERIFY_NONE, NULL);
returnValue = SSL_do_handshake(ssl);
- if (returnValue == 1)
+ SSL_load_error_strings();
+ FILE *quickDump = fopen("quickdump.txt", "wb");
+ ERR_print_errors_fp(quickDump);
+ fclose(quickDump);
+// if (returnValue == 1)
Memory::Write_U32(0, _BufferIn);
}
INFO_LOG(WII_IPC_NET, "/dev/net/ssl::IOCtlV request IOCTLV_NET_SSL_DOHANDSHAKE "
@@ -374,16 +447,26 @@ u32 CWII_IPC_HLE_Device_net_ssl::ExecuteCommandV(u32 _Parameter, SIOCtlVBuffer C
char in1[32];
char out1[32];
char out2[256];
+
+ //Dolphin_Debugger::PrintCallstack(LogTypes::WII_IPC_NET, LogTypes::LINFO);
Memory::ReadBigEData((u8*)in1, _BufferIn, 32);
Memory::ReadBigEData((u8*)out1, _BufferOut, 32);
- Memory::ReadBigEData((u8*)out2, _BufferOut2, 256);
+ Memory::ReadBigEData((u8*)out2, _BufferOut2, BufferOutSize2);
int sslID = Memory::Read_U32(_BufferOut) - 1;
if (sslID >= 0 && sslID < NET_SSL_MAXINSTANCES && sslfds[sslID] != NULL)
{
SSL* ssl = sslfds[sslID];
+
+ /*FILE *ssl_write = fopen("ssl_write.txt", "ab");
+ fwrite(Memory::GetPointer(_BufferOut2), 1, BufferOutSize2, ssl_write);
+ fprintf(ssl_write, "----(%d)----\n", BufferOutSize2);
+ fclose(ssl_write);
+ */
returnValue = SSL_write(ssl, Memory::GetPointer(_BufferOut2), BufferOutSize2);
+ if (returnValue == -1)
+ returnValue = -SSL_get_error(ssl, returnValue);
Memory::Write_U32(returnValue, _BufferIn);
returnValue = 0;
}
@@ -400,23 +483,46 @@ u32 CWII_IPC_HLE_Device_net_ssl::ExecuteCommandV(u32 _Parameter, SIOCtlVBuffer C
case IOCTLV_NET_SSL_READ:
{
- char in1[32];
- char in2[256];
- char out1[32];
+ u32 in1[32];
+ u32 in2[256];
+ u32 out1[32];
memset(in2, 0, 256);
Memory::ReadBigEData((u8*)in1, _BufferIn, 32);
//Memory::ReadBigEData((u8*)in2, _BufferIn2, BufferInSize2);
Memory::ReadBigEData((u8*)out1, _BufferOut, 32);
+
+ /*DumpCommands(_BufferIn,4,LogTypes::WII_IPC_NET,LogTypes::LDEBUG);
+
+ DumpCommands(_BufferIn2,2,LogTypes::WII_IPC_NET,LogTypes::LDEBUG);
+ DumpCommands(_BufferOut,4,LogTypes::WII_IPC_NET,LogTypes::LDEBUG);
+ */
+
+
int sslID = Memory::Read_U32(_BufferOut) - 1;
if (sslID >= 0 && sslID < NET_SSL_MAXINSTANCES && sslfds[sslID] != NULL)
{
SSL* ssl = sslfds[sslID];
returnValue = SSL_read(ssl, Memory::GetPointer(_BufferIn2), BufferInSize2);
+ if (returnValue == -1)
+ returnValue = -SSL_get_error(ssl, returnValue);
+
+ SSL_load_error_strings();
+ FILE *quickDump = fopen("quickdump.txt", "ab");
+ ERR_print_errors_fp(quickDump);
+ fclose(quickDump);
Memory::Write_U32(returnValue, _BufferIn);
//returnValue = 0;
}
- strncpy(in2, (char*)Memory::GetPointer(_BufferIn2), BufferInSize2);
+ /*memcpy(in2, (char*)Memory::GetPointer(_BufferIn2), BufferInSize2);
+
+
+ FILE *ssl_read = fopen("ssl_read.txt", "ab");
+ if((s32)returnValue >0)
+ fwrite(in2, 1, returnValue, ssl_read);
+ fprintf(ssl_read, "%s", "--------\n");
+ fclose(ssl_read);
+ */
INFO_LOG(WII_IPC_NET, "/dev/net/ssl::IOCtlV request IOCTLV_NET_SSL_READ(%d) %s "
"BufferIn: (%08x, %i), BufferIn2: (%08x, %i), "
"BufferIn3: (%08x, %i), BufferOut: (%08x, %i), "
@@ -430,7 +536,7 @@ u32 CWII_IPC_HLE_Device_net_ssl::ExecuteCommandV(u32 _Parameter, SIOCtlVBuffer C
default:
{
- INFO_LOG(WII_IPC_NET, "/dev/net/ssl::IOCtlV request %x "
+ ERROR_LOG(WII_IPC_NET, "/dev/net/ssl::IOCtlV request %i "
"BufferIn: (%08x, %i), BufferIn2: (%08x, %i), "
"BufferIn3: (%08x, %i), BufferOut: (%08x, %i), "
"BufferOut2: (%08x, %i), BufferOut3: (%08x, %i)",
@@ -452,7 +558,7 @@ u32 CWII_IPC_HLE_Device_net_ssl::ExecuteCommand(u32 _Command,
{
default:
{
- INFO_LOG(WII_IPC_NET, "/dev/net/ssl::IOCtl request %x "
+ INFO_LOG(WII_IPC_NET, "/dev/net/ssl::IOCtl request unknown %i "
"(BufferIn: (%08x, %i), BufferOut: (%08x, %i)",
_Command,
_BufferIn, BufferInSize, _BufferOut, BufferOutSize);