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

Reply via email to