net/iavf: fix handling of IPsec events

Verify that the message length is non zero and keep processing
virtual channel messages after the event is received.

Fixes: 6bc987ecb8 ("net/iavf: support IPsec inline crypto")
Cc: stable@dpdk.org

Signed-off-by: Radu Nicolau <radu.nicolau@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
This commit is contained in:
Radu Nicolau 2022-10-24 12:34:47 +01:00 committed by Qi Zhang
parent e91659806a
commit cc9317e2b0

View File

@ -488,22 +488,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;
iavf_dev_event_post(dev, RTE_ETH_EVENT_IPSEC,
&desc, sizeof(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;
iavf_dev_event_post(dev,
RTE_ETH_EVENT_IPSEC,
&desc, sizeof(desc));
continue;
}
}
break;
default:
break;
}
}
/* read message and it's expected one */