Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenchecksum.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
1.7.6.1
|