uint16_t data_ofs; /* First byte actually in use. */
uint32_t size_; /* Number of bytes in use. */
uint32_t rss_hash; /* Packet hash. */
+ bool rss_hash_valid; /* Is the 'rss_hash' valid? */
#endif
enum dp_packet_source source; /* Source of memory allocated as 'base'. */
uint8_t l2_pad_size; /* Detected l2 padding size.
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)
{
{
#ifdef DPDK_NETDEV
p->mbuf.hash.rss = hash;
+ p->mbuf.ol_flags |= PKT_RX_RSS_HASH;
#else
p->rss_hash = hash;
+ p->rss_hash_valid = true;
+#endif
+}
+
+static inline bool
+dp_packet_rss_valid(struct dp_packet *p)
+{
+#ifdef DPDK_NETDEV
+ return p->mbuf.ol_flags & PKT_RX_RSS_HASH;
+#else
+ return p->rss_hash_valid;
+#endif
+}
+
+static inline void
+dp_packet_rss_invalidate(struct dp_packet *p)
+{
+#ifdef DPDK_NETDEV
+ p->mbuf.ol_flags &= ~PKT_RX_RSS_HASH;
+#else
+ p->rss_hash_valid = false;
#endif
}
{
uint32_t hash, recirc_depth;
- hash = dp_packet_get_rss_hash(packet);
- if (OVS_UNLIKELY(!hash)) {
+ if (OVS_LIKELY(dp_packet_rss_valid(packet))) {
+ hash = dp_packet_get_rss_hash(packet);
+ } else {
hash = miniflow_hash_5tuple(mf, 0);
dp_packet_set_rss_hash(packet, hash);
}
dp_packet_delete(packet);
} else {
dp_packet_pad(packet);
- dp_packet_set_rss_hash(packet, 0);
+ dp_packet_rss_invalidate(packet);
packets[0] = packet;
*c = 1;
}
* the consumer of the ring and return into the datapath without recalculating
* the RSS hash. */
for (i = 0; i < cnt; i++) {
- dp_packet_set_rss_hash(pkts[i], 0);
+ dp_packet_rss_invalidate(pkts[i]);
}
netdev_dpdk_send__(netdev, qid, pkts, cnt, may_steal);
ovs_mutex_unlock(&netdev->mutex);
dp_packet_pad(packet);
- dp_packet_set_rss_hash(packet, 0);
+ dp_packet_rss_invalidate(packet);
arr[0] = packet;
*c = 1;
dp_packet_delete(buffer);
} else {
dp_packet_pad(buffer);
- dp_packet_set_rss_hash(buffer, 0);
+ dp_packet_rss_invalidate(buffer);
packets[0] = buffer;
*c = 1;
}