Implement NdisAllocatePacketPool by calling NdisAllocatePacketPoolEx.
[reactos.git] / reactos / drivers / net / ndis / ndis / buffer.c
index 5beda94..9891314 100644 (file)
@@ -34,7 +34,7 @@ __inline ULONG SkipToOffset(
     for (;;) {
 
         if (!Buffer)
-            return -1;
+            return 0xFFFFFFFF;
 
         NdisQueryBuffer(Buffer, (PVOID)Data, Size);
 
@@ -77,7 +77,7 @@ UINT CopyBufferToBufferChain(
     NDIS_DbgPrint(MAX_TRACE, ("DstBuffer (0x%X)  DstOffset (0x%X)  SrcData (0x%X)  Length (%d)\n", DstBuffer, DstOffset, SrcData, Length));
 
     /* Skip DstOffset bytes in the destination buffer chain */
-    if (SkipToOffset(DstBuffer, DstOffset, &DstData, &DstSize) == -1)
+    if (SkipToOffset(DstBuffer, DstOffset, &DstData, &DstSize) == 0xFFFFFFFF)
         return 0;
 
     /* Start copying the data */
@@ -134,7 +134,7 @@ UINT CopyBufferChainToBuffer(
     NDIS_DbgPrint(MAX_TRACE, ("DstData 0x%X  SrcBuffer 0x%X  SrcOffset 0x%X  Length %d\n",DstData,SrcBuffer, SrcOffset, Length));
 
     /* Skip SrcOffset bytes in the source buffer chain */
-    if (SkipToOffset(SrcBuffer, SrcOffset, &SrcData, &SrcSize) == -1)
+    if (SkipToOffset(SrcBuffer, SrcOffset, &SrcData, &SrcSize) == 0xFFFFFFFF)
         return 0;
 
     /* Start copying the data */
@@ -234,11 +234,11 @@ UINT CopyPacketToBufferChain(
 
     /* Skip DstOffset bytes in the destination buffer chain */
     NdisQueryBuffer(DstBuffer, (PVOID)&DstData, &DstSize);
-    if (SkipToOffset(DstBuffer, DstOffset, &DstData, &DstSize) == -1)
+    if (SkipToOffset(DstBuffer, DstOffset, &DstData, &DstSize) == 0xFFFFFFFF)
         return 0;
     /* Skip SrcOffset bytes in the source packet */
     NdisGetFirstBufferFromPacket(SrcPacket, &SrcBuffer, (PVOID)&SrcData, &SrcSize, &Total);
-    if (SkipToOffset(SrcBuffer, SrcOffset, &SrcData, &SrcSize) == -1)
+    if (SkipToOffset(SrcBuffer, SrcOffset, &SrcData, &SrcSize) == 0xFFFFFFFF)
         return 0;
     /* Copy the data */
     for (Total = 0;;) {
@@ -469,6 +469,12 @@ NdisAllocatePacket(
     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) {
@@ -508,40 +514,12 @@ NdisAllocatePacketPool(
  *     ProtocolReservedLength = Size of protocol reserved area in bytes
  */
 {
-    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));
-
-    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;
+    NdisAllocatePacketPoolEx(
+        Status,
+        PoolHandle,
+        NumberOfDescriptors,
+        0,
+        ProtocolReservedLength);
 }
 
 
@@ -563,7 +541,57 @@ NdisAllocatePacketPoolEx(
  *    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;
+    }
 }
 
 
@@ -669,12 +697,12 @@ NdisCopyFromPacketToPacket(
 
     /* Skip DestinationOffset bytes in the destination packet */
     NdisGetFirstBufferFromPacket(Destination, &DstBuffer, (PVOID)&DstData, &DstSize, &Total);
-    if (SkipToOffset(DstBuffer, DestinationOffset, &DstData, &DstSize) == -1)
+    if (SkipToOffset(DstBuffer, DestinationOffset, &DstData, &DstSize) == 0xFFFFFFFF)
         return;
 
     /* Skip SourceOffset bytes in the source packet */
     NdisGetFirstBufferFromPacket(Source, &SrcBuffer, (PVOID)&SrcData, &SrcSize, &Total);
-    if (SkipToOffset(SrcBuffer, SourceOffset, &SrcData, &SrcSize) == -1)
+    if (SkipToOffset(SrcBuffer, SourceOffset, &SrcData, &SrcSize) == 0xFFFFFFFF)
         return;
 
     /* Copy the data */