|
@@ -221,6 +221,41 @@ static void mlxsw_sp_acl_ruleset_ref_dec(struct mlxsw_sp *mlxsw_sp,
|
|
|
mlxsw_sp_acl_ruleset_destroy(mlxsw_sp, ruleset);
|
|
|
}
|
|
|
|
|
|
+static struct mlxsw_sp_acl_ruleset *
|
|
|
+__mlxsw_sp_acl_ruleset_lookup(struct mlxsw_sp_acl *acl, struct net_device *dev,
|
|
|
+ bool ingress, u32 chain_index,
|
|
|
+ const struct mlxsw_sp_acl_profile_ops *ops)
|
|
|
+{
|
|
|
+ struct mlxsw_sp_acl_ruleset_ht_key ht_key;
|
|
|
+
|
|
|
+ memset(&ht_key, 0, sizeof(ht_key));
|
|
|
+ ht_key.dev = dev;
|
|
|
+ ht_key.ingress = ingress;
|
|
|
+ ht_key.chain_index = chain_index;
|
|
|
+ ht_key.ops = ops;
|
|
|
+ return rhashtable_lookup_fast(&acl->ruleset_ht, &ht_key,
|
|
|
+ mlxsw_sp_acl_ruleset_ht_params);
|
|
|
+}
|
|
|
+
|
|
|
+struct mlxsw_sp_acl_ruleset *
|
|
|
+mlxsw_sp_acl_ruleset_lookup(struct mlxsw_sp *mlxsw_sp, struct net_device *dev,
|
|
|
+ bool ingress, u32 chain_index,
|
|
|
+ enum mlxsw_sp_acl_profile profile)
|
|
|
+{
|
|
|
+ const struct mlxsw_sp_acl_profile_ops *ops;
|
|
|
+ struct mlxsw_sp_acl *acl = mlxsw_sp->acl;
|
|
|
+ struct mlxsw_sp_acl_ruleset *ruleset;
|
|
|
+
|
|
|
+ ops = acl->ops->profile_ops(mlxsw_sp, profile);
|
|
|
+ if (!ops)
|
|
|
+ return ERR_PTR(-EINVAL);
|
|
|
+ ruleset = __mlxsw_sp_acl_ruleset_lookup(acl, dev, ingress,
|
|
|
+ chain_index, ops);
|
|
|
+ if (!ruleset)
|
|
|
+ return ERR_PTR(-ENOENT);
|
|
|
+ return ruleset;
|
|
|
+}
|
|
|
+
|
|
|
struct mlxsw_sp_acl_ruleset *
|
|
|
mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp, struct net_device *dev,
|
|
|
bool ingress, u32 chain_index,
|
|
@@ -228,7 +263,6 @@ mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp, struct net_device *dev,
|
|
|
{
|
|
|
const struct mlxsw_sp_acl_profile_ops *ops;
|
|
|
struct mlxsw_sp_acl *acl = mlxsw_sp->acl;
|
|
|
- struct mlxsw_sp_acl_ruleset_ht_key ht_key;
|
|
|
struct mlxsw_sp_acl_ruleset *ruleset;
|
|
|
int err;
|
|
|
|
|
@@ -236,13 +270,8 @@ mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp, struct net_device *dev,
|
|
|
if (!ops)
|
|
|
return ERR_PTR(-EINVAL);
|
|
|
|
|
|
- memset(&ht_key, 0, sizeof(ht_key));
|
|
|
- ht_key.dev = dev;
|
|
|
- ht_key.ingress = ingress;
|
|
|
- ht_key.chain_index = chain_index;
|
|
|
- ht_key.ops = ops;
|
|
|
- ruleset = rhashtable_lookup_fast(&acl->ruleset_ht, &ht_key,
|
|
|
- mlxsw_sp_acl_ruleset_ht_params);
|
|
|
+ ruleset = __mlxsw_sp_acl_ruleset_lookup(acl, dev, ingress,
|
|
|
+ chain_index, ops);
|
|
|
if (ruleset) {
|
|
|
mlxsw_sp_acl_ruleset_ref_inc(ruleset);
|
|
|
return ruleset;
|