diff options
author | Arisotura <thetotalworm@gmail.com> | 2019-02-21 03:44:22 +0100 |
---|---|---|
committer | Arisotura <thetotalworm@gmail.com> | 2019-02-21 03:44:22 +0100 |
commit | 0550d228335571220705c5dfbecb44595232058a (patch) | |
tree | 88ad08c5eae721948f9219839892c34b1e237d3b /src | |
parent | f9822cdd44636d01112f1f7bc3774487ba051995 (diff) |
hook LAN shito. open proper pcap device. etc
Diffstat (limited to 'src')
-rw-r--r-- | src/libui_sdl/LAN.cpp | 79 | ||||
-rw-r--r-- | src/libui_sdl/LAN.h | 3 | ||||
-rw-r--r-- | src/libui_sdl/Platform.cpp | 45 |
3 files changed, 75 insertions, 52 deletions
diff --git a/src/libui_sdl/LAN.cpp b/src/libui_sdl/LAN.cpp index 2021b3d..da352df 100644 --- a/src/libui_sdl/LAN.cpp +++ b/src/libui_sdl/LAN.cpp @@ -24,6 +24,7 @@ #include <SDL2/SDL.h> #include <pcap/pcap.h> #include "LAN.h" +#include "../Config.h" #ifdef __WIN32__ #include <iphlpapi.h> @@ -243,23 +244,28 @@ bool Init() #endif // __WIN32__ - printf("devices: %d\n", NumAdapters); + // open pcap device + dev = (pcap_if_t*)Adapters[0].Internal; for (int i = 0; i < NumAdapters; i++) { - AdapterData* zog = &Adapters[i]; - - printf("%s:\n", ((pcap_if_t*)zog->Internal)->name); + if (!strncmp(Adapters[i].DeviceName, Config::LANDevice, 128)) + dev = (pcap_if_t*)Adapters[i].Internal; + } - printf("* %s\n", zog->FriendlyName); - printf("* %s\n", zog->Description); + PCapAdapter = pcap_open_live(dev->name, 2048, PCAP_OPENFLAG_PROMISCUOUS, 1, errbuf); + if (!PCapAdapter) + { + printf("PCap: failed to open adapter\n"); + return false; + } - printf("* "); for (int j = 0; j < 6; j++) printf("%02X:", zog->MAC[j]); printf("\n"); - printf("* "); for (int j = 0; j < 4; j++) printf("%d.", zog->IP_v4[j]); printf("\n"); + pcap_freealldevs(alldevs); - for (int k = 0; k < 8; k++) - { - printf("* "); for (int j = 0; j < 4; j++) printf("%d.", zog->DNS[k][j]); printf("\n"); - } + if (pcap_setnonblock(PCapAdapter, 1, errbuf) < 0) + { + printf("PCap: failed to set nonblocking mode\n"); + pcap_close(PCapAdapter); PCapAdapter = NULL; + return false; } return true; @@ -280,4 +286,53 @@ void DeInit() } } +void RXCallback(u_char* blarg, const struct pcap_pkthdr* header, const u_char* data) +{ + while (PCapRXNum > 0); + + if (header->len > 2048-64) return; + + PCapPacketLen = header->len; + memcpy(PCapPacketBuffer, data, PCapPacketLen); + PCapRXNum = 1; +} + +int 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; + } + + if (!Config::DirectLAN) + { + // TODO! + } + + pcap_sendpacket(PCapAdapter, data, len); + // TODO: check success + return len; +} + +int 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, RXCallback, NULL); + return ret; +} + } diff --git a/src/libui_sdl/LAN.h b/src/libui_sdl/LAN.h index 47e59c9..8021b31 100644 --- a/src/libui_sdl/LAN.h +++ b/src/libui_sdl/LAN.h @@ -45,6 +45,9 @@ extern int NumAdapters; bool Init(); void DeInit(); +int SendPacket(u8* data, int len); +int RecvPacket(u8* data); + } #endif // LAN_H diff --git a/src/libui_sdl/Platform.cpp b/src/libui_sdl/Platform.cpp index 4400357..5cbb142 100644 --- a/src/libui_sdl/Platform.cpp +++ b/src/libui_sdl/Platform.cpp @@ -22,6 +22,7 @@ #include <SDL2/SDL.h> #include "../Platform.h" #include "../Config.h" +#include "LAN.h" #ifdef __WIN32__ #include <winsock2.h> @@ -260,59 +261,23 @@ int MP_RecvPacket(u8* data, bool block) bool LAN_Init() { - // welp + if (!LAN::Init()) return false; return true; } void LAN_DeInit() { - // + LAN::DeInit(); } 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;*/ - return len; + return LAN::SendPacket(data, len); } -/*void LAN_RXCallback(u_char* blarg, const struct pcap_pkthdr* header, const u_char* data) -{ - while (PCapRXNum > 0); - - if (header->len > 2048-64) return; - - PCapPacketLen = header->len; - memcpy(PCapPacketBuffer, data, PCapPacketLen); - PCapRXNum = 1; -}*/ - 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;*/ - return 0; + return LAN::RecvPacket(data); } |