common/cnxk: support custom pre L2 header parsing as raw

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>
This commit is contained in:
Kiran Kumar K 2022-01-21 11:56:39 +05:30 committed by Jerin Jacob
parent 5bffab53f1
commit 84d2ea9d4f
4 changed files with 81 additions and 33 deletions

View 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;

View 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",

View 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)
{

View 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);