mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 05:55:48 +00:00
- Update TotalLength based on the fragment size
- Make fragment offset into 8-byte units - Don't perform a useless checksum calculation - Fixes datagram fragmentation (tested using ping with a packet size of 16000) - This also seems to fix DHCP over a bridged NIC in vbox svn path=/trunk/; revision=42104
This commit is contained in:
parent
207b294387
commit
985618d74e
1 changed files with 5 additions and 18 deletions
|
@ -114,14 +114,17 @@ BOOLEAN PrepareNextFragment(
|
||||||
|
|
||||||
RtlCopyMemory(IFC->Data, IFC->DatagramData, DataSize); // SAFE
|
RtlCopyMemory(IFC->Data, IFC->DatagramData, DataSize); // SAFE
|
||||||
|
|
||||||
FragOfs = (USHORT)IFC->Position; // Swap?
|
/* Fragment offset is in 8 byte blocks */
|
||||||
|
FragOfs = (USHORT)(IFC->Position / 8);
|
||||||
|
|
||||||
if (MoreFragments)
|
if (MoreFragments)
|
||||||
FragOfs |= IPv4_MF_MASK;
|
FragOfs |= IPv4_MF_MASK;
|
||||||
else
|
else
|
||||||
FragOfs &= ~IPv4_MF_MASK;
|
FragOfs &= ~IPv4_MF_MASK;
|
||||||
|
|
||||||
Header = IFC->Header;
|
Header = IFC->Header;
|
||||||
Header->FlagsFragOfs = FragOfs;
|
Header->FlagsFragOfs = WH2N(FragOfs);
|
||||||
|
Header->TotalLength = WH2N((USHORT)(DataSize + IFC->HeaderSize));
|
||||||
|
|
||||||
/* FIXME: Handle options */
|
/* FIXME: Handle options */
|
||||||
|
|
||||||
|
@ -250,22 +253,6 @@ NTSTATUS IPSendDatagram(PIP_PACKET IPPacket, PNEIGHBOR_CACHE_ENTRY NCE,
|
||||||
/* Fetch path MTU now, because it may change */
|
/* Fetch path MTU now, because it may change */
|
||||||
TI_DbgPrint(MID_TRACE,("PathMTU: %d\n", NCE->Interface->MTU));
|
TI_DbgPrint(MID_TRACE,("PathMTU: %d\n", NCE->Interface->MTU));
|
||||||
|
|
||||||
if ((IPPacket->Flags & IP_PACKET_FLAG_RAW) == 0) {
|
|
||||||
/* Calculate checksum of IP header */
|
|
||||||
TI_DbgPrint(MID_TRACE,("-> not IP_PACKET_FLAG_RAW\n"));
|
|
||||||
((PIPv4_HEADER)IPPacket->Header)->Checksum = 0;
|
|
||||||
|
|
||||||
((PIPv4_HEADER)IPPacket->Header)->Checksum = (USHORT)
|
|
||||||
IPv4Checksum(IPPacket->Header, IPPacket->HeaderSize, 0);
|
|
||||||
TI_DbgPrint(MID_TRACE,("IP Check: %x\n", ((PIPv4_HEADER)IPPacket->Header)->Checksum));
|
|
||||||
|
|
||||||
TI_DbgPrint(MAX_TRACE, ("Sending packet (length is %d).\n",
|
|
||||||
WN2H(((PIPv4_HEADER)IPPacket->Header)->TotalLength)));
|
|
||||||
} else {
|
|
||||||
TI_DbgPrint(MAX_TRACE, ("Sending raw packet (flags are 0x%X).\n",
|
|
||||||
IPPacket->Flags));
|
|
||||||
}
|
|
||||||
|
|
||||||
NdisQueryPacket(IPPacket->NdisPacket,
|
NdisQueryPacket(IPPacket->NdisPacket,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue