make melonDS build again

This commit is contained in:
Arisotura 2019-03-04 23:17:03 +01:00
parent 720a5fbea5
commit 3f82c7dcc1
3 changed files with 46 additions and 61 deletions

View File

@ -25,7 +25,8 @@
#include "../types.h" #include "../types.h"
#include "../Config.h" #include "../Config.h"
#include "LAN.h" #include "LAN_Socket.h"
#include "LAN_PCap.h"
#include "DlgWifiSettings.h" #include "DlgWifiSettings.h"
@ -38,6 +39,8 @@ namespace DlgWifiSettings
bool opened; bool opened;
uiWindow* win; uiWindow* win;
bool haspcap;
uiCheckbox* cbBindAnyAddr; uiCheckbox* cbBindAnyAddr;
uiCombobox* cmAdapterList; uiCombobox* cmAdapterList;
@ -52,10 +55,10 @@ uiLabel* lbAdapterDNS1;
void UpdateAdapterInfo() void UpdateAdapterInfo()
{ {
int sel = uiComboboxSelected(cmAdapterList); int sel = uiComboboxSelected(cmAdapterList);
if (sel < 0 || sel >= LAN::NumAdapters) return; if (sel < 0 || sel >= LAN_PCap::NumAdapters) return;
if (LAN::NumAdapters < 1) return; if (LAN_PCap::NumAdapters < 1) return;
LAN::AdapterData* adapter = &LAN::Adapters[sel]; LAN_PCap::AdapterData* adapter = &LAN_PCap::Adapters[sel];
char tmp[64]; char tmp[64];
sprintf(tmp, "MAC: %02X:%02X:%02X:%02X:%02X:%02X", sprintf(tmp, "MAC: %02X:%02X:%02X:%02X:%02X:%02X",
@ -102,14 +105,14 @@ void OnOk(uiButton* btn, void* blarg)
Config::DirectLAN = uiCheckboxChecked(cbDirectLAN); Config::DirectLAN = uiCheckboxChecked(cbDirectLAN);
int sel = uiComboboxSelected(cmAdapterList); int sel = uiComboboxSelected(cmAdapterList);
if (sel < 0 || sel >= LAN::NumAdapters) sel = 0; if (sel < 0 || sel >= LAN_PCap::NumAdapters) sel = 0;
if (LAN::NumAdapters < 1) if (LAN_PCap::NumAdapters < 1)
{ {
Config::LANDevice[0] = '\0'; Config::LANDevice[0] = '\0';
} }
else else
{ {
strncpy(Config::LANDevice, LAN::Adapters[sel].DeviceName, 127); strncpy(Config::LANDevice, LAN_PCap::Adapters[sel].DeviceName, 127);
Config::LANDevice[127] = '\0'; Config::LANDevice[127] = '\0';
} }
@ -129,7 +132,8 @@ void Open()
return; return;
} }
LAN::Init(); LAN_Socket::Init();
haspcap = LAN_PCap::Init();
opened = true; opened = true;
win = uiNewWindow("Wifi settings - melonDS", 400, 100, 0, 0, 0); win = uiNewWindow("Wifi settings - melonDS", 400, 100, 0, 0, 0);
@ -202,9 +206,9 @@ void Open()
uiCheckboxSetChecked(cbBindAnyAddr, Config::SocketBindAnyAddr); uiCheckboxSetChecked(cbBindAnyAddr, Config::SocketBindAnyAddr);
int sel = 0; int sel = 0;
for (int i = 0; i < LAN::NumAdapters; i++) for (int i = 0; i < LAN_PCap::NumAdapters; i++)
{ {
LAN::AdapterData* adapter = &LAN::Adapters[i]; LAN_PCap::AdapterData* adapter = &LAN_PCap::Adapters[i];
uiComboboxAppend(cmAdapterList, adapter->FriendlyName); uiComboboxAppend(cmAdapterList, adapter->FriendlyName);

View File

@ -303,7 +303,7 @@ void DeInit()
void RXCallback(u_char* blarg, const struct pcap_pkthdr* header, const u_char* data) void RXCallback(u_char* blarg, const struct pcap_pkthdr* header, const u_char* data)
{ {
while (PCapRXNum > 0); while (RXNum > 0);
if (header->len > 2048-64) return; if (header->len > 2048-64) return;

View File

@ -96,13 +96,13 @@ void DeInit()
// //
} }
bool HandleIncomingIPFrame(u8* data, int len) /*bool HandleIncomingIPFrame(u8* data, int len)
{ {
const u32 serverip = 0x0A404001; const u32 serverip = 0x0A404001;
const u32 clientip = 0x0A404010; const u32 clientip = 0x0A404010;
if (memcmp(&data[0x1E], PCapAdapterData->IP_v4, 4)) //if (memcmp(&data[0x1E], PCapAdapterData->IP_v4, 4))
return false; // return false;
u8 protocol = data[0x17]; u8 protocol = data[0x17];
@ -193,9 +193,9 @@ bool HandleIncomingIPFrame(u8* data, int len)
} }
return false; return false;
} }*/
void RXCallback(u_char* blarg, const struct pcap_pkthdr* header, const u_char* data) /*void RXCallback(u_char* blarg, const struct pcap_pkthdr* header, const u_char* data)
{ {
while (PCapRXNum > 0); while (PCapRXNum > 0);
@ -215,8 +215,8 @@ void RXCallback(u_char* blarg, const struct pcap_pkthdr* header, const u_char* d
PCapRXNum = 0; PCapRXNum = 0;
} }
} }
} }*/
u32 zarp=0;
bool HandleDHCPFrame(u8* data, int len) bool HandleDHCPFrame(u8* data, int len)
{ {
const u32 serverip = 0x0A404001; const u32 serverip = 0x0A404001;
@ -225,7 +225,7 @@ bool HandleDHCPFrame(u8* data, int len)
u8 type = 0xFF; u8 type = 0xFF;
u32 transid = *(u32*)&data[0x2E]; u32 transid = *(u32*)&data[0x2E];
zarp=transid;
u8* options = &data[0x11A]; u8* options = &data[0x11A];
for (;;) for (;;)
{ {
@ -322,7 +322,7 @@ zarp=transid;
*out++ = 54; *out++ = 4; *out++ = 54; *out++ = 4;
*(u32*)out = htonl(serverip); out += 4; // DHCP server *(u32*)out = htonl(serverip); out += 4; // DHCP server
u8 numdns = 0; /*u8 numdns = 0;
for (int i = 0; i < 8; i++) for (int i = 0; i < 8; i++)
{ {
if (*(u32*)&PCapAdapterData->DNS[i][0] != 0) if (*(u32*)&PCapAdapterData->DNS[i][0] != 0)
@ -336,7 +336,9 @@ zarp=transid;
{ {
*(u32*)out = dnsip; out += 4; *(u32*)out = dnsip; out += 4;
} }
} }*/
*out++ = 6; *out++ = 4;
*(u32*)out = htonl(0x08080808); out += 4; // DNS (hax)
*out++ = 0xFF; *out++ = 0xFF;
memset(out, 0, 20); out += 20; memset(out, 0, 20); out += 20;
@ -378,13 +380,9 @@ zarp=transid;
// that being said, this will only happen during DHCP setup, so probably // that being said, this will only happen during DHCP setup, so probably
// not a big deal // not a big deal
PCapPacketLen = framelen; PacketLen = framelen;
memcpy(PCapPacketBuffer, resp, PCapPacketLen); memcpy(PacketBuffer, resp, PacketLen);
PCapRXNum = 1; RXNum = 1;
// DEBUG!!
//pcap_sendpacket(PCapAdapter, data, len);
//pcap_sendpacket(PCapAdapter, resp, framelen);
return true; return true;
} }
@ -397,9 +395,6 @@ bool HandleIPFrame(u8* data, int len)
const u32 serverip = 0x0A404001; const u32 serverip = 0x0A404001;
const u32 clientip = 0x0A404010; const u32 clientip = 0x0A404010;
// debug
//pcap_sendpacket(PCapAdapter, data, len);
u8 protocol = data[0x17]; u8 protocol = data[0x17];
// any kind of IPv4 frame that isn't DHCP // any kind of IPv4 frame that isn't DHCP
@ -410,10 +405,10 @@ bool HandleIPFrame(u8* data, int len)
// destination MAC set to host MAC // destination MAC set to host MAC
// source MAC set to melonRouter MAC // source MAC set to melonRouter MAC
memcpy(&data[0], &PCapAdapterData->DHCP_MAC[0], 6); //memcpy(&data[0], &PCapAdapterData->DHCP_MAC[0], 6);
memcpy(&data[6], &PCapAdapterData->MAC[0], 6); //memcpy(&data[6], &PCapAdapterData->MAC[0], 6);
*(u32*)&data[0x1A] = *(u32*)&PCapAdapterData->IP_v4[0]; //*(u32*)&data[0x1A] = *(u32*)&PCapAdapterData->IP_v4[0];
u8* ipheader = &data[0xE]; u8* ipheader = &data[0xE];
u8* protoheader = &data[0x22]; u8* protoheader = &data[0x22];
@ -600,13 +595,9 @@ bool HandleARPFrame(u8* data, int len)
// that being said, this will only happen during DHCP setup, so probably // that being said, this will only happen during DHCP setup, so probably
// not a big deal // not a big deal
PCapPacketLen = framelen; PacketLen = framelen;
memcpy(PCapPacketBuffer, resp, PCapPacketLen); memcpy(PacketBuffer, resp, PacketLen);
PCapRXNum = 1; RXNum = 1;
// also broadcast them to the network
pcap_sendpacket(PCapAdapter, data, len);
pcap_sendpacket(PCapAdapter, resp, framelen);
return true; return true;
} }
@ -632,12 +623,12 @@ bool HandlePacket(u8* data, int len)
} }
} }
printf("LANMAGIC: IP frame, doing NAT\n"); printf("LANMAGIC: IP packet\n");
return HandleIPFrame(data, len); return HandleIPFrame(data, len);
} }
else if (ethertype == 0x0806) // ARP else if (ethertype == 0x0806) // ARP
{ {
printf("LANMAGIC: ARP\n"); printf("LANMAGIC: ARP packet\n");
return HandleARPFrame(data, len); return HandleARPFrame(data, len);
} }
@ -646,40 +637,30 @@ bool HandlePacket(u8* data, int len)
int SendPacket(u8* data, int len) int SendPacket(u8* data, int len)
{ {
if (PCapAdapter == NULL)
return 0;
if (len > 2048) if (len > 2048)
{ {
printf("LAN_SendPacket: error: packet too long (%d)\n", len); printf("LAN_SendPacket: error: packet too long (%d)\n", len);
return 0; return 0;
} }
if (!Config::DirectLAN) // TODO: blarg
{ if (HandlePacket(data, len))
if (HandlePacket(data, len)) return len;
return len;
}
pcap_sendpacket(PCapAdapter, data, len);
// TODO: check success
return len; return len;
} }
int RecvPacket(u8* data) int RecvPacket(u8* data)
{ {
if (PCapAdapter == NULL)
return 0;
int ret = 0; int ret = 0;
if (PCapRXNum > 0) if (RXNum > 0)
{ {
memcpy(data, PCapPacketBuffer, PCapPacketLen); memcpy(data, PacketBuffer, PacketLen);
ret = PCapPacketLen; ret = PacketLen;
PCapRXNum = 0; RXNum = 0;
} }
pcap_dispatch(PCapAdapter, 1, RXCallback, NULL); // TODO: check sockets
return ret; return ret;
} }