u16 sib_mask = 0;
u16 mask;
u16 off;
+ bool exist;
flds = params->prof->segs[seg].fields;
break;
case ICE_FLOW_FIELD_IDX_IPV6_TTL:
case ICE_FLOW_FIELD_IDX_IPV6_PROT:
- prot_id = seg == 0 ? ICE_PROT_IPV6_OF_OR_S : ICE_PROT_IPV6_IL;
+ prot_id = ICE_PROT_IPV6_NEXT_PROTO;
+ exist = ice_check_ddp_support_proto_id(hw, prot_id);
+ if (!exist)
+ prot_id = seg == 0 ?
+ ICE_PROT_IPV6_OF_OR_S :
+ ICE_PROT_IPV6_IL;
+ else
+ prot_id = seg == 0 ?
+ ICE_PROT_IPV6_NEXT_PROTO :
+ ICE_PROT_IPV6_IL;
/* TTL and PROT share the same extraction seq. entry.
* Each is considered a sibling to the other in terms of sharing
flds[fld].xtrct.disp = (u8)(ice_flds_info[fld].off % ese_bits);
flds[fld].xtrct.idx = params->es_cnt;
flds[fld].xtrct.mask = ice_flds_info[fld].mask;
+ if (prot_id == ICE_PROT_IPV6_NEXT_PROTO) {
+ flds[fld].xtrct.off = 0;
+ flds[fld].xtrct.disp = 0;
+ }
/* Adjust the next field-entry index after accommodating the number of
* entries this field consumes
ice_info(hw, "flags = 0x%04x\n", prof->flags);
ice_info(hw, "flags_msk = 0x%04x\n", prof->flags_msk);
}
+
+/**
+ * ice_check_ddp_support_proto_id - check DDP package file support protocol ID
+ * @hw: pointer to the HW struct
+ * @proto_id: protocol ID value
+ *
+ * This function maintains the compatibility of the program process by checking
+ * whether the current DDP file supports the required protocol ID.
+ */
+bool ice_check_ddp_support_proto_id(struct ice_hw *hw,
+ enum ice_prot_id proto_id)
+{
+ struct ice_proto_grp_item *proto_grp_table;
+ struct ice_proto_grp_item *proto_grp;
+ bool exist = false;
+ u16 idx, i;
+
+ proto_grp_table = ice_proto_grp_table_get(hw);
+ if (!proto_grp_table)
+ return false;
+
+ for (idx = 0; idx < ICE_PROTO_GRP_TABLE_SIZE; idx++) {
+ proto_grp = &proto_grp_table[idx];
+ for (i = 0; i < ICE_PROTO_COUNT_PER_GRP; i++) {
+ if (proto_grp->po[i].proto_id == proto_id) {
+ exist = true;
+ goto exit;
+ }
+ }
+ }
+
+exit:
+ ice_free(hw, proto_grp_table);
+ return exist;
+}
struct ice_parser_profile *prof);
void ice_parser_profile_dump(struct ice_hw *hw,
struct ice_parser_profile *prof);
+bool ice_check_ddp_support_proto_id(struct ice_hw *hw,
+ enum ice_prot_id proto_id);
#endif /* _ICE_PARSER_H_ */
#include "ice_common.h"
#include "ice_parser_util.h"
-#define ICE_PROTO_GRP_TABLE_SIZE 192
static void _proto_off_dump(struct ice_hw *hw, struct ice_proto_off *po,
int idx)
#define _ICE_PROTO_GRP_H_
#define ICE_PROTO_COUNT_PER_GRP 8
+#define ICE_PROTO_GRP_TABLE_SIZE 192
struct ice_proto_off {
bool polarity; /* true: positive, false: nagtive */
ICE_PROT_IPV6_OF_OR_S = 40,
ICE_PROT_IPV6_IL = 41,
ICE_PROT_IPV6_IL_IL = 42,
+ ICE_PROT_IPV6_NEXT_PROTO = 43,
ICE_PROT_IPV6_FRAG = 47,
ICE_PROT_TCP_IL = 49,
ICE_PROT_UDP_OF = 52,