return 0;
}
+int
+npc_parse_mark_item(struct npc_parse_state *pst)
+{
+ if (pst->pattern->type == ROC_NPC_ITEM_TYPE_MARK) {
+ if (pst->flow->nix_intf != NIX_INTF_RX)
+ return -EINVAL;
+
+ pst->is_second_pass_rule = true;
+ pst->pattern++;
+ }
+
+ 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,
info.hw_hdr_len = 0;
/* Prepare for parsing the item */
+ info.def_mask = NULL;
info.hw_mask = &hw_mask;
info.len = pst->pattern->size;
npc_get_hw_supp_mask(pst, &info, lid, lt);
}
/* Prepare for parsing the item */
+ info.def_mask = NULL;
info.hw_mask = &hw_mask;
info.len = pst->pattern->size;
npc_get_hw_supp_mask(pst, &info, lid, lt);
}
/* Prepare for parsing the item */
+ info.def_mask = NULL;
info.hw_mask = &hw_mask;
info.len = sizeof(eth_item->hdr);
npc_get_hw_supp_mask(pst, &info, lid, lt);
int nr_vlans = 0;
int rc;
+ info.def_mask = NULL;
info.spec = NULL;
info.mask = NULL;
info.def_mask = NULL;
}
info.len = pattern->size;
} else if (pst->pattern->type == ROC_NPC_ITEM_TYPE_QINQ) {
- vlan_item[0] = pst->pattern->spec;
info.hw_mask = NULL;
- info.len = sizeof(vlan_item[0]->hdr);
+ info.len = pattern->size;
lt = NPC_LT_LB_STAG_QINQ;
lflags = NPC_F_STAG_CTAG;
- if (vlan_item[0] && vlan_item[0]->has_more_vlan) {
- lflags = NPC_F_LB_L_WITH_QINQ_CTAG &
- NPC_F_LB_L_WITH_QINQ_QINQ;
- }
} else if (pst->pattern->type == ROC_NPC_ITEM_TYPE_RAW) {
raw_spec = pst->pattern->spec;
if (raw_spec->relative)
* pst->pattern points to first MPLS label. We only check
* that subsequent labels do not have anything to match.
*/
+ info.def_mask = NULL;
info.hw_mask = NULL;
info.len = pattern->size;
info.spec = NULL;
info.mask = NULL;
info.hw_hdr_len = 0;
- info.def_mask = NULL;
while (pattern->type == ROC_NPC_ITEM_TYPE_MPLS) {
nr_labels++;
info.len = pst->pattern->size;
info.spec = NULL;
info.mask = NULL;
+ info.def_mask = NULL;
info.hw_hdr_len = 0;
npc_get_hw_supp_mask(pst, &info, lid, lt);
if (pst->pattern->type == ROC_NPC_ITEM_TYPE_MPLS)
return npc_parse_mpls(pst, NPC_LID_LC);
+ info.def_mask = NULL;
info.hw_mask = &hw_mask;
info.spec = NULL;
info.mask = NULL;
ipv6_spec = pst->pattern->spec;
lid = NPC_LID_LC;
lt = NPC_LT_LC_IP6;
- rc = npc_handle_ipv6ext_attr(ipv6_spec, pst, &flags);
- if (rc)
- return rc;
+ if (ipv6_spec) {
+ rc = npc_handle_ipv6ext_attr(ipv6_spec, pst, &flags);
+ if (rc)
+ return rc;
+ }
info.len = sizeof(ipv6_spec->hdr);
break;
case ROC_NPC_ITEM_TYPE_ARP_ETH_IPV4:
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;
+ info.len = pst->pattern->size;
+ info.hw_hdr_len = 40;
+ break;
case ROC_NPC_ITEM_TYPE_L3_CUSTOM:
lt = NPC_LT_LC_CUSTOM0;
info.len = pst->pattern->size;
return npc_parse_mpls(pst, NPC_LID_LD);
return 0;
}
+ info.def_mask = NULL;
info.hw_mask = &hw_mask;
info.spec = NULL;
info.mask = NULL;
- info.def_mask = NULL;
info.len = 0;
info.hw_hdr_len = 0;
lflags = 0;
/* No match support for vlan tags */
+ info.def_mask = NULL;
info.hw_mask = NULL;
info.len = pst->pattern->size;
info.spec = NULL;
if (!pst->tunnel)
return 0;
+ info.def_mask = NULL;
info.hw_mask = &hw_mask;
info.spec = NULL;
info.mask = NULL;
if (!pst->tunnel)
return 0;
+ info.def_mask = NULL;
info.hw_mask = &hw_mask;
info.spec = NULL;
info.mask = NULL;