From e00afcf6427ab3b99c6ad0867c2a22bfe9ead180 Mon Sep 17 00:00:00 2001 From: Samuel Ghinet Date: Thu, 25 Sep 2014 21:20:25 +0000 Subject: datapath-windows: fix OVS_VPORT_TYPE The windows ovs kernel uses an OVS_VPORT_TYPE enum that is incompatible with the userspace counterpart (enum ovs_vport_type from openvswitch.h). We must use the same enum type for the netlink communication to work properly. This patch makes the fix: "typedef enum ovs_vport_type OVS_VPORT_TYPE" and changes the afferent kernel driver code: o) vport types synthetic and emulated turn to: netdev o) vport type internal turns to: internal o) vport type external truns to: netdev (plus, we hold a field in vport, "isExternal" Signed-off-by: Samuel Ghinet Acked-by: Nithin Raju Signed-off-by: Ben Pfaff --- datapath-windows/include/OvsDpInterfaceExt.h | 1 + datapath-windows/include/OvsPub.h | 25 ++------- datapath-windows/ovsext/Actions.c | 6 +-- datapath-windows/ovsext/Tunnel.c | 4 +- datapath-windows/ovsext/Vport.c | 81 ++++++++++++++-------------- datapath-windows/ovsext/Vport.h | 11 ++-- datapath-windows/ovsext/Vxlan.c | 4 +- datapath-windows/ovsext/precomp.h | 12 ++--- 8 files changed, 66 insertions(+), 78 deletions(-) (limited to 'datapath-windows') diff --git a/datapath-windows/include/OvsDpInterfaceExt.h b/datapath-windows/include/OvsDpInterfaceExt.h index 64fd20e42..72b2e8e83 100644 --- a/datapath-windows/include/OvsDpInterfaceExt.h +++ b/datapath-windows/include/OvsDpInterfaceExt.h @@ -81,5 +81,6 @@ enum ovs_nl_mcast_attr { }; typedef struct ovs_dp_stats OVS_DP_STATS; +typedef enum ovs_vport_type OVS_VPORT_TYPE; #endif /* __OVS_DP_INTERFACE_EXT_H_ */ diff --git a/datapath-windows/include/OvsPub.h b/datapath-windows/include/OvsPub.h index 36814c482..ff0e8ce20 100644 --- a/datapath-windows/include/OvsPub.h +++ b/datapath-windows/include/OvsPub.h @@ -142,34 +142,19 @@ typedef struct _OVS_VPORT_GET { char name[OVS_MAX_PORT_NAME_LENGTH]; } OVS_VPORT_GET, *POVS_VPORT_GET; - -typedef enum { - OVSWIN_VPORT_TYPE_UNKNOWN, - OVSWIN_VPORT_TYPE_RESERVED, - OVSWIN_VPORT_TYPE_EXTERNAL, - OVSWIN_VPORT_TYPE_INTERNAL, - OVSWIN_VPORT_TYPE_SYNTHETIC, - OVSWIN_VPORT_TYPE_EMULATED, - OVSWIN_VPORT_TYPE_GRE, - OVSWIN_VPORT_TYPE_GRE64, - OVSWIN_VPORT_TYPE_VXLAN, - OVSWIN_VPORT_TYPE_LOCAL, /* For bridge local port. */ -} OVS_VPORT_TYPE; - static __inline const char * OvsVportTypeToStr(OVS_VPORT_TYPE t) { switch(t) { -#define STR(t) case OVSWIN_VPORT_TYPE_##t : return "VPORT_##t"; - STR(UNKNOWN) - STR(EXTERNAL) +#define STR(t) case OVS_VPORT_TYPE_##t : return "VPORT_##t"; + STR(UNSPEC) + STR(NETDEV) STR(INTERNAL) - STR(SYNTHETIC) - STR(EMULATED) STR(GRE) STR(GRE64) STR(VXLAN) - STR(LOCAL) + STR(GENEVE) + STR(LISP) } #undef STR diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c index 35ebfdf8c..180b6b88e 100644 --- a/datapath-windows/ovsext/Actions.c +++ b/datapath-windows/ovsext/Actions.c @@ -205,7 +205,7 @@ OvsDetectTunnelRxPkt(OvsForwardingContext *ovsFwdCtx, if (!flowKey->ipKey.nwFrag && flowKey->ipKey.nwProto == IPPROTO_UDP && flowKey->ipKey.l4.tpDst == VXLAN_UDP_PORT_NBO) { - tunnelVport = OvsGetTunnelVport(OVSWIN_VPORT_TYPE_VXLAN); + tunnelVport = OvsGetTunnelVport(OVS_VPORT_TYPE_VXLAN); ovsActionStats.rxVxlan++; } @@ -616,7 +616,7 @@ OvsTunnelPortTx(OvsForwardingContext *ovsFwdCtx) /* Do the encap. Encap function does not consume the NBL. */ switch(ovsFwdCtx->tunnelTxNic->ovsType) { - case OVSWIN_VPORT_TYPE_VXLAN: + case OVS_VPORT_TYPE_VXLAN: status = OvsEncapVxlan(ovsFwdCtx->curNbl, &ovsFwdCtx->tunKey, ovsFwdCtx->switchContext, (VOID *)ovsFwdCtx->completionList, @@ -678,7 +678,7 @@ OvsTunnelPortRx(OvsForwardingContext *ovsFwdCtx) } switch(tunnelRxVport->ovsType) { - case OVSWIN_VPORT_TYPE_VXLAN: + case OVS_VPORT_TYPE_VXLAN: /* * OvsDoDecapVxlan should return a new NBL if it was copied, and * this new NBL should be setup as the ovsFwdCtx->curNbl. diff --git a/datapath-windows/ovsext/Tunnel.c b/datapath-windows/ovsext/Tunnel.c index 2e7da10de..304ab5986 100644 --- a/datapath-windows/ovsext/Tunnel.c +++ b/datapath-windows/ovsext/Tunnel.c @@ -284,14 +284,14 @@ OvsInjectPacketThroughActions(PNET_BUFFER_LIST pNbl, SendFlags |= NDIS_SEND_FLAGS_DISPATCH_LEVEL; - vport = OvsGetTunnelVport(OVSWIN_VPORT_TYPE_VXLAN); + vport = OvsGetTunnelVport(OVS_VPORT_TYPE_VXLAN); if (vport == NULL){ status = STATUS_UNSUCCESSFUL; goto unlockAndDrop; } - ASSERT(vport->ovsType == OVSWIN_VPORT_TYPE_VXLAN); + ASSERT(vport->ovsType == OVS_VPORT_TYPE_VXLAN); portNo = vport->portNo; diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c index 0d1e4abb9..14b68d993 100644 --- a/datapath-windows/ovsext/Vport.c +++ b/datapath-windows/ovsext/Vport.c @@ -50,7 +50,8 @@ extern POVS_SWITCH_CONTEXT gOvsSwitchContext; extern PNDIS_SPIN_LOCK gOvsCtrlLock; static UINT32 OvsGetVportNo(POVS_SWITCH_CONTEXT switchContext, UINT32 nicIndex, - OVS_VPORT_TYPE ovsType); + OVS_VPORT_TYPE ovsType, + BOOLEAN isExternal); static POVS_VPORT_ENTRY OvsAllocateVport(VOID); static VOID OvsInitVportWithPortParam(POVS_VPORT_ENTRY vport, PNDIS_SWITCH_PORT_PARAMETERS portParam); @@ -380,7 +381,7 @@ OvsDisconnectNic(POVS_SWITCH_CONTEXT switchContext, vport->ovsState = OVS_STATE_NIC_CREATED; portNo = vport->portNo; - if (vport->ovsType == OVSWIN_VPORT_TYPE_INTERNAL) { + if (vport->ovsType == OVS_VPORT_TYPE_INTERNAL) { isInternalPort = TRUE; } @@ -520,13 +521,13 @@ OvsFindVportByPortIdAndNicIndex(POVS_SWITCH_CONTEXT switchContext, static UINT32 OvsGetVportNo(POVS_SWITCH_CONTEXT switchContext, UINT32 nicIndex, - OVS_VPORT_TYPE ovsType) + OVS_VPORT_TYPE ovsType, + BOOLEAN isExternal) { UINT32 index = 0xffffff, i = 0; UINT64 gen; - switch (ovsType) { - case OVSWIN_VPORT_TYPE_EXTERNAL: + if (isExternal) { if (nicIndex == 0) { return 0; // not a valid portNo } else if (nicIndex > OVS_MAX_PHYS_ADAPTERS) { @@ -534,12 +535,13 @@ OvsGetVportNo(POVS_SWITCH_CONTEXT switchContext, } else { index = nicIndex + OVS_EXTERNAL_VPORT_START; } - break; - case OVSWIN_VPORT_TYPE_INTERNAL: + } + + switch (ovsType) { + case OVS_VPORT_TYPE_INTERNAL: index = OVS_INTERNAL_VPORT_DEFAULT_INDEX; break; - case OVSWIN_VPORT_TYPE_SYNTHETIC: - case OVSWIN_VPORT_TYPE_EMULATED: + case OVS_VPORT_TYPE_NETDEV: index = switchContext->lastPortIndex + 1; if (index == OVS_MAX_VPORT_ARRAY_SIZE) { index = OVS_VM_VPORT_START; @@ -557,18 +559,17 @@ OvsGetVportNo(POVS_SWITCH_CONTEXT switchContext, } switchContext->lastPortIndex = index; break; - case OVSWIN_VPORT_TYPE_GRE: + case OVS_VPORT_TYPE_GRE: index = OVS_GRE_VPORT_INDEX; break; - case OVSWIN_VPORT_TYPE_GRE64: + case OVS_VPORT_TYPE_GRE64: index = OVS_GRE64_VPORT_INDEX; break; - case OVSWIN_VPORT_TYPE_VXLAN: + case OVS_VPORT_TYPE_VXLAN: index = OVS_VXLAN_VPORT_INDEX; break; - case OVSWIN_VPORT_TYPE_LOCAL: default: - ASSERT(0); + ASSERT(isExternal); } if (index > OVS_MAX_VPORT_ARRAY_SIZE) { return 0; @@ -605,19 +606,19 @@ OvsInitVportWithPortParam(POVS_VPORT_ENTRY vport, vport->portState = portParam->PortState; vport->portId = portParam->PortId; vport->nicState = NdisSwitchNicStateUnknown; + vport->isExternal = FALSE; switch (vport->portType) { case NdisSwitchPortTypeExternal: - vport->ovsType = OVSWIN_VPORT_TYPE_EXTERNAL; + vport->isExternal = TRUE; + vport->ovsType = OVS_VPORT_TYPE_NETDEV; break; case NdisSwitchPortTypeInternal: - vport->ovsType = OVSWIN_VPORT_TYPE_INTERNAL; + vport->ovsType = OVS_VPORT_TYPE_INTERNAL; break; case NdisSwitchPortTypeSynthetic: - vport->ovsType = OVSWIN_VPORT_TYPE_SYNTHETIC; - break; case NdisSwitchPortTypeEmulated: - vport->ovsType = OVSWIN_VPORT_TYPE_EMULATED; + vport->ovsType = OVS_VPORT_TYPE_NETDEV; break; } RtlCopyMemory(&vport->portName, &portParam->PortName, @@ -694,7 +695,8 @@ OvsInitPhysNicVport(POVS_VPORT_ENTRY vport, vport->portState = virtVport->portState; vport->portId = virtVport->portId; vport->nicState = NdisSwitchNicStateUnknown; - vport->ovsType = OVSWIN_VPORT_TYPE_EXTERNAL; + vport->ovsType = OVS_VPORT_TYPE_NETDEV; + vport->isExternal = TRUE; vport->nicIndex = (NDIS_SWITCH_NIC_INDEX)nicIndex; RtlCopyMemory(&vport->portName, &virtVport->portName, sizeof (NDIS_SWITCH_PORT_NAME)); @@ -709,7 +711,7 @@ POVS_VPORT_ENTRY vport) if (vport->portType != NdisSwitchPortTypeExternal || vport->nicIndex != 0) { vport->portNo = OvsGetVportNo(switchContext, vport->nicIndex, - vport->ovsType); + vport->ovsType, vport->portType == NdisSwitchPortTypeExternal); if (vport->portNo == 0) { return NDIS_STATUS_RESOURCES; } @@ -769,8 +771,8 @@ OvsRemoveAndDeleteVport(POVS_SWITCH_CONTEXT switchContext, POVS_VPORT_ENTRY vport) { UINT64 gen = vport->portNo >> 24; - switch (vport->ovsType) { - case OVSWIN_VPORT_TYPE_EXTERNAL: + + if (vport->isExternal) { if (vport->nicIndex == 0) { ASSERT(switchContext->numPhysicalNics == 0); switchContext->externalPortId = 0; @@ -781,20 +783,21 @@ OvsRemoveAndDeleteVport(POVS_SWITCH_CONTEXT switchContext, ASSERT(switchContext->numPhysicalNics); switchContext->numPhysicalNics--; } - break; - case OVSWIN_VPORT_TYPE_INTERNAL: + } + + switch (vport->ovsType) { + case OVS_VPORT_TYPE_INTERNAL: switchContext->internalPortId = 0; switchContext->internalVport = NULL; OvsInternalAdapterDown(); break; - case OVSWIN_VPORT_TYPE_VXLAN: + case OVS_VPORT_TYPE_VXLAN: OvsCleanupVxlanTunnel(vport); break; - case OVSWIN_VPORT_TYPE_GRE: - case OVSWIN_VPORT_TYPE_GRE64: + case OVS_VPORT_TYPE_GRE: + case OVS_VPORT_TYPE_GRE64: break; - case OVSWIN_VPORT_TYPE_EMULATED: - case OVSWIN_VPORT_TYPE_SYNTHETIC: + case OVS_VPORT_TYPE_NETDEV: default: break; } @@ -1074,11 +1077,11 @@ OvsInitTunnelVport(POVS_VPORT_ENTRY vport, StringCbLengthA(vport->ovsName, OVS_MAX_PORT_NAME_LENGTH - 1, &len); vport->ovsNameLen = (UINT32)len; switch (addReq->type) { - case OVSWIN_VPORT_TYPE_GRE: + case OVS_VPORT_TYPE_GRE: break; - case OVSWIN_VPORT_TYPE_GRE64: + case OVS_VPORT_TYPE_GRE64: break; - case OVSWIN_VPORT_TYPE_VXLAN: + case OVS_VPORT_TYPE_VXLAN: status = OvsInitVxlanTunnel(vport, addReq); break; default: @@ -1113,13 +1116,13 @@ OvsAddVportIoctl(PVOID inputBuffer, addReq->name[OVS_MAX_PORT_NAME_LENGTH - 1] = 0; switch (addReq->type) { - case OVSWIN_VPORT_TYPE_GRE: + case OVS_VPORT_TYPE_GRE: index = OVS_GRE_VPORT_INDEX; break; - case OVSWIN_VPORT_TYPE_GRE64: + case OVS_VPORT_TYPE_GRE64: index = OVS_GRE64_VPORT_INDEX; break; - case OVSWIN_VPORT_TYPE_VXLAN: + case OVS_VPORT_TYPE_VXLAN: index = OVS_VXLAN_VPORT_INDEX; break; default: @@ -1338,8 +1341,7 @@ OvsGetExtInfoIoctl(PVOID inputBuffer, sizeof (vport->currMacAddress)); RtlCopyMemory(info->permMACAddress, vport->permMacAddress, sizeof (vport->permMacAddress)); - if (vport->ovsType == OVSWIN_VPORT_TYPE_SYNTHETIC || - vport->ovsType == OVSWIN_VPORT_TYPE_EMULATED) { + if (vport->ovsType == OVS_VPORT_TYPE_NETDEV) { RtlCopyMemory(info->vmMACAddress, vport->vmMacAddress, sizeof (vport->vmMacAddress)); } @@ -1357,8 +1359,7 @@ OvsGetExtInfoIoctl(PVOID inputBuffer, } else { info->status = OVS_EVENT_DISCONNECT; } - if ((info->type == OVSWIN_VPORT_TYPE_SYNTHETIC || - info->type == OVSWIN_VPORT_TYPE_EMULATED) && + if (info->type == OVS_VPORT_TYPE_NETDEV && (vport->ovsState == OVS_STATE_NIC_CREATED || vport->ovsState == OVS_STATE_CONNECTED)) { RtlCopyMemory(&vmName, &vport->vmName, sizeof (NDIS_VM_NAME)); diff --git a/datapath-windows/ovsext/Vport.h b/datapath-windows/ovsext/Vport.h index 80bdea8ea..fe48d1e61 100644 --- a/datapath-windows/ovsext/Vport.h +++ b/datapath-windows/ovsext/Vport.h @@ -86,6 +86,7 @@ typedef struct _OVS_VPORT_ENTRY { NDIS_SWITCH_NIC_NAME nicName; NDIS_VM_NAME vmName; GUID netCfgInstanceId; + BOOLEAN isExternal; } OVS_VPORT_ENTRY, *POVS_VPORT_ENTRY; struct _OVS_SWITCH_CONTEXT; @@ -143,15 +144,15 @@ VOID OvsDisconnectNic(POVS_SWITCH_CONTEXT switchContext, static __inline BOOLEAN OvsIsTunnelVportType(OVS_VPORT_TYPE ovsType) { - return ovsType == OVSWIN_VPORT_TYPE_VXLAN || - ovsType == OVSWIN_VPORT_TYPE_GRE || - ovsType == OVSWIN_VPORT_TYPE_GRE64; + 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 == OVSWIN_VPORT_TYPE_INTERNAL; + return ovsType == OVS_VPORT_TYPE_INTERNAL; } static __inline BOOLEAN @@ -173,7 +174,7 @@ OvsGetTunnelVport(OVS_VPORT_TYPE type) { ASSERT(OvsIsTunnelVportType(type)); switch(type) { - case OVSWIN_VPORT_TYPE_VXLAN: + case OVS_VPORT_TYPE_VXLAN: return (POVS_VPORT_ENTRY) OvsGetVportFromIndex(OVS_VXLAN_VPORT_INDEX); default: ASSERT(! "OvsGetTunnelVport not implemented for this tunnel."); diff --git a/datapath-windows/ovsext/Vxlan.c b/datapath-windows/ovsext/Vxlan.c index 3a1291ca3..7f94634f9 100644 --- a/datapath-windows/ovsext/Vxlan.c +++ b/datapath-windows/ovsext/Vxlan.c @@ -57,7 +57,7 @@ OvsInitVxlanTunnel(POVS_VPORT_ENTRY vport, POVS_VXLAN_VPORT vxlanPort; NTSTATUS status = STATUS_SUCCESS; - ASSERT(addReq->type == OVSWIN_VPORT_TYPE_VXLAN); + ASSERT(addReq->type == OVS_VPORT_TYPE_VXLAN); vxlanPort = OvsAllocateMemory(sizeof (*vxlanPort)); if (vxlanPort == NULL) { @@ -80,7 +80,7 @@ OvsInitVxlanTunnel(POVS_VPORT_ENTRY vport, VOID OvsCleanupVxlanTunnel(POVS_VPORT_ENTRY vport) { - if (vport->ovsType != OVSWIN_VPORT_TYPE_VXLAN || + if (vport->ovsType != OVS_VPORT_TYPE_VXLAN || vport->priv == NULL) { return; } diff --git a/datapath-windows/ovsext/precomp.h b/datapath-windows/ovsext/precomp.h index 765075a72..a17f2d28c 100644 --- a/datapath-windows/ovsext/precomp.h +++ b/datapath-windows/ovsext/precomp.h @@ -22,15 +22,15 @@ #include #include "Types.h" -#include "..\include\OvsPub.h" + +#include "..\include\OvsDpInterface.h" + #include "Util.h" #include "Netlink/Netlink.h" #include "Netlink/NetlinkProto.h" -/* - * Include openvswitch.h from userspace. Changing the location the file from - * include/linux is pending discussion. - */ -#include "..\include\OvsDpInterface.h" + #if defined OVS_USE_NL_INTERFACE && OVS_USE_NL_INTERFACE == 1 #include "..\include\OvsDpInterfaceExt.h" #endif + +#include "..\include\OvsPub.h" -- cgit v1.2.1