mirror of
https://github.com/reactos/reactos.git
synced 2024-10-03 16:05:37 +00:00
- Allocate IP_PACKET on the stack
- Reduces non-paged memory consumption svn path=/trunk/; revision=41698
This commit is contained in:
parent
44ab91c5e6
commit
6bed52e321
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue