IPStack - Fixed TCP checksuming
authorJohn Hodge <[email protected]>
Thu, 4 Aug 2011 00:09:38 +0000 (08:09 +0800)
committerJohn Hodge <[email protected]>
Thu, 4 Aug 2011 00:09:38 +0000 (08:09 +0800)
- Padded with zero, instead of Undefined
- Fixed ping to return the ping time, instead of the timestamp

Modules/IPStack/icmp.c
Modules/IPStack/ipv4.c
Modules/IPStack/tcp.c

index 969a1fa..2cdc3f6 100644 (file)
@@ -129,5 +129,5 @@ int ICMP_Ping(tInterface *Interface, tIPv4 Addr)
        if(now() > end)
                return -1;
        
-       return (int)ts;
+       return (int)( now() - ts );
 }
index b77581e..6c387cc 100644 (file)
@@ -317,12 +317,15 @@ Uint16 IPv4_Checksum(const void *Buf, int Size)
        const Uint16    *arr = Buf;
         int    i;
        
-       Size = (Size + 1) >> 1; // 16-bit word count
-       for(i = 0; i < Size; i++ )
+       // Sum all whole words
+       for(i = 0; i < Size/2; i++ )
        {
                Uint16  val = ntohs(arr[i]);
                sum += val;
        }
+       // Add the tail word
+//     if( i*2 != Size )
+//             sum += arr[i]&0xFF;
        
        // Apply one's complement
        while (sum >> 16)
index 68e72d7..1f51e10 100644 (file)
@@ -90,6 +90,8 @@ void TCP_SendPacket( tTCPConnection *Conn, size_t Length, tTCPHeader *Data )
                buf[2] = (htons(Length)<<16) | (6<<8) | 0;
                Data->Checksum = 0;
                memcpy( &buf[3], Data, Length );
+               if(Length & 1)
+                       ((Uint8*)buf)[12+Length] = 0;
                Data->Checksum = htons( IPv4_Checksum( buf, buflen ) );
                free(buf);
                IPv4_SendPacket(Conn->Interface, Conn->RemoteIP.v4, IP4PROT_TCP, 0, Length, Data);

UCC git Repository :: git.ucc.asn.au