recirc_md.recirc_id = nl_attr_get_u32(a);
/* Hash is private to each packet */
- recirc_md.dp_hash = packets[i]->dp_hash;
+ recirc_md.dp_hash = dpif_packet_get_dp_hash(packets[i]);
dp_netdev_input(dp, &recirc_pkt, 1, &recirc_md);
}
dpif_packet_delete(packet);
} else {
dp_packet_pad(buffer);
+ dpif_packet_set_dp_hash(packet, 0);
packets[0] = packet;
*c = 1;
}
.rx_adv_conf = {
.rss_conf = {
.rss_key = NULL,
- .rss_hf = ETH_RSS_IPV4_TCP | ETH_RSS_IPV4 | ETH_RSS_IPV6,
+ .rss_hf = ETH_RSS_IPV4_TCP | ETH_RSS_IPV4 | ETH_RSS_IPV6
+ | ETH_RSS_IPV4_UDP | ETH_RSS_IPV6_TCP | ETH_RSS_IPV6_UDP,
},
},
.txmode = {
/* This performs a (sometimes unnecessary) copy */
arr[0] = dpif_packet_clone_from_ofpbuf(packet);
+ dpif_packet_set_dp_hash(arr[0], 0);
ofpbuf_delete(packet);
*c = 1;
return 0;
dpif_packet_delete(packet);
} else {
dp_packet_pad(buffer);
+ dpif_packet_set_dp_hash(packet, 0);
packets[0] = packet;
*c = 1;
}
break;
case OVS_KEY_ATTR_DP_HASH:
- packet->dp_hash = md->dp_hash = nl_attr_get_u32(a);
+ md->dp_hash = nl_attr_get_u32(a);
+ dpif_packet_set_dp_hash(packet, md->dp_hash);
break;
case OVS_KEY_ATTR_RECIRC_ID:
}
/* We also store the hash value with each packet */
- packets[i]->dp_hash = hash ? hash : 1;
+ dpif_packet_set_dp_hash(packets[i], hash ? hash : 1);
}
} else {
/* Assert on unknown hash algorithm. */
newp = dpif_packet_clone_from_ofpbuf(&p->ofpbuf);
- newp->dp_hash = p->dp_hash;
+ dpif_packet_set_dp_hash(newp, dpif_packet_get_dp_hash(p));
return newp;
}
struct dpif_packet {
struct ofpbuf ofpbuf; /* Packet data. */
+#ifndef DPDK_NETDEV
uint32_t dp_hash; /* Packet hash. */
+#endif
};
struct dpif_packet *dpif_packet_new_with_headroom(size_t size,
ofpbuf_delete(buf);
}
+static inline uint32_t dpif_packet_get_dp_hash(struct dpif_packet *p)
+{
+#ifdef DPDK_NETDEV
+ return p->ofpbuf.mbuf.pkt.hash.rss;
+#else
+ return p->dp_hash;
+#endif
+}
+
+static inline void dpif_packet_set_dp_hash(struct dpif_packet *p,
+ uint32_t hash)
+{
+#ifdef DPDK_NETDEV
+ p->ofpbuf.mbuf.pkt.hash.rss = hash;
+#else
+ p->dp_hash = hash;
+#endif
+}
+
#ifdef __cplusplus
}
#endif