- 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:
Cameron Gutman 2009-07-20 19:46:54 +00:00
parent 207b294387
commit 985618d74e

View file

@ -114,14 +114,17 @@ BOOLEAN PrepareNextFragment(
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)
FragOfs |= IPv4_MF_MASK;
else
FragOfs &= ~IPv4_MF_MASK;
Header = IFC->Header;
Header->FlagsFragOfs = FragOfs;
Header->FlagsFragOfs = WH2N(FragOfs);
Header->TotalLength = WH2N((USHORT)(DataSize + IFC->HeaderSize));
/* FIXME: Handle options */
@ -250,22 +253,6 @@ NTSTATUS IPSendDatagram(PIP_PACKET IPPacket, PNEIGHBOR_CACHE_ENTRY NCE,
/* Fetch path MTU now, because it may change */
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,
NULL,
NULL,