2 * Copyright (c) 2014 VMware, Inc.
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:
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #ifndef __BUFFER_MGMT_H_
18 #define __BUFFER_MGMT_H_ 1
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
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))
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)
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
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),
51 typedef union _OVS_BUFFER_CONTEXT {
58 UINT32 origDataLength;
59 UINT32 dataOffsetDelta;
63 UINT64 value[MEM_ALIGN_SIZE(16) >> 3];
64 } OVS_BUFFER_CONTEXT, *POVS_BUFFER_CONTEXT;
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
82 } OVS_NBL_POOL, *POVS_NBL_POOL;
85 NDIS_STATUS OvsInitBufferPool(PVOID context);
86 VOID OvsCleanupBufferPool(PVOID context);
88 PNET_BUFFER_LIST OvsAllocateFixSizeNBL(PVOID context,
91 PNET_BUFFER_LIST OvsAllocateVariableSizeNBL(PVOID context,
95 POVS_BUFFER_CONTEXT OvsInitExternalNBLContext(PVOID context,
99 PNET_BUFFER_LIST OvsPartialCopyNBL(PVOID context,
100 PNET_BUFFER_LIST nbl,
103 BOOLEAN copyNblInfo);
104 PNET_BUFFER_LIST OvsPartialCopyToMultipleNBLs(PVOID context,
105 PNET_BUFFER_LIST nbl,
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,
116 PNET_BUFFER_LIST OvsFullCopyToMultipleNBLs(PVOID context,
117 PNET_BUFFER_LIST nbl, UINT32 headRoom, BOOLEAN copyNblInfo);
118 PNET_BUFFER_LIST OvsCompleteNBL(PVOID context, PNET_BUFFER_LIST nbl,
120 NDIS_STATUS OvsSetCtxSourcePortNo(PNET_BUFFER_LIST nbl, UINT32 portNo);
122 NDIS_STATUS OvsGetCtxSourcePortNo(PNET_BUFFER_LIST nbl, UINT32 *portNo);
124 #endif /* __BUFFER_MGMT_H_ */