]> git.proxmox.com Git - mirror_ovs.git/commitdiff
datapath-windows: fix OVS_VPORT_TYPE
authorSamuel Ghinet <sghinet@cloudbasesolutions.com>
Thu, 25 Sep 2014 21:20:25 +0000 (21:20 +0000)
committerBen Pfaff <blp@nicira.com>
Fri, 26 Sep 2014 17:21:34 +0000 (10:21 -0700)
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 <sghinet@cloudbasesolutions.com>
Acked-by: Nithin Raju <nithin@vmware.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
datapath-windows/include/OvsDpInterfaceExt.h
datapath-windows/include/OvsPub.h
datapath-windows/ovsext/Actions.c
datapath-windows/ovsext/Tunnel.c
datapath-windows/ovsext/Vport.c
datapath-windows/ovsext/Vport.h
datapath-windows/ovsext/Vxlan.c
datapath-windows/ovsext/precomp.h

index 64fd20e42f45ab8196b0a296ab9316c77964bb5e..72b2e8e83feaa2cac07e4976ef458e95e87bdfa7 100644 (file)
@@ -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_ */
index 36814c4821883a8d3046e11ca74dc175338e3ff8..ff0e8ce20ee9cf70daef679f8730c95305239b99 100644 (file)
@@ -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
 
index 35ebfdf8c7bd12b7f4658fe25f3f6d2393d5ffd0..180b6b88ecc3421930def9192c130dbb4f9b6e5b 100644 (file)
@@ -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.
index 2e7da10def3c076848edc7404b22a3f2ab7a7e98..304ab598624ea8ebb0d6ec937eb9de70d76f8e79 100644 (file)
@@ -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;
 
index 0d1e4abb9f6a78e7d43f98a3fc84a88d79be7957..14b68d9936dab367497dbb238dd4ba0d0267c08f 100644 (file)
@@ -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));
index 80bdea8eacc0b01abf59622444952b3f93eced86..fe48d1e6190fc82ea831e90b0adb541f23c6e893 100644 (file)
@@ -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.");
index 3a1291ca3cb7c9c0bf6db5f92e93c9d0b38f781d..7f94634f9eb8e87d88cdd9a823f06a81f59fe251 100644 (file)
@@ -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;
     }
index 765075a728f5493b7ef89b1f52a54b2923ed54b8..a17f2d28c41f88dc2c1e83b9568fbbe2df1d639b 100644 (file)
 #include <Strsafe.h>
 
 #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"