]>
Commit | Line | Data |
---|---|---|
c803536e SS |
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 | /* | |
18 | * This file contains the definition of the switch object for the OVS. | |
19 | */ | |
20 | ||
21 | #ifndef __OVS_SWITCH_H_ | |
22 | #define __OVS_SWITCH_H_ 1 | |
23 | ||
24 | #include "OvsNetProto.h" | |
25 | #include "OvsBufferMgmt.h" | |
26 | #define OVS_MAX_VPORT_ARRAY_SIZE 1024 | |
27 | ||
28 | #define OVS_VPORT_MASK (OVS_MAX_VPORT_ARRAY_SIZE - 1) | |
29 | ||
30 | #define OVS_INTERNAL_VPORT_DEFAULT_INDEX 0 | |
31 | ||
32 | //Tunnel port indicies | |
33 | #define RESERVED_START_INDEX1 1 | |
34 | #define OVS_TUNNEL_INDEX_START RESERVED_START_INDEX1 | |
35 | #define OVS_VXLAN_VPORT_INDEX 2 | |
36 | #define OVS_GRE_VPORT_INDEX 3 | |
37 | #define OVS_GRE64_VPORT_INDEX 4 | |
38 | #define OVS_TUNNEL_INDEX_END OVS_GRE64_VPORT_INDEX | |
39 | ||
40 | #define OVS_EXTERNAL_VPORT_START 8 | |
41 | #define OVS_EXTERNAL_VPORT_END 40 | |
42 | #define OVS_INTERNAL_VPORT_START 40 | |
43 | #define OVS_INTERNAL_VPOR_END 72 | |
44 | #define OVS_VM_VPORT_START 72 | |
45 | #define OVS_VM_VPORT_MAX 0xffff | |
46 | #define OVS_VPORT_INDEX(_portNo) ((_portNo) & 0xffffff) | |
47 | #define OVS_VPORT_PORT_NO(_index, _gen) \ | |
48 | (((_index) & 0xffffff) | ((UINT32)(_gen) << 24)) | |
49 | #define OVS_VPORT_GEN(portNo) (portNo >> 24) | |
50 | ||
51 | #define OVS_MAX_PHYS_ADAPTERS 32 | |
52 | #define OVS_MAX_IP_VPOR 32 | |
53 | ||
54 | #define OVS_HASH_BASIS 0x13578642 | |
55 | ||
56 | typedef struct _OVS_DATAPATH | |
57 | { | |
58 | PLIST_ENTRY flowTable; // Contains OvsFlows. | |
59 | UINT32 nFlows; // Number of entries in flowTable. | |
60 | ||
61 | // List_Links queues[64]; // Hash table of queue IDs. | |
62 | ||
63 | /* Statistics. */ | |
64 | UINT64 hits; // Number of flow table hits. | |
65 | UINT64 misses; // Number of flow table misses. | |
66 | UINT64 lost; // Number of dropped misses. | |
67 | ||
68 | /* Used to protect the flows in the flowtable. */ | |
69 | PNDIS_RW_LOCK_EX lock; | |
70 | } OVS_DATAPATH, *POVS_DATAPATH; | |
71 | ||
72 | /* | |
73 | * OVS_SWITCH_CONTEXT | |
74 | * | |
75 | * The context allocated per switch., For OVS, we only | |
76 | * support one switch which corresponding to one datapath. | |
77 | * Each datapath can have multiple logical bridges configured | |
78 | * which is maintained by vswitchd. | |
79 | */ | |
80 | ||
81 | typedef enum OVS_SWITCH_DATAFLOW_STATE | |
82 | { | |
83 | OvsSwitchPaused, | |
84 | OvsSwitchRunning | |
85 | } OVS_SWITCH_DATAFLOW_STATE, *POVS_SWITCH_DATAFLOW_STATE; | |
86 | ||
87 | typedef enum OVS_SWITCH_CONTROFLOW_STATE | |
88 | { | |
89 | OvsSwitchUnknown, | |
90 | OvsSwitchAttached, | |
91 | OvsSwitchDetached | |
92 | } OVS_SWITCH_CONTROLFLOW_STATE, *POVS_SWITCH_CONTROLFLOW_STATE; | |
93 | ||
94 | // XXX: Take care of alignment and grouping members by cacheline | |
95 | typedef struct _OVS_SWITCH_CONTEXT | |
96 | { | |
97 | /* Coarse and fine-grained switch states. */ | |
98 | OVS_SWITCH_DATAFLOW_STATE dataFlowState; | |
99 | OVS_SWITCH_CONTROLFLOW_STATE controlFlowState; | |
100 | BOOLEAN isActivated; | |
101 | BOOLEAN isActivateFailed; | |
102 | ||
103 | UINT32 dpNo; | |
104 | ||
105 | NDIS_SWITCH_PORT_ID externalPortId; | |
106 | NDIS_SWITCH_PORT_ID internalPortId; | |
107 | PVOID externalVport; // the virtual adapter vport | |
108 | PVOID internalVport; | |
109 | ||
110 | PVOID *vportArray; | |
111 | PLIST_ENTRY nameHashArray; // based on ovsName | |
112 | PLIST_ENTRY portHashArray; // based on portId | |
113 | ||
114 | UINT32 numPhysicalNics; | |
115 | UINT32 numVports; // include validation port | |
116 | UINT32 lastPortIndex; | |
117 | ||
118 | /* Lock taken over the switch. This protects the ports on the switch. */ | |
119 | PNDIS_RW_LOCK_EX dispatchLock; | |
120 | ||
121 | /* The flowtable. */ | |
122 | OVS_DATAPATH datapath; | |
123 | ||
124 | /* Handle to the OVSExt filter driver. Same as 'gOvsExtDriverHandle'. */ | |
125 | NDIS_HANDLE NdisFilterHandle; | |
126 | ||
127 | /* Handle and callbacks exposed by the underlying hyper-v switch. */ | |
128 | NDIS_SWITCH_CONTEXT NdisSwitchContext; | |
129 | NDIS_SWITCH_OPTIONAL_HANDLERS NdisSwitchHandlers; | |
130 | ||
131 | volatile LONG pendingInjectedNblCount; | |
132 | volatile LONG pendingOidCount; | |
133 | ||
134 | OVS_NBL_POOL ovsPool; | |
135 | } OVS_SWITCH_CONTEXT, *POVS_SWITCH_CONTEXT; | |
136 | ||
137 | ||
138 | static __inline VOID | |
139 | OvsAcquireDatapathRead(OVS_DATAPATH *datapath, | |
140 | LOCK_STATE_EX *lockState, | |
141 | BOOLEAN dispatch) | |
142 | { | |
143 | ASSERT(datapath); | |
144 | NdisAcquireRWLockRead(datapath->lock, lockState, dispatch); | |
145 | } | |
146 | ||
147 | static __inline VOID | |
148 | OvsAcquireDatapathWrite(OVS_DATAPATH *datapath, | |
149 | LOCK_STATE_EX *lockState, | |
150 | BOOLEAN dispatch) | |
151 | { | |
152 | ASSERT(datapath); | |
153 | NdisAcquireRWLockWrite(datapath->lock, lockState, dispatch); | |
154 | } | |
155 | ||
156 | ||
157 | static __inline VOID | |
158 | OvsReleaseDatapath(OVS_DATAPATH *datapath, | |
159 | LOCK_STATE_EX *lockState) | |
160 | { | |
161 | ASSERT(datapath); | |
162 | NdisReleaseRWLock(datapath->lock, lockState); | |
163 | } | |
164 | ||
165 | ||
166 | PVOID OvsGetVportFromIndex(UINT16 index); | |
167 | PVOID OvsGetExternalVport(); | |
168 | ||
169 | #endif /* __OVS_SWITCH_H_ */ |