Reset the DPDK hwol flags in dp_packet_init_. The new hwol bad checksum flag is uninitialized for non-dpdk ports and this is noticed as test failures using netdev-dummy ports, when built with the --with-dpdk flag set. Hence, in this case, packets may be falsely marked as having a bad checksum. The existing APIs are simplified at the same time by making them specific to either DPDK or otherwise; they also now manage a single field.
Reported-at: https://mail.openvswitch.org/pipermail/ovs-discuss/2017-August/045081.html Fixes: 7451af618e0d ("dp-packet : Update DPDK rx checksum validation functions.") CC: Sugesh Chandran <[email protected]> Signed-off-by: Darrell Ball <[email protected]> --- v5->v6: Refactor some existing apis and incorporate review comments. v3->v5: Update the commit message with more context. v2->v3: Use existed API to reset both the DPDK HWOL flags. v1->v2: Fix build failure for without --with-dpdk. lib/dp-packet.c | 1 + lib/dp-packet.h | 24 +++++++++++++++++++++--- lib/netdev-dpdk.c | 2 +- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/lib/dp-packet.c b/lib/dp-packet.c index 67aa406..c1f43f3 100644 --- a/lib/dp-packet.c +++ b/lib/dp-packet.c @@ -31,6 +31,7 @@ dp_packet_init__(struct dp_packet *b, size_t allocated, enum dp_packet_source so dp_packet_reset_offsets(b); pkt_metadata_init(&b->md, 0); dp_packet_rss_invalidate(b); + dp_packet_mbuf_init(b); dp_packet_reset_cutlen(b); /* By default assume the packet type to be Ethernet. */ b->packet_type = htonl(PT_ETH); diff --git a/lib/dp-packet.h b/lib/dp-packet.h index 8f52fee..bb3f9db 100644 --- a/lib/dp-packet.h +++ b/lib/dp-packet.h @@ -605,12 +605,30 @@ dp_packet_rss_valid(struct dp_packet *p) } static inline void -dp_packet_rss_invalidate(struct dp_packet *p) +dp_packet_rss_invalidate(struct dp_packet *p OVS_UNUSED) +{ +#ifndef DPDK_NETDEV + p->rss_hash_valid = false; +#endif +} + +static inline void +dp_packet_mbuf_rss_flag_reset(struct dp_packet *p OVS_UNUSED) { #ifdef DPDK_NETDEV p->mbuf.ol_flags &= ~PKT_RX_RSS_HASH; -#else - p->rss_hash_valid = false; +#endif +} + +/* This initialization is needed for packets that do not come + * from DPDK interfaces, when vswitchd is built with --with-dpdk. + * The DPDK rte library will still otherwise manage the mbuf. + * We only need to initialize the mbuf ol_flags. */ +static inline void +dp_packet_mbuf_init(struct dp_packet *p OVS_UNUSED) +{ +#ifdef DPDK_NETDEV + p->mbuf.ol_flags = 0; #endif } diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 1d82bca..9fd98af 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -2916,7 +2916,7 @@ netdev_dpdk_ring_send(struct netdev *netdev, int qid, * modified by the consumer of the ring and return into the datapath * without recalculating the RSS hash. */ for (i = 0; i < batch->count; i++) { - dp_packet_rss_invalidate(batch->packets[i]); + dp_packet_mbuf_rss_flag_reset(batch->packets[i]); } netdev_dpdk_send__(dev, qid, batch, may_steal, concurrent_txq); -- 1.9.1 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
