net/mlx5e: Add tc support for FWD rule with counter
authorMark Bloch <markb@mellanox.com>
Tue, 20 Sep 2016 07:58:29 +0000 (07:58 +0000)
committerLeon Romanovsky <leon@kernel.org>
Sun, 30 Oct 2016 13:43:18 +0000 (15:43 +0200)
When creating a FWD rule using tc create also a HW counter
for this rule.

Signed-off-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index 5d9ac0dbf3bfc0f5b9fb2f7ceeb6a2f94d966a07..c2e4728aaef86e2be99e0fafd78368a799ca81be 100644 (file)
@@ -419,7 +419,8 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
                                return -EINVAL;
                        }
 
-                       attr->action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
+                       attr->action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST |
+                                       MLX5_FLOW_CONTEXT_ACTION_COUNT;
                        out_priv = netdev_priv(out_dev);
                        attr->out_rep = out_priv->ppriv;
                        continue;
index 8b2a3832cd0a33897ec4f986d09633ab2b9724b6..53d9d6ce008bdc1702ec9b5d08cbb58bc6671a87 100644 (file)
@@ -48,11 +48,12 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
                                struct mlx5_flow_spec *spec,
                                struct mlx5_esw_flow_attr *attr)
 {
-       struct mlx5_flow_destination dest = { 0 };
+       struct mlx5_flow_destination dest[2] = {};
        struct mlx5_fc *counter = NULL;
        struct mlx5_flow_handle *rule;
        void *misc;
        int action;
+       int i = 0;
 
        if (esw->mode != SRIOV_OFFLOADS)
                return ERR_PTR(-EOPNOTSUPP);
@@ -60,15 +61,17 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
        action = attr->action;
 
        if (action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) {
-               dest.type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
-               dest.vport_num = attr->out_rep->vport;
-               action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
-       } else if (action & MLX5_FLOW_CONTEXT_ACTION_COUNT) {
+               dest[i].type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
+               dest[i].vport_num = attr->out_rep->vport;
+               i++;
+       }
+       if (action & MLX5_FLOW_CONTEXT_ACTION_COUNT) {
                counter = mlx5_fc_create(esw->dev, true);
                if (IS_ERR(counter))
                        return ERR_CAST(counter);
-               dest.type = MLX5_FLOW_DESTINATION_TYPE_COUNTER;
-               dest.counter = counter;
+               dest[i].type = MLX5_FLOW_DESTINATION_TYPE_COUNTER;
+               dest[i].counter = counter;
+               i++;
        }
 
        misc = MLX5_ADDR_OF(fte_match_param, spec->match_value, misc_parameters);
@@ -81,8 +84,7 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
                                      MLX5_MATCH_MISC_PARAMETERS;
 
        rule = mlx5_add_flow_rules((struct mlx5_flow_table *)esw->fdb_table.fdb,
-                                  spec, action, 0, &dest, 1);
-
+                                  spec, action, 0, dest, i);
        if (IS_ERR(rule))
                mlx5_fc_destroy(esw->dev, counter);