1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2014-2020 Broadcom
6 #include "ulp_matcher.h"
9 /* Utility function to calculate the class matcher hash */
11 ulp_matcher_class_hash_calculate(uint64_t hi_sig, uint64_t lo_sig)
15 hi_sig |= ((hi_sig % BNXT_ULP_CLASS_HID_HIGH_PRIME) <<
16 BNXT_ULP_CLASS_HID_SHFTL);
17 lo_sig |= ((lo_sig % BNXT_ULP_CLASS_HID_LOW_PRIME) <<
18 (BNXT_ULP_CLASS_HID_SHFTL + 2));
19 hash = hi_sig ^ lo_sig;
20 hash = (hash >> BNXT_ULP_CLASS_HID_SHFTR) & BNXT_ULP_CLASS_HID_MASK;
21 return (uint32_t)hash;
24 /* Utility function to calculate the action matcher hash */
26 ulp_matcher_action_hash_calculate(uint64_t hi_sig)
30 hi_sig |= ((hi_sig % BNXT_ULP_ACT_HID_HIGH_PRIME) <<
31 BNXT_ULP_ACT_HID_SHFTL);
33 hash = (hash >> BNXT_ULP_ACT_HID_SHFTR) & BNXT_ULP_ACT_HID_MASK;
34 return (uint32_t)hash;
37 /* Utility function to mask the computed and internal proto headers. */
39 ulp_matcher_hdr_fields_normalize(struct ulp_rte_hdr_bitmap *hdr1,
40 struct ulp_rte_hdr_bitmap *hdr2)
42 /* copy the contents first */
43 rte_memcpy(hdr2, hdr1, sizeof(struct ulp_rte_hdr_bitmap));
45 /* reset the computed fields */
46 ULP_BITMAP_RESET(hdr2->bits, BNXT_ULP_HDR_BIT_SVIF);
47 ULP_BITMAP_RESET(hdr2->bits, BNXT_ULP_HDR_BIT_OO_VLAN);
48 ULP_BITMAP_RESET(hdr2->bits, BNXT_ULP_HDR_BIT_OI_VLAN);
49 ULP_BITMAP_RESET(hdr2->bits, BNXT_ULP_HDR_BIT_IO_VLAN);
50 ULP_BITMAP_RESET(hdr2->bits, BNXT_ULP_HDR_BIT_II_VLAN);
54 * Function to handle the matching of RTE Flows and validating
55 * the pattern masks against the flow templates.
58 ulp_matcher_pattern_match(struct ulp_rte_parser_params *params,
61 struct ulp_rte_hdr_bitmap hdr_bitmap_masked;
62 struct bnxt_ulp_class_match_info *class_match;
67 /* Remove the hdr bit maps that are internal or computed */
68 ulp_matcher_hdr_fields_normalize(¶ms->hdr_bitmap,
71 /* determine vf to vf flow */
72 if (params->dir == ULP_DIR_EGRESS &&
73 ULP_BITMAP_ISSET(params->act_bitmap.bits,
74 BNXT_ULP_ACTION_BIT_VNIC)) {
80 /* calculate the hash of the given flow */
81 class_hid = ulp_matcher_class_hash_calculate(hdr_bitmap_masked.bits,
82 params->fld_bitmap.bits);
84 /* validate the calculate hash values */
85 if (class_hid >= BNXT_ULP_CLASS_SIG_TBL_MAX_SZ)
87 tmpl_id = ulp_class_sig_tbl[class_hid];
91 class_match = &ulp_class_match_list[tmpl_id];
92 if (ULP_BITMAP_CMP(&hdr_bitmap_masked, &class_match->hdr_sig)) {
93 BNXT_TF_DBG(DEBUG, "Proto Header does not match\n");
96 if (ULP_BITMAP_CMP(¶ms->fld_bitmap, &class_match->field_sig)) {
97 BNXT_TF_DBG(DEBUG, "Field signature does not match\n");
100 if (vf_to_vf != class_match->act_vnic) {
101 BNXT_TF_DBG(DEBUG, "Vnic Match failed\n");
104 BNXT_TF_DBG(DEBUG, "Found matching pattern template %d\n",
105 class_match->class_tid);
106 *class_id = class_match->class_tid;
107 return BNXT_TF_RC_SUCCESS;
110 BNXT_TF_DBG(DEBUG, "Did not find any matching template\n");
112 return BNXT_TF_RC_ERROR;
116 * Function to handle the matching of RTE Flows and validating
117 * the action against the flow templates.
120 ulp_matcher_action_match(struct ulp_rte_parser_params *params,
125 struct bnxt_ulp_act_match_info *act_match;
127 /* calculate the hash of the given flow action */
128 act_hid = ulp_matcher_action_hash_calculate(params->act_bitmap.bits);
130 /* validate the calculate hash values */
131 if (act_hid >= BNXT_ULP_ACT_SIG_TBL_MAX_SZ)
133 tmpl_id = ulp_act_sig_tbl[act_hid];
137 act_match = &ulp_act_match_list[tmpl_id];
138 if (ULP_BITMAP_CMP(¶ms->act_bitmap, &act_match->act_sig)) {
139 BNXT_TF_DBG(DEBUG, "Action Header does not match\n");
142 *act_id = act_match->act_tid;
143 BNXT_TF_DBG(DEBUG, "Found matching action template %u\n", *act_id);
144 return BNXT_TF_RC_SUCCESS;
147 BNXT_TF_DBG(DEBUG, "Did not find any matching action template\n");
149 return BNXT_TF_RC_ERROR;