Implemented (copied from NdisAllocatePacketPool)
NdisAllocatePacketPoolEx.
Modified: trunk/reactos/drivers/net/ndis/ndis/buffer.c
_____
Modified: trunk/reactos/drivers/net/ndis/ndis/buffer.c
--- trunk/reactos/drivers/net/ndis/ndis/buffer.c 2005-08-11
20:13:26 UTC (rev 17302)
+++ trunk/reactos/drivers/net/ndis/ndis/buffer.c 2005-08-11
20:16:03 UTC (rev 17303)
@@ -469,6 +469,12 @@
NDIS_DbgPrint(MAX_TRACE, ("Status (0x%X) Packet (0x%X) PoolHandle
(0x%X).\n",
Status, Packet, PoolHandle));
+ if (Pool == NULL)
+ {
+ *Status = NDIS_STATUS_FAILURE;
+ return;
+ }
+
KeAcquireSpinLock(&Pool->SpinLock.SpinLock, &OldIrql);
if (Pool->FreeList) {
@@ -563,7 +569,57 @@
* NDIS 5.0
*/
{
- UNIMPLEMENTED
+ PNDIS_PACKET_POOL Pool;
+ UINT Size, Length, i;
+ PNDIS_PACKET Packet, NextPacket;
+
+ NDIS_DbgPrint(MAX_TRACE, ("Status (0x%X) PoolHandle (0x%X) "
+ "NumberOfDescriptors (%d) ProtocolReservedLength (%d).\n",
+ Status, PoolHandle, NumberOfDescriptors,
ProtocolReservedLength));
+
+ if (NumberOfDescriptors > 0xffff)
+ {
+ *Status = NDIS_STATUS_RESOURCES;
+ }
+ else
+ {
+ NumberOfDescriptors += NumberOfOverflowDescriptors;
+ if (NumberOfDescriptors > 0xffff)
+ {
+ NumberOfDescriptors = 0xffff;
+ }
+
+ Length = sizeof(NDIS_PACKET) + ProtocolReservedLength;
+ Size = sizeof(NDIS_PACKET_POOL) + Length *
NumberOfDescriptors;
+
+ Pool = ExAllocatePool(NonPagedPool, Size);
+ if (Pool)
+ {
+ KeInitializeSpinLock(&Pool->SpinLock.SpinLock);
+ Pool->PacketLength = Length;
+
+ if (NumberOfDescriptors > 0)
+ {
+ Packet = (PNDIS_PACKET)&Pool->Buffer;
+ Pool->FreeList = Packet;
+
+ NextPacket = (PNDIS_PACKET)((ULONG_PTR)Packet +
Length);
+ for (i = 1; i < NumberOfDescriptors; i++)
+ {
+ Packet->Private.Head = (PNDIS_BUFFER)NextPacket;
+ Packet = NextPacket;
+ NextPacket =
(PNDIS_PACKET)((ULONG_PTR)Packet + Length);
+ }
+ Packet->Private.Head = NULL;
+ }
+ else
+ Pool->FreeList = NULL;
+
+ *Status = NDIS_STATUS_SUCCESS;
+ *PoolHandle = (PNDIS_HANDLE)Pool;
+ } else
+ *Status = NDIS_STATUS_RESOURCES;
+ }
}