net/ice/base: force switch to use different recipe
When we use profile rule as switch rule to download, if we download 2 different rules one by one, there will be rejection from function ice_aq_sw_rules(), for example: "flow create 0 priority 0 ingress pattern eth / ipv6 / ah / end actions queue index 3 / end" "flow create 0 priority 0 ingress pattern eth / ipv6 / esp / end actions queue index 2 / end" That is because the 2 rules has the same s_rule input set except action queue index, so it will be rejected by hardware. So we have to use different recipes for them. Also, we need to add recipe_id to keep record of recipe index, which will be used in rule remove, if not, there will be error when search recipe in function ice_rem_adv_rule() if we create 2 or more profile rule. For example: "flow create 0 priority 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 1 / end actions queue index 4 / end" "flow create 0 priority 0 ingress pattern eth / ipv4 / udp / pfcp s_field is 0 / end actions queue index 5 / end" then, "flow flush 0" you will find only the first rule will be delete, because ice_find_recp() will always return recipe id of the first rule. Signed-off-by: Wei Zhao <wei.zhao1@intel.com> Acked-by: Qi Zhang <qi.z.zhang@intel.com> Tested-by: Yuan Peng <yuan.peng@intel.com>
This commit is contained in:
parent
7e9c855842
commit
99d8ba79ef
@ -4983,7 +4983,8 @@ static const struct ice_protocol_entry ice_prot_id_tbl[ICE_PROTOCOL_LAST] = {
|
||||
*
|
||||
* Returns index of matching recipe, or ICE_MAX_NUM_RECIPES if not found.
|
||||
*/
|
||||
static u16 ice_find_recp(struct ice_hw *hw, struct ice_prot_lkup_ext *lkup_exts)
|
||||
static u16 ice_find_recp(struct ice_hw *hw, struct ice_prot_lkup_ext *lkup_exts,
|
||||
enum ice_sw_tunnel_type tun_type)
|
||||
{
|
||||
bool refresh_required = true;
|
||||
struct ice_sw_recipe *recp;
|
||||
@ -5042,7 +5043,10 @@ static u16 ice_find_recp(struct ice_hw *hw, struct ice_prot_lkup_ext *lkup_exts)
|
||||
/* If for "i"th recipe the found was never set to false
|
||||
* then it means we found our match
|
||||
*/
|
||||
if (found)
|
||||
if (ice_is_prof_rule(tun_type) &&
|
||||
tun_type == recp[i].tun_type && found)
|
||||
return i; /* Return the recipe ID */
|
||||
else if (!ice_is_prof_rule(tun_type) && found)
|
||||
return i; /* Return the recipe ID */
|
||||
}
|
||||
}
|
||||
@ -5798,7 +5802,7 @@ ice_get_compat_fv_bitmap(struct ice_hw *hw, struct ice_adv_rule_info *rinfo,
|
||||
* if the rule type is a profile rule, that means that there no field value
|
||||
* match required, in this case just a profile hit is required.
|
||||
*/
|
||||
static bool ice_is_prof_rule(enum ice_sw_tunnel_type type)
|
||||
bool ice_is_prof_rule(enum ice_sw_tunnel_type type)
|
||||
{
|
||||
switch (type) {
|
||||
case ICE_SW_TUN_PROFID_IPV6_ESP:
|
||||
@ -5952,11 +5956,12 @@ ice_add_adv_recipe(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
|
||||
goto err_free_lkup_exts;
|
||||
|
||||
/* Look for a recipe which matches our requested fv / mask list */
|
||||
*rid = ice_find_recp(hw, lkup_exts);
|
||||
*rid = ice_find_recp(hw, lkup_exts, rinfo->tun_type);
|
||||
if (*rid < ICE_MAX_NUM_RECIPES)
|
||||
/* Success if found a recipe that match the existing criteria */
|
||||
goto err_unroll;
|
||||
|
||||
rm->tun_type = rinfo->tun_type;
|
||||
/* Recipe we need does not exist, add a recipe */
|
||||
status = ice_add_sw_recipe(hw, rm, match_tun, profiles);
|
||||
if (status)
|
||||
@ -6857,7 +6862,7 @@ ice_rem_adv_rule(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
rid = ice_find_recp(hw, &lkup_exts);
|
||||
rid = ice_find_recp(hw, &lkup_exts, rinfo->tun_type);
|
||||
/* If did not find a recipe that match the existing criteria */
|
||||
if (rid == ICE_MAX_NUM_RECIPES)
|
||||
return ICE_ERR_PARAM;
|
||||
|
@ -483,5 +483,6 @@ bool ice_is_vsi_valid(struct ice_hw *hw, u16 vsi_handle);
|
||||
|
||||
enum ice_status ice_replay_vsi_all_fltr(struct ice_hw *hw, u16 vsi_handle);
|
||||
void ice_rm_all_sw_replay_rule_info(struct ice_hw *hw);
|
||||
bool ice_is_prof_rule(enum ice_sw_tunnel_type type);
|
||||
|
||||
#endif /* _ICE_SWITCH_H_ */
|
||||
|
Loading…
x
Reference in New Issue
Block a user