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);  }  |