- Get NDIS (almost) compiling with msvc/ddk.
[reactos.git] / reactos / drivers / net / ndis / ndis / buffer.c
index 20e40e1..90d8676 100644 (file)
@@ -8,14 +8,14 @@
  *   CSH 01/08-2000 Created
  */
 
-#include <buffer.h>
+#include <ndissys.h>
 
 
 __inline ULONG SkipToOffset(
-    PNDIS_BUFFER Buffer,
-    UINT Offset,
-    PUCHAR *Data,
-    PUINT Size)
+    IN PNDIS_BUFFER Buffer,
+    IN UINT Offset,
+    IN OUT PUCHAR *Data,
+    IN OUT PUINT Size)
 /*
  * FUNCTION: Skips Offset bytes into a buffer chain
  * ARGUMENTS:
@@ -237,7 +237,7 @@ UINT CopyPacketToBufferChain(
     if (SkipToOffset(DstBuffer, DstOffset, &DstData, &DstSize) == 0xFFFFFFFF)
         return 0;
     /* Skip SrcOffset bytes in the source packet */
-    NdisGetFirstBufferFromPacket(SrcPacket, &SrcBuffer, (PVOID)&SrcData, &SrcSize, &Total);
+    NdisGetFirstBufferFromPacket(SrcPacket, &SrcBuffer, (PVOID*)&SrcData, &SrcSize, &Total);
     if (SkipToOffset(SrcBuffer, SrcOffset, &SrcData, &SrcSize) == 0xFFFFFFFF)
         return 0;
     /* Copy the data */
