Suspicious call to ExFreePool commented out for peer review?
[reactos.git] / reactos / drivers / net / tcpip / network / transmit.c
index 3bcdf29..b650a54 100644 (file)
@@ -33,7 +33,7 @@ BOOLEAN PrepareNextFragment(
     BOOLEAN MoreFragments;
     USHORT FragOfs;
 
-    TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+    TI_DbgPrint(MAX_TRACE, ("Called. IFC (0x%X)\n", IFC));
 
     if (IFC->BytesLeft != 0) {
 
@@ -100,9 +100,10 @@ NTSTATUS SendFragments(
     NDIS_STATUS NdisStatus;
     PVOID Data;
 
-    TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+    TI_DbgPrint(MAX_TRACE, ("Called. IPPacket (0x%X)  NCE (0x%X)  PathMTU (%d).\n",
+        IPPacket, NCE, PathMTU));
 
-    IFC = PoolAllocateBuffer(sizeof(IPFRAGMENT_CONTEXT));
+    IFC = ExAllocatePool(NonPagedPool, sizeof(IPFRAGMENT_CONTEXT));
     if (!IFC)
         return STATUS_INSUFFICIENT_RESOURCES;
 
@@ -110,15 +111,15 @@ NTSTATUS SendFragments(
        it for all fragments */
     Data = ExAllocatePool(NonPagedPool, MaxLLHeaderSize + PathMTU);
     if (!IFC->Header) {
-        PoolFreeBuffer(IFC);
+        ExFreePool(IFC);
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
     /* Allocate NDIS packet */
     NdisAllocatePacket(&NdisStatus, &IFC->NdisPacket, GlobalPacketPool);
     if (NdisStatus != NDIS_STATUS_SUCCESS) {
-        ExFreePool(Data);
-        PoolFreeBuffer(IFC);
+        //ExFreePool(Data); // RobD - why are we trying to free this here?, not allocated yet!
+        ExFreePool(IFC);
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
@@ -128,7 +129,7 @@ NTSTATUS SendFragments(
     if (NdisStatus != NDIS_STATUS_SUCCESS) {
         NdisFreePacket(IFC->NdisPacket);
         ExFreePool(Data);
-        PoolFreeBuffer(IFC);
+        ExFreePool(IFC);
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
@@ -180,7 +181,8 @@ VOID IPSendComplete(
  *    This routine is called when an IP datagram fragment has been sent
  */
 {
-    TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+    TI_DbgPrint(MAX_TRACE, ("Called. Context (0x%X)  NdisPacket (0x%X)  NdisStatus (0x%X)\n",
+        Context, NdisPacket, NdisStatus));
 
     /* FIXME: Stop sending fragments and cleanup datagram buffers if
        there was an error */
@@ -204,7 +206,7 @@ VOID IPSendComplete(
             /* There are no more fragments to transmit, so call completion handler */
             NdisPacket = IFC->Datagram;
             FreeNdisPacket(IFC->NdisPacket);
-            PoolFreeBuffer(IFC);
+            ExFreePool(IFC);
             (*PC(NdisPacket)->Complete)(PC(NdisPacket)->Context, NdisPacket, NdisStatus);
         }
     }
@@ -225,7 +227,7 @@ NTSTATUS IPSendFragment(
  *     Lowest level IP send routine
  */
 {
-    TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+    TI_DbgPrint(MAX_TRACE, ("Called. NdisPacket (0x%X)  NCE (0x%X).\n", NdisPacket, NCE));
 
     TI_DbgPrint(MAX_TRACE, ("NCE->State = %d.\n", NCE->State));
 
@@ -270,8 +272,11 @@ NTSTATUS IPSendFragment(
     }
 
     PC(NdisPacket)->DLComplete = IPSendComplete;
-    (*NCE->Interface->Transmit)(NCE->Interface->Context, NdisPacket,
-        MaxLLHeaderSize, NCE->LinkAddress, LAN_PROTO_IPv4);
+    (*NCE->Interface->Transmit)(NCE->Interface->Context,
+                                NdisPacket,
+                                MaxLLHeaderSize,
+                                NCE->LinkAddress,
+                                LAN_PROTO_IPv4);
 
     return STATUS_SUCCESS;
 }
@@ -296,7 +301,9 @@ NTSTATUS IPSendDatagram(
     PNEIGHBOR_CACHE_ENTRY NCE;
     UINT PathMTU;
 
-    TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+    TI_DbgPrint(MAX_TRACE, ("Called. IPPacket (0x%X)  RCN (0x%X)\n", IPPacket, RCN));
+
+    DISPLAY_IP_PACKET(IPPacket);
 
     NCE = RCN->NCE;
 
@@ -310,16 +317,23 @@ NTSTATUS IPSendDatagram(
 
     /* Fetch path MTU now, because it may change */
     PathMTU = RCN->PathMTU;
+
     if (IPPacket->TotalSize > PathMTU) {
         return SendFragments(IPPacket, NCE, PathMTU);
     } else {
-        /* Calculate checksum of IP header */
-        ((PIPv4_HEADER)IPPacket->Header)->Checksum = 0;
+        if ((IPPacket->Flags & IP_PACKET_FLAG_RAW) == 0) {
+            /* Calculate checksum of IP header */
+            ((PIPv4_HEADER)IPPacket->Header)->Checksum = 0;
 
-        ((PIPv4_HEADER)IPPacket->Header)->Checksum = (USHORT)
-            IPv4Checksum(IPPacket->Header, IPPacket->HeaderSize, 0);
+            ((PIPv4_HEADER)IPPacket->Header)->Checksum = (USHORT)
+                IPv4Checksum(IPPacket->Header, IPPacket->HeaderSize, 0);
 
-        TI_DbgPrint(MAX_TRACE, ("Sending packet (length is %d).\n", WN2H(((PIPv4_HEADER)IPPacket->Header)->TotalLength)));
+            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));
+        }
 
         return IPSendFragment(IPPacket->NdisPacket, NCE);
     }