2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS TCP/IP protocol driver
4 * FILE: tcpip/checksum.c
5 * PURPOSE: Checksum routines
6 * NOTES: The checksum routine is from RFC 1071
7 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
9 * CSH 01/08-2000 Created
18 /* Fold 32-bit sum to 16 bits */
21 Sum
= (Sum
& 0xFFFF) + (Sum
>> 16);
27 ULONG
ChecksumCompute(
32 * FUNCTION: Calculate checksum of a buffer
34 * Data = Pointer to buffer with data
35 * Count = Number of bytes in buffer
36 * Seed = Previously calculated checksum (if any)
41 register ULONG Sum
= Seed
;
45 Sum
+= *(PUSHORT
)Data
;
47 Data
= (PVOID
)((ULONG_PTR
) Data
+ 2);
50 /* Add left-over byte, if any */
60 UDPv4ChecksumCalculate(
61 PIPv4_HEADER IPHeader
,
70 /* Pad the data if needed */
71 Pad
= (DataLength
& 1);
75 } else DbgPrint("Even\n");
77 /* Add from the UDP header and data */
78 for (i
= 0; i
< DataLength
; i
+= 2)
80 TmpSum
= ((PacketBuffer
[i
] << 8) & 0xFF00) +
81 ((Pad
&& i
== DataLength
- 1) ? 0 : (PacketBuffer
[i
+1] & 0x00FF));
85 /* Add the source address */
86 for (i
= 0; i
< sizeof(IPv4_RAW_ADDRESS
); i
+= 2)
88 TmpSum
= ((((PUCHAR
)&IPHeader
->SrcAddr
)[i
] << 8) & 0xFF00) +
89 (((PUCHAR
)&IPHeader
->SrcAddr
)[i
+1] & 0x00FF);
93 /* Add the destination address */
94 for (i
= 0; i
< sizeof(IPv4_RAW_ADDRESS
); i
+= 2)
96 TmpSum
= ((((PUCHAR
)&IPHeader
->DstAddr
)[i
] << 8) & 0xFF00) +
97 (((PUCHAR
)&IPHeader
->DstAddr
)[i
+1] & 0x00FF);
101 /* Add the proto number and length */
102 Sum
+= IPPROTO_UDP
+ (DataLength
- (Pad
? 1 : 0));
104 /* Fold the checksum and return the one's complement */
105 return ~ChecksumFold(Sum
);