79abc3d9dc0ffa3bbcc013a6e05f8b3534300e12
[cascardo/ovs.git] / datapath-windows / ovsext / BufferMgmt.h
1 /*
2  * Copyright (c) 2014 VMware, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef __BUFFER_MGMT_H_
18 #define __BUFFER_MGMT_H_ 1
19
20 #define MEM_ALIGN                       MEMORY_ALLOCATION_ALIGNMENT
21 #define MEM_ALIGN_SIZE(_x)  ((MEM_ALIGN - 1 + (_x))/MEM_ALIGN * MEM_ALIGN)
22 #define OVS_CTX_MAGIC                   0xabcd
23
24 #define OVS_DEFAULT_NBL_CONTEXT_SIZE    MEM_ALIGN_SIZE(64)
25 #define OVS_DEFAULT_NBL_CONTEXT_FILL    \
26       (OVS_DEFAULT_NBL_CONTEXT_SIZE - sizeof (OVS_BUFFER_CONTEXT))
27
28 #define OVS_DEFAULT_DATA_SIZE           256
29 #define OVS_DEFAULT_HEADROOM_SIZE       128
30 #define OVS_FIX_NBL_DATA_SIZE    (OVS_DEFAULT_DATA_SIZE + OVS_DEFAULT_HEADROOM_SIZE)
31
32 /* Default we copy 18 bytes, to make sure ethernet header and vlan is in
33  * continuous buffer */
34 #define OVS_DEFAULT_COPY_SIZE          18
35
36 enum {
37     OVS_BUFFER_NEED_COMPLETE            = BIT16(0),
38     OVS_BUFFER_PRIVATE_MDL              = BIT16(1),
39     OVS_BUFFER_PRIVATE_DATA             = BIT16(2),
40     OVS_BUFFER_PRIVATE_NET_BUFFER       = BIT16(3),
41     OVS_BUFFER_PRIVATE_FORWARD_CONTEXT  = BIT16(4),
42     OVS_BUFFER_PRIVATE_CONTEXT          = BIT16(5),
43     OVS_BUFFER_FROM_FIX_SIZE_POOL       = BIT16(6),
44     OVS_BUFFER_FROM_ZERO_SIZE_POOL      = BIT16(7),
45     OVS_BUFFER_FROM_NBL_ONLY_POOL       = BIT16(8),
46     OVS_BUFFER_RECV_BUFFER              = BIT16(9),
47     OVS_BUFFER_SEND_BUFFER              = BIT16(10),
48     OVS_BUFFER_FRAGMENT                 = BIT16(11),
49 };
50
51 typedef union _OVS_BUFFER_CONTEXT {
52     struct {
53         UINT16 magic;
54         UINT16 flags;
55         UINT32 srcPortNo;
56         UINT32 refCount;
57         union {
58             UINT32 origDataLength;
59             UINT32 dataOffsetDelta;
60         };
61     };
62
63     UINT64 value[MEM_ALIGN_SIZE(16) >> 3];
64 } OVS_BUFFER_CONTEXT, *POVS_BUFFER_CONTEXT;
65
66
67 typedef struct _OVS_NBL_POOL {
68     NDIS_SWITCH_CONTEXT ndisContext;
69     NDIS_HANDLE   ndisHandle;
70     NDIS_HANDLE   fixSizePool;   // data size of 256
71     NDIS_HANDLE   zeroSizePool;  // no data, NBL + NB + Context
72     NDIS_HANDLE   nblOnlyPool;   // NBL + context for clone
73     NDIS_HANDLE   nbPool;        // NB for clone
74 #ifdef DBG
75     LONG          fixNBLCount;
76     LONG          zeroNBLCount;
77     LONG          nblOnlyCount;
78     LONG          nbCount;
79     LONG          sysNBLCount;
80     LONG          fragNBLCount;
81 #endif
82 } OVS_NBL_POOL, *POVS_NBL_POOL;
83
84
85 NDIS_STATUS OvsInitBufferPool(PVOID context);
86 VOID OvsCleanupBufferPool(PVOID context);
87
88 PNET_BUFFER_LIST OvsAllocateFixSizeNBL(PVOID context,
89                                        UINT32 size,
90                                        UINT32 headRoom);
91 PNET_BUFFER_LIST OvsAllocateVariableSizeNBL(PVOID context,
92                                             UINT32 size,
93                                             UINT32 headRoom);
94
95 POVS_BUFFER_CONTEXT OvsInitExternalNBLContext(PVOID context,
96                                               PNET_BUFFER_LIST nbl,
97                                               BOOLEAN isRecv);
98
99 PNET_BUFFER_LIST OvsPartialCopyNBL(PVOID context,
100                                    PNET_BUFFER_LIST nbl,
101                                    UINT32 copySize,
102                                    UINT32 headRoom,
103                                    BOOLEAN copyNblInfo);
104 PNET_BUFFER_LIST OvsPartialCopyToMultipleNBLs(PVOID context,
105                                               PNET_BUFFER_LIST nbl,
106                                               UINT32 copySize,
107                                               UINT32 headRoom,
108                                               BOOLEAN copyNblInfo);
109 PNET_BUFFER_LIST OvsFullCopyNBL(PVOID context, PNET_BUFFER_LIST nbl,
110                                 UINT32 headRoom, BOOLEAN copyNblInfo);
111 PNET_BUFFER_LIST OvsTcpSegmentNBL(PVOID context,
112                                   PNET_BUFFER_LIST nbl,
113                                   POVS_PACKET_HDR_INFO hdrInfo,
114                                   UINT32 MSS,
115                                   UINT32 headRoom);
116 PNET_BUFFER_LIST OvsAllocateNBLFromBuffer(PVOID context,
117                                           PVOID buffer,
118                                           ULONG length);
119 PNET_BUFFER_LIST OvsFullCopyToMultipleNBLs(PVOID context,
120     PNET_BUFFER_LIST nbl, UINT32 headRoom, BOOLEAN copyNblInfo);
121 PNET_BUFFER_LIST OvsCompleteNBL(PVOID context, PNET_BUFFER_LIST nbl,
122                                 BOOLEAN updateRef);
123 NDIS_STATUS OvsSetCtxSourcePortNo(PNET_BUFFER_LIST nbl, UINT32 portNo);
124
125 NDIS_STATUS OvsGetCtxSourcePortNo(PNET_BUFFER_LIST nbl, UINT32 *portNo);
126
127 #endif /* __BUFFER_MGMT_H_ */