Forgot to add version number.

Please ignore this patch.

Alin.

> -----Original Message-----
> From: Alin Serdean
> Sent: Friday, January 27, 2017 1:38 AM
> To: [email protected]
> Cc: Alin Serdean <[email protected]>
> Subject: [PATCH v3 2/4] datapath-windows: Add function to get continuous
> buffer from context
> 
> From: Alin Serdean <[email protected]>
> 
> This patch extracts the code that tries to get a continuous IPv4 header buffer
> from the function 'OvsUpdateIPv4Header' and moves it to a new function
> 'OvsGetHeaderBySize'.
> 
> The new function can be used later when trying to change the
> UDP/TCP/MPLS etc., headers.
> 
> Signed-off-by: Alin Gabriel Serdean <[email protected]>
> Acked-by: Sairam Venugopal <[email protected]>
> ---
> v3: add acked
> v2: no change
> ---
>  datapath-windows/ovsext/Actions.c | 100 +++++++++++++++++++++++----
> -----------
>  1 file changed, 62 insertions(+), 38 deletions(-)
> 
> diff --git a/datapath-windows/ovsext/Actions.c b/datapath-
> windows/ovsext/Actions.c
> index 760888e..467bfbc 100644
> --- a/datapath-windows/ovsext/Actions.c
> +++ b/datapath-windows/ovsext/Actions.c
> @@ -1306,64 +1306,51 @@ OvsUpdateEthHeader(OvsForwardingContext
> *ovsFwdCtx,
>      return NDIS_STATUS_SUCCESS;
>  }
> 
> +
>  /*
>   
> *----------------------------------------------------------------------------
> - * OvsUpdateIPv4Header --
> - *      Updates the IPv4 header in ovsFwdCtx.curNbl inline based on the
> - *      specified key.
> + * OvsGetHeaderBySize --
> + *      Tries to retrieve a continuous buffer from 'ovsFwdCtx->curnbl' of 
> size
> + *      'size'.
> + *      If the original buffer is insufficient it will, try to clone the net
> + *      buffer list and force the size.
> + *      Returns 'NULL' on failure or a pointer to the first byte of the data
> + *      in the first net buffer of the net buffer list 'nbl'.
>   
> *----------------------------------------------------------------------------
>   */
> -static __inline NDIS_STATUS
> -OvsUpdateIPv4Header(OvsForwardingContext *ovsFwdCtx,
> -                    const struct ovs_key_ipv4 *ipAttr)
> +PUINT8 OvsGetHeaderBySize(OvsForwardingContext *ovsFwdCtx,
> +                          UINT32 size)
>  {
>      PNET_BUFFER curNb;
> +    UINT32 mdlLen, packetLen;
>      PMDL curMdl;
>      ULONG curMdlOffset;
> -    PUINT8 bufferStart;
> -    UINT32 mdlLen, hdrSize, packetLen;
> -    OVS_PACKET_HDR_INFO *layers = &ovsFwdCtx->layers;
> -    NDIS_STATUS status;
> -    IPHdr *ipHdr;
> -    TCPHdr *tcpHdr = NULL;
> -    UDPHdr *udpHdr = NULL;
> -
> -    ASSERT(layers->value != 0);
> +    PUINT8 start;
> 
> -    /*
> -     * Peek into the MDL to get a handle to the IP header and if required
> -     * the TCP/UDP header as well. We check if the required headers are in
> one
> -     * contiguous MDL, and if not, we copy them over to one MDL.
> -     */
>      curNb = NET_BUFFER_LIST_FIRST_NB(ovsFwdCtx->curNbl);
>      ASSERT(curNb->Next == NULL);
>      packetLen = NET_BUFFER_DATA_LENGTH(curNb);
>      curMdl = NET_BUFFER_CURRENT_MDL(curNb);
> -    NdisQueryMdl(curMdl, &bufferStart, &mdlLen, LowPagePriority);
> -    if (!bufferStart) {
> +    NdisQueryMdl(curMdl, &start, &mdlLen, LowPagePriority);
> +    if (!start) {
>          ovsActionStats.noResource++;
> -        return NDIS_STATUS_RESOURCES;
> +        return NULL;
>      }
> +
>      curMdlOffset = NET_BUFFER_CURRENT_MDL_OFFSET(curNb);
>      mdlLen -= curMdlOffset;
>      ASSERT((INT)mdlLen >= 0);
> 
> -    if (layers->isTcp || layers->isUdp) {
> -        hdrSize = layers->l4Offset +
> -                  layers->isTcp ? sizeof (*tcpHdr) : sizeof (*udpHdr);
> -    } else {
> -        hdrSize = layers->l3Offset + sizeof (*ipHdr);
> -    }
> -
>      /* Count of number of bytes of valid data there are in the first MDL. */
>      mdlLen = MIN(packetLen, mdlLen);
> -    if (mdlLen < hdrSize) {
> +    if (mdlLen < size) {
>          PNET_BUFFER_LIST newNbl;
> +        NDIS_STATUS status;
>          newNbl = OvsPartialCopyNBL(ovsFwdCtx->switchContext, ovsFwdCtx-
> >curNbl,
> -                                   hdrSize, 0, TRUE /*copy NBL info*/);
> +                                   size, 0, TRUE /*copy NBL info*/);
>          if (!newNbl) {
>              ovsActionStats.noCopiedNbl++;
> -            return NDIS_STATUS_RESOURCES;
> +            return NULL;
>          }
>          OvsCompleteNBLForwardingCtx(ovsFwdCtx,
>                                      L"Complete after partial copy."); @@ 
> -1372,25 +1359,62
> @@ OvsUpdateIPv4Header(OvsForwardingContext *ovsFwdCtx,
>                                        newNbl, ovsFwdCtx->srcVportNo, 0,
> 
> NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl),
>                                        NULL, &ovsFwdCtx->layers, FALSE);
> +
>          if (status != NDIS_STATUS_SUCCESS) {
>              OvsCompleteNBLForwardingCtx(ovsFwdCtx,
>                                          L"OVS-Dropped due to resources");
> -            return NDIS_STATUS_RESOURCES;
> +            return NULL;
>          }
> 
>          curNb = NET_BUFFER_LIST_FIRST_NB(ovsFwdCtx->curNbl);
>          ASSERT(curNb->Next == NULL);
>          curMdl = NET_BUFFER_CURRENT_MDL(curNb);
> -        NdisQueryMdl(curMdl, &bufferStart, &mdlLen, LowPagePriority);
> +        NdisQueryMdl(curMdl, &start, &mdlLen, LowPagePriority);
>          if (!curMdl) {
>              ovsActionStats.noResource++;
> -            return NDIS_STATUS_RESOURCES;
> +            return NULL;
>          }
>          curMdlOffset = NET_BUFFER_CURRENT_MDL_OFFSET(curNb);
>          mdlLen -= curMdlOffset;
> -        ASSERT(mdlLen >= hdrSize);
> +        ASSERT(mdlLen >= size);
>      }
> -    bufferStart += curMdlOffset;
> +
> +    return start + curMdlOffset;
> +}
> +
> +
> +/*
> +
> +*----------------------------------------------------------------------
> +------
> + * OvsUpdateIPv4Header --
> + *      Updates the IPv4 header in ovsFwdCtx.curNbl inline based on the
> + *      specified key.
> +
> +*----------------------------------------------------------------------
> +------
> + */
> +static __inline NDIS_STATUS
> +OvsUpdateIPv4Header(OvsForwardingContext *ovsFwdCtx,
> +                    const struct ovs_key_ipv4 *ipAttr) {
> +    PUINT8 bufferStart;
> +    UINT32 hdrSize;
> +    OVS_PACKET_HDR_INFO *layers = &ovsFwdCtx->layers;
> +    IPHdr *ipHdr;
> +    TCPHdr *tcpHdr = NULL;
> +    UDPHdr *udpHdr = NULL;
> +
> +    ASSERT(layers->value != 0);
> +
> +    if (layers->isTcp || layers->isUdp) {
> +        hdrSize = layers->l4Offset +
> +                  layers->isTcp ? sizeof (*tcpHdr) : sizeof (*udpHdr);
> +    } else {
> +        hdrSize = layers->l3Offset + sizeof (*ipHdr);
> +    }
> +
> +    bufferStart = OvsGetHeaderBySize(ovsFwdCtx, hdrSize);
> +    if (!bufferStart) {
> +        return NDIS_STATUS_RESOURCES;
> +    }
> +
>      ipHdr = (IPHdr *)(bufferStart + layers->l3Offset);
> 
>      if (layers->isTcp) {
> --
> 2.10.2.windows.1
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to