diff mbox

[ovs-dev,1/6,v2] datapath-windows: refactor port enumeration code

Message ID 1447863219-20084-2-git-send-email-nithin@vmware.com
State Superseded
Headers show

Commit Message

Nithin Raju Nov. 18, 2015, 4:13 p.m. UTC
We already have functions HvCreatePort() and HvCreateNic() to
do the work. Might as well use that during port enumeration.
More refactoring in later patches.

Signed-off-by: Nithin Raju <nithin@vmware.com>
---
 datapath-windows/ovsext/Switch.c |  6 ++-
 datapath-windows/ovsext/Vport.c  | 89 ++++++++++++----------------------------
 2 files changed, 31 insertions(+), 64 deletions(-)

Comments

Sairam Venugopal Nov. 18, 2015, 7:13 p.m. UTC | #1
Thanks for the patch. This looks much cleaner than before.

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


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

>We already have functions HvCreatePort() and HvCreateNic() to
>do the work. Might as well use that during port enumeration.
>More refactoring in later patches.
>
>Signed-off-by: Nithin Raju <nithin@vmware.com>
>---
> datapath-windows/ovsext/Switch.c |  6 ++-
> datapath-windows/ovsext/Vport.c  | 89
>++++++++++++----------------------------
> 2 files changed, 31 insertions(+), 64 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Switch.c
>b/datapath-windows/ovsext/Switch.c
>index 2878e91..a783ea1 100644
>--- a/datapath-windows/ovsext/Switch.c
>+++ b/datapath-windows/ovsext/Switch.c
>@@ -549,6 +549,7 @@ OvsActivateSwitch(POVS_SWITCH_CONTEXT switchContext)
>     OVS_LOG_TRACE("Enter: activate switch %p, dpNo: %ld",
>                   switchContext, switchContext->dpNo);
> 
>+    switchContext->isActivated = TRUE;
>     status = OvsAddConfiguredSwitchPorts(switchContext);
> 
>     if (status != NDIS_STATUS_SUCCESS) {
>@@ -563,10 +564,13 @@ OvsActivateSwitch(POVS_SWITCH_CONTEXT switchContext)
>         OvsClearAllSwitchVports(switchContext);
>         goto cleanup;
>     }
>-    switchContext->isActivated = TRUE;
>     OvsPostEvent(OVS_DEFAULT_PORT_NO, OVS_DEFAULT_EVENT_STATUS);
> 
> cleanup:
>+    if (status != NDIS_STATUS_SUCCESS) {
>+        switchContext->isActivated = TRUE;
>+    }
>+
>     OVS_LOG_TRACE("Exit: activate switch:%p, isActivated: %s, status =
>%lx",
>                   switchContext,
>                   (switchContext->isActivated ? "TRUE" : "FALSE"),
>status);
>diff --git a/datapath-windows/ovsext/Vport.c
>b/datapath-windows/ovsext/Vport.c
>index 3f90039..dac537f 100644
>--- a/datapath-windows/ovsext/Vport.c
>+++ b/datapath-windows/ovsext/Vport.c
>@@ -376,6 +376,12 @@ HvCreateNic(POVS_SWITCH_CONTEXT switchContext,
> 
> add_nic_done:
>     NdisReleaseRWLock(switchContext->dispatchLock, &lockState);
>+    if (status == STATUS_SUCCESS &&
>+        (vport->portType == NdisSwitchPortTypeInternal ||
>+         (vport->portType == NdisSwitchPortTypeExternal &&
>+          nicParam->NicIndex != 0))) {
>+        AssignNicNameSpecial(vport);
>+    }
>     if (portNo != OVS_DPPORT_NUMBER_INVALID && event) {
>         OvsPostEvent(portNo, event);
>     }
>@@ -1017,6 +1023,10 @@ AssignNicNameSpecial(POVS_VPORT_ENTRY vport)
>     status = ConvertInterfaceGuidToLuid(&vport->netCfgInstanceId,
>                                         &interfaceLuid);
>     if (status == STATUS_SUCCESS) {
>+        /*
>+         * Must be called from PASSIVE_LEVEL. Resulted in a
>+         * STATUS_INVALID_DEVICE_REQUEST if not.
>+         */
>         status = ConvertInterfaceLuidToAlias(&interfaceLuid,
>interfaceName,
>                                              IF_MAX_STRING_SIZE + 1);
>         if (status == STATUS_SUCCESS) {
>@@ -1333,8 +1343,11 @@ OvsRemoveTunnelVport(POVS_USER_PARAMS_CONTEXT
>usrParamsCtx,
>                                  tunnelContext);
> }
> 
>-
>-
>+/*
>+ * 
>--------------------------------------------------------------------------
>+ * Enumerates the ports on the Hyper-V switch.
>+ * 
>--------------------------------------------------------------------------
>+ */
> NDIS_STATUS
> OvsAddConfiguredSwitchPorts(POVS_SWITCH_CONTEXT switchContext)
> {
>@@ -1342,7 +1355,6 @@ OvsAddConfiguredSwitchPorts(POVS_SWITCH_CONTEXT
>switchContext)
>     ULONG arrIndex;
>     PNDIS_SWITCH_PORT_PARAMETERS portParam;
>     PNDIS_SWITCH_PORT_ARRAY portArray = NULL;
>-    POVS_VPORT_ENTRY vport;
> 
>     OVS_LOG_TRACE("Enter: switchContext:%p", switchContext);
> 
>@@ -1358,16 +1370,9 @@ OvsAddConfiguredSwitchPorts(POVS_SWITCH_CONTEXT
>switchContext)
>              continue;
>          }
> 
>-         vport = (POVS_VPORT_ENTRY)OvsAllocateVport();
>-         if (vport == NULL) {
>-             status = NDIS_STATUS_RESOURCES;
>-             goto cleanup;
>-         }
>-         OvsInitVportWithPortParam(vport, portParam);
>-         status = InitHvVportCommon(switchContext, vport, TRUE);
>-         if (status != NDIS_STATUS_SUCCESS) {
>-             OvsFreeMemoryWithTag(vport, OVS_VPORT_POOL_TAG);
>-             goto cleanup;
>+         status = HvCreatePort(switchContext, portParam);
>+         if (status != STATUS_SUCCESS && status !=
>STATUS_DATA_NOT_ACCEPTED) {
>+             break;
>          }
>     }
> 
>@@ -1383,7 +1388,11 @@ cleanup:
>     return status;
> }
> 
>-
>+/*
>+ * 
>--------------------------------------------------------------------------
>+ * Enumerates the NICs on the Hyper-V switch.
>+ * 
>--------------------------------------------------------------------------
>+ */
> NDIS_STATUS
> OvsInitConfiguredSwitchNics(POVS_SWITCH_CONTEXT switchContext)
> {
>@@ -1391,7 +1400,6 @@ OvsInitConfiguredSwitchNics(POVS_SWITCH_CONTEXT
>switchContext)
>     PNDIS_SWITCH_NIC_ARRAY nicArray = NULL;
>     ULONG arrIndex;
>     PNDIS_SWITCH_NIC_PARAMETERS nicParam;
>-    POVS_VPORT_ENTRY vport;
> 
>     OVS_LOG_TRACE("Enter: switchContext: %p", switchContext);
>     /*
>@@ -1402,63 +1410,18 @@ OvsInitConfiguredSwitchNics(POVS_SWITCH_CONTEXT
>switchContext)
>         goto cleanup;
>     }
>     for (arrIndex = 0; arrIndex < nicArray->NumElements; ++arrIndex) {
>-
>         nicParam = NDIS_SWITCH_NIC_AT_ARRAY_INDEX(nicArray, arrIndex);
> 
>         /*
>          * XXX: Check if the port is configured with a VLAN. Disallow
>such a
>          * configuration, since we don't support tag-in-tag.
>-         */
>-
>-        /*
>          * XXX: Check if the port is connected to a VF. Disconnect the
>VF in
>          * such a case.
>          */
> 
>-        if (nicParam->NicType == NdisSwitchNicTypeExternal &&
>-            nicParam->NicIndex != 0) {
>-            POVS_VPORT_ENTRY virtExtVport =
>-                   (POVS_VPORT_ENTRY)switchContext->virtualExternalVport;
>-
>-            vport = OvsAllocateVport();
>-            if (vport) {
>-                OvsInitPhysNicVport(vport, virtExtVport,
>-                                    nicParam->NicIndex);
>-                OvsInitVportWithNicParam(switchContext, vport, nicParam);
>-                status = InitHvVportCommon(switchContext, vport, TRUE);
>-                if (status != NDIS_STATUS_SUCCESS) {
>-                    OvsFreeMemoryWithTag(vport, OVS_VPORT_POOL_TAG);
>-                    vport = NULL;
>-                }
>-            } else {
>-                OVS_LOG_ERROR("Fail to allocate vport.");
>-                continue;
>-            }
>-        } else {
>-            vport = OvsFindVportByPortIdAndNicIndex(switchContext,
>-                                                    nicParam->PortId,
>-                                                    nicParam->NicIndex);
>-            if (vport == NULL) {
>-                OVS_LOG_ERROR(
>-                    "Could not found vport with portId: %d and nicIndex:
>%d.",
>-                    nicParam->PortId, nicParam->NicIndex);
>-                continue;
>-            }
>-            OvsInitVportWithNicParam(switchContext, vport, nicParam);
>-        }
>-
>-        if (nicParam->NicType == NdisSwitchNicTypeInternal) {
>-            /*
>-             * Overwrite the 'portFriendlyName' of the internal vport.
>-             * Note:
>-             * The call to AssignNicNameSpecial() is needed here,
>because the
>-             * necessary 'netCfgInstanceId' of the vport is available.
>-             * On port creation the latter information is missing and the
>-             * 'portFriendlyName' of the vport fails to be overwritten
>with the
>-             * correct information.
>-             */
>-            AssignNicNameSpecial(vport);
>-            OvsInternalAdapterUp(vport->portNo,
>&nicParam->NetCfgInstanceId);
>+        status = HvCreateNic(switchContext, nicParam);
>+        if (status == NDIS_STATUS_SUCCESS) {
>+            HvConnectNic(switchContext, nicParam);
>         }
>     }
> cleanup:
>-- 
>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=c5ad4f94DxcXpKQTxrIqKP4P4YU2oo
>AFakfTA0cT1g8&s=qztg0O9DyeYfmTWLNbPmmoOaxk2gsoAOhiIy6mzyuRg&e=
Alin Serdean Nov. 25, 2015, 5:13 a.m. UTC | #2
Acked-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com>


> -----Mesaj original-----

> De la: dev [mailto:dev-bounces@openvswitch.org] În numele Nithin Raju

> Trimis: Wednesday, November 18, 2015 6:14 PM

> Către: dev@openvswitch.org

> Subiect: [ovs-dev] [PATCH 1/6 v2] datapath-windows: refactor port

> enumeration code

> 

> We already have functions HvCreatePort() and HvCreateNic() to do the work.

> Might as well use that during port enumeration.

> More refactoring in later patches.

> 

> Signed-off-by: Nithin Raju <nithin@vmware.com>

> ---

>  datapath-windows/ovsext/Switch.c |  6 ++-  datapath-

> windows/ovsext/Vport.c  | 89 ++++++++++++----------------------------

>  2 files changed, 31 insertions(+), 64 deletions(-)

> 

> diff --git a/datapath-windows/ovsext/Switch.c b/datapath-

> windows/ovsext/Switch.c

> index 2878e91..a783ea1 100644

> --- a/datapath-windows/ovsext/Switch.c

> +++ b/datapath-windows/ovsext/Switch.c

> @@ -549,6 +549,7 @@ OvsActivateSwitch(POVS_SWITCH_CONTEXT

> switchContext)

>      OVS_LOG_TRACE("Enter: activate switch %p, dpNo: %ld",

>                    switchContext, switchContext->dpNo);

> 

> +    switchContext->isActivated = TRUE;

>      status = OvsAddConfiguredSwitchPorts(switchContext);

> 

>      if (status != NDIS_STATUS_SUCCESS) { @@ -563,10 +564,13 @@

> OvsActivateSwitch(POVS_SWITCH_CONTEXT switchContext)

>          OvsClearAllSwitchVports(switchContext);

>          goto cleanup;

>      }

> -    switchContext->isActivated = TRUE;

>      OvsPostEvent(OVS_DEFAULT_PORT_NO,

> OVS_DEFAULT_EVENT_STATUS);

> 

>  cleanup:

> +    if (status != NDIS_STATUS_SUCCESS) {

> +        switchContext->isActivated = TRUE;

> +    }

> +

>      OVS_LOG_TRACE("Exit: activate switch:%p, isActivated: %s, status = %lx",

>                    switchContext,

>                    (switchContext->isActivated ? "TRUE" : "FALSE"), status); diff --git

> a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c

> index 3f90039..dac537f 100644

> --- a/datapath-windows/ovsext/Vport.c

> +++ b/datapath-windows/ovsext/Vport.c

> @@ -376,6 +376,12 @@ HvCreateNic(POVS_SWITCH_CONTEXT

> switchContext,

> 

>  add_nic_done:

>      NdisReleaseRWLock(switchContext->dispatchLock, &lockState);

> +    if (status == STATUS_SUCCESS &&

> +        (vport->portType == NdisSwitchPortTypeInternal ||

> +         (vport->portType == NdisSwitchPortTypeExternal &&

> +          nicParam->NicIndex != 0))) {

> +        AssignNicNameSpecial(vport);

> +    }

>      if (portNo != OVS_DPPORT_NUMBER_INVALID && event) {

>          OvsPostEvent(portNo, event);

>      }

> @@ -1017,6 +1023,10 @@ AssignNicNameSpecial(POVS_VPORT_ENTRY

> vport)

>      status = ConvertInterfaceGuidToLuid(&vport->netCfgInstanceId,

>                                          &interfaceLuid);

>      if (status == STATUS_SUCCESS) {

> +        /*

> +         * Must be called from PASSIVE_LEVEL. Resulted in a

> +         * STATUS_INVALID_DEVICE_REQUEST if not.

> +         */

>          status = ConvertInterfaceLuidToAlias(&interfaceLuid, interfaceName,

>                                               IF_MAX_STRING_SIZE + 1);

>          if (status == STATUS_SUCCESS) { @@ -1333,8 +1343,11 @@

> OvsRemoveTunnelVport(POVS_USER_PARAMS_CONTEXT usrParamsCtx,

>                                   tunnelContext);  }

> 

> -

> -

> +/*

> + *

> +-----------------------------------------------------------------------

> +---

> + * Enumerates the ports on the Hyper-V switch.

> + *

> +-----------------------------------------------------------------------

> +---

> + */

>  NDIS_STATUS

>  OvsAddConfiguredSwitchPorts(POVS_SWITCH_CONTEXT switchContext)  {

> @@ -1342,7 +1355,6 @@

> OvsAddConfiguredSwitchPorts(POVS_SWITCH_CONTEXT switchContext)

>      ULONG arrIndex;

>      PNDIS_SWITCH_PORT_PARAMETERS portParam;

>      PNDIS_SWITCH_PORT_ARRAY portArray = NULL;

> -    POVS_VPORT_ENTRY vport;

> 

>      OVS_LOG_TRACE("Enter: switchContext:%p", switchContext);

> 

> @@ -1358,16 +1370,9 @@

> OvsAddConfiguredSwitchPorts(POVS_SWITCH_CONTEXT switchContext)

>               continue;

>           }

> 

> -         vport = (POVS_VPORT_ENTRY)OvsAllocateVport();

> -         if (vport == NULL) {

> -             status = NDIS_STATUS_RESOURCES;

> -             goto cleanup;

> -         }

> -         OvsInitVportWithPortParam(vport, portParam);

> -         status = InitHvVportCommon(switchContext, vport, TRUE);

> -         if (status != NDIS_STATUS_SUCCESS) {

> -             OvsFreeMemoryWithTag(vport, OVS_VPORT_POOL_TAG);

> -             goto cleanup;

> +         status = HvCreatePort(switchContext, portParam);

> +         if (status != STATUS_SUCCESS && status !=

> STATUS_DATA_NOT_ACCEPTED) {

> +             break;

>           }

>      }

> 

> @@ -1383,7 +1388,11 @@ cleanup:

>      return status;

>  }

> 

> -

> +/*

> + *

> +-----------------------------------------------------------------------

> +---

> + * Enumerates the NICs on the Hyper-V switch.

> + *

> +-----------------------------------------------------------------------

> +---

> + */

>  NDIS_STATUS

>  OvsInitConfiguredSwitchNics(POVS_SWITCH_CONTEXT switchContext)  {

> @@ -1391,7 +1400,6 @@

> OvsInitConfiguredSwitchNics(POVS_SWITCH_CONTEXT switchContext)

>      PNDIS_SWITCH_NIC_ARRAY nicArray = NULL;

>      ULONG arrIndex;

>      PNDIS_SWITCH_NIC_PARAMETERS nicParam;

> -    POVS_VPORT_ENTRY vport;

> 

>      OVS_LOG_TRACE("Enter: switchContext: %p", switchContext);

>      /*

> @@ -1402,63 +1410,18 @@

> OvsInitConfiguredSwitchNics(POVS_SWITCH_CONTEXT switchContext)

>          goto cleanup;

>      }

>      for (arrIndex = 0; arrIndex < nicArray->NumElements; ++arrIndex) {

> -

>          nicParam = NDIS_SWITCH_NIC_AT_ARRAY_INDEX(nicArray, arrIndex);

> 

>          /*

>           * XXX: Check if the port is configured with a VLAN. Disallow such a

>           * configuration, since we don't support tag-in-tag.

> -         */

> -

> -        /*

>           * XXX: Check if the port is connected to a VF. Disconnect the VF in

>           * such a case.

>           */

> 

> -        if (nicParam->NicType == NdisSwitchNicTypeExternal &&

> -            nicParam->NicIndex != 0) {

> -            POVS_VPORT_ENTRY virtExtVport =

> -                   (POVS_VPORT_ENTRY)switchContext->virtualExternalVport;

> -

> -            vport = OvsAllocateVport();

> -            if (vport) {

> -                OvsInitPhysNicVport(vport, virtExtVport,

> -                                    nicParam->NicIndex);

> -                OvsInitVportWithNicParam(switchContext, vport, nicParam);

> -                status = InitHvVportCommon(switchContext, vport, TRUE);

> -                if (status != NDIS_STATUS_SUCCESS) {

> -                    OvsFreeMemoryWithTag(vport, OVS_VPORT_POOL_TAG);

> -                    vport = NULL;

> -                }

> -            } else {

> -                OVS_LOG_ERROR("Fail to allocate vport.");

> -                continue;

> -            }

> -        } else {

> -            vport = OvsFindVportByPortIdAndNicIndex(switchContext,

> -                                                    nicParam->PortId,

> -                                                    nicParam->NicIndex);

> -            if (vport == NULL) {

> -                OVS_LOG_ERROR(

> -                    "Could not found vport with portId: %d and nicIndex: %d.",

> -                    nicParam->PortId, nicParam->NicIndex);

> -                continue;

> -            }

> -            OvsInitVportWithNicParam(switchContext, vport, nicParam);

> -        }

> -

> -        if (nicParam->NicType == NdisSwitchNicTypeInternal) {

> -            /*

> -             * Overwrite the 'portFriendlyName' of the internal vport.

> -             * Note:

> -             * The call to AssignNicNameSpecial() is needed here, because the

> -             * necessary 'netCfgInstanceId' of the vport is available.

> -             * On port creation the latter information is missing and the

> -             * 'portFriendlyName' of the vport fails to be overwritten with the

> -             * correct information.

> -             */

> -            AssignNicNameSpecial(vport);

> -            OvsInternalAdapterUp(vport->portNo, &nicParam-

> >NetCfgInstanceId);

> +        status = HvCreateNic(switchContext, nicParam);

> +        if (status == NDIS_STATUS_SUCCESS) {

> +            HvConnectNic(switchContext, nicParam);

>          }

>      }

>  cleanup:

> --

> 1.8.5.6

> 

> _______________________________________________

> dev mailing list

> dev@openvswitch.org

> http://openvswitch.org/mailman/listinfo/dev
diff mbox

Patch

diff --git a/datapath-windows/ovsext/Switch.c b/datapath-windows/ovsext/Switch.c
index 2878e91..a783ea1 100644
--- a/datapath-windows/ovsext/Switch.c
+++ b/datapath-windows/ovsext/Switch.c
@@ -549,6 +549,7 @@  OvsActivateSwitch(POVS_SWITCH_CONTEXT switchContext)
     OVS_LOG_TRACE("Enter: activate switch %p, dpNo: %ld",
                   switchContext, switchContext->dpNo);
 
+    switchContext->isActivated = TRUE;
     status = OvsAddConfiguredSwitchPorts(switchContext);
 
     if (status != NDIS_STATUS_SUCCESS) {
@@ -563,10 +564,13 @@  OvsActivateSwitch(POVS_SWITCH_CONTEXT switchContext)
         OvsClearAllSwitchVports(switchContext);
         goto cleanup;
     }
-    switchContext->isActivated = TRUE;
     OvsPostEvent(OVS_DEFAULT_PORT_NO, OVS_DEFAULT_EVENT_STATUS);
 
 cleanup:
+    if (status != NDIS_STATUS_SUCCESS) {
+        switchContext->isActivated = TRUE;
+    }
+
     OVS_LOG_TRACE("Exit: activate switch:%p, isActivated: %s, status = %lx",
                   switchContext,
                   (switchContext->isActivated ? "TRUE" : "FALSE"), status);
diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c
index 3f90039..dac537f 100644
--- a/datapath-windows/ovsext/Vport.c
+++ b/datapath-windows/ovsext/Vport.c
@@ -376,6 +376,12 @@  HvCreateNic(POVS_SWITCH_CONTEXT switchContext,
 
 add_nic_done:
     NdisReleaseRWLock(switchContext->dispatchLock, &lockState);
+    if (status == STATUS_SUCCESS &&
+        (vport->portType == NdisSwitchPortTypeInternal ||
+         (vport->portType == NdisSwitchPortTypeExternal &&
+          nicParam->NicIndex != 0))) {
+        AssignNicNameSpecial(vport);
+    }
     if (portNo != OVS_DPPORT_NUMBER_INVALID && event) {
         OvsPostEvent(portNo, event);
     }
@@ -1017,6 +1023,10 @@  AssignNicNameSpecial(POVS_VPORT_ENTRY vport)
     status = ConvertInterfaceGuidToLuid(&vport->netCfgInstanceId,
                                         &interfaceLuid);
     if (status == STATUS_SUCCESS) {
+        /*
+         * Must be called from PASSIVE_LEVEL. Resulted in a
+         * STATUS_INVALID_DEVICE_REQUEST if not.
+         */
         status = ConvertInterfaceLuidToAlias(&interfaceLuid, interfaceName,
                                              IF_MAX_STRING_SIZE + 1);
         if (status == STATUS_SUCCESS) {
@@ -1333,8 +1343,11 @@  OvsRemoveTunnelVport(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
                                  tunnelContext);
 }
 
-
-
+/*
+ * --------------------------------------------------------------------------
+ * Enumerates the ports on the Hyper-V switch.
+ * --------------------------------------------------------------------------
+ */
 NDIS_STATUS
 OvsAddConfiguredSwitchPorts(POVS_SWITCH_CONTEXT switchContext)
 {
@@ -1342,7 +1355,6 @@  OvsAddConfiguredSwitchPorts(POVS_SWITCH_CONTEXT switchContext)
     ULONG arrIndex;
     PNDIS_SWITCH_PORT_PARAMETERS portParam;
     PNDIS_SWITCH_PORT_ARRAY portArray = NULL;
-    POVS_VPORT_ENTRY vport;
 
     OVS_LOG_TRACE("Enter: switchContext:%p", switchContext);
 
@@ -1358,16 +1370,9 @@  OvsAddConfiguredSwitchPorts(POVS_SWITCH_CONTEXT switchContext)
              continue;
          }
 
-         vport = (POVS_VPORT_ENTRY)OvsAllocateVport();
-         if (vport == NULL) {
-             status = NDIS_STATUS_RESOURCES;
-             goto cleanup;
-         }
-         OvsInitVportWithPortParam(vport, portParam);
-         status = InitHvVportCommon(switchContext, vport, TRUE);
-         if (status != NDIS_STATUS_SUCCESS) {
-             OvsFreeMemoryWithTag(vport, OVS_VPORT_POOL_TAG);
-             goto cleanup;
+         status = HvCreatePort(switchContext, portParam);
+         if (status != STATUS_SUCCESS && status != STATUS_DATA_NOT_ACCEPTED) {
+             break;
          }
     }
 
@@ -1383,7 +1388,11 @@  cleanup:
     return status;
 }
 
-
+/*
+ * --------------------------------------------------------------------------
+ * Enumerates the NICs on the Hyper-V switch.
+ * --------------------------------------------------------------------------
+ */
 NDIS_STATUS
 OvsInitConfiguredSwitchNics(POVS_SWITCH_CONTEXT switchContext)
 {
@@ -1391,7 +1400,6 @@  OvsInitConfiguredSwitchNics(POVS_SWITCH_CONTEXT switchContext)
     PNDIS_SWITCH_NIC_ARRAY nicArray = NULL;
     ULONG arrIndex;
     PNDIS_SWITCH_NIC_PARAMETERS nicParam;
-    POVS_VPORT_ENTRY vport;
 
     OVS_LOG_TRACE("Enter: switchContext: %p", switchContext);
     /*
@@ -1402,63 +1410,18 @@  OvsInitConfiguredSwitchNics(POVS_SWITCH_CONTEXT switchContext)
         goto cleanup;
     }
     for (arrIndex = 0; arrIndex < nicArray->NumElements; ++arrIndex) {
-
         nicParam = NDIS_SWITCH_NIC_AT_ARRAY_INDEX(nicArray, arrIndex);
 
         /*
          * XXX: Check if the port is configured with a VLAN. Disallow such a
          * configuration, since we don't support tag-in-tag.
-         */
-
-        /*
          * XXX: Check if the port is connected to a VF. Disconnect the VF in
          * such a case.
          */
 
-        if (nicParam->NicType == NdisSwitchNicTypeExternal &&
-            nicParam->NicIndex != 0) {
-            POVS_VPORT_ENTRY virtExtVport =
-                   (POVS_VPORT_ENTRY)switchContext->virtualExternalVport;
-
-            vport = OvsAllocateVport();
-            if (vport) {
-                OvsInitPhysNicVport(vport, virtExtVport,
-                                    nicParam->NicIndex);
-                OvsInitVportWithNicParam(switchContext, vport, nicParam);
-                status = InitHvVportCommon(switchContext, vport, TRUE);
-                if (status != NDIS_STATUS_SUCCESS) {
-                    OvsFreeMemoryWithTag(vport, OVS_VPORT_POOL_TAG);
-                    vport = NULL;
-                }
-            } else {
-                OVS_LOG_ERROR("Fail to allocate vport.");
-                continue;
-            }
-        } else {
-            vport = OvsFindVportByPortIdAndNicIndex(switchContext,
-                                                    nicParam->PortId,
-                                                    nicParam->NicIndex);
-            if (vport == NULL) {
-                OVS_LOG_ERROR(
-                    "Could not found vport with portId: %d and nicIndex: %d.",
-                    nicParam->PortId, nicParam->NicIndex);
-                continue;
-            }
-            OvsInitVportWithNicParam(switchContext, vport, nicParam);
-        }
-
-        if (nicParam->NicType == NdisSwitchNicTypeInternal) {
-            /*
-             * Overwrite the 'portFriendlyName' of the internal vport. 
-             * Note:
-             * The call to AssignNicNameSpecial() is needed here, because the
-             * necessary 'netCfgInstanceId' of the vport is available.
-             * On port creation the latter information is missing and the
-             * 'portFriendlyName' of the vport fails to be overwritten with the
-             * correct information.
-             */
-            AssignNicNameSpecial(vport);
-            OvsInternalAdapterUp(vport->portNo, &nicParam->NetCfgInstanceId);
+        status = HvCreateNic(switchContext, nicParam);
+        if (status == NDIS_STATUS_SUCCESS) {
+            HvConnectNic(switchContext, nicParam);
         }
     }
 cleanup: