mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 17:05:45 +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
2 changed files with 16 additions and 68 deletions
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue