X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fbnxt%2Ftf_ulp%2Fulp_matcher.c;h=67fa61fc7c074375544ec360c64f6d44dea36821;hb=f787952d13d20b7eceaf6d1742ea591239b63ba1;hp=e23867f8b9accae364b02a4e38a59cdeb57df8f4;hpb=2addc463eed9e2d7cbda25b7bf9d2ed1412b7236;p=dpdk.git diff --git a/drivers/net/bnxt/tf_ulp/ulp_matcher.c b/drivers/net/bnxt/tf_ulp/ulp_matcher.c index e23867f8b9..67fa61fc7c 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_matcher.c +++ b/drivers/net/bnxt/tf_ulp/ulp_matcher.c @@ -23,13 +23,15 @@ ulp_matcher_class_hash_calculate(uint64_t hi_sig, uint64_t lo_sig) /* Utility function to calculate the action matcher hash */ static uint32_t -ulp_matcher_action_hash_calculate(uint64_t hi_sig) +ulp_matcher_action_hash_calculate(uint64_t hi_sig, uint64_t app_id) { uint64_t hash; hi_sig |= ((hi_sig % BNXT_ULP_ACT_HID_HIGH_PRIME) << BNXT_ULP_ACT_HID_SHFTL); - hash = hi_sig; + app_id |= ((app_id % BNXT_ULP_CLASS_HID_LOW_PRIME) << + (BNXT_ULP_CLASS_HID_SHFTL + 2)); + hash = hi_sig ^ app_id; hash = (hash >> BNXT_ULP_ACT_HID_SHFTR) & BNXT_ULP_ACT_HID_MASK; return (uint32_t)hash; } @@ -51,8 +53,9 @@ ulp_matcher_pattern_match(struct ulp_rte_parser_params *params, vf_to_vf = ULP_COMP_FLD_IDX_RD(params, BNXT_ULP_CF_IDX_VF_TO_VF); /* calculate the hash of the given flow */ - class_hid = ulp_matcher_class_hash_calculate(params->hdr_bitmap.bits, - params->fld_bitmap.bits); + class_hid = ulp_matcher_class_hash_calculate((params->hdr_bitmap.bits ^ + params->app_id), + params->fld_s_bitmap.bits); /* validate the calculate hash values */ if (class_hid >= BNXT_ULP_CLASS_SIG_TBL_MAX_SZ) @@ -66,10 +69,18 @@ ulp_matcher_pattern_match(struct ulp_rte_parser_params *params, BNXT_TF_DBG(DEBUG, "Proto Header does not match\n"); goto error; } - if (ULP_BITMAP_CMP(¶ms->fld_bitmap, &class_match->field_sig)) { + if (ULP_BITMAP_CMP(¶ms->fld_s_bitmap, &class_match->field_sig)) { BNXT_TF_DBG(DEBUG, "Field signature does not match\n"); goto error; } + + /* Match the application id before proceeding */ + if (params->app_id != class_match->app_sig) { + BNXT_TF_DBG(DEBUG, "Field to match the app id %u:%u\n", + params->app_id, class_match->app_sig); + goto error; + } + if (vf_to_vf != class_match->act_vnic) { BNXT_TF_DBG(DEBUG, "Vnic Match failed\n"); goto error; @@ -77,6 +88,9 @@ ulp_matcher_pattern_match(struct ulp_rte_parser_params *params, BNXT_TF_DBG(DEBUG, "Found matching pattern template %d\n", class_match->class_tid); *class_id = class_match->class_tid; + params->hdr_sig_id = class_match->hdr_sig_id; + params->flow_sig_id = class_match->flow_sig_id; + params->flow_pattern_id = class_match->flow_pattern_id; return BNXT_TF_RC_SUCCESS; error: @@ -98,7 +112,8 @@ ulp_matcher_action_match(struct ulp_rte_parser_params *params, struct bnxt_ulp_act_match_info *act_match; /* calculate the hash of the given flow action */ - act_hid = ulp_matcher_action_hash_calculate(params->act_bitmap.bits); + act_hid = ulp_matcher_action_hash_calculate(params->act_bitmap.bits, + params->app_id); /* validate the calculate hash values */ if (act_hid >= BNXT_ULP_ACT_SIG_TBL_MAX_SZ) @@ -112,7 +127,16 @@ ulp_matcher_action_match(struct ulp_rte_parser_params *params, BNXT_TF_DBG(DEBUG, "Action Header does not match\n"); goto error; } + + /* Match the application id before proceeding */ + if (params->app_id != act_match->app_sig) { + BNXT_TF_DBG(DEBUG, "Field to match the app id %u:%u\n", + params->app_id, act_match->app_sig); + goto error; + } + *act_id = act_match->act_tid; + params->act_pattern_id = act_match->act_pattern_id; BNXT_TF_DBG(DEBUG, "Found matching action template %u\n", *act_id); return BNXT_TF_RC_SUCCESS;