[ros-diffs] [cgutman] 42104: - 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

cgutman at svn.reactos.org cgutman at svn.reactos.org
Mon Jul 20 21:46:55 CEST 2009


Author: cgutman
Date: Mon Jul 20 21:46:54 2009
New Revision: 42104

URL: http://svn.reactos.org/svn/reactos?rev=42104&view=rev
Log:
 - 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

Modified:
    trunk/reactos/lib/drivers/ip/network/transmit.c

Modified: trunk/reactos/lib/drivers/ip/network/transmit.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/network/transmit.c?rev=42104&r1=42103&r2=42104&view=diff
==============================================================================
--- trunk/reactos/lib/drivers/ip/network/transmit.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/network/transmit.c [iso-8859-1] Mon Jul 20 21:46:54 2009
@@ -114,14 +114,17 @@
 
         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 @@
     /* 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,



More information about the Ros-diffs mailing list