[ovs-dev] [PATCH 2/7] datapath-windows: clarify externalVport

Alin Serdean aserdean at cloudbasesolutions.com
Fri Oct 24 22:14:56 UTC 2014


Acked-by: Alin Gabriel Serdean <aserdean at cloudbasesolutions.com>
Tested-by: Alin Gabriel Serdean <aserdean at cloudbasesolutions.com>

-----Mesaj original-----
De la: dev [mailto:dev-bounces at openvswitch.org] În numele Nithin Raju
Trimis: Friday, October 24, 2014 3:33 AM
Către: dev at openvswitch.org
Subiect: [ovs-dev] [PATCH 2/7] datapath-windows: clarify externalVport

In this patch, we add some explanation about the usage of 'externalVport' in the switch context. Also, we rename 'externalVport'
to 'virtualExternalVport' in alignment with the explanation. Also, we rename 'numVports' to 'numHvVports' since ports are added from 2 ends now.

Signed-off-by: Nithin Raju <nithin at vmware.com>
---
 datapath-windows/ovsext/Actions.c  |    2 +-
 datapath-windows/ovsext/Datapath.c |    8 +++---
 datapath-windows/ovsext/PacketIO.c |    4 +-
 datapath-windows/ovsext/Switch.c   |    4 +-
 datapath-windows/ovsext/Switch.h   |   52 +++++++++++++++++++++++++++++------
 datapath-windows/ovsext/Vport.c    |   24 ++++++++--------
 6 files changed, 64 insertions(+), 30 deletions(-)

diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c
index f5ce12e..3f8c351 100644
--- a/datapath-windows/ovsext/Actions.c
+++ b/datapath-windows/ovsext/Actions.c
@@ -249,7 +249,7 @@ OvsDetectTunnelPkt(OvsForwardingContext *ovsFwdCtx,
          * default port.
          */
         BOOLEAN validSrcPort = (ovsFwdCtx->fwdDetail->SourcePortId ==
-                                ovsFwdCtx->switchContext->externalPortId) ||
+                                
+ ovsFwdCtx->switchContext->virtualExternalPortId) ||
                                (ovsFwdCtx->fwdDetail->SourcePortId ==
                                 NDIS_SWITCH_DEFAULT_PORT_ID);
 
diff --git a/datapath-windows/ovsext/Datapath.c b/datapath-windows/ovsext/Datapath.c
index 761e74c..aede487 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -1513,7 +1513,7 @@ OvsGetVportDumpNext(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
     NdisAcquireRWLockRead(gOvsSwitchContext->dispatchLock, &lockState,
                           NDIS_RWL_AT_DISPATCH_LEVEL);
 
-    if (gOvsSwitchContext->numVports > 0) {
+    if (gOvsSwitchContext->numHvVports > 0) {
         /* inBucket: the bucket, used for lookup */
         UINT32 inBucket = instance->dumpState.index[0];
         /* inIndex: index within the given bucket, used for lookup */ @@ -1802,7 +1802,7 @@ OvsNewVportCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
         vport = gOvsSwitchContext->internalVport;
     } else if (portType == OVS_VPORT_TYPE_NETDEV) {
         if (!strcmp(portName, "external")) {
-            vport = gOvsSwitchContext->externalVport;
+            vport = gOvsSwitchContext->virtualExternalVport;
         } else {
             vport = OvsFindVportByHvName(gOvsSwitchContext, portName);
         }
@@ -1885,8 +1885,8 @@ OvsNewVportCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
         gOvsSwitchContext->internalPortId = vport->portId;
     } else if (vport->ovsType == OVS_VPORT_TYPE_NETDEV &&
                vport->isExternal) {
-        gOvsSwitchContext->externalVport = vport;
-        gOvsSwitchContext->externalPortId = vport->portId;
+        gOvsSwitchContext->virtualExternalVport = vport;
+        gOvsSwitchContext->virtualExternalPortId = vport->portId;
     }
 
     /*
diff --git a/datapath-windows/ovsext/PacketIO.c b/datapath-windows/ovsext/PacketIO.c
index 7eb6ed8..027b42a 100644
--- a/datapath-windows/ovsext/PacketIO.c
+++ b/datapath-windows/ovsext/PacketIO.c
@@ -236,7 +236,7 @@ OvsStartNBLIngress(POVS_SWITCH_CONTEXT switchContext,
                                   dispatch);
 
             ctx = OvsInitExternalNBLContext(switchContext, curNbl,
-                                  sourcePort == switchContext->externalPortId);
+                                  sourcePort == 
+ switchContext->virtualExternalPortId);
             if (ctx == NULL) {
                 RtlInitUnicodeString(&filterReason,
                                      L"Cannot allocate external NBL context."); @@ -291,7 +291,7 @@ OvsStartNBLIngress(POVS_SWITCH_CONTEXT switchContext,
                                                 portNo,
                                                 &key, curNbl,
                                                 sourcePort ==
-                                                switchContext->externalPortId,
+                                                
+ switchContext->virtualExternalPortId,
                                                 &layers, switchContext,
                                                 &missedPackets, &num);
                 if (status == NDIS_STATUS_SUCCESS) { diff --git a/datapath-windows/ovsext/Switch.c b/datapath-windows/ovsext/Switch.c
index f445500..ab00a07 100644
--- a/datapath-windows/ovsext/Switch.c
+++ b/datapath-windows/ovsext/Switch.c
@@ -427,7 +427,7 @@ OvsCleanupSwitchContext(POVS_SWITCH_CONTEXT switchContext)
     OVS_LOG_TRACE("Enter: Delete switchContext:%p", switchContext);
 
     /* We need to do cleanup for tunnel port here. */
-    ASSERT(switchContext->numVports == 0);
+    ASSERT(switchContext->numHvVports == 0);
 
     NdisFreeRWLock(switchContext->dispatchLock);
     NdisFreeSpinLock(&(switchContext->pidHashLock));
@@ -486,7 +486,7 @@ cleanup:
 PVOID
 OvsGetExternalVport()
 {
-    return gOvsSwitchContext->externalVport;
+    return gOvsSwitchContext->virtualExternalVport;
 }
 
 
diff --git a/datapath-windows/ovsext/Switch.h b/datapath-windows/ovsext/Switch.h
index b61462b..11d9df6 100644
--- a/datapath-windows/ovsext/Switch.h
+++ b/datapath-windows/ovsext/Switch.h
@@ -95,26 +95,60 @@ typedef struct _OVS_SWITCH_CONTEXT
 
     UINT32                  dpNo;
 
-    NDIS_SWITCH_PORT_ID     externalPortId;
+    /*
+     * 'virtualExternalVport' represents default external interface. This is
+     * a virtual interface. The friendly name of such an interface has
+     * been observed to be: "Microsoft Default External Interface". This NIC
+     * has 'NicIndex' == 0.
+     *
+     * The "real" physical external NIC has 'NicIndex' > 0. For each
+     * external interface, virtual or physical, NDIS gives an NIC level
+     * OID callback. Note that, even though there are multile "NICs",
+     * there's only one underlying Hyper-V port. Thus, we get a single
+     * NDIS port-level callback, but multiple NDIS NIC-level callbacks.
+     *
+     * The virtual external NIC can be accessed at 'virtualExternalVport', and
+     * is assigned the name "external.defaultAdapter". The virtual external
+     * NIC is not inserted into the 'portIdHashArray' since the port must not
+     * be exposed to OVS userspace.
+     *
+     * The physical external NICs are assigned names "external.%INDEX%",
+     * where '%INDEX%' represents the 'NicIndex' of the NIC.
+     *
+     * While adding a physical external NIC in OvsInitConfiguredSwitchNics(),
+     * some required properties of the vport are available only at the
+     * NDIS port-level. So, these are copied from 'virtualExternalVport'.
+     * The vport created for the physical external NIC is inserted into the
+     * 'portIdHashArray'.
+     *
+     * When the virtual external NIC is torn down or deleted, the
+     * corresponding physical external ports are also torn down or
+     * deleted. The number of physical external NICs is tracked by
+     * 'numPhysicalNics'.
+     */
+    NDIS_SWITCH_PORT_ID     virtualExternalPortId;
     NDIS_SWITCH_PORT_ID     internalPortId;
-    POVS_VPORT_ENTRY        externalVport;  // the virtual adapter vport
+    POVS_VPORT_ENTRY        virtualExternalVport;   // the virtual adapter vport
     POVS_VPORT_ENTRY        internalVport;
 
-    /*
-     * XXX when we support multiple VXLAN ports, we will need a list entry
-     * instead
-     */
     POVS_VPORT_ENTRY        vxlanVport;
 
     PLIST_ENTRY             ovsPortNameHashArray;   // based on ovsName
-    PLIST_ENTRY             portIdHashArray;        // based on portId
+    PLIST_ENTRY             portIdHashArray;        // based on Hyper-V portId
     PLIST_ENTRY             portNoHashArray;        // based on ovs port number
     PLIST_ENTRY             pidHashArray;           // based on packet pids
     NDIS_SPIN_LOCK          pidHashLock;            // Lock for pidHash table
 
+    /*
+     * 'numPhysicalNics' is the number of physical external NICs.
+     * 'numHvVports' is the number of Hyper-V switch ports added to OVS
+     * via the NDIS callbacks.
+     * 'numNonHvVports' is the number of ports added from userspace that are
+     * not on the Hyper-V switch. Eg. tunnel ports.
+     */
     UINT32                  numPhysicalNics;
-    UINT32                  numVports;     // include validation port
-    UINT32                  lastPortIndex;
+    UINT32                  numHvVports;
+    UINT32                  numNonHvVports;
 
     /* Lock taken over the switch. This protects the ports on the switch. */
     PNDIS_RW_LOCK_EX        dispatchLock;
diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c index 0522cfd..3fd40f7 100644
--- a/datapath-windows/ovsext/Vport.c
+++ b/datapath-windows/ovsext/Vport.c
@@ -204,7 +204,7 @@ HvCreateNic(POVS_SWITCH_CONTEXT switchContext,
     if (nicParam->NicType == NdisSwitchNicTypeExternal &&
         nicParam->NicIndex != 0) {
         POVS_VPORT_ENTRY virtVport =
-            (POVS_VPORT_ENTRY)switchContext->externalVport;
+            (POVS_VPORT_ENTRY)switchContext->virtualExternalVport;
         vport = (POVS_VPORT_ENTRY)OvsAllocateVport();
         if (vport == NULL) {
             status = NDIS_STATUS_RESOURCES; @@ -553,8 +553,8 @@ OvsFindVportByPortIdAndNicIndex(POVS_SWITCH_CONTEXT switchContext,
                                 NDIS_SWITCH_PORT_ID portId,
                                 NDIS_SWITCH_NIC_INDEX index)  {
-    if (portId == switchContext->externalPortId) {
-        return (POVS_VPORT_ENTRY)switchContext->externalVport;
+    if (portId == switchContext->virtualExternalPortId) {
+        return (POVS_VPORT_ENTRY)switchContext->virtualExternalVport;
     } else if (switchContext->internalPortId == portId) {
         return (POVS_VPORT_ENTRY)switchContext->internalVport;
     } else {
@@ -716,8 +716,8 @@ OvsInitVportCommon(POVS_SWITCH_CONTEXT switchContext,
     switch (vport->portType) {
     case NdisSwitchPortTypeExternal:
         if (vport->nicIndex == 0) {
-            switchContext->externalPortId = vport->portId;
-            switchContext->externalVport = vport;
+            switchContext->virtualExternalPortId = vport->portId;
+            switchContext->virtualExternalVport = vport;
             RtlStringCbPrintfA(vport->ovsName, OVS_MAX_PORT_NAME_LENGTH - 1,
                 "external.virtualAdapter");
         } else {
@@ -749,7 +749,7 @@ OvsInitVportCommon(POVS_SWITCH_CONTEXT switchContext,
     hash = OvsJhashWords(&vport->portId, 1, OVS_HASH_BASIS);
     InsertHeadList(&switchContext->portIdHashArray[hash & OVS_VPORT_MASK],
                    &vport->portIdLink);
-    switchContext->numVports++;
+    switchContext->numHvVports++;
     return NDIS_STATUS_SUCCESS;
 }
 
@@ -760,8 +760,8 @@ OvsRemoveAndDeleteVport(POVS_SWITCH_CONTEXT switchContext,
     if (vport->isExternal) {
         if (vport->nicIndex == 0) {
             ASSERT(switchContext->numPhysicalNics == 0);
-            switchContext->externalPortId = 0;
-            switchContext->externalVport = NULL;
+            switchContext->virtualExternalPortId = 0;
+            switchContext->virtualExternalVport = NULL;
             OvsFreeMemory(vport);
             return;
         } else {
@@ -790,7 +790,7 @@ OvsRemoveAndDeleteVport(POVS_SWITCH_CONTEXT switchContext,
     RemoveEntryList(&vport->ovsNameLink);
     RemoveEntryList(&vport->portIdLink);
     RemoveEntryList(&vport->portNoLink);
-    switchContext->numVports--;
+    switchContext->numHvVports--;
     OvsFreeMemory(vport);
 }
 
@@ -877,7 +877,7 @@ OvsInitConfiguredSwitchNics(POVS_SWITCH_CONTEXT switchContext)
         if (nicParam->NicType == NdisSwitchNicTypeExternal &&
             nicParam->NicIndex != 0) {
             POVS_VPORT_ENTRY virtVport =
-                   (POVS_VPORT_ENTRY)switchContext->externalVport;
+                   
+ (POVS_VPORT_ENTRY)switchContext->virtualExternalVport;
             vport = OvsAllocateVport();
             if (vport) {
                 OvsInitPhysNicVport(vport, virtVport, nicParam->NicIndex); @@ -924,9 +924,9 @@ OvsClearAllSwitchVports(POVS_SWITCH_CONTEXT switchContext)
         }
     }
 
-    if (switchContext->externalVport) {
+    if (switchContext->virtualExternalVport) {
         OvsRemoveAndDeleteVport(switchContext,
-                        (POVS_VPORT_ENTRY)switchContext->externalVport);
+                        
+ (POVS_VPORT_ENTRY)switchContext->virtualExternalVport);
     }
 }
 
--
1.7.4.1

_______________________________________________
dev mailing list
dev at openvswitch.org
http://openvswitch.org/mailman/listinfo/dev


More information about the dev mailing list