#define __VPORT_H_ 1
#include "Switch.h"
+#include "VxLan.h"
+#include "Stt.h"
#define OVS_MAX_DPPORTS MAXUINT16
#define OVS_DPPORT_NUMBER_INVALID OVS_MAX_DPPORTS
/*
* 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
+ * tunnel type, such as vxlan, gre
*/
typedef struct _OVS_VPORT_ENTRY {
LIST_ENTRY ovsNameLink;
LIST_ENTRY portIdLink;
LIST_ENTRY portNoLink;
+ LIST_ENTRY tunnelVportLink;
OVS_VPORT_STATE ovsState;
OVS_VPORT_TYPE ovsType;
NDIS_SWITCH_NIC_STATE nicState;
NDIS_SWITCH_PORT_TYPE portType;
- UINT8 permMacAddress[MAC_ADDRESS_LEN];
- UINT8 currMacAddress[MAC_ADDRESS_LEN];
- UINT8 vmMacAddress[MAC_ADDRESS_LEN];
+ UINT8 permMacAddress[ETH_ADDR_LEN];
+ UINT8 currMacAddress[ETH_ADDR_LEN];
+ UINT8 vmMacAddress[ETH_ADDR_LEN];
NDIS_SWITCH_PORT_NAME hvPortName;
IF_COUNTED_STRING portFriendlyName;
BOOLEAN isExternal;
UINT32 upcallPid; /* netlink upcall port id */
PNL_ATTR portOptions;
- BOOLEAN hvDeleted; /* is the hyper-v switch port deleted? */
+ BOOLEAN isAbsentOnHv; /* Is this port present on the
+ Hyper-V switch? */
} OVS_VPORT_ENTRY, *POVS_VPORT_ENTRY;
struct _OVS_SWITCH_CONTEXT;
-POVS_VPORT_ENTRY
-OvsFindVportByPortNo(struct _OVS_SWITCH_CONTEXT *switchContext,
- UINT32 portNo);
-
+POVS_VPORT_ENTRY OvsFindVportByPortNo(POVS_SWITCH_CONTEXT switchContext,
+ UINT32 portNo);
/* "name" is null-terminated */
-POVS_VPORT_ENTRY
-OvsFindVportByOvsName(POVS_SWITCH_CONTEXT switchContext,
- PSTR name);
-POVS_VPORT_ENTRY
-OvsFindVportByHvName(POVS_SWITCH_CONTEXT switchContext, PSTR name);
-POVS_VPORT_ENTRY
-OvsFindVportByPortIdAndNicIndex(struct _OVS_SWITCH_CONTEXT *switchContext,
- NDIS_SWITCH_PORT_ID portId,
- NDIS_SWITCH_NIC_INDEX index);
+POVS_VPORT_ENTRY OvsFindVportByOvsName(POVS_SWITCH_CONTEXT switchContext,
+ PSTR name);
+POVS_VPORT_ENTRY OvsFindVportByHvNameA(POVS_SWITCH_CONTEXT switchContext,
+ PSTR name);
+POVS_VPORT_ENTRY OvsFindVportByPortIdAndNicIndex(POVS_SWITCH_CONTEXT switchContext,
+ NDIS_SWITCH_PORT_ID portId,
+ NDIS_SWITCH_NIC_INDEX index);
+POVS_VPORT_ENTRY OvsFindTunnelVportByDstPort(POVS_SWITCH_CONTEXT switchContext,
+ UINT16 dstPort,
+ OVS_VPORT_TYPE ovsVportType);
NDIS_STATUS OvsAddConfiguredSwitchPorts(struct _OVS_SWITCH_CONTEXT *switchContext);
NDIS_STATUS OvsInitConfiguredSwitchNics(struct _OVS_SWITCH_CONTEXT *switchContext);
PNDIS_SWITCH_NIC_PARAMETERS nicParam);
NDIS_STATUS HvCreatePort(POVS_SWITCH_CONTEXT switchContext,
PNDIS_SWITCH_PORT_PARAMETERS portParam);
+NDIS_STATUS HvUpdatePort(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,
OvsIsTunnelVportType(OVS_VPORT_TYPE ovsType)
{
return ovsType == OVS_VPORT_TYPE_VXLAN ||
- ovsType == OVS_VPORT_TYPE_GRE ||
- ovsType == OVS_VPORT_TYPE_GRE64;
+ ovsType == OVS_VPORT_TYPE_STT ||
+ ovsType == OVS_VPORT_TYPE_GRE;
+}
+
+
+static __inline PVOID
+GetOvsVportPriv(POVS_VPORT_ENTRY ovsVport)
+{
+ return ovsVport->priv;
}
static __inline BOOLEAN
return vport->isBridgeInternal == TRUE;
}
+NTSTATUS OvsRemoveAndDeleteVport(PVOID usrParamsCtx,
+ POVS_SWITCH_CONTEXT switchContext,
+ POVS_VPORT_ENTRY vport,
+ BOOLEAN hvDelete, BOOLEAN ovsDelete);
+static __inline POVS_VPORT_ENTRY
+OvsGetExternalVport(POVS_SWITCH_CONTEXT switchContext)
+{
+ return switchContext->virtualExternalVport;
+}
+
static __inline UINT32
-OvsGetExternalMtu()
+OvsGetExternalMtu(POVS_SWITCH_CONTEXT switchContext)
{
- return ((POVS_VPORT_ENTRY) OvsGetExternalVport())->mtu;
+ ASSERT(OvsGetExternalVport(switchContext));
+ return ((POVS_VPORT_ENTRY) OvsGetExternalVport(switchContext))->mtu;
}
-VOID OvsRemoveAndDeleteVport(POVS_SWITCH_CONTEXT switchContext,
- POVS_VPORT_ENTRY vport);
+static __inline UINT16
+GetPortFromPriv(POVS_VPORT_ENTRY vport)
+{
+ UINT16 dstPort = 0;
+ PVOID vportPriv = GetOvsVportPriv(vport);
+
+ /* XXX would better to have a commom tunnel "parent" structure */
+ ASSERT(vportPriv);
+ switch(vport->ovsType) {
+ case OVS_VPORT_TYPE_VXLAN:
+ dstPort = ((POVS_VXLAN_VPORT)vportPriv)->dstPort;
+ break;
+ case OVS_VPORT_TYPE_STT:
+ dstPort = ((POVS_STT_VPORT)vportPriv)->dstPort;
+ break;
+ default:
+ ASSERT(! "Port is not a tunnel port");
+ }
+ ASSERT(dstPort);
+ return dstPort;
+}
-NDIS_STATUS OvsInitVportCommon(POVS_SWITCH_CONTEXT switchContext,
+NDIS_STATUS InitOvsVportCommon(POVS_SWITCH_CONTEXT switchContext,
POVS_VPORT_ENTRY vport);
+NTSTATUS OvsInitTunnelVport(PVOID usrParamsCtx, POVS_VPORT_ENTRY vport,
+ OVS_VPORT_TYPE ovsType, UINT16 dstport);
+NTSTATUS OvsInitBridgeInternalVport(POVS_VPORT_ENTRY vport);
POVS_VPORT_ENTRY OvsAllocateVport(VOID);