Verify that the message length is non zero and keep processing virtual channel messages after the event is received.
Fixes: 6bc987ecb860 ("net/iavf: support IPsec inline crypto") Cc: sta...@dpdk.org Signed-off-by: Radu Nicolau <radu.nico...@intel.com> --- drivers/net/iavf/iavf_vchnl.c | 43 +++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c index 4327c5a786..7fc239ee98 100644 --- a/drivers/net/iavf/iavf_vchnl.c +++ b/drivers/net/iavf/iavf_vchnl.c @@ -346,23 +346,32 @@ iavf_handle_virtchnl_msg(struct rte_eth_dev *dev) iavf_handle_pf_event_msg(dev, info.msg_buf, info.msg_len); } else { - /* check for inline IPsec events */ - struct inline_ipsec_msg *imsg = - (struct inline_ipsec_msg *)info.msg_buf; - struct rte_eth_event_ipsec_desc desc; - if (msg_opc == - VIRTCHNL_OP_INLINE_IPSEC_CRYPTO && - imsg->ipsec_opcode == - INLINE_IPSEC_OP_EVENT) { - struct virtchnl_ipsec_event *ev = - imsg->ipsec_data.event; - desc.subtype = - RTE_ETH_EVENT_IPSEC_UNKNOWN; - desc.metadata = ev->ipsec_event_data; - rte_eth_dev_callback_process(dev, - RTE_ETH_EVENT_IPSEC, - &desc); - return; + /* check for unsolicited messages i.e. events */ + if (info.msg_len > 0) { + switch (msg_opc) { + case VIRTCHNL_OP_INLINE_IPSEC_CRYPTO: { + struct inline_ipsec_msg *imsg = + (struct inline_ipsec_msg *)info.msg_buf; + if (imsg->ipsec_opcode + == INLINE_IPSEC_OP_EVENT) { + struct rte_eth_event_ipsec_desc desc; + struct virtchnl_ipsec_event *ev = + imsg->ipsec_data.event; + desc.subtype = + RTE_ETH_EVENT_IPSEC_UNKNOWN; + desc.metadata = + ev->ipsec_event_data; + rte_eth_dev_callback_process(dev, + RTE_ETH_EVENT_IPSEC, + &desc); + continue; + } + } + break; + default: + break; + } + } /* read message and it's expected one */ -- 2.25.1