Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1290
  • Last Modified:

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[].
0
rayman3411
Asked:
rayman3411
1 Solution
 
rayman3411Author 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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Worried about phishing attacks?

90% of attacks start with a phish. It’s critical that IT admins and MSSPs have the right security in place to protect their end users from these phishing attacks. Check out our latest feature brief for tips and tricks to keep your employees off a hackers line!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now