TCP checksum in delphi

Can anyone tell me if there is a Delphi version of this routine out there to calculate the TCP checksum

/*
**************************************************************************
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);
}

Also how do I determine the len_tcp value and how do I get the buff[].
rayman3411Asked:
Who is Participating?
 
rayman3411Connect With a Mentor Author Commented:
I have answered my own question.
// Calculate TCP checkcum
function RERFilter.RecalculateTCPChecksum(aLen: Integer;
                                          aSrcAddr, aDstAddr: Cardinal;
                                          buff: PByteArray): Word;
type
  Tbyte = array of byte;
 
var
  w16,padd: word;
  i,sum: integer;
  sIP,dIP: in_addr;
 
begin
  padd := 0;
  sum := 0;
  try
    try
      if (aLen div 2) * 2 <> aLen then begin
        padd := 1;
        buff[aLen] := 0;
      end;
      i := 0;
      while i < aLen+padd do begin
        w16 := ((buff[i] shl 8)and $FF00) + (buff[i+1]and $FF);
        sum := sum + integer(w16);
        i := i + 2;
      end;
 
      //add IP length
      sIP := in_addr(aSrcAddr);
      dIP := in_addr(aDstAddr);
      sum := sum + ntohs(sIP.S_un_w.s_w1) + ntohs(sIP.S_un_w.s_w2);
      sum := sum + ntohs(dIP.S_un_w.s_w1) + ntohs(dIP.S_un_w.s_w2);
      sum := sum + IPPROTO_TCP + word(aLen);
 
      while (sum shr 16)>0 do
        sum := (sum and $FFFF)+(sum shr 16);
      sum := not sum;
    except on E : Exception do
      MessageDlg('Error Calculating TCP Checksum.'+#10#13+
                 'Exception: '+E.Message, mtError, [mbOk], 0);
    end;
  finally
    Result := sum;
  end;
end;

Open in new window

0
All Courses

From novice to tech pro — start learning today.