@@ -287,6 +287,7 @@ UINT CopyPacketToBufferChain(
 /*
  * @implemented
  */
+#undef NdisAdjustBufferLength
 VOID
 EXPORT
 NdisAdjustBufferLength(
@@ -306,6 +307,7 @@ NdisAdjustBufferLength(
 /*
  * @implemented
  */
+#undef NDIS_BUFFER_TO_SPAN_PAGES
 ULONG
 EXPORT
 NDIS_BUFFER_TO_SPAN_PAGES(
@@ -346,49 +348,16 @@ NdisAllocateBuffer(
  *     Length         = Number of bytes in data buffer
  */
 {
-    KIRQL OldIrql;
-    PNETWORK_HEADER Temp;
-    PNDIS_BUFFER_POOL Pool = (PNDIS_BUFFER_POOL)PoolHandle;
-
-    NDIS_DbgPrint(MAX_TRACE, ("Status (0x%X)  Buffer (0x%X)  PoolHandle (0x%X)  "
-        "VirtualAddress (0x%X)  Length (%d)\n",
-        Status, Buffer, PoolHandle, VirtualAddress, Length));
-
-#if 0
-    Temp = Pool->FreeList;
-    while( Temp ) {
-       NDIS_DbgPrint(MID_TRACE,("Free buffer -> %x\n", Temp));
-       Temp = Temp->Next;
-    }
-
-    NDIS_DbgPrint(MID_TRACE,("|:. <- End free buffers"));
-#endif
-
-    if(!VirtualAddress && !Length) return;
-
-    KeAcquireSpinLock(&Pool->SpinLock, &OldIrql);
-
-    if (Pool->FreeList) {
-        Temp           = Pool->FreeList;
-        Pool->FreeList = Temp->Next;
-
-        KeReleaseSpinLock(&Pool->SpinLock, OldIrql);
-
-        Temp->Next = NULL;
-
-        MmInitializeMdl(&Temp->Mdl, VirtualAddress, Length);
-        Temp->Mdl.MdlFlags      |= (MDL_SOURCE_IS_NONPAGED_POOL | MDL_ALLOCATED_FIXED_SIZE);
-        Temp->Mdl.MappedSystemVa = VirtualAddress;
-
-        Temp->BufferPool = Pool;
-
-        *Buffer = (PNDIS_BUFFER)Temp;
+    ASSERT(VirtualAddress != NULL);
+    ASSERT(Length > 0);
+    
+    *Buffer = IoAllocateMdl(VirtualAddress, Length, FALSE, FALSE, NULL);
+    if (*Buffer != NULL) {
+        MmBuildMdlForNonPagedPool(*Buffer);
+        (*Buffer)->Next = NULL;
         *Status = NDIS_STATUS_SUCCESS;
     } else {
-        KeReleaseSpinLock(&Pool->SpinLock, OldIrql);
         *Status = NDIS_STATUS_FAILURE;
-       NDIS_DbgPrint(MID_TRACE, ("Can't get another packet.\n"));
-       KeBugCheck(0);
     }
 }
 
@@ -410,38 +379,8 @@ NdisAllocateBufferPool(
  *     NumberOfDescriptors = Size of buffer pool in number of descriptors
  */
 {
-    UINT i;
-    PNDIS_BUFFER_POOL Pool;
-    PNETWORK_HEADER Buffer;
-
-    NDIS_DbgPrint(MAX_TRACE, ("Status (0x%X)  PoolHandle (0x%X)  NumberOfDescriptors (%d).\n",
-        Status, PoolHandle, NumberOfDescriptors));
-
-    Pool = ExAllocatePool(NonPagedPool,
-                          sizeof(NDIS_BUFFER_POOL) +
-                          sizeof(NETWORK_HEADER)   *
-                          NumberOfDescriptors);
-    if (Pool) {
-        KeInitializeSpinLock(&Pool->SpinLock);
-
-        if (NumberOfDescriptors > 0) {
-            Buffer             = &Pool->Buffers[0];
-           NDIS_DbgPrint(MAX_TRACE, ("NDIS BUFFER ADDRESS << %x >>\n", Buffer));
-            Pool->FreeList     = Buffer;
-            for (i = 1; i < NumberOfDescriptors; i++) {
-                Buffer->Next = &Pool->Buffers[i];
-                Buffer       = Buffer->Next;
-               NDIS_DbgPrint(MAX_TRACE, ("NDIS BUFFER ADDRESS << %x >>\n",
-                             Buffer));
-            }
-            Buffer->Next = NULL;
-        } else
-            Pool->FreeList = NULL;
-
-        *Status     = NDIS_STATUS_SUCCESS;
-        *PoolHandle = (PNDIS_HANDLE)Pool;
-    } else
-        *Status = NDIS_STATUS_RESOURCES;
+    *Status = NDIS_STATUS_SUCCESS;
+    *PoolHandle = 0;
 }
 
 
@@ -464,11 +403,17 @@ NdisAllocatePacket(
 {
     KIRQL OldIrql;
     PNDIS_PACKET Temp;
-    PNDIS_PACKET_POOL Pool = (PNDIS_PACKET_POOL)PoolHandle;
+    PNDISI_PACKET_POOL Pool = (PNDISI_PACKET_POOL)PoolHandle;
 
     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 +453,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,13 +480,64 @@ NdisAllocatePacketPoolEx(
  *    NDIS 5.0
  */
 {
-    UNIMPLEMENTED
+    PNDISI_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(NDISI_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;
+    }
 }
 
 
 /*
  * @implemented
  */
+#undef NdisBufferLength
 ULONG
 EXPORT
 NdisBufferLength(
@@ -585,13 +553,14 @@ NdisBufferLength(
  *     Length of NDIS buffer
  */
 {
-    return Buffer->ByteCount;
+    return MmGetMdlByteCount(Buffer);
 }
 
 
 /*
- * @unimplemented
+ * @implemented
  */
+#undef NdisBufferVirtualAddress
 PVOID
 EXPORT
 NdisBufferVirtualAddress(
@@ -603,9 +572,7 @@ NdisBufferVirtualAddress(
  *    NDIS 5.0
  */
 {
-    UNIMPLEMENTED
-
-    return NULL;
+    return MmGetSystemAddressForMdl(Buffer);
 }
 
 
@@ -668,12 +635,12 @@ NdisCopyFromPacketToPacket(
     *BytesCopied = 0;
 
     /* Skip DestinationOffset bytes in the destination packet */
-    NdisGetFirstBufferFromPacket(Destination, &DstBuffer, (PVOID)&DstData, &DstSize, &Total);
+    NdisGetFirstBufferFromPacket(Destination, &DstBuffer, (PVOID*)&DstData, &DstSize, &Total);
     if (SkipToOffset(DstBuffer, DestinationOffset, &DstData, &DstSize) == 0xFFFFFFFF)
         return;
 
     /* Skip SourceOffset bytes in the source packet */
-    NdisGetFirstBufferFromPacket(Source, &SrcBuffer, (PVOID)&SrcData, &SrcSize, &Total);
+    NdisGetFirstBufferFromPacket(Source, &SrcBuffer, (PVOID*)&SrcData, &SrcSize, &Total);
     if (SkipToOffset(SrcBuffer, SourceOffset, &SrcData, &SrcSize) == 0xFFFFFFFF)
         return;
 
@@ -807,7 +774,6 @@ NdisFreeBufferPool(
  *     PoolHandle = Handle returned by NdisAllocateBufferPool
  */
 {
-    ExFreePool((PVOID)PoolHandle);
 }
 
 
@@ -831,6 +797,7 @@ NdisFreePacketPool(
 /*
  * @implemented
  */
+#undef NdisFreeBuffer
 VOID
 EXPORT
 NdisFreeBuffer(
@@ -841,18 +808,7 @@ NdisFreeBuffer(
  *     Buffer = Pointer to buffer descriptor
  */
 {
-    KIRQL OldIrql;
-    PNDIS_BUFFER_POOL Pool;
-    PNETWORK_HEADER Temp = (PNETWORK_HEADER)Buffer;
-
-    NDIS_DbgPrint(MAX_TRACE, ("Buffer (0x%X).\n", Buffer));
-
-    Pool = Temp->BufferPool;
-
-    KeAcquireSpinLock(&Pool->SpinLock, &OldIrql);
-    Temp->Next     = (PNETWORK_HEADER)Pool->FreeList;
-    Pool->FreeList = (PNETWORK_HEADER)Temp;
-    KeReleaseSpinLock(&Pool->SpinLock, OldIrql);
+    IoFreeMdl(Buffer);
 }
 
 
@@ -873,16 +829,17 @@ NdisFreePacket(
 
     NDIS_DbgPrint(MAX_TRACE, ("Packet (0x%X).\n", Packet));
 
-    KeAcquireSpinLock(&Packet->Private.Pool->SpinLock.SpinLock, &OldIrql);
-    Packet->Private.Head           = (PNDIS_BUFFER)Packet->Private.Pool->FreeList;
-    Packet->Private.Pool->FreeList = Packet;
-    KeReleaseSpinLock(&Packet->Private.Pool->SpinLock.SpinLock, OldIrql);
+    KeAcquireSpinLock(&((NDISI_PACKET_POOL*)Packet->Private.Pool)->SpinLock.SpinLock, &OldIrql);
+    Packet->Private.Head           = (PNDIS_BUFFER)((NDISI_PACKET_POOL*)Packet->Private.Pool)->FreeList;
+    ((NDISI_PACKET_POOL*)Packet->Private.Pool)->FreeList = Packet;
+    KeReleaseSpinLock(&((NDISI_PACKET_POOL*)Packet->Private.Pool)->SpinLock.SpinLock, OldIrql);
 }
 
 
 /*
  * @implemented
  */
+#undef NdisGetBufferPhysicalArraySize
 VOID
 EXPORT
 NdisGetBufferPhysicalArraySize(
@@ -905,6 +862,7 @@ NdisGetBufferPhysicalArraySize(
 /*
  * @implemented
  */
+#undef NdisGetFirstBufferFromPacket
 VOID
 EXPORT
 NdisGetFirstBufferFromPacket(
@@ -986,6 +944,7 @@ NdisPacketPoolUsage(
 /*
  * @implemented
  */
+#undef NdisQueryBuffer
 VOID
 EXPORT
 NdisQueryBuffer(
@@ -1011,6 +970,7 @@ NdisQueryBuffer(
 /*
  * @implemented
  */
+#undef NdisQueryBufferSafe
 VOID
 EXPORT
 NdisQueryBufferSafe(
@@ -1034,6 +994,7 @@ NdisQueryBufferSafe(
 /*
  * @implemented
  */
+#undef NdisQueryBufferOffset
 VOID
 EXPORT
 NdisQueryBufferOffset(