]> git.droids-corp.org - dpdk.git/commitdiff
examples/ipsec-secgw: fix buffer freeing in vector mode
authorNithin Dabilpuram <ndabilpuram@marvell.com>
Wed, 23 Feb 2022 09:53:52 +0000 (15:23 +0530)
committerAkhil Goyal <gakhil@marvell.com>
Wed, 23 Feb 2022 10:43:14 +0000 (11:43 +0100)
Fix packet processing to skip after mbuf is freed instead of
touching and Tx'ing it.

Also free vector event buffer in event worker when after processing
there is no pkt to be enqueued to Tx adapter.

Fixes: 86738ebe1e3d ("examples/ipsec-secgw: support event vector")
Cc: stable@dpdk.org
Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
Acked-by: Akhil Goyal <gakhil@marvell.com>
examples/ipsec-secgw/ipsec_worker.c

index e9493c56ae210b94bd493b61c73c9d5ceecec91b..8639426c5c17d1b343f04b8d5cb96db8c30ab0c9 100644 (file)
@@ -205,12 +205,16 @@ check_sp_sa_bulk(struct sp_ctx *sp, struct sa_ctx *sa_ctx,
                        ip->pkts[j++] = m;
                else {
                        sa = *(struct ipsec_sa **)rte_security_dynfield(m);
-                       if (sa == NULL)
+                       if (sa == NULL) {
                                free_pkts(&m, 1);
+                               continue;
+                       }
 
                        /* SPI on the packet should match with the one in SA */
-                       if (unlikely(sa->spi != sa_ctx->sa[res - 1].spi))
+                       if (unlikely(sa->spi != sa_ctx->sa[res - 1].spi)) {
                                free_pkts(&m, 1);
+                               continue;
+                       }
 
                        ip->pkts[j++] = m;
                }
@@ -536,6 +540,7 @@ ipsec_ev_route_pkts(struct rte_event_vector *vec, struct route_table *rt,
                                RTE_SECURITY_ACTION_TYPE_INLINE_PROTOCOL)) {
                                RTE_LOG(ERR, IPSEC, "SA type not supported\n");
                                free_pkts(&pkt, 1);
+                               continue;
                        }
                        rte_security_set_pkt_metadata(sess->security.ctx,
                                                sess->security.ses, pkt, NULL);
@@ -695,11 +700,13 @@ ipsec_ev_vector_process(struct lcore_conf_ev_tx_int_port_wrkr *lconf,
                ret = process_ipsec_ev_outbound_vector(&lconf->outbound,
                                                       &lconf->rt, vec);
 
-       if (ret > 0) {
+       if (likely(ret > 0)) {
                vec->nb_elem = ret;
                rte_event_eth_tx_adapter_enqueue(links[0].eventdev_id,
                                                 links[0].event_port_id,
                                                 ev, 1, 0);
+       } else {
+               rte_mempool_put(rte_mempool_from_obj(vec), vec);
        }
 }
 
@@ -720,6 +727,8 @@ ipsec_ev_vector_drv_mode_process(struct eh_event_link_info *links,
                rte_event_eth_tx_adapter_enqueue(links[0].eventdev_id,
                                                 links[0].event_port_id,
                                                 ev, 1, 0);
+       else
+               rte_mempool_put(rte_mempool_from_obj(vec), vec);
 }
 
 /*