summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/intel/ice/ice_fltr.c
diff options
context:
space:
mode:
authorMichal Swiatkowski <michal.swiatkowski@intel.com>2021-08-06 10:49:04 +0200
committerTony Nguyen <anthony.l.nguyen@intel.com>2021-10-11 08:50:37 -0700
commit572b820dfa61fc23b5ba59fd5baa92cd1ec2bacb (patch)
tree8e4386bdb6e0eb34f032ebbb2b8ac188f8e742fb /drivers/net/ethernet/intel/ice/ice_fltr.c
parent8b8ef05b776e660a95d8347716b9b6c38ddf97c8 (diff)
ice: Allow changing lan_en and lb_en on all kinds of filters
There is no way to change default lan_en and lb_en flags while adding new rule. Add function that allows changing these flags on rule determined by rule id and recipe id. Function checks if the rule is presented on regular rules list or advance rules list and call the appropriate function to update rule entry. As rules with ICE_SW_LKUP_DFLT recipe aren't tracked in a list, implement function which updates flags without searching for rules based only on rule id. Signed-off-by: Michal Swiatkowski <michal.swiatkowski@intel.com> Signed-off-by: Wojciech Drewek <wojciech.drewek@intel.com> Tested-by: Sandeep Penigalapati <sandeep.penigalapati@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_fltr.c')
-rw-r--r--drivers/net/ethernet/intel/ice/ice_fltr.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_fltr.c b/drivers/net/ethernet/intel/ice/ice_fltr.c
index c2e78eaf4ccb..f8c59df4ff9c 100644
--- a/drivers/net/ethernet/intel/ice/ice_fltr.c
+++ b/drivers/net/ethernet/intel/ice/ice_fltr.c
@@ -454,6 +454,133 @@ static u32 ice_fltr_build_action(u16 vsi_id)
}
/**
+ * ice_fltr_find_adv_entry - find advanced rule
+ * @rules: list of rules
+ * @rule_id: id of wanted rule
+ */
+static struct ice_adv_fltr_mgmt_list_entry *
+ice_fltr_find_adv_entry(struct list_head *rules, u16 rule_id)
+{
+ struct ice_adv_fltr_mgmt_list_entry *entry;
+
+ list_for_each_entry(entry, rules, list_entry) {
+ if (entry->rule_info.fltr_rule_id == rule_id)
+ return entry;
+ }
+
+ return NULL;
+}
+
+/**
+ * ice_fltr_update_adv_rule_flags - update flags on advanced rule
+ * @vsi: pointer to VSI
+ * @recipe_id: id of recipe
+ * @entry: advanced rule entry
+ * @new_flags: flags to update
+ */
+static enum ice_status
+ice_fltr_update_adv_rule_flags(struct ice_vsi *vsi, u16 recipe_id,
+ struct ice_adv_fltr_mgmt_list_entry *entry,
+ u32 new_flags)
+{
+ struct ice_adv_rule_info *info = &entry->rule_info;
+ struct ice_sw_act_ctrl *act = &info->sw_act;
+ u32 action;
+
+ if (act->fltr_act != ICE_FWD_TO_VSI)
+ return ICE_ERR_NOT_SUPPORTED;
+
+ action = ice_fltr_build_action(act->fwd_id.hw_vsi_id);
+
+ return ice_fltr_update_rule_flags(&vsi->back->hw, info->fltr_rule_id,
+ recipe_id, action, info->sw_act.flag,
+ act->src, new_flags);
+}
+
+/**
+ * ice_fltr_find_regular_entry - find regular rule
+ * @rules: list of rules
+ * @rule_id: id of wanted rule
+ */
+static struct ice_fltr_mgmt_list_entry *
+ice_fltr_find_regular_entry(struct list_head *rules, u16 rule_id)
+{
+ struct ice_fltr_mgmt_list_entry *entry;
+
+ list_for_each_entry(entry, rules, list_entry) {
+ if (entry->fltr_info.fltr_rule_id == rule_id)
+ return entry;
+ }
+
+ return NULL;
+}
+
+/**
+ * ice_fltr_update_regular_rule - update flags on regular rule
+ * @vsi: pointer to VSI
+ * @recipe_id: id of recipe
+ * @entry: regular rule entry
+ * @new_flags: flags to update
+ */
+static enum ice_status
+ice_fltr_update_regular_rule(struct ice_vsi *vsi, u16 recipe_id,
+ struct ice_fltr_mgmt_list_entry *entry,
+ u32 new_flags)
+{
+ struct ice_fltr_info *info = &entry->fltr_info;
+ u32 action;
+
+ if (info->fltr_act != ICE_FWD_TO_VSI)
+ return ICE_ERR_NOT_SUPPORTED;
+
+ action = ice_fltr_build_action(info->fwd_id.hw_vsi_id);
+
+ return ice_fltr_update_rule_flags(&vsi->back->hw, info->fltr_rule_id,
+ recipe_id, action, info->flag,
+ info->src, new_flags);
+}
+
+/**
+ * ice_fltr_update_flags - update flags on rule
+ * @vsi: pointer to VSI
+ * @rule_id: id of rule
+ * @recipe_id: id of recipe
+ * @new_flags: flags to update
+ *
+ * Function updates flags on regular and advance rule.
+ *
+ * Flags should be a combination of ICE_SINGLE_ACT_LB_ENABLE and
+ * ICE_SINGLE_ACT_LAN_ENABLE.
+ */
+enum ice_status
+ice_fltr_update_flags(struct ice_vsi *vsi, u16 rule_id, u16 recipe_id,
+ u32 new_flags)
+{
+ struct ice_adv_fltr_mgmt_list_entry *adv_entry;
+ struct ice_fltr_mgmt_list_entry *regular_entry;
+ struct ice_hw *hw = &vsi->back->hw;
+ struct ice_sw_recipe *recp_list;
+ struct list_head *fltr_rules;
+
+ recp_list = &hw->switch_info->recp_list[recipe_id];
+ if (!recp_list)
+ return ICE_ERR_DOES_NOT_EXIST;
+
+ fltr_rules = &recp_list->filt_rules;
+ regular_entry = ice_fltr_find_regular_entry(fltr_rules, rule_id);
+ if (regular_entry)
+ return ice_fltr_update_regular_rule(vsi, recipe_id,
+ regular_entry, new_flags);
+
+ adv_entry = ice_fltr_find_adv_entry(fltr_rules, rule_id);
+ if (adv_entry)
+ return ice_fltr_update_adv_rule_flags(vsi, recipe_id,
+ adv_entry, new_flags);
+
+ return ICE_ERR_DOES_NOT_EXIST;
+}
+
+/**
* ice_fltr_update_flags_dflt_rule - update flags on default rule
* @vsi: pointer to VSI
* @rule_id: id of rule