- 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 */
BOOLEAN IPInitialized = FALSE;
BOOLEAN IpWorkItemQueued = FALSE;
NPAGED_LOOKASIDE_LIST IPPacketList;
/* Work around calling timer at Dpc level */
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(
PVOID Object)
/*
@ -58,34 +44,6 @@ VOID FreeIF(
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 IPPacket,
ULONG Type)
@ -415,15 +373,6 @@ NTSTATUS IPStartup(PUNICODE_STRING RegistryPath)
TAG('I','P','D','R'), /* Tag */
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(
&IPFragmentList, /* Lookaside list */
NULL, /* Allocate routine */
@ -491,7 +440,6 @@ NTSTATUS IPShutdown(
/* Destroy lookaside lists */
ExDeleteNPagedLookasideList(&IPHoleList);
ExDeleteNPagedLookasideList(&IPDRList);
ExDeleteNPagedLookasideList(&IPPacketList);
ExDeleteNPagedLookasideList(&IPFragmentList);
IPInitialized = FALSE;

View file

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