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.
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 /* used for vport netlink commands. */
56 typedef struct _OVS_VPORT_FULL_STATS {
59 }OVS_VPORT_FULL_STATS;
61 * Each internal, external adapter or vritual adapter has
62 * one vport entry. In addition, we have one vport for each
63 * tunnel type, such as vxlan, gre, gre64
65 typedef struct _OVS_VPORT_ENTRY {
69 OVS_VPORT_STATE ovsState;
70 OVS_VPORT_TYPE ovsType;
71 OVS_VPORT_STATS stats;
72 OVS_VPORT_ERR_STATS errStats;
75 CHAR ovsName[OVS_MAX_PORT_NAME_LENGTH];
79 NDIS_SWITCH_PORT_ID portId;
80 NDIS_SWITCH_NIC_INDEX nicIndex;
82 NDIS_SWITCH_PORT_STATE portState;
83 NDIS_SWITCH_NIC_STATE nicState;
84 NDIS_SWITCH_PORT_TYPE portType;
85 BOOLEAN isValidationPort;
87 UINT8 permMacAddress[MAC_ADDRESS_LEN];
88 UINT8 currMacAddress[MAC_ADDRESS_LEN];
89 UINT8 vmMacAddress[MAC_ADDRESS_LEN];
91 NDIS_SWITCH_PORT_NAME portName;
92 NDIS_SWITCH_NIC_NAME nicName;
94 GUID netCfgInstanceId;
96 UINT32 upcallPid; /* netlink upcall port id */
97 } OVS_VPORT_ENTRY, *POVS_VPORT_ENTRY;
99 struct _OVS_SWITCH_CONTEXT;
101 #define OVS_IS_VPORT_ENTRY_NULL(_SwitchContext, _i) \
102 ((UINT64)(_SwitchContext)->vportArray[_i] <= 0xff)
105 OvsFindVportByPortNo(struct _OVS_SWITCH_CONTEXT *switchContext,
108 OvsFindVportByOvsName(struct _OVS_SWITCH_CONTEXT *switchContext,
109 CHAR *name, UINT32 length);
111 OvsFindVportByPortIdAndNicIndex(struct _OVS_SWITCH_CONTEXT *switchContext,
112 NDIS_SWITCH_PORT_ID portId,
113 NDIS_SWITCH_NIC_INDEX index);
115 NDIS_STATUS OvsAddConfiguredSwitchPorts(struct _OVS_SWITCH_CONTEXT *switchContext);
116 NDIS_STATUS OvsInitConfiguredSwitchNics(struct _OVS_SWITCH_CONTEXT *switchContext);
118 VOID OvsClearAllSwitchVports(struct _OVS_SWITCH_CONTEXT *switchContext);
120 NTSTATUS OvsDumpVportIoctl(PVOID inputBuffer, UINT32 inputLength,
121 PVOID outputBuffer, UINT32 outputLength,
123 NTSTATUS OvsGetVportIoctl(PVOID inputBuffer, UINT32 inputLength,
124 PVOID outputBuffer, UINT32 outputLength,
126 NTSTATUS OvsAddVportIoctl(PVOID inputBuffer, UINT32 inputLength,
127 PVOID outputBuffer, UINT32 outputLength,
129 NTSTATUS OvsDelVportIoctl(PVOID inputBuffer, UINT32 inputLength,
131 NDIS_STATUS OvsCreateNic(POVS_SWITCH_CONTEXT switchContext,
132 PNDIS_SWITCH_NIC_PARAMETERS nicParam);
133 NDIS_STATUS OvsCreatePort(POVS_SWITCH_CONTEXT switchContext,
134 PNDIS_SWITCH_PORT_PARAMETERS portParam);
135 VOID OvsTeardownPort(POVS_SWITCH_CONTEXT switchContext,
136 PNDIS_SWITCH_PORT_PARAMETERS portParam);
137 VOID OvsDeletePort(POVS_SWITCH_CONTEXT switchContext,
138 PNDIS_SWITCH_PORT_PARAMETERS portParam);
139 VOID OvsConnectNic(POVS_SWITCH_CONTEXT switchContext,
140 PNDIS_SWITCH_NIC_PARAMETERS nicParam);
141 VOID OvsUpdateNic(POVS_SWITCH_CONTEXT switchContext,
142 PNDIS_SWITCH_NIC_PARAMETERS nicParam);
143 VOID OvsDeleteNic(POVS_SWITCH_CONTEXT switchContext,
144 PNDIS_SWITCH_NIC_PARAMETERS nicParam);
145 VOID OvsDisconnectNic(POVS_SWITCH_CONTEXT switchContext,
146 PNDIS_SWITCH_NIC_PARAMETERS nicParam);
148 static __inline BOOLEAN
149 OvsIsTunnelVportType(OVS_VPORT_TYPE ovsType)
151 return ovsType == OVS_VPORT_TYPE_VXLAN ||
152 ovsType == OVS_VPORT_TYPE_GRE ||
153 ovsType == OVS_VPORT_TYPE_GRE64;
156 static __inline BOOLEAN
157 OvsIsInternalVportType(OVS_VPORT_TYPE ovsType)
159 return ovsType == OVS_VPORT_TYPE_INTERNAL;
162 static __inline BOOLEAN
163 OvsIsTunnelVportNo(UINT32 portNo)
165 UINT32 idx = OVS_VPORT_INDEX(portNo);
166 return (idx >= OVS_TUNNEL_INDEX_START && idx <= OVS_TUNNEL_INDEX_END);
169 static __inline BOOLEAN
170 OvsIsVifVportNo(UINT32 portNo)
172 UINT32 idx = OVS_VPORT_INDEX(portNo);
173 return (idx >= OVS_VM_VPORT_START && idx <= OVS_VM_VPORT_MAX);
176 static __inline POVS_VPORT_ENTRY
177 OvsGetTunnelVport(OVS_VPORT_TYPE type)
179 ASSERT(OvsIsTunnelVportType(type));
181 case OVS_VPORT_TYPE_VXLAN:
182 return (POVS_VPORT_ENTRY) OvsGetVportFromIndex(OVS_VXLAN_VPORT_INDEX);
184 ASSERT(! "OvsGetTunnelVport not implemented for this tunnel.");
190 static __inline PVOID
191 OvsGetVportPriv(OVS_VPORT_TYPE type)
193 return OvsGetTunnelVport(type)->priv;
196 static __inline UINT32
199 return ((POVS_VPORT_ENTRY) OvsGetExternalVport())->mtu;
202 #endif /* __VPORT_H_ */