|
@@ -1356,6 +1356,24 @@ static int i40e_set_rss_hash_opt(struct i40e_pf *pf, struct ethtool_rxnfc *nfc)
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * i40e_match_fdir_input_set - Match a new filter against an existing one
|
|
|
|
|
+ * @rule: The filter already added
|
|
|
|
|
+ * @input: The new filter to comapre against
|
|
|
|
|
+ *
|
|
|
|
|
+ * Returns true if the two input set match
|
|
|
|
|
+ **/
|
|
|
|
|
+static bool i40e_match_fdir_input_set(struct i40e_fdir_filter *rule,
|
|
|
|
|
+ struct i40e_fdir_filter *input)
|
|
|
|
|
+{
|
|
|
|
|
+ if ((rule->dst_ip[0] != input->dst_ip[0]) ||
|
|
|
|
|
+ (rule->src_ip[0] != input->src_ip[0]) ||
|
|
|
|
|
+ (rule->dst_port != input->dst_port) ||
|
|
|
|
|
+ (rule->src_port != input->src_port))
|
|
|
|
|
+ return false;
|
|
|
|
|
+ return true;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* i40e_update_ethtool_fdir_entry - Updates the fdir filter entry
|
|
* i40e_update_ethtool_fdir_entry - Updates the fdir filter entry
|
|
|
* @vsi: Pointer to the targeted VSI
|
|
* @vsi: Pointer to the targeted VSI
|
|
@@ -1391,11 +1409,10 @@ static int i40e_update_ethtool_fdir_entry(struct i40e_vsi *vsi,
|
|
|
|
|
|
|
|
/* if there is an old rule occupying our place remove it */
|
|
/* if there is an old rule occupying our place remove it */
|
|
|
if (rule && (rule->fd_id == sw_idx)) {
|
|
if (rule && (rule->fd_id == sw_idx)) {
|
|
|
- if (!input || (rule->fd_id != input->fd_id)) {
|
|
|
|
|
- cmd->fs.flow_type = rule->flow_type;
|
|
|
|
|
- err = i40e_add_del_fdir_ethtool(vsi, cmd, false);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
|
|
+ if (input && !i40e_match_fdir_input_set(rule, input))
|
|
|
|
|
+ err = i40e_add_del_fdir(vsi, rule, false);
|
|
|
|
|
+ else if (!input)
|
|
|
|
|
+ err = i40e_add_del_fdir(vsi, rule, false);
|
|
|
hlist_del(&rule->fdir_node);
|
|
hlist_del(&rule->fdir_node);
|
|
|
kfree(rule);
|
|
kfree(rule);
|
|
|
pf->fdir_pf_active_filters--;
|
|
pf->fdir_pf_active_filters--;
|