Bug Summary

File:Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp
Location:line 755, column 8
Description:Value stored to 'errorcode' during its initialization is never read

Annotated Source Code

1// Copyright 2013 Dolphin Emulator Project
2// Licensed under GPLv2
3// Refer to the license.txt file included.
4
5#include "WII_IPC_HLE_Device_es.h"
6#include "WII_IPC_HLE_Device_net.h"
7#include "../ConfigManager.h"
8#include "FileUtil.h"
9#include <stdio.h>
10#include <string>
11#include "ICMP.h"
12#include "CommonPaths.h"
13#include "SettingsHandler.h"
14#include "ec_wii.h"
15#include "WII_Socket.h"
16
17#ifdef _WIN32
18#include <ws2tcpip.h>
19#include <iphlpapi.h>
20#include <iphlpapi.h>
21
22#include "fakepoll.h"
23#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
24#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
25
26#elif defined(__linux__1) or defined(__APPLE__)
27#include <netdb.h>
28#include <arpa/inet.h>
29#include <sys/types.h>
30#include <sys/socket.h>
31#include <sys/ioctl.h>
32#include <netinet/in.h>
33#include <net/if.h>
34#include <errno(*__errno_location ()).h>
35#include <poll.h>
36#include <string.h>
37
38typedef struct pollfd pollfd_t;
39#else
40#include <sys/types.h>
41#include <sys/socket.h>
42#include <netinet/in.h>
43#include <errno(*__errno_location ()).h>
44#endif
45
46extern std::queue<std::pair<u32,std::string> > g_ReplyQueueLater;
47const u8 default_address[] = { 0x00, 0x17, 0xAB, 0x99, 0x99, 0x99 };
48
49// **********************************************************************************
50// Handle /dev/net/kd/request requests
51CWII_IPC_HLE_Device_net_kd_request::CWII_IPC_HLE_Device_net_kd_request(u32 _DeviceID, const std::string& _rDeviceName)
52 : IWII_IPC_HLE_Device(_DeviceID, _rDeviceName)
53{
54}
55
56CWII_IPC_HLE_Device_net_kd_request::~CWII_IPC_HLE_Device_net_kd_request()
57{
58 WiiSockMan::getInstance().clean();
59}
60
61bool CWII_IPC_HLE_Device_net_kd_request::Open(u32 _CommandAddress, u32 _Mode)
62{
63 INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: Open")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_WC24, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 63, "NET_KD_REQ: Open"); } } while (0)
;
64 Memory::Write_U32(GetDeviceID(), _CommandAddress + 4);
65 m_Active = true;
66 return true;
67}
68
69bool CWII_IPC_HLE_Device_net_kd_request::Close(u32 _CommandAddress, bool _bForce)
70{
71 INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: Close")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_WC24, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 71, "NET_KD_REQ: Close"); } } while (0)
;
72 if (!_bForce)
73 Memory::Write_U32(0, _CommandAddress + 4);
74 m_Active = false;
75 return true;
76}
77
78bool CWII_IPC_HLE_Device_net_kd_request::IOCtl(u32 _CommandAddress)
79{
80 u32 Parameter = Memory::Read_U32(_CommandAddress + 0xC);
81 u32 BufferIn = Memory::Read_U32(_CommandAddress + 0x10);
82 u32 BufferInSize = Memory::Read_U32(_CommandAddress + 0x14);
83 u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18);
84 u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C);
85
86 u32 ReturnValue = 0;
87 switch (Parameter)
88 {
89 case IOCTL_NWC24_SUSPEND_SCHEDULAR:
90 // NWC24iResumeForCloseLib from NWC24SuspendScheduler (Input: none, Output: 32 bytes)
91 INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_SUSPEND_SCHEDULAR - NI")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_WC24, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 91, "NET_KD_REQ: IOCTL_NWC24_SUSPEND_SCHEDULAR - NI"); } } while
(0)
;
92 Memory::Write_U32(0, BufferOut); // no error
93 break;
94
95 case IOCTL_NWC24_EXEC_TRY_SUSPEND_SCHEDULAR: // NWC24iResumeForCloseLib
96 INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_EXEC_TRY_SUSPEND_SCHEDULAR - NI")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_WC24, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 96, "NET_KD_REQ: IOCTL_NWC24_EXEC_TRY_SUSPEND_SCHEDULAR - NI"
); } } while (0)
;
97 break;
98
99 case IOCTL_NWC24_EXEC_RESUME_SCHEDULAR : // NWC24iResumeForCloseLib
100 INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_EXEC_RESUME_SCHEDULAR - NI")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_WC24, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 100, "NET_KD_REQ: IOCTL_NWC24_EXEC_RESUME_SCHEDULAR - NI");
} } while (0)
;
101 Memory::Write_U32(0, BufferOut); // no error
102 break;
103
104 case IOCTL_NWC24_STARTUP_SOCKET: // NWC24iStartupSocket
105 Memory::Write_U32(0, BufferOut);
106 Memory::Write_U32(0, BufferOut+4);
107 ReturnValue = 0;
108 INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_STARTUP_SOCKET - NI")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_WC24, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 108, "NET_KD_REQ: IOCTL_NWC24_STARTUP_SOCKET - NI"); } } while
(0)
;
109 break;
110 case IOCTL_NWC24_CLEANUP_SOCKET:
111 Memory::Memset(BufferOut, 0, BufferOutSize);
112 INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_CLEANUP_SOCKET - NI")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_WC24, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 112, "NET_KD_REQ: IOCTL_NWC24_CLEANUP_SOCKET - NI"); } } while
(0)
;
113 break;
114 case IOCTL_NWC24_LOCK_SOCKET: // WiiMenu
115 INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_LOCK_SOCKET - NI")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_WC24, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 115, "NET_KD_REQ: IOCTL_NWC24_LOCK_SOCKET - NI"); } } while
(0)
;
116 break;
117
118 case IOCTL_NWC24_UNLOCK_SOCKET:
119 INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_UNLOCK_SOCKET - NI")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_WC24, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 119, "NET_KD_REQ: IOCTL_NWC24_UNLOCK_SOCKET - NI"); } } while
(0)
;
120 break;
121
122 case IOCTL_NWC24_REQUEST_REGISTER_USER_ID:
123 INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_REQUEST_REGISTER_USER_ID")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_WC24, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 123, "NET_KD_REQ: IOCTL_NWC24_REQUEST_REGISTER_USER_ID"); }
} while (0)
;
124 Memory::Write_U32(0, BufferOut);
125 Memory::Write_U32(0, BufferOut+4);
126 break;
127
128 case IOCTL_NWC24_REQUEST_GENERATED_USER_ID: // (Input: none, Output: 32 bytes)
129 INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_REQUEST_GENERATED_USER_ID")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_WC24, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 129, "NET_KD_REQ: IOCTL_NWC24_REQUEST_GENERATED_USER_ID"); }
} while (0)
;
130 if (config.CreationStage() == nwc24_config_t::NWC24_IDCS_INITIAL)
131 {
132 std::string settings_Filename(Common::GetTitleDataPath(TITLEID_SYSMENU0x0000000100000002ull) + WII_SETTING"setting.txt");
133 SettingsHandler gen;
134 std::string area, model;
135 bool _GotSettings = false;
136
137 if (File::Exists(settings_Filename))
138 {
139 File::IOFile settingsFileHandle(settings_Filename, "rb");
140 if (settingsFileHandle.ReadBytes((void*)gen.GetData(), SettingsHandler::SETTINGS_SIZE))
141 {
142 gen.Decrypt();
143 area = gen.GetValue("AREA");
144 model = gen.GetValue("MODEL");
145 _GotSettings = true;
146 }
147
148 }
149 if (_GotSettings)
150 {
151 u8 area_code = GetAreaCode(area.c_str());
152 u8 id_ctr = config.IdGen();
153 u8 hardware_model = GetHardwareModel(model.c_str());
154
155 EcWii &ec = EcWii::GetInstance();
156 u32 HollywoodID = ec.getNgId();
157 u64 UserID = 0;
158
159 s32 ret = NWC24MakeUserID(&UserID, HollywoodID, id_ctr, hardware_model, area_code);
160 config.SetId(UserID);
161 config.IncrementIdGen();
162 config.SetCreationStage(nwc24_config_t::NWC24_IDCS_GENERATED);
163 config.WriteConfig();
164
165 Memory::Write_U32(ret, BufferOut);
166 }
167 else
168 {
169 Memory::Write_U32(WC24_ERR_FATAL, BufferOut);
170 }
171
172 }
173 else if (config.CreationStage() == nwc24_config_t::NWC24_IDCS_GENERATED)
174 {
175 Memory::Write_U32(WC24_ERR_ID_GENERATED, BufferOut);
176 }
177 else if (config.CreationStage() == nwc24_config_t::NWC24_IDCS_REGISTERED)
178 {
179 Memory::Write_U32(WC24_ERR_ID_REGISTERED, BufferOut);
180 }
181 Memory::Write_U64(config.Id(), BufferOut + 4);
182 Memory::Write_U32(config.CreationStage(), BufferOut + 0xC);
183 break;
184 case IOCTL_NWC24_GET_SCHEDULAR_STAT:
185 INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_GET_SCHEDULAR_STAT - NI")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_WC24, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 185, "NET_KD_REQ: IOCTL_NWC24_GET_SCHEDULAR_STAT - NI"); } }
while (0)
;
186 break;
187
188 case IOCTL_NWC24_SAVE_MAIL_NOW:
189 INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_SAVE_MAIL_NOW - NI")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_WC24, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 189, "NET_KD_REQ: IOCTL_NWC24_SAVE_MAIL_NOW - NI"); } } while
(0)
;
190 break;
191
192 case IOCTL_NWC24_REQUEST_SHUTDOWN:
193 // if ya set the IOS version to a very high value this happens ...
194 INFO_LOG(WII_IPC_WC24, "NET_KD_REQ: IOCTL_NWC24_REQUEST_SHUTDOWN - NI")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_WC24, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 194, "NET_KD_REQ: IOCTL_NWC24_REQUEST_SHUTDOWN - NI"); } } while
(0)
;
195 break;
196
197 default:
198 INFO_LOG(WII_IPC_WC24, "/dev/net/kd/request::IOCtl request 0x%x (BufferIn: (%08x, %i), BufferOut: (%08x, %i)",do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_WC24, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 199, "/dev/net/kd/request::IOCtl request 0x%x (BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, Parameter, BufferIn, BufferInSize, BufferOut, BufferOutSize
); } } while (0)
199 Parameter, BufferIn, BufferInSize, BufferOut, BufferOutSize)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_WC24, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 199, "/dev/net/kd/request::IOCtl request 0x%x (BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, Parameter, BufferIn, BufferInSize, BufferOut, BufferOutSize
); } } while (0)
;
200 break;
201 }
202
203 Memory::Write_U32(ReturnValue, _CommandAddress + 4);
204 return true;
205}
206
207
208u8 CWII_IPC_HLE_Device_net_kd_request::GetAreaCode( const char * area )
209{
210 u32 i;
211 u8 regions_[] = {0,1,2,2,1,3,3,4,5,5,1,2,6,7};
212 const char* regions[] = {"JPN", "USA", "EUR", "AUS", "BRA", "TWN", "ROC", "KOR", "HKG", "ASI", "LTN", "SAF", "CHN", ""};
213 for (i=0; i<sizeof(regions)/sizeof(*regions); i++)
214 {
215 if (!strncmp(regions[i], area, 4))
216 {
217 return regions_[i];
218 }
219 }
220
221 return 7;
222}
223
224u8 CWII_IPC_HLE_Device_net_kd_request::GetHardwareModel(const char * model)
225{
226 u8 mdl;
227 if (!strncmp(model, "RVL", 4))
228 {
229 mdl = MODEL_RVL;
230 }else if (!strncmp(model, "RVT", 4))
231 {
232 mdl = MODEL_RVT;
233 }else if (!strncmp(model, "RVV", 4))
234 {
235 mdl = MODEL_RVV;
236 }else if (!strncmp(model, "RVD", 4))
237 {
238 mdl = MODEL_RVD;
239 }else
240 {
241 mdl = MODEL_ELSE;
242 }
243 return mdl;
244}
245
246static inline u8 u64_get_byte(u64 value, u8 shift)
247{
248 return (u8)(value >> (shift*8));
249}
250
251static inline u64 u64_insert_byte(u64 value, u8 shift, u8 byte)
252{
253 u64 mask = 0x00000000000000FFULL << (shift*8);
254 u64 inst = (u64)byte << (shift*8);
255 return (value & ~mask) | inst;
256}
257
258s32 CWII_IPC_HLE_Device_net_kd_request::NWC24MakeUserID(u64* nwc24_id, u32 hollywood_id, u16 id_ctr, u8 hardware_model, u8 area_code)
259{
260 const u8 table2[8] = {0x1, 0x5, 0x0, 0x4, 0x2, 0x3, 0x6, 0x7};
261 const u8 table1[16] = {0x4, 0xB, 0x7, 0x9, 0xF, 0x1, 0xD, 0x3, 0xC, 0x2, 0x6, 0xE, 0x8, 0x0, 0xA, 0x5};
262
263 u64 mix_id = ((u64)area_code<<50) | ((u64)hardware_model<<47) | ((u64)hollywood_id<<15) | ((u64)id_ctr<<10);
264 u64 mix_id_copy1 = mix_id;
265
266 int ctr = 0;
267 for (ctr = 0; ctr <= 42; ctr++)
268 {
269 u64 value = mix_id >> (52-ctr);
270 if (value & 1)
271 {
272 value = 0x0000000000000635ULL << (42-ctr);
273 mix_id ^= value;
274 }
275 }
276
277 mix_id = (mix_id_copy1 | (mix_id & 0xFFFFFFFFUL)) ^ 0x0000B3B3B3B3B3B3ULL;
278 mix_id = (mix_id >> 10) | ((mix_id & 0x3FF) << (11+32));
279
280 for (ctr = 0; ctr <= 5; ctr++)
281 {
282 u8 ret = u64_get_byte(mix_id, ctr);
283 u8 foobar = ((table1[(ret>>4)&0xF])<<4) | (table1[ret&0xF]);
284 mix_id = u64_insert_byte(mix_id, ctr, foobar & 0xff);
285 }
286 u64 mix_id_copy2 = mix_id;
287
288 for (ctr = 0; ctr <= 5; ctr++)
289 {
290 u8 ret = u64_get_byte(mix_id_copy2, ctr);
291 mix_id = u64_insert_byte(mix_id, table2[ctr], ret);
292 }
293
294 mix_id &= 0x001FFFFFFFFFFFFFULL;
295 mix_id = (mix_id << 1) | ((mix_id >> 52) & 1);
296
297 mix_id ^= 0x00005E5E5E5E5E5EULL;
298 mix_id &= 0x001FFFFFFFFFFFFFULL;
299
300 *nwc24_id = mix_id;
301
302 if (mix_id > 9999999999999999ULL)
303 return WC24_ERR_FATAL;
304
305 return WC24_OK;
306}
307
308// **********************************************************************************
309// Handle /dev/net/ncd/manage requests
310CWII_IPC_HLE_Device_net_ncd_manage::CWII_IPC_HLE_Device_net_ncd_manage(u32 _DeviceID, const std::string& _rDeviceName)
311 : IWII_IPC_HLE_Device(_DeviceID, _rDeviceName)
312{
313}
314
315CWII_IPC_HLE_Device_net_ncd_manage::~CWII_IPC_HLE_Device_net_ncd_manage()
316{
317}
318
319bool CWII_IPC_HLE_Device_net_ncd_manage::Open(u32 _CommandAddress, u32 _Mode)
320{
321 INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: Open")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 321, "NET_NCD_MANAGE: Open"); } } while (0)
;
322 Memory::Write_U32(GetDeviceID(), _CommandAddress+4);
323 m_Active = true;
324 return true;
325}
326
327bool CWII_IPC_HLE_Device_net_ncd_manage::Close(u32 _CommandAddress, bool _bForce)
328{
329 INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: Close")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 329, "NET_NCD_MANAGE: Close"); } } while (0)
;
330 if (!_bForce)
331 Memory::Write_U32(0, _CommandAddress + 4);
332 m_Active = false;
333 return true;
334}
335
336bool CWII_IPC_HLE_Device_net_ncd_manage::IOCtlV(u32 _CommandAddress)
337{
338 u32 return_value = 0;
339 u32 common_result = 0;
340 u32 common_vector = 0;
341
342 SIOCtlVBuffer CommandBuffer(_CommandAddress);
343
344 switch (CommandBuffer.Parameter)
345 {
346 case IOCTLV_NCD_LOCKWIRELESSDRIVER:
347 break;
348 case IOCTLV_NCD_UNLOCKWIRELESSDRIVER:
349 //Memory::Read_U32(CommandBuffer.InBuffer.at(0).m_Address);
350 break;
351
352 case IOCTLV_NCD_GETCONFIG:
353 INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_GETCONFIG")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 353, "NET_NCD_MANAGE: IOCTLV_NCD_GETCONFIG"); } } while (0)
;
354 config.WriteToMem(CommandBuffer.PayloadBuffer.at(0).m_Address);
355 common_vector = 1;
356 break;
357
358 case IOCTLV_NCD_SETCONFIG:
359 INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_SETCONFIG")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 359, "NET_NCD_MANAGE: IOCTLV_NCD_SETCONFIG"); } } while (0)
;
360 config.ReadFromMem(CommandBuffer.InBuffer.at(0).m_Address);
361 break;
362
363 case IOCTLV_NCD_READCONFIG:
364 INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_READCONFIG")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 364, "NET_NCD_MANAGE: IOCTLV_NCD_READCONFIG"); } } while (0
)
;
365 config.ReadConfig();
366 config.WriteToMem(CommandBuffer.PayloadBuffer.at(0).m_Address);
367 common_vector = 1;
368 break;
369
370 case IOCTLV_NCD_WRITECONFIG:
371 INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_WRITECONFIG")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 371, "NET_NCD_MANAGE: IOCTLV_NCD_WRITECONFIG"); } } while (
0)
;
372 config.ReadFromMem(CommandBuffer.InBuffer.at(0).m_Address);
373 config.WriteConfig();
374 break;
375
376 case IOCTLV_NCD_GETLINKSTATUS:
377 INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_GETLINKSTATUS")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 377, "NET_NCD_MANAGE: IOCTLV_NCD_GETLINKSTATUS"); } } while
(0)
;
378 // Always connected
379 Memory::Write_U32(netcfg_connection_t::LINK_WIRED,
380 CommandBuffer.PayloadBuffer.at(0).m_Address + 4);
381 break;
382
383 case IOCTLV_NCD_GETWIRELESSMACADDRESS:
384 INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE: IOCTLV_NCD_GETWIRELESSMACADDRESS")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 384, "NET_NCD_MANAGE: IOCTLV_NCD_GETWIRELESSMACADDRESS"); }
} while (0)
;
385
386 if (!SConfig::GetInstance().m_WirelessMac.empty())
387 {
388 int x = 0;
389 int tmpaddress[6];
390 for (unsigned int i = 0; i < SConfig::GetInstance().m_WirelessMac.length() && x < 6; i++)
391 {
392 if (SConfig::GetInstance().m_WirelessMac[i] == ':' || SConfig::GetInstance().m_WirelessMac[i] == '-')
393 continue;
394
395 std::stringstream ss;
396 ss << std::hex << SConfig::GetInstance().m_WirelessMac[i];
397 if (SConfig::GetInstance().m_WirelessMac[i+1] != ':' && SConfig::GetInstance().m_WirelessMac[i+1] != '-')
398 {
399 ss << std::hex << SConfig::GetInstance().m_WirelessMac[i+1];
400 i++;
401 }
402 ss >> tmpaddress[x];
403 x++;
404 }
405 u8 address[6];
406 for (int i = 0; i < 6;i++)
407 address[i] = tmpaddress[i];
408 Memory::WriteBigEData(address, CommandBuffer.PayloadBuffer.at(1).m_Address, 4);
409 break;
410 }
411
412 Memory::WriteBigEData(default_address,
413 CommandBuffer.PayloadBuffer.at(1).m_Address, sizeof(default_address));
414 break;
415
416 default:
417 INFO_LOG(WII_IPC_NET, "NET_NCD_MANAGE IOCtlV: %#x", CommandBuffer.Parameter)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 417, "NET_NCD_MANAGE IOCtlV: %#x", CommandBuffer.Parameter)
; } } while (0)
;
418 break;
419 }
420
421 Memory::Write_U32(common_result,
422 CommandBuffer.PayloadBuffer.at(common_vector).m_Address);
423 if (common_vector == 1)
424 {
425 Memory::Write_U32(common_result,
426 CommandBuffer.PayloadBuffer.at(common_vector).m_Address + 4);
427 }
428 Memory::Write_U32(return_value, _CommandAddress + 4);
429 return true;
430}
431
432// **********************************************************************************
433// Handle /dev/net/wd/command requests
434CWII_IPC_HLE_Device_net_wd_command::CWII_IPC_HLE_Device_net_wd_command(u32 DeviceID, const std::string& DeviceName)
435 : IWII_IPC_HLE_Device(DeviceID, DeviceName)
436{
437}
438
439CWII_IPC_HLE_Device_net_wd_command::~CWII_IPC_HLE_Device_net_wd_command()
440{
441}
442
443bool CWII_IPC_HLE_Device_net_wd_command::Open(u32 CommandAddress, u32 Mode)
444{
445 INFO_LOG(WII_IPC_NET, "NET_WD_COMMAND: Open")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 445, "NET_WD_COMMAND: Open"); } } while (0)
;
446 Memory::Write_U32(GetDeviceID(), CommandAddress + 4);
447 m_Active = true;
448 return true;
449}
450
451bool CWII_IPC_HLE_Device_net_wd_command::Close(u32 CommandAddress, bool Force)
452{
453 INFO_LOG(WII_IPC_NET, "NET_WD_COMMAND: Close")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 453, "NET_WD_COMMAND: Close"); } } while (0)
;
454 if (!Force)
455 Memory::Write_U32(0, CommandAddress + 4);
456 m_Active = false;
457 return true;
458}
459
460// This is just for debugging / playing around.
461// There really is no reason to implement wd unless we can bend it such that
462// we can talk to the DS.
463#include "StringUtil.h"
464bool CWII_IPC_HLE_Device_net_wd_command::IOCtlV(u32 CommandAddress)
465{
466 u32 return_value = 0;
467
468 SIOCtlVBuffer CommandBuffer(CommandAddress);
469
470 switch (CommandBuffer.Parameter)
471 {
472 case IOCTLV_WD_SCAN:
473 {
474 // Gives parameters detailing type of scan and what to match
475 ScanInfo *scan = (ScanInfo *)Memory::GetPointer(CommandBuffer.InBuffer.at(0).m_Address);
476
477 u16 *results = (u16 *)Memory::GetPointer(CommandBuffer.PayloadBuffer.at(0).m_Address);
478 // first u16 indicates number of BSSInfo following
479 results[0] = Common::swap16(1);
480
481 BSSInfo *bss = (BSSInfo *)&results[1];
482 memset(bss, 0, sizeof(BSSInfo));
483
484 bss->length = Common::swap16(sizeof(BSSInfo));
485 bss->rssi = Common::swap16(0xffff);
486
487 for (int i = 0; i < BSSID_SIZE; ++i)
488 bss->bssid[i] = i;
489
490 const char *ssid = "dolphin-emu";
491 strcpy((char *)bss->ssid, ssid);
492 bss->ssid_length = Common::swap16((u16)strlen(ssid));
493
494 bss->channel = Common::swap16(2);
495 }
496 break;
497
498 case IOCTLV_WD_GET_INFO:
499 {
500 Info *info = (Info *)Memory::GetPointer(CommandBuffer.PayloadBuffer.at(0).m_Address);
501 memset(info, 0, sizeof(Info));
502 // Probably used to disallow certain channels?
503 memcpy(info->country, "US", 2);
504 info->ntr_allowed_channels = Common::swap16(0xfffe);
505 memcpy(info->mac, default_address, 6);
506 }
507 break;
508
509 case IOCTLV_WD_GET_MODE:
510 case IOCTLV_WD_SET_LINKSTATE:
511 case IOCTLV_WD_GET_LINKSTATE:
512 case IOCTLV_WD_SET_CONFIG:
513 case IOCTLV_WD_GET_CONFIG:
514 case IOCTLV_WD_CHANGE_BEACON:
515 case IOCTLV_WD_DISASSOC:
516 case IOCTLV_WD_MP_SEND_FRAME:
517 case IOCTLV_WD_SEND_FRAME:
518 case IOCTLV_WD_CALL_WL:
519 case IOCTLV_WD_MEASURE_CHANNEL:
520 case IOCTLV_WD_GET_LASTERROR:
521 case IOCTLV_WD_CHANGE_GAMEINFO:
522 case IOCTLV_WD_CHANGE_VTSF:
523 case IOCTLV_WD_RECV_FRAME:
524 case IOCTLV_WD_RECV_NOTIFICATION:
525 default:
526 INFO_LOG(WII_IPC_NET, "NET_WD_COMMAND IOCtlV %#x in %i out %i",do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 527, "NET_WD_COMMAND IOCtlV %#x in %i out %i", CommandBuffer
.Parameter, CommandBuffer.NumberInBuffer, CommandBuffer.NumberPayloadBuffer
); } } while (0)
527 CommandBuffer.Parameter, CommandBuffer.NumberInBuffer, CommandBuffer.NumberPayloadBuffer)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 527, "NET_WD_COMMAND IOCtlV %#x in %i out %i", CommandBuffer
.Parameter, CommandBuffer.NumberInBuffer, CommandBuffer.NumberPayloadBuffer
); } } while (0)
;
528 for (u32 i = 0; i < CommandBuffer.NumberInBuffer; ++i)
529 {
530 INFO_LOG(WII_IPC_NET, "in %i addr %x size %i", i,do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 531, "in %i addr %x size %i", i, CommandBuffer.InBuffer.at(
i).m_Address, CommandBuffer.InBuffer.at(i).m_Size); } } while
(0)
531 CommandBuffer.InBuffer.at(i).m_Address, CommandBuffer.InBuffer.at(i).m_Size)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 531, "in %i addr %x size %i", i, CommandBuffer.InBuffer.at(
i).m_Address, CommandBuffer.InBuffer.at(i).m_Size); } } while
(0)
;
532 INFO_LOG(WII_IPC_NET, "%s",do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 536, "%s", ArrayToString( Memory::GetPointer(CommandBuffer.
InBuffer.at(i).m_Address), CommandBuffer.InBuffer.at(i).m_Size
).c_str()); } } while (0)
533 ArrayToString(do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 536, "%s", ArrayToString( Memory::GetPointer(CommandBuffer.
InBuffer.at(i).m_Address), CommandBuffer.InBuffer.at(i).m_Size
).c_str()); } } while (0)
534 Memory::GetPointer(CommandBuffer.InBuffer.at(i).m_Address),do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 536, "%s", ArrayToString( Memory::GetPointer(CommandBuffer.
InBuffer.at(i).m_Address), CommandBuffer.InBuffer.at(i).m_Size
).c_str()); } } while (0)
535 CommandBuffer.InBuffer.at(i).m_Size).c_str()do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 536, "%s", ArrayToString( Memory::GetPointer(CommandBuffer.
InBuffer.at(i).m_Address), CommandBuffer.InBuffer.at(i).m_Size
).c_str()); } } while (0)
536 )do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 536, "%s", ArrayToString( Memory::GetPointer(CommandBuffer.
InBuffer.at(i).m_Address), CommandBuffer.InBuffer.at(i).m_Size
).c_str()); } } while (0)
;
537 }
538 for (u32 i = 0; i < CommandBuffer.NumberPayloadBuffer; ++i)
539 {
540 INFO_LOG(WII_IPC_NET, "out %i addr %x size %i", i,do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 541, "out %i addr %x size %i", i, CommandBuffer.PayloadBuffer
.at(i).m_Address, CommandBuffer.PayloadBuffer.at(i).m_Size); }
} while (0)
541 CommandBuffer.PayloadBuffer.at(i).m_Address, CommandBuffer.PayloadBuffer.at(i).m_Size)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 541, "out %i addr %x size %i", i, CommandBuffer.PayloadBuffer
.at(i).m_Address, CommandBuffer.PayloadBuffer.at(i).m_Size); }
} while (0)
;
542 }
543 break;
544 }
545
546 Memory::Write_U32(return_value, CommandAddress + 4);
547 return true;
548}
549
550// **********************************************************************************
551// Handle /dev/net/ip/top requests
552CWII_IPC_HLE_Device_net_ip_top::CWII_IPC_HLE_Device_net_ip_top(u32 _DeviceID, const std::string& _rDeviceName)
553 : IWII_IPC_HLE_Device(_DeviceID, _rDeviceName)
554{
555#ifdef _WIN32
556 int ret = WSAStartup(MAKEWORD(2,2), &InitData);
557 INFO_LOG(WII_IPC_NET, "WSAStartup: %d", ret)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 557, "WSAStartup: %d", ret); } } while (0)
;
558#endif
559}
560
561CWII_IPC_HLE_Device_net_ip_top::~CWII_IPC_HLE_Device_net_ip_top()
562{
563#ifdef _WIN32
564 WSACleanup();
565#endif
566}
567
568bool CWII_IPC_HLE_Device_net_ip_top::Open(u32 _CommandAddress, u32 _Mode)
569{
570 INFO_LOG(WII_IPC_NET, "NET_IP_TOP: Open")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 570, "NET_IP_TOP: Open"); } } while (0)
;
571 Memory::Write_U32(GetDeviceID(), _CommandAddress+4);
572 m_Active = true;
573 return true;
574}
575
576bool CWII_IPC_HLE_Device_net_ip_top::Close(u32 _CommandAddress, bool _bForce)
577{
578 INFO_LOG(WII_IPC_NET, "NET_IP_TOP: Close")do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 578, "NET_IP_TOP: Close"); } } while (0)
;
579 if (!_bForce)
580 Memory::Write_U32(0, _CommandAddress + 4);
581 m_Active = false;
582 return true;
583}
584
585static int inet_pton(const char *src, unsigned char *dst)
586{
587 int saw_digit, octets;
588 char ch;
589 unsigned char tmp[4], *tp;
590
591 saw_digit = 0;
592 octets = 0;
593 *(tp = tmp) = 0;
594 while ((ch = *src++) != '\0') {
595 if (ch >= '0' && ch <= '9') {
596 unsigned int newt = (*tp * 10) + (ch - '0');
597
598 if (newt > 255)
599 return (0);
600 *tp = newt;
601 if (! saw_digit) {
602 if (++octets > 4)
603 return (0);
604 saw_digit = 1;
605 }
606 } else if (ch == '.' && saw_digit) {
607 if (octets == 4)
608 return (0);
609 *++tp = 0;
610 saw_digit = 0;
611 } else
612 return (0);
613 }
614 if (octets < 4)
615 return (0);
616 memcpy(dst, tmp, 4);
617 return (1);
618}
619
620// Maps SOCKOPT level from native to Wii
621static unsigned int opt_level_mapping[][2] = {
622 { SOL_SOCKET1, 0xFFFF }
623};
624
625// Maps SOCKOPT optname from native to Wii
626static unsigned int opt_name_mapping[][2] = {
627 { SO_REUSEADDR2, 0x4 },
628 { SO_SNDBUF7, 0x1001 },
629 { SO_RCVBUF8, 0x1002 },
630 { SO_ERROR4, 0x1009 }
631};
632
633bool CWII_IPC_HLE_Device_net_ip_top::IOCtl(u32 _CommandAddress)
634{
635 u32 Command = Memory::Read_U32(_CommandAddress + 0x0C);
636 u32 BufferIn = Memory::Read_U32(_CommandAddress + 0x10);
637 u32 BufferInSize = Memory::Read_U32(_CommandAddress + 0x14);
638 u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18);
639 u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C);
640
641 u32 ReturnValue = 0;
642 switch (Command)
643 {
644 case IOCTL_SO_STARTUP:
645 {
646 INFO_LOG(WII_IPC_NET, "IOCTL_SO_STARTUP "do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 648, "IOCTL_SO_STARTUP " "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, BufferIn, BufferInSize, BufferOut, BufferOutSize); } } while
(0)
647 "BufferIn: (%08x, %i), BufferOut: (%08x, %i)",do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 648, "IOCTL_SO_STARTUP " "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, BufferIn, BufferInSize, BufferOut, BufferOutSize); } } while
(0)
648 BufferIn, BufferInSize, BufferOut, BufferOutSize)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 648, "IOCTL_SO_STARTUP " "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, BufferIn, BufferInSize, BufferOut, BufferOutSize); } } while
(0)
;
649 break;
650 }
651 case IOCTL_SO_SOCKET:
652 {
653 u32 af = Memory::Read_U32(BufferIn);
654 u32 type = Memory::Read_U32(BufferIn + 0x04);
655 u32 prot = Memory::Read_U32(BufferIn + 0x08);
656
657 WiiSockMan &sm = WiiSockMan::getInstance();
658 ReturnValue = sm.newSocket(af, type, prot);
659 INFO_LOG(WII_IPC_NET, "IOCTL_SO_SOCKET "do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 661, "IOCTL_SO_SOCKET " "Socket: %08x (%d,%d,%d), BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, ReturnValue, af, type, prot, BufferIn, BufferInSize, BufferOut
, BufferOutSize); } } while (0)
660 "Socket: %08x (%d,%d,%d), BufferIn: (%08x, %i), BufferOut: (%08x, %i)",do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 661, "IOCTL_SO_SOCKET " "Socket: %08x (%d,%d,%d), BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, ReturnValue, af, type, prot, BufferIn, BufferInSize, BufferOut
, BufferOutSize); } } while (0)
661 ReturnValue, af, type, prot, BufferIn, BufferInSize, BufferOut, BufferOutSize)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 661, "IOCTL_SO_SOCKET " "Socket: %08x (%d,%d,%d), BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, ReturnValue, af, type, prot, BufferIn, BufferInSize, BufferOut
, BufferOutSize); } } while (0)
;
662 break;
663 }
664 case IOCTL_SO_ICMPSOCKET:
665 {
666 u32 pf = Memory::Read_U32(BufferIn);
667
668 WiiSockMan &sm = WiiSockMan::getInstance();
669 ReturnValue = sm.newSocket(pf, SOCK_RAWSOCK_RAW, IPPROTO_ICMPIPPROTO_ICMP);
670 INFO_LOG(WII_IPC_NET, "IOCTL_SO_ICMPSOCKET(%x) %d", pf, ReturnValue)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 670, "IOCTL_SO_ICMPSOCKET(%x) %d", pf, ReturnValue); } } while
(0)
;
671 break;
672 }
673 case IOCTL_SO_CLOSE:
674 case IOCTL_SO_ICMPCLOSE:
675 {
676 u32 fd = Memory::Read_U32(BufferIn);
677 WiiSockMan &sm = WiiSockMan::getInstance();
678 ReturnValue = sm.delSocket(fd);
679 DEBUG_LOG(WII_IPC_NET, "%s(%x) %x",do { { if (LogTypes::LDEBUG <= 3) GenericLog(LogTypes::LDEBUG
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 681, "%s(%x) %x", Command == IOCTL_SO_ICMPCLOSE ? "IOCTL_SO_ICMPCLOSE"
: "IOCTL_SO_CLOSE", fd, ReturnValue); } } while (0)
680 Command == IOCTL_SO_ICMPCLOSE ? "IOCTL_SO_ICMPCLOSE" : "IOCTL_SO_CLOSE",do { { if (LogTypes::LDEBUG <= 3) GenericLog(LogTypes::LDEBUG
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 681, "%s(%x) %x", Command == IOCTL_SO_ICMPCLOSE ? "IOCTL_SO_ICMPCLOSE"
: "IOCTL_SO_CLOSE", fd, ReturnValue); } } while (0)
681 fd, ReturnValue)do { { if (LogTypes::LDEBUG <= 3) GenericLog(LogTypes::LDEBUG
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 681, "%s(%x) %x", Command == IOCTL_SO_ICMPCLOSE ? "IOCTL_SO_ICMPCLOSE"
: "IOCTL_SO_CLOSE", fd, ReturnValue); } } while (0)
;
682 break;
683 }
684 case IOCTL_SO_ACCEPT:
685 case IOCTL_SO_BIND:
686 case IOCTL_SO_CONNECT:
687 case IOCTL_SO_FCNTL:
688 {
689 u32 fd = Memory::Read_U32(BufferIn);
690 WiiSockMan &sm = WiiSockMan::getInstance();
691 sm.doSock(fd, _CommandAddress, (NET_IOCTL)Command);
692 return false;
693 break;
694 }
695 /////////////////////////////////////////////////////////////
696 // TODO: Tidy all below //
697 /////////////////////////////////////////////////////////////
698 case IOCTL_SO_SHUTDOWN:
699 {
700 INFO_LOG(WII_IPC_NET, "IOCTL_SO_SHUTDOWN "do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 702, "IOCTL_SO_SHUTDOWN " "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, BufferIn, BufferInSize, BufferOut, BufferOutSize); } } while
(0)
701 "BufferIn: (%08x, %i), BufferOut: (%08x, %i)",do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 702, "IOCTL_SO_SHUTDOWN " "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, BufferIn, BufferInSize, BufferOut, BufferOutSize); } } while
(0)
702 BufferIn, BufferInSize, BufferOut, BufferOutSize)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 702, "IOCTL_SO_SHUTDOWN " "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, BufferIn, BufferInSize, BufferOut, BufferOutSize); } } while
(0)
;
703
704 u32 fd = Memory::Read_U32(BufferIn);
705 u32 how = Memory::Read_U32(BufferIn+4);
706 int ret = shutdown(fd, how);
707 ReturnValue = WiiSockMan::getNetErrorCode(ret, "SO_SHUTDOWN", false);
708 break;
709 }
710 case IOCTL_SO_LISTEN:
711 {
712
713 u32 fd = Memory::Read_U32(BufferIn);
714 u32 BACKLOG = Memory::Read_U32(BufferIn + 0x04);
715 u32 ret = listen(fd, BACKLOG);
716 ReturnValue = WiiSockMan::getNetErrorCode(ret, "SO_LISTEN", false);
717 INFO_LOG(WII_IPC_NET, "IOCTL_SO_LISTEN = %d "do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 719, "IOCTL_SO_LISTEN = %d " "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, ReturnValue, BufferIn, BufferInSize, BufferOut, BufferOutSize
); } } while (0)
718 "BufferIn: (%08x, %i), BufferOut: (%08x, %i)",do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 719, "IOCTL_SO_LISTEN = %d " "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, ReturnValue, BufferIn, BufferInSize, BufferOut, BufferOutSize
); } } while (0)
719 ReturnValue, BufferIn, BufferInSize, BufferOut, BufferOutSize)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 719, "IOCTL_SO_LISTEN = %d " "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, ReturnValue, BufferIn, BufferInSize, BufferOut, BufferOutSize
); } } while (0)
;
720 break;
721 }
722 case IOCTL_SO_GETSOCKOPT:
723 {
724 u32 fd = Memory::Read_U32(BufferOut);
725 u32 level = Memory::Read_U32(BufferOut + 4);
726 u32 optname = Memory::Read_U32(BufferOut + 8);
727
728 INFO_LOG(WII_IPC_NET,"IOCTL_SO_GETSOCKOPT(%08x, %08x, %08x)"do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 731, "IOCTL_SO_GETSOCKOPT(%08x, %08x, %08x)" "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, fd, level, optname, BufferIn, BufferInSize, BufferOut, BufferOutSize
); } } while (0)
729 "BufferIn: (%08x, %i), BufferOut: (%08x, %i)",do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 731, "IOCTL_SO_GETSOCKOPT(%08x, %08x, %08x)" "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, fd, level, optname, BufferIn, BufferInSize, BufferOut, BufferOutSize
); } } while (0)
730 fd, level, optname,do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 731, "IOCTL_SO_GETSOCKOPT(%08x, %08x, %08x)" "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, fd, level, optname, BufferIn, BufferInSize, BufferOut, BufferOutSize
); } } while (0)
731 BufferIn, BufferInSize, BufferOut, BufferOutSize)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 731, "IOCTL_SO_GETSOCKOPT(%08x, %08x, %08x)" "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, fd, level, optname, BufferIn, BufferInSize, BufferOut, BufferOutSize
); } } while (0)
;
732
733 // Do the level/optname translation
734 int nat_level = -1, nat_optname = -1;
735
736 for (unsigned int i = 0; i < sizeof (opt_level_mapping) / sizeof (opt_level_mapping[0]); ++i)
737 if (level == opt_level_mapping[i][1])
738 nat_level = opt_level_mapping[i][0];
739
740 for (unsigned int i = 0; i < sizeof (opt_name_mapping) / sizeof (opt_name_mapping[0]); ++i)
741 if (optname == opt_name_mapping[i][1])
742 nat_optname = opt_name_mapping[i][0];
743
744 u8 optval[20];
745 u32 optlen = 4;
746
747 int ret = getsockopt (fd, nat_level, nat_optname, (char *) &optval, (socklen_t*)&optlen);
748 ReturnValue = WiiSockMan::getNetErrorCode(ret, "SO_GETSOCKOPT", false);
749
750
751 Memory::Write_U32(optlen, BufferOut + 0xC);
752 Memory::WriteBigEData((u8 *) optval, BufferOut + 0x10, optlen);
753
754 if (optname == 0x1007){
755 s32 errorcode = Memory::Read_U32(BufferOut + 0x10);
Value stored to 'errorcode' during its initialization is never read
756 INFO_LOG(WII_IPC_NET,"IOCTL_SO_GETSOCKOPT error code = %i", errorcode)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 756, "IOCTL_SO_GETSOCKOPT error code = %i", errorcode); } }
while (0)
;
757 }
758 else if (optname == SO_ERROR4)
759 {
760 s32 last_error = WiiSockMan::getInstance().getLastNetError();
761
762 Memory::Write_U32(sizeof(s32), BufferOut + 0xC);
763 Memory::Write_U32(last_error, BufferOut + 0x10);
764 }
765 break;
766 }
767
768 case IOCTL_SO_SETSOCKOPT:
769 {
770 u32 fd = Memory::Read_U32(BufferIn);
771 u32 level = Memory::Read_U32(BufferIn + 4);
772 u32 optname = Memory::Read_U32(BufferIn + 8);
773 u32 optlen = Memory::Read_U32(BufferIn + 0xc);
774 u8 optval[20];
775 Memory::ReadBigEData(optval, BufferIn + 0x10, optlen);
776
777 INFO_LOG(WII_IPC_NET, "IOCTL_SO_SETSOCKOPT(%08x, %08x, %08x, %08x) "do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 780, "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"
, fd, 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]); } } while
(0)
778 "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 780, "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"
, fd, 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]); } } while
(0)
779 "%02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx %02hhx",do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 780, "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"
, fd, 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]); } } while
(0)
780 fd, 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])do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 780, "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"
, fd, 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]); } } while
(0)
;
781
782 //TODO: bug booto about this, 0x2005 most likely timeout related, default value on wii is , 0x2001 is most likely tcpnodelay
783 if (level == 6 && (optname == 0x2005 || optname == 0x2001)){
784 ReturnValue = 0;
785 break;
786 }
787
788 // Do the level/optname translation
789 int nat_level = -1, nat_optname = -1;
790
791 for (unsigned int i = 0; i < sizeof (opt_level_mapping) / sizeof (opt_level_mapping[0]); ++i)
792 if (level == opt_level_mapping[i][1])
793 nat_level = opt_level_mapping[i][0];
794
795 for (unsigned int i = 0; i < sizeof (opt_name_mapping) / sizeof (opt_name_mapping[0]); ++i)
796 if (optname == opt_name_mapping[i][1])
797 nat_optname = opt_name_mapping[i][0];
798
799 if (nat_level == -1 || nat_optname == -1)
800 {
801 INFO_LOG(WII_IPC_NET, "SO_SETSOCKOPT: unknown level %d or optname %d", level, optname)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 801, "SO_SETSOCKOPT: unknown level %d or optname %d", level
, optname); } } while (0)
;
802
803 // Default to the given level/optname. They match on Windows...
804 nat_level = level;
805 nat_optname = optname;
806 }
807
808 int ret = setsockopt(fd, nat_level, nat_optname, (char*)optval, optlen);
809 ReturnValue = WiiSockMan::getNetErrorCode(ret, "SO_SETSOCKOPT", false);
810 break;
811 }
812 case IOCTL_SO_GETSOCKNAME:
813 {
814 u32 fd = Memory::Read_U32(BufferIn);
815
816 INFO_LOG(WII_IPC_NET, "IOCTL_SO_GETSOCKNAME "do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 818, "IOCTL_SO_GETSOCKNAME " "Socket: %08X, BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, fd, BufferIn, BufferInSize, BufferOut, BufferOutSize); } } while
(0)
817 "Socket: %08X, BufferIn: (%08x, %i), BufferOut: (%08x, %i)",do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 818, "IOCTL_SO_GETSOCKNAME " "Socket: %08X, BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, fd, BufferIn, BufferInSize, BufferOut, BufferOutSize); } } while
(0)
818 fd, BufferIn, BufferInSize, BufferOut, BufferOutSize)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 818, "IOCTL_SO_GETSOCKNAME " "Socket: %08X, BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, fd, BufferIn, BufferInSize, BufferOut, BufferOutSize); } } while
(0)
;
819
820 sockaddr sa;
821 socklen_t sa_len;
822 sa_len = sizeof(sa);
823 int ret = getsockname(fd, &sa, &sa_len);
824
825 Memory::Write_U8(BufferOutSize, BufferOut);
826 Memory::Write_U8(sa.sa_family & 0xFF, BufferOut + 1);
827 Memory::WriteBigEData((u8*)&sa.sa_data, BufferOut + 2, BufferOutSize - 2);
828 ReturnValue = ret;
829 break;
830 }
831 case IOCTL_SO_GETPEERNAME:
832 {
833 u32 fd = Memory::Read_U32(BufferIn);
834
835 sockaddr sa;
836 socklen_t sa_len;
837 sa_len = sizeof(sa);
838
839 int ret = getpeername(fd, &sa, &sa_len);
840
841 Memory::Write_U8(BufferOutSize, BufferOut);
842 Memory::Write_U8(AF_INET2, BufferOut + 1);
843 Memory::WriteBigEData((u8*)&sa.sa_data, BufferOut + 2, BufferOutSize - 2);
844
845 INFO_LOG(WII_IPC_NET, "IOCTL_SO_GETPEERNAME(%x)", fd)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 845, "IOCTL_SO_GETPEERNAME(%x)", fd); } } while (0)
;
846
847 ReturnValue = ret;
848 break;
849 }
850
851 case IOCTL_SO_GETHOSTID:
852 {
853 INFO_LOG(WII_IPC_NET, "IOCTL_SO_GETHOSTID "do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 855, "IOCTL_SO_GETHOSTID " "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, BufferIn, BufferInSize, BufferOut, BufferOutSize); } } while
(0)
854 "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)",do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 855, "IOCTL_SO_GETHOSTID " "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, BufferIn, BufferInSize, BufferOut, BufferOutSize); } } while
(0)
855 BufferIn, BufferInSize, BufferOut, BufferOutSize)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 855, "IOCTL_SO_GETHOSTID " "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, BufferIn, BufferInSize, BufferOut, BufferOutSize); } } while
(0)
;
856 ReturnValue = 192 << 24 | 168 << 16 | 1 << 8 | 150;
857 break;
858 }
859
860 case IOCTL_SO_INETATON:
861 {
862 struct hostent *remoteHost = gethostbyname((char*)Memory::GetPointer(BufferIn));
863
864 Memory::Write_U32(Common::swap32(*(u32 *)remoteHost->h_addr_list[0]), BufferOut);
865 INFO_LOG(WII_IPC_NET, "IOCTL_SO_INETATON = %d "do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 867, "IOCTL_SO_INETATON = %d " "%s, BufferIn: (%08x, %i), BufferOut: (%08x, %i), IP Found: %08X"
,remoteHost->h_addr_list[0] == 0 ? -1 : 0, (char*)Memory::
GetPointer(BufferIn), BufferIn, BufferInSize, BufferOut, BufferOutSize
, Common::swap32(*(u32 *)remoteHost->h_addr_list[0])); } }
while (0)
866 "%s, BufferIn: (%08x, %i), BufferOut: (%08x, %i), IP Found: %08X",remoteHost->h_addr_list[0] == 0 ? -1 : 0,do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 867, "IOCTL_SO_INETATON = %d " "%s, BufferIn: (%08x, %i), BufferOut: (%08x, %i), IP Found: %08X"
,remoteHost->h_addr_list[0] == 0 ? -1 : 0, (char*)Memory::
GetPointer(BufferIn), BufferIn, BufferInSize, BufferOut, BufferOutSize
, Common::swap32(*(u32 *)remoteHost->h_addr_list[0])); } }
while (0)
867 (char*)Memory::GetPointer(BufferIn), BufferIn, BufferInSize, BufferOut, BufferOutSize, Common::swap32(*(u32 *)remoteHost->h_addr_list[0]))do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 867, "IOCTL_SO_INETATON = %d " "%s, BufferIn: (%08x, %i), BufferOut: (%08x, %i), IP Found: %08X"
,remoteHost->h_addr_list[0] == 0 ? -1 : 0, (char*)Memory::
GetPointer(BufferIn), BufferIn, BufferInSize, BufferOut, BufferOutSize
, Common::swap32(*(u32 *)remoteHost->h_addr_list[0])); } }
while (0)
;
868 ReturnValue = remoteHost->h_addr_list[0] == 0 ? 0 : 1;
869 break;
870 }
871
872 case IOCTL_SO_INETPTON:
873 {
874 INFO_LOG(WII_IPC_NET, "IOCTL_SO_INETPTON "do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 875, "IOCTL_SO_INETPTON " "(Translating: %s)", Memory::GetPointer
(BufferIn)); } } while (0)
875 "(Translating: %s)", Memory::GetPointer(BufferIn))do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 875, "IOCTL_SO_INETPTON " "(Translating: %s)", Memory::GetPointer
(BufferIn)); } } while (0)
;
876 ReturnValue = inet_pton((char*)Memory::GetPointer(BufferIn), Memory::GetPointer(BufferOut+4));
877 break;
878 }
879
880 case IOCTL_SO_INETNTOP:
881 {
882 //u32 af = Memory::Read_U32(BufferIn);
883 //u32 validAddress = Memory::Read_U32(BufferIn + 4);
884 //u32 src = Memory::Read_U32(BufferIn + 8);
885 char ip_s[16];
886 sprintf(ip_s, "%i.%i.%i.%i",
887 Memory::Read_U8(BufferIn + 8),
888 Memory::Read_U8(BufferIn + 8 + 1),
889 Memory::Read_U8(BufferIn + 8 + 2),
890 Memory::Read_U8(BufferIn + 8 + 3)
891 );
892 INFO_LOG(WII_IPC_NET, "IOCTL_SO_INETNTOP %s", ip_s)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 892, "IOCTL_SO_INETNTOP %s", ip_s); } } while (0)
;
893 memset(Memory::GetPointer(BufferOut), 0, BufferOutSize);
894 memcpy(Memory::GetPointer(BufferOut), ip_s, strlen(ip_s));
895 break;
896 }
897
898 case IOCTL_SO_POLL:
899 {
900 // Map Wii/native poll events types
901 unsigned int mapping[][2] = {
902 { POLLIN0x001, 0x0001 },
903 { POLLOUT0x004, 0x0008 },
904 { POLLHUP0x010, 0x0040 },
905 };
906
907 u32 unknown = Memory::Read_U32(BufferIn);
908 u32 timeout = Memory::Read_U32(BufferIn + 4);
909
910 int nfds = BufferOutSize / 0xc;
911 if (nfds == 0)
912 ERROR_LOG(WII_IPC_NET, "Hidden POLL")do { { if (LogTypes::LERROR <= 3) GenericLog(LogTypes::LERROR
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 912, "Hidden POLL"); } } while (0)
;
913
914 pollfd_t* ufds = (pollfd_t *)malloc(sizeof(pollfd_t) * nfds);
915 if (ufds == NULL__null)
916 {
917 ReturnValue = -1;
918 break;
919 }
920
921 for (int i = 0; i < nfds; i++)
922 {
923 ufds[i].fd = Memory::Read_U32(BufferOut + 0xc*i); //fd
924 int events = Memory::Read_U32(BufferOut + 0xc*i + 4); //events
925 ufds[i].revents = Memory::Read_U32(BufferOut + 0xc*i + 8); //revents
926
927 // Translate Wii to native events
928 int unhandled_events = events;
929 ufds[i].events = 0;
930 for (unsigned int j = 0; j < sizeof (mapping) / sizeof (mapping[0]); ++j)
931 {
932 if (events & mapping[j][1])
933 ufds[i].events |= mapping[j][0];
934 unhandled_events &= ~mapping[j][1];
935 }
936
937 DEBUG_LOG(WII_IPC_NET, "IOCTL_SO_POLL(%d) "do { { if (LogTypes::LDEBUG <= 3) GenericLog(LogTypes::LDEBUG
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 941, "IOCTL_SO_POLL(%d) " "Sock: %08x, Unknown: %08x, Events: %08x, "
"NativeEvents: %08x", i, ufds[i].fd, unknown, events, ufds[i
].events); } } while (0)
938 "Sock: %08x, Unknown: %08x, Events: %08x, "do { { if (LogTypes::LDEBUG <= 3) GenericLog(LogTypes::LDEBUG
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 941, "IOCTL_SO_POLL(%d) " "Sock: %08x, Unknown: %08x, Events: %08x, "
"NativeEvents: %08x", i, ufds[i].fd, unknown, events, ufds[i
].events); } } while (0)
939 "NativeEvents: %08x",do { { if (LogTypes::LDEBUG <= 3) GenericLog(LogTypes::LDEBUG
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 941, "IOCTL_SO_POLL(%d) " "Sock: %08x, Unknown: %08x, Events: %08x, "
"NativeEvents: %08x", i, ufds[i].fd, unknown, events, ufds[i
].events); } } while (0)
940 i, ufds[i].fd, unknown, events, ufds[i].eventsdo { { if (LogTypes::LDEBUG <= 3) GenericLog(LogTypes::LDEBUG
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 941, "IOCTL_SO_POLL(%d) " "Sock: %08x, Unknown: %08x, Events: %08x, "
"NativeEvents: %08x", i, ufds[i].fd, unknown, events, ufds[i
].events); } } while (0)
941 )do { { if (LogTypes::LDEBUG <= 3) GenericLog(LogTypes::LDEBUG
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 941, "IOCTL_SO_POLL(%d) " "Sock: %08x, Unknown: %08x, Events: %08x, "
"NativeEvents: %08x", i, ufds[i].fd, unknown, events, ufds[i
].events); } } while (0)
;
942
943 if (unhandled_events)
944 ERROR_LOG(WII_IPC_NET, "SO_POLL: unhandled Wii event types: %04x", unhandled_events)do { { if (LogTypes::LERROR <= 3) GenericLog(LogTypes::LERROR
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 944, "SO_POLL: unhandled Wii event types: %04x", unhandled_events
); } } while (0)
;
945 }
946
947 int ret = poll(ufds, nfds, timeout);
948 ret = WiiSockMan::getNetErrorCode(ret, "SO_POLL", false);
949
950 for (int i = 0; i<nfds; i++)
951 {
952
953 // Translate native to Wii events
954 int revents = 0;
955 for (unsigned int j = 0; j < sizeof (mapping) / sizeof (mapping[0]); ++j)
956 {
957 if (ufds[i].revents & mapping[j][0])
958 revents |= mapping[j][1];
959 }
960
961 // No need to change fd or events as they are input only.
962 //Memory::Write_U32(ufds[i].fd, BufferOut + 0xc*i); //fd
963 //Memory::Write_U32(events, BufferOut + 0xc*i + 4); //events
964 Memory::Write_U32(revents, BufferOut + 0xc*i + 8); //revents
965
966 DEBUG_LOG(WII_IPC_NET, "IOCTL_SO_POLL socket %d revents %08X events %08X", i, revents, ufds[i].events)do { { if (LogTypes::LDEBUG <= 3) GenericLog(LogTypes::LDEBUG
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 966, "IOCTL_SO_POLL socket %d revents %08X events %08X", i,
revents, ufds[i].events); } } while (0)
;
967 }
968 free(ufds);
969
970 ReturnValue = ret;
971 break;
972 }
973
974 case IOCTL_SO_GETHOSTBYNAME:
975 {
976 hostent *remoteHost = gethostbyname((char*)Memory::GetPointer(BufferIn));
977
978 INFO_LOG(WII_IPC_NET, "IOCTL_SO_GETHOSTBYNAME "do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 980, "IOCTL_SO_GETHOSTBYNAME " "Address: %s, BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, (char*)Memory::GetPointer(BufferIn), BufferIn, BufferInSize
, BufferOut, BufferOutSize); } } while (0)
979 "Address: %s, BufferIn: (%08x, %i), BufferOut: (%08x, %i)",do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 980, "IOCTL_SO_GETHOSTBYNAME " "Address: %s, BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, (char*)Memory::GetPointer(BufferIn), BufferIn, BufferInSize
, BufferOut, BufferOutSize); } } while (0)
980 (char*)Memory::GetPointer(BufferIn), BufferIn, BufferInSize, BufferOut, BufferOutSize)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 980, "IOCTL_SO_GETHOSTBYNAME " "Address: %s, BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, (char*)Memory::GetPointer(BufferIn), BufferIn, BufferInSize
, BufferOut, BufferOutSize); } } while (0)
;
981
982 if (remoteHost)
983 {
984 for (int i = 0; remoteHost->h_aliases[i]; ++i)
985 {
986 INFO_LOG(WII_IPC_NET, "alias%i:%s", i, remoteHost->h_aliases[i])do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 986, "alias%i:%s", i, remoteHost->h_aliases[i]); } } while
(0)
;
987 }
988
989 for (int i = 0; remoteHost->h_addr_list[i]; ++i)
990 {
991 u32 ip = Common::swap32(*(u32*)(remoteHost->h_addr_list[i]));
992 char ip_s[16];
993 sprintf(ip_s, "%i.%i.%i.%i",
994 ip >> 24, (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff);
995 DEBUG_LOG(WII_IPC_NET, "addr%i:%s", i, ip_s)do { { if (LogTypes::LDEBUG <= 3) GenericLog(LogTypes::LDEBUG
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 995, "addr%i:%s", i, ip_s); } } while (0)
;
996 }
997
998 Memory::Memset(BufferOut, 0, BufferOutSize);
999 u32 wii_addr = BufferOut + 4 * 3 + 2 * 2;
1000
1001 u32 name_length = (u32)strlen(remoteHost->h_name) + 1;
1002 Memory::WriteBigEData((const u8 *)remoteHost->h_name, wii_addr, name_length);
1003 Memory::Write_U32(wii_addr, BufferOut);
1004 wii_addr += (name_length + 4) & ~3;
1005
1006 // aliases - empty
1007 Memory::Write_U32(wii_addr, BufferOut + 4);
1008 Memory::Write_U32(wii_addr + sizeof(u32), wii_addr);
1009 wii_addr += sizeof(u32);
1010 Memory::Write_U32((u32)NULL__null, wii_addr);
1011 wii_addr += sizeof(u32);
1012
1013 // hardcode to ipv4
1014 _dbg_assert_msg_(WII_IPC_NET,{}
1015 remoteHost->h_addrtype == AF_INET && remoteHost->h_length == sizeof(u32),{}
1016 "returned host info is not IPv4"){};
1017 Memory::Write_U16(AF_INET2, BufferOut + 8);
1018 Memory::Write_U16(sizeof(u32), BufferOut + 10);
1019
1020 // addrlist - probably only really need to return 1 anyways...
1021 Memory::Write_U32(wii_addr, BufferOut + 12);
1022 u32 num_addr = 0;
1023 while (remoteHost->h_addr_list[num_addr])
1024 num_addr++;
1025 for (u32 i = 0; i < num_addr; ++i)
1026 {
1027 Memory::Write_U32(wii_addr + sizeof(u32) * (num_addr + 1), wii_addr);
1028 wii_addr += sizeof(u32);
1029 }
1030 // NULL terminated list
1031 Memory::Write_U32((u32)NULL__null, wii_addr);
1032 wii_addr += sizeof(u32);
1033 // The actual IPs
1034 for (int i = 0; remoteHost->h_addr_list[i]; i++)
1035 {
1036 Memory::Write_U32_Swap(*(u32*)(remoteHost->h_addr_list[i]), wii_addr);
1037 wii_addr += sizeof(u32);
1038 }
1039
1040 //ERROR_LOG(WII_IPC_NET, "\n%s",
1041 // ArrayToString(Memory::GetPointer(BufferOut), BufferOutSize, 16).c_str());
1042 ReturnValue = 0;
1043 }
1044 else
1045 {
1046 ReturnValue = -1;
1047 }
1048
1049 break;
1050 }
1051
1052 case IOCTL_SO_ICMPCANCEL:
1053 ERROR_LOG(WII_IPC_NET, "IOCTL_SO_ICMPCANCEL")do { { if (LogTypes::LERROR <= 3) GenericLog(LogTypes::LERROR
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1053, "IOCTL_SO_ICMPCANCEL"); } } while (0)
;
1054 goto default_;
1055 default:
1056 INFO_LOG(WII_IPC_NET,"0x%x "do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1058, "0x%x " "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, Command, BufferIn, BufferInSize, BufferOut, BufferOutSize);
} } while (0)
1057 "BufferIn: (%08x, %i), BufferOut: (%08x, %i)",do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1058, "0x%x " "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, Command, BufferIn, BufferInSize, BufferOut, BufferOutSize);
} } while (0)
1058 Command, BufferIn, BufferInSize, BufferOut, BufferOutSize)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1058, "0x%x " "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, Command, BufferIn, BufferInSize, BufferOut, BufferOutSize);
} } while (0)
;
1059 default_:
1060 if (BufferInSize)
1061 {
1062 ERROR_LOG(WII_IPC_NET, "in addr %x size %x", BufferIn, BufferInSize)do { { if (LogTypes::LERROR <= 3) GenericLog(LogTypes::LERROR
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1062, "in addr %x size %x", BufferIn, BufferInSize); } } while
(0)
;
1063 ERROR_LOG(WII_IPC_NET, "\n%s",do { { if (LogTypes::LERROR <= 3) GenericLog(LogTypes::LERROR
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1065, "\n%s", ArrayToString(Memory::GetPointer(BufferIn), BufferInSize
, 4).c_str()); } } while (0)
1064 ArrayToString(Memory::GetPointer(BufferIn), BufferInSize, 4).c_str()do { { if (LogTypes::LERROR <= 3) GenericLog(LogTypes::LERROR
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1065, "\n%s", ArrayToString(Memory::GetPointer(BufferIn), BufferInSize
, 4).c_str()); } } while (0)
1065 )do { { if (LogTypes::LERROR <= 3) GenericLog(LogTypes::LERROR
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1065, "\n%s", ArrayToString(Memory::GetPointer(BufferIn), BufferInSize
, 4).c_str()); } } while (0)
;
1066 }
1067
1068 if (BufferOutSize)
1069 {
1070 ERROR_LOG(WII_IPC_NET, "out addr %x size %x", BufferOut, BufferOutSize)do { { if (LogTypes::LERROR <= 3) GenericLog(LogTypes::LERROR
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1070, "out addr %x size %x", BufferOut, BufferOutSize); } }
while (0)
;
1071 }
1072 break;
1073 }
1074
1075 Memory::Write_U32(ReturnValue, _CommandAddress + 0x4);
1076
1077 return true;
1078}
1079
1080
1081bool CWII_IPC_HLE_Device_net_ip_top::IOCtlV(u32 CommandAddress)
1082{
1083 SIOCtlVBuffer CommandBuffer(CommandAddress);
1084
1085 s32 ReturnValue = 0;
1086
1087
1088 u32 _BufferIn = 0, _BufferIn2 = 0, _BufferIn3 = 0;
1089 u32 BufferInSize = 0, BufferInSize2 = 0, BufferInSize3 = 0;
1090
1091 u32 _BufferOut = 0, _BufferOut2 = 0;
1092 u32 BufferOutSize = 0, BufferOutSize2 = 0;
1093
1094 if (CommandBuffer.InBuffer.size() > 0)
1095 {
1096 _BufferIn = CommandBuffer.InBuffer.at(0).m_Address;
1097 BufferInSize = CommandBuffer.InBuffer.at(0).m_Size;
1098 }
1099 if (CommandBuffer.InBuffer.size() > 1)
1100 {
1101 _BufferIn2 = CommandBuffer.InBuffer.at(1).m_Address;
1102 BufferInSize2 = CommandBuffer.InBuffer.at(1).m_Size;
1103 }
1104 if (CommandBuffer.InBuffer.size() > 2)
1105 {
1106 _BufferIn3 = CommandBuffer.InBuffer.at(2).m_Address;
1107 BufferInSize3 = CommandBuffer.InBuffer.at(2).m_Size;
1108 }
1109
1110 if (CommandBuffer.PayloadBuffer.size() > 0)
1111 {
1112 _BufferOut = CommandBuffer.PayloadBuffer.at(0).m_Address;
1113 BufferOutSize = CommandBuffer.PayloadBuffer.at(0).m_Size;
1114 }
1115 if (CommandBuffer.PayloadBuffer.size() > 1)
1116 {
1117 _BufferOut2 = CommandBuffer.PayloadBuffer.at(1).m_Address;
1118 BufferOutSize2 = CommandBuffer.PayloadBuffer.at(1).m_Size;
1119 }
1120
1121 u32 param = 0, param2 = 0, param3, param4, param5 = 0;
1122
1123 switch (CommandBuffer.Parameter)
1124 {
1125 case IOCTLV_SO_GETINTERFACEOPT:
1126 {
1127 param = Memory::Read_U32(_BufferIn);
1128 param2 = Memory::Read_U32(_BufferIn+4);
1129 param3 = Memory::Read_U32(_BufferOut);
1130 param4 = Memory::Read_U32(_BufferOut2);
1131 if (BufferOutSize >= 8)
1132 {
1133 param5 = Memory::Read_U32(_BufferOut+4);
1134 }
1135
1136 INFO_LOG(WII_IPC_NET,"IOCTLV_SO_GETINTERFACEOPT(%08X, %08X) "do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1139, "IOCTLV_SO_GETINTERFACEOPT(%08X, %08X) " "BufferIn: (%08x, %i), BufferIn2: (%08x, %i)"
, param, param2, _BufferIn, BufferInSize, _BufferIn2, BufferInSize2
); } } while (0)
1137 "BufferIn: (%08x, %i), BufferIn2: (%08x, %i)",do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1139, "IOCTLV_SO_GETINTERFACEOPT(%08X, %08X) " "BufferIn: (%08x, %i), BufferIn2: (%08x, %i)"
, param, param2, _BufferIn, BufferInSize, _BufferIn2, BufferInSize2
); } } while (0)
1138 param, param2,do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1139, "IOCTLV_SO_GETINTERFACEOPT(%08X, %08X) " "BufferIn: (%08x, %i), BufferIn2: (%08x, %i)"
, param, param2, _BufferIn, BufferInSize, _BufferIn2, BufferInSize2
); } } while (0)
1139 _BufferIn, BufferInSize, _BufferIn2, BufferInSize2)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1139, "IOCTLV_SO_GETINTERFACEOPT(%08X, %08X) " "BufferIn: (%08x, %i), BufferIn2: (%08x, %i)"
, param, param2, _BufferIn, BufferInSize, _BufferIn2, BufferInSize2
); } } while (0)
;
1140
1141 switch (param2)
1142 {
1143 case 0xb003: // dns server table
1144 {
1145 u32 address = 0;
1146#ifdef _WIN32
1147 PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL__null;
1148 ULONG OutBufferLength = 0;
1149 ULONG RetVal = 0, i;
1150 for (i = 0; i < 5; i++)
1151 {
1152 RetVal = GetAdaptersAddresses(
1153 AF_INET2,
1154 0,
1155 NULL__null,
1156 AdapterAddresses,
1157 &OutBufferLength);
1158
1159 if (RetVal != ERROR_BUFFER_OVERFLOW) {
1160 break;
1161 }
1162
1163 if (AdapterAddresses != NULL__null) {
1164 FREE(AdapterAddresses);
1165 }
1166
1167 AdapterAddresses = (PIP_ADAPTER_ADDRESSES)MALLOC(OutBufferLength);
1168 if (AdapterAddresses == NULL__null) {
1169 RetVal = GetLastError();
1170 break;
1171 }
1172 }
1173 if (RetVal == NO_ERROR)
1174 {
1175 unsigned long dwBestIfIndex = 0;
1176 IPAddr dwDestAddr = (IPAddr)0x08080808;
1177 // If successful, output some information from the data we received
1178 PIP_ADAPTER_ADDRESSES AdapterList = AdapterAddresses;
1179 if (GetBestInterface(dwDestAddr,&dwBestIfIndex) == NO_ERROR)
1180 {
1181 while (AdapterList)
1182 {
1183 if (AdapterList->IfIndex == dwBestIfIndex &&
1184 AdapterList->FirstDnsServerAddress &&
1185 AdapterList->OperStatus == IfOperStatusUp)
1186 {
1187 INFO_LOG(WII_IPC_NET, "Name of valid interface: %S", AdapterList->FriendlyName)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1187, "Name of valid interface: %S", AdapterList->FriendlyName
); } } while (0)
;
1188 INFO_LOG(WII_IPC_NET, "DNS: %u.%u.%u.%u",do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1192, "DNS: %u.%u.%u.%u", (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[4], (unsigned char)AdapterList
->FirstDnsServerAddress->Address.lpSockaddr->sa_data
[5]); } } while (0)
1189 (unsigned char)AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[2],do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1192, "DNS: %u.%u.%u.%u", (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[4], (unsigned char)AdapterList
->FirstDnsServerAddress->Address.lpSockaddr->sa_data
[5]); } } while (0)
1190 (unsigned char)AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[3],do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1192, "DNS: %u.%u.%u.%u", (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[4], (unsigned char)AdapterList
->FirstDnsServerAddress->Address.lpSockaddr->sa_data
[5]); } } while (0)
1191 (unsigned char)AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[4],do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1192, "DNS: %u.%u.%u.%u", (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[4], (unsigned char)AdapterList
->FirstDnsServerAddress->Address.lpSockaddr->sa_data
[5]); } } while (0)
1192 (unsigned char)AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[5])do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1192, "DNS: %u.%u.%u.%u", (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[4], (unsigned char)AdapterList
->FirstDnsServerAddress->Address.lpSockaddr->sa_data
[5]); } } while (0)
;
1193 address = Common::swap32(*(u32*)(&AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[2]));
1194 break;
1195 }
1196 AdapterList = AdapterList->Next;
1197 }
1198 }
1199 }
1200 if (AdapterAddresses != NULL__null) {
1201 FREE(AdapterAddresses);
1202 }
1203#endif
1204 if (address == 0)
1205 address = 0x08080808;
1206
1207 Memory::Write_U32(address, _BufferOut);
1208 Memory::Write_U32(0x08080404, _BufferOut+4);
1209 break;
1210 }
1211 case 0x1003: // error
1212 Memory::Write_U32(0, _BufferOut);
1213 break;
1214 case 0x1004: // mac address
1215 Memory::WriteBigEData(default_address, _BufferOut, 6);
1216 break;
1217 case 0x1005: // link state
1218 Memory::Write_U32(1, _BufferOut);
1219 break;
1220 case 0x4002: // ip addr number
1221 Memory::Write_U32(1, _BufferOut);
1222 break;
1223 case 0x4003: // ip addr table
1224 Memory::Write_U32(0xC, _BufferOut2);
1225 Memory::Write_U32(10 << 24 | 1 << 8 | 30, _BufferOut);
1226 Memory::Write_U32(255 << 24 | 255 << 16 | 255 << 8 | 0, _BufferOut+4);
1227 Memory::Write_U32(10 << 24 | 0 << 16 | 255 << 8 | 255, _BufferOut+8);
1228 break;
1229 default:
1230 ERROR_LOG(WII_IPC_NET, "Unknown param2: %08X", param2)do { { if (LogTypes::LERROR <= 3) GenericLog(LogTypes::LERROR
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1230, "Unknown param2: %08X", param2); } } while (0)
;
1231 break;
1232 }
1233 break;
1234 }
1235 case IOCTLV_SO_SENDTO:
1236 {
1237 u32 fd = Memory::Read_U32(_BufferIn2);
1238 WiiSockMan &sm = WiiSockMan::getInstance();
1239 sm.doSock(fd, CommandAddress, IOCTLV_SO_SENDTO);
1240 return false;
1241 break;
1242 }
1243 case IOCTLV_SO_RECVFROM:
1244 {
1245 u32 fd = Memory::Read_U32(_BufferIn);
1246 WiiSockMan &sm = WiiSockMan::getInstance();
1247 sm.doSock(fd, CommandAddress, IOCTLV_SO_RECVFROM);
1248 return false;
1249 break;
1250 }
1251 case IOCTLV_SO_GETADDRINFO:
1252 {
1253 struct addrinfo hints;
1254 struct addrinfo *result = NULL__null;
1255
1256 if (BufferInSize3)
1257 {
1258 hints.ai_flags = Memory::Read_U32(_BufferIn3);
1259 hints.ai_family = Memory::Read_U32(_BufferIn3 + 0x4);
1260 hints.ai_socktype = Memory::Read_U32(_BufferIn3 + 0x8);
1261 hints.ai_protocol = Memory::Read_U32(_BufferIn3 + 0xC);
1262 hints.ai_addrlen = Memory::Read_U32(_BufferIn3 + 0x10);
1263 hints.ai_canonname = (char*)Memory::Read_U32(_BufferIn3 + 0x14);
1264 hints.ai_addr = (sockaddr *)Memory::Read_U32(_BufferIn3 + 0x18);
1265 hints.ai_next = (addrinfo *)Memory::Read_U32(_BufferIn3 + 0x1C);
1266 }
1267
1268 char* pNodeName = NULL__null;
1269 if (BufferInSize > 0)
1270 pNodeName = (char*)Memory::GetPointer(_BufferIn);
1271
1272 char* pServiceName = NULL__null;
1273 if (BufferInSize2 > 0)
1274 pServiceName = (char*)Memory::GetPointer(_BufferIn2);
1275
1276 int ret = getaddrinfo(pNodeName, pServiceName, BufferInSize3 ? &hints : NULL__null, &result);
1277 u32 addr = _BufferOut;
1278 u32 sockoffset = addr + 0x460;
1279 if (ret == 0)
1280 {
1281 while (result != NULL__null)
1282 {
1283 Memory::Write_U32(result->ai_flags, addr);
1284 Memory::Write_U32(result->ai_family, addr + 0x04);
1285 Memory::Write_U32(result->ai_socktype, addr + 0x08);
1286 Memory::Write_U32(result->ai_protocol, addr + 0x0C);
1287 Memory::Write_U32((u32)result->ai_addrlen, addr + 0x10);
1288 // what to do? where to put? the buffer of 0x834 doesn't allow space for this
1289 Memory::Write_U32(/*result->ai_cannonname*/ 0, addr + 0x14);
1290
1291 if (result->ai_addr)
1292 {
1293 Memory::Write_U32(sockoffset, addr + 0x18);
1294 Memory::Write_U16(((result->ai_addr->sa_family & 0xFF) << 8) | (result->ai_addrlen & 0xFF), sockoffset);
1295 Memory::WriteBigEData((u8*)result->ai_addr->sa_data, sockoffset + 0x2, sizeof(result->ai_addr->sa_data));
1296 sockoffset += 0x1C;
1297 }
1298 else
1299 {
1300 Memory::Write_U32(0, addr + 0x18);
1301 }
1302
1303 if (result->ai_next)
1304 {
1305 Memory::Write_U32(addr + sizeof(addrinfo), addr + 0x1C);
1306 }
1307 else
1308 {
1309 Memory::Write_U32(0, addr + 0x1C);
1310 }
1311
1312 addr += sizeof(addrinfo);
1313 result = result->ai_next;
1314 }
1315 }
1316 else
1317 {
1318 // Host not found
1319 ret = -305;
1320 }
1321
1322 INFO_LOG(WII_IPC_NET, "IOCTLV_SO_GETADDRINFO "do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1324, "IOCTLV_SO_GETADDRINFO " "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, _BufferIn, BufferInSize, _BufferOut, BufferOutSize); } } while
(0)
1323 "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)",do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1324, "IOCTLV_SO_GETADDRINFO " "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, _BufferIn, BufferInSize, _BufferOut, BufferOutSize); } } while
(0)
1324 _BufferIn, BufferInSize, _BufferOut, BufferOutSize)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1324, "IOCTLV_SO_GETADDRINFO " "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, _BufferIn, BufferInSize, _BufferOut, BufferOutSize); } } while
(0)
;
1325 INFO_LOG(WII_IPC_NET, "IOCTLV_SO_GETADDRINFO: %s", Memory::GetPointer(_BufferIn))do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1325, "IOCTLV_SO_GETADDRINFO: %s", Memory::GetPointer(_BufferIn
)); } } while (0)
;
1326 ReturnValue = ret;
1327 break;
1328 }
1329 case IOCTLV_SO_ICMPPING:
1330 {
1331 struct
1332 {
1333 u8 length;
1334 u8 addr_family;
1335 u16 icmp_id;
1336 u32 ip;
1337 } ip_info;
1338
1339 u32 fd = Memory::Read_U32(_BufferIn);
1340 u32 num_ip = Memory::Read_U32(_BufferIn + 4);
1341 u64 timeout = Memory::Read_U64(_BufferIn + 8);
1342
1343 if (num_ip != 1)
1344 {
1345 INFO_LOG(WII_IPC_NET, "IOCTLV_SO_ICMPPING %i IPs", num_ip)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1345, "IOCTLV_SO_ICMPPING %i IPs", num_ip); } } while (0)
;
1346 }
1347
1348 ip_info.length = Memory::Read_U8(_BufferIn + 16);
1349 ip_info.addr_family = Memory::Read_U8(_BufferIn + 17);
1350 ip_info.icmp_id = Memory::Read_U16(_BufferIn + 18);
1351 ip_info.ip = Memory::Read_U32(_BufferIn + 20);
1352
1353 if (ip_info.length != 8 || ip_info.addr_family != AF_INET2)
1354 {
1355 INFO_LOG(WII_IPC_NET, "IOCTLV_SO_ICMPPING strange IPInfo:\n"do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1357, "IOCTLV_SO_ICMPPING strange IPInfo:\n" "length %x addr_family %x"
, ip_info.length, ip_info.addr_family); } } while (0)
1356 "length %x addr_family %x",do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1357, "IOCTLV_SO_ICMPPING strange IPInfo:\n" "length %x addr_family %x"
, ip_info.length, ip_info.addr_family); } } while (0)
1357 ip_info.length, ip_info.addr_family)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1357, "IOCTLV_SO_ICMPPING strange IPInfo:\n" "length %x addr_family %x"
, ip_info.length, ip_info.addr_family); } } while (0)
;
1358 }
1359
1360 DEBUG_LOG(WII_IPC_NET, "IOCTLV_SO_ICMPPING %x", ip_info.ip)do { { if (LogTypes::LDEBUG <= 3) GenericLog(LogTypes::LDEBUG
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1360, "IOCTLV_SO_ICMPPING %x", ip_info.ip); } } while (0)
;
1361
1362 sockaddr_in addr;
1363 addr.sin_family = AF_INET2;
1364 addr.sin_addr.s_addr = Common::swap32(ip_info.ip);
1365 memset(addr.sin_zero, 0, 8);
1366
1367 u8 data[0x20];
1368 memset(data, 0, sizeof(data));
1369 s32 icmp_length = sizeof(data);
1370
1371 if (BufferInSize2 == sizeof(data))
1372 memcpy(data, Memory::GetPointer(_BufferIn2), BufferInSize2);
1373 else
1374 {
1375 // TODO sequence number is incremented either statically, by
1376 // port, or by socket. Doesn't seem to matter, so we just leave
1377 // it 0
1378 ((u16 *)data)[0] = Common::swap16(ip_info.icmp_id);
1379 icmp_length = 22;
1380 }
1381
1382 int ret = icmp_echo_req(fd, &addr, data, icmp_length);
1383 if (ret == icmp_length)
1384 {
1385 ret = icmp_echo_rep(fd, &addr, (u32)timeout, icmp_length);
1386 }
1387
1388 // TODO proper error codes
1389 ReturnValue = 0;
1390 break;
1391 }
1392 default:
1393 INFO_LOG(WII_IPC_NET,"0x%x (BufferIn: (%08x, %i), BufferIn2: (%08x, %i)",do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1394, "0x%x (BufferIn: (%08x, %i), BufferIn2: (%08x, %i)", CommandBuffer
.Parameter, _BufferIn, BufferInSize, _BufferIn2, BufferInSize2
); } } while (0)
1394 CommandBuffer.Parameter, _BufferIn, BufferInSize, _BufferIn2, BufferInSize2)do { { if (LogTypes::LINFO <= 3) GenericLog(LogTypes::LINFO
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1394, "0x%x (BufferIn: (%08x, %i), BufferIn2: (%08x, %i)", CommandBuffer
.Parameter, _BufferIn, BufferInSize, _BufferIn2, BufferInSize2
); } } while (0)
;
1395 for (u32 i = 0; i < CommandBuffer.NumberInBuffer; ++i)
1396 {
1397 ERROR_LOG(WII_IPC_NET, "in %i addr %x size %x", i,do { { if (LogTypes::LERROR <= 3) GenericLog(LogTypes::LERROR
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1398, "in %i addr %x size %x", i, CommandBuffer.InBuffer.at
(i).m_Address, CommandBuffer.InBuffer.at(i).m_Size); } } while
(0)
1398 CommandBuffer.InBuffer.at(i).m_Address, CommandBuffer.InBuffer.at(i).m_Size)do { { if (LogTypes::LERROR <= 3) GenericLog(LogTypes::LERROR
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1398, "in %i addr %x size %x", i, CommandBuffer.InBuffer.at
(i).m_Address, CommandBuffer.InBuffer.at(i).m_Size); } } while
(0)
;
1399 ERROR_LOG(WII_IPC_NET, "\n%s",do { { if (LogTypes::LERROR <= 3) GenericLog(LogTypes::LERROR
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1403, "\n%s", ArrayToString( Memory::GetPointer(CommandBuffer
.InBuffer.at(i).m_Address), CommandBuffer.InBuffer.at(i).m_Size
, 4).c_str()); } } while (0)
1400 ArrayToString(do { { if (LogTypes::LERROR <= 3) GenericLog(LogTypes::LERROR
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1403, "\n%s", ArrayToString( Memory::GetPointer(CommandBuffer
.InBuffer.at(i).m_Address), CommandBuffer.InBuffer.at(i).m_Size
, 4).c_str()); } } while (0)
1401 Memory::GetPointer(CommandBuffer.InBuffer.at(i).m_Address),do { { if (LogTypes::LERROR <= 3) GenericLog(LogTypes::LERROR
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1403, "\n%s", ArrayToString( Memory::GetPointer(CommandBuffer
.InBuffer.at(i).m_Address), CommandBuffer.InBuffer.at(i).m_Size
, 4).c_str()); } } while (0)
1402 CommandBuffer.InBuffer.at(i).m_Size, 4).c_str()do { { if (LogTypes::LERROR <= 3) GenericLog(LogTypes::LERROR
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1403, "\n%s", ArrayToString( Memory::GetPointer(CommandBuffer
.InBuffer.at(i).m_Address), CommandBuffer.InBuffer.at(i).m_Size
, 4).c_str()); } } while (0)
1403 )do { { if (LogTypes::LERROR <= 3) GenericLog(LogTypes::LERROR
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1403, "\n%s", ArrayToString( Memory::GetPointer(CommandBuffer
.InBuffer.at(i).m_Address), CommandBuffer.InBuffer.at(i).m_Size
, 4).c_str()); } } while (0)
;
1404 }
1405 for (u32 i = 0; i < CommandBuffer.NumberPayloadBuffer; ++i)
1406 {
1407 ERROR_LOG(WII_IPC_NET, "out %i addr %x size %x", i,do { { if (LogTypes::LERROR <= 3) GenericLog(LogTypes::LERROR
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1408, "out %i addr %x size %x", i, CommandBuffer.PayloadBuffer
.at(i).m_Address, CommandBuffer.PayloadBuffer.at(i).m_Size); }
} while (0)
1408 CommandBuffer.PayloadBuffer.at(i).m_Address, CommandBuffer.PayloadBuffer.at(i).m_Size)do { { if (LogTypes::LERROR <= 3) GenericLog(LogTypes::LERROR
, LogTypes::WII_IPC_NET, "/home/anal/dolphin-emu/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp"
, 1408, "out %i addr %x size %x", i, CommandBuffer.PayloadBuffer
.at(i).m_Address, CommandBuffer.PayloadBuffer.at(i).m_Size); }
} while (0)
;
1409 }
1410 break;
1411 }
1412
1413 Memory::Write_U32(ReturnValue, CommandAddress + 4);
1414 return true;
1415}
1416u32 CWII_IPC_HLE_Device_net_ip_top::Update()
1417{
1418 WiiSockMan::getInstance().Update();
1419 return 0;
1420}