aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorArisotura <thetotalworm@gmail.com>2019-02-21 03:44:22 +0100
committerArisotura <thetotalworm@gmail.com>2019-02-21 03:44:22 +0100
commit0550d228335571220705c5dfbecb44595232058a (patch)
tree88ad08c5eae721948f9219839892c34b1e237d3b /src
parentf9822cdd44636d01112f1f7bc3774487ba051995 (diff)
hook LAN shito. open proper pcap device. etc
Diffstat (limited to 'src')
-rw-r--r--src/libui_sdl/LAN.cpp79
-rw-r--r--src/libui_sdl/LAN.h3
-rw-r--r--src/libui_sdl/Platform.cpp45
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);
}