[ovs-dev] [PATCH v2 2/3] dpif-netdev: Add dp_netdev_packet_rss()
Daniele Di Proietto
ddiproietto at vmware.com
Fri Aug 15 19:43:36 UTC 2014
This new function uses ofpbuf_rss(), or hashes the packet 5-tuple, to get the
hash of a packet. Used by OVS_ACTION_ATTR_HASH and future commits.
Signed-off-by: Daniele Di Proietto <ddiproietto at vmware.com>
---
lib/dpif-netdev.c | 29 ++++++++++++++++++++++-------
1 file changed, 22 insertions(+), 7 deletions(-)
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index a458f24..c77fbce 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -1850,6 +1850,26 @@ dp_netdev_stats_new_cb(void)
return bucket;
}
+static inline uint32_t
+dp_netdev_packet_rss(struct dpif_packet *packet, const struct miniflow *mf)
+{
+ uint32_t hash;
+
+ hash = ofpbuf_rss(&packet->ofpbuf);
+ if (OVS_UNLIKELY(!hash)) {
+ struct netdev_flow_key key;
+ if (!mf) {
+ miniflow_initialize(&key.flow, key.buf);
+ miniflow_extract(&packet->ofpbuf, NULL, &key.flow);
+ mf = &key.flow;
+ }
+
+ hash = miniflow_hash_5tuple(mf, 0);
+ }
+
+ return hash;
+}
+
static void
dp_netdev_count_packet(struct dp_netdev *dp, enum dp_stat_type type, int cnt)
{
@@ -2168,22 +2188,17 @@ dp_execute_cb(void *aux_, struct dpif_packet **packets, int cnt,
case OVS_ACTION_ATTR_HASH: {
const struct ovs_action_hash *hash_act;
- struct netdev_flow_key key;
uint32_t hash;
hash_act = nl_attr_get(a);
- miniflow_initialize(&key.flow, key.buf);
-
for (i = 0; i < cnt; i++) {
- /* XXX: this is slow. Use RSS hash in the future */
- miniflow_extract(&packets[i]->ofpbuf, md, &key.flow);
-
if (hash_act->hash_alg == OVS_HASH_ALG_L4) {
/* Hash need not be symmetric, nor does it need to include
* L2 fields. */
- hash = miniflow_hash_5tuple(&key.flow, hash_act->hash_basis);
+ hash = hash_2words(dp_netdev_packet_rss(packets[i], NULL),
+ hash_act->hash_basis);
} else {
VLOG_WARN("Unknown hash algorithm specified "
"for the hash action.");
--
2.0.1
More information about the dev
mailing list