summaryrefslogtreecommitdiff
path: root/datapath-windows/ovsext/BufferMgmt.h
blob: 90d2360f7827ffa29acae5f048faf58e3f2d6d8b (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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*
 * Copyright (c) 2014, 2016 VMware, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __BUFFER_MGMT_H_
#define __BUFFER_MGMT_H_ 1

#define MEM_ALIGN                       MEMORY_ALLOCATION_ALIGNMENT
#define MEM_ALIGN_SIZE(_x)  ((MEM_ALIGN - 1 + (_x))/MEM_ALIGN * MEM_ALIGN)
#define OVS_CTX_MAGIC                   0xabcd
#define OVS_DEFAULT_NBL_CONTEXT_SIZE    sizeof(OVS_BUFFER_CONTEXT)
#define OVS_DEFAULT_NBL_CONTEXT_FILL    0
#define OVS_DEFAULT_DATA_SIZE           256
#define OVS_DEFAULT_HEADROOM_SIZE       128
#define OVS_FIX_NBL_DATA_SIZE    (OVS_DEFAULT_DATA_SIZE + OVS_DEFAULT_HEADROOM_SIZE)
#define OVS_IPV6_OPT_LEN(p)             (((p)->hdrExtLen+1) << 3)
#define OVS_FRAG_MAGIC_NUMBER           0x8088405



/* Default we copy 18 bytes, to make sure ethernet header and vlan is in
 * continuous buffer */
#define OVS_DEFAULT_COPY_SIZE          18

enum {
    OVS_BUFFER_NEED_COMPLETE            = BIT16(0),
    OVS_BUFFER_PRIVATE_MDL              = BIT16(1),
    OVS_BUFFER_PRIVATE_DATA             = BIT16(2),
    OVS_BUFFER_PRIVATE_NET_BUFFER       = BIT16(3),
    OVS_BUFFER_PRIVATE_FORWARD_CONTEXT  = BIT16(4),
    OVS_BUFFER_PRIVATE_CONTEXT          = BIT16(5),
    OVS_BUFFER_FROM_FIX_SIZE_POOL       = BIT16(6),
    OVS_BUFFER_FROM_ZERO_SIZE_POOL      = BIT16(7),
    OVS_BUFFER_FROM_NBL_ONLY_POOL       = BIT16(8),
    OVS_BUFFER_RECV_BUFFER              = BIT16(9),
    OVS_BUFFER_SEND_BUFFER              = BIT16(10),
    OVS_BUFFER_FRAGMENT                 = BIT16(11),
};

typedef union _OVS_BUFFER_CONTEXT {
    struct dummy {
        UINT16 magic;
        UINT16 flags;
        UINT32 srcPortNo;
        UINT32 refCount;
        union {
            UINT32 origDataLength;
            UINT32 dataOffsetDelta;
        };
        ULONG sendFlags;
        UINT16 mru;
        UINT16 pendingSend; /* Indicates packet can be sent or not. */
    };

    CHAR value[MEM_ALIGN_SIZE(sizeof(struct dummy))];
} OVS_BUFFER_CONTEXT, *POVS_BUFFER_CONTEXT;

typedef struct _OVS_NBL_POOL {
    NDIS_SWITCH_CONTEXT ndisContext;
    NDIS_HANDLE   ndisHandle;
    NDIS_HANDLE   fixSizePool;   // data size of 256
    NDIS_HANDLE   zeroSizePool;  // no data, NBL + NB + Context
    NDIS_HANDLE   nblOnlyPool;   // NBL + context for clone
    NDIS_HANDLE   nbPool;        // NB for clone
#ifdef DBG
    LONG          fixNBLCount;
    LONG          zeroNBLCount;
    LONG          nblOnlyCount;
    LONG          nbCount;
    LONG          sysNBLCount;
    LONG          fragNBLCount;
#endif
} OVS_NBL_POOL, *POVS_NBL_POOL;


NDIS_STATUS OvsInitBufferPool(PVOID context);

VOID OvsCleanupBufferPool(PVOID context);

PNET_BUFFER_LIST OvsAllocateFixSizeNBL(PVOID context,
                                       UINT32 size,
                                       UINT32 headRoom);

PNET_BUFFER_LIST OvsAllocateVariableSizeNBL(PVOID context,
                                            UINT32 size,
                                            UINT32 headRoom);

POVS_BUFFER_CONTEXT OvsInitExternalNBLContext(PVOID context,
                                              PNET_BUFFER_LIST nbl,
                                              BOOLEAN isRecv);

PNET_BUFFER_LIST OvsPartialCopyNBL(PVOID context,
                                   PNET_BUFFER_LIST nbl,
                                   UINT32 copySize,
                                   UINT32 headRoom,
                                   BOOLEAN copyNblInfo);
PNET_BUFFER_LIST OvsPartialCopyToMultipleNBLs(PVOID context,
                                              PNET_BUFFER_LIST nbl,
                                              UINT32 copySize,
                                              UINT32 headRoom,
                                              BOOLEAN copyNblInfo);

PNET_BUFFER_LIST OvsFullCopyNBL(PVOID context, PNET_BUFFER_LIST nbl,
                                UINT32 headRoom, BOOLEAN copyNblInfo);

PNET_BUFFER_LIST OvsTcpSegmentNBL(PVOID context,
                                  PNET_BUFFER_LIST nbl,
                                  POVS_PACKET_HDR_INFO hdrInfo,
                                  UINT32 MSS,
                                  UINT32 headRoom,
                                  BOOLEAN isIpFragment);

PNET_BUFFER_LIST OvsFragmentNBL(PVOID context,
                                PNET_BUFFER_LIST nbl,
                                POVS_PACKET_HDR_INFO hdrInfo,
                                UINT32 MSS,
                                UINT32 headRoom,
                                BOOLEAN isIpFragment);

PNET_BUFFER_LIST OvsAllocateNBLFromBuffer(PVOID context,
                                          PVOID buffer,
                                          ULONG length);

PNET_BUFFER_LIST OvsFullCopyToMultipleNBLs(PVOID context, PNET_BUFFER_LIST nbl,
                                           UINT32 headRoom,
                                           BOOLEAN copyNblInfo);

PNET_BUFFER_LIST OvsCompleteNBL(PVOID context, PNET_BUFFER_LIST nbl,
                                BOOLEAN updateRef);

NDIS_STATUS OvsSetCtxSourcePortNo(PNET_BUFFER_LIST nbl, UINT32 portNo);

NDIS_STATUS OvsGetCtxSourcePortNo(PNET_BUFFER_LIST nbl, UINT32 *portNo);

NTSTATUS OvsCreateNewNBLsFromMultipleNBs(PVOID context,
                                         PNET_BUFFER_LIST *curNbl,
                                         PNET_BUFFER_LIST *lastNbl);

#endif /* __BUFFER_MGMT_H_ */