[ovs-dev] [PATCH v8 5/5] datapath-windows: Fragment NBL based on MRU size

Alin Serdean aserdean at cloudbasesolutions.com
Sat May 6 01:45:11 UTC 2017


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

> -----Original Message-----
> From: ovs-dev-bounces at openvswitch.org [mailto:ovs-dev-
> bounces at openvswitch.org] On Behalf Of Anand Kumar
> Sent: Friday, May 5, 2017 1:13 AM
> To: dev at openvswitch.org
> Subject: [ovs-dev] [PATCH v8 5/5] datapath-windows: Fragment NBL based
> on MRU size
> 
> This patch adds support for Fragmenting NBL based on the MRU value.
> MRU value is updated only for Ipv4 fragments, if it is non zero, then fragment
> the NBL and send out the new NBL to the vnic.
> 
> Signed-off-by: Anand Kumar <kumaranand at vmware.com>
> ---
> v7->v8: No change
> v6->v7: Fragment the NBL for tunnel packets
> v5->v6: No Change
> v4->v5:
> 	- Use MRU information in the _OVS_BUFFER_CONTEXT to fragment
> NBL.
> v3->v4: No Change
> v2->v3:
> 	- Updated log message
> v1->v2: No change
> ---
>  datapath-windows/ovsext/Actions.c | 51
> ++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 50 insertions(+), 1 deletion(-)
> 
> diff --git a/datapath-windows/ovsext/Actions.c b/datapath-
> windows/ovsext/Actions.c
> index b5c13c7..e2eae9a 100644
> --- a/datapath-windows/ovsext/Actions.c
> +++ b/datapath-windows/ovsext/Actions.c
> @@ -34,6 +34,7 @@
>  #include "Vport.h"
>  #include "Vxlan.h"
>  #include "Geneve.h"
> +#include "IpFragment.h"
> 
>  #ifdef OVS_DBG_MOD
>  #undef OVS_DBG_MOD
> @@ -144,6 +145,36 @@ OvsInitForwardingCtx(OvsForwardingContext
> *ovsFwdCtx,
> 
>  /*
>   * --------------------------------------------------------------------------
> + * OvsDoFragmentNbl --
> + *     Utility function to Fragment nbl based on mru.
> + *
> +-----------------------------------------------------------------------
> +---
> + */
> +static __inline VOID
> +OvsDoFragmentNbl(OvsForwardingContext *ovsFwdCtx, UINT16 mru) {
> +    PNET_BUFFER_LIST fragNbl = NULL;
> +    fragNbl = OvsFragmentNBL(ovsFwdCtx->switchContext,
> +                             ovsFwdCtx->curNbl,
> +                             &(ovsFwdCtx->layers),
> +                             mru, 0, TRUE);
> +
> +   if (fragNbl != NULL) {
> +        OvsCompleteNBL(ovsFwdCtx->switchContext, ovsFwdCtx->curNbl,
> TRUE);
> +        OvsInitForwardingCtx(ovsFwdCtx,
> +                            ovsFwdCtx->switchContext,
> +                             fragNbl,
> +                             ovsFwdCtx->srcVportNo,
> +                             ovsFwdCtx->sendFlags,
> +                             NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(fragNbl),
> +                             ovsFwdCtx->completionList,
> +                             &ovsFwdCtx->layers, FALSE);
> +    } else {
> +        OVS_LOG_INFO("Fragment NBL failed for MRU = %u", mru);
> +    }
> +}
> +
> +/*
> + *
> +-----------------------------------------------------------------------
> +---
>   * OvsDetectTunnelRxPkt --
>   *     Utility function for an RX packet to detect its tunnel type.
>   *
> @@ -604,6 +635,7 @@ OvsTunnelPortTx(OvsForwardingContext
> *ovsFwdCtx)
>      UINT32 srcVportNo;
>      NDIS_SWITCH_NIC_INDEX srcNicIndex;
>      NDIS_SWITCH_PORT_ID srcPortId;
> +    POVS_BUFFER_CONTEXT ctx;
> 
>      /*
>       * Setup the source port to be the internal port to as to facilitate the @@ -
> 617,6 +649,10 @@ OvsTunnelPortTx(OvsForwardingContext *ovsFwdCtx)
>          return NDIS_STATUS_FAILURE;
>      }
> 
> +    ctx =
> (POVS_BUFFER_CONTEXT)NET_BUFFER_LIST_CONTEXT_DATA_START(ovsF
> wdCtx->curNbl);
> +    if (ctx->mru != 0) {
> +        OvsDoFragmentNbl(ovsFwdCtx, ctx->mru);
> +    }
>      OVS_FWD_INFO switchFwdInfo = { 0 };
>      /* Apply the encapsulation. The encapsulation will not consume the NBL.
> */
>      switch(ovsFwdCtx->tunnelTxNic->ovsType) { @@ -807,6 +843,7 @@
> OvsOutputForwardingCtx(OvsForwardingContext *ovsFwdCtx)
>      NDIS_STATUS status = STATUS_SUCCESS;
>      POVS_SWITCH_CONTEXT switchContext = ovsFwdCtx->switchContext;
>      PCWSTR dropReason;
> +    POVS_BUFFER_CONTEXT ctx;
> 
>      /*
>       * Handle the case where the some of the destination ports are tunneled
> @@ -829,8 +866,12 @@ OvsOutputForwardingCtx(OvsForwardingContext
> *ovsFwdCtx)
>           * before doing encapsulation.
>           */
>          if (ovsFwdCtx->tunnelTxNic != NULL || ovsFwdCtx->tunnelRxNic !=
> NULL) {
> +            POVS_BUFFER_CONTEXT oldCtx, newCtx;
>              nb = NET_BUFFER_LIST_FIRST_NB(ovsFwdCtx->curNbl);
> -            newNbl = OvsPartialCopyNBL(ovsFwdCtx->switchContext,
> ovsFwdCtx->curNbl,
> +            oldCtx = (POVS_BUFFER_CONTEXT)
> +                NET_BUFFER_LIST_CONTEXT_DATA_START(ovsFwdCtx->curNbl);
> +            newNbl = OvsPartialCopyNBL(ovsFwdCtx->switchContext,
> +                                       ovsFwdCtx->curNbl,
>                                         0, 0, TRUE /*copy NBL info*/);
>              if (newNbl == NULL) {
>                  status = NDIS_STATUS_RESOURCES; @@ -838,6 +879,9 @@
> OvsOutputForwardingCtx(OvsForwardingContext *ovsFwdCtx)
>                  dropReason = L"Dropped due to failure to create NBL copy.";
>                  goto dropit;
>              }
> +            newCtx = (POVS_BUFFER_CONTEXT)
> +                NET_BUFFER_LIST_CONTEXT_DATA_START(newNbl);
> +            newCtx->mru = oldCtx->mru;
>          }
> 
>          /* It does not seem like we'll get here unless 'portsToUpdate' > 0. */
> @@ -852,6 +896,11 @@ OvsOutputForwardingCtx(OvsForwardingContext
> *ovsFwdCtx)
>              goto dropit;
>          }
> 
> +        ctx =
> (POVS_BUFFER_CONTEXT)NET_BUFFER_LIST_CONTEXT_DATA_START(ovsF
> wdCtx->curNbl);
> +        if (ctx->mru != 0) {
> +            OvsDoFragmentNbl(ovsFwdCtx, ctx->mru);
> +        }
> +
>          OvsSendNBLIngress(ovsFwdCtx->switchContext, ovsFwdCtx->curNbl,
>                            ovsFwdCtx->sendFlags);
>          /* End this pipeline by resetting the corresponding context. */
> --
> 2.9.3.windows.1
> 
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev


More information about the dev mailing list