net/bnxt: add ICMPv6 parser to ULP
authorKishore Padmanabha <kishore.padmanabha@broadcom.com>
Sun, 30 May 2021 08:59:25 +0000 (14:29 +0530)
committerAjit Khaparde <ajit.khaparde@broadcom.com>
Thu, 8 Jul 2021 00:02:13 +0000 (02:02 +0200)
This patch adds support for parsing rte_flow items for ICMPv6 flows.

Signed-off-by: Kishore Padmanabha <kishore.padmanabha@broadcom.com>
Signed-off-by: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>
Reviewed-by: Randy Schacher <stuart.schacher@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
doc/guides/nics/features/bnxt.ini
drivers/net/bnxt/tf_ulp/ulp_rte_handler_tbl.c
drivers/net/bnxt/tf_ulp/ulp_rte_parser.c
drivers/net/bnxt/tf_ulp/ulp_rte_parser.h

index d6743fa..75d189e 100644 (file)
@@ -59,6 +59,7 @@ ipv4                 = Y
 ipv6                 = Y
 gre                  = Y
 icmp                 = Y
+icmp6                = Y
 pf                   = Y
 phy_port             = Y
 port_id              = Y
index 7bd499f..35e9858 100644 (file)
@@ -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,
index b1a6b3d..b8e69ff 100644 (file)
@@ -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 = &params->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,
index 66abe8e..bbba101 100644 (file)
@@ -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,