WiFi: Do a big refactor of the client interface code for better code cleanliness, organization, and stability. There are also some minor behavior changes.

- EXPERIMENTAL_WIFI_COMM no longer disables all of the WiFi-related code. Instead, the WiFi code is always enabled and actually running the code is now controlled using WifiHandler::SetEmulationLevel().
- On the Windows port, EXPERIMENTAL_WIFI_COMM no longer hides all of the WiFi options. Instead, it only affects the user's ability to control the WiFi emulation. (Forces the WiFi emulation level to WifiEmulationLevel_Off if EXPERIMENTAL_WIFI_COMM is undefined.)
- The Cocoa port (and probably other POSIX-based ports) should now work better with the WiFi code.
- WiFi comm interfaces no longer initialize only once upon app startup. Instead, they initialize each time the emulator resets, and then uninitialize each time a ROM is unloaded. Now, users no longer have to restart the app in order to apply any changed WiFi settings. Instead, users only need to reset the emulator or load a new ROM.
- Previously, the SoftAP comm interface wouldn't run if libpcap was unavailable or if a network device wasn't found. Now, the SoftAP comm interface will now run without libpcap or a network device, albeit with significantly reduced functionality.
- Previously, saving pcap files required WIFI_LOGGING_LEVEL >= 3. Now, saving pcap files no longer relies on WIFI_LOGGING_LEVEL, instead relying on WIFI_SAVE_PCAP_TO_FILE to enable the functionality.
This commit is contained in:
rogerman 2018-08-10 18:36:33 -07:00
parent 65901c77c0
commit 5e67e9ca7c
15 changed files with 1891 additions and 1104 deletions

41
desmume/src/NDSSystem.cpp Normal file → Executable file
View File

@ -102,8 +102,6 @@ int TotalLagFrames;
TSCalInfo TSCal;
WifiEmulationLevel wifiEmulationLevel = WifiEmulationLevel_Off;
namespace DLDI
{
bool tryPatch(void* data, size_t size, unsigned int device);
@ -181,8 +179,9 @@ int NDS_Init()
if (SPU_Init(SNDCORE_DUMMY, 740) != 0)
return -1;
WIFI_Init() ;
delete wifiHandler;
wifiHandler = new WifiHandler;
cheats = new CHEATS();
cheatSearch = new CHEATSEARCH();
@ -199,7 +198,9 @@ void NDS_DeInit(void)
GPU = NULL;
MMU_DeInit();
WIFI_DeInit();
delete wifiHandler;
wifiHandler = NULL;
delete cheats;
cheats = NULL;
@ -572,6 +573,9 @@ bool GameInfo::loadROM(std::string fname, u32 type)
void GameInfo::closeROM()
{
if (wifiHandler != NULL)
wifiHandler->CommStop();
if (GPU != NULL)
GPU->ForceFrameStop();
@ -1333,19 +1337,16 @@ void Sequencer::init()
dma_1_1.controller = &MMU_new.dma[1][1];
dma_1_2.controller = &MMU_new.dma[1][2];
dma_1_3.controller = &MMU_new.dma[1][3];
#ifdef EXPERIMENTAL_WIFI_COMM
if(wifiEmulationLevel > WifiEmulationLevel_Off)
if (wifiHandler->GetCurrentEmulationLevel() != WifiEmulationLevel_Off)
{
wifi.enabled = true;
wifi.timestamp = kWifiCycles;
}
else
{
wifi.enabled = false;
#else
wifi.enabled = false;
#endif
}
}
static void execHardware_hblank()
@ -1670,10 +1671,7 @@ u64 Sequencer::findNext()
if(sqrtunit.isEnabled()) next = _fast_min(next,sqrtunit.next());
if(gxfifo.enabled) next = _fast_min(next,gxfifo.next());
if(readslot1.isEnabled()) next = _fast_min(next,readslot1.next());
#ifdef EXPERIMENTAL_WIFI_COMM
if (wifiEmulationLevel > WifiEmulationLevel_Off) next = _fast_min(next,wifi.next());
#endif
if (wifi.enabled) next = _fast_min(next,wifi.next());
#define test(X,Y) if(dma_##X##_##Y .isEnabled()) next = _fast_min(next,dma_##X##_##Y .next());
test(0,0); test(0,1); test(0,2); test(0,3);
@ -1729,16 +1727,14 @@ void Sequencer::execHardware()
}
}
#ifdef EXPERIMENTAL_WIFI_COMM
if(wifiEmulationLevel > WifiEmulationLevel_Off)
if (wifiHandler->GetCurrentEmulationLevel() != WifiEmulationLevel_Off)
{
if(wifi.isTriggered())
if (wifi.isTriggered())
{
WIFI_usTrigger();
wifi.timestamp += kWifiCycles;
}
}
#endif
if(divider.isTriggered()) divider.exec();
if(sqrtunit.isTriggered()) sqrtunit.exec();
@ -2671,8 +2667,8 @@ void NDS_Reset()
GPU->Reset();
WIFI_Reset();
memcpy(FW_Mac, (MMU.fw.data + 0x36), 6);
wifiHandler->Reset();
wifiHandler->CommStart();
SPU_DeInit();
SPU_ReInit(!canBootFromFirmware && bootResult);
@ -3088,6 +3084,7 @@ void emu_halt(EmuHaltReasonCode reasonCode, NDSErrorTag errorTag)
NDS_CurrentCPUInfoToNDSError(_lastNDSError);
wifiHandler->CommStop();
GPU->ForceFrameStop();
execute = false;

13
desmume/src/NDSSystem.h Normal file → Executable file
View File

