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 __OVS_VPORT_H_
18 #define __OVS_VPORT_H_ 1
20 #include "OvsSwitch.h"
23 * A Vport, or Virtual Port, is a port on the OVS. It can be one of the
24 * following types. Some of the Vports are "real" ports on the hyper-v switch,
26 * - VIF port (VM's NIC)
27 * - External Adapters (physical NIC)
28 * - Internal Adapter (Virtual adapter exposed on the host).
29 * - Tunnel ports created by OVS userspace.
34 OVS_STATE_PORT_CREATED,
35 OVS_STATE_NIC_CREATED,
37 OVS_STATE_PORT_TEAR_DOWN,
38 OVS_STATE_PORT_DELETED,
41 typedef struct _OVS_VPORT_STATS {
48 typedef struct _OVS_VPORT_ERR_STATS {
53 } OVS_VPORT_ERR_STATS;
55 * Each internal, external adapter or vritual adapter has
56 * one vport entry. In addition, we have one vport for each
57 * tunnel type, such as vxlan, gre, gre64
59 typedef struct _OVS_VPORT_ENTRY {
63 OVS_VPORT_STATE ovsState;
64 OVS_VPORT_TYPE ovsType;
65 OVS_VPORT_STATS stats;
66 OVS_VPORT_ERR_STATS errStats;
69 CHAR ovsName[OVS_MAX_PORT_NAME_LENGTH];
73 NDIS_SWITCH_PORT_ID portId;
74 NDIS_SWITCH_NIC_INDEX nicIndex;
76 NDIS_SWITCH_PORT_STATE portState;
77 NDIS_SWITCH_NIC_STATE nicState;
78 NDIS_SWITCH_PORT_TYPE portType;
79 BOOLEAN isValidationPort;
81 UINT8 permMacAddress[MAC_ADDRESS_LEN];
82 UINT8 currMacAddress[MAC_ADDRESS_LEN];
83 UINT8 vmMacAddress[MAC_ADDRESS_LEN];
85 NDIS_SWITCH_PORT_NAME portName;
86 NDIS_SWITCH_NIC_NAME nicName;
88 GUID netCfgInstanceId;
89 } OVS_VPORT_ENTRY, *POVS_VPORT_ENTRY;
91 struct _OVS_SWITCH_CONTEXT;
93 #define OVS_IS_VPORT_ENTRY_NULL(_SwitchContext, _i) \
94 ((UINT64)(_SwitchContext)->vportArray[_i] <= 0xff)
97 OvsFindVportByPortNo(struct _OVS_SWITCH_CONTEXT *switchContext,
100 OvsFindVportByOvsName(struct _OVS_SWITCH_CONTEXT *switchContext,
101 CHAR *name, UINT32 length);
103 OvsFindVportByPortIdAndNicIndex(struct _OVS_SWITCH_CONTEXT *switchContext,
104 NDIS_SWITCH_PORT_ID portId,
105 NDIS_SWITCH_NIC_INDEX index);
107 NDIS_STATUS OvsAddConfiguredSwitchPorts(struct _OVS_SWITCH_CONTEXT *switchContext);
108 NDIS_STATUS OvsInitConfiguredSwitchNics(struct _OVS_SWITCH_CONTEXT *switchContext);
110 VOID OvsClearAllSwitchVports(struct _OVS_SWITCH_CONTEXT *switchContext);
112 NTSTATUS OvsDumpVportIoctl(PVOID inputBuffer, UINT32 inputLength,
113 PVOID outputBuffer, UINT32 outputLength,
115 NTSTATUS OvsGetVportIoctl(PVOID inputBuffer, UINT32 inputLength,
116 PVOID outputBuffer, UINT32 outputLength,
118 NTSTATUS OvsAddVportIoctl(PVOID inputBuffer, UINT32 inputLength,
119 PVOID outputBuffer, UINT32 outputLength,
121 NTSTATUS OvsDelVportIoctl(PVOID inputBuffer, UINT32 inputLength,
123 NTSTATUS OvsGetExtInfoIoctl(PVOID inputBuffer, UINT32 inputLength,
124 PVOID outputBuffer, UINT32 outputLength,
126 NDIS_STATUS OvsCreateNic(POVS_SWITCH_CONTEXT switchContext,
127 PNDIS_SWITCH_NIC_PARAMETERS nicParam);
128 NDIS_STATUS OvsCreatePort(POVS_SWITCH_CONTEXT switchContext,
129 PNDIS_SWITCH_PORT_PARAMETERS portParam);
130 VOID OvsTeardownPort(POVS_SWITCH_CONTEXT switchContext,
131 PNDIS_SWITCH_PORT_PARAMETERS portParam);
132 VOID OvsDeletePort(POVS_SWITCH_CONTEXT switchContext,
133 PNDIS_SWITCH_PORT_PARAMETERS portParam);
134 VOID OvsConnectNic(POVS_SWITCH_CONTEXT switchContext,
135 PNDIS_SWITCH_NIC_PARAMETERS nicParam);
136 VOID OvsUpdateNic(POVS_SWITCH_CONTEXT switchContext,
137 PNDIS_SWITCH_NIC_PARAMETERS nicParam);
138 VOID OvsDeleteNic(POVS_SWITCH_CONTEXT switchContext,
139 PNDIS_SWITCH_NIC_PARAMETERS nicParam);
140 VOID OvsDisconnectNic(POVS_SWITCH_CONTEXT switchContext,
141 PNDIS_SWITCH_NIC_PARAMETERS nicParam);
143 static __inline BOOLEAN
144 OvsIsTunnelVportType(OVS_VPORT_TYPE ovsType)
146 return ovsType == OVSWIN_VPORT_TYPE_VXLAN ||
147 ovsType == OVSWIN_VPORT_TYPE_GRE ||
148 ovsType == OVSWIN_VPORT_TYPE_GRE64;
151 static __inline BOOLEAN
152 OvsIsInternalVportType(OVS_VPORT_TYPE ovsType)
154 return ovsType == OVSWIN_VPORT_TYPE_INTERNAL;
157 static __inline BOOLEAN
158 OvsIsTunnelVportNo(UINT32 portNo)
160 UINT32 idx = OVS_VPORT_INDEX(portNo);
161 return (idx >= OVS_TUNNEL_INDEX_START && idx <= OVS_TUNNEL_INDEX_END);
164 static __inline BOOLEAN
165 OvsIsVifVportNo(UINT32 portNo)
167 UINT32 idx = OVS_VPORT_INDEX(portNo);
168 return (idx >= OVS_VM_VPORT_START && idx <= OVS_VM_VPORT_MAX);
171 static __inline POVS_VPORT_ENTRY
172 OvsGetTunnelVport(OVS_VPORT_TYPE type)
174 ASSERT(OvsIsTunnelVportType(type));
176 case OVSWIN_VPORT_TYPE_VXLAN:
177 return (POVS_VPORT_ENTRY) OvsGetVportFromIndex(OVS_VXLAN_VPORT_INDEX);
179 ASSERT(! "OvsGetTunnelVport not implemented for this tunnel.");
185 static __inline PVOID
186 OvsGetVportPriv(OVS_VPORT_TYPE type)
188 return OvsGetTunnelVport(type)->priv;
191 static __inline UINT32
194 return ((POVS_VPORT_ENTRY) OvsGetExternalVport())->mtu;
197 #endif /* __OVS_VPORT_H_ */