Bug Summary

File:Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_net.cpp
Location:line 898, column 8
Description:Value stored to 'unknown' 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);
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 break;
759 }
760
761 case IOCTL_SO_SETSOCKOPT:
762 {
763 u32 fd = Memory::Read_U32(BufferIn);
764 u32 level = Memory::Read_U32(BufferIn + 4);
765 u32 optname = Memory::Read_U32(BufferIn + 8);
766 u32 optlen = Memory::Read_U32(BufferIn + 0xc);
767 u8 optval[20];
768 Memory::ReadBigEData(optval, BufferIn + 0x10, optlen);
769
770 //TODO: bug booto about this, 0x2005 most likely timeout related, default value on wii is , 0x2001 is most likely tcpnodelay
771 if (level == 6 && (optname == 0x2005 || optname == 0x2001)){
772 return 0;
773 }
774 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"
, 777, "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)
775 "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"
, 777, "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)
776 "%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"
, 777, "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)
777 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"
, 777, "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
779 // Do the level/optname translation
780 int nat_level = -1, nat_optname = -1;
781
782 for (unsigned int i = 0; i < sizeof (opt_level_mapping) / sizeof (opt_level_mapping[0]); ++i)
783 if (level == opt_level_mapping[i][1])
784 nat_level = opt_level_mapping[i][0];
785
786 for (unsigned int i = 0; i < sizeof (opt_name_mapping) / sizeof (opt_name_mapping[0]); ++i)
787 if (optname == opt_name_mapping[i][1])
788 nat_optname = opt_name_mapping[i][0];
789
790 if (nat_level == -1 || nat_optname == -1)
791 {
792 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"
, 792, "SO_SETSOCKOPT: unknown level %d or optname %d", level
, optname); } } while (0)
;
793
794 // Default to the given level/optname. They match on Windows...
795 nat_level = level;
796 nat_optname = optname;
797 }
798
799 int ret = setsockopt(fd, nat_level, nat_optname, (char*)optval, optlen);
800 ReturnValue = WiiSockMan::getNetErrorCode(ret, "SO_SETSOCKOPT", false);
801 break;
802 }
803 case IOCTL_SO_GETSOCKNAME:
804 {
805 u32 fd = Memory::Read_U32(BufferIn);
806
807 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"
, 809, "IOCTL_SO_GETSOCKNAME " "Socket: %08X, BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, fd, BufferIn, BufferInSize, BufferOut, BufferOutSize); } } while
(0)
808 "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"
, 809, "IOCTL_SO_GETSOCKNAME " "Socket: %08X, BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, fd, BufferIn, BufferInSize, BufferOut, BufferOutSize); } } while
(0)
809 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"
, 809, "IOCTL_SO_GETSOCKNAME " "Socket: %08X, BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, fd, BufferIn, BufferInSize, BufferOut, BufferOutSize); } } while
(0)
;
810
811 sockaddr sa;
812 socklen_t sa_len;
813 sa_len = sizeof(sa);
814 int ret = getsockname(fd, &sa, &sa_len);
815
816 Memory::Write_U8(BufferOutSize, BufferOut);
817 Memory::Write_U8(sa.sa_family & 0xFF, BufferOut + 1);
818 Memory::WriteBigEData((u8*)&sa.sa_data, BufferOut + 2, BufferOutSize - 2);
819 ReturnValue = ret;
820 break;
821 }
822 case IOCTL_SO_GETPEERNAME:
823 {
824 u32 fd = Memory::Read_U32(BufferIn);
825
826 sockaddr sa;
827 socklen_t sa_len;
828 sa_len = sizeof(sa);
829
830 int ret = getpeername(fd, &sa, &sa_len);
831
832 Memory::Write_U8(BufferOutSize, BufferOut);
833 Memory::Write_U8(AF_INET2, BufferOut + 1);
834 Memory::WriteBigEData((u8*)&sa.sa_data, BufferOut + 2, BufferOutSize - 2);
835
836 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"
, 836, "IOCTL_SO_GETPEERNAME(%x)", fd); } } while (0)
;
837
838 ReturnValue = ret;
839 break;
840 }
841
842 case IOCTL_SO_GETHOSTID:
843 {
844 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"
, 846, "IOCTL_SO_GETHOSTID " "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, BufferIn, BufferInSize, BufferOut, BufferOutSize); } } while
(0)
845 "(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"
, 846, "IOCTL_SO_GETHOSTID " "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, BufferIn, BufferInSize, BufferOut, BufferOutSize); } } while
(0)
846 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"
, 846, "IOCTL_SO_GETHOSTID " "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, BufferIn, BufferInSize, BufferOut, BufferOutSize); } } while
(0)
;
847 ReturnValue = 192 << 24 | 168 << 16 | 1 << 8 | 150;
848 break;
849 }
850
851 case IOCTL_SO_INETATON:
852 {
853 struct hostent *remoteHost = gethostbyname((char*)Memory::GetPointer(BufferIn));
854
855 Memory::Write_U32(Common::swap32(*(u32 *)remoteHost->h_addr_list[0]), BufferOut);
856 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"
, 858, "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)
857 "%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"
, 858, "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)
858 (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"
, 858, "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)
;
859 ReturnValue = remoteHost->h_addr_list[0] == 0 ? 0 : 1;
860 break;
861 }
862
863 case IOCTL_SO_INETPTON:
864 {
865 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"
, 866, "IOCTL_SO_INETPTON " "(Translating: %s)", Memory::GetPointer
(BufferIn)); } } while (0)
866 "(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"
, 866, "IOCTL_SO_INETPTON " "(Translating: %s)", Memory::GetPointer
(BufferIn)); } } while (0)
;
867 ReturnValue = inet_pton((char*)Memory::GetPointer(BufferIn), Memory::GetPointer(BufferOut+4));
868 break;
869 }
870
871 case IOCTL_SO_INETNTOP:
872 {
873 //u32 af = Memory::Read_U32(BufferIn);
874 //u32 validAddress = Memory::Read_U32(BufferIn + 4);
875 //u32 src = Memory::Read_U32(BufferIn + 8);
876 char ip_s[16];
877 sprintf(ip_s, "%i.%i.%i.%i",
878 Memory::Read_U8(BufferIn + 8),
879 Memory::Read_U8(BufferIn + 8 + 1),
880 Memory::Read_U8(BufferIn + 8 + 2),
881 Memory::Read_U8(BufferIn + 8 + 3)
882 );
883 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"
, 883, "IOCTL_SO_INETNTOP %s", ip_s); } } while (0)
;
884 memset(Memory::GetPointer(BufferOut), 0, BufferOutSize);
885 memcpy(Memory::GetPointer(BufferOut), ip_s, strlen(ip_s));
886 break;
887 }
888
889 case IOCTL_SO_POLL:
890 {
891 // Map Wii/native poll events types
892 unsigned int mapping[][2] = {
893 { POLLIN0x001, 0x0001 },
894 { POLLOUT0x004, 0x0008 },
895 { POLLHUP0x010, 0x0040 },
896 };
897
898 u32 unknown = Memory::Read_U32(BufferIn);
Value stored to 'unknown' during its initialization is never read
899 u32 timeout = Memory::Read_U32(BufferIn + 4);
900
901 int nfds = BufferOutSize / 0xc;
902 if (nfds == 0)
903 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"
, 903, "Hidden POLL"); } } while (0)
;
904
905 pollfd_t* ufds = (pollfd_t *)malloc(sizeof(pollfd_t) * nfds);
906 if (ufds == NULL__null)
907 {
908 ReturnValue = -1;
909 break;
910 }
911
912 for (int i = 0; i < nfds; i++)
913 {
914 ufds[i].fd = Memory::Read_U32(BufferOut + 0xc*i); //fd
915 int events = Memory::Read_U32(BufferOut + 0xc*i + 4); //events
916 ufds[i].revents = Memory::Read_U32(BufferOut + 0xc*i + 8); //revents
917
918 // Translate Wii to native events
919 int unhandled_events = events;
920 ufds[i].events = 0;
921 for (unsigned int j = 0; j < sizeof (mapping) / sizeof (mapping[0]); ++j)
922 {
923 if (events & mapping[j][1])
924 ufds[i].events |= mapping[j][0];
925 unhandled_events &= ~mapping[j][1];
926 }
927
928 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"
, 932, "IOCTL_SO_POLL(%d) " "Sock: %08x, Unknown: %08x, Events: %08x, "
"NativeEvents: %08x", i, ufds[i].fd, unknown, events, ufds[i
].events); } } while (0)
929 "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"
, 932, "IOCTL_SO_POLL(%d) " "Sock: %08x, Unknown: %08x, Events: %08x, "
"NativeEvents: %08x", i, ufds[i].fd, unknown, events, ufds[i
].events); } } while (0)
930 "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"
, 932, "IOCTL_SO_POLL(%d) " "Sock: %08x, Unknown: %08x, Events: %08x, "
"NativeEvents: %08x", i, ufds[i].fd, unknown, events, ufds[i
].events); } } while (0)
931 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"
, 932, "IOCTL_SO_POLL(%d) " "Sock: %08x, Unknown: %08x, Events: %08x, "
"NativeEvents: %08x", i, ufds[i].fd, unknown, events, ufds[i
].events); } } while (0)
932 )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"
, 932, "IOCTL_SO_POLL(%d) " "Sock: %08x, Unknown: %08x, Events: %08x, "
"NativeEvents: %08x", i, ufds[i].fd, unknown, events, ufds[i
].events); } } while (0)
;
933
934 if (unhandled_events)
935 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"
, 935, "SO_POLL: unhandled Wii event types: %04x", unhandled_events
); } } while (0)
;
936 }
937
938 int ret = poll(ufds, nfds, timeout);
939 ret = WiiSockMan::getNetErrorCode(ret, "SO_POLL", false);
940
941 for (int i = 0; i<nfds; i++)
942 {
943
944 // Translate native to Wii events
945 int revents = 0;
946 for (unsigned int j = 0; j < sizeof (mapping) / sizeof (mapping[0]); ++j)
947 {
948 if (ufds[i].revents & mapping[j][0])
949 revents |= mapping[j][1];
950 }
951
952 // No need to change fd or events as they are input only.
953 //Memory::Write_U32(ufds[i].fd, BufferOut + 0xc*i); //fd
954 //Memory::Write_U32(events, BufferOut + 0xc*i + 4); //events
955 Memory::Write_U32(revents, BufferOut + 0xc*i + 8); //revents
956
957 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"
, 957, "IOCTL_SO_POLL socket %d revents %08X events %08X", i,
revents, ufds[i].events); } } while (0)
;
958 }
959 free(ufds);
960
961 ReturnValue = ret;
962 break;
963 }
964
965 case IOCTL_SO_GETHOSTBYNAME:
966 {
967 hostent *remoteHost = gethostbyname((char*)Memory::GetPointer(BufferIn));
968
969 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"
, 971, "IOCTL_SO_GETHOSTBYNAME " "Address: %s, BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, (char*)Memory::GetPointer(BufferIn), BufferIn, BufferInSize
, BufferOut, BufferOutSize); } } while (0)
970 "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"
, 971, "IOCTL_SO_GETHOSTBYNAME " "Address: %s, BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, (char*)Memory::GetPointer(BufferIn), BufferIn, BufferInSize
, BufferOut, BufferOutSize); } } while (0)
971 (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"
, 971, "IOCTL_SO_GETHOSTBYNAME " "Address: %s, BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, (char*)Memory::GetPointer(BufferIn), BufferIn, BufferInSize
, BufferOut, BufferOutSize); } } while (0)
;
972
973 if (remoteHost)
974 {
975 for (int i = 0; remoteHost->h_aliases[i]; ++i)
976 {
977 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"
, 977, "alias%i:%s", i, remoteHost->h_aliases[i]); } } while
(0)
;
978 }
979
980 for (int i = 0; remoteHost->h_addr_list[i]; ++i)
981 {
982 u32 ip = Common::swap32(*(u32*)(remoteHost->h_addr_list[i]));
983 char ip_s[16];
984 sprintf(ip_s, "%i.%i.%i.%i",
985 ip >> 24, (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff);
986 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"
, 986, "addr%i:%s", i, ip_s); } } while (0)
;
987 }
988
989 Memory::Memset(BufferOut, 0, BufferOutSize);
990 u32 wii_addr = BufferOut + 4 * 3 + 2 * 2;
991
992 u32 name_length = (u32)strlen(remoteHost->h_name) + 1;
993 Memory::WriteBigEData((const u8 *)remoteHost->h_name, wii_addr, name_length);
994 Memory::Write_U32(wii_addr, BufferOut);
995 wii_addr += (name_length + 4) & ~3;
996
997 // aliases - empty
998 Memory::Write_U32(wii_addr, BufferOut + 4);
999 Memory::Write_U32(wii_addr + sizeof(u32), wii_addr);
1000 wii_addr += sizeof(u32);
1001 Memory::Write_U32((u32)NULL__null, wii_addr);
1002 wii_addr += sizeof(u32);
1003
1004 // hardcode to ipv4
1005 _dbg_assert_msg_(WII_IPC_NET,{}
1006 remoteHost->h_addrtype == AF_INET && remoteHost->h_length == sizeof(u32),{}
1007 "returned host info is not IPv4"){};
1008 Memory::Write_U16(AF_INET2, BufferOut + 8);
1009 Memory::Write_U16(sizeof(u32), BufferOut + 10);
1010
1011 // addrlist - probably only really need to return 1 anyways...
1012 Memory::Write_U32(wii_addr, BufferOut + 12);
1013 u32 num_addr = 0;
1014 while (remoteHost->h_addr_list[num_addr])
1015 num_addr++;
1016 for (u32 i = 0; i < num_addr; ++i)
1017 {
1018 Memory::Write_U32(wii_addr + sizeof(u32) * (num_addr + 1), wii_addr);
1019 wii_addr += sizeof(u32);
1020 }
1021 // NULL terminated list
1022 Memory::Write_U32((u32)NULL__null, wii_addr);
1023 wii_addr += sizeof(u32);
1024 // The actual IPs
1025 for (int i = 0; remoteHost->h_addr_list[i]; i++)
1026 {
1027 Memory::Write_U32_Swap(*(u32*)(remoteHost->h_addr_list[i]), wii_addr);
1028 wii_addr += sizeof(u32);
1029 }
1030
1031 //ERROR_LOG(WII_IPC_NET, "\n%s",
1032 // ArrayToString(Memory::GetPointer(BufferOut), BufferOutSize, 16).c_str());
1033 ReturnValue = 0;
1034 }
1035 else
1036 {
1037 ReturnValue = -1;
1038 }
1039
1040 break;
1041 }
1042
1043 case IOCTL_SO_ICMPCANCEL:
1044 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"
, 1044, "IOCTL_SO_ICMPCANCEL"); } } while (0)
;
1045 goto default_;
1046 default:
1047 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"
, 1049, "0x%x " "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, Command, BufferIn, BufferInSize, BufferOut, BufferOutSize);
} } while (0)
1048 "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"
, 1049, "0x%x " "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, Command, BufferIn, BufferInSize, BufferOut, BufferOutSize);
} } while (0)
1049 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"
, 1049, "0x%x " "BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, Command, BufferIn, BufferInSize, BufferOut, BufferOutSize);
} } while (0)
;
1050 default_:
1051 if (BufferInSize)
1052 {
1053 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"
, 1053, "in addr %x size %x", BufferIn, BufferInSize); } } while
(0)
;
1054 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"
, 1056, "\n%s", ArrayToString(Memory::GetPointer(BufferIn), BufferInSize
, 4).c_str()); } } while (0)
1055 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"
, 1056, "\n%s", ArrayToString(Memory::GetPointer(BufferIn), BufferInSize
, 4).c_str()); } } while (0)
1056 )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"
, 1056, "\n%s", ArrayToString(Memory::GetPointer(BufferIn), BufferInSize
, 4).c_str()); } } while (0)
;
1057 }
1058
1059 if (BufferOutSize)
1060 {
1061 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"
, 1061, "out addr %x size %x", BufferOut, BufferOutSize); } }
while (0)
;
1062 }
1063 break;
1064 }
1065
1066 Memory::Write_U32(ReturnValue, _CommandAddress + 0x4);
1067
1068 return true;
1069}
1070
1071
1072bool CWII_IPC_HLE_Device_net_ip_top::IOCtlV(u32 CommandAddress)
1073{
1074 SIOCtlVBuffer CommandBuffer(CommandAddress);
1075
1076 s32 ReturnValue = 0;
1077
1078
1079 u32 _BufferIn = 0, _BufferIn2 = 0, _BufferIn3 = 0;
1080 u32 BufferInSize = 0, BufferInSize2 = 0, BufferInSize3 = 0;
1081
1082 u32 _BufferOut = 0, _BufferOut2 = 0;
1083 u32 BufferOutSize = 0, BufferOutSize2 = 0;
1084
1085 if (CommandBuffer.InBuffer.size() > 0)
1086 {
1087 _BufferIn = CommandBuffer.InBuffer.at(0).m_Address;
1088 BufferInSize = CommandBuffer.InBuffer.at(0).m_Size;
1089 }
1090 if (CommandBuffer.InBuffer.size() > 1)
1091 {
1092 _BufferIn2 = CommandBuffer.InBuffer.at(1).m_Address;
1093 BufferInSize2 = CommandBuffer.InBuffer.at(1).m_Size;
1094 }
1095 if (CommandBuffer.InBuffer.size() > 2)
1096 {
1097 _BufferIn3 = CommandBuffer.InBuffer.at(2).m_Address;
1098 BufferInSize3 = CommandBuffer.InBuffer.at(2).m_Size;
1099 }
1100
1101 if (CommandBuffer.PayloadBuffer.size() > 0)
1102 {
1103 _BufferOut = CommandBuffer.PayloadBuffer.at(0).m_Address;
1104 BufferOutSize = CommandBuffer.PayloadBuffer.at(0).m_Size;
1105 }
1106 if (CommandBuffer.PayloadBuffer.size() > 1)
1107 {
1108 _BufferOut2 = CommandBuffer.PayloadBuffer.at(1).m_Address;
1109 BufferOutSize2 = CommandBuffer.PayloadBuffer.at(1).m_Size;
1110 }
1111
1112 u32 param = 0, param2 = 0, param3, param4, param5 = 0;
1113
1114 switch (CommandBuffer.Parameter)
1115 {
1116 case IOCTLV_SO_GETINTERFACEOPT:
1117 {
1118 param = Memory::Read_U32(_BufferIn);
1119 param2 = Memory::Read_U32(_BufferIn+4);
1120 param3 = Memory::Read_U32(_BufferOut);
1121 param4 = Memory::Read_U32(_BufferOut2);
1122 if (BufferOutSize >= 8)
1123 {
1124 param5 = Memory::Read_U32(_BufferOut+4);
1125 }
1126
1127 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"
, 1130, "IOCTLV_SO_GETINTERFACEOPT(%08X, %08X) " "BufferIn: (%08x, %i), BufferIn2: (%08x, %i)"
, param, param2, _BufferIn, BufferInSize, _BufferIn2, BufferInSize2
); } } while (0)
1128 "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"
, 1130, "IOCTLV_SO_GETINTERFACEOPT(%08X, %08X) " "BufferIn: (%08x, %i), BufferIn2: (%08x, %i)"
, param, param2, _BufferIn, BufferInSize, _BufferIn2, BufferInSize2
); } } while (0)
1129 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"
, 1130, "IOCTLV_SO_GETINTERFACEOPT(%08X, %08X) " "BufferIn: (%08x, %i), BufferIn2: (%08x, %i)"
, param, param2, _BufferIn, BufferInSize, _BufferIn2, BufferInSize2
); } } while (0)
1130 _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"
, 1130, "IOCTLV_SO_GETINTERFACEOPT(%08X, %08X) " "BufferIn: (%08x, %i), BufferIn2: (%08x, %i)"
, param, param2, _BufferIn, BufferInSize, _BufferIn2, BufferInSize2
); } } while (0)
;
1131
1132 switch (param2)
1133 {
1134 case 0xb003: // dns server table
1135 {
1136 u32 address = 0;
1137#ifdef _WIN32
1138 PIP_ADAPTER_ADDRESSES AdapterAddresses = NULL__null;
1139 ULONG OutBufferLength = 0;
1140 ULONG RetVal = 0, i;
1141 for (i = 0; i < 5; i++)
1142 {
1143 RetVal = GetAdaptersAddresses(
1144 AF_INET2,
1145 0,
1146 NULL__null,
1147 AdapterAddresses,
1148 &OutBufferLength);
1149
1150 if (RetVal != ERROR_BUFFER_OVERFLOW) {
1151 break;
1152 }
1153
1154 if (AdapterAddresses != NULL__null) {
1155 FREE(AdapterAddresses);
1156 }
1157
1158 AdapterAddresses = (PIP_ADAPTER_ADDRESSES)MALLOC(OutBufferLength);
1159 if (AdapterAddresses == NULL__null) {
1160 RetVal = GetLastError();
1161 break;
1162 }
1163 }
1164 if (RetVal == NO_ERROR)
1165 {
1166 unsigned long dwBestIfIndex = 0;
1167 IPAddr dwDestAddr = (IPAddr)0x08080808;
1168 // If successful, output some information from the data we received
1169 PIP_ADAPTER_ADDRESSES AdapterList = AdapterAddresses;
1170 if (GetBestInterface(dwDestAddr,&dwBestIfIndex) == NO_ERROR)
1171 {
1172 while (AdapterList)
1173 {
1174 if (AdapterList->IfIndex == dwBestIfIndex &&
1175 AdapterList->FirstDnsServerAddress &&
1176 AdapterList->OperStatus == IfOperStatusUp)
1177 {
1178 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"
, 1178, "Name of valid interface: %S", AdapterList->FriendlyName
); } } while (0)
;
1179 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"
, 1183, "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)
1180 (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"
, 1183, "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)
1181 (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"
, 1183, "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)
1182 (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"
, 1183, "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)
1183 (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"
, 1183, "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)
;
1184 address = Common::swap32(*(u32*)(&AdapterList->FirstDnsServerAddress->Address.lpSockaddr->sa_data[2]));
1185 break;
1186 }
1187 AdapterList = AdapterList->Next;
1188 }
1189 }
1190 }
1191 if (AdapterAddresses != NULL__null) {
1192 FREE(AdapterAddresses);
1193 }
1194#endif
1195 if (address == 0)
1196 address = 0x08080808;
1197
1198 Memory::Write_U32(address, _BufferOut);
1199 Memory::Write_U32(0x08080404, _BufferOut+4);
1200 break;
1201 }
1202 case 0x1003: // error
1203 Memory::Write_U32(0, _BufferOut);
1204 break;
1205 case 0x1004: // mac address
1206 Memory::WriteBigEData(default_address, _BufferOut, 6);
1207 break;
1208 case 0x1005: // link state
1209 Memory::Write_U32(1, _BufferOut);
1210 break;
1211 case 0x4002: // ip addr number
1212 Memory::Write_U32(1, _BufferOut);
1213 break;
1214 case 0x4003: // ip addr table
1215 Memory::Write_U32(0xC, _BufferOut2);
1216 Memory::Write_U32(10 << 24 | 1 << 8 | 30, _BufferOut);
1217 Memory::Write_U32(255 << 24 | 255 << 16 | 255 << 8 | 0, _BufferOut+4);
1218 Memory::Write_U32(10 << 24 | 0 << 16 | 255 << 8 | 255, _BufferOut+8);
1219 break;
1220 default:
1221 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"
, 1221, "Unknown param2: %08X", param2); } } while (0)
;
1222 break;
1223 }
1224 break;
1225 }
1226 case IOCTLV_SO_SENDTO:
1227 {
1228 u32 fd = Memory::Read_U32(_BufferIn2);
1229 WiiSockMan &sm = WiiSockMan::getInstance();
1230 sm.doSock(fd, CommandAddress, IOCTLV_SO_SENDTO);
1231 return false;
1232 break;
1233 }
1234 case IOCTLV_SO_RECVFROM:
1235 {
1236 u32 fd = Memory::Read_U32(_BufferIn);
1237 WiiSockMan &sm = WiiSockMan::getInstance();
1238 sm.doSock(fd, CommandAddress, IOCTLV_SO_RECVFROM);
1239 return false;
1240 break;
1241 }
1242 case IOCTLV_SO_GETADDRINFO:
1243 {
1244 struct addrinfo hints;
1245 struct addrinfo *result = NULL__null;
1246
1247 if (BufferInSize3)
1248 {
1249 hints.ai_flags = Memory::Read_U32(_BufferIn3);
1250 hints.ai_family = Memory::Read_U32(_BufferIn3 + 0x4);
1251 hints.ai_socktype = Memory::Read_U32(_BufferIn3 + 0x8);
1252 hints.ai_protocol = Memory::Read_U32(_BufferIn3 + 0xC);
1253 hints.ai_addrlen = Memory::Read_U32(_BufferIn3 + 0x10);
1254 hints.ai_canonname = (char*)Memory::Read_U32(_BufferIn3 + 0x14);
1255 hints.ai_addr = (sockaddr *)Memory::Read_U32(_BufferIn3 + 0x18);
1256 hints.ai_next = (addrinfo *)Memory::Read_U32(_BufferIn3 + 0x1C);
1257 }
1258
1259 char* pNodeName = NULL__null;
1260 if (BufferInSize > 0)
1261 pNodeName = (char*)Memory::GetPointer(_BufferIn);
1262
1263 char* pServiceName = NULL__null;
1264 if (BufferInSize2 > 0)
1265 pServiceName = (char*)Memory::GetPointer(_BufferIn2);
1266
1267 int ret = getaddrinfo(pNodeName, pServiceName, BufferInSize3 ? &hints : NULL__null, &result);
1268 u32 addr = _BufferOut;
1269 u32 sockoffset = addr + 0x460;
1270 if (ret == 0)
1271 {
1272 while (result != NULL__null)
1273 {
1274 Memory::Write_U32(result->ai_flags, addr);
1275 Memory::Write_U32(result->ai_family, addr + 0x04);
1276 Memory::Write_U32(result->ai_socktype, addr + 0x08);
1277 Memory::Write_U32(result->ai_protocol, addr + 0x0C);
1278 Memory::Write_U32((u32)result->ai_addrlen, addr + 0x10);
1279 // what to do? where to put? the buffer of 0x834 doesn't allow space for this
1280 Memory::Write_U32(/*result->ai_cannonname*/ 0, addr + 0x14);
1281
1282 if (result->ai_addr)
1283 {
1284 Memory::Write_U32(sockoffset, addr + 0x18);
1285 Memory::Write_U16(((result->ai_addr->sa_family & 0xFF) << 8) | (result->ai_addrlen & 0xFF), sockoffset);
1286 Memory::WriteBigEData((u8*)result->ai_addr->sa_data, sockoffset + 0x2, sizeof(result->ai_addr->sa_data));
1287 sockoffset += 0x1C;
1288 }
1289 else
1290 {
1291 Memory::Write_U32(0, addr + 0x18);
1292 }
1293
1294 if (result->ai_next)
1295 {
1296 Memory::Write_U32(addr + sizeof(addrinfo), addr + 0x1C);
1297 }
1298 else
1299 {
1300 Memory::Write_U32(0, addr + 0x1C);
1301 }
1302
1303 addr += sizeof(addrinfo);
1304 result = result->ai_next;
1305 }
1306 }
1307 else
1308 {
1309 // Host not found
1310 ret = -305;
1311 }
1312
1313 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"
, 1315, "IOCTLV_SO_GETADDRINFO " "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, _BufferIn, BufferInSize, _BufferOut, BufferOutSize); } } while
(0)
1314 "(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"
, 1315, "IOCTLV_SO_GETADDRINFO " "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, _BufferIn, BufferInSize, _BufferOut, BufferOutSize); } } while
(0)
1315 _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"
, 1315, "IOCTLV_SO_GETADDRINFO " "(BufferIn: (%08x, %i), BufferOut: (%08x, %i)"
, _BufferIn, BufferInSize, _BufferOut, BufferOutSize); } } while
(0)
;
1316 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"
, 1316, "IOCTLV_SO_GETADDRINFO: %s", Memory::GetPointer(_BufferIn
)); } } while (0)
;
1317 ReturnValue = ret;
1318 break;
1319 }
1320 case IOCTLV_SO_ICMPPING:
1321 {
1322 struct
1323 {
1324 u8 length;
1325 u8 addr_family;
1326 u16 icmp_id;
1327 u32 ip;
1328 } ip_info;
1329
1330 u32 fd = Memory::Read_U32(_BufferIn);
1331 u32 num_ip = Memory::Read_U32(_BufferIn + 4);
1332 u64 timeout = Memory::Read_U64(_BufferIn + 8);
1333
1334 if (num_ip != 1)
1335 {
1336 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"
, 1336, "IOCTLV_SO_ICMPPING %i IPs", num_ip); } } while (0)
;
1337 }
1338
1339 ip_info.length = Memory::Read_U8(_BufferIn + 16);
1340 ip_info.addr_family = Memory::Read_U8(_BufferIn + 17);
1341 ip_info.icmp_id = Memory::Read_U16(_BufferIn + 18);
1342 ip_info.ip = Memory::Read_U32(_BufferIn + 20);
1343
1344 if (ip_info.length != 8 || ip_info.addr_family != AF_INET2)
1345 {
1346 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"
, 1348, "IOCTLV_SO_ICMPPING strange IPInfo:\n" "length %x addr_family %x"
, ip_info.length, ip_info.addr_family); } } while (0)
1347 "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"
, 1348, "IOCTLV_SO_ICMPPING strange IPInfo:\n" "length %x addr_family %x"
, ip_info.length, ip_info.addr_family); } } while (0)
1348 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"
, 1348, "IOCTLV_SO_ICMPPING strange IPInfo:\n" "length %x addr_family %x"
, ip_info.length, ip_info.addr_family); } } while (0)
;
1349 }
1350
1351 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"
, 1351, "IOCTLV_SO_ICMPPING %x", ip_info.ip); } } while (0)
;
1352
1353 sockaddr_in addr;
1354 addr.sin_family = AF_INET2;
1355 addr.sin_addr.s_addr = Common::swap32(ip_info.ip);
1356 memset(addr.sin_zero, 0, 8);
1357
1358 u8 data[0x20];
1359 memset(data, 0, sizeof(data));
1360 s32 icmp_length = sizeof(data);
1361
1362 if (BufferInSize2 == sizeof(data))
1363 memcpy(data, Memory::GetPointer(_BufferIn2), BufferInSize2);
1364 else
1365 {
1366 // TODO sequence number is incremented either statically, by
1367 // port, or by socket. Doesn't seem to matter, so we just leave
1368 // it 0
1369 ((u16 *)data)[0] = Common::swap16(ip_info.icmp_id);
1370 icmp_length = 22;
1371 }
1372
1373 int ret = icmp_echo_req(fd, &addr, data, icmp_length);
1374 if (ret == icmp_length)
1375 {
1376 ret = icmp_echo_rep(fd, &addr, (u32)timeout, icmp_length);
1377 }
1378
1379 // TODO proper error codes
1380 ReturnValue = 0;
1381 break;
1382 }
1383 default:
1384 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"
, 1385, "0x%x (BufferIn: (%08x, %i), BufferIn2: (%08x, %i)", CommandBuffer
.Parameter, _BufferIn, BufferInSize, _BufferIn2, BufferInSize2
); } } while (0)
1385 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"
, 1385, "0x%x (BufferIn: (%08x, %i), BufferIn2: (%08x, %i)", CommandBuffer
.Parameter, _BufferIn, BufferInSize, _BufferIn2, BufferInSize2
); } } while (0)
;
1386 for (u32 i = 0; i < CommandBuffer.NumberInBuffer; ++i)
1387 {
1388 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"
, 1389, "in %i addr %x size %x", i, CommandBuffer.InBuffer.at
(i).m_Address, CommandBuffer.InBuffer.at(i).m_Size); } } while
(0)
1389 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"
, 1389, "in %i addr %x size %x", i, CommandBuffer.InBuffer.at
(i).m_Address, CommandBuffer.InBuffer.at(i).m_Size); } } while
(0)
;
1390 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"
, 1394, "\n%s", ArrayToString( Memory::GetPointer(CommandBuffer
.InBuffer.at(i).m_Address), CommandBuffer.InBuffer.at(i).m_Size
, 4).c_str()); } } while (0)
1391 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"
, 1394, "\n%s", ArrayToString( Memory::GetPointer(CommandBuffer
.InBuffer.at(i).m_Address), CommandBuffer.InBuffer.at(i).m_Size
, 4).c_str()); } } while (0)
1392 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"
, 1394, "\n%s", ArrayToString( Memory::GetPointer(CommandBuffer
.InBuffer.at(i).m_Address), CommandBuffer.InBuffer.at(i).m_Size
, 4).c_str()); } } while (0)
1393 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"
, 1394, "\n%s", ArrayToString( Memory::GetPointer(CommandBuffer
.InBuffer.at(i).m_Address), CommandBuffer.InBuffer.at(i).m_Size
, 4).c_str()); } } while (0)
1394 )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"
, 1394, "\n%s", ArrayToString( Memory::GetPointer(CommandBuffer
.InBuffer.at(i).m_Address), CommandBuffer.InBuffer.at(i).m_Size
, 4).c_str()); } } while (0)
;
1395 }
1396 for (u32 i = 0; i < CommandBuffer.NumberPayloadBuffer; ++i)
1397 {
1398 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"
, 1399, "out %i addr %x size %x", i, CommandBuffer.PayloadBuffer
.at(i).m_Address, CommandBuffer.PayloadBuffer.at(i).m_Size); }
} while (0)
1399 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"
, 1399, "out %i addr %x size %x", i, CommandBuffer.PayloadBuffer
.at(i).m_Address, CommandBuffer.PayloadBuffer.at(i).m_Size); }
} while (0)
;
1400 }
1401 break;
1402 }
1403
1404 Memory::Write_U32(ReturnValue, CommandAddress + 4);
1405 return true;
1406}
1407u32 CWII_IPC_HLE_Device_net_ip_top::Update()
1408{
1409 WiiSockMan::getInstance().Update();
1410 return 0;
1411}