[ovs-dev] [PATCH] Changing hash used for selecting bucket in a group action

Srini Seetharaman srini.seetharaman at gmail.com
Fri Aug 15 16:42:46 UTC 2014


Current hash uses just the dl_dst field. This patch expands the hash  to
include all L2, L3 and L4 fields, allowing for more balanced selection.

Signed-off-by: Srini Seetharaman <srini.seetharaman at gmail.com>
---
 ofproto/ofproto-dpif-xlate.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index 4aedb59..be16092 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -2739,10 +2739,24 @@ xlate_select_group(struct xlate_ctx *ctx, struct
group_dpif *group)
     struct ofputil_bucket *bucket;
     uint32_t basis;

-    basis = hash_mac(ctx->xin->flow.dl_dst, 0, 0);
+    /* Hashing based on all L2, L3 and L4 fields
+     */
+    basis = flow_hash_symmetric_l4(&ctx->xin->flow, 0);
     bucket = group_best_live_bucket(ctx, group, basis);
     if (bucket) {
+        /* Since flow_hash_symmetric_l4() looks at all fields,
+         * we require matching on all fields used for the hash.
+         */
         memset(&wc->masks.dl_dst, 0xff, sizeof wc->masks.dl_dst);
+        memset(&wc->masks.dl_src, 0xff, sizeof wc->masks.dl_src);
+        memset(&wc->masks.dl_type, 0xff, sizeof wc->masks.dl_type);
+        memset(&wc->masks.nw_dst, 0xff, sizeof wc->masks.nw_dst);
+        memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto);
+        memset(&wc->masks.nw_src, 0xff, sizeof wc->masks.nw_src);
+        memset(&wc->masks.tp_dst, 0xff, sizeof wc->masks.tp_dst);
+        memset(&wc->masks.tp_src, 0xff, sizeof wc->masks.tp_src);
+        memset(&wc->masks.vlan_tci, 0xff, sizeof wc->masks.vlan_tci);
+
         xlate_group_bucket(ctx, bucket);
         xlate_group_stats(ctx, group, bucket);
     }
-- 
1.9.1



More information about the dev mailing list