1 | // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB |
2 | /* Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. */ |
3 | |
4 | #include "en_tc.h" |
5 | #include "en/tc_ct.h" |
6 | #include "en/tc/ct_fs.h" |
7 | |
8 | #define ct_dbg(fmt, args...)\ |
9 | netdev_dbg(fs->netdev, "ct_fs_dmfs debug: " fmt "\n", ##args) |
10 | |
11 | struct mlx5_ct_fs_dmfs_rule { |
12 | struct mlx5_ct_fs_rule fs_rule; |
13 | struct mlx5_flow_handle *rule; |
14 | struct mlx5_flow_attr *attr; |
15 | }; |
16 | |
17 | static int |
18 | mlx5_ct_fs_dmfs_init(struct mlx5_ct_fs *fs, struct mlx5_flow_table *ct, |
19 | struct mlx5_flow_table *ct_nat, struct mlx5_flow_table *post_ct) |
20 | { |
21 | return 0; |
22 | } |
23 | |
24 | static void |
25 | mlx5_ct_fs_dmfs_destroy(struct mlx5_ct_fs *fs) |
26 | { |
27 | } |
28 | |
29 | static struct mlx5_ct_fs_rule * |
30 | mlx5_ct_fs_dmfs_ct_rule_add(struct mlx5_ct_fs *fs, struct mlx5_flow_spec *spec, |
31 | struct mlx5_flow_attr *attr, struct flow_rule *flow_rule) |
32 | { |
33 | struct mlx5e_priv *priv = netdev_priv(dev: fs->netdev); |
34 | struct mlx5_ct_fs_dmfs_rule *dmfs_rule; |
35 | int err; |
36 | |
37 | dmfs_rule = kzalloc(size: sizeof(*dmfs_rule), GFP_KERNEL); |
38 | if (!dmfs_rule) |
39 | return ERR_PTR(error: -ENOMEM); |
40 | |
41 | dmfs_rule->rule = mlx5_tc_rule_insert(priv, spec, attr); |
42 | if (IS_ERR(ptr: dmfs_rule->rule)) { |
43 | err = PTR_ERR(ptr: dmfs_rule->rule); |
44 | ct_dbg("Failed to add ct entry fs rule" ); |
45 | goto err_insert; |
46 | } |
47 | |
48 | dmfs_rule->attr = attr; |
49 | |
50 | return &dmfs_rule->fs_rule; |
51 | |
52 | err_insert: |
53 | kfree(objp: dmfs_rule); |
54 | return ERR_PTR(error: err); |
55 | } |
56 | |
57 | static void |
58 | mlx5_ct_fs_dmfs_ct_rule_del(struct mlx5_ct_fs *fs, struct mlx5_ct_fs_rule *fs_rule) |
59 | { |
60 | struct mlx5_ct_fs_dmfs_rule *dmfs_rule = container_of(fs_rule, |
61 | struct mlx5_ct_fs_dmfs_rule, |
62 | fs_rule); |
63 | |
64 | mlx5_tc_rule_delete(priv: netdev_priv(dev: fs->netdev), rule: dmfs_rule->rule, attr: dmfs_rule->attr); |
65 | kfree(objp: dmfs_rule); |
66 | } |
67 | |
68 | static struct mlx5_ct_fs_ops dmfs_ops = { |
69 | .ct_rule_add = mlx5_ct_fs_dmfs_ct_rule_add, |
70 | .ct_rule_del = mlx5_ct_fs_dmfs_ct_rule_del, |
71 | |
72 | .init = mlx5_ct_fs_dmfs_init, |
73 | .destroy = mlx5_ct_fs_dmfs_destroy, |
74 | }; |
75 | |
76 | struct mlx5_ct_fs_ops *mlx5_ct_fs_dmfs_ops_get(void) |
77 | { |
78 | return &dmfs_ops; |
79 | } |
80 | |