Dropping current patch and will resend a modified version once Sai's patch gets 
applied.

> -----Mesaj original-----
> De la: Alin Serdean
> Trimis: Wednesday, March 30, 2016 4:59 AM
> Către: dev@openvswitch.org
> Cc: Alessandro Pilotti <apilo...@cloudbasesolutions.com>; Alin Serdean
> <aserd...@cloudbasesolutions.com>
> Subiect: [PATCH] datapath-windows: Fix the hash length when using
> recirculation
> 
> Current implementation of hashing does not take into consideration the
> value of recirculation.
> 
> This patch updates the length of the hash to include the value of 
> recirculation
> in the hash itself.
> 
> To make sure the length is a multiple of 8 include the dphash in the
> calculation.
> 
> Also clean some unnecessary code.
> 
> Signed-off-by: Alin Gabriel Serdean <aserd...@cloudbasesolutions.com>
> ---
>  datapath-windows/ovsext/Actions.c |  6 ++++++
>  datapath-windows/ovsext/Flow.c    | 24 +++++++++++++-----------
>  datapath-windows/ovsext/Flow.h    |  4 ++--
>  datapath-windows/ovsext/User.c    |  9 +++------
>  4 files changed, 24 insertions(+), 19 deletions(-)
> 
> diff --git a/datapath-windows/ovsext/Actions.c b/datapath-
> windows/ovsext/Actions.c
> index a91454d..00b3625 100644
> --- a/datapath-windows/ovsext/Actions.c
> +++ b/datapath-windows/ovsext/Actions.c
> @@ -1964,6 +1964,12 @@ OvsDoRecirc(POVS_SWITCH_CONTEXT
> switchContext,
> 
>      status = OvsExtractFlow(ovsFwdCtx.curNbl, ovsFwdCtx.srcVportNo, key,
>                              &ovsFwdCtx.layers, NULL);
> +
> +    if (key->recircId || key->dpHash) {
> +        key->l2.keyLen += sizeof(key->recircId);
> +        key->l2.keyLen += sizeof(key->dpHash);
> +    }
> +
>      if (status != NDIS_STATUS_SUCCESS) {
>          OvsCompleteNBLForwardingCtx(&ovsFwdCtx,
>              L"OVS-Dropped due to extract flow failure"); diff --git 
> a/datapath-
> windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c index
> 02c41b7..3a397ce 100644
> --- a/datapath-windows/ovsext/Flow.c
> +++ b/datapath-windows/ovsext/Flow.c
> @@ -1380,13 +1380,20 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,  {
>      _MapTunAttrToFlowPut(keyAttrs, tunnelAttrs, destKey);
> 
> +    /* ==== L3 + L4. ==== */
> +    destKey->l2.keyLen = OVS_WIN_TUNNEL_KEY_SIZE + OVS_L2_KEY_SIZE
> +                         - destKey->l2.offset;
> +
>      if (keyAttrs[OVS_KEY_ATTR_RECIRC_ID]) {
>          destKey->recircId =
> NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_RECIRC_ID]);
> -        destKey->l2.keyLen += sizeof(destKey->recircId);
>      }
> 
>      if (keyAttrs[OVS_KEY_ATTR_DP_HASH]) {
>          destKey->dpHash =
> NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_DP_HASH]);
> +    }
> +
> +    if (destKey->recircId || destKey->dpHash) {
> +        destKey->l2.keyLen += sizeof(destKey->recircId);
>          destKey->l2.keyLen += sizeof(destKey->dpHash);
>      }
> 
> @@ -1413,10 +1420,6 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
>          destKey->l2.vlanTci = NlAttrGetU16(keyAttrs[OVS_KEY_ATTR_VLAN]);
>      }
> 
> -    /* ==== L3 + L4. ==== */
> -    destKey->l2.keyLen = OVS_WIN_TUNNEL_KEY_SIZE + OVS_L2_KEY_SIZE
> -                         - destKey->l2.offset;
> -
>      switch (ntohs(destKey->l2.dlType)) {
>      case ETH_TYPE_IPV4: {
> 
> @@ -1757,23 +1760,22 @@ DeleteAllFlows(OVS_DATAPATH *datapath)
>      }
>  }
> 
> -NDIS_STATUS
> +VOID
>  OvsGetFlowMetadata(OvsFlowKey *key,
>                     PNL_ATTR *keyAttrs)
>  {
> -    NDIS_STATUS status = NDIS_STATUS_SUCCESS;
> -
>      if (keyAttrs[OVS_KEY_ATTR_RECIRC_ID]) {
>          key->recircId = NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_RECIRC_ID]);
> -        key->l2.keyLen += sizeof(key->recircId);
>      }
> 
>      if (keyAttrs[OVS_KEY_ATTR_DP_HASH]) {
>          key->dpHash = NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_DP_HASH]);
> -        key->l2.keyLen += sizeof(key->dpHash);
>      }
> 
> -    return status;
> +    if (key->recircId || key->dpHash) {
> +        key->l2.keyLen += sizeof(key->recircId);
> +        key->l2.keyLen += sizeof(key->dpHash);
> +    }
>  }
> 
>  /*
> diff --git a/datapath-windows/ovsext/Flow.h b/datapath-
> windows/ovsext/Flow.h index 310c472..486e449 100644
> --- a/datapath-windows/ovsext/Flow.h
> +++ b/datapath-windows/ovsext/Flow.h
> @@ -51,8 +51,8 @@ NDIS_STATUS OvsDeleteFlowTable(OVS_DATAPATH
> *datapath);  NDIS_STATUS OvsAllocateFlowTable(OVS_DATAPATH
> *datapath,
>                                   POVS_SWITCH_CONTEXT switchContext);
> 
> -NDIS_STATUS OvsGetFlowMetadata(OvsFlowKey *key,
> -                               PNL_ATTR *keyAttrs);
> +VOID OvsGetFlowMetadata(OvsFlowKey *key,
> +                        PNL_ATTR *keyAttrs);
>  NDIS_STATUS OvsExtractFlow(const NET_BUFFER_LIST *pkt, UINT32 inPort,
>                             OvsFlowKey *flow, POVS_PACKET_HDR_INFO layers,
>                             OvsIPv4TunnelKey *tunKey); diff --git a/datapath-
> windows/ovsext/User.c b/datapath-windows/ovsext/User.c index
> 6b2d94a..902e35a 100644
> --- a/datapath-windows/ovsext/User.c
> +++ b/datapath-windows/ovsext/User.c
> @@ -430,13 +430,11 @@ OvsExecuteDpIoctl(OvsPacketExecute *execute)
>      }
>      // XXX: Figure out if any of the other members of fwdDetail need to be
> set.
> 
> -    status = OvsGetFlowMetadata(&key, execute->keyAttrs);
> -    if (status != STATUS_SUCCESS) {
> -        goto dropit;
> -    }
> -
>      ndisStatus = OvsExtractFlow(pNbl, fwdDetail->SourcePortId, &key,
> &layers,
>                                  NULL);
> +
> +    OvsGetFlowMetadata(&key, execute->keyAttrs);
> +
>      if (ndisStatus == NDIS_STATUS_SUCCESS) {
>          NdisAcquireRWLockRead(gOvsSwitchContext->dispatchLock,
> &lockState, 0);
>          ndisStatus = OvsActionsExecute(gOvsSwitchContext, NULL, pNbl, @@ -
> 456,7 +454,6 @@ OvsExecuteDpIoctl(OvsPacketExecute *execute)
>          }
>      }
> 
> -dropit:
>      if (pNbl) {
>          OvsCompleteNBL(gOvsSwitchContext, pNbl, TRUE);
>      }
> --
> 1.9.5.msysgit.0
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to