fix TCP checksum for odd lengths

This commit is contained in:
Arisotura 2019-03-09 02:04:01 +01:00
parent cde1963e63
commit 7d2b3bbf76
1 changed files with 5 additions and 4 deletions

View File

@ -176,8 +176,10 @@ void FinishTCPFrame(u8* data, int len)
tmp += ntohs(*(u16*)&ipheader[18]); tmp += ntohs(*(u16*)&ipheader[18]);
tmp += ntohs(0x0600); tmp += ntohs(0x0600);
tmp += tcplen; tmp += tcplen;
for (u8* i = tcpheader; i < &tcpheader[tcplen]; i += 2) for (u8* i = tcpheader; i < &tcpheader[tcplen-1]; i += 2)
tmp += ntohs(*(u16*)i); tmp += ntohs(*(u16*)i);
if (tcplen & 1)
tmp += ntohs((u_short)tcpheader[tcplen-1]);
while (tmp >> 16) while (tmp >> 16)
tmp = (tmp & 0xFFFF) + (tmp >> 16); tmp = (tmp & 0xFFFF) + (tmp >> 16);
tmp ^= 0xFFFF; tmp ^= 0xFFFF;
@ -526,7 +528,7 @@ void TCP_SYNACK(TCPSocket* sock, u8* data, int len)
*out++ = 0x08; *out++ = 0x08;
u32 framelen = (u32)(out - &resp[0]); u32 framelen = (u32)(out - &resp[0]);
if (framelen & 1) { *out++ = 0; framelen++; } //if (framelen & 1) { *out++ = 0; framelen++; }
FinishTCPFrame(resp, framelen); FinishTCPFrame(resp, framelen);
// TODO: if there is already a packet queued, this will overwrite it // TODO: if there is already a packet queued, this will overwrite it
@ -577,7 +579,7 @@ void TCP_ACK(TCPSocket* sock, u8* data, int len)
*(u16*)out = 0; out += 2; // urgent pointer *(u16*)out = 0; out += 2; // urgent pointer
u32 framelen = (u32)(out - &resp[0]); u32 framelen = (u32)(out - &resp[0]);
if (framelen & 1) { *out++ = 0; framelen++; } //if (framelen & 1) { *out++ = 0; framelen++; }
FinishTCPFrame(resp, framelen); FinishTCPFrame(resp, framelen);
// TODO: if there is already a packet queued, this will overwrite it // TODO: if there is already a packet queued, this will overwrite it
@ -629,7 +631,6 @@ void TCP_BuildIncomingFrame(TCPSocket* sock, u8* data, int len)
memcpy(out, data, len); out += len; memcpy(out, data, len); out += len;
u32 framelen = (u32)(out - &resp[0]); u32 framelen = (u32)(out - &resp[0]);
if (framelen & 1) { *out++ = 0; framelen++; }
FinishTCPFrame(resp, framelen); FinishTCPFrame(resp, framelen);
// TODO: if there is already a packet queued, this will overwrite it // TODO: if there is already a packet queued, this will overwrite it