@ -217,14 +217,6 @@ enum NDS_CONSOLE_TYPE
NDS_CONSOLE_TYPE_DSI = 0xFE
};
enum WifiEmulationLevel
{
WifiEmulationLevel_Off = 0,
WifiEmulationLevel_Normal = 10000,
WifiEmulationLevel_Compatibility = 65535,
};
extern WifiEmulationLevel wifiEmulationLevel;
struct NDSSystem
{
s32 wifiCycle;
@ -573,8 +565,7 @@ extern struct TCommonSettings
strcpy(ARM7BIOS, "biosnds7.bin");
strcpy(Firmware, "firmware.bin");
/* WIFI mode: adhoc = 0, infrastructure = 1 */
wifi.mode = 1;
wifi.mode = WifiCommInterfaceID_Infrastructure;
wifi.infraBridgeAdapter = 0;
for(int i=0;i<16;i++)
@ -656,7 +647,7 @@ extern struct TCommonSettings
u32 jit_max_block_size;
struct _Wifi {
int mode;
WifiCommInterfaceID mode;
int infraBridgeAdapter;
} wifi;

53
desmume/src/driver.h Normal file → Executable file
View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2009-2015 DeSmuME team
Copyright (C) 2009-2018 DeSmuME team
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -22,9 +22,6 @@
#include "types.h"
#include "debug.h"
#ifdef EXPERIMENTAL_WIFI_COMM
#include <pcap.h>
#endif
class VIEW3D_Driver
{
@ -39,53 +36,7 @@ class BaseDriver {
public:
BaseDriver();
~BaseDriver();
#ifdef EXPERIMENTAL_WIFI_COMM
#ifdef HOST_WINDOWS
virtual bool WIFI_SocketsAvailable() { return true; }
virtual bool WIFI_PCapAvailable() { return false; }
virtual void WIFI_GetUniqueMAC(u8* mac) {}
virtual bool WIFI_WFCWarning() { return false; }
virtual int PCAP_findalldevs(pcap_if_t** alldevs, char* errbuf) { return -1; }
virtual void PCAP_freealldevs(pcap_if_t* alldevs) {}
virtual pcap_t* PCAP_open(const char* source, int snaplen, int flags, int readtimeout, char* errbuf) { return NULL; }
virtual void PCAP_close(pcap_t* dev) {}
virtual int PCAP_setnonblock(pcap_t* dev, int nonblock, char* errbuf) { return -1; }
virtual int PCAP_sendpacket(pcap_t* dev, const u_char* data, int len) { return -1; }
virtual int PCAP_dispatch(pcap_t* dev, int num, pcap_handler callback, u_char* userdata) { return -1; }
#else
virtual bool WIFI_SocketsAvailable() { return true; }
virtual bool WIFI_PCapAvailable() { return true; }
virtual void WIFI_GetUniqueMAC(u8* mac) {}
virtual bool WIFI_WFCWarning() { return false; }
virtual int PCAP_findalldevs(pcap_if_t** alldevs, char* errbuf) {
return pcap_findalldevs(alldevs, errbuf); }
virtual void PCAP_freealldevs(pcap_if_t* alldevs) {
pcap_freealldevs(alldevs); }
virtual pcap_t* PCAP_open(const char* source, int snaplen, int flags, int readtimeout, char* errbuf) {
return pcap_open_live(source, snaplen, flags, readtimeout, errbuf); }
virtual void PCAP_close(pcap_t* dev) {
pcap_close(dev); }
virtual int PCAP_setnonblock(pcap_t* dev, int nonblock, char* errbuf) {
return pcap_setnonblock(dev, nonblock, errbuf); }
virtual int PCAP_sendpacket(pcap_t* dev, const u_char* data, int len) {
return pcap_sendpacket(dev, data, len); }
virtual int PCAP_dispatch(pcap_t* dev, int num, pcap_handler callback, u_char* userdata) {
return pcap_dispatch(dev, num, callback, userdata); }
#endif
#endif
virtual void AVI_SoundUpdate(void* soundData, int soundLen) {}
virtual bool AVI_IsRecording() { return FALSE; }
virtual bool WAV_IsRecording() { return FALSE; }

View File

@ -86,6 +86,8 @@ ClientExecutionControl::ClientExecutionControl()
_settingsPending.enableFirmwareBoot = false;
_settingsPending.enableDebugConsole = false;
_settingsPending.enableEnsataEmulation = false;
_settingsPending.wifiMode = WifiCommInterfaceID_AdHoc;
_settingsPending.wifiBridgeDeviceIndex = 0;
_settingsPending.enableExecutionSpeedLimiter = true;
_settingsPending.executionSpeed = SPEED_SCALAR_NORMAL;
@ -560,6 +562,60 @@ void ClientExecutionControl::SetEnableEnsataEmulation(bool enable)
pthread_mutex_unlock(&this->_mutexSettingsPendingOnNDSExec);
}
int ClientExecutionControl::GetWifiMode()
{
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
const int wifiMode = this->_settingsPending.wifiMode;
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
return wifiMode;
}
void ClientExecutionControl::SetWifiMode(int wifiMode)
{
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
this->_settingsPending.wifiMode = wifiMode;
this->_newSettingsPendingOnReset = true;
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
}
int ClientExecutionControl::GetWifiBridgeDeviceIndex()
{
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
const int wifiBridgeDeviceIndex = this->_settingsPending.wifiBridgeDeviceIndex;
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
return wifiBridgeDeviceIndex;
}
void ClientExecutionControl::SetWifiBridgeDeviceIndex(int wifiBridgeDeviceIndex)
{
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
this->_settingsPending.wifiBridgeDeviceIndex = wifiBridgeDeviceIndex;
this->_newSettingsPendingOnReset = true;
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
}
uint32_t ClientExecutionControl::GetWifiIP4Address()
{
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
const uint32_t ip4Address = this->_settingsPending.wifiIP4Address;
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
return ip4Address;
}
void ClientExecutionControl::SetWifiIP4Address(uint32_t ip4Address)
{
pthread_mutex_lock(&this->_mutexSettingsPendingOnReset);
this->_settingsPending.wifiIP4Address = ip4Address;
this->_newSettingsPendingOnReset = true;
pthread_mutex_unlock(&this->_mutexSettingsPendingOnReset);
}
bool ClientExecutionControl::GetEnableCheats()
{
pthread_mutex_lock(&this->_mutexSettingsPendingOnNDSExec);
@ -903,6 +959,10 @@ void ClientExecutionControl::ApplySettingsOnReset()
this->_settingsApplied.enableExternalFirmware = this->_settingsPending.enableExternalFirmware;
this->_settingsApplied.enableFirmwareBoot = this->_settingsPending.enableFirmwareBoot;
this->_settingsApplied.wifiMode = this->_settingsPending.wifiMode;
this->_settingsApplied.wifiBridgeDeviceIndex = this->_settingsPending.wifiBridgeDeviceIndex;
this->_settingsApplied.wifiIP4Address = this->_settingsPending.wifiIP4Address;
this->_settingsApplied.cpuEmulationEngineName = this->_settingsPending.cpuEmulationEngineName;
this->_settingsApplied.slot1DeviceName = this->_settingsPending.slot1DeviceName;
this->_ndsFrameInfo.cpuEmulationEngineName = this->_settingsApplied.cpuEmulationEngineName;
@ -921,8 +981,15 @@ void ClientExecutionControl::ApplySettingsOnReset()
CommonSettings.jit_max_block_size = this->_settingsApplied.JITMaxBlockSize;
CommonSettings.UseExtBIOS = this->_settingsApplied.enableExternalBIOS;
CommonSettings.UseExtFirmware = this->_settingsApplied.enableExternalFirmware;
CommonSettings.UseExtFirmwareSettings = this->_settingsApplied.enableExternalFirmware;
//CommonSettings.UseExtFirmwareSettings = this->_settingsApplied.enableExternalFirmware;
CommonSettings.UseExtFirmwareSettings = false;
CommonSettings.BootFromFirmware = this->_settingsApplied.enableFirmwareBoot;
CommonSettings.wifi.mode = (WifiCommInterfaceID)this->_settingsApplied.wifiMode;
CommonSettings.wifi.infraBridgeAdapter = this->_settingsApplied.wifiBridgeDeviceIndex;
wifiHandler->SetIP4Address(this->_settingsApplied.wifiIP4Address);
wifiHandler->SetCommInterfaceID((WifiCommInterfaceID)this->_settingsApplied.wifiMode);
wifiHandler->SetBridgeDeviceIndex(this->_settingsApplied.wifiBridgeDeviceIndex);
if (this->_settingsApplied.filePathARM9BIOS.length() == 0)
{

View File

@ -92,6 +92,10 @@ struct ClientExecutionControlSettings
bool enableDebugConsole;
bool enableEnsataEmulation;
int wifiMode;
int wifiBridgeDeviceIndex;
uint32_t wifiIP4Address;
bool enableCheats;
bool enableExecutionSpeedLimiter;
@ -295,6 +299,15 @@ public:
bool GetEnableEnsataEmulation();
void SetEnableEnsataEmulation(bool enable);
int GetWifiMode();
void SetWifiMode(int wifiMode);
int GetWifiBridgeDeviceIndex();
void SetWifiBridgeDeviceIndex(int wifiBridgeDeviceIndex);
uint32_t GetWifiIP4Address();
void SetWifiIP4Address(uint32_t ip4Address);
bool GetEnableCheats();
void SetEnableCheats(bool enable);

View File

@ -253,7 +253,6 @@
AB405694169F5DCC0016AC3E /* x86util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405676169F5DCC0016AC3E /* x86util.cpp */; };
AB405695169F5DCC0016AC3E /* x86util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405676169F5DCC0016AC3E /* x86util.cpp */; };
AB407F371A6206FB00313213 /* xbrz.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB47B52C18A3F722009A42AF /* xbrz.cpp */; };
AB4676F314AB12D60002FF94 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; };
AB47B52E18A3F722009A42AF /* xbrz.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB47B52C18A3F722009A42AF /* xbrz.cpp */; };
AB47B52F18A45C35009A42AF /* xbrz.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB47B52C18A3F722009A42AF /* xbrz.cpp */; };
AB4C81E41B21676C00ACECD5 /* hq3x.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB4C81E31B21676C00ACECD5 /* hq3x.cpp */; };
@ -263,6 +262,16 @@
AB4FCEBD1692AB82000F498F /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB4FCEBC1692AB82000F498F /* Accelerate.framework */; };
AB4FCEBE1692AB82000F498F /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB4FCEBC1692AB82000F498F /* Accelerate.framework */; };
AB4FCEBF1692AB82000F498F /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB4FCEBC1692AB82000F498F /* Accelerate.framework */; };
AB53B0BE211E63FE003D0ED9 /* libpcap.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = AB53B0BC211E63E4003D0ED9 /* libpcap.tbd */; };
AB53B0BF211E63FF003D0ED9 /* libpcap.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = AB53B0BC211E63E4003D0ED9 /* libpcap.tbd */; };
AB53B0C0211E6400003D0ED9 /* libpcap.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = AB53B0BC211E63E4003D0ED9 /* libpcap.tbd */; };
AB53B0C1211E6400003D0ED9 /* libpcap.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = AB53B0BC211E63E4003D0ED9 /* libpcap.tbd */; };
AB53B0C2211E6401003D0ED9 /* libpcap.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = AB53B0BC211E63E4003D0ED9 /* libpcap.tbd */; };
AB53B0C3211E6405003D0ED9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = AB53B0BD211E63E8003D0ED9 /* libz.tbd */; };
AB53B0C4211E6405003D0ED9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = AB53B0BD211E63E8003D0ED9 /* libz.tbd */; };
AB53B0C5211E6406003D0ED9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = AB53B0BD211E63E8003D0ED9 /* libz.tbd */; };
AB53B0C6211E6407003D0ED9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = AB53B0BD211E63E8003D0ED9 /* libz.tbd */; };
AB53B0C7211E6407003D0ED9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = AB53B0BD211E63E8003D0ED9 /* libz.tbd */; };
AB54718B1E27610500508C5C /* MacMetalDisplayViewShaders.metal in Sources */ = {isa = PBXBuildFile; fileRef = AB54718A1E27610500508C5C /* MacMetalDisplayViewShaders.metal */; };
AB54718C1E27610500508C5C /* MacMetalDisplayViewShaders.metal in Sources */ = {isa = PBXBuildFile; fileRef = AB54718A1E27610500508C5C /* MacMetalDisplayViewShaders.metal */; };
AB54718D1E27610500508C5C /* MacMetalDisplayViewShaders.metal in Sources */ = {isa = PBXBuildFile; fileRef = AB54718A1E27610500508C5C /* MacMetalDisplayViewShaders.metal */; };
@ -489,7 +498,6 @@
AB796D6915CDCBA200C59155 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; };
AB796D6A15CDCBA200C59155 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; };
AB796D6B15CDCBA200C59155 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; };
AB796D6C15CDCBA200C59155 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; };
AB7EC7F4189B2B92009D198A /* Icon_AutoholdClear_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB7EC7F2189B2B92009D198A /* Icon_AutoholdClear_420x420.png */; };
AB7EC7F5189B2B92009D198A /* Icon_AutoholdClear_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB7EC7F2189B2B92009D198A /* Icon_AutoholdClear_420x420.png */; };
AB7EC7F6189B2B92009D198A /* Icon_AutoholdSet_420x420.png in Resources */ = {isa = PBXBuildFile; fileRef = AB7EC7F3189B2B92009D198A /* Icon_AutoholdSet_420x420.png */; };
@ -789,7 +797,6 @@
AB8F3D261A53AC2600A80BF6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; };
AB8F3D271A53AC2600A80BF6 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; };
AB8F3D281A53AC2600A80BF6 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; };
AB8F3D291A53AC2600A80BF6 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; };
AB901BDE1420706100348EEC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = AB901BDD1420706100348EEC /* Localizable.strings */; };
AB9038A617C5ECFD00F410BD /* advanscene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038A517C5ECFD00F410BD /* advanscene.cpp */; };
AB9038A717C5ECFD00F410BD /* advanscene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB9038A517C5ECFD00F410BD /* advanscene.cpp */; };
@ -895,7 +902,6 @@
ABB3C6661501BF8A00E0C22E /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
ABB3C6671501BF8A00E0C22E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29B97325FDCFA39411CA2CEA /* Foundation.framework */; };
ABB3C6691501BF8A00E0C22E /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; };
ABB3C66A1501BF8A00E0C22E /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; };
ABB3C66C1501C04F00E0C22E /* NDSGameCore.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABB3C63E1501BB8300E0C22E /* NDSGameCore.mm */; };
ABB3C6701501C04F00E0C22E /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; };
ABB3C6721501C04F00E0C22E /* cocoa_file.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB58F32C1364F44B0074C376 /* cocoa_file.mm */; };
@ -1428,7 +1434,6 @@
ABE145AF1FBBA71A0097A4A8 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB350BA41478AC96007165AC /* IOKit.framework */; };
ABE145B11FBBA71A0097A4A8 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABC570D4134431DA00E7B0B1 /* OpenGL.framework */; };
ABE145B21FBBA71A0097A4A8 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB3BF4321E2562F2003E2B24 /* QuartzCore.framework */; };
ABE145B31FBBA71A0097A4A8 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB0A0D1914AACA9600E83E91 /* libz.dylib */; };
ABE145B41FBBA71A0097A4A8 /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABAE1F6E1F6873E70080EFE3 /* CoreVideo.framework */; };
ABE5DE95143F781900835AD8 /* videofilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB817A35143EE2DB00A7DFE9 /* videofilter.cpp */; };
ABE5DFE5143FB1DA00835AD8 /* cocoa_videofilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = ABE5DFE4143FB1DA00835AD8 /* cocoa_videofilter.mm */; };
@ -1542,7 +1547,6 @@
AB01005D170D07B000D70FBE /* InputProfileController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = InputProfileController.mm; sourceTree = "<group>"; };
AB02475B13886BF300E9F9AB /* KeyNames.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = KeyNames.plist; sourceTree = "<group>"; };
AB02791814415E4C0075E58C /* Info (Debug).plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info (Debug).plist"; sourceTree = "<group>"; };
AB0A0D1914AACA9600E83E91 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };
AB0F28FE14BE6E68009ABC6F /* Icon_Execute_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Execute_420x420.png; path = images/Icon_Execute_420x420.png; sourceTree = "<group>"; };
AB0F28FF14BE6E68009ABC6F /* Icon_Pause_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Pause_420x420.png; path = images/Icon_Pause_420x420.png; sourceTree = "<group>"; };
AB0F290014BE6E68009ABC6F /* Icon_Speed1x_420x420.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon_Speed1x_420x420.png; path = images/Icon_Speed1x_420x420.png; sourceTree = "<group>"; };
@ -1785,6 +1789,8 @@
AB47B52C18A3F722009A42AF /* xbrz.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = xbrz.cpp; sourceTree = "<group>"; };
AB4C81E31B21676C00ACECD5 /* hq3x.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hq3x.cpp; sourceTree = "<group>"; };
AB4FCEBC1692AB82000F498F /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
AB53B0BC211E63E4003D0ED9 /* libpcap.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libpcap.tbd; path = usr/lib/libpcap.tbd; sourceTree = SDKROOT; };
AB53B0BD211E63E8003D0ED9 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
AB54718A1E27610500508C5C /* MacMetalDisplayViewShaders.metal */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.metal; path = MacMetalDisplayViewShaders.metal; sourceTree = "<group>"; };
AB5648FD186E6EA8002740F4 /* cocoa_slot2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_slot2.h; sourceTree = "<group>"; };
AB5648FE186E6EA8002740F4 /* cocoa_slot2.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_slot2.mm; sourceTree = "<group>"; };
@ -2301,6 +2307,8 @@
buildActionMask = 2147483647;
files = (
AB4FCEBE1692AB82000F498F /* Accelerate.framework in Frameworks */,
AB53B0C5211E6406003D0ED9 /* libz.tbd in Frameworks */,
AB53B0BE211E63FE003D0ED9 /* libpcap.tbd in Frameworks */,
ABC5720D1344346600E7B0B1 /* AppKit.framework in Frameworks */,
ABACB8DD1710B656003B845D /* AudioToolbox.framework in Frameworks */,
ABC570D1134431CE00E7B0B1 /* AudioUnit.framework in Frameworks */,
@ -2313,7 +2321,6 @@
AB3BF4421E262959003E2B24 /* Metal.framework in Frameworks */,
ABC570D5134431DA00E7B0B1 /* OpenGL.framework in Frameworks */,
AB3BF4341E256309003E2B24 /* QuartzCore.framework in Frameworks */,
AB4676F314AB12D60002FF94 /* libz.dylib in Frameworks */,
ABAE1F711F6874090080EFE3 /* CoreVideo.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -2323,6 +2330,8 @@
buildActionMask = 2147483647;
files = (
AB4FCEBD1692AB82000F498F /* Accelerate.framework in Frameworks */,
AB53B0C7211E6407003D0ED9 /* libz.tbd in Frameworks */,
AB53B0C1211E6400003D0ED9 /* libpcap.tbd in Frameworks */,
AB796D6615CDCBA200C59155 /* AppKit.framework in Frameworks */,
ABACB8DC1710B621003B845D /* AudioToolbox.framework in Frameworks */,
AB796D6715CDCBA200C59155 /* AudioUnit.framework in Frameworks */,
@ -2336,7 +2345,6 @@
AB78B5C21E384F2200297FED /* Metal.framework in Frameworks */,
AB796D6B15CDCBA200C59155 /* OpenGL.framework in Frameworks */,
AB3BF4331E2562F2003E2B24 /* QuartzCore.framework in Frameworks */,
AB796D6C15CDCBA200C59155 /* libz.dylib in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -2345,6 +2353,8 @@
buildActionMask = 2147483647;
files = (
AB8F3D1F1A53AC2600A80BF6 /* Accelerate.framework in Frameworks */,
AB53B0C6211E6407003D0ED9 /* libz.tbd in Frameworks */,
AB53B0C0211E6400003D0ED9 /* libpcap.tbd in Frameworks */,
AB8F3D201A53AC2600A80BF6 /* AppKit.framework in Frameworks */,
AB8F3D211A53AC2600A80BF6 /* AudioToolbox.framework in Frameworks */,
AB8F3D221A53AC2600A80BF6 /* AudioUnit.framework in Frameworks */,
@ -2357,7 +2367,6 @@
AB78B5C11E384F2100297FED /* Metal.framework in Frameworks */,
AB8F3D281A53AC2600A80BF6 /* OpenGL.framework in Frameworks */,
AB3BF4351E256309003E2B24 /* QuartzCore.framework in Frameworks */,
AB8F3D291A53AC2600A80BF6 /* libz.dylib in Frameworks */,
ABAE1F701F6874090080EFE3 /* CoreVideo.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -2367,13 +2376,14 @@
buildActionMask = 2147483647;
files = (
AB4FCEBF1692AB82000F498F /* Accelerate.framework in Frameworks */,
AB53B0C3211E6405003D0ED9 /* libz.tbd in Frameworks */,
ABB3C6641501BF8A00E0C22E /* AppKit.framework in Frameworks */,
ABACB8DE1710B65F003B845D /* AudioToolbox.framework in Frameworks */,
ABB3C6651501BF8A00E0C22E /* AudioUnit.framework in Frameworks */,
ABB3C6661501BF8A00E0C22E /* Cocoa.framework in Frameworks */,
ABB3C6671501BF8A00E0C22E /* Foundation.framework in Frameworks */,
AB53B0C2211E6401003D0ED9 /* libpcap.tbd in Frameworks */,
ABB3C6691501BF8A00E0C22E /* OpenGL.framework in Frameworks */,
ABB3C66A1501BF8A00E0C22E /* libz.dylib in Frameworks */,
ABC503B11AAC4355002FCD43 /* CoreAudio.framework in Frameworks */,
AB5785FD17176AFC002C5FC7 /* OpenEmuBase.framework in Frameworks */,
);
@ -2387,15 +2397,16 @@
ABE145A71FBBA71A0097A4A8 /* AppKit.framework in Frameworks */,
ABE145A81FBBA71A0097A4A8 /* AudioToolbox.framework in Frameworks */,
ABE145A91FBBA71A0097A4A8 /* AudioUnit.framework in Frameworks */,
AB53B0C4211E6405003D0ED9 /* libz.tbd in Frameworks */,
ABE145AA1FBBA71A0097A4A8 /* Carbon.framework in Frameworks */,
ABE145AB1FBBA71A0097A4A8 /* Cocoa.framework in Frameworks */,
ABE145AC1FBBA71A0097A4A8 /* CoreAudio.framework in Frameworks */,
ABE145AD1FBBA71A0097A4A8 /* ForceFeedback.framework in Frameworks */,
AB53B0BF211E63FF003D0ED9 /* libpcap.tbd in Frameworks */,
ABE145AE1FBBA71A0097A4A8 /* Foundation.framework in Frameworks */,
ABE145AF1FBBA71A0097A4A8 /* IOKit.framework in Frameworks */,
ABE145B11FBBA71A0097A4A8 /* OpenGL.framework in Frameworks */,
ABE145B21FBBA71A0097A4A8 /* QuartzCore.framework in Frameworks */,
ABE145B31FBBA71A0097A4A8 /* libz.dylib in Frameworks */,
ABE145B41FBBA71A0097A4A8 /* CoreVideo.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -2479,7 +2490,8 @@
AB3BF4401E262943003E2B24 /* Metal.framework */,
ABC570D4134431DA00E7B0B1 /* OpenGL.framework */,
AB3BF4321E2562F2003E2B24 /* QuartzCore.framework */,
AB0A0D1914AACA9600E83E91 /* libz.dylib */,
AB53B0BC211E63E4003D0ED9 /* libpcap.tbd */,
AB53B0BD211E63E8003D0ED9 /* libz.tbd */,
);
name = "Linked Frameworks";
sourceTree = "<group>";

View File

@ -693,6 +693,11 @@
AB37E3781D6188BC004A2C0D /* colorspacehandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB37E36C1D6188BC004A2C0D /* colorspacehandler.cpp */; };
AB37E37C1D6188BC004A2C0D /* colorspacehandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB37E36C1D6188BC004A2C0D /* colorspacehandler.cpp */; };
AB37E3801D6188BC004A2C0D /* colorspacehandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB37E36C1D6188BC004A2C0D /* colorspacehandler.cpp */; };
AB3932C4211E610200DA9D80 /* libpcap.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB3932C3211E610200DA9D80 /* libpcap.dylib */; };
AB3932C5211E611F00DA9D80 /* libpcap.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB3932C3211E610200DA9D80 /* libpcap.dylib */; };
AB3932C6211E612400DA9D80 /* libpcap.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB3932C3211E610200DA9D80 /* libpcap.dylib */; };
AB3932C7211E612A00DA9D80 /* libpcap.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB3932C3211E610200DA9D80 /* libpcap.dylib */; };
AB3932C8211E612E00DA9D80 /* libpcap.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AB3932C3211E610200DA9D80 /* libpcap.dylib */; };
AB3ACB7814C2361100D7D192 /* appDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6714C2361100D7D192 /* appDelegate.mm */; };
AB3ACB7914C2361100D7D192 /* cheatWindowDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6914C2361100D7D192 /* cheatWindowDelegate.mm */; };
AB3ACB7C14C2361100D7D192 /* inputPrefsView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */; };
@ -1921,6 +1926,7 @@
AB37E36F1D6188BC004A2C0D /* colorspacehandler_AltiVec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = colorspacehandler_AltiVec.h; sourceTree = "<group>"; };
AB37E3721D6188BC004A2C0D /* colorspacehandler_SSE2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = colorspacehandler_SSE2.cpp; sourceTree = "<group>"; };
AB37E3731D6188BC004A2C0D /* colorspacehandler_SSE2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = colorspacehandler_SSE2.h; sourceTree = "<group>"; };
AB3932C3211E610200DA9D80 /* libpcap.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libpcap.dylib; path = usr/lib/libpcap.dylib; sourceTree = SDKROOT; };
AB3ACB6614C2361100D7D192 /* appDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = appDelegate.h; sourceTree = "<group>"; };
AB3ACB6714C2361100D7D192 /* appDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = appDelegate.mm; sourceTree = "<group>"; };
AB3ACB6814C2361100D7D192 /* cheatWindowDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cheatWindowDelegate.h; sourceTree = "<group>"; };
@ -2349,6 +2355,7 @@
AB1CC8001AA509C2008B0A16 /* CoreAudio.framework in Frameworks */,
AB3E69801E25FB9800D4CC75 /* QuartzCore.framework in Frameworks */,
AB446DB61F69DB69002F32B6 /* CoreVideo.framework in Frameworks */,
AB3932C8211E612E00DA9D80 /* libpcap.dylib in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -2370,6 +2377,7 @@
AB1CC80A1AA509DF008B0A16 /* CoreAudio.framework in Frameworks */,
AB3E697F1E25FB9700D4CC75 /* QuartzCore.framework in Frameworks */,
AB446DB51F69DB69002F32B6 /* CoreVideo.framework in Frameworks */,
AB3932C7211E612A00DA9D80 /* libpcap.dylib in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -2391,6 +2399,7 @@
AB1CC80D1AA509E1008B0A16 /* CoreAudio.framework in Frameworks */,
AB3E69451E25FB8400D4CC75 /* QuartzCore.framework in Frameworks */,
AB446DA11F69DB56002F32B6 /* CoreVideo.framework in Frameworks */,
AB3932C4211E610200DA9D80 /* libpcap.dylib in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -2412,6 +2421,7 @@
AB1CC80C1AA509E0008B0A16 /* CoreAudio.framework in Frameworks */,
AB3E697D1E25FB9600D4CC75 /* QuartzCore.framework in Frameworks */,
AB446DB31F69DB68002F32B6 /* CoreVideo.framework in Frameworks */,
AB3932C5211E611F00DA9D80 /* libpcap.dylib in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -2433,6 +2443,7 @@
AB1CC80B1AA509E0008B0A16 /* CoreAudio.framework in Frameworks */,
AB3E697E1E25FB9700D4CC75 /* QuartzCore.framework in Frameworks */,
AB446DB41F69DB68002F32B6 /* CoreVideo.framework in Frameworks */,
AB3932C6211E612400DA9D80 /* libpcap.dylib in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -2511,6 +2522,7 @@
AB350BA41478AC96007165AC /* IOKit.framework */,
ABC570D4134431DA00E7B0B1 /* OpenGL.framework */,
AB3E69441E25FB8400D4CC75 /* QuartzCore.framework */,
AB3932C3211E610200DA9D80 /* libpcap.dylib */,
AB0A0D1914AACA9600E83E91 /* libz.dylib */,
);
name = "Linked Frameworks";

View File

@ -129,6 +129,9 @@ volatile bool execute = true;
threadParam.cdsCore = self;
wifiHandler->SetUniqueMACValue((uint32_t)[[NSProcessInfo processInfo] processIdentifier]);
wifiHandler->SetEmulationLevel(WifiEmulationLevel_Off);
pthread_rwlock_init(&threadParam.rwlockOutputList, NULL);
pthread_mutex_init(&threadParam.mutexThreadExecute, NULL);
pthread_cond_init(&threadParam.condThreadExecute, NULL);
@ -794,6 +797,7 @@ volatile bool execute = true;
[self setCoreState:ExecutionBehavior_Pause];
pthread_mutex_lock(&threadParam.mutexThreadExecute);
execControl->SetWifiIP4Address([CocoaDSUtil hostIP4AddressAsUInt32]);
execControl->ApplySettingsOnReset();
NDS_Reset();
pthread_mutex_unlock(&threadParam.mutexThreadExecute);

View File

@ -44,6 +44,7 @@
+ (NSString *) operatingSystemString;
+ (NSString *) modelIdentifierString;
+ (uint32_t) hostIP4AddressAsUInt32;
@end

View File

@ -163,6 +163,60 @@
return modelIdentifierStr;
}
+ (uint32_t) hostIP4AddressAsUInt32
{
uint32_t ip4Address_u32 = 0;
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setAllowsFloats:NO];
NSArray *ipAddresses = [[NSHost hostWithName:[[NSHost currentHost] name]] addresses];
for (NSString *ipAddress in ipAddresses)
{
if ([ipAddress isEqualToString:@"127.0.0.1"])
{
continue;
}
else
{
NSArray *ipParts = [ipAddress componentsSeparatedByString:@"."];
if ([ipParts count] != 4)
{
continue;
}
else
{
NSNumber *ipPartNumber[4] = {
[numberFormatter numberFromString:(NSString *)[ipParts objectAtIndex:0]],
[numberFormatter numberFromString:(NSString *)[ipParts objectAtIndex:1]],
[numberFormatter numberFromString:(NSString *)[ipParts objectAtIndex:2]],
[numberFormatter numberFromString:(NSString *)[ipParts objectAtIndex:3]]
};
if ( (ipPartNumber[0] == nil) || (ipPartNumber[1] == nil) || (ipPartNumber[2] == nil) || (ipPartNumber[3] == nil) )
{
continue;
}
else
{
const uint8_t ipPart_u8[4] = {
[ipPartNumber[0] unsignedCharValue],
[ipPartNumber[1] unsignedCharValue],
[ipPartNumber[2] unsignedCharValue],
[ipPartNumber[3] unsignedCharValue]
};
ip4Address_u32 = (ipPart_u8[0]) | (ipPart_u8[1] << 8) | (ipPart_u8[2] << 16) | (ipPart_u8[3] << 24);
break;
}
}
}
}
return ip4Address_u32;
}
@end
@implementation DirectoryURLDragDestTextField

View File

@ -1630,6 +1630,7 @@
[self pauseCore];
CocoaDSCore *cdsCore = (CocoaDSCore *)[cdsCoreController content];
[cdsCore execControl]->SetWifiIP4Address([CocoaDSUtil hostIP4AddressAsUInt32]);
[cdsCore execControl]->ApplySettingsOnReset();
[cdsCore updateSlot1DeviceStatus];
[self writeDefaultsSlot1Settings:nil];
@ -1781,6 +1782,7 @@
[[windowController window] displayIfNeeded];
}
[cdsCore execControl]->SetWifiIP4Address([CocoaDSUtil hostIP4AddressAsUInt32]);
[cdsCore execControl]->ApplySettingsOnReset();
[cdsCore setMasterExecute:YES];

View File

@ -294,11 +294,7 @@ msgBoxInterface msgBoxWnd = {
};
//====================== Dialogs end
#ifdef EXPERIMENTAL_WIFI_COMM
bool bSocketsAvailable = false;
#include "winpcap.h"
#endif
VideoInfo video;
@ -555,6 +551,50 @@ public:
}
};
class WinPCapInterface : public ClientPCapInterface
{
public:
virtual int findalldevs(void **alldevs, char *errbuf)
{
return _pcap_findalldevs((pcap_if_t **)alldevs, errbuf);
}
virtual void freealldevs(void *alldevs)
{
_pcap_freealldevs((pcap_if_t *)alldevs);
}
virtual void* open(const char *source, int snaplen, int flags, int readtimeout, char *errbuf)
{
return _pcap_open_live(source, snaplen, flags, readtimeout, errbuf);
}
virtual void close(void *dev)
{
_pcap_close((pcap_t *)dev);
}
virtual int setnonblock(void *dev, int nonblock, char *errbuf)
{
return _pcap_setnonblock((pcap_t *)dev, nonblock, errbuf);
}
virtual int sendpacket(void *dev, const void *data, int len)
{
return _pcap_sendpacket((pcap_t *)dev, (u_char *)data, len);
}
virtual int dispatch(void *dev, int num, void *callback, void *userdata)
{
if (callback == NULL)
{
return -1;
}
return _pcap_dispatch((pcap_t *)dev, num, (pcap_handler)callback, (u_char *)userdata);
}
};
GPUEventHandlerWindows *WinGPUEvent = NULL;
LRESULT CALLBACK HUDFontSettingsDlgProc(HWND hw, UINT msg, WPARAM wp, LPARAM lp);
@ -562,9 +602,7 @@ LRESULT CALLBACK GFX3DSettingsDlgProc(HWND hw, UINT msg, WPARAM wp, LPARAM lp);
LRESULT CALLBACK SoundSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK EmulationSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK MicrophoneSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
#ifdef EXPERIMENTAL_WIFI_COMM
LRESULT CALLBACK WifiSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
#endif
//struct configured_features {
// u16 arm9_gdb_port;
@ -2712,97 +2750,6 @@ static void ExitRunLoop()
class WinDriver : public BaseDriver
{
#ifdef EXPERIMENTAL_WIFI_COMM
virtual bool WIFI_SocketsAvailable() { return bSocketsAvailable; }
virtual bool WIFI_PCapAvailable() { return bWinPCapAvailable; }
virtual void WIFI_GetUniqueMAC(u8* mac)
{
if (mac == NULL) return;
char hostname[256];
if (gethostname(hostname, 256) != 0)
strncpy(hostname, "127.0.0.1", 256);
hostent* he = gethostbyname(hostname);
unsigned long ipaddr;
if (he == NULL || he->h_addr_list[0] == NULL)
ipaddr = 0x0100007F; // 127.0.0.1
else
ipaddr = *(unsigned long*)he->h_addr_list[0];
unsigned long pid = GetCurrentProcessId();
unsigned long hash = pid;
while ((hash & 0xFF000000) == 0)
hash <<= 1;
hash >>= 1;
hash += ipaddr >> 8;
hash &= 0x00FFFFFF;
mac[3] = hash >> 16;
mac[4] = (hash >> 8) & 0xFF;
mac[5] = hash & 0xFF;
}
virtual bool WIFI_WFCWarning()
{
return MessageBox(NULL, "You are trying to connect to the Nintendo WFC servers.\n"
"\n"
"Please don't do this."
"\n"
"DeSmuME is not perfect yet, and connecting to WFC will cause unexpected problems\n"
"for Nintendo, and for DeSmuME, which neither of us want.\n"
"\n"
"And you don't want that either, right?\n"
"\n"
"You may get your IP blocked and then you won't even be able to use your real DS.\n"
"You may cause DeSmuME to get blocked, which would be a shame since we wouldn't even\n"
"be able to work on it any more.\n"
"\n"
"By the time you read this, it may have already happened due to irresponsible individuals\n"
"ignoring this message.\n"
"\n"
"So please don't do it.\n"
"\n"
"We aren't going to try to stop you, since someone will just make a hacked build and you\n"
"won't get a chance to read this. So please, stop yourself.\n"
"\n"
"Do you still want to connect?",
"DeSmuME - WFC warning",
MB_YESNO | MB_DEFBUTTON2 | MB_ICONWARNING
) == IDYES;
}
virtual int PCAP_findalldevs(pcap_if_t** alldevs, char* errbuf) {
return _pcap_findalldevs(alldevs, errbuf);
}
virtual void PCAP_freealldevs(pcap_if_t* alldevs) {
_pcap_freealldevs(alldevs);
}
virtual pcap_t* PCAP_open(const char* source, int snaplen, int flags, int readtimeout, char* errbuf) {
return _pcap_open_live(source, snaplen, flags, readtimeout, errbuf);
}
virtual void PCAP_close(pcap_t* dev) {
_pcap_close(dev);
}
virtual int PCAP_setnonblock(pcap_t* dev, int nonblock, char* errbuf) {
return _pcap_setnonblock(dev, nonblock, errbuf);
}
virtual int PCAP_sendpacket(pcap_t* dev, const u_char* data, int len) {
return _pcap_sendpacket(dev, data, len);
}
virtual int PCAP_dispatch(pcap_t* dev, int num, pcap_handler callback, u_char* userdata) {
return _pcap_dispatch(dev, num, callback, userdata);
}
#endif
virtual bool AVI_IsRecording()
{
return ::AVI_IsRecording();
@ -2984,16 +2931,27 @@ int _main()
OGLLoadEntryPoints_3_2_Func = OGLLoadEntryPoints_3_2;
OGLCreateRenderer_3_2_Func = OGLCreateRenderer_3_2;
bool isSocketsSupported = false;
bool isPCapSupported = false;
#ifdef EXPERIMENTAL_WIFI_COMM
WSADATA wsaData;
WORD version = MAKEWORD(1,1);
WORD version = MAKEWORD(2,2);
if (WSAStartup(version, &wsaData) == 0)
bSocketsAvailable = true;
// Start up Windows Sockets.
if (WSAStartup(version, &wsaData) == 0)
{
// Check for a matching DLL version. If the version doesn't match, then bail.
if ( (LOBYTE(wsaData.wVersion) == 2) && (HIBYTE(wsaData.wVersion) == 2) )
{
isSocketsSupported = true;
}
else
{
WSACleanup();
}
}
LoadWinPCap();
#endif
LoadWinPCap(isPCapSupported);
driver = new WinDriver();
WinGPUEvent = new GPUEventHandlerWindows;
@ -3211,11 +3169,7 @@ int _main()
SetStyle(style);
DragAcceptFiles(MainWindow->getHWnd(), TRUE);
#ifdef EXPERIMENTAL_WIFI_COMM
EnableMenuItem(mainMenu, IDM_WIFISETTINGS, MF_ENABLED);
#endif
InitCustomKeys(&CustomKeys);
Hud.reset();
@ -3328,17 +3282,7 @@ int _main()
Piano.Enabled = (slot2_device_type == NDS_SLOT2_EASYPIANO)?true:false;
Paddle.Enabled = (slot2_device_type == NDS_SLOT2_PADDLE)?true:false;
if (GetPrivateProfileBool("Wifi", "Enabled", false, IniName))
{
if (GetPrivateProfileBool("Wifi", "Compatibility Mode", false, IniName))
wifiEmulationLevel = WifiEmulationLevel_Compatibility;
else
wifiEmulationLevel = WifiEmulationLevel_Normal;
}
else
wifiEmulationLevel = WifiEmulationLevel_Off;
CommonSettings.wifi.mode = GetPrivateProfileInt("Wifi", "Mode", 0, IniName);
CommonSettings.wifi.mode = (WifiCommInterfaceID)GetPrivateProfileInt("Wifi", "Mode", WifiCommInterfaceID_AdHoc, IniName);
CommonSettings.wifi.infraBridgeAdapter = GetPrivateProfileInt("Wifi", "BridgeAdapter", 0, IniName);
osd = new OSDCLASS(-1);
@ -3347,6 +3291,37 @@ int _main()
GPU->SetEventHandler(WinGPUEvent);
WinPCapInterface *winpcapInterface = (isPCapSupported) ? new WinPCapInterface : NULL;
wifiHandler->SetPCapInterface(winpcapInterface);
wifiHandler->SetSocketsSupported(isSocketsSupported);
// Get the host's IP4 address.
char hostname[256];
if (gethostname(hostname, 256) != 0)
strncpy(hostname, "127.0.0.1", 256);
hostent *he = gethostbyname(hostname);
unsigned long ipaddr;
if (he == NULL || he->h_addr_list[0] == NULL)
ipaddr = 0x0100007F; // 127.0.0.1
else
ipaddr = *(unsigned long*)he->h_addr_list[0];
wifiHandler->SetIP4Address(ipaddr);
wifiHandler->SetUniqueMACValue((u32)GetCurrentProcessId());
wifiHandler->SetCommInterfaceID(CommonSettings.wifi.mode);
wifiHandler->SetBridgeDeviceIndex(CommonSettings.wifi.infraBridgeAdapter);
if (GetPrivateProfileBool("Wifi", "Enabled", false, IniName))
{
if (GetPrivateProfileBool("Wifi", "Compatibility Mode", false, IniName))
wifiHandler->SetEmulationLevel(WifiEmulationLevel_Compatibility);
else
wifiHandler->SetEmulationLevel(WifiEmulationLevel_Normal);
}
else
wifiHandler->SetEmulationLevel(WifiEmulationLevel_Off);
CommonSettings.GFX3D_Renderer_TextureScalingFactor = (cmdline.texture_upscale != -1) ? cmdline.texture_upscale : GetPrivateProfileInt("3D", "TextureScalingFactor ", 1, IniName);
int newPrescaleHD = (cmdline.gpu_resolution_multiplier != -1) ? cmdline.gpu_resolution_multiplier : GetPrivateProfileInt("3D", "PrescaleHD", 1, IniName);
@ -3616,9 +3591,10 @@ int _main()
UnregWndClass("DeSmuME");
#ifdef EXPERIMENTAL_WIFI_COMM
WSACleanup();
#endif
if (wifiHandler->IsSocketsSupported())
{
WSACleanup();
}
return 0;
}
@ -4496,11 +4472,9 @@ void RunConfig(CONFIGSCREEN which)
case CONFIGSCREEN_PATHSETTINGS:
DialogBoxW(hAppInst, MAKEINTRESOURCEW(IDD_PATHSETTINGS), hwnd, (DLGPROC)PathSettingsDlgProc);
break;
#ifdef EXPERIMENTAL_WIFI_COMM
case CONFIGSCREEN_WIFI:
DialogBoxW(hAppInst,MAKEINTRESOURCEW(IDD_WIFISETTINGS), hwnd, (DLGPROC) WifiSettingsDlgProc);
break;
#endif
}
if (tpaused)
@ -4556,15 +4530,10 @@ static void TwiddleLayer(UINT ctlid, int core, int layer)
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int tmp_execute;
switch (message) // handle the messages
{
case WM_INITMENU:
{
#ifdef EXPERIMENTAL_WIFI_COMM
if (!(bSocketsAvailable || bWinPCapAvailable))
#endif
DeleteMenu(GetMenu(hwnd), IDM_WIFISETTINGS, MF_BYCOMMAND);
}
return 0;
case WM_EXITMENULOOP:
@ -7063,67 +7032,83 @@ LRESULT CALLBACK MicrophoneSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,
return FALSE;
}
#ifdef EXPERIMENTAL_WIFI_COMM
LRESULT CALLBACK WifiSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
const bool isSocketsSupported = wifiHandler->IsSocketsSupported();
const bool isPCapSupported = wifiHandler->IsPCapSupported();
const WifiEmulationLevel emulationLevel = wifiHandler->GetSelectedEmulationLevel();
switch(uMsg)
{
case WM_INITDIALOG:
{
char errbuf[PCAP_ERRBUF_SIZE];
pcap_if_t *alldevs;
pcap_if_t *d;
int i;
HWND cur;
if (wifiEmulationLevel > WifiEmulationLevel_Off)
#ifdef EXPERIMENTAL_WIFI_COMM
if (emulationLevel != WifiEmulationLevel_Off)
{
CheckDlgItem(hDlg, IDC_WIFI_ENABLED, true);
CheckDlgItem(hDlg, IDC_WIFI_COMPAT, wifiEmulationLevel == WifiEmulationLevel_Compatibility);
CheckDlgItem(hDlg, IDC_WIFI_ENABLED, TRUE);
CheckDlgItem(hDlg, IDC_WIFI_COMPAT, (emulationLevel == WifiEmulationLevel_Compatibility));
}
else
{
CheckDlgItem(hDlg, IDC_WIFI_ENABLED, false);
CheckDlgItem(hDlg, IDC_WIFI_COMPAT, GetPrivateProfileBool("Wifi", "Compatibility Mode", false, IniName));
CheckDlgItem(hDlg, IDC_WIFI_ENABLED, FALSE);
CheckDlgItem(hDlg, IDC_WIFI_COMPAT, GetPrivateProfileBool("Wifi", "Compatibility Mode", FALSE, IniName));
}
if (bSocketsAvailable && bWinPCapAvailable)
#else
CheckDlgItem(hDlg, IDC_WIFI_ENABLED, FALSE);
CheckDlgItem(hDlg, IDC_WIFI_COMPAT, FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_WIFI_ENABLED), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_WIFI_COMPAT), FALSE);
#endif
if (isSocketsSupported && isPCapSupported)
CheckRadioButton(hDlg, IDC_WIFIMODE0, IDC_WIFIMODE1, IDC_WIFIMODE0 + CommonSettings.wifi.mode);
else if(bSocketsAvailable)
else if(isSocketsSupported)
CheckRadioButton(hDlg, IDC_WIFIMODE0, IDC_WIFIMODE1, IDC_WIFIMODE0);
else if(bWinPCapAvailable)
else
CheckRadioButton(hDlg, IDC_WIFIMODE0, IDC_WIFIMODE1, IDC_WIFIMODE1);
if (bWinPCapAvailable)
HWND deviceMenu = GetDlgItem(hDlg, IDC_BRIDGEADAPTER);
int menuItemCount = ComboBox_GetCount(deviceMenu);
int deviceCount = -1;
std::vector<std::string> deviceStringList;
for (int i = 0; i < menuItemCount; i++)
{
if(driver->PCAP_findalldevs(&alldevs, errbuf) == -1)
{
// TODO: fail more gracefully!
EndDialog(hDlg, TRUE);
return TRUE;
}
ComboBox_DeleteString(deviceMenu, 0);
}
cur = GetDlgItem(hDlg, IDC_BRIDGEADAPTER);
for(i = 0, d = alldevs; d != NULL; i++, d = d->next)
{
char buf[256] = {0};
// on x64 description is empty
if (d->description[0] == 0)
strcpy(buf, d->name);
else
strcpy(buf, d->description);
ComboBox_AddString(cur, buf);
}
ComboBox_SetCurSel(cur, CommonSettings.wifi.infraBridgeAdapter);
if (isPCapSupported)
{
deviceCount = wifiHandler->GetBridgeDeviceList(&deviceStringList);
}
else
{
EnableWindow(GetDlgItem(hDlg, IDC_WIFIMODE1), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_BRIDGEADAPTER), FALSE);
SetDlgItemText(hDlg, IDC_WIFIMODE1, "Infrastructure (winpcap not loaded)");
}
if (deviceCount < 0)
{
ComboBox_AddString(deviceMenu, "Error: Cannot find any devices.");
ComboBox_SetCurSel(deviceMenu, 0);
EnableWindow(deviceMenu, FALSE);
}
else if (deviceCount == 0)
{
ComboBox_AddString(deviceMenu, "No devices found.");
ComboBox_SetCurSel(deviceMenu, 0);
EnableWindow(deviceMenu, FALSE);
}
else
{
for (size_t i = 0; i < deviceCount; i++)
{
ComboBox_AddString(deviceMenu, deviceStringList[i].c_str());
}
ComboBox_SetCurSel(deviceMenu, CommonSettings.wifi.infraBridgeAdapter);
EnableWindow(deviceMenu, TRUE);
}
if (!bSocketsAvailable)
if (!isSocketsSupported)
EnableWindow(GetDlgItem(hDlg, IDC_WIFIMODE0), FALSE);
}
return TRUE;
@ -7140,27 +7125,33 @@ LRESULT CALLBACK WifiSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM
if(romloaded)
val = MessageBox(hDlg, "The current ROM needs to be reset to apply changes.\nReset now ?", "DeSmuME", (MB_YESNO | MB_ICONQUESTION));
if (IsDlgCheckboxChecked(hDlg, IDC_WIFI_ENABLED))
#ifdef EXPERIMENTAL_WIFI_COMM
if (IsDlgCheckboxChecked(hDlg, IDC_WIFI_ENABLED))
{
if (IsDlgCheckboxChecked(hDlg, IDC_WIFI_COMPAT))
wifiEmulationLevel = WifiEmulationLevel_Compatibility;
wifiHandler->SetEmulationLevel(WifiEmulationLevel_Compatibility);
else
wifiEmulationLevel = WifiEmulationLevel_Normal;
wifiHandler->SetEmulationLevel(WifiEmulationLevel_Normal);
}
else
wifiEmulationLevel = WifiEmulationLevel_Off;
wifiHandler->SetEmulationLevel(WifiEmulationLevel_Off);
WritePrivateProfileBool("Wifi", "Enabled", IsDlgCheckboxChecked(hDlg, IDC_WIFI_ENABLED), IniName);
WritePrivateProfileBool("Wifi", "Compatibility Mode", IsDlgCheckboxChecked(hDlg, IDC_WIFI_COMPAT), IniName);
#else
wifiHandler->SetEmulationLevel(WifiEmulationLevel_Off);
#endif
if (IsDlgButtonChecked(hDlg, IDC_WIFIMODE0))
CommonSettings.wifi.mode = 0;
CommonSettings.wifi.mode = WifiCommInterfaceID_AdHoc;
else
CommonSettings.wifi.mode = 1;
CommonSettings.wifi.mode = WifiCommInterfaceID_Infrastructure;
WritePrivateProfileInt("Wifi", "Mode", CommonSettings.wifi.mode, IniName);
wifiHandler->SetCommInterfaceID(CommonSettings.wifi.mode);
cur = GetDlgItem(hDlg, IDC_BRIDGEADAPTER);
CommonSettings.wifi.infraBridgeAdapter = ComboBox_GetCurSel(cur);
wifiHandler->SetBridgeDeviceIndex(CommonSettings.wifi.infraBridgeAdapter);
WritePrivateProfileInt("Wifi", "BridgeAdapter", CommonSettings.wifi.infraBridgeAdapter, IniName);
if(val == IDYES)
@ -7180,7 +7171,6 @@ LRESULT CALLBACK WifiSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM
return FALSE;
}
#endif
static void SoundSettings_updateVolumeReadout(HWND hDlg)
{

24
desmume/src/frontend/windows/winpcap.h Normal file → Executable file
View File

@ -1,5 +1,5 @@
/*
Copyright (C) 2010 DeSmuME team
Copyright (C) 2010-2018 DeSmuME team
This file is part of DeSmuME
@ -21,14 +21,16 @@
#ifndef WINPCAP_H
#define WINPCAP_H
#define HAVE_REMOTE
#define WPCAP
#define PACKET_SIZE 65535
#ifndef HAVE_REMOTE
#define HAVE_REMOTE
#endif
#ifndef WPCAP
#define WPCAP
#endif
#include <pcap.h>
static bool bWinPCapAvailable = false;
typedef int (__cdecl *T_pcap_findalldevs)(pcap_if_t** alldevs, char* errbuf);
typedef void (__cdecl *T_pcap_freealldevs)(pcap_if_t* alldevs);
typedef pcap_t* (__cdecl *T_pcap_open_live)(const char* source, int snaplen, int flags, int readtimeout, char* errbuf);
@ -51,11 +53,16 @@ T_pcap_dispatch _pcap_dispatch = NULL;
if (_##name == NULL) return;
static void LoadWinPCap()
static void LoadWinPCap(bool &outResult)
{
bool result = false;
HMODULE wpcap = LoadLibrary("wpcap.dll");
if (wpcap == NULL)
{
outResult = result;
return;
}
LOADSYMBOL(pcap_findalldevs);
LOADSYMBOL(pcap_freealldevs);
@ -65,7 +72,8 @@ static void LoadWinPCap()
LOADSYMBOL(pcap_sendpacket);
LOADSYMBOL(pcap_dispatch);
bWinPCapAvailable = true;
result = true;
outResult = result;
}
#endif

2047
desmume/src/wifi.cpp Normal file → Executable file

File diff suppressed because it is too large Load Diff

286
desmume/src/wifi.h Normal file → Executable file
View File

@ -19,24 +19,15 @@
along with DeSmuME; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef WIFI_H
#define WIFI_H
#include <stdio.h>
#include "types.h"
#ifdef EXPERIMENTAL_WIFI_COMM
#ifndef __APPLE__
#define HAVE_REMOTE
#endif
#define WPCAP
#define PACKET_SIZE 65535
#define _INC_STDIO
#endif
#include <string>
#include <vector>
#define REG_WIFI_ID 0x000
#define REG_WIFI_MODE 0x004
@ -178,11 +169,6 @@
/* WIFI misc constants */
#define WIFI_CHIPID 0x1440 /* emulates "old" wifi chip, new is 0xC340 */
// SAVE PACKETS HACK FUNCTIONS
static void create_packet();
static void save_packet(u8* packet, u32 len, u32 seconds, u32 millis, bool isReceived);
u32 timeval2millis(struct timeval tv);
/* Referenced as RF_ in dswifi: rffilter_t */
/* based on the documentation for the RF2958 chip of RF Micro Devices */
/* using the register names as in docs ( http://www.rfmd.com/pdfs/2958.pdf )*/
@ -434,14 +420,34 @@ enum EAPStatus
APStatus_Associated
};
enum WifiEmulationLevel
{
WifiEmulationLevel_Off = 0,
WifiEmulationLevel_Normal = 10000,
WifiEmulationLevel_Compatibility = 65535,
};
enum WifiCommInterfaceID
{
WifiCommInterfaceID_AdHoc = 0,
WifiCommInterfaceID_Infrastructure = 1
};
enum WifiMACMode
{
WifiMACMode_Automatic = 0,
WifiMACMode_Manual = 1,
WifiMACMode_ReadFromFirmware = 2
};
/* wifimac_t: the buildin mac (arm7 addressrange: 0x04800000-0x04FFFFFF )*/
/* http://www.akkit.org/info/dswifi.htm#WifiIOMap */
typedef struct
{
/* power */
BOOL powerOn;
BOOL powerOnPending;
bool powerOn;
bool powerOnPending;
/* status */
u16 rfStatus;
@ -454,7 +460,7 @@ typedef struct
/* modes */
u16 macMode;
u16 wepMode;
BOOL WEP_enable;
bool WEP_enable;
/* sending */
u16 TXStatCnt;
@ -464,7 +470,7 @@ typedef struct
u16 TXOpt;
u16 TXStat;
u16 BeaconAddr;
BOOL BeaconEnable;
bool BeaconEnable;
u16 TXSlotExtra;
u16 TXSeqNo;
u8 txCurSlot;
@ -501,13 +507,13 @@ typedef struct
u16 retryLimit;
/* timing */
BOOL crystalEnabled;
bool crystalEnabled;
u64 usec;
BOOL usecEnable;
bool usecEnable;
u64 ucmp;
BOOL ucmpEnable;
bool ucmpEnable;
u32 eCount;
BOOL eCountEnable;
bool eCountEnable;
u16 BeaconInterval;
u16 BeaconCount1;
u16 BeaconCount2;
@ -542,7 +548,7 @@ typedef struct
/* tx packets */
s32 curPacketSize[3];
s32 curPacketPos[3];
BOOL curPacketSending[3];
bool curPacketSending[3];
/* I/O ports */
u16 IOPorts[0x800];
@ -552,40 +558,7 @@ typedef struct
} wifimac_t;
typedef struct
{
u64 usecCounter;
} Adhoc_t;
typedef struct
{
u64 usecCounter;
u8 curPacket[4096];
s32 curPacketSize;
s32 curPacketPos;
BOOL curPacketSending;
EAPStatus status;
u16 seqNum;
} SoftAP_t;
// desmume host communication
#ifdef EXPERIMENTAL_WIFI_COMM
typedef struct pcap pcap_t;
extern pcap_t *wifi_bridge;
#endif
extern wifimac_t wifiMac;
extern Adhoc_t Adhoc;
extern SoftAP_t SoftAP;
bool WIFI_Init();
void WIFI_DeInit();
void WIFI_Reset();
/* subchip communication IO functions */
void WIFI_setRF_CNT(u16 val);
@ -632,6 +605,199 @@ typedef struct _FW_WFCProfile
} FW_WFCProfile;
class ClientPCapInterface
{
public:
virtual int findalldevs(void **alldevs, char *errbuf) = 0;
virtual void freealldevs(void *alldevs) = 0;
virtual void* open(const char *source, int snaplen, int flags, int readtimeout, char *errbuf) = 0;
virtual void close(void *dev) = 0;
virtual int setnonblock(void *dev, int nonblock, char *errbuf) = 0;
virtual int sendpacket(void *dev, const void *data, int len) = 0;
virtual int dispatch(void *dev, int num, void *callback, void *userdata) = 0;
};
class DummyPCapInterface : public ClientPCapInterface
{
private:
void __CopyErrorString(char *errbuf);
public:
virtual int findalldevs(void **alldevs, char *errbuf);
virtual void freealldevs(void *alldevs);
virtual void* open(const char *source, int snaplen, int flags, int readtimeout, char *errbuf);
virtual void close(void *dev);
virtual int setnonblock(void *dev, int nonblock, char *errbuf);
virtual int sendpacket(void *dev, const void *data, int len);
virtual int dispatch(void *dev, int num, void *callback, void *userdata);
};
#ifndef HOST_WINDOWS
class POSIXPCapInterface : public ClientPCapInterface
{
public:
virtual int findalldevs(void **alldevs, char *errbuf);
virtual void freealldevs(void *alldevs);
virtual void* open(const char *source, int snaplen, int flags, int readtimeout, char *errbuf);
virtual void close(void *dev);
virtual int setnonblock(void *dev, int nonblock, char *errbuf);
virtual int sendpacket(void *dev, const void *data, int len);
virtual int dispatch(void *dev, int num, void *callback, void *userdata);
};
#endif
class WifiCommInterface
{
protected:
WifiCommInterfaceID _commInterfaceID;
WifiEmulationLevel _emulationLevel;
u64 _usecCounter;
public:
WifiCommInterface();
virtual ~WifiCommInterface();
virtual bool Start(WifiEmulationLevel emulationLevel) = 0;
virtual void Stop() = 0;
virtual void SendPacket(void *data, size_t len) = 0;
virtual void Trigger() = 0;
};
class AdhocCommInterface : public WifiCommInterface
{
protected:
void *_wifiSocket;
void *_sendAddr;
u8 *_packetBuffer;
public:
AdhocCommInterface();
~AdhocCommInterface();
virtual bool Start(WifiEmulationLevel emulationLevel);
virtual void Stop();
virtual void SendPacket(void *data, size_t len);
virtual void Trigger();
};
class SoftAPCommInterface : public WifiCommInterface
{
protected:
ClientPCapInterface *_pcap;
int _bridgeDeviceIndex;
void *_bridgeDevice;
FILE *_packetCaptureFile; // PCAP file to store the Ethernet packets.
u8 _curPacket[4096];
s32 _curPacketSize;
s32 _curPacketPos;
bool _curPacketSending;
EAPStatus _status;
u16 _seqNum;
void* _GetBridgeDeviceAtIndex(int deviceIndex, char *outErrorBuf);
bool _IsDNSRequestToWFC(u16 ethertype, u8 *body);
void _Deauthenticate();
void _SendBeacon();
public:
SoftAPCommInterface();
virtual ~SoftAPCommInterface();
void SetPCapInterface(ClientPCapInterface *pcapInterface);
ClientPCapInterface* GetPCapInterface();
int GetBridgeDeviceIndex();
void SetBridgeDeviceIndex(int deviceIndex);
void PacketRX(const void *pktHeader, const u8 *pktData);
void PacketCaptureFileOpen();
void PacketCaptureFileClose();
void PacketCaptureFileWrite(const u8 *packet, u32 len, bool isReceived);
virtual bool Start(WifiEmulationLevel emulationLevel);
virtual void Stop();
virtual void SendPacket(void *data, size_t len);
virtual void Trigger();
};
class WifiHandler
{
protected:
AdhocCommInterface *_adhocCommInterface;
SoftAPCommInterface *_softAPCommInterface;
WifiEmulationLevel _selectedEmulationLevel;
WifiEmulationLevel _currentEmulationLevel;
WifiCommInterfaceID _selectedCommID;
WifiCommInterfaceID _currentCommID;
WifiCommInterface *_currentCommInterface;
int _selectedBridgeDeviceIndex;
ClientPCapInterface *_pcap;
bool _isSocketsSupported;
bool _didWarnWFCUser;
WifiMACMode _adhocMACMode;
WifiMACMode _infrastructureMACMode;
u32 _ip4Address;
u32 _uniqueMACValue;
u8 _userMAC[3];
public:
WifiHandler();
~WifiHandler();
void Reset();
WifiEmulationLevel GetSelectedEmulationLevel();
WifiEmulationLevel GetCurrentEmulationLevel();
void SetEmulationLevel(WifiEmulationLevel emulationLevel);
WifiCommInterfaceID GetSelectedCommInterfaceID();
WifiCommInterfaceID GetCurrentCommInterfaceID();
void SetCommInterfaceID(WifiCommInterfaceID commID);
int GetBridgeDeviceList(std::vector<std::string> *deviceStringList);
int GetSelectedBridgeDeviceIndex();
int GetCurrentBridgeDeviceIndex();
void SetBridgeDeviceIndex(int deviceIndex);
bool CommStart();
void CommStop();
void CommSendPacket(void *data, size_t len);
void CommTrigger();
bool IsSocketsSupported();
void SetSocketsSupported(bool isSupported);
bool IsPCapSupported();
ClientPCapInterface* GetPCapInterface();
void SetPCapInterface(ClientPCapInterface *pcapInterface);
WifiMACMode GetMACModeForComm(WifiCommInterfaceID commID);
void SetMACModeForComm(WifiCommInterfaceID commID, WifiMACMode macMode);
uint32_t GetIP4Address();
void SetIP4Address(u32 ip4Address);
uint32_t GetUniqueMACValue();
void SetUniqueMACValue(u32 uniqueValue);
void GetUserMACValues(u8 *outValue3, u8 *outValue4, u8 *outValue5);
void SetUserMACValues(u8 inValue3, u8 inValue4, u8 inValue5);
void GenerateMACFromValues(u8 outMAC[6]);
void CopyMACFromUserValues(u8 outMAC[6]);
};
/* wifi data to be stored in firmware, when no firmware image was loaded */
extern u8 FW_Mac[6];
extern const u8 FW_WIFIInit[32];
@ -642,5 +808,7 @@ extern const u8 FW_BBChannel[14];
extern FW_WFCProfile FW_WFCProfile1;
extern FW_WFCProfile FW_WFCProfile2;
extern FW_WFCProfile FW_WFCProfile3;
extern DummyPCapInterface dummyPCapInterface;
extern WifiHandler *wifiHandler;
#endif