2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Ancillary Function Driver
5 * PURPOSE: Support routines
6 * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
8 * CSH 01/02-2001 Created
22 for (i
= 0; i
< BufferCount
; i
++) {
27 AFD_DbgPrint(MAX_TRACE
, ("Buffer is %d bytes.\n", Count
));
33 NTSTATUS
MergeWSABuffers(
47 return STATUS_SUCCESS
;
51 AFD_DbgPrint(MAX_TRACE
, ("Destination is 0x%X\n", Destination
));
52 AFD_DbgPrint(MAX_TRACE
, ("p is 0x%X\n", p
));
54 for (i
= 0; i
< BufferCount
; i
++) {
56 if (Length
> MaxLength
)
57 /* Don't copy out of bounds */
60 RtlCopyMemory(Destination
, p
->buf
, Length
);
61 Destination
+= Length
;
62 AFD_DbgPrint(MAX_TRACE
, ("Destination is 0x%X\n", Destination
));
64 AFD_DbgPrint(MAX_TRACE
, ("p is 0x%X\n", p
));
66 *BytesCopied
+= Length
;
70 /* Destination buffer is full */
74 return STATUS_SUCCESS
;
77 NTSTATUS
FillWSABuffers(
84 PUCHAR DstData
, SrcData
;
85 UINT DstSize
, SrcSize
;
86 UINT Count
, Total
, Length
;
87 PAFD_BUFFER SrcBuffer
;
93 return STATUS_SUCCESS
;
95 SrcData
= SrcBuffer
->Buffer
.buf
;
96 SrcSize
= SrcBuffer
->Buffer
.len
;
98 DstData
= Buffers
->buf
;
99 DstSize
= Buffers
->len
;
103 /* Find out how many bytes we can copy at one time */
104 if (Length
< SrcSize
)
111 RtlCopyMemory((PVOID
)DstData
, (PVOID
)SrcData
, Count
);
118 ExFreePool(SrcBuffer
->Buffer
.buf
);
119 ExFreePool(SrcBuffer
);
121 /* No more bytes in source buffer. Proceed to
122 the next buffer in the source buffer chain */
123 Entry
= RemoveHeadList(&FCB
->ReceiveQueue
);
124 SrcBuffer
= CONTAINING_RECORD(Entry
, AFD_BUFFER
, ListEntry
);
125 SrcData
= SrcBuffer
->Buffer
.buf
;
126 SrcSize
= SrcBuffer
->Buffer
.len
;
131 /* No more bytes in destination buffer. Proceed to
132 the next buffer in the destination buffer chain */
137 DstData
= Buffers
->buf
;
138 DstSize
= Buffers
->len
;
146 InsertHeadList(&FCB
->ReceiveQueue
, Entry
);
149 *BytesCopied
= Total
;
151 return STATUS_SUCCESS
;
154 ULONG
ChecksumCompute(
159 * FUNCTION: Calculate checksum of a buffer
161 * Data = Pointer to buffer with data
162 * Count = Number of bytes in buffer
163 * Seed = Previously calculated checksum (if any)
168 /* FIXME: This should be done in assembler */
170 register ULONG Sum
= Seed
;
173 Sum
+= *(PUSHORT
)Data
;
175 (ULONG_PTR
)Data
+= 2;
178 /* Add left-over byte, if any */
180 Sum
+= *(PUCHAR
)Data
;
182 /* Fold 32-bit sum to 16 bits */
184 Sum
= (Sum
& 0xFFFF) + (Sum
>> 16);
189 VOID
BuildIPv4Header(
190 PIPv4_HEADER IPHeader
,
193 PSOCKADDR SourceAddress
,
194 PSOCKADDR DestinationAddress
)
196 PSOCKADDR_IN SrcNameIn
= (PSOCKADDR_IN
)SourceAddress
;
197 PSOCKADDR_IN DstNameIn
= (PSOCKADDR_IN
)DestinationAddress
;
199 /* Version = 4, Length = 5 DWORDs */
200 IPHeader
->VerIHL
= 0x45;
201 /* Normal Type-of-Service */
203 /* Length of header and data */
204 IPHeader
->TotalLength
= WH2N((USHORT
)TotalSize
);
207 /* One fragment at offset 0 */
208 IPHeader
->FlagsFragOfs
= 0;
209 /* Time-to-Live is 128 */
211 /* Protocol number */
212 IPHeader
->Protocol
= Protocol
;
213 /* Checksum is 0 (calculated later) */
214 IPHeader
->Checksum
= 0;
216 IPHeader
->SrcAddr
= SrcNameIn
->sin_addr
.S_un
.S_addr
;
217 /* Destination address */
218 IPHeader
->DstAddr
= DstNameIn
->sin_addr
.S_un
.S_addr
;
220 /* Calculate checksum of IP header */
221 IPHeader
->Checksum
= (USHORT
)
222 ChecksumCompute(IPHeader
, sizeof(IPv4_HEADER
), 0);