mlxsw: spectrum_dpipe: Add support for controlling nexthop counters
authorArkadi Sharshevsky <arkadis@mellanox.com>
Mon, 25 Sep 2017 08:32:30 +0000 (10:32 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 27 Sep 2017 03:04:35 +0000 (20:04 -0700)
Add support for controlling nexthop counters via dpipe.

Signed-off-by: Arkadi Sharshevsky <arkadis@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_dpipe.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.h

index e6755a9..a056f23 100644 (file)
@@ -1132,6 +1132,29 @@ out:
        return err;
 }
 
+static int mlxsw_sp_dpipe_table_adj_counters_update(void *priv, bool enable)
+{
+       struct mlxsw_sp *mlxsw_sp = priv;
+       struct mlxsw_sp_nexthop *nh;
+       u32 adj_hash_index = 0;
+       u32 adj_index = 0;
+
+       mlxsw_sp_nexthop_for_each(nh, mlxsw_sp->router) {
+               if (!mlxsw_sp_nexthop_offload(nh) ||
+                   mlxsw_sp_nexthop_group_has_ipip(nh))
+                       continue;
+
+               mlxsw_sp_nexthop_indexes(nh, &adj_index, &adj_hash_index);
+               if (enable)
+                       mlxsw_sp_nexthop_counter_alloc(mlxsw_sp, nh);
+               else
+                       mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh);
+               mlxsw_sp_nexthop_update(mlxsw_sp,
+                                       adj_index + adj_hash_index, nh);
+       }
+       return 0;
+}
+
 static u64
 mlxsw_sp_dpipe_table_adj_size_get(void *priv)
 {
@@ -1149,6 +1172,7 @@ static struct devlink_dpipe_table_ops mlxsw_sp_dpipe_table_adj_ops = {
        .matches_dump = mlxsw_sp_dpipe_table_adj_matches_dump,
        .actions_dump = mlxsw_sp_dpipe_table_adj_actions_dump,
        .entries_dump = mlxsw_sp_dpipe_table_adj_entries_dump,
+       .counters_set_update = mlxsw_sp_dpipe_table_adj_counters_update,
        .size_get = mlxsw_sp_dpipe_table_adj_size_get,
 };
 
index a75064a..321f735 100644 (file)
@@ -2070,8 +2070,8 @@ struct mlxsw_sp_nexthop_group {
 #define nh_rif nexthops[0].rif
 };
 
-static void mlxsw_sp_nexthop_counter_alloc(struct mlxsw_sp *mlxsw_sp,
-                                          struct mlxsw_sp_nexthop *nh)
+void mlxsw_sp_nexthop_counter_alloc(struct mlxsw_sp *mlxsw_sp,
+                                   struct mlxsw_sp_nexthop *nh)
 {
        struct devlink *devlink;
 
@@ -2086,8 +2086,8 @@ static void mlxsw_sp_nexthop_counter_alloc(struct mlxsw_sp *mlxsw_sp,
        nh->counter_valid = true;
 }
 
-static void mlxsw_sp_nexthop_counter_free(struct mlxsw_sp *mlxsw_sp,
-                                         struct mlxsw_sp_nexthop *nh)
+void mlxsw_sp_nexthop_counter_free(struct mlxsw_sp *mlxsw_sp,
+                                  struct mlxsw_sp_nexthop *nh)
 {
        if (!nh->counter_valid)
                return;
@@ -2433,8 +2433,8 @@ static int mlxsw_sp_adj_index_mass_update(struct mlxsw_sp *mlxsw_sp,
        return 0;
 }
 
-static int mlxsw_sp_nexthop_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
-                                  struct mlxsw_sp_nexthop *nh)
+int mlxsw_sp_nexthop_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
+                           struct mlxsw_sp_nexthop *nh)
 {
        struct mlxsw_sp_neigh_entry *neigh_entry = nh->neigh_entry;
        char ratr_pl[MLXSW_REG_RATR_LEN];
index a6e8659..3d44918 100644 (file)
@@ -122,5 +122,11 @@ bool mlxsw_sp_nexthop_group_has_ipip(struct mlxsw_sp_nexthop *nh);
             nh = mlxsw_sp_nexthop_next(router, nh))
 int mlxsw_sp_nexthop_counter_get(struct mlxsw_sp *mlxsw_sp,
                                 struct mlxsw_sp_nexthop *nh, u64 *p_counter);
+int mlxsw_sp_nexthop_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
+                           struct mlxsw_sp_nexthop *nh);
+void mlxsw_sp_nexthop_counter_alloc(struct mlxsw_sp *mlxsw_sp,
+                                   struct mlxsw_sp_nexthop *nh);
+void mlxsw_sp_nexthop_counter_free(struct mlxsw_sp *mlxsw_sp,
+                                  struct mlxsw_sp_nexthop *nh);
 
 #endif /* _MLXSW_ROUTER_H_*/