/
Vport.h
191 lines (165 loc) · 5.91 KB
/
Vport.h
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
/*
* Copyright (c) 2014 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 __VPORT_H_
#define __VPORT_H_ 1
#include "Switch.h"
/*
* A Vport, or Virtual Port, is a port on the OVS. It can be one of the
* following types. Some of the Vports are "real" ports on the hyper-v switch,
* and some are not:
* - VIF port (VM's NIC)
* - External Adapters (physical NIC)
* - Internal Adapter (Virtual adapter exposed on the host).
* - Tunnel ports created by OVS userspace.
*/
typedef enum {
OVS_STATE_UNKNOWN,
OVS_STATE_PORT_CREATED,
OVS_STATE_NIC_CREATED,
OVS_STATE_CONNECTED,
OVS_STATE_PORT_TEAR_DOWN,
OVS_STATE_PORT_DELETED,
} OVS_VPORT_STATE;
typedef struct _OVS_VPORT_STATS {
UINT64 rxPackets;
UINT64 txPackets;
UINT64 rxBytes;
UINT64 txBytes;
} OVS_VPORT_STATS;
typedef struct _OVS_VPORT_ERR_STATS {
UINT64 rxErrors;
UINT64 txErrors;
UINT64 rxDropped;
UINT64 txDropped;
} OVS_VPORT_ERR_STATS;
/* used for vport netlink commands. */
typedef struct _OVS_VPORT_FULL_STATS {
OVS_VPORT_STATS;
OVS_VPORT_ERR_STATS;
}OVS_VPORT_FULL_STATS;
/*
* Each internal, external adapter or vritual adapter has
* one vport entry. In addition, we have one vport for each
* tunnel type, such as vxlan, gre, gre64
*/
typedef struct _OVS_VPORT_ENTRY {
LIST_ENTRY nameLink;
LIST_ENTRY portLink;
OVS_VPORT_STATE ovsState;
OVS_VPORT_TYPE ovsType;
OVS_VPORT_STATS stats;
OVS_VPORT_ERR_STATS errStats;
UINT32 portNo;
UINT32 mtu;
CHAR ovsName[OVS_MAX_PORT_NAME_LENGTH];
UINT32 ovsNameLen;
PVOID priv;
NDIS_SWITCH_PORT_ID portId;
NDIS_SWITCH_NIC_INDEX nicIndex;
UINT16 numaNodeId;
NDIS_SWITCH_PORT_STATE portState;
NDIS_SWITCH_NIC_STATE nicState;
NDIS_SWITCH_PORT_TYPE portType;
BOOLEAN isValidationPort;
UINT8 permMacAddress[MAC_ADDRESS_LEN];
UINT8 currMacAddress[MAC_ADDRESS_LEN];
UINT8 vmMacAddress[MAC_ADDRESS_LEN];
NDIS_SWITCH_PORT_NAME portName;
NDIS_SWITCH_NIC_NAME nicName;
NDIS_VM_NAME vmName;
GUID netCfgInstanceId;
BOOLEAN isExternal;
UINT32 upcallPid; /* netlink upcall port id */
} OVS_VPORT_ENTRY, *POVS_VPORT_ENTRY;
struct _OVS_SWITCH_CONTEXT;
#define OVS_IS_VPORT_ENTRY_NULL(_SwitchContext, _i) \
((UINT64)(_SwitchContext)->vportArray[_i] <= 0xff)
POVS_VPORT_ENTRY
OvsFindVportByPortNo(struct _OVS_SWITCH_CONTEXT *switchContext,
UINT32 portNo);
POVS_VPORT_ENTRY
OvsFindVportByOvsName(struct _OVS_SWITCH_CONTEXT *switchContext,
CHAR *name, UINT32 length);
POVS_VPORT_ENTRY
OvsFindVportByPortIdAndNicIndex(struct _OVS_SWITCH_CONTEXT *switchContext,
NDIS_SWITCH_PORT_ID portId,
NDIS_SWITCH_NIC_INDEX index);
NDIS_STATUS OvsAddConfiguredSwitchPorts(struct _OVS_SWITCH_CONTEXT *switchContext);
NDIS_STATUS OvsInitConfiguredSwitchNics(struct _OVS_SWITCH_CONTEXT *switchContext);
VOID OvsClearAllSwitchVports(struct _OVS_SWITCH_CONTEXT *switchContext);
NDIS_STATUS HvCreateNic(POVS_SWITCH_CONTEXT switchContext,
PNDIS_SWITCH_NIC_PARAMETERS nicParam);
NDIS_STATUS HvCreatePort(POVS_SWITCH_CONTEXT switchContext,
PNDIS_SWITCH_PORT_PARAMETERS portParam);
VOID HvTeardownPort(POVS_SWITCH_CONTEXT switchContext,
PNDIS_SWITCH_PORT_PARAMETERS portParam);
VOID HvDeletePort(POVS_SWITCH_CONTEXT switchContext,
PNDIS_SWITCH_PORT_PARAMETERS portParam);
VOID HvConnectNic(POVS_SWITCH_CONTEXT switchContext,
PNDIS_SWITCH_NIC_PARAMETERS nicParam);
VOID HvUpdateNic(POVS_SWITCH_CONTEXT switchContext,
PNDIS_SWITCH_NIC_PARAMETERS nicParam);
VOID HvDeleteNic(POVS_SWITCH_CONTEXT switchContext,
PNDIS_SWITCH_NIC_PARAMETERS nicParam);
VOID HvDisconnectNic(POVS_SWITCH_CONTEXT switchContext,
PNDIS_SWITCH_NIC_PARAMETERS nicParam);
static __inline BOOLEAN
OvsIsTunnelVportType(OVS_VPORT_TYPE ovsType)
{
return ovsType == OVS_VPORT_TYPE_VXLAN ||
ovsType == OVS_VPORT_TYPE_GRE ||
ovsType == OVS_VPORT_TYPE_GRE64;
}
static __inline BOOLEAN
OvsIsInternalVportType(OVS_VPORT_TYPE ovsType)
{
return ovsType == OVS_VPORT_TYPE_INTERNAL;
}
static __inline BOOLEAN
OvsIsTunnelVportNo(UINT32 portNo)
{
UINT32 idx = OVS_VPORT_INDEX(portNo);
return (idx >= OVS_TUNNEL_INDEX_START && idx <= OVS_TUNNEL_INDEX_END);
}
static __inline BOOLEAN
OvsIsVifVportNo(UINT32 portNo)
{
UINT32 idx = OVS_VPORT_INDEX(portNo);
return (idx >= OVS_VM_VPORT_START && idx <= OVS_VM_VPORT_MAX);
}
static __inline POVS_VPORT_ENTRY
OvsGetTunnelVport(OVS_VPORT_TYPE type)
{
ASSERT(OvsIsTunnelVportType(type));
switch(type) {
case OVS_VPORT_TYPE_VXLAN:
return (POVS_VPORT_ENTRY) OvsGetVportFromIndex(OVS_VXLAN_VPORT_INDEX);
default:
ASSERT(! "OvsGetTunnelVport not implemented for this tunnel.");
}
return NULL;
}
static __inline PVOID
OvsGetVportPriv(OVS_VPORT_TYPE type)
{
return OvsGetTunnelVport(type)->priv;
}
static __inline UINT32
OvsGetExternalMtu()
{
return ((POVS_VPORT_ENTRY) OvsGetExternalVport())->mtu;
}
#endif /* __VPORT_H_ */