summaryrefslogtreecommitdiff
path: root/network/netadaptercx/netvadapterlibrary/code/memory.h
blob: 4c19fc392c357cd9e5eede5d557b00e26b4da526 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// Copyright (C) Microsoft Corporation. All rights reserved.
#pragma once

#define MAX_RX_BUFFER_SIZE 65535

#if ((NETADAPTER_VERSION_MAJOR == 2) && (NETADAPTER_VERSION_MINOR >= 6))

static const size_t PREALLOCATED_BUFFERS_COUNT = 128;

struct MemoryBuffer
{
    NET_MEMORY_ID
        MemoryId;
    
    BYTE
        VirtualAddress[MAX_RX_BUFFER_SIZE];
};

class Memory
{
public:

    NTSTATUS
    Initialize(
        NETMEMORYCOLLECTION MemoryCollection,
        size_t BufferSize
    );

    MemoryBuffer*
    PopAvailableBuffer(
        void
    );

    void
    ReturnBuffer(
        MemoryBuffer* Buffer
    );

    void
    ReleaseAllMappings(
        void
    );

private:
    NETMEMORYCOLLECTION
        m_memoryCollection;

    MemoryBuffer
        m_buffers[PREALLOCATED_BUFFERS_COUNT];

    MemoryBuffer*
        m_buffersReadyToUse[PREALLOCATED_BUFFERS_COUNT];

    size_t
        m_lastBufferToUse;

    WDFSPINLOCK
        m_spinLock{};
};

WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(Memory, GetMemoryFromHandle);
#endif //NETCX 2.6 only