- 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
This commit is contained in:
Cameron Gutman 2010-01-09 16:25:11 +00:00
parent e8f652b985
commit f22efa9fe8
3 changed files with 15 additions and 22 deletions

View file

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

View file

@ -249,25 +249,21 @@ NTSTATUS RawIPSendDatagram(
BufferData, BufferData,
DataSize ); DataSize );
UnlockObject(AddrFile, OldIrql);
if( !NT_SUCCESS(Status) ) if( !NT_SUCCESS(Status) )
{
UnlockObject(AddrFile, OldIrql);
return Status; return Status;
}
TI_DbgPrint(MID_TRACE,("About to send datagram\n")); TI_DbgPrint(MID_TRACE,("About to send datagram\n"));
if (!NT_SUCCESS(Status = IPSendDatagram( &Packet, NCE, RawIpSendPacketComplete, NULL ))) if (!NT_SUCCESS(Status = IPSendDatagram( &Packet, NCE, RawIpSendPacketComplete, NULL )))
{ {
UnlockObject(AddrFile, OldIrql);
FreeNdisPacket(Packet.NdisPacket); FreeNdisPacket(Packet.NdisPacket);
return Status; return Status;
} }
TI_DbgPrint(MID_TRACE,("Leaving\n")); TI_DbgPrint(MID_TRACE,("Leaving\n"));
UnlockObject(AddrFile, OldIrql);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }

View file

@ -224,21 +224,17 @@ NTSTATUS UDPSendDatagram(
BufferData, BufferData,
DataSize ); DataSize );
UnlockObject(AddrFile, OldIrql);
if( !NT_SUCCESS(Status) ) if( !NT_SUCCESS(Status) )
{
UnlockObject(AddrFile, OldIrql);
return Status; return Status;
}
if (!NT_SUCCESS(Status = IPSendDatagram( &Packet, NCE, UDPSendPacketComplete, NULL ))) if (!NT_SUCCESS(Status = IPSendDatagram( &Packet, NCE, UDPSendPacketComplete, NULL )))
{ {
UnlockObject(AddrFile, OldIrql);
FreeNdisPacket(Packet.NdisPacket); FreeNdisPacket(Packet.NdisPacket);
return Status; return Status;
} }
UnlockObject(AddrFile, OldIrql);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }