]> git.droids-corp.org - dpdk.git/commitdiff
common/cnxk: support custom pre L2 header parsing as raw
authorKiran Kumar K <kirankumark@marvell.com>
Fri, 21 Jan 2022 06:26:39 +0000 (11:56 +0530)
committerJerin Jacob <jerinj@marvell.com>
Sat, 22 Jan 2022 14:06:41 +0000 (15:06 +0100)
Add ROC API for parsing custom pre_l2 headers as raw data.
Only relative offset is supported and search and limit is
not supported with this raw item type.

Signed-off-by: Kiran Kumar K <kirankumark@marvell.com>
Reviewed-by: Satheesh Paul <psatheesh@marvell.com>
drivers/common/cnxk/roc_npc.c
drivers/common/cnxk/roc_npc_mcam_dump.c
drivers/common/cnxk/roc_npc_parse.c
drivers/common/cnxk/roc_npc_priv.h

index d18dfd425971a5aff8408357cbaa228988e2b6eb..e3961bfbc6a75f2e27879dd4aad37ca5952a9104 100644 (file)
@@ -566,10 +566,10 @@ npc_parse_pattern(struct npc *npc, const struct roc_npc_item_info pattern[],
                  struct roc_npc_flow *flow, struct npc_parse_state *pst)
 {
        npc_parse_stage_func_t parse_stage_funcs[] = {
-               npc_parse_meta_items, npc_parse_cpt_hdr, npc_parse_higig2_hdr,
-               npc_parse_la,         npc_parse_lb,      npc_parse_lc,
-               npc_parse_ld,         npc_parse_le,      npc_parse_lf,
-               npc_parse_lg,         npc_parse_lh,
+               npc_parse_meta_items, npc_parse_pre_l2, npc_parse_cpt_hdr,
+               npc_parse_higig2_hdr, npc_parse_la,     npc_parse_lb,
+               npc_parse_lc,         npc_parse_ld,     npc_parse_le,
+               npc_parse_lf,         npc_parse_lg,     npc_parse_lh,
        };
        uint8_t layer = 0;
        int key_offset;
index 278056591e7b7cfcda16eac7940af2c7c62b77c6..679e3d7657a68e6de0d43284e73f7ecd0b246ea1 100644 (file)
@@ -69,6 +69,8 @@ static const char *const ltype_str[NPC_MAX_LID][NPC_MAX_LT] = {
        [NPC_LID_LA][NPC_LT_LA_IH_NIX_ETHER] = "LA_IH_NIX_ETHER",
        [NPC_LID_LA][NPC_LT_LA_HIGIG2_ETHER] = "LA_HIGIG2_ETHER",
        [NPC_LID_LA][NPC_LT_LA_IH_NIX_HIGIG2_ETHER] = "LA_IH_NIX_HIGIG2_ETHER",
+       [NPC_LID_LA][NPC_LT_LA_CUSTOM_PRE_L2_ETHER] =
+               "NPC_LT_LA_CUSTOM_PRE_L2_ETHER",
        [NPC_LID_LB][0] = "NONE",
        [NPC_LID_LB][NPC_LT_LB_CTAG] = "LB_CTAG",
        [NPC_LID_LB][NPC_LT_LB_STAG_QINQ] = "LB_STAG_QINQ",
index 8125035dd807b1b742d7ff9efb567873b4aee70d..c9ab9aef289a574fcbbfe2b18202861ceb66ee4b 100644 (file)
@@ -21,6 +21,80 @@ npc_parse_meta_items(struct npc_parse_state *pst)
        return 0;
 }
 
+static int
+npc_flow_raw_item_prepare(const struct roc_npc_flow_item_raw *raw_spec,
+                         const struct roc_npc_flow_item_raw *raw_mask,
+                         struct npc_parse_item_info *info, uint8_t *spec_buf,
+                         uint8_t *mask_buf)
+{
+
+       memset(spec_buf, 0, NPC_MAX_RAW_ITEM_LEN);
+       memset(mask_buf, 0, NPC_MAX_RAW_ITEM_LEN);
+
+       memcpy(spec_buf + raw_spec->offset, raw_spec->pattern,
+              raw_spec->length);
+
+       if (raw_mask && raw_mask->pattern) {
+               memcpy(mask_buf + raw_spec->offset, raw_mask->pattern,
+                      raw_spec->length);
+       } else {
+               memset(mask_buf + raw_spec->offset, 0xFF, raw_spec->length);
+       }
+
+       info->len = NPC_MAX_RAW_ITEM_LEN;
+       info->spec = spec_buf;
+       info->mask = mask_buf;
+       return 0;
+}
+
+int
+npc_parse_pre_l2(struct npc_parse_state *pst)
+{
+       uint8_t raw_spec_buf[NPC_MAX_RAW_ITEM_LEN] = {0};
+       uint8_t raw_mask_buf[NPC_MAX_RAW_ITEM_LEN] = {0};
+       uint8_t hw_mask[NPC_MAX_EXTRACT_HW_LEN] = {0};
+       const struct roc_npc_flow_item_raw *raw_spec;
+       struct npc_parse_item_info info;
+       int lid, lt, len;
+       int rc;
+
+       if (pst->npc->switch_header_type != ROC_PRIV_FLAGS_PRE_L2)
+               return 0;
+
+       /* Identify the pattern type into lid, lt */
+       if (pst->pattern->type != ROC_NPC_ITEM_TYPE_RAW)
+               return 0;
+
+       lid = NPC_LID_LA;
+       lt = NPC_LT_LA_CUSTOM_PRE_L2_ETHER;
+       info.hw_hdr_len = 0;
+
+       raw_spec = pst->pattern->spec;
+       len = raw_spec->length + raw_spec->offset;
+       if (len > NPC_MAX_RAW_ITEM_LEN)
+               return -EINVAL;
+
+       if (raw_spec->relative == 0 || raw_spec->search || raw_spec->limit ||
+           raw_spec->offset < 0)
+               return -EINVAL;
+
+       npc_flow_raw_item_prepare(
+               (const struct roc_npc_flow_item_raw *)pst->pattern->spec,
+               (const struct roc_npc_flow_item_raw *)pst->pattern->mask, &info,
+               raw_spec_buf, raw_mask_buf);
+
+       info.hw_mask = &hw_mask;
+       npc_get_hw_supp_mask(pst, &info, lid, lt);
+
+       /* Basic validation of item parameters */
+       rc = npc_parse_item_basic(pst->pattern, &info);
+       if (rc)
+               return rc;
+
+       /* Update pst if not validate only? clash check? */
+       return npc_update_parse_state(pst, &info, lid, lt, 0);
+}
+
 int
 npc_parse_cpt_hdr(struct npc_parse_state *pst)
 {
@@ -136,35 +210,6 @@ npc_parse_la(struct npc_parse_state *pst)
        return npc_update_parse_state(pst, &info, lid, lt, 0);
 }
 
-static int
-npc_flow_raw_item_prepare(const struct roc_npc_flow_item_raw *raw_spec,
-                         const struct roc_npc_flow_item_raw *raw_mask,
-                         struct npc_parse_item_info *info, uint8_t *spec_buf,
-                         uint8_t *mask_buf)
-{
-       uint32_t custom_hdr_size = 0;
-
-       memset(spec_buf, 0, NPC_MAX_RAW_ITEM_LEN);
-       memset(mask_buf, 0, NPC_MAX_RAW_ITEM_LEN);
-       custom_hdr_size = raw_spec->offset + raw_spec->length;
-
-       memcpy(spec_buf + raw_spec->offset, raw_spec->pattern,
-              raw_spec->length);
-
-       if (raw_mask->pattern) {
-               memcpy(mask_buf + raw_spec->offset, raw_mask->pattern,
-                      raw_spec->length);
-       } else {
-               memset(mask_buf + raw_spec->offset, 0xFF, raw_spec->length);
-       }
-
-       info->len = custom_hdr_size;
-       info->spec = spec_buf;
-       info->mask = mask_buf;
-
-       return 0;
-}
-
 int
 npc_parse_lb(struct npc_parse_state *pst)
 {
index a503d47de42ced31a9986ff5b1c128a2f801405b..59e6c307cd458af4a25c58715f53f566b2a90241 100644 (file)
@@ -408,6 +408,7 @@ void npc_get_hw_supp_mask(struct npc_parse_state *pst,
 int npc_parse_item_basic(const struct roc_npc_item_info *item,
                         struct npc_parse_item_info *info);
 int npc_parse_meta_items(struct npc_parse_state *pst);
+int npc_parse_pre_l2(struct npc_parse_state *pst);
 int npc_parse_higig2_hdr(struct npc_parse_state *pst);
 int npc_parse_cpt_hdr(struct npc_parse_state *pst);
 int npc_parse_la(struct npc_parse_state *pst);