patches for DPDK stable branches
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] common/cnxk: fix IPv6 extension header parsing
@ 2023-02-22  4:04 psatheesh
  2023-03-03 14:49 ` Jerin Jacob
  0 siblings, 1 reply; 2+ messages in thread
From: psatheesh @ 2023-02-22  4:04 UTC (permalink / raw)
  To: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao
  Cc: dev, Satheesh Paul, stable

From: Satheesh Paul <psatheesh@marvell.com>

RTE_FLOW_ITEM_TYPE_IPV6_EXT and RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT
pattern items can be specified following a RTE_FLOW_ITEM_TYPE_IPV6.
Modified layer C parsing logic to handle this.

Fixes: a800675b06f9 ("net/cnxk: support IPv6 fragment flow pattern item")
Cc: stable@dpdk.org

Signed-off-by: Satheesh Paul <psatheesh@marvell.com>
Reviewed-by: Kiran Kumar K <kirankumark@marvell.com>
---
 drivers/common/cnxk/roc_npc.h       |  11 ++
 drivers/common/cnxk/roc_npc_parse.c | 150 ++++++++++++++++++++--------
 drivers/common/cnxk/roc_npc_priv.h  |   2 +-
 drivers/common/cnxk/roc_npc_utils.c |   4 +-
 4 files changed, 123 insertions(+), 44 deletions(-)

diff --git a/drivers/common/cnxk/roc_npc.h b/drivers/common/cnxk/roc_npc.h
index cea627e16c..5e07e26a91 100644
--- a/drivers/common/cnxk/roc_npc.h
+++ b/drivers/common/cnxk/roc_npc.h
@@ -123,6 +123,17 @@ struct roc_ipv6_hdr {
 	uint8_t dst_addr[16]; /**< IP address of destination host(s). */
 } __plt_packed;
 
+struct roc_ipv6_fragment_ext {
+	uint8_t next_header; /**< Next header type */
+	uint8_t reserved;    /**< Reserved */
+	uint16_t frag_data;  /**< All fragmentation data */
+	uint32_t id;	     /**< Packet ID */
+} __plt_packed;
+
+struct roc_flow_item_ipv6_ext {
+	uint8_t next_hdr; /**< Next header. */
+};
+
 struct roc_npc_flow_item_ipv6 {
 	struct roc_ipv6_hdr hdr; /**< IPv6 header definition. */
 	uint32_t has_hop_ext : 1;
diff --git a/drivers/common/cnxk/roc_npc_parse.c b/drivers/common/cnxk/roc_npc_parse.c
index 085fb4618f..f746b9cb6d 100644
--- a/drivers/common/cnxk/roc_npc_parse.c
+++ b/drivers/common/cnxk/roc_npc_parse.c
@@ -664,41 +664,123 @@ npc_handle_ipv6ext_attr(const struct roc_npc_flow_item_ipv6 *ipv6_spec,
 }
 
 static int
-npc_process_ipv6_item(const struct roc_npc_flow_item_ipv6 *ipv6_spec,
-		      const struct roc_npc_flow_item_ipv6 *ipv6_mask, struct npc_parse_state *pst)
+npc_process_ipv6_item(struct npc_parse_state *pst)
 {
-	uint8_t hw_mask[NPC_MAX_EXTRACT_HW_LEN];
-	struct npc_parse_item_info info;
-	int rc, lid, lt;
-	uint8_t flags = 0;
+	uint8_t ipv6_hdr_mask[sizeof(struct roc_ipv6_hdr) + sizeof(struct roc_ipv6_fragment_ext)];
+	uint8_t ipv6_hdr_buf[sizeof(struct roc_ipv6_hdr) + sizeof(struct roc_ipv6_fragment_ext)];
+	const struct roc_npc_flow_item_ipv6 *ipv6_spec, *ipv6_mask;
+	const struct roc_npc_item_info *pattern = pst->pattern;
+	int offset = 0, rc = 0, lid, item_count = 0;
+	struct npc_parse_item_info parse_info;
+	char hw_mask[NPC_MAX_EXTRACT_HW_LEN];
+	uint8_t flags = 0, ltype;
+
+	memset(ipv6_hdr_buf, 0, sizeof(ipv6_hdr_buf));
+	memset(ipv6_hdr_mask, 0, sizeof(ipv6_hdr_mask));
+
+	ipv6_spec = pst->pattern->spec;
+	ipv6_mask = pst->pattern->mask;
+
+	parse_info.def_mask = NULL;
+	parse_info.spec = ipv6_hdr_buf;
+	parse_info.mask = ipv6_hdr_mask;
+	parse_info.def_mask = NULL;
+	parse_info.hw_hdr_len = 0;
+	parse_info.len = sizeof(ipv6_spec->hdr);
+
+	pst->set_ipv6ext_ltype_mask = true;
 
-	info.def_mask = NULL;
-	info.hw_mask = &hw_mask;
-	info.spec = NULL;
-	info.mask = NULL;
-	info.hw_hdr_len = 0;
 	lid = NPC_LID_LC;
+	ltype = NPC_LT_LC_IP6;
+
+	if (pattern->type == ROC_NPC_ITEM_TYPE_IPV6) {
+		item_count++;
+		if (ipv6_spec) {
+			memcpy(ipv6_hdr_buf, &ipv6_spec->hdr, sizeof(struct roc_ipv6_hdr));
+			rc = npc_handle_ipv6ext_attr(ipv6_spec, pst, &flags);
+			if (rc)
+				return rc;
+		}
+		if (ipv6_mask)
+			memcpy(ipv6_hdr_mask, &ipv6_mask->hdr, sizeof(struct roc_ipv6_hdr));
+	}
 
-	lt = NPC_LT_LC_IP6;
-	if (ipv6_spec) {
-		rc = npc_handle_ipv6ext_attr(ipv6_spec, pst, &flags);
-		if (rc)
-			return rc;
+	offset = sizeof(struct roc_ipv6_hdr);
+
+	while (pattern->type != ROC_NPC_ITEM_TYPE_END) {
+		/* Don't support ranges */
+		if (pattern->last != NULL)
+			return NPC_ERR_INVALID_RANGE;
+
+		/* If spec is NULL, both mask and last must be NULL, this
+		 * makes it to match ANY value (eq to mask = 0).
+		 * Setting either mask or last without spec is
+		 * an error
+		 */
+		if (pattern->spec == NULL) {
+			if (pattern->last != NULL && pattern->mask != NULL)
+				return NPC_ERR_INVALID_SPEC;
+		}
+		/* Either one ROC_NPC_ITEM_TYPE_IPV6_EXT or
+		 * one ROC_NPC_ITEM_TYPE_IPV6_FRAG_EXT is supported
+		 * following an ROC_NPC_ITEM_TYPE_IPV6 item.
+		 */
+		if (pattern->type == ROC_NPC_ITEM_TYPE_IPV6_EXT) {
+			item_count++;
+			ltype = NPC_LT_LC_IP6_EXT;
+			parse_info.len =
+				sizeof(struct roc_ipv6_hdr) + sizeof(struct roc_flow_item_ipv6_ext);
+			if (pattern->spec)
+				memcpy(ipv6_hdr_buf + offset, pattern->spec,
+				       sizeof(struct roc_flow_item_ipv6_ext));
+			if (pattern->mask)
+				memcpy(ipv6_hdr_mask + offset, pattern->mask,
+				       sizeof(struct roc_flow_item_ipv6_ext));
+			break;
+		} else if (pattern->type == ROC_NPC_ITEM_TYPE_IPV6_FRAG_EXT) {
+			item_count++;
+			ltype = NPC_LT_LC_IP6_EXT;
+			flags = NPC_F_LC_U_IP6_FRAG;
+			parse_info.len =
+				sizeof(struct roc_ipv6_hdr) + sizeof(struct roc_ipv6_fragment_ext);
+			if (pattern->spec)
+				memcpy(ipv6_hdr_buf + offset, pattern->spec,
+				       sizeof(struct roc_ipv6_fragment_ext));
+			if (pattern->mask)
+				memcpy(ipv6_hdr_mask + offset, pattern->mask,
+				       sizeof(struct roc_ipv6_fragment_ext));
+
+			break;
+		}
+
+		pattern++;
+		pattern = npc_parse_skip_void_and_any_items(pattern);
 	}
-	info.len = sizeof(ipv6_spec->hdr);
 
-	npc_get_hw_supp_mask(pst, &info, lid, lt);
-	rc = npc_parse_item_basic(pst->pattern, &info);
+	memset(hw_mask, 0, sizeof(hw_mask));
 
-	if (rc != 0)
-		return rc;
+	parse_info.hw_mask = &hw_mask;
+	npc_get_hw_supp_mask(pst, &parse_info, lid, ltype);
+
+	rc = npc_mask_is_supported(parse_info.mask, parse_info.hw_mask, parse_info.len);
+	if (!rc)
+		return NPC_ERR_INVALID_MASK;
 
-	rc = npc_update_parse_state(pst, &info, lid, lt, flags);
+	rc = npc_update_parse_state(pst, &parse_info, lid, ltype, flags);
 	if (rc)
 		return rc;
 
-	if (pst->npc->hash_extract_cap)
-		return npc_process_ipv6_field_hash(ipv6_spec, ipv6_mask, pst);
+	if (pst->npc->hash_extract_cap) {
+		rc = npc_process_ipv6_field_hash(parse_info.spec, parse_info.mask, pst, ltype);
+		if (rc)
+			return rc;
+	}
+
+	/* npc_update_parse_state() increments pattern once.
+	 * Check if additional increment is required.
+	 */
+	if (item_count == 2)
+		pst->pattern++;
 
 	return 0;
 }
@@ -706,7 +788,6 @@ npc_process_ipv6_item(const struct roc_npc_flow_item_ipv6 *ipv6_spec,
 int
 npc_parse_lc(struct npc_parse_state *pst)
 {
-	const struct roc_npc_flow_item_ipv6 *ipv6_spec, *ipv6_mask;
 	const struct roc_npc_flow_item_raw *raw_spec;
 	uint8_t raw_spec_buf[NPC_MAX_RAW_ITEM_LEN];
 	uint8_t raw_mask_buf[NPC_MAX_RAW_ITEM_LEN];
@@ -731,25 +812,12 @@ npc_parse_lc(struct npc_parse_state *pst)
 		info.len = pst->pattern->size;
 		break;
 	case ROC_NPC_ITEM_TYPE_IPV6:
-		ipv6_spec = pst->pattern->spec;
-		ipv6_mask = pst->pattern->mask;
-		return npc_process_ipv6_item(ipv6_spec, ipv6_mask, pst);
-	case ROC_NPC_ITEM_TYPE_ARP_ETH_IPV4:
-		lt = NPC_LT_LC_ARP;
-		info.len = pst->pattern->size;
-		break;
 	case ROC_NPC_ITEM_TYPE_IPV6_EXT:
-		lid = NPC_LID_LC;
-		lt = NPC_LT_LC_IP6_EXT;
-		info.len = pst->pattern->size;
-		info.hw_hdr_len = 40;
-		break;
 	case ROC_NPC_ITEM_TYPE_IPV6_FRAG_EXT:
-		lid = NPC_LID_LC;
-		lt = NPC_LT_LC_IP6_EXT;
-		flags = NPC_F_LC_U_IP6_FRAG;
+		return npc_process_ipv6_item(pst);
+	case ROC_NPC_ITEM_TYPE_ARP_ETH_IPV4:
+		lt = NPC_LT_LC_ARP;
 		info.len = pst->pattern->size;
-		info.hw_hdr_len = 40;
 		break;
 	case ROC_NPC_ITEM_TYPE_L3_CUSTOM:
 		lt = NPC_LT_LC_CUSTOM0;
diff --git a/drivers/common/cnxk/roc_npc_priv.h b/drivers/common/cnxk/roc_npc_priv.h
index 9c21934add..08d763eeb4 100644
--- a/drivers/common/cnxk/roc_npc_priv.h
+++ b/drivers/common/cnxk/roc_npc_priv.h
@@ -466,7 +466,7 @@ int npc_program_mcam(struct npc *npc, struct npc_parse_state *pst, bool mcam_all
 uint64_t npc_get_kex_capability(struct npc *npc);
 int npc_process_ipv6_field_hash(const struct roc_npc_flow_item_ipv6 *ipv6_spec,
 				const struct roc_npc_flow_item_ipv6 *ipv6_mask,
-				struct npc_parse_state *pst);
+				struct npc_parse_state *pst, uint8_t type);
 int npc_rss_free_grp_get(struct npc *npc, uint32_t *grp);
 int npc_rss_action_configure(struct roc_npc *roc_npc, const struct roc_npc_action_rss *rss,
 			     uint8_t *alg_idx, uint32_t *rss_grp, uint32_t mcam_id);
diff --git a/drivers/common/cnxk/roc_npc_utils.c b/drivers/common/cnxk/roc_npc_utils.c
index f4f9cc0916..a507df994f 100644
--- a/drivers/common/cnxk/roc_npc_utils.c
+++ b/drivers/common/cnxk/roc_npc_utils.c
@@ -384,7 +384,7 @@ npc_hash_field_get(struct npc_xtract_info *xinfo, const struct roc_npc_flow_item
 int
 npc_process_ipv6_field_hash(const struct roc_npc_flow_item_ipv6 *ipv6_spec,
 			    const struct roc_npc_flow_item_ipv6 *ipv6_mask,
-			    struct npc_parse_state *pst)
+			    struct npc_parse_state *pst, uint8_t ltype)
 {
 	struct npc_lid_lt_xtract_info *lid_lt_xinfo;
 	uint8_t hash_field[ROC_IPV6_ADDR_LEN];
@@ -397,7 +397,7 @@ npc_process_ipv6_field_hash(const struct roc_npc_flow_item_ipv6 *ipv6_spec,
 	memset(hash_field, 0, sizeof(hash_field));
 
 	intf = pst->nix_intf;
-	lid_lt_xinfo = &pst->npc->prx_dxcfg[intf][NPC_LID_LC][NPC_LT_LC_IP6];
+	lid_lt_xinfo = &pst->npc->prx_dxcfg[intf][NPC_LID_LC][ltype];
 
 	for (i = 0; i < NPC_MAX_LD; i++) {
 		xinfo = &lid_lt_xinfo->xtract[i];
-- 
2.35.3


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [dpdk-dev] [PATCH] common/cnxk: fix IPv6 extension header parsing
  2023-02-22  4:04 [dpdk-dev] [PATCH] common/cnxk: fix IPv6 extension header parsing psatheesh
@ 2023-03-03 14:49 ` Jerin Jacob
  0 siblings, 0 replies; 2+ messages in thread
From: Jerin Jacob @ 2023-03-03 14:49 UTC (permalink / raw)
  To: psatheesh
  Cc: Nithin Dabilpuram, Kiran Kumar K, Sunil Kumar Kori, Satha Rao,
	dev, stable

On Wed, Feb 22, 2023 at 9:35 AM <psatheesh@marvell.com> wrote:
>
> From: Satheesh Paul <psatheesh@marvell.com>
>
> RTE_FLOW_ITEM_TYPE_IPV6_EXT and RTE_FLOW_ITEM_TYPE_IPV6_FRAG_EXT
> pattern items can be specified following a RTE_FLOW_ITEM_TYPE_IPV6.
> Modified layer C parsing logic to handle this.
>
> Fixes: a800675b06f9 ("net/cnxk: support IPv6 fragment flow pattern item")
> Cc: stable@dpdk.org
>
> Signed-off-by: Satheesh Paul <psatheesh@marvell.com>
> Reviewed-by: Kiran Kumar K <kirankumark@marvell.com>


Applied to dpdk-next-net-mrvl/for-next-net. Thanks


> ---
>  drivers/common/cnxk/roc_npc.h       |  11 ++
>  drivers/common/cnxk/roc_npc_parse.c | 150 ++++++++++++++++++++--------
>  drivers/common/cnxk/roc_npc_priv.h  |   2 +-
>  drivers/common/cnxk/roc_npc_utils.c |   4 +-
>  4 files changed, 123 insertions(+), 44 deletions(-)
>
> diff --git a/drivers/common/cnxk/roc_npc.h b/drivers/common/cnxk/roc_npc.h
> index cea627e16c..5e07e26a91 100644
> --- a/drivers/common/cnxk/roc_npc.h
> +++ b/drivers/common/cnxk/roc_npc.h
> @@ -123,6 +123,17 @@ struct roc_ipv6_hdr {
>         uint8_t dst_addr[16]; /**< IP address of destination host(s). */
>  } __plt_packed;
>
> +struct roc_ipv6_fragment_ext {
> +       uint8_t next_header; /**< Next header type */
> +       uint8_t reserved;    /**< Reserved */
> +       uint16_t frag_data;  /**< All fragmentation data */
> +       uint32_t id;         /**< Packet ID */
> +} __plt_packed;
> +
> +struct roc_flow_item_ipv6_ext {
> +       uint8_t next_hdr; /**< Next header. */
> +};
> +
>  struct roc_npc_flow_item_ipv6 {
>         struct roc_ipv6_hdr hdr; /**< IPv6 header definition. */
>         uint32_t has_hop_ext : 1;
> diff --git a/drivers/common/cnxk/roc_npc_parse.c b/drivers/common/cnxk/roc_npc_parse.c
> index 085fb4618f..f746b9cb6d 100644
> --- a/drivers/common/cnxk/roc_npc_parse.c
> +++ b/drivers/common/cnxk/roc_npc_parse.c
> @@ -664,41 +664,123 @@ npc_handle_ipv6ext_attr(const struct roc_npc_flow_item_ipv6 *ipv6_spec,
>  }
>
>  static int
> -npc_process_ipv6_item(const struct roc_npc_flow_item_ipv6 *ipv6_spec,
> -                     const struct roc_npc_flow_item_ipv6 *ipv6_mask, struct npc_parse_state *pst)
> +npc_process_ipv6_item(struct npc_parse_state *pst)
>  {
> -       uint8_t hw_mask[NPC_MAX_EXTRACT_HW_LEN];
> -       struct npc_parse_item_info info;
> -       int rc, lid, lt;
> -       uint8_t flags = 0;
> +       uint8_t ipv6_hdr_mask[sizeof(struct roc_ipv6_hdr) + sizeof(struct roc_ipv6_fragment_ext)];
> +       uint8_t ipv6_hdr_buf[sizeof(struct roc_ipv6_hdr) + sizeof(struct roc_ipv6_fragment_ext)];
> +       const struct roc_npc_flow_item_ipv6 *ipv6_spec, *ipv6_mask;
> +       const struct roc_npc_item_info *pattern = pst->pattern;
> +       int offset = 0, rc = 0, lid, item_count = 0;
> +       struct npc_parse_item_info parse_info;
> +       char hw_mask[NPC_MAX_EXTRACT_HW_LEN];
> +       uint8_t flags = 0, ltype;
> +
> +       memset(ipv6_hdr_buf, 0, sizeof(ipv6_hdr_buf));
> +       memset(ipv6_hdr_mask, 0, sizeof(ipv6_hdr_mask));
> +
> +       ipv6_spec = pst->pattern->spec;
> +       ipv6_mask = pst->pattern->mask;
> +
> +       parse_info.def_mask = NULL;
> +       parse_info.spec = ipv6_hdr_buf;
> +       parse_info.mask = ipv6_hdr_mask;
> +       parse_info.def_mask = NULL;
> +       parse_info.hw_hdr_len = 0;
> +       parse_info.len = sizeof(ipv6_spec->hdr);
> +
> +       pst->set_ipv6ext_ltype_mask = true;
>
> -       info.def_mask = NULL;
> -       info.hw_mask = &hw_mask;
> -       info.spec = NULL;
> -       info.mask = NULL;
> -       info.hw_hdr_len = 0;
>         lid = NPC_LID_LC;
> +       ltype = NPC_LT_LC_IP6;
> +
> +       if (pattern->type == ROC_NPC_ITEM_TYPE_IPV6) {
> +               item_count++;
> +               if (ipv6_spec) {
> +                       memcpy(ipv6_hdr_buf, &ipv6_spec->hdr, sizeof(struct roc_ipv6_hdr));
> +                       rc = npc_handle_ipv6ext_attr(ipv6_spec, pst, &flags);
> +                       if (rc)
> +                               return rc;
> +               }
> +               if (ipv6_mask)
> +                       memcpy(ipv6_hdr_mask, &ipv6_mask->hdr, sizeof(struct roc_ipv6_hdr));
> +       }
>
> -       lt = NPC_LT_LC_IP6;
> -       if (ipv6_spec) {
> -               rc = npc_handle_ipv6ext_attr(ipv6_spec, pst, &flags);
> -               if (rc)
> -                       return rc;
> +       offset = sizeof(struct roc_ipv6_hdr);
> +
> +       while (pattern->type != ROC_NPC_ITEM_TYPE_END) {
> +               /* Don't support ranges */
> +               if (pattern->last != NULL)
> +                       return NPC_ERR_INVALID_RANGE;
> +
> +               /* If spec is NULL, both mask and last must be NULL, this
> +                * makes it to match ANY value (eq to mask = 0).
> +                * Setting either mask or last without spec is
> +                * an error
> +                */
> +               if (pattern->spec == NULL) {
> +                       if (pattern->last != NULL && pattern->mask != NULL)
> +                               return NPC_ERR_INVALID_SPEC;
> +               }
> +               /* Either one ROC_NPC_ITEM_TYPE_IPV6_EXT or
> +                * one ROC_NPC_ITEM_TYPE_IPV6_FRAG_EXT is supported
> +                * following an ROC_NPC_ITEM_TYPE_IPV6 item.
> +                */
> +               if (pattern->type == ROC_NPC_ITEM_TYPE_IPV6_EXT) {
> +                       item_count++;
> +                       ltype = NPC_LT_LC_IP6_EXT;
> +                       parse_info.len =
> +                               sizeof(struct roc_ipv6_hdr) + sizeof(struct roc_flow_item_ipv6_ext);
> +                       if (pattern->spec)
> +                               memcpy(ipv6_hdr_buf + offset, pattern->spec,
> +                                      sizeof(struct roc_flow_item_ipv6_ext));
> +                       if (pattern->mask)
> +                               memcpy(ipv6_hdr_mask + offset, pattern->mask,
> +                                      sizeof(struct roc_flow_item_ipv6_ext));
> +                       break;
> +               } else if (pattern->type == ROC_NPC_ITEM_TYPE_IPV6_FRAG_EXT) {
> +                       item_count++;
> +                       ltype = NPC_LT_LC_IP6_EXT;
> +                       flags = NPC_F_LC_U_IP6_FRAG;
> +                       parse_info.len =
> +                               sizeof(struct roc_ipv6_hdr) + sizeof(struct roc_ipv6_fragment_ext);
> +                       if (pattern->spec)
> +                               memcpy(ipv6_hdr_buf + offset, pattern->spec,
> +                                      sizeof(struct roc_ipv6_fragment_ext));
> +                       if (pattern->mask)
> +                               memcpy(ipv6_hdr_mask + offset, pattern->mask,
> +                                      sizeof(struct roc_ipv6_fragment_ext));
> +
> +                       break;
> +               }
> +
> +               pattern++;
> +               pattern = npc_parse_skip_void_and_any_items(pattern);
>         }
> -       info.len = sizeof(ipv6_spec->hdr);
>
> -       npc_get_hw_supp_mask(pst, &info, lid, lt);
> -       rc = npc_parse_item_basic(pst->pattern, &info);
> +       memset(hw_mask, 0, sizeof(hw_mask));
>
> -       if (rc != 0)
> -               return rc;
> +       parse_info.hw_mask = &hw_mask;
> +       npc_get_hw_supp_mask(pst, &parse_info, lid, ltype);
> +
> +       rc = npc_mask_is_supported(parse_info.mask, parse_info.hw_mask, parse_info.len);
> +       if (!rc)
> +               return NPC_ERR_INVALID_MASK;
>
> -       rc = npc_update_parse_state(pst, &info, lid, lt, flags);
> +       rc = npc_update_parse_state(pst, &parse_info, lid, ltype, flags);
>         if (rc)
>                 return rc;
>
> -       if (pst->npc->hash_extract_cap)
> -               return npc_process_ipv6_field_hash(ipv6_spec, ipv6_mask, pst);
> +       if (pst->npc->hash_extract_cap) {
> +               rc = npc_process_ipv6_field_hash(parse_info.spec, parse_info.mask, pst, ltype);
> +               if (rc)
> +                       return rc;
> +       }
> +
> +       /* npc_update_parse_state() increments pattern once.
> +        * Check if additional increment is required.
> +        */
> +       if (item_count == 2)
> +               pst->pattern++;
>
>         return 0;
>  }
> @@ -706,7 +788,6 @@ npc_process_ipv6_item(const struct roc_npc_flow_item_ipv6 *ipv6_spec,
>  int
>  npc_parse_lc(struct npc_parse_state *pst)
>  {
> -       const struct roc_npc_flow_item_ipv6 *ipv6_spec, *ipv6_mask;
>         const struct roc_npc_flow_item_raw *raw_spec;
>         uint8_t raw_spec_buf[NPC_MAX_RAW_ITEM_LEN];
>         uint8_t raw_mask_buf[NPC_MAX_RAW_ITEM_LEN];
> @@ -731,25 +812,12 @@ npc_parse_lc(struct npc_parse_state *pst)
>                 info.len = pst->pattern->size;
>                 break;
>         case ROC_NPC_ITEM_TYPE_IPV6:
> -               ipv6_spec = pst->pattern->spec;
> -               ipv6_mask = pst->pattern->mask;
> -               return npc_process_ipv6_item(ipv6_spec, ipv6_mask, pst);
> -       case ROC_NPC_ITEM_TYPE_ARP_ETH_IPV4:
> -               lt = NPC_LT_LC_ARP;
> -               info.len = pst->pattern->size;
> -               break;
>         case ROC_NPC_ITEM_TYPE_IPV6_EXT:
> -               lid = NPC_LID_LC;
> -               lt = NPC_LT_LC_IP6_EXT;
> -               info.len = pst->pattern->size;
> -               info.hw_hdr_len = 40;
> -               break;
>         case ROC_NPC_ITEM_TYPE_IPV6_FRAG_EXT:
> -               lid = NPC_LID_LC;
> -               lt = NPC_LT_LC_IP6_EXT;
> -               flags = NPC_F_LC_U_IP6_FRAG;
> +               return npc_process_ipv6_item(pst);
> +       case ROC_NPC_ITEM_TYPE_ARP_ETH_IPV4:
> +               lt = NPC_LT_LC_ARP;
>                 info.len = pst->pattern->size;
> -               info.hw_hdr_len = 40;
>                 break;
>         case ROC_NPC_ITEM_TYPE_L3_CUSTOM:
>                 lt = NPC_LT_LC_CUSTOM0;
> diff --git a/drivers/common/cnxk/roc_npc_priv.h b/drivers/common/cnxk/roc_npc_priv.h
> index 9c21934add..08d763eeb4 100644
> --- a/drivers/common/cnxk/roc_npc_priv.h
> +++ b/drivers/common/cnxk/roc_npc_priv.h
> @@ -466,7 +466,7 @@ int npc_program_mcam(struct npc *npc, struct npc_parse_state *pst, bool mcam_all
>  uint64_t npc_get_kex_capability(struct npc *npc);
>  int npc_process_ipv6_field_hash(const struct roc_npc_flow_item_ipv6 *ipv6_spec,
>                                 const struct roc_npc_flow_item_ipv6 *ipv6_mask,
> -                               struct npc_parse_state *pst);
> +                               struct npc_parse_state *pst, uint8_t type);
>  int npc_rss_free_grp_get(struct npc *npc, uint32_t *grp);
>  int npc_rss_action_configure(struct roc_npc *roc_npc, const struct roc_npc_action_rss *rss,
>                              uint8_t *alg_idx, uint32_t *rss_grp, uint32_t mcam_id);
> diff --git a/drivers/common/cnxk/roc_npc_utils.c b/drivers/common/cnxk/roc_npc_utils.c
> index f4f9cc0916..a507df994f 100644
> --- a/drivers/common/cnxk/roc_npc_utils.c
> +++ b/drivers/common/cnxk/roc_npc_utils.c
> @@ -384,7 +384,7 @@ npc_hash_field_get(struct npc_xtract_info *xinfo, const struct roc_npc_flow_item
>  int
>  npc_process_ipv6_field_hash(const struct roc_npc_flow_item_ipv6 *ipv6_spec,
>                             const struct roc_npc_flow_item_ipv6 *ipv6_mask,
> -                           struct npc_parse_state *pst)
> +                           struct npc_parse_state *pst, uint8_t ltype)
>  {
>         struct npc_lid_lt_xtract_info *lid_lt_xinfo;
>         uint8_t hash_field[ROC_IPV6_ADDR_LEN];
> @@ -397,7 +397,7 @@ npc_process_ipv6_field_hash(const struct roc_npc_flow_item_ipv6 *ipv6_spec,
>         memset(hash_field, 0, sizeof(hash_field));
>
>         intf = pst->nix_intf;
> -       lid_lt_xinfo = &pst->npc->prx_dxcfg[intf][NPC_LID_LC][NPC_LT_LC_IP6];
> +       lid_lt_xinfo = &pst->npc->prx_dxcfg[intf][NPC_LID_LC][ltype];
>
>         for (i = 0; i < NPC_MAX_LD; i++) {
>                 xinfo = &lid_lt_xinfo->xtract[i];
> --
> 2.35.3
>

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-03-03 14:50 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-22  4:04 [dpdk-dev] [PATCH] common/cnxk: fix IPv6 extension header parsing psatheesh
2023-03-03 14:49 ` Jerin Jacob

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).