- Unlock the address file before calling IPSendDatagram
authorCameron Gutman <aicommander@gmail.com>
Sat, 9 Jan 2010 16:25:11 +0000 (16:25 +0000)
committerCameron Gutman <aicommander@gmail.com>
Sat, 9 Jan 2010 16:25:11 +0000 (16:25 +0000)
 - We don't need to be locked anymore at that point and it also causes problems with loopback packets
 - Use the TTL value stored in the address file for ICMP packets

svn path=/branches/aicom-network-branch/; revision=45016

lib/drivers/ip/network/icmp.c
lib/drivers/ip/transport/rawip/rawip.c
lib/drivers/ip/transport/udp/udp.c

index fb3387d..4f1ee99 100644 (file)
@@ -48,6 +48,7 @@ VOID SendICMPComplete(
 
 
 BOOLEAN PrepareICMPPacket(
+    PADDRESS_FILE AddrFile,
     PIP_INTERFACE Interface,
     PIP_PACKET IPPacket,
     PIP_ADDRESS Destination,
@@ -114,8 +115,11 @@ BOOLEAN PrepareICMPPacket(
     IPHeader->Id = (USHORT)Random();
     /* One fragment at offset 0 */
     IPHeader->FlagsFragOfs = 0;
-    /* Time-to-Live is 128 */
-    IPHeader->Ttl = 128;
+    /* Set TTL */
+    if (AddrFile)
+        IPHeader->Ttl = AddrFile->TTL;
+    else
+        IPHeader->Ttl = 128;
     /* Internet Control Message Protocol */
     IPHeader->Protocol = IPPROTO_ICMP;
     /* Checksum is 0 (for later calculation of this) */
@@ -205,31 +209,28 @@ NTSTATUS ICMPSendDatagram(
         }
     }
 
-    Status = PrepareICMPPacket( NCE->Interface,
+    Status = PrepareICMPPacket( AddrFile,
+                                NCE->Interface,
                                 &Packet,
                                 &RemoteAddress,
                                 BufferData,
                                 DataSize );
 
+    UnlockObject(AddrFile, OldIrql);
+
     if( !NT_SUCCESS(Status) )
-    {
-        UnlockObject(AddrFile, OldIrql);
        return Status;
-    }
 
     TI_DbgPrint(MID_TRACE,("About to send datagram\n"));
 
     if (!NT_SUCCESS(Status = IPSendDatagram( &Packet, NCE, ICMPSendPacketComplete, NULL )))
     {
-        UnlockObject(AddrFile, OldIrql);
         FreeNdisPacket(Packet.NdisPacket);
         return Status;
     }
 
     TI_DbgPrint(MID_TRACE,("Leaving\n"));
 
-    UnlockObject(AddrFile, OldIrql);
-
     return STATUS_SUCCESS;
 }
 
@@ -352,7 +353,7 @@ VOID ICMPReply(
 
     DataSize = IPPacket->TotalSize - IPPacket->HeaderSize;
 
-    if( !PrepareICMPPacket(Interface, &NewPacket, &IPPacket->SrcAddr,
+    if( !PrepareICMPPacket(NULL, Interface, &NewPacket, &IPPacket->SrcAddr,
                           IPPacket->Data, DataSize) ) return;
 
     ((PICMP_HEADER)NewPacket.Data)->Type     = Type;
index 288097b..6b441e4 100644 (file)
@@ -249,25 +249,21 @@ NTSTATUS RawIPSendDatagram(
                                BufferData,
                                DataSize );
 
+    UnlockObject(AddrFile, OldIrql);
+
     if( !NT_SUCCESS(Status) )
-    {
-       UnlockObject(AddrFile, OldIrql);
        return Status;
-    }
 
     TI_DbgPrint(MID_TRACE,("About to send datagram\n"));
 
     if (!NT_SUCCESS(Status = IPSendDatagram( &Packet, NCE, RawIpSendPacketComplete, NULL )))
     {
-       UnlockObject(AddrFile, OldIrql);
         FreeNdisPacket(Packet.NdisPacket);
         return Status;
     }
 
     TI_DbgPrint(MID_TRACE,("Leaving\n"));
 
-    UnlockObject(AddrFile, OldIrql);
-
     return STATUS_SUCCESS;
 }
 
index 2e86c2b..0dcf7b2 100644 (file)
@@ -224,21 +224,17 @@ NTSTATUS UDPSendDatagram(
                                                         BufferData,
                                                         DataSize );
 
+    UnlockObject(AddrFile, OldIrql);
+
     if( !NT_SUCCESS(Status) )
-    {
-               UnlockObject(AddrFile, OldIrql);
                return Status;
-    }
 
     if (!NT_SUCCESS(Status = IPSendDatagram( &Packet, NCE, UDPSendPacketComplete, NULL )))
     {
-       UnlockObject(AddrFile, OldIrql);
         FreeNdisPacket(Packet.NdisPacket);
         return Status;
     }
 
-    UnlockObject(AddrFile, OldIrql);
-
     return STATUS_SUCCESS;
 }