Enhance the behavior of the emit instruction to ignore invalid headers, as mandated by the P4 language specification.
Signed-off-by: Cristian Dumitrescu <cristian.dumitre...@intel.com> --- 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 4455d9135..6a19b1450 100644 --- a/lib/librte_pipeline/rte_swx_pipeline.c +++ b/lib/librte_pipeline/rte_swx_pipeline.c @@ -3024,10 +3024,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]; @@ -3037,12 +3038,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.17.1