TCP CHECKSUM CALCULATION
(See also short Description of Internet Checksum).
To calculate TCP checksum a "pseudo header" is added to the TCP header. This includes:
IP Source Address 4 bytes
IP Destination Address 4 bytes
TCP Protocol 2 bytes
TCP Length 2 bytes
The checksum is calculated over all the octets of the pseudo header, TCP header and data.
If the data contains an odd number of octets a pad, zero octet is added to the end of data. The pseudo
header and the pad are not transmitted with the packet.
In the example code,
u16 buff[] is an array containing all the octets in the TCP header and data.
u16 len_tcp is the length (number of octets) of the TCP header and data.
BOOL padding is 1 if data has an even number of octets and 0 for an odd number.
u16 src_addr[4] and u16 dest_addr[4] are the IP source and destination address octets.
/*
**************************************************************************
Function: tcp_sum_calc()
**************************************************************************
Description:
Calculate TCP checksum
***************************************************************************
*/
typedef unsigned short u16;
typedef unsigned long u32;
u16 tcp_sum_calc(u16 len_tcp, u16 src_addr[],u16 dest_addr[], BOOL padding, u16 buff[])
{
u16 prot_tcp=6;
u16 padd=0;
u16 word16;
u32 sum;
// Find out if the length of data is even or odd number. If odd,
// add a padding byte = 0 at the end of packet
if (padding&1==1){
padd=1;
buff[len_tcp]=0;
}
//initialize sum to zero
sum=0;
// make 16 bit words out of every two adjacent 8 bit words and
// calculate the sum of all 16 vit words
for (i=0;i<len_tcp+padd;i=i+2){
word16 =((buff[i]<<8)&0xFF00)+(buff[i+1]&0xFF);
sum = sum + (unsigned long)word16;
}
// add the TCP pseudo header which contains:
// the IP source and destinationn addresses,
for (i=0;i<4;i=i+2){
word16 =((src_addr[i]<<8)&0xFF00)+(src_addr[i+1]&0xFF);
sum=sum+word16;
}
for (i=0;i<4;i=i+2){
word16 =((dest_addr[i]<<8)&0xFF00)+(dest_addr[i+1]&0xFF);
sum=sum+word16;
}
// the protocol number and the length of the TCP packet
sum = sum + prot_tcp + len_tcp;
// keep only the last 16 bits of the 32 bit calculated sum and add the carries
while (sum>>16)
sum = (sum & 0xFFFF)+(sum >> 16);
// Take the one's complement of sum
sum = ~sum;
return ((unsigned short) sum);
}
Previous Contents
alex@netfor2.com