[ovs-dev] [PATCH v7 4/6] datapath-windows: Support for OVS_ACTION_ATTR_HASH attribute

Nithin Raju nithin at vmware.com
Fri Mar 25 14:10:34 UTC 2016


Sorin,
Thanks for the explanation about dpHash. We¹ll see how it gets used.

Acked-by: Nithin Raju <nithin at vmware.com>

-----Original Message-----
From: dev <dev-bounces at openvswitch.org> on behalf of Sorin Vinturis
<svinturis at cloudbasesolutions.com>
Date: Thursday, March 24, 2016 at 9:53 AM
To: "dev at openvswitch.org" <dev at openvswitch.org>
Subject: [ovs-dev] [PATCH v7 4/6] datapath-windows: Support for
OVS_ACTION_ATTR_HASH attribute

>Signed-off-by: Sorin Vinturis <svinturis at cloudbasesolutions.com>
>Acked-by: Sairam Venugopal <vsairam at vmware.com>
>---
> datapath-windows/ovsext/Actions.c    | 38
>++++++++++++++++++++++++++++++++++++
> datapath-windows/ovsext/DpInternal.h |  1 +
> datapath-windows/ovsext/Flow.c       | 14 +++++++++++++
> 3 files changed, 53 insertions(+)
>
>diff --git a/datapath-windows/ovsext/Actions.c
>b/datapath-windows/ovsext/Actions.c
>index 199f680..a91454d 100644
>--- a/datapath-windows/ovsext/Actions.c
>+++ b/datapath-windows/ovsext/Actions.c
>@@ -21,6 +21,7 @@
> #include "Event.h"
> #include "Flow.h"
> #include "Gre.h"
>+#include "Jhash.h"
> #include "Mpls.h"
> #include "NetProto.h"
> #include "Offload.h"
>@@ -1573,6 +1574,27 @@ OvsExecuteRecirc(OvsForwardingContext *ovsFwdCtx,
> 
> /*
>  * 
>--------------------------------------------------------------------------
>+ * OvsExecuteHash --
>+ *     The function updates datapath hash read from userspace.
>+ * 
>--------------------------------------------------------------------------
>+ */
>+VOID
>+OvsExecuteHash(OvsFlowKey *key,
>+               const PNL_ATTR attr)
>+{
>+    struct ovs_action_hash *hash_act = NlAttrData(attr);
>+    UINT32 hash = 0;
>+
>+    hash = (UINT32)OvsHashFlow(key);
>+    hash = OvsJhashWords(&hash, 1, hash_act->hash_basis);
>+    if (!hash)
>+        hash = 1;
>+
>+    key->dpHash = hash;
>+}
>+
>+/*
>+ * 
>--------------------------------------------------------------------------
>  * OvsDoExecuteActions --
>  *     Interpret and execute the specified 'actions' on the specified
>packet
>  *     'curNbl'. The expectation is that if the packet needs to be
>dropped
>@@ -1748,6 +1770,22 @@ OvsDoExecuteActions(POVS_SWITCH_CONTEXT
>switchContext,
>             break;
>         }
> 
>+        case OVS_ACTION_ATTR_HASH:
>+        {
>+            if (ovsFwdCtx.destPortsSizeOut > 0 || ovsFwdCtx.tunnelTxNic
>!= NULL
>+                || ovsFwdCtx.tunnelRxNic != NULL) {
>+                status = OvsOutputBeforeSetAction(&ovsFwdCtx);
>+                if (status != NDIS_STATUS_SUCCESS) {
>+                    dropReason = L"OVS-adding destination failed";
>+                    goto dropit;
>+                }
>+            }
>+
>+            OvsExecuteHash(key, (const PNL_ATTR)a);
>+
>+            break;
>+        }
>+
>         case OVS_ACTION_ATTR_RECIRC:
>         {
>             if (ovsFwdCtx.destPortsSizeOut > 0 || ovsFwdCtx.tunnelTxNic
>!= NULL
>diff --git a/datapath-windows/ovsext/DpInternal.h
>b/datapath-windows/ovsext/DpInternal.h
>index be8ac25..bf56836 100644
>--- a/datapath-windows/ovsext/DpInternal.h
>+++ b/datapath-windows/ovsext/DpInternal.h
>@@ -166,6 +166,7 @@ typedef __declspec(align(8)) struct OvsFlowKey {
>         MplsKey mplsKey;         /* size 8 */
>     };
>     UINT32 recircId;             /* Recirculation ID.  */
>+    UINT32 dpHash;               /* Datapath calculated hash value. */
> } OvsFlowKey;
> 
> #define OVS_WIN_TUNNEL_KEY_SIZE (sizeof (OvsIPv4TunnelKey))
>diff --git a/datapath-windows/ovsext/Flow.c
>b/datapath-windows/ovsext/Flow.c
>index 9993e49..a82b51b 100644
>--- a/datapath-windows/ovsext/Flow.c
>+++ b/datapath-windows/ovsext/Flow.c
>@@ -850,6 +850,14 @@ MapFlowKeyToNlKey(PNL_BUFFER nlBuf,
>         goto done;
>     }
> 
>+    if (flowKey->dpHash) {
>+        if (!NlMsgPutTailU32(nlBuf, OVS_KEY_ATTR_DP_HASH,
>+                             flowKey->dpHash)) {
>+            rc = STATUS_UNSUCCESSFUL;
>+            goto done;
>+        }
>+    }
>+
>     /* Ethernet header */
>     RtlCopyMemory(&(ethKey.eth_src), flowKey->l2.dlSrc, ETH_ADDR_LEN);
>     RtlCopyMemory(&(ethKey.eth_dst), flowKey->l2.dlDst, ETH_ADDR_LEN);
>@@ -1377,6 +1385,11 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs,
>         destKey->l2.keyLen += sizeof(destKey->recircId);
>     }
> 
>+    if (keyAttrs[OVS_KEY_ATTR_DP_HASH]) {
>+        destKey->dpHash = NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_DP_HASH]);
>+        destKey->l2.keyLen += sizeof(destKey->dpHash);
>+    }
>+
>     /* ===== L2 headers ===== */
>     destKey->l2.inPort = NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_IN_PORT]);
> 
>@@ -2269,6 +2282,7 @@ ReportFlowInfo(OvsFlow *flow,
>     }
> 
>     info->key.recircId = flow->key.recircId;
>+    info->key.dpHash = flow->key.dpHash;
> 
>     return status;
> }
>-- 
>1.9.0.msysgit.0
>_______________________________________________
>dev mailing list
>dev at openvswitch.org
>http://openvswitch.org/mailman/listinfo/dev




More information about the dev mailing list