diff --git a/Modules/IPStack/icmp.c b/Modules/IPStack/icmp.c index 2cdc3f6735ce815c61e80d1063c4e3a19d4d788a..16037199173abb974df8cae419ab4b5b41f0c917 100644 --- a/Modules/IPStack/icmp.c +++ b/Modules/IPStack/icmp.c @@ -81,7 +81,7 @@ void ICMP_GetPacket(tInterface *Interface, void *Address, int Length, void *Buff //Log_Debug("ICMPv4", "Replying"); hdr->Type = ICMP_ECHOREPLY; hdr->Checksum = 0; - hdr->Checksum = htons( IPv4_Checksum(hdr, Length) ); + hdr->Checksum = htons( IPv4_Checksum( (Uint16*)hdr, Length/2 ) ); //Log_Debug("ICMPv4", "Checksum = 0x%04x", hdr->Checksum); IPv4_SendPacket(Interface, *(tIPv4*)Address, 1, ntohs(hdr->Sequence), Length, hdr); break; @@ -117,7 +117,7 @@ int ICMP_Ping(tInterface *Interface, tIPv4 Addr) gICMP_PingSlots[i].bArrived = 0; hdr->ID = i; hdr->Sequence = ~i; - hdr->Checksum = htons( IPv4_Checksum(hdr, sizeof(buf)) ); + hdr->Checksum = htons( IPv4_Checksum((Uint16*)hdr, sizeof(buf)/2) ); ts = now(); diff --git a/Modules/IPStack/ipv4.c b/Modules/IPStack/ipv4.c index 6c387cc173e0e6b48a78854e335af096acaaa559..04b8f4b77c93e7af48943c02956eebcceabe9b61 100644 --- a/Modules/IPStack/ipv4.c +++ b/Modules/IPStack/ipv4.c @@ -21,7 +21,7 @@ extern tMacAddr ARP_Resolve4(tInterface *Interface, tIPv4 Address); void IPv4_int_GetPacket(tAdapter *Interface, tMacAddr From, int Length, void *Buffer); tInterface *IPv4_GetInterface(tAdapter *Adapter, tIPv4 Address, int Broadcast); Uint32 IPv4_Netmask(int FixedBits); -Uint16 IPv4_Checksum(const void *Buf, int Size); +Uint16 IPv4_Checksum(const Uint16 *Buf, int WordCount); int IPv4_Ping(tInterface *Iface, tIPv4 Addr); // === GLOBALS === @@ -105,7 +105,7 @@ int IPv4_SendPacket(tInterface *Iface, tIPv4 Address, int Protocol, int ID, int hdr->HeaderChecksum = 0; // Will be set later hdr->Source = *(tIPv4*)Iface->Address; hdr->Destination = Address; - hdr->HeaderChecksum = htons(IPv4_Checksum(hdr, sizeof(tIPv4Header))); + hdr->HeaderChecksum = htons(IPv4_Checksum((Uint16*)hdr, sizeof(tIPv4Header)/2)); Log_Log("IPv4", "Sending packet to %i.%i.%i.%i", Address.B[0], Address.B[1], Address.B[2], Address.B[3]); @@ -154,7 +154,7 @@ void IPv4_int_GetPacket(tAdapter *Adapter, tMacAddr From, int Length, void *Buff Uint16 hdrVal, compVal; hdrVal = ntohs(hdr->HeaderChecksum); hdr->HeaderChecksum = 0; - compVal = IPv4_Checksum(hdr, hdr->HeaderLength * 4); + compVal = IPv4_Checksum((Uint16*)hdr, (hdr->HeaderLength * 4) / 2); if(hdrVal != compVal) { Log_Log("IPv4", "Header checksum fails (%04x != %04x)", hdrVal, compVal); return ; @@ -311,21 +311,17 @@ Uint32 IPv4_Netmask(int FixedBits) * * One's complement sum of all 16-bit words (bitwise inverted) */ -Uint16 IPv4_Checksum(const void *Buf, int Size) +Uint16 IPv4_Checksum(const Uint16 *Buf, int WordCount) { Uint32 sum = 0; - const Uint16 *arr = Buf; int i; // Sum all whole words - for(i = 0; i < Size/2; i++ ) + for(i = 0; i < WordCount; i++ ) { - Uint16 val = ntohs(arr[i]); + Uint16 val = ntohs(Buf[i]); sum += val; } - // Add the tail word -// if( i*2 != Size ) -// sum += arr[i]&0xFF; // Apply one's complement while (sum >> 16) diff --git a/Modules/IPStack/ipv4.h b/Modules/IPStack/ipv4.h index 33507b28f568f5f4d0fb26f4ec7ff1fe7c4a73c9..563965c935a5ea7417d64d519b9f67ecf286dff4 100644 --- a/Modules/IPStack/ipv4.h +++ b/Modules/IPStack/ipv4.h @@ -46,7 +46,7 @@ struct sIPv4Header // === FUNCTIONS === extern int IPv4_RegisterCallback(int ID, tIPCallback Callback); -extern Uint16 IPv4_Checksum(const void *Buf, int Size); +extern Uint16 IPv4_Checksum(const Uint16 *Buf, int WordCount); extern int IPv4_SendPacket(tInterface *Iface, tIPv4 Address, int Protocol, int ID, int Length, const void *Data); #endif diff --git a/Modules/IPStack/tcp.c b/Modules/IPStack/tcp.c index 1f51e10d5d2582bdf63b1e80c0b2c599d4370b76..1600bb46acd75e6f6b2f597c22f63af1233cb053 100644 --- a/Modules/IPStack/tcp.c +++ b/Modules/IPStack/tcp.c @@ -92,7 +92,7 @@ void TCP_SendPacket( tTCPConnection *Conn, size_t Length, tTCPHeader *Data ) memcpy( &buf[3], Data, Length ); if(Length & 1) ((Uint8*)buf)[12+Length] = 0; - Data->Checksum = htons( IPv4_Checksum( buf, buflen ) ); + Data->Checksum = htons( IPv4_Checksum( (Uint16*)buf, buflen/2 ) ); free(buf); IPv4_SendPacket(Conn->Interface, Conn->RemoteIP.v4, IP4PROT_TCP, 0, Length, Data); break; @@ -137,7 +137,7 @@ void TCP_GetPacket(tInterface *Interface, void *Address, int Length, void *Buffe { Log_Log("TCP", "TCP_GetPacket: SequenceNumber = 0x%x", ntohl(hdr->SequenceNumber)); Debug_HexDump( - "[TCP ] Packet Data = ", + "TCP_GetPacket: Packet Data = ", (Uint8*)hdr + (hdr->DataOffset >> 4)*4, Length - (hdr->DataOffset >> 4)*4 ); @@ -1076,8 +1076,7 @@ void TCP_INT_SendDataPacket(tTCPConnection *Connection, size_t Length, void *Dat memcpy(packet->Options, Data, Length); Log_Debug("TCP", "Send sequence 0x%08x", Connection->NextSequenceSend); - Debug_HexDump("[TCP ] TCP_INT_SendDataPacket: Data = ", - Data, Length); + Debug_HexDump("TCP_INT_SendDataPacket: Data = ", Data, Length); TCP_SendPacket( Connection, sizeof(tTCPHeader)+Length, packet );