ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

checksum.c
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:   See COPYING in the top level directory
00003  * PROJECT:     ReactOS TCP/IP protocol driver
00004  * FILE:        tcpip/checksum.c
00005  * PURPOSE:     Checksum routines
00006  * NOTES:       The checksum routine is from RFC 1071
00007  * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
00008  * REVISIONS:
00009  *   CSH 01/08-2000 Created
00010  */
00011 
00012 #include "precomp.h"
00013 
00014 
00015 ULONG ChecksumFold(
00016   ULONG Sum)
00017 {
00018   /* Fold 32-bit sum to 16 bits */
00019   while (Sum >> 16)
00020     {
00021       Sum = (Sum & 0xFFFF) + (Sum >> 16);
00022     }
00023 
00024   return Sum;
00025 }
00026 
00027 ULONG ChecksumCompute(
00028   PVOID Data,
00029   UINT Count,
00030   ULONG Seed)
00031 /*
00032  * FUNCTION: Calculate checksum of a buffer
00033  * ARGUMENTS:
00034  *     Data  = Pointer to buffer with data
00035  *     Count = Number of bytes in buffer
00036  *     Seed  = Previously calculated checksum (if any)
00037  * RETURNS:
00038  *     Checksum of buffer
00039  */
00040 {
00041   register ULONG Sum = Seed;
00042 
00043   while (Count > 1)
00044     {
00045       Sum += *(PUSHORT)Data;
00046       Count -= 2;
00047       Data = (PVOID)((ULONG_PTR) Data + 2);
00048     }
00049 
00050   /* Add left-over byte, if any */
00051   if (Count > 0)
00052     {
00053       Sum += *(PUCHAR)Data;
00054     }
00055 
00056   return Sum;
00057 }
00058 
00059 ULONG
00060 UDPv4ChecksumCalculate(
00061   PIPv4_HEADER IPHeader,
00062   PUCHAR PacketBuffer,
00063   ULONG DataLength)
00064 {
00065   ULONG Sum = 0;
00066   USHORT TmpSum;
00067   ULONG i;
00068   BOOLEAN Pad;
00069 
00070   /* Pad the data if needed */
00071   Pad = (DataLength & 1);
00072   if (Pad)
00073       DataLength++;
00074 
00075   /* Add from the UDP header and data */
00076   for (i = 0; i < DataLength; i += 2)
00077   {
00078        TmpSum = ((PacketBuffer[i] << 8) & 0xFF00) +
00079                 ((Pad && i == DataLength - 2) ? 0 : (PacketBuffer[i+1] & 0x00FF));
00080        Sum += TmpSum;
00081   }
00082 
00083   /* Add the source address */
00084   for (i = 0; i < sizeof(IPv4_RAW_ADDRESS); i += 2)
00085   {
00086        TmpSum = ((((PUCHAR)&IPHeader->SrcAddr)[i] << 8) & 0xFF00) +
00087                 (((PUCHAR)&IPHeader->SrcAddr)[i+1] & 0x00FF);
00088        Sum += TmpSum;
00089   }
00090 
00091   /* Add the destination address */
00092   for (i = 0; i < sizeof(IPv4_RAW_ADDRESS); i += 2)
00093   {
00094        TmpSum = ((((PUCHAR)&IPHeader->DstAddr)[i] << 8) & 0xFF00) +
00095                 (((PUCHAR)&IPHeader->DstAddr)[i+1] & 0x00FF);
00096        Sum += TmpSum;
00097   }
00098 
00099   /* Add the proto number and length */
00100   Sum += IPPROTO_UDP + (DataLength - (Pad ? 1 : 0));
00101 
00102   /* Fold the checksum and return the one's complement */
00103   return ~ChecksumFold(Sum);
00104 }
00105 

Generated on Fri May 25 2012 04:34:29 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.