|
@@ -133,6 +133,23 @@ err_create_ft:
|
|
|
return rule;
|
|
|
}
|
|
|
|
|
|
+static void mlx5e_tc_del_nic_flow(struct mlx5e_priv *priv,
|
|
|
+ struct mlx5e_tc_flow *flow)
|
|
|
+{
|
|
|
+ struct mlx5_fc *counter = NULL;
|
|
|
+
|
|
|
+ if (!IS_ERR(flow->rule)) {
|
|
|
+ counter = mlx5_flow_rule_counter(flow->rule);
|
|
|
+ mlx5_del_flow_rules(flow->rule);
|
|
|
+ mlx5_fc_destroy(priv->mdev, counter);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!mlx5e_tc_num_filters(priv) && (priv->fs.tc.t)) {
|
|
|
+ mlx5_destroy_flow_table(priv->fs.tc.t);
|
|
|
+ priv->fs.tc.t = NULL;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static struct mlx5_flow_handle *
|
|
|
mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
|
|
|
struct mlx5_flow_spec *spec,
|
|
@@ -149,7 +166,24 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
|
|
|
}
|
|
|
|
|
|
static void mlx5e_detach_encap(struct mlx5e_priv *priv,
|
|
|
- struct mlx5e_tc_flow *flow) {
|
|
|
+ struct mlx5e_tc_flow *flow);
|
|
|
+
|
|
|
+static void mlx5e_tc_del_fdb_flow(struct mlx5e_priv *priv,
|
|
|
+ struct mlx5e_tc_flow *flow)
|
|
|
+{
|
|
|
+ struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
|
|
|
+
|
|
|
+ mlx5_eswitch_del_offloaded_rule(esw, flow->rule, flow->attr);
|
|
|
+
|
|
|
+ mlx5_eswitch_del_vlan_action(esw, flow->attr);
|
|
|
+
|
|
|
+ if (flow->attr->action & MLX5_FLOW_CONTEXT_ACTION_ENCAP)
|
|
|
+ mlx5e_detach_encap(priv, flow);
|
|
|
+}
|
|
|
+
|
|
|
+static void mlx5e_detach_encap(struct mlx5e_priv *priv,
|
|
|
+ struct mlx5e_tc_flow *flow)
|
|
|
+{
|
|
|
struct list_head *next = flow->encap.next;
|
|
|
|
|
|
list_del(&flow->encap);
|
|
@@ -173,25 +207,10 @@ static void mlx5e_detach_encap(struct mlx5e_priv *priv,
|
|
|
static void mlx5e_tc_del_flow(struct mlx5e_priv *priv,
|
|
|
struct mlx5e_tc_flow *flow)
|
|
|
{
|
|
|
- struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
|
|
|
- struct mlx5_fc *counter = NULL;
|
|
|
-
|
|
|
- if (!IS_ERR(flow->rule)) {
|
|
|
- counter = mlx5_flow_rule_counter(flow->rule);
|
|
|
- mlx5_del_flow_rules(flow->rule);
|
|
|
- mlx5_fc_destroy(priv->mdev, counter);
|
|
|
- }
|
|
|
-
|
|
|
- if (flow->flags & MLX5E_TC_FLOW_ESWITCH) {
|
|
|
- mlx5_eswitch_del_vlan_action(esw, flow->attr);
|
|
|
- if (flow->attr->action & MLX5_FLOW_CONTEXT_ACTION_ENCAP)
|
|
|
- mlx5e_detach_encap(priv, flow);
|
|
|
- }
|
|
|
-
|
|
|
- if (!mlx5e_tc_num_filters(priv) && (priv->fs.tc.t)) {
|
|
|
- mlx5_destroy_flow_table(priv->fs.tc.t);
|
|
|
- priv->fs.tc.t = NULL;
|
|
|
- }
|
|
|
+ if (flow->flags & MLX5E_TC_FLOW_ESWITCH)
|
|
|
+ mlx5e_tc_del_fdb_flow(priv, flow);
|
|
|
+ else
|
|
|
+ mlx5e_tc_del_nic_flow(priv, flow);
|
|
|
}
|
|
|
|
|
|
static void parse_vxlan_attr(struct mlx5_flow_spec *spec,
|