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.
22 #define OVS_DPPORT_NUMBER_INVALID 0
25 * A Vport, or Virtual Port, is a port on the OVS. It can be one of the
26 * following types. Some of the Vports are "real" ports on the hyper-v switch,
28 * - VIF port (VM's NIC)
29 * - External Adapters (physical NIC)
30 * - Internal Adapter (Virtual adapter exposed on the host).
31 * - Tunnel ports created by OVS userspace.
36 OVS_STATE_PORT_CREATED,
37 OVS_STATE_NIC_CREATED,
39 OVS_STATE_PORT_TEAR_DOWN,
40 OVS_STATE_PORT_DELETED,
43 typedef struct _OVS_VPORT_STATS {
50 typedef struct _OVS_VPORT_ERR_STATS {
55 } OVS_VPORT_ERR_STATS;
57 /* used for vport netlink commands. */
58 typedef struct _OVS_VPORT_FULL_STATS {
61 }OVS_VPORT_FULL_STATS;
63 * Each internal, external adapter or vritual adapter has
64 * one vport entry. In addition, we have one vport for each
65 * tunnel type, such as vxlan, gre, gre64
67 typedef struct _OVS_VPORT_ENTRY {
68 LIST_ENTRY ovsNameLink;
69 LIST_ENTRY portIdLink;
71 OVS_VPORT_STATE ovsState;
72 OVS_VPORT_TYPE ovsType;
73 OVS_VPORT_STATS stats;
74 OVS_VPORT_ERR_STATS errStats;
77 CHAR ovsName[OVS_MAX_PORT_NAME_LENGTH];
81 NDIS_SWITCH_PORT_ID portId;
82 NDIS_SWITCH_NIC_INDEX nicIndex;
84 NDIS_SWITCH_PORT_STATE portState;
85 NDIS_SWITCH_NIC_STATE nicState;
86 NDIS_SWITCH_PORT_TYPE portType;
88 UINT8 permMacAddress[MAC_ADDRESS_LEN];
89 UINT8 currMacAddress[MAC_ADDRESS_LEN];
90 UINT8 vmMacAddress[MAC_ADDRESS_LEN];
92 NDIS_SWITCH_PORT_NAME portName;
93 NDIS_SWITCH_NIC_NAME nicName;
95 GUID netCfgInstanceId;
97 UINT32 upcallPid; /* netlink upcall port id */
98 } OVS_VPORT_ENTRY, *POVS_VPORT_ENTRY;
100 struct _OVS_SWITCH_CONTEXT;
102 #define OVS_IS_VPORT_ENTRY_NULL(_SwitchContext, _i) \
103 ((UINT64)(_SwitchContext)->vportArray[_i] <= 0xff)
106 OvsFindVportByPortNo(struct _OVS_SWITCH_CONTEXT *switchContext,
109 OvsFindVportByOvsName(struct _OVS_SWITCH_CONTEXT *switchContext,
110 CHAR *name, UINT32 length);
112 OvsFindVportByPortIdAndNicIndex(struct _OVS_SWITCH_CONTEXT *switchContext,
113 NDIS_SWITCH_PORT_ID portId,
114 NDIS_SWITCH_NIC_INDEX index);
116 NDIS_STATUS OvsAddConfiguredSwitchPorts(struct _OVS_SWITCH_CONTEXT *switchContext);
117 NDIS_STATUS OvsInitConfiguredSwitchNics(struct _OVS_SWITCH_CONTEXT *switchContext);
119 VOID OvsClearAllSwitchVports(struct _OVS_SWITCH_CONTEXT *switchContext);
121 NDIS_STATUS HvCreateNic(POVS_SWITCH_CONTEXT switchContext,
122 PNDIS_SWITCH_NIC_PARAMETERS nicParam);
123 NDIS_STATUS HvCreatePort(POVS_SWITCH_CONTEXT switchContext,
124 PNDIS_SWITCH_PORT_PARAMETERS portParam);
125 VOID HvTeardownPort(POVS_SWITCH_CONTEXT switchContext,
126 PNDIS_SWITCH_PORT_PARAMETERS portParam);
127 VOID HvDeletePort(POVS_SWITCH_CONTEXT switchContext,
128 PNDIS_SWITCH_PORT_PARAMETERS portParam);
129 VOID HvConnectNic(POVS_SWITCH_CONTEXT switchContext,
130 PNDIS_SWITCH_NIC_PARAMETERS nicParam);
131 VOID HvUpdateNic(POVS_SWITCH_CONTEXT switchContext,
132 PNDIS_SWITCH_NIC_PARAMETERS nicParam);
133 VOID HvDeleteNic(POVS_SWITCH_CONTEXT switchContext,
134 PNDIS_SWITCH_NIC_PARAMETERS nicParam);
135 VOID HvDisconnectNic(POVS_SWITCH_CONTEXT switchContext,
136 PNDIS_SWITCH_NIC_PARAMETERS nicParam);
138 UINT32 OvsComputeVportNo(POVS_SWITCH_CONTEXT switchContext,
140 OVS_VPORT_TYPE ovsType,
143 static __inline BOOLEAN
144 OvsIsTunnelVportType(OVS_VPORT_TYPE ovsType)
146 return ovsType == OVS_VPORT_TYPE_VXLAN ||
147 ovsType == OVS_VPORT_TYPE_GRE ||
148 ovsType == OVS_VPORT_TYPE_GRE64;
151 static __inline BOOLEAN
152 OvsIsInternalVportType(OVS_VPORT_TYPE ovsType)
154 return ovsType == OVS_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 OVS_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 /* __VPORT_H_ */