[dpdk-dev] [PATCH 54/58] net/bnxt: add support for icmp6 ULP parsing
From: Venkat Duvvuru <hidden>
Date: 2021-05-30 09:07:46
Subsystem:
networking drivers, the rest · Maintainers:
Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
From: Kishore Padmanabha <redacted> This patch adds support for parsing rte_flow items for icmp6 flows. Signed-off-by: Kishore Padmanabha <redacted> Signed-off-by: Venkat Duvvuru <redacted> Reviewed-by: Randy Schacher <redacted> --- drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c | 4 +- drivers/net/bnxt/tf_ulp/ulp_rte_parser.c | 48 +++++++++++++++++++ drivers/net/bnxt/tf_ulp/ulp_rte_parser.h | 5 ++ 3 files changed, 55 insertions(+), 2 deletions(-)
diff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c b/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c
index 7bd499faa6..35e9858727 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c
+++ b/drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c@@ -346,8 +346,8 @@ struct bnxt_ulp_rte_hdr_info ulp_hdr_info[] = { .proto_hdr_func = NULL }, [RTE_FLOW_ITEM_TYPE_ICMP6] = { - .hdr_type = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED, - .proto_hdr_func = NULL + .hdr_type = BNXT_ULP_HDR_TYPE_SUPPORTED, + .proto_hdr_func = ulp_rte_icmp6_hdr_handler }, [RTE_FLOW_ITEM_TYPE_ICMP6_ND_NS] = { .hdr_type = BNXT_ULP_HDR_TYPE_NOT_SUPPORTED,
diff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c
index 0d52c0b93b..a55655a5bd 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c
+++ b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.c@@ -1599,6 +1599,54 @@ ulp_rte_icmp_hdr_handler(const struct rte_flow_item *item, return BNXT_TF_RC_SUCCESS; } +/* Function to handle the parsing of RTE Flow item ICMP6 Header. */ +int32_t +ulp_rte_icmp6_hdr_handler(const struct rte_flow_item *item, + struct ulp_rte_parser_params *params) +{ + const struct rte_flow_item_icmp6 *icmp_spec = item->spec; + const struct rte_flow_item_icmp6 *icmp_mask = item->mask; + struct ulp_rte_hdr_bitmap *hdr_bitmap = ¶ms->hdr_bitmap; + uint32_t idx = 0; + uint32_t size; + + if (ulp_rte_prsr_fld_size_validate(params, &idx, + BNXT_ULP_PROTO_HDR_ICMP_NUM)) { + BNXT_TF_DBG(ERR, "Error parsing protocol header\n"); + return BNXT_TF_RC_ERROR; + } + + size = sizeof(((struct rte_flow_item_icmp6 *)NULL)->type); + ulp_rte_prsr_fld_mask(params, &idx, size, + ulp_deference_struct(icmp_spec, type), + ulp_deference_struct(icmp_mask, type), + ULP_PRSR_ACT_DEFAULT); + + size = sizeof(((struct rte_flow_item_icmp6 *)NULL)->code); + ulp_rte_prsr_fld_mask(params, &idx, size, + ulp_deference_struct(icmp_spec, code), + ulp_deference_struct(icmp_mask, code), + ULP_PRSR_ACT_DEFAULT); + + size = sizeof(((struct rte_flow_item_icmp6 *)NULL)->checksum); + ulp_rte_prsr_fld_mask(params, &idx, size, + ulp_deference_struct(icmp_spec, checksum), + ulp_deference_struct(icmp_mask, checksum), + ULP_PRSR_ACT_DEFAULT); + + if (ULP_BITMAP_ISSET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_O_IPV4)) { + BNXT_TF_DBG(ERR, "Error: incorrect icmp version\n"); + return BNXT_TF_RC_ERROR; + } + + /* Update the hdr_bitmap with ICMP */ + if (ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_L3_TUN)) + ULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_I_ICMP); + else + ULP_BITMAP_SET(hdr_bitmap->bits, BNXT_ULP_HDR_BIT_O_ICMP); + return BNXT_TF_RC_SUCCESS; +} + /* Function to handle the parsing of RTE Flow item void Header */ int32_t ulp_rte_void_hdr_handler(const struct rte_flow_item *item __rte_unused,
diff --git a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h
index 66abe8e656..bbba10108c 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h
+++ b/drivers/net/bnxt/tf_ulp/ulp_rte_parser.h@@ -147,6 +147,11 @@ int32_t ulp_rte_icmp_hdr_handler(const struct rte_flow_item *item, struct ulp_rte_parser_params *params); +/* Function to handle the parsing of RTE Flow item ICMP6 Header. */ +int32_t +ulp_rte_icmp6_hdr_handler(const struct rte_flow_item *item, + struct ulp_rte_parser_params *params); + /* Function to handle the parsing of RTE Flow item void Header. */ int32_t ulp_rte_void_hdr_handler(const struct rte_flow_item *item,
--
2.17.1