send shit.

into the void for now.
This commit is contained in:
Arisotura
2019-03-06 17:07:07 +01:00
parent 349322b94c
commit 012a04021c

View File

@ -661,18 +661,21 @@ void HandleTCPFrame(u8* data, int len)
u8* ipheader = &data[0xE]; u8* ipheader = &data[0xE];
u8* tcpheader = &data[0x22]; u8* tcpheader = &data[0x22];
u32 tcplen = ntohs(*(u16*)&ipheader[2]) - 0x14;
u16 srcport = ntohs(*(u16*)&tcpheader[0]); u16 srcport = ntohs(*(u16*)&tcpheader[0]);
u16 dstport = ntohs(*(u16*)&tcpheader[2]); u16 dstport = ntohs(*(u16*)&tcpheader[2]);
u16 flags = ntohs(*(u16*)&tcpheader[12]); u16 flags = ntohs(*(u16*)&tcpheader[12]);
u32 tcpheaderlen = 4 * (flags >> 12);
u32 tcplen = ntohs(*(u16*)&ipheader[2]) - 0x14;
u32 tcpdatalen = tcplen - tcpheaderlen;
if (flags & 0x002) // SYN if (flags & 0x002) // SYN
{ {
int sockid = -1; int sockid = -1;
TCPSocket* sock;
for (int i = 0; i < (sizeof(TCPSocketList)/sizeof(TCPSocket)); i++) for (int i = 0; i < (sizeof(TCPSocketList)/sizeof(TCPSocket)); i++)
{ {
TCPSocket* sock = &TCPSocketList[i]; sock = &TCPSocketList[i];
if (sock->Status == 1 && !memcmp(&sock->DestIP, &ipheader[16], 4) && if (sock->Status == 1 && !memcmp(&sock->DestIP, &ipheader[16], 4) &&
sock->SourcePort == srcport && sock->DestPort == dstport) sock->SourcePort == srcport && sock->DestPort == dstport)
{ {
@ -686,7 +689,7 @@ void HandleTCPFrame(u8* data, int len)
{ {
for (int i = 0; i < (sizeof(TCPSocketList)/sizeof(TCPSocket)); i++) for (int i = 0; i < (sizeof(TCPSocketList)/sizeof(TCPSocket)); i++)
{ {
TCPSocket* sock = &TCPSocketList[i]; sock = &TCPSocketList[i];
if (sock->Status == 0) if (sock->Status == 0)
{ {
sockid = i; sockid = i;
@ -707,7 +710,6 @@ void HandleTCPFrame(u8* data, int len)
dstport, srcport); dstport, srcport);
// keep track of it // keep track of it
TCPSocket* sock = &TCPSocketList[sockid];
sock->Status = 1; sock->Status = 1;
memcpy(sock->DestIP, &ipheader[16], 4); memcpy(sock->DestIP, &ipheader[16], 4);
sock->DestPort = dstport; sock->DestPort = dstport;
@ -738,9 +740,10 @@ void HandleTCPFrame(u8* data, int len)
else else
{ {
int sockid = -1; int sockid = -1;
TCPSocket* sock;
for (int i = 0; i < (sizeof(TCPSocketList)/sizeof(TCPSocket)); i++) for (int i = 0; i < (sizeof(TCPSocketList)/sizeof(TCPSocket)); i++)
{ {
TCPSocket* sock = &TCPSocketList[i]; sock = &TCPSocketList[i];
if (sock->Status == 1 && !memcmp(&sock->DestIP, &ipheader[16], 4) && if (sock->Status == 1 && !memcmp(&sock->DestIP, &ipheader[16], 4) &&
sock->SourcePort == srcport && sock->DestPort == dstport) sock->SourcePort == srcport && sock->DestPort == dstport)
{ {
@ -755,30 +758,22 @@ void HandleTCPFrame(u8* data, int len)
return; return;
} }
// send data over the socket
if (tcpdatalen > 0)
{
u8* tcpdata = &tcpheader[tcpheaderlen];
printf("TCP: forwarding %d bytes\n", tcpdatalen);
send(sock->Backend, (char*)tcpdata, tcpdatalen, 0);
}
if (flags & 0x001) // FIN if (flags & 0x001) // FIN
{ {
// TODO: cleverer termination? // TODO: cleverer termination?
// also timeout etc // also timeout etc
TCPSocketList[sockid].Status = 0; sock->Status = 0;
} }
} }
// TCP checksum
/*tmp = 0;
*(u16*)&tcpheader[16] = 0;
tmp += ntohs(*(u16*)&ipheader[12]);
tmp += ntohs(*(u16*)&ipheader[14]);
tmp += ntohs(*(u16*)&ipheader[16]);
tmp += ntohs(*(u16*)&ipheader[18]);
tmp += ntohs(0x0600);
tmp += tcplen;
for (u8* i = tcpheader; i < &tcpheader[tcplen]; i += 2)
tmp += ntohs(*(u16*)i);
while (tmp >> 16)
tmp = (tmp & 0xFFFF) + (tmp >> 16);
tmp ^= 0xFFFF;
if (tmp == 0) tmp = 0xFFFF;
*(u16*)&tcpheader[16] = htons(tmp);*/
} }
void HandleARPFrame(u8* data, int len) void HandleARPFrame(u8* data, int len)