From 0a00384a76380bb61ec6d5c926b02fb554de3877 Mon Sep 17 00:00:00 2001 From: Cristian Dumitrescu Date: Mon, 13 Jun 2022 18:28:34 +0100 Subject: [PATCH] pipeline: fix packet mirroring configuration Fix segmentation fault due to null pointer dereferencing inside the "mirror" instruction when number of mirroring slots is set to 0. This was taking place when the "mirror" instruction was used without the mirror feature being properly configured, i.e. the API function rte_swx_pipeline_mirroring_config was not called at initialization. Fixes: dac0ecd9098 ("pipeline: support packet mirroring") Signed-off-by: Cristian Dumitrescu --- lib/pipeline/rte_swx_pipeline.c | 5 ++--- lib/pipeline/rte_swx_pipeline.h | 10 ++++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/pipeline/rte_swx_pipeline.c b/lib/pipeline/rte_swx_pipeline.c index b4b44ad897..5c3406f0cf 100644 --- a/lib/pipeline/rte_swx_pipeline.c +++ b/lib/pipeline/rte_swx_pipeline.c @@ -612,9 +612,6 @@ mirroring_build(struct rte_swx_pipeline *p) { uint32_t i; - if (!p->n_mirroring_slots || !p->n_mirroring_sessions) - return 0; - for (i = 0; i < RTE_SWX_PIPELINE_THREADS_MAX; i++) { struct thread *t = &p->threads[i]; @@ -9772,6 +9769,8 @@ rte_swx_pipeline_config(struct rte_swx_pipeline **p, int numa_node) TAILQ_INIT(&pipeline->metarrays); pipeline->n_structs = 1; /* Struct 0 is reserved for action_data. */ + pipeline->n_mirroring_slots = RTE_SWX_PACKET_MIRRORING_SLOTS_DEFAULT; + pipeline->n_mirroring_sessions = RTE_SWX_PACKET_MIRRORING_SESSIONS_DEFAULT; pipeline->numa_node = numa_node; status = port_in_types_register(pipeline); diff --git a/lib/pipeline/rte_swx_pipeline.h b/lib/pipeline/rte_swx_pipeline.h index adc7fa53b7..9299f27094 100644 --- a/lib/pipeline/rte_swx_pipeline.h +++ b/lib/pipeline/rte_swx_pipeline.h @@ -163,6 +163,16 @@ rte_swx_pipeline_port_out_config(struct rte_swx_pipeline *p, * Packet mirroring */ +/** Default number of packet mirroring slots. */ +#ifndef RTE_SWX_PACKET_MIRRORING_SLOTS_DEFAULT +#define RTE_SWX_PACKET_MIRRORING_SLOTS_DEFAULT 4 +#endif + +/** Default maximum number of packet mirroring sessions. */ +#ifndef RTE_SWX_PACKET_MIRRORING_SESSIONS_DEFAULT +#define RTE_SWX_PACKET_MIRRORING_SESSIONS_DEFAULT 64 +#endif + /** Packet mirroring parameters. */ struct rte_swx_pipeline_mirroring_params { /** Number of packet mirroring slots. */ -- 2.39.5