mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-24 14:49:53 -06:00
get things somewhat working, still not done
This commit is contained in:
@ -1443,19 +1443,25 @@ void DSi_NWifi::CheckRX()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
int rxlen = Platform::LAN_RecvPacket(LANBuffer, DSi.UserData);
|
int rxlen = Platform::LAN_RecvPacket(LANBuffer, DSi.UserData);
|
||||||
if (rxlen > 0)
|
while (rxlen > 0)
|
||||||
{
|
{
|
||||||
//printf("WMI packet recv %04X %04X %04X\n", *(u16*)&LANBuffer[0], *(u16*)&LANBuffer[2], *(u16*)&LANBuffer[4]);
|
//printf("WMI packet recv %04X %04X %04X\n", *(u16*)&LANBuffer[0], *(u16*)&LANBuffer[2], *(u16*)&LANBuffer[4]);
|
||||||
// check destination MAC
|
// check destination MAC
|
||||||
if (*(u32*)&LANBuffer[0] != 0xFFFFFFFF || *(u16*)&LANBuffer[4] != 0xFFFF)
|
if (*(u32*)&LANBuffer[0] != 0xFFFFFFFF || *(u16*)&LANBuffer[4] != 0xFFFF)
|
||||||
{
|
{
|
||||||
if (memcmp(&LANBuffer[0], &EEPROM[0x00A], 6))
|
if (memcmp(&LANBuffer[0], &EEPROM[0x00A], 6))
|
||||||
return;
|
{
|
||||||
|
rxlen = Platform::LAN_RecvPacket(LANBuffer, DSi.UserData);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// check source MAC, in case we get a packet we just sent out
|
// check source MAC, in case we get a packet we just sent out
|
||||||
if (!memcmp(&LANBuffer[6], &EEPROM[0x00A], 6))
|
if (!memcmp(&LANBuffer[6], &EEPROM[0x00A], 6))
|
||||||
return;
|
{
|
||||||
|
rxlen = Platform::LAN_RecvPacket(LANBuffer, DSi.UserData);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// packet is good
|
// packet is good
|
||||||
|
|
||||||
|
@ -369,13 +369,22 @@ int WifiAP::RecvPacket(u8* data)
|
|||||||
if (ClientStatus < 2) return 0;
|
if (ClientStatus < 2) return 0;
|
||||||
|
|
||||||
int rxlen = Platform::LAN_RecvPacket(LANBuffer, UserData);
|
int rxlen = Platform::LAN_RecvPacket(LANBuffer, UserData);
|
||||||
if (rxlen > 0)
|
while (rxlen > 0)
|
||||||
{
|
{
|
||||||
// check destination MAC
|
// check destination MAC
|
||||||
if (!MACIsBroadcast(&LANBuffer[0]))
|
if (!MACIsBroadcast(&LANBuffer[0]))
|
||||||
{
|
{
|
||||||
if (!MACEqual(&LANBuffer[0], Client->GetMAC()))
|
if (!MACEqual(&LANBuffer[0], Client->GetMAC()))
|
||||||
return 0;
|
{
|
||||||
|
rxlen = Platform::LAN_RecvPacket(LANBuffer, UserData);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MACEqual(&LANBuffer[6], Client->GetMAC()))
|
||||||
|
{
|
||||||
|
rxlen = Platform::LAN_RecvPacket(LANBuffer, UserData);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// packet is good
|
// packet is good
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
#include "EmuInstance.h"
|
#include "EmuInstance.h"
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "Platform.h"
|
#include "Platform.h"
|
||||||
|
#include "Net.h"
|
||||||
#include "LocalMP.h"
|
#include "LocalMP.h"
|
||||||
|
|
||||||
#include "NDS.h"
|
#include "NDS.h"
|
||||||
@ -82,6 +83,8 @@ EmuInstance::EmuInstance(int inst) : instanceID(inst),
|
|||||||
audioInit();
|
audioInit();
|
||||||
inputInit();
|
inputInit();
|
||||||
|
|
||||||
|
Net::RegisterInstance(instanceID);
|
||||||
|
|
||||||
emuThread = new EmuThread(this);
|
emuThread = new EmuThread(this);
|
||||||
|
|
||||||
numWindows = 0;
|
numWindows = 0;
|
||||||
@ -106,6 +109,8 @@ EmuInstance::~EmuInstance()
|
|||||||
emuThread->wait();
|
emuThread->wait();
|
||||||
delete emuThread;
|
delete emuThread;
|
||||||
|
|
||||||
|
Net::UnregisterInstance(instanceID);
|
||||||
|
|
||||||
audioDeInit();
|
audioDeInit();
|
||||||
inputDeInit();
|
inputDeInit();
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
#include "Net.h"
|
#include "Net.h"
|
||||||
#include "FIFO.h"
|
#include "PacketDispatcher.h"
|
||||||
#include "Platform.h"
|
#include "Platform.h"
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
|
|
||||||
@ -35,22 +35,21 @@ using Platform::LogLevel;
|
|||||||
bool Inited = false;
|
bool Inited = false;
|
||||||
bool DirectMode;
|
bool DirectMode;
|
||||||
|
|
||||||
QMutex RXMutex;
|
PacketDispatcher Dispatcher;
|
||||||
RingBuffer<0x10000> RXBuffer;
|
|
||||||
|
|
||||||
|
|
||||||
bool Init()
|
bool Init()
|
||||||
{
|
{
|
||||||
if (Inited) DeInit();
|
if (Inited) DeInit();
|
||||||
|
|
||||||
RXBuffer.Clear();
|
Dispatcher.clear();
|
||||||
|
|
||||||
Config::Table cfg = Config::GetGlobalTable();
|
Config::Table cfg = Config::GetGlobalTable();
|
||||||
DirectMode = cfg.GetBool("LAN.DirectMode");
|
DirectMode = cfg.GetBool("LAN.DirectMode");
|
||||||
|
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
if (DirectMode)
|
if (DirectMode)
|
||||||
ret = Net_PCap::Init();
|
ret = Net_PCap::Init(true);
|
||||||
else
|
else
|
||||||
ret = Net_Slirp::Init();
|
ret = Net_Slirp::Init();
|
||||||
|
|
||||||
@ -71,27 +70,24 @@ void DeInit()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void RXEnqueue(const void* buf, int len)
|
void RegisterInstance(int inst)
|
||||||
{
|
{
|
||||||
int totallen = len + 4;
|
Dispatcher.registerInstance(inst);
|
||||||
|
}
|
||||||
|
|
||||||
RXMutex.lock();
|
void UnregisterInstance(int inst)
|
||||||
|
{
|
||||||
if (!RXBuffer.CanFit(totallen))
|
Dispatcher.unregisterInstance(inst);
|
||||||
{
|
|
||||||
RXMutex.unlock();
|
|
||||||
Log(LogLevel::Warn, "Net: !! NOT ENOUGH SPACE IN RX BUFFER\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 header = (len & 0xFFFF) | (len << 16);
|
|
||||||
RXBuffer.Write(&header, sizeof(u32));
|
|
||||||
RXBuffer.Write(buf, len);
|
|
||||||
RXMutex.unlock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int SendPacket(u8* data, int len)
|
void RXEnqueue(const void* buf, int len)
|
||||||
|
{
|
||||||
|
Dispatcher.sendPacket(nullptr, 0, buf, len, 16, 0xFFFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int SendPacket(u8* data, int len, int inst)
|
||||||
{
|
{
|
||||||
if (DirectMode)
|
if (DirectMode)
|
||||||
return Net_PCap::SendPacket(data, len);
|
return Net_PCap::SendPacket(data, len);
|
||||||
@ -99,15 +95,18 @@ int SendPacket(u8* data, int len)
|
|||||||
return Net_Slirp::SendPacket(data, len);
|
return Net_Slirp::SendPacket(data, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
int RecvPacket(u8* data)
|
int RecvPacket(u8* data, int inst)
|
||||||
{
|
{
|
||||||
if (DirectMode)
|
if (DirectMode)
|
||||||
Net_PCap::RecvCheck();
|
Net_PCap::RecvCheck();
|
||||||
else
|
else
|
||||||
Net_Slirp::RecvCheck();
|
Net_Slirp::RecvCheck();
|
||||||
|
|
||||||
// TODO: check MAC
|
int ret = 0;
|
||||||
// FIFO header | destination MAC | source MAC | frame type
|
if (!Dispatcher.recvPacket(nullptr, nullptr, data, &ret, inst))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -30,10 +30,13 @@ using namespace melonDS;
|
|||||||
bool Init();
|
bool Init();
|
||||||
void DeInit();
|
void DeInit();
|
||||||
|
|
||||||
|
void RegisterInstance(int inst);
|
||||||
|
void UnregisterInstance(int inst);
|
||||||
|
|
||||||
void RXEnqueue(const void* buf, int len);
|
void RXEnqueue(const void* buf, int len);
|
||||||
|
|
||||||
int SendPacket(u8* data, int len);
|
int SendPacket(u8* data, int len, int inst);
|
||||||
int RecvPacket(u8* data);
|
int RecvPacket(u8* data, int inst);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,7 +162,7 @@ bool Init()
|
|||||||
*(u32*)&cfg.vnameserver = htonl(kDNSIP);
|
*(u32*)&cfg.vnameserver = htonl(kDNSIP);
|
||||||
|
|
||||||
Ctx = slirp_new(&cfg, &cb, nullptr);
|
Ctx = slirp_new(&cfg, &cb, nullptr);
|
||||||
|
printf("SLIRP INIT\n");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -373,6 +373,7 @@ void HandleDNSFrame(u8* data, int len)
|
|||||||
|
|
||||||
int SendPacket(u8* data, int len)
|
int SendPacket(u8* data, int len)
|
||||||
{
|
{
|
||||||
|
printf("SLIRP SEND PACKET %p %p %d\n", Ctx, data, len);
|
||||||
if (!Ctx) return 0;
|
if (!Ctx) return 0;
|
||||||
|
|
||||||
if (len > 2048)
|
if (len > 2048)
|
||||||
|
@ -64,16 +64,31 @@ void PacketDispatcher::unregisterInstance(int inst)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PacketDispatcher::clear()
|
||||||
|
{
|
||||||
|
mutex.lock();
|
||||||
|
for (int i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
if (!(instanceMask & (1 << i)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
PacketQueue* queue = packetQueues[i];
|
||||||
|
queue->Clear();
|
||||||
|
}
|
||||||
|
mutex.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void PacketDispatcher::sendPacket(const void* header, int headerlen, const void* data, int datalen, int sender, u16 recv_mask)
|
void PacketDispatcher::sendPacket(const void* header, int headerlen, const void* data, int datalen, int sender, u16 recv_mask)
|
||||||
{
|
{
|
||||||
if (!header) headerlen = 0;
|
if (!header) headerlen = 0;
|
||||||
if (!data) datalen = 0;
|
if (!data) datalen = 0;
|
||||||
if ((!headerlen) && (!datalen)) return;
|
if ((!headerlen) && (!datalen)) return;
|
||||||
if ((sizeof(PacketHeader) + headerlen + datalen) >= 0x8000) return;
|
if ((sizeof(PacketHeader) + headerlen + datalen) >= 0x8000) return;
|
||||||
if (sender < 0 || sender > 15) return;
|
if (sender < 0 || sender > 16) return;
|
||||||
|
|
||||||
recv_mask &= instanceMask;
|
recv_mask &= instanceMask;
|
||||||
recv_mask &= ~(1 << sender);
|
if (sender < 16) recv_mask &= ~(1 << sender);
|
||||||
if (!recv_mask) return;
|
if (!recv_mask) return;
|
||||||
|
|
||||||
PacketHeader phdr;
|
PacketHeader phdr;
|
||||||
@ -82,6 +97,8 @@ void PacketDispatcher::sendPacket(const void* header, int headerlen, const void*
|
|||||||
phdr.headerLength = headerlen;
|
phdr.headerLength = headerlen;
|
||||||
phdr.dataLength = datalen;
|
phdr.dataLength = datalen;
|
||||||
|
|
||||||
|
int totallen = sizeof(phdr) + headerlen + datalen;
|
||||||
|
|
||||||
mutex.lock();
|
mutex.lock();
|
||||||
for (int i = 0; i < 16; i++)
|
for (int i = 0; i < 16; i++)
|
||||||
{
|
{
|
||||||
@ -89,6 +106,15 @@ void PacketDispatcher::sendPacket(const void* header, int headerlen, const void*
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
PacketQueue* queue = packetQueues[i];
|
PacketQueue* queue = packetQueues[i];
|
||||||
|
|
||||||
|
// if we run out of space: discard old packets
|
||||||
|
while (!queue->CanFit(totallen))
|
||||||
|
{
|
||||||
|
PacketHeader tmp;
|
||||||
|
queue->Read(&tmp, sizeof(tmp));
|
||||||
|
queue->Skip(tmp.headerLength + tmp.dataLength);
|
||||||
|
}
|
||||||
|
|
||||||
queue->Write(&phdr, sizeof(phdr));
|
queue->Write(&phdr, sizeof(phdr));
|
||||||
if (headerlen) queue->Write(header, headerlen);
|
if (headerlen) queue->Write(header, headerlen);
|
||||||
if (datalen) queue->Write(data, datalen);
|
if (datalen) queue->Write(data, datalen);
|
||||||
|
@ -34,6 +34,8 @@ public:
|
|||||||
void registerInstance(int inst);
|
void registerInstance(int inst);
|
||||||
void unregisterInstance(int inst);
|
void unregisterInstance(int inst);
|
||||||
|
|
||||||
|
void clear();
|
||||||
|
|
||||||
void sendPacket(const void* header, int headerlen, const void* data, int datalen, int sender, melonDS::u16 recv_mask);
|
void sendPacket(const void* header, int headerlen, const void* data, int datalen, int sender, melonDS::u16 recv_mask);
|
||||||
bool recvPacket(void* header, int* headerlen, void* data, int* datalen, int receiver);
|
bool recvPacket(void* header, int* headerlen, void* data, int* datalen, int receiver);
|
||||||
|
|
||||||
|
@ -29,7 +29,6 @@
|
|||||||
#include <QThread>
|
#include <QThread>
|
||||||
#include <QSemaphore>
|
#include <QSemaphore>
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
//#include <QOpenGLContext>
|
|
||||||
#include <QSharedMemory>
|
#include <QSharedMemory>
|
||||||
#include <QTemporaryFile>
|
#include <QTemporaryFile>
|
||||||
#include <SDL_loadso.h>
|
#include <SDL_loadso.h>
|
||||||
@ -38,8 +37,7 @@
|
|||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "CameraManager.h"
|
#include "CameraManager.h"
|
||||||
#include "Net_Slirp.h"
|
#include "Net.h"
|
||||||
#include "Net_PCap.h"
|
|
||||||
#include "LocalMP.h"
|
#include "LocalMP.h"
|
||||||
#include "SPI_Firmware.h"
|
#include "SPI_Firmware.h"
|
||||||
|
|
||||||
@ -542,6 +540,8 @@ int LAN_SendPacket(u8* data, int len, void* userdata)
|
|||||||
return LAN_PCap::SendPacket(data, len);
|
return LAN_PCap::SendPacket(data, len);
|
||||||
else
|
else
|
||||||
return LAN_Socket::SendPacket(data, len);*/
|
return LAN_Socket::SendPacket(data, len);*/
|
||||||
|
int inst = ((EmuInstance*)userdata)->getInstanceID();
|
||||||
|
Net::SendPacket(data, len, inst);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -551,7 +551,8 @@ int LAN_RecvPacket(u8* data, void* userdata)
|
|||||||
return LAN_PCap::RecvPacket(data);
|
return LAN_PCap::RecvPacket(data);
|
||||||
else
|
else
|
||||||
return LAN_Socket::RecvPacket(data);*/
|
return LAN_Socket::RecvPacket(data);*/
|
||||||
return 0;
|
int inst = ((EmuInstance*)userdata)->getInstanceID();
|
||||||
|
return Net::RecvPacket(data, inst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ WifiSettingsDialog::WifiSettingsDialog(QWidget* parent) : QDialog(parent), ui(ne
|
|||||||
emuInstance = ((MainWindow*)parent)->getEmuInstance();
|
emuInstance = ((MainWindow*)parent)->getEmuInstance();
|
||||||
auto& cfg = emuInstance->getGlobalConfig();
|
auto& cfg = emuInstance->getGlobalConfig();
|
||||||
|
|
||||||
haspcap = LAN_PCap::Init(false);
|
haspcap = Net_PCap::Init(false);
|
||||||
|
|
||||||
ui->rbDirectMode->setText("Direct mode (requires " PCAP_NAME " and ethernet connection)");
|
ui->rbDirectMode->setText("Direct mode (requires " PCAP_NAME " and ethernet connection)");
|
||||||
|
|
||||||
@ -60,9 +60,9 @@ WifiSettingsDialog::WifiSettingsDialog(QWidget* parent) : QDialog(parent), ui(ne
|
|||||||
ui->lblAdapterIP->setText("(none)");
|
ui->lblAdapterIP->setText("(none)");
|
||||||
|
|
||||||
int sel = 0;
|
int sel = 0;
|
||||||
for (int i = 0; i < LAN_PCap::NumAdapters; i++)
|
for (int i = 0; i < Net_PCap::NumAdapters; i++)
|
||||||
{
|
{
|
||||||
LAN_PCap::AdapterData* adapter = &LAN_PCap::Adapters[i];
|
Net_PCap::AdapterData* adapter = &Net_PCap::Adapters[i];
|
||||||
|
|
||||||
ui->cbxDirectAdapter->addItem(QString(adapter->FriendlyName));
|
ui->cbxDirectAdapter->addItem(QString(adapter->FriendlyName));
|
||||||
|
|
||||||
@ -96,14 +96,14 @@ void WifiSettingsDialog::done(int r)
|
|||||||
cfg.SetBool("LAN.DirectMode", ui->rbDirectMode->isChecked());
|
cfg.SetBool("LAN.DirectMode", ui->rbDirectMode->isChecked());
|
||||||
|
|
||||||
int sel = ui->cbxDirectAdapter->currentIndex();
|
int sel = ui->cbxDirectAdapter->currentIndex();
|
||||||
if (sel < 0 || sel >= LAN_PCap::NumAdapters) sel = 0;
|
if (sel < 0 || sel >= Net_PCap::NumAdapters) sel = 0;
|
||||||
if (LAN_PCap::NumAdapters < 1)
|
if (Net_PCap::NumAdapters < 1)
|
||||||
{
|
{
|
||||||
cfg.SetString("LAN.Device", "");
|
cfg.SetString("LAN.Device", "");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cfg.SetString("LAN.Device", LAN_PCap::Adapters[sel].DeviceName);
|
cfg.SetString("LAN.Device", Net_PCap::Adapters[sel].DeviceName);
|
||||||
}
|
}
|
||||||
|
|
||||||
Config::Save();
|
Config::Save();
|
||||||
@ -128,10 +128,10 @@ void WifiSettingsDialog::on_cbxDirectAdapter_currentIndexChanged(int sel)
|
|||||||
{
|
{
|
||||||
if (!haspcap) return;
|
if (!haspcap) return;
|
||||||
|
|
||||||
if (sel < 0 || sel >= LAN_PCap::NumAdapters) return;
|
if (sel < 0 || sel >= Net_PCap::NumAdapters) return;
|
||||||
if (LAN_PCap::NumAdapters < 1) return;
|
if (Net_PCap::NumAdapters < 1) return;
|
||||||
|
|
||||||
LAN_PCap::AdapterData* adapter = &LAN_PCap::Adapters[sel];
|
Net_PCap::AdapterData* adapter = &Net_PCap::Adapters[sel];
|
||||||
char tmp[64];
|
char tmp[64];
|
||||||
|
|
||||||
sprintf(tmp, "%02X:%02X:%02X:%02X:%02X:%02X",
|
sprintf(tmp, "%02X:%02X:%02X:%02X:%02X:%02X",
|
||||||
|
@ -75,6 +75,7 @@
|
|||||||
#include "ArchiveUtil.h"
|
#include "ArchiveUtil.h"
|
||||||
#include "CameraManager.h"
|
#include "CameraManager.h"
|
||||||
#include "LocalMP.h"
|
#include "LocalMP.h"
|
||||||
|
#include "Net.h"
|
||||||
|
|
||||||
#include "CLI.h"
|
#include "CLI.h"
|
||||||
|
|
||||||
@ -268,6 +269,7 @@ int main(int argc, char** argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
LocalMP::Init();
|
LocalMP::Init();
|
||||||
|
Net::Init();
|
||||||
|
|
||||||
/* mainWindow = new MainWindow();
|
/* mainWindow = new MainWindow();
|
||||||
if (options->fullscreen)
|
if (options->fullscreen)
|
||||||
@ -322,6 +324,7 @@ int main(int argc, char** argv)
|
|||||||
deleteAllEmuInstances();
|
deleteAllEmuInstances();
|
||||||
|
|
||||||
LocalMP::DeInit();
|
LocalMP::DeInit();
|
||||||
|
Net::DeInit();
|
||||||
|
|
||||||
//AudioInOut::DeInit();
|
//AudioInOut::DeInit();
|
||||||
delete camManager[0];
|
delete camManager[0];
|
||||||
|
Reference in New Issue
Block a user