From f22efa9fe82fd8489c74cf343ac38bd6a3b5b8a8 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 9 Jan 2010 16:25:11 +0000 Subject: [PATCH] - Unlock the address file before calling IPSendDatagram - 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 | 21 +++++++++++---------- lib/drivers/ip/transport/rawip/rawip.c | 8 ++------ lib/drivers/ip/transport/udp/udp.c | 8 ++------ 3 files changed, 15 insertions(+), 22 deletions(-) diff --git a/lib/drivers/ip/network/icmp.c b/lib/drivers/ip/network/icmp.c index fb3387d88ee..4f1ee993ec0 100644 --- a/lib/drivers/ip/network/icmp.c +++ b/lib/drivers/ip/network/icmp.c @@ -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; diff --git a/lib/drivers/ip/transport/rawip/rawip.c b/lib/drivers/ip/transport/rawip/rawip.c index 288097b4d79..6b441e42935 100644 --- a/lib/drivers/ip/transport/rawip/rawip.c +++ b/lib/drivers/ip/transport/rawip/rawip.c @@ -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; } diff --git a/lib/drivers/ip/transport/udp/udp.c b/lib/drivers/ip/transport/udp/udp.c index 2e86c2bded0..0dcf7b2cb5b 100644 --- a/lib/drivers/ip/transport/udp/udp.c +++ b/lib/drivers/ip/transport/udp/udp.c @@ -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; }