From 6b840b7c53ddd1eafdd974b46436c471a90ee55d Mon Sep 17 00:00:00 2001 From: Cristian Dumitrescu Date: Fri, 26 Mar 2021 20:29:35 +0000 Subject: [PATCH] pipeline: validate header on SWX emit Enhance the behavior of the emit instruction to ignore invalid headers, as mandated by the P4 language specification. Signed-off-by: Cristian Dumitrescu --- lib/librte_pipeline/rte_swx_pipeline.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/librte_pipeline/rte_swx_pipeline.c b/lib/librte_pipeline/rte_swx_pipeline.c index 1b3bf6269e..52987870de 100644 --- a/lib/librte_pipeline/rte_swx_pipeline.c +++ b/lib/librte_pipeline/rte_swx_pipeline.c @@ -3101,10 +3101,11 @@ __instr_hdr_emit_exec(struct rte_swx_pipeline *p, uint32_t n_emit) { struct thread *t = &p->threads[p->thread_id]; struct instruction *ip = t->ip; + uint64_t valid_headers = t->valid_headers; uint32_t n_headers_out = t->n_headers_out; struct header_out_runtime *ho = &t->headers_out[n_headers_out - 1]; uint8_t *ho_ptr = NULL; - uint32_t ho_nbytes = 0, i; + uint32_t ho_nbytes = 0, first = 1, i; for (i = 0; i < n_emit; i++) { uint32_t header_id = ip->io.hdr.header_id[i]; @@ -3114,12 +3115,17 @@ __instr_hdr_emit_exec(struct rte_swx_pipeline *p, uint32_t n_emit) struct header_runtime *hi = &t->headers[header_id]; uint8_t *hi_ptr = t->structs[struct_id]; + if (!MASK64_BIT_GET(valid_headers, header_id)) + continue; + TRACE("[Thread %2u]: emit header %u\n", p->thread_id, header_id); /* Headers. */ - if (!i) { + if (first) { + first = 0; + if (!t->n_headers_out) { ho = &t->headers_out[0]; -- 2.20.1