From 5dbff3af25a4a68980992f5040246e1d7f20b4cd Mon Sep 17 00:00:00 2001 From: Hyong Youb Kim Date: Wed, 10 Jan 2018 01:17:04 -0800 Subject: [PATCH] net/enic: fix L4 Rx ptype comparison For non-UDP/TCP packets, enic may wrongly set PKT_RX_L4_CKSUM_BAD in ol_flags. The comparison that checks if a packet is UDP or TCP assumes that RTE_PTYPE_L4 values are bit flags, but they are not. For example, the following evaluates to true because NONFRAG is 0x600 and UDP is 0x200, and causes the current code to think the packet is UDP. !!(RTE_PTYPE_L4_NONFRAG & RTE_PTYPE_L4_UDP) So, fix this by comparing the packet type against UDP and TCP individually. Fixes: 453d15059b58 ("net/enic: use new Rx checksum flags") Cc: stable@dpdk.org Signed-off-by: Hyong Youb Kim Reviewed-by: John Daley --- drivers/net/enic/enic_rxtx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/enic/enic_rxtx.c b/drivers/net/enic/enic_rxtx.c index c393465dad..a10d9bd728 100644 --- a/drivers/net/enic/enic_rxtx.c +++ b/drivers/net/enic/enic_rxtx.c @@ -282,7 +282,8 @@ enic_cq_rx_to_pkt_flags(struct cq_desc *cqd, struct rte_mbuf *mbuf) else pkt_flags |= PKT_RX_IP_CKSUM_BAD; - if (l4_flags & (RTE_PTYPE_L4_UDP | RTE_PTYPE_L4_TCP)) { + if (l4_flags == RTE_PTYPE_L4_UDP || + l4_flags == RTE_PTYPE_L4_TCP) { if (enic_cq_rx_desc_tcp_udp_csum_ok(cqrd)) pkt_flags |= PKT_RX_L4_CKSUM_GOOD; else -- 2.20.1