X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fbnxt%2Ftf_ulp%2Fulp_matcher.c;h=67fa61fc7c074375544ec360c64f6d44dea36821;hb=48fbc1be82b551e41c58e94de780fdd2ffaaeb78;hp=8040fb7515233f2d8346ea0c9e0a8d90a8c0d2a8;hpb=741172be52deceaae86368f14dd5835a4c24d8c2;p=dpdk.git diff --git a/drivers/net/bnxt/tf_ulp/ulp_matcher.c b/drivers/net/bnxt/tf_ulp/ulp_matcher.c index 8040fb7515..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,7 +53,8 @@ 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, + class_hid = ulp_matcher_class_hash_calculate((params->hdr_bitmap.bits ^ + params->app_id), params->fld_s_bitmap.bits); /* validate the calculate hash values */ @@ -70,6 +73,14 @@ ulp_matcher_pattern_match(struct ulp_rte_parser_params *params, 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; @@ -101,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) @@ -115,6 +127,14 @@ 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);