diff options
author | Jan Scheurich <jan.scheurich@ericsson.com> | 2018-05-24 17:27:59 +0200 |
---|---|---|
committer | Ben Pfaff <blp@ovn.org> | 2018-05-25 14:58:40 -0700 |
commit | 6a0b0d3be8573c42d750eb22e3445a3c759c8e8f (patch) | |
tree | cca1203ce659df97f56d8eae024c6584cbd22925 /ofproto/ofproto-dpif.c | |
parent | dd8ff6ccf0d80107b1e23aa2cf794584e1a8597d (diff) | |
download | openvswitch-6a0b0d3be8573c42d750eb22e3445a3c759c8e8f.tar.gz |
userspace datapath: Add OVS_HASH_L4_SYMMETRIC dp_hash algorithm
This commit implements a new dp_hash algorithm OVS_HASH_L4_SYMMETRIC in
the netdev datapath. It will be used as default hash algorithm for the
dp_hash-based select groups in a subsequent commit to maintain
compatibility with the symmetry property of the current default hash
selection method.
A new dpif_backer_support field 'max_hash_alg' is introduced to reflect
the highest hash algorithm a datapath supports in the dp_hash action.
Signed-off-by: Jan Scheurich <jan.scheurich@ericsson.com>
Signed-off-by: Nitin Katiyar <nitin.katiyar@ericsson.com>
Co-authored-by: Nitin Katiyar <nitin.katiyar@ericsson.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'ofproto/ofproto-dpif.c')
-rw-r--r-- | ofproto/ofproto-dpif.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index 1ed82d036..716281175 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -1291,6 +1291,50 @@ check_ct_clear(struct dpif_backer *backer) return supported; } +/* Probe the highest dp_hash algorithm supported by the datapath. */ +static size_t +check_max_dp_hash_alg(struct dpif_backer *backer) +{ + struct odputil_keybuf keybuf; + struct ofpbuf key; + struct flow flow; + struct ovs_action_hash *hash; + int max_alg = 0; + + struct odp_flow_key_parms odp_parms = { + .flow = &flow, + .probe = true, + }; + + memset(&flow, 0, sizeof flow); + ofpbuf_use_stack(&key, &keybuf, sizeof keybuf); + odp_flow_key_from_flow(&odp_parms, &key); + + /* All datapaths support algortithm 0 (OVS_HASH_ALG_L4). */ + for (int alg = 1; alg < __OVS_HASH_MAX; alg++) { + struct ofpbuf actions; + bool ok; + + ofpbuf_init(&actions, 300); + hash = nl_msg_put_unspec_uninit(&actions, + OVS_ACTION_ATTR_HASH, sizeof *hash); + hash->hash_basis = 0; + hash->hash_alg = alg; + ok = dpif_probe_feature(backer->dpif, "Max dp_hash algorithm", &key, + &actions, NULL); + ofpbuf_uninit(&actions); + if (ok) { + max_alg = alg; + } else { + break; + } + } + + VLOG_INFO("%s: Max dp_hash algorithm probed to be %d", + dpif_name(backer->dpif), max_alg); + return max_alg; +} + #define CHECK_FEATURE__(NAME, SUPPORT, FIELD, VALUE, ETHTYPE) \ static bool \ check_##NAME(struct dpif_backer *backer) \ @@ -1353,6 +1397,7 @@ check_support(struct dpif_backer *backer) backer->rt_support.sample_nesting = check_max_sample_nesting(backer); backer->rt_support.ct_eventmask = check_ct_eventmask(backer); backer->rt_support.ct_clear = check_ct_clear(backer); + backer->rt_support.max_hash_alg = check_max_dp_hash_alg(backer); /* Flow fields. */ backer->rt_support.odp.ct_state = check_ct_state(backer); |