DPDK mbufs contain a valid RSS hash only if PKT_RX_RSS_HASH is
set in 'ol_flags'.  Otherwise the hash is garbage and doesn't
relate to the packet.

This fixes an issue with vhost, which, being a virtual NIC, doesn't
compute the hash.

Reported-by: Dongjun <do...@dtdream.com>
Suggested-by: Flavio Leitner <f...@sysclose.org>
Signed-off-by: Daniele Di Proietto <diproiet...@vmware.com>
---
v1 -> v2:

* Added a comment above dp_packet_get_rss_hash()
* Added an OVS_UNUSED attribute on dp_packet_rss_valid()
---
 lib/dp-packet.h   | 13 +++++++++++++
 lib/dpif-netdev.c |  2 +-
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/lib/dp-packet.h b/lib/dp-packet.h
index e4c2593..5532bee 100644
--- a/lib/dp-packet.h
+++ b/lib/dp-packet.h
@@ -514,6 +514,8 @@ dp_packet_reset_packet(struct dp_packet *b, int off)
     b->l2_5_ofs = b->l3_ofs = b->l4_ofs = UINT16_MAX;
 }
 
+/* Returns the RSS hash of the packet 'p'.  Note that the returned value is
+ * correct only if 'dp_packet_rss_valid(p)' returns true */
 static inline uint32_t
 dp_packet_get_rss_hash(struct dp_packet *p)
 {
@@ -529,11 +531,22 @@ dp_packet_set_rss_hash(struct dp_packet *p, uint32_t hash)
 {
 #ifdef DPDK_NETDEV
     p->mbuf.hash.rss = hash;
+    p->mbuf.ol_flags |= PKT_RX_RSS_HASH;
 #else
     p->rss_hash = hash;
 #endif
 }
 
+static inline bool
+dp_packet_rss_valid(struct dp_packet *p OVS_UNUSED)
+{
+#ifdef DPDK_NETDEV
+    return p->mbuf.ol_flags & PKT_RX_RSS_HASH;
+#else
+    return true;
+#endif
+}
+
 #ifdef  __cplusplus
 }
 #endif
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index db76290..490ced3 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -3100,7 +3100,7 @@ dpif_netdev_packet_get_rss_hash(struct dp_packet *packet,
 {
     uint32_t hash, recirc_depth;
 
-    hash = dp_packet_get_rss_hash(packet);
+    hash = dp_packet_rss_valid(packet) ? dp_packet_get_rss_hash(packet) : 0;
     if (OVS_UNLIKELY(!hash)) {
         hash = miniflow_hash_5tuple(mf, 0);
         dp_packet_set_rss_hash(packet, hash);
-- 
2.1.4

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to