|
@@ -247,6 +247,27 @@ void mlxsw_sp_acl_ruleset_put(struct mlxsw_sp *mlxsw_sp,
|
|
|
mlxsw_sp_acl_ruleset_ref_dec(mlxsw_sp, ruleset);
|
|
|
}
|
|
|
|
|
|
+static int
|
|
|
+mlxsw_sp_acl_rulei_counter_alloc(struct mlxsw_sp *mlxsw_sp,
|
|
|
+ struct mlxsw_sp_acl_rule_info *rulei)
|
|
|
+{
|
|
|
+ int err;
|
|
|
+
|
|
|
+ err = mlxsw_sp_flow_counter_alloc(mlxsw_sp, &rulei->counter_index);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+ rulei->counter_valid = true;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+mlxsw_sp_acl_rulei_counter_free(struct mlxsw_sp *mlxsw_sp,
|
|
|
+ struct mlxsw_sp_acl_rule_info *rulei)
|
|
|
+{
|
|
|
+ rulei->counter_valid = false;
|
|
|
+ mlxsw_sp_flow_counter_free(mlxsw_sp, rulei->counter_index);
|
|
|
+}
|
|
|
+
|
|
|
struct mlxsw_sp_acl_rule_info *
|
|
|
mlxsw_sp_acl_rulei_create(struct mlxsw_sp_acl *acl)
|
|
|
{
|
|
@@ -373,6 +394,13 @@ int mlxsw_sp_acl_rulei_act_vlan(struct mlxsw_sp *mlxsw_sp,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+int mlxsw_sp_acl_rulei_act_count(struct mlxsw_sp *mlxsw_sp,
|
|
|
+ struct mlxsw_sp_acl_rule_info *rulei)
|
|
|
+{
|
|
|
+ return mlxsw_afa_block_append_counter(rulei->act_block,
|
|
|
+ rulei->counter_index);
|
|
|
+}
|
|
|
+
|
|
|
struct mlxsw_sp_acl_rule *
|
|
|
mlxsw_sp_acl_rule_create(struct mlxsw_sp *mlxsw_sp,
|
|
|
struct mlxsw_sp_acl_ruleset *ruleset,
|
|
@@ -396,8 +424,14 @@ mlxsw_sp_acl_rule_create(struct mlxsw_sp *mlxsw_sp,
|
|
|
err = PTR_ERR(rule->rulei);
|
|
|
goto err_rulei_create;
|
|
|
}
|
|
|
+
|
|
|
+ err = mlxsw_sp_acl_rulei_counter_alloc(mlxsw_sp, rule->rulei);
|
|
|
+ if (err)
|
|
|
+ goto err_counter_alloc;
|
|
|
return rule;
|
|
|
|
|
|
+err_counter_alloc:
|
|
|
+ mlxsw_sp_acl_rulei_destroy(rule->rulei);
|
|
|
err_rulei_create:
|
|
|
kfree(rule);
|
|
|
err_alloc:
|
|
@@ -410,6 +444,7 @@ void mlxsw_sp_acl_rule_destroy(struct mlxsw_sp *mlxsw_sp,
|
|
|
{
|
|
|
struct mlxsw_sp_acl_ruleset *ruleset = rule->ruleset;
|
|
|
|
|
|
+ mlxsw_sp_acl_rulei_counter_free(mlxsw_sp, rule->rulei);
|
|
|
mlxsw_sp_acl_rulei_destroy(rule->rulei);
|
|
|
kfree(rule);
|
|
|
mlxsw_sp_acl_ruleset_ref_dec(mlxsw_sp, ruleset);
|