- Allocate IP_PACKET on the stack

- Reduces non-paged memory consumption

svn path=/trunk/; revision=41698
This commit is contained in:
Cameron Gutman 2009-06-29 20:18:32 +00:00
parent 44ab91c5e6
commit 6bed52e321
2 changed files with 16 additions and 68 deletions

View file

@ -19,24 +19,10 @@ UINT MaxLLHeaderSize; /* Largest maximum header size */
UINT MinLLFrameSize; /* Largest minimum frame size */ UINT MinLLFrameSize; /* Largest minimum frame size */
BOOLEAN IPInitialized = FALSE; BOOLEAN IPInitialized = FALSE;
BOOLEAN IpWorkItemQueued = FALSE; BOOLEAN IpWorkItemQueued = FALSE;
NPAGED_LOOKASIDE_LIST IPPacketList;
/* Work around calling timer at Dpc level */ /* Work around calling timer at Dpc level */
IP_PROTOCOL_HANDLER ProtocolTable[IP_PROTOCOL_TABLE_SIZE]; IP_PROTOCOL_HANDLER ProtocolTable[IP_PROTOCOL_TABLE_SIZE];
VOID FreePacket(
PVOID Object)
/*
* FUNCTION: Frees an IP packet object
* ARGUMENTS:
* Object = Pointer to an IP packet structure
*/
{
exFreeToNPagedLookasideList(&IPPacketList, Object);
}
VOID DontFreePacket( VOID DontFreePacket(
PVOID Object) PVOID Object)
/* /*
@ -58,34 +44,6 @@ VOID FreeIF(
exFreePool(Object); exFreePool(Object);
} }
PIP_PACKET IPCreatePacket(ULONG Type)
/*
* FUNCTION: Creates an IP packet object
* ARGUMENTS:
* Type = Type of IP packet
* RETURNS:
* Pointer to the created IP packet. NULL if there was not enough free resources.
*/
{
PIP_PACKET IPPacket;
IPPacket = exAllocateFromNPagedLookasideList(&IPPacketList);
if (!IPPacket)
return NULL;
/* FIXME: Is this needed? */
RtlZeroMemory(IPPacket, sizeof(IP_PACKET));
INIT_TAG(IPPacket, TAG('I','P','K','T'));
IPPacket->Free = FreePacket;
IPPacket->Type = Type;
IPPacket->HeaderSize = 20;
return IPPacket;
}
PIP_PACKET IPInitializePacket( PIP_PACKET IPInitializePacket(
PIP_PACKET IPPacket, PIP_PACKET IPPacket,
ULONG Type) ULONG Type)
@ -415,15 +373,6 @@ NTSTATUS IPStartup(PUNICODE_STRING RegistryPath)
TAG('I','P','D','R'), /* Tag */ TAG('I','P','D','R'), /* Tag */
0); /* Depth */ 0); /* Depth */
ExInitializeNPagedLookasideList(
&IPPacketList, /* Lookaside list */
NULL, /* Allocate routine */
NULL, /* Free routine */
0, /* Flags */
sizeof(IP_PACKET), /* Size of each entry */
TAG('I','P','P','K'), /* Tag */
0); /* Depth */
ExInitializeNPagedLookasideList( ExInitializeNPagedLookasideList(
&IPFragmentList, /* Lookaside list */ &IPFragmentList, /* Lookaside list */
NULL, /* Allocate routine */ NULL, /* Allocate routine */
@ -491,7 +440,6 @@ NTSTATUS IPShutdown(
/* Destroy lookaside lists */ /* Destroy lookaside lists */
ExDeleteNPagedLookasideList(&IPHoleList); ExDeleteNPagedLookasideList(&IPHoleList);
ExDeleteNPagedLookasideList(&IPDRList); ExDeleteNPagedLookasideList(&IPDRList);
ExDeleteNPagedLookasideList(&IPPacketList);
ExDeleteNPagedLookasideList(&IPFragmentList); ExDeleteNPagedLookasideList(&IPFragmentList);
IPInitialized = FALSE; IPInitialized = FALSE;

View file

@ -174,7 +174,9 @@ PIPDATAGRAM_REASSEMBLY GetReassemblyInfo(
} }
PIP_PACKET ReassembleDatagram( BOOLEAN
ReassembleDatagram(
PIP_PACKET IPPacket,
PIPDATAGRAM_REASSEMBLY IPDR) PIPDATAGRAM_REASSEMBLY IPDR)
/* /*
* FUNCTION: Reassembles an IP datagram * FUNCTION: Reassembles an IP datagram
@ -189,7 +191,6 @@ PIP_PACKET ReassembleDatagram(
* At this point, header is expected to point to the IP header * At this point, header is expected to point to the IP header
*/ */
{ {
PIP_PACKET IPPacket;
PLIST_ENTRY CurrentEntry; PLIST_ENTRY CurrentEntry;
PIP_FRAGMENT Current; PIP_FRAGMENT Current;
PVOID Data; PVOID Data;
@ -201,11 +202,6 @@ PIP_PACKET ReassembleDatagram(
TI_DbgPrint(DEBUG_IP, ("Fragment header:\n")); TI_DbgPrint(DEBUG_IP, ("Fragment header:\n"));
//OskitDumpBuffer((PCHAR)IPDR->IPv4Header, IPDR->HeaderSize); //OskitDumpBuffer((PCHAR)IPDR->IPv4Header, IPDR->HeaderSize);
/* FIXME: Assume IPv4 */
IPPacket = IPCreatePacket(IP_ADDRESS_V4);
if (!IPPacket)
return NULL;
IPPacket->TotalSize = IPDR->HeaderSize + IPDR->DataSize; IPPacket->TotalSize = IPDR->HeaderSize + IPDR->DataSize;
IPPacket->ContigSize = IPPacket->TotalSize; IPPacket->ContigSize = IPPacket->TotalSize;
IPPacket->HeaderSize = IPDR->HeaderSize; IPPacket->HeaderSize = IPDR->HeaderSize;
@ -219,7 +215,7 @@ PIP_PACKET ReassembleDatagram(
if (!IPPacket->Header) { if (!IPPacket->Header) {
TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n")); TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
(*IPPacket->Free)(IPPacket); (*IPPacket->Free)(IPPacket);
return NULL; return FALSE;
} }
/* Copy the header into the buffer */ /* Copy the header into the buffer */
@ -243,7 +239,7 @@ PIP_PACKET ReassembleDatagram(
CurrentEntry = CurrentEntry->Flink; CurrentEntry = CurrentEntry->Flink;
} }
return IPPacket; return TRUE;
} }
@ -289,8 +285,9 @@ VOID ProcessFragment(
USHORT FragLast; USHORT FragLast;
BOOLEAN MoreFragments; BOOLEAN MoreFragments;
PIPv4_HEADER IPv4Header; PIPv4_HEADER IPv4Header;
PIP_PACKET Datagram; IP_PACKET Datagram;
PIP_FRAGMENT Fragment; PIP_FRAGMENT Fragment;
BOOLEAN Success;
/* FIXME: Assume IPv4 */ /* FIXME: Assume IPv4 */
@ -448,26 +445,29 @@ VOID ProcessFragment(
TI_DbgPrint(DEBUG_IP, ("Complete datagram received.\n")); TI_DbgPrint(DEBUG_IP, ("Complete datagram received.\n"));
Datagram = ReassembleDatagram(IPDR); /* FIXME: Assumes IPv4 */
IPInitializePacket(&Datagram, IP_ADDRESS_V4);
Success = ReassembleDatagram(&Datagram, IPDR);
RemoveIPDR(IPDR); RemoveIPDR(IPDR);
TcpipReleaseSpinLock(&IPDR->Lock, OldIrql); TcpipReleaseSpinLock(&IPDR->Lock, OldIrql);
FreeIPDR(IPDR); FreeIPDR(IPDR);
if (!Datagram) if (!Success)
/* Not enough free resources, discard the packet */ /* Not enough free resources, discard the packet */
return; return;
DISPLAY_IP_PACKET(Datagram); DISPLAY_IP_PACKET(&Datagram);
/* Give the packet to the protocol dispatcher */ /* Give the packet to the protocol dispatcher */
IPDispatchProtocol(IF, Datagram); IPDispatchProtocol(IF, &Datagram);
/* We're done with this datagram */ /* We're done with this datagram */
exFreePool(Datagram->Header); exFreePool(Datagram.Header);
TI_DbgPrint(MAX_TRACE, ("Freeing datagram at (0x%X).\n", Datagram)); TI_DbgPrint(MAX_TRACE, ("Freeing datagram at (0x%X).\n", Datagram));
(*Datagram->Free)(Datagram); (*Datagram.Free)(&Datagram);
} else } else
TcpipReleaseSpinLock(&IPDR->Lock, OldIrql); TcpipReleaseSpinLock(&IPDR->Lock, OldIrql);
} }