Acked-by: Sairam Venugopal <vsai...@vmware.com>

On 11/18/15, 8:13 AM, "Nithin Raju" <nit...@vmware.com> wrote:

>The workflow being implemented is that, we need to assign a special
>name to the internal and external NICs, and it it not necessary to do
>that from InitHvVportCommon(). The purpose of InitHvVportCommon() is to
>insert the vport into the hash tables and update the switch context.
>
>We special case the name assignment in HvCreateNIC() for
>internal and external NICs. That seems more meaningful.
>
>Also, reused HvCreatePort() to allocate a Vport for each of the external
>NICs with NicIndex != 0. Due to this HvCreatePort() now takes 'nicIndex'
>as an additional parameter.
>
>Renamed InitHvVportCommon() to UpdateSwitchCtxWithVport().
>
>Signed-off-by: Nithin Raju <nit...@vmware.com>
>---
> datapath-windows/ovsext/Oid.c   |   2 +-
> datapath-windows/ovsext/Vport.c | 185
>++++++++++++++++++++++------------------
> datapath-windows/ovsext/Vport.h |   3 +-
> 3 files changed, 104 insertions(+), 86 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Oid.c b/datapath-windows/ovsext/Oid.c
>index ea18790..93894ae 100644
>--- a/datapath-windows/ovsext/Oid.c
>+++ b/datapath-windows/ovsext/Oid.c
>@@ -169,7 +169,7 @@ OvsProcessSetOidPort(POVS_SWITCH_CONTEXT switchObject,
> 
>     switch(setInfo->Oid) {
>     case OID_SWITCH_PORT_CREATE:
>-        status = HvCreatePort(switchObject, portParam);
>+        status = HvCreatePort(switchObject, portParam, 0);
>         break;
>     case OID_SWITCH_PORT_UPDATED:
>         status = HvUpdatePort(switchObject, portParam);
>diff --git a/datapath-windows/ovsext/Vport.c
>b/datapath-windows/ovsext/Vport.c
>index dac537f..69e9513 100644
>--- a/datapath-windows/ovsext/Vport.c
>+++ b/datapath-windows/ovsext/Vport.c
>@@ -68,8 +68,8 @@ static VOID OvsInitVportWithPortParam(POVS_VPORT_ENTRY
>vport,
>                 PNDIS_SWITCH_PORT_PARAMETERS portParam);
> static VOID OvsInitVportWithNicParam(POVS_SWITCH_CONTEXT switchContext,
>                 POVS_VPORT_ENTRY vport, PNDIS_SWITCH_NIC_PARAMETERS
>nicParam);
>-static VOID OvsInitPhysNicVport(POVS_VPORT_ENTRY physExtVPort,
>-                POVS_VPORT_ENTRY virtExtVport, UINT32 nicIndex);
>+static VOID OvsCopyPortParamsFromVport(POVS_VPORT_ENTRY vport,
>+                                       PNDIS_SWITCH_PORT_PARAMETERS
>portParam);
> static __inline VOID OvsWaitActivate(POVS_SWITCH_CONTEXT switchContext,
>                                      ULONG sleepMicroSec);
> static NTSTATUS OvsGetExtInfoIoctl(POVS_VPORT_GET vportGet,
>@@ -81,9 +81,8 @@ static NTSTATUS
>CreateNetlinkMesgForNetdev(POVS_VPORT_EXT_INFO info,
>                                            int dpIfIndex);
> static POVS_VPORT_ENTRY OvsFindVportByHvNameW(POVS_SWITCH_CONTEXT
>switchContext,
>                                               PWSTR wsName, SIZE_T
>wstrSize);
>-static NDIS_STATUS InitHvVportCommon(POVS_SWITCH_CONTEXT switchContext,
>-                                     POVS_VPORT_ENTRY vport,
>-                                     BOOLEAN newPort);
>+static VOID UpdateSwitchCtxWithVport(POVS_SWITCH_CONTEXT switchContext,
>+                                     POVS_VPORT_ENTRY vport, BOOLEAN
>newPort);
> static NTSTATUS OvsRemoveTunnelVport(POVS_USER_PARAMS_CONTEXT
>usrParamsCtx,
>                                      POVS_SWITCH_CONTEXT switchContext,
>                                      POVS_VPORT_ENTRY vport,
>@@ -98,11 +97,16 @@ static VOID OvsTunnelVportPendingRemove(PVOID context,
> static VOID AssignNicNameSpecial(POVS_VPORT_ENTRY vport);
> 
> /*
>- * Functions implemented in relaton to NDIS port manipulation.
>+ * 
>--------------------------------------------------------------------------
>+ *  Creates a Vport entry for a Hyper-V switch port. 'nicIndex' is
>typically
>+ *  associated with a NIC than a port. We use it here for the special
>case
>+ *  where we need to create a Vport for an external NIC with NicIndex >
>0.
>+ * 
>--------------------------------------------------------------------------
>  */
> NDIS_STATUS
> HvCreatePort(POVS_SWITCH_CONTEXT switchContext,
>-             PNDIS_SWITCH_PORT_PARAMETERS portParam)
>+             PNDIS_SWITCH_PORT_PARAMETERS portParam,
>+             NDIS_SWITCH_NIC_INDEX nicIndex)
> {
>     POVS_VPORT_ENTRY vport;
>     LOCK_STATE_EX lockState;
>@@ -114,7 +118,7 @@ HvCreatePort(POVS_SWITCH_CONTEXT switchContext,
>     NdisAcquireRWLockWrite(switchContext->dispatchLock, &lockState, 0);
>     /* Lookup by port ID. */
>     vport = OvsFindVportByPortIdAndNicIndex(switchContext,
>-                                            portParam->PortId, 0);
>+                                            portParam->PortId, nicIndex);
>     if (vport != NULL) {
>         OVS_LOG_ERROR("Port add failed due to duplicate port name, "
>                       "port Id: %u", portParam->PortId);
>@@ -163,7 +167,8 @@ HvCreatePort(POVS_SWITCH_CONTEXT switchContext,
>         newPort = TRUE;
>     }
>     OvsInitVportWithPortParam(vport, portParam);
>-    InitHvVportCommon(switchContext, vport, newPort);
>+    vport->nicIndex = nicIndex;
>+    UpdateSwitchCtxWithVport(switchContext, vport, newPort);
> 
> create_port_done:
>     NdisReleaseRWLock(switchContext->dispatchLock, &lockState);
>@@ -173,7 +178,9 @@ create_port_done:
> 
> 
> /*
>- * Function updating the port properties
>+ * 
>--------------------------------------------------------------------------
>+ * Function to process updates to a port on the Hyper-Vs witch.
>+ * 
>--------------------------------------------------------------------------
>  */
> NDIS_STATUS
> HvUpdatePort(POVS_SWITCH_CONTEXT switchContext,
>@@ -226,6 +233,12 @@ update_port_done:
>     return NDIS_STATUS_SUCCESS;
> }
> 
>+
>+/*
>+ * 
>--------------------------------------------------------------------------
>+ * Function to process teardown of a port on the Hyper-V switch.
>+ * 
>--------------------------------------------------------------------------
>+ */
> VOID
> HvTeardownPort(POVS_SWITCH_CONTEXT switchContext,
>                PNDIS_SWITCH_PORT_PARAMETERS portParam)
>@@ -250,7 +263,11 @@ HvTeardownPort(POVS_SWITCH_CONTEXT switchContext,
>     VPORT_PORT_EXIT(portParam);
> }
> 
>-
>+/*
>+ * 
>--------------------------------------------------------------------------
>+ * Function to process deletion of a port on the Hyper-V switch.
>+ * 
>--------------------------------------------------------------------------
>+ */
> VOID
> HvDeletePort(POVS_SWITCH_CONTEXT switchContext,
>              PNDIS_SWITCH_PORT_PARAMETERS portParams)
>@@ -282,7 +299,9 @@ HvDeletePort(POVS_SWITCH_CONTEXT switchContext,
> 
> 
> /*
>- * Functions implemented in relaton to NDIS NIC manipulation.
>+ * 
>--------------------------------------------------------------------------
>+ * Function to process addition of a NIC connection on the Hyper-V
>switch.
>+ * 
>--------------------------------------------------------------------------
>  */
> NDIS_STATUS
> HvCreateNic(POVS_SWITCH_CONTEXT switchContext,
>@@ -308,15 +327,11 @@ HvCreateNic(POVS_SWITCH_CONTEXT switchContext,
>     }
> 
>     NdisAcquireRWLockWrite(switchContext->dispatchLock, &lockState, 0);
>-    vport = OvsFindVportByPortIdAndNicIndex(switchContext,
>nicParam->PortId, 0);
>-    if (vport == NULL) {
>-        OVS_LOG_ERROR("Create NIC without Switch Port,"
>-                      " PortId: %x, NicIndex: %d",
>-                      nicParam->PortId, nicParam->NicIndex);
>-        status = NDIS_STATUS_INVALID_PARAMETER;
>-        goto add_nic_done;
>-    }
>-
>+    /*
>+     * There can be one or more NICs for the external port. We create a
>vport
>+     * structure for each such NIC, and each NIC inherits a lot of
>properties
>+     * from the parent external port.
>+     */
>     if (nicParam->NicType == NdisSwitchNicTypeExternal &&
>         nicParam->NicIndex != 0) {
>         POVS_VPORT_ENTRY virtExtVport =
>@@ -326,6 +341,7 @@ HvCreateNic(POVS_SWITCH_CONTEXT switchContext,
>                                                 nicParam->PortId,
>                                                 nicParam->NicIndex);
>         if (vport == NULL) {
>+            NDIS_SWITCH_PORT_PARAMETERS portParam;
>             /* Find by interface name */
>             WCHAR interfaceName[IF_MAX_STRING_SIZE] = { 0 };
>             NET_LUID interfaceLuid = { 0 };
>@@ -346,27 +362,33 @@ HvCreateNic(POVS_SWITCH_CONTEXT switchContext,
>                 }
>             }
> 
>-            if (vport == NULL) {
>-                /* XXX: Handle this event appropriately */
>-                vport = (POVS_VPORT_ENTRY)OvsAllocateVport();
>-                if (vport == NULL) {
>-                    status = NDIS_STATUS_RESOURCES;
>-                    goto add_nic_done;
>-                }
>+            OvsCopyPortParamsFromVport(virtExtVport, &portParam);
>+            NdisReleaseRWLock(switchContext->dispatchLock, &lockState);
>+            status = HvCreatePort(switchContext, &portParam,
>+                                  nicParam->NicIndex);
>+            NdisAcquireRWLockWrite(switchContext->dispatchLock,
>&lockState, 0);
>+            if (status != NDIS_STATUS_SUCCESS) {
>+                goto add_nic_done;
>             }
>         }
>+    }
> 
>-        OvsInitPhysNicVport(vport, virtExtVport, nicParam->NicIndex);
>-        OvsInitVportWithNicParam(switchContext, vport, nicParam);
>-        status = InitHvVportCommon(switchContext, vport, TRUE);
>-        vport->isAbsentOnHv = FALSE;
>-        if (status != NDIS_STATUS_SUCCESS) {
>-            OvsFreeMemoryWithTag(vport, OVS_VPORT_POOL_TAG);
>-            goto add_nic_done;
>-        }
>-    } else {
>-        OvsInitVportWithNicParam(switchContext, vport, nicParam);
>+    vport = OvsFindVportByPortIdAndNicIndex(switchContext,
>nicParam->PortId,
>+                                            nicParam->NicIndex);
>+    if (vport == NULL) {
>+        OVS_LOG_ERROR("Create NIC without Switch Port,"
>+                      " PortId: %x, NicIndex: %d",
>+                      nicParam->PortId, nicParam->NicIndex);
>+        status = NDIS_STATUS_INVALID_PARAMETER;
>+        goto add_nic_done;
>+    }
>+    OvsInitVportWithNicParam(switchContext, vport, nicParam);
>+    if (nicParam->NicType == NdisSwitchNicTypeInternal ||
>+        (nicParam->NicType == NdisSwitchNicTypeExternal &&
>+         nicParam->NicIndex != 0)) {
>+        AssignNicNameSpecial(vport);
>     }
>+
>     portNo = vport->portNo;
>     if (vport->ovsState == OVS_STATE_CONNECTED) {
>         event = OVS_EVENT_CONNECT | OVS_EVENT_LINK_UP;
>@@ -393,8 +415,11 @@ done:
>     return status;
> }
> 
>-
>-/* Mark already created NIC as connected. */
>+/*
>+ * 
>--------------------------------------------------------------------------
>+ * Function to process connection event of a NIC on the Hyper-V switch.
>+ * 
>--------------------------------------------------------------------------
>+ */
> VOID
> HvConnectNic(POVS_SWITCH_CONTEXT switchContext,
>              PNDIS_SWITCH_NIC_PARAMETERS nicParam)
>@@ -442,6 +467,12 @@ done:
>     VPORT_NIC_EXIT(nicParam);
> }
> 
>+
>+/*
>+ * 
>--------------------------------------------------------------------------
>+ * Function to process updates to a NIC on the Hyper-V switch.
>+ * 
>--------------------------------------------------------------------------
>+ */
> VOID
> HvUpdateNic(POVS_SWITCH_CONTEXT switchContext,
>             PNDIS_SWITCH_NIC_PARAMETERS nicParam)
>@@ -517,7 +548,11 @@ update_nic_done:
>     VPORT_NIC_EXIT(nicParam);
> }
> 
>-
>+/*
>+ * 
>--------------------------------------------------------------------------
>+ * Function to process disconnect event of a NIC on the Hyper-V switch.
>+ * 
>--------------------------------------------------------------------------
>+ */
> VOID
> HvDisconnectNic(POVS_SWITCH_CONTEXT switchContext,
>                 PNDIS_SWITCH_NIC_PARAMETERS nicParam)
>@@ -569,7 +604,11 @@ done:
>     VPORT_NIC_EXIT(nicParam);
> }
> 
>-
>+/*
>+ * 
>--------------------------------------------------------------------------
>+ * Function to process delete event of a NIC on the Hyper-V switch.
>+ * 
>--------------------------------------------------------------------------
>+ */
> VOID
> HvDeleteNic(POVS_SWITCH_CONTEXT switchContext,
>             PNDIS_SWITCH_NIC_PARAMETERS nicParam)
>@@ -901,33 +940,23 @@ OvsInitVportWithNicParam(POVS_SWITCH_CONTEXT
>switchContext,
> 
> /*
>  * 
>--------------------------------------------------------------------------
>- * Copies the relevant NDIS port properties from a virtual (pseudo)
>external
>- * NIC to a physical (real) external NIC.
>+ * Populates 'portParam' based on 'vport'.
>  * 
>--------------------------------------------------------------------------
>  */
> static VOID
>-OvsInitPhysNicVport(POVS_VPORT_ENTRY physExtVport,
>-                    POVS_VPORT_ENTRY virtExtVport,
>-                    UINT32 physNicIndex)
>+OvsCopyPortParamsFromVport(POVS_VPORT_ENTRY vport,
>+                           PNDIS_SWITCH_PORT_PARAMETERS portParam)
> {
>-    physExtVport->portType = virtExtVport->portType;
>-    physExtVport->portState = virtExtVport->portState;
>-    physExtVport->portId = virtExtVport->portId;
>-    physExtVport->nicState = NdisSwitchNicStateUnknown;
>-    physExtVport->ovsType = OVS_VPORT_TYPE_NETDEV;
>-    physExtVport->isExternal = TRUE;
>-    physExtVport->isBridgeInternal = FALSE;
>-    physExtVport->nicIndex = (NDIS_SWITCH_NIC_INDEX)physNicIndex;
>-
>-    RtlCopyMemory(&physExtVport->hvPortName, &virtExtVport->hvPortName,
>+    portParam->Flags = 0;
>+    portParam->PortId = vport->portId;
>+    RtlCopyMemory(&portParam->PortName, &vport->hvPortName,
>                   sizeof (NDIS_SWITCH_PORT_NAME));
>-
>-    /* 'portFriendlyName' is overwritten later. */
>-    RtlCopyMemory(&physExtVport->portFriendlyName,
>-                  &virtExtVport->portFriendlyName,
>+    RtlCopyMemory(&portParam->PortFriendlyName,
>+                  &vport->portFriendlyName,
>                   sizeof(NDIS_SWITCH_PORT_FRIENDLYNAME));
>-
>-    physExtVport->ovsState = OVS_STATE_PORT_CREATED;
>+    portParam->PortType = vport->portType;
>+    portParam->IsValidationPort = FALSE;
>+    portParam->PortState = vport->portState;
> }
> 
> /*
>@@ -1017,7 +1046,7 @@ AssignNicNameSpecial(POVS_VPORT_ENTRY vport)
>     NET_LUID interfaceLuid = { 0 };
>     size_t len = 0;
> 
>-    ASSERT(vport->portType == NdisSwitchPortTypeExternal ||
>+    ASSERT(vport->portType == NdisSwitchPortTypeExternal ||
>            vport->portType == NdisSwitchPortTypeInternal);
> 
>     status = ConvertInterfaceGuidToLuid(&vport->netCfgInstanceId,
>@@ -1060,26 +1089,17 @@ AssignNicNameSpecial(POVS_VPORT_ENTRY vport)
>  *
>  * Inserts the port into 'portIdHashArray' and caches the pointer in the
>  * 'switchContext' if needed.
>- *
>- * For external NIC, assigns the name for the NIC.
>  * 
>--------------------------------------------------------------------------
>  */
>-static NDIS_STATUS
>-InitHvVportCommon(POVS_SWITCH_CONTEXT switchContext,
>-                  POVS_VPORT_ENTRY vport,
>-                  BOOLEAN newPort)
>+static VOID
>+UpdateSwitchCtxWithVport(POVS_SWITCH_CONTEXT switchContext,
>+                         POVS_VPORT_ENTRY vport,
>+                         BOOLEAN newPort)
> {
>     UINT32 hash;
> 
>     switch (vport->portType) {
>     case NdisSwitchPortTypeExternal:
>-        /*
>-         * Overwrite the 'portFriendlyName' of this external vport. The
>reason
>-         * for having this in common code is to be able to call it from
>the NDIS
>-         * Port callback as well as the NDIS NIC callback.
>-         */
>-        AssignNicNameSpecial(vport);
>-
>         if (vport->nicIndex == 0) {
>             switchContext->virtualExternalPortId = vport->portId;
>             switchContext->virtualExternalVport = vport;
>@@ -1089,9 +1109,6 @@ InitHvVportCommon(POVS_SWITCH_CONTEXT switchContext,
>         break;
>     case NdisSwitchPortTypeInternal:
>         ASSERT(vport->isBridgeInternal == FALSE);
>-
>-        /* Overwrite the 'portFriendlyName' of the internal vport. */
>-        AssignNicNameSpecial(vport);
>         switchContext->internalPortId = vport->portId;
>         switchContext->internalVport = vport;
>         break;
>@@ -1107,7 +1124,7 @@ InitHvVportCommon(POVS_SWITCH_CONTEXT switchContext,
>      */
>     if (vport->portType == NdisSwitchPortTypeExternal &&
>         vport->nicIndex == 0) {
>-        return NDIS_STATUS_SUCCESS;
>+        return;
>     }
> 
>     /*
>@@ -1121,7 +1138,7 @@ InitHvVportCommon(POVS_SWITCH_CONTEXT switchContext,
>     if (newPort) {
>         switchContext->numHvVports++;
>     }
>-    return NDIS_STATUS_SUCCESS;
>+    return;
> }
> 
> /*
>@@ -1183,7 +1200,7 @@ InitOvsVportCommon(POVS_SWITCH_CONTEXT
>switchContext,
> /*
>  * 
>--------------------------------------------------------------------------
>  * Provides functionality that is partly complementatry to
>- * InitOvsVportCommon()/InitHvVportCommon().
>+ * InitOvsVportCommon()/UpdateSwitchCtxWithVport().
>  *
>  * 'hvDelete' indicates if caller is removing the vport as a result of
>the
>  * port being removed on the Hyper-V switch.
>@@ -1370,7 +1387,7 @@ OvsAddConfiguredSwitchPorts(POVS_SWITCH_CONTEXT
>switchContext)
>              continue;
>          }
> 
>-         status = HvCreatePort(switchContext, portParam);
>+         status = HvCreatePort(switchContext, portParam, 0);
>          if (status != STATUS_SUCCESS && status !=
>STATUS_DATA_NOT_ACCEPTED) {
>              break;
>          }
>diff --git a/datapath-windows/ovsext/Vport.h
>b/datapath-windows/ovsext/Vport.h
>index ead55a9..0d56484 100644
>--- a/datapath-windows/ovsext/Vport.h
>+++ b/datapath-windows/ovsext/Vport.h
>@@ -155,7 +155,8 @@ VOID OvsClearAllSwitchVports(struct
>_OVS_SWITCH_CONTEXT *switchContext);
> NDIS_STATUS HvCreateNic(POVS_SWITCH_CONTEXT switchContext,
>                         PNDIS_SWITCH_NIC_PARAMETERS nicParam);
> NDIS_STATUS HvCreatePort(POVS_SWITCH_CONTEXT switchContext,
>-                         PNDIS_SWITCH_PORT_PARAMETERS portParam);
>+                         PNDIS_SWITCH_PORT_PARAMETERS portParam,
>+                         NDIS_SWITCH_NIC_INDEX nicIndex);
> NDIS_STATUS HvUpdatePort(POVS_SWITCH_CONTEXT switchContext,
>                          PNDIS_SWITCH_PORT_PARAMETERS portParam);
> VOID HvTeardownPort(POVS_SWITCH_CONTEXT switchContext,
>-- 
>1.8.5.6
>
>_______________________________________________
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=BQIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=AqF-VVTA_nQvLT-FkwZLBiCCd6Vzsy
>2IG5X_VYSHDwU&s=d-W572taA8d9fL0jEV8u7iQVPh5KthXica62lyVaS-c&e= 

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

Reply via email to