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:
parent
5bffab53f1
commit
84d2ea9d4f
@ -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;
|
||||
|
@ -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",
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user