From 985618d74eee93b08d06a39a400a7a6881bdf0f6 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 20 Jul 2009 19:46:54 +0000 Subject: [PATCH] - 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 --- reactos/lib/drivers/ip/network/transmit.c | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/reactos/lib/drivers/ip/network/transmit.c b/reactos/lib/drivers/ip/network/transmit.c index 51a99c27439..8372762079a 100644 --- a/reactos/lib/drivers/ip/network/transmit.c +++ b/reactos/lib/drivers/ip/network/transmit.c @@ -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,