From 4ec2d109f75aaaf732abce96a55aeb4f603f787d Mon Sep 17 00:00:00 2001 From: StapleButter Date: Mon, 18 Dec 2017 19:31:26 +0100 Subject: [PATCH] wifi: more shit --- src/Platform.h | 6 ++ src/Wifi.cpp | 1 + src/libui_sdl/Platform.cpp | 122 +++++++++++++++++++++++++++++++------ 3 files changed, 111 insertions(+), 18 deletions(-) diff --git a/src/Platform.h b/src/Platform.h index eeb6f9a7..7fb67937 100644 --- a/src/Platform.h +++ b/src/Platform.h @@ -36,13 +36,19 @@ void Semaphore_Reset(void* sema); void Semaphore_Wait(void* sema); void Semaphore_Post(void* sema); +// local multiplayer comm interface +// packet type: DS-style TX header (12 bytes) + original 802.11 frame bool MP_Init(); void MP_DeInit(); int MP_SendPacket(u8* data, int len); int MP_RecvPacket(u8* data, bool block); +// LAN comm interface +// packet type: Ethernet (802.3) bool LAN_Init(); void LAN_DeInit(); +int LAN_SendPacket(u8* data, int len); +int LAN_RecvPacket(u8* data); } diff --git a/src/Wifi.cpp b/src/Wifi.cpp index eac32d25..c5039d14 100644 --- a/src/Wifi.cpp +++ b/src/Wifi.cpp @@ -767,6 +767,7 @@ bool CheckRX(bool block) for (;;) { int rxlen = Platform::MP_RecvPacket(RXBuffer, block); + //if (rxlen == 0) rxlen = Platform::LAN_RecvPacket(RXBuffer); if (rxlen == 0) return false; if (rxlen < 12+24) continue; diff --git a/src/libui_sdl/Platform.cpp b/src/libui_sdl/Platform.cpp index 22bdbb61..d835af1b 100644 --- a/src/libui_sdl/Platform.cpp +++ b/src/libui_sdl/Platform.cpp @@ -29,7 +29,6 @@ #include #define socket_t SOCKET #define sockaddr_t SOCKADDR - #define pcap_dev_name description #else #include #include @@ -39,7 +38,6 @@ #define socket_t int #define sockaddr_t struct sockaddr #define closesocket close - #define pcap_dev_name name #endif #ifndef INVALID_SOCKET @@ -47,6 +45,20 @@ #endif +#define DECL_PCAP_FUNC(ret, name, args, args2) \ + typedef ret (*type_##name) args; \ + type_##name ptr_##name = NULL; \ + ret name args { return ptr_##name args2; } + +DECL_PCAP_FUNC(int, pcap_findalldevs, (pcap_if_t** alldevs, char* errbuf), (alldevs,errbuf)) +DECL_PCAP_FUNC(void, pcap_freealldevs, (pcap_if_t* alldevs), (alldevs)) +DECL_PCAP_FUNC(pcap_t*, pcap_open_live, (const char* src, int snaplen, int flags, int readtimeout, char* errbuf), (src,snaplen,flags,readtimeout,errbuf)) +DECL_PCAP_FUNC(void, pcap_close, (pcap_t* dev), (dev)) +DECL_PCAP_FUNC(int, pcap_setnonblock, (pcap_t* dev, int nonblock, char* errbuf), (dev,nonblock,errbuf)) +DECL_PCAP_FUNC(int, pcap_sendpacket, (pcap_t* dev, const u_char* data, int len), (dev,data,len)) +DECL_PCAP_FUNC(int, pcap_dispatch, (pcap_t* dev, int num, pcap_handler callback, u_char* data), (dev,num,callback,data)) + + void Stop(bool internal); @@ -86,20 +98,12 @@ const char* PCapLibNames[] = NULL }; -void* PCapLib; +void* PCapLib = NULL; +pcap_t* PCapAdapter = NULL; -#define DECL_PCAP_FUNC(ret, name, args, args2) \ - typedef ret (*type_##name) args; \ - type_##name ptr_##name = NULL; \ - ret name args { return ptr_##name args2; } - -DECL_PCAP_FUNC(int, pcap_findalldevs, (pcap_if_t** alldevs, char* errbuf), (alldevs,errbuf)) -DECL_PCAP_FUNC(void, pcap_freealldevs, (pcap_if_t* alldevs), (alldevs)) -DECL_PCAP_FUNC(pcap_t*, pcap_open_live, (const char* src, int snaplen, int flags, int readtimeout, char* errbuf), (src,snaplen,flags,readtimeout,errbuf)) -DECL_PCAP_FUNC(void, pcap_close, (pcap_t* dev), (dev)) -DECL_PCAP_FUNC(int, pcap_setnonblock, (pcap_t* dev, int nonblock, char* errbuf), (dev,nonblock,errbuf)) -DECL_PCAP_FUNC(int, pcap_sendpacket, (pcap_t* dev, const u_char* data, int len), (dev,data,len)) -DECL_PCAP_FUNC(int, pcap_dispatch, (pcap_t* dev, int num, pcap_handler callback, u_char* data), (dev,num,callback,data)) +u8 PCapPacketBuffer[2048]; +int PCapPacketLen; +int PCapRXNum; void StopEmu() @@ -164,7 +168,7 @@ bool MP_Init() { return false; } -#endif // __WXMSW__ +#endif // __WIN32__ MPSocket = socket(AF_INET, SOCK_DGRAM, 0); if (MPSocket < 0) @@ -214,7 +218,7 @@ void MP_DeInit() #ifdef __WIN32__ WSACleanup(); -#endif // __WXMSW__ +#endif // __WIN32__ } int MP_SendPacket(u8* data, int len) @@ -308,6 +312,9 @@ bool TryLoadPCap(void* lib) bool LAN_Init() { PCapLib = NULL; + PCapAdapter = NULL; + PCapPacketLen = 0; + PCapRXNum = 0; for (int i = 0; PCapLibNames[i]; i++) { @@ -331,7 +338,38 @@ bool LAN_Init() return false; } - // + char errbuf[PCAP_ERRBUF_SIZE]; + int ret; + + pcap_if_t* alldevs; + ret = pcap_findalldevs(&alldevs, errbuf); + if (ret < 0 || alldevs == NULL) + { + printf("PCap: no devices available\n"); + return false; + } +/*while (alldevs){ + printf("picking dev %08X %s | %s\n", alldevs->flags, alldevs->name, alldevs->description); + alldevs = alldevs->next;}*/ + // temp hack + // TODO: ADAPTER SELECTOR!! + pcap_if_t* dev = alldevs->next; + + PCapAdapter = pcap_open_live(dev->name, 2048, PCAP_OPENFLAG_PROMISCUOUS, 1, errbuf); + if (!PCapAdapter) + { + printf("PCap: failed to open adapter\n"); + return false; + } + + pcap_freealldevs(alldevs); + + if (pcap_setnonblock(PCapAdapter, 1, errbuf) < 0) + { + printf("PCap: failed to set nonblocking mode\n"); + pcap_close(PCapAdapter); PCapAdapter = NULL; + return false; + } return true; } @@ -340,10 +378,58 @@ void LAN_DeInit() { if (PCapLib) { + if (PCapAdapter) + { + pcap_close(PCapAdapter); + PCapAdapter = NULL; + } + SDL_UnloadObject(PCapLib); PCapLib = NULL; } } +int LAN_SendPacket(u8* data, int len) +{ + if (PCapAdapter == NULL) + return 0; + + if (len > 2048) + { + printf("LAN_SendPacket: error: packet too long (%d)\n", len); + return 0; + } + + pcap_sendpacket(PCapAdapter, data, len); + // TODO: check success + return len; +} + +void LAN_RXCallback(u_char* blarg, const struct pcap_pkthdr* header, const u_char* data) +{ + PCapPacketLen = header->len; + memcpy(PCapPacketBuffer, data, PCapPacketLen); + PCapRXNum = 1; + + printf("received shit\n"); +} + +int LAN_RecvPacket(u8* data) +{ + if (PCapAdapter == NULL) + return 0; + + int ret = 0; + if (PCapRXNum > 0) + { + memcpy(data, PCapPacketBuffer, PCapPacketLen); + ret = PCapPacketLen; + PCapRXNum = 0; + } + + pcap_dispatch(PCapAdapter, 1, LAN_RXCallback, NULL); + return ret; +} + }