Acked-by: Alin Gabriel Serdean <aserd...@cloudbasesolutions.com>

> -----Mesaj original-----
> De la: dev [mailto:dev-boun...@openvswitch.org] În numele Nithin Raju
> Trimis: Wednesday, November 18, 2015 6:14 PM
> Către: dev@openvswitch.org
> Subiect: [ovs-dev] [PATCH 2/6 v2] datapath-windows: cleanup
> InitHvVportCommon()
> 
> 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
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to