1 | /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ |
2 | /* Copyright (c) 2018 Mellanox Technologies. */ |
3 | |
4 | #ifndef __MLX5_EN_TC_CT_H__ |
5 | #define __MLX5_EN_TC_CT_H__ |
6 | |
7 | #include <net/pkt_cls.h> |
8 | #include <linux/mlx5/fs.h> |
9 | #include <net/tc_act/tc_ct.h> |
10 | |
11 | #include "en.h" |
12 | |
13 | struct mlx5_flow_attr; |
14 | struct mlx5e_tc_mod_hdr_acts; |
15 | struct mlx5_rep_uplink_priv; |
16 | struct mlx5e_tc_flow; |
17 | struct mlx5e_priv; |
18 | |
19 | struct mlx5_fs_chains; |
20 | struct mlx5_tc_ct_priv; |
21 | struct mlx5_ct_flow; |
22 | |
23 | struct nf_flowtable; |
24 | |
25 | struct mlx5_ct_attr { |
26 | u16 zone; |
27 | u16 ct_action; |
28 | struct nf_flowtable *nf_ft; |
29 | u32 ct_labels_id; |
30 | u32 act_miss_mapping; |
31 | u64 act_miss_cookie; |
32 | bool offloaded; |
33 | struct mlx5_ct_ft *ft; |
34 | }; |
35 | |
36 | #define zone_to_reg_ct {\ |
37 | .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_2,\ |
38 | .moffset = 0,\ |
39 | .mlen = 16,\ |
40 | .soffset = MLX5_BYTE_OFF(fte_match_param,\ |
41 | misc_parameters_2.metadata_reg_c_2),\ |
42 | } |
43 | |
44 | #define ctstate_to_reg_ct {\ |
45 | .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_2,\ |
46 | .moffset = 16,\ |
47 | .mlen = 16,\ |
48 | .soffset = MLX5_BYTE_OFF(fte_match_param,\ |
49 | misc_parameters_2.metadata_reg_c_2),\ |
50 | } |
51 | |
52 | #define mark_to_reg_ct {\ |
53 | .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_3,\ |
54 | .moffset = 0,\ |
55 | .mlen = 32,\ |
56 | .soffset = MLX5_BYTE_OFF(fte_match_param,\ |
57 | misc_parameters_2.metadata_reg_c_3),\ |
58 | } |
59 | |
60 | #define labels_to_reg_ct {\ |
61 | .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_4,\ |
62 | .moffset = 0,\ |
63 | .mlen = 32,\ |
64 | .soffset = MLX5_BYTE_OFF(fte_match_param,\ |
65 | misc_parameters_2.metadata_reg_c_4),\ |
66 | } |
67 | |
68 | /* 8 LSB of metadata C5 are reserved for packet color */ |
69 | #define fteid_to_reg_ct {\ |
70 | .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_5,\ |
71 | .moffset = 8,\ |
72 | .mlen = 24,\ |
73 | .soffset = MLX5_BYTE_OFF(fte_match_param,\ |
74 | misc_parameters_2.metadata_reg_c_5),\ |
75 | } |
76 | |
77 | #define zone_restore_to_reg_ct {\ |
78 | .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_1,\ |
79 | .moffset = 0,\ |
80 | .mlen = ESW_ZONE_ID_BITS,\ |
81 | .soffset = MLX5_BYTE_OFF(fte_match_param,\ |
82 | misc_parameters_2.metadata_reg_c_1),\ |
83 | } |
84 | |
85 | #define nic_zone_restore_to_reg_ct {\ |
86 | .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_B,\ |
87 | .moffset = 16,\ |
88 | .mlen = ESW_ZONE_ID_BITS,\ |
89 | } |
90 | |
91 | #define MLX5_CT_ZONE_BITS MLX5_REG_MAPPING_MBITS(ZONE_TO_REG) |
92 | #define MLX5_CT_ZONE_MASK MLX5_REG_MAPPING_MASK(ZONE_TO_REG) |
93 | |
94 | #if IS_ENABLED(CONFIG_MLX5_TC_CT) |
95 | |
96 | struct mlx5_tc_ct_priv * |
97 | mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains, |
98 | struct mod_hdr_tbl *mod_hdr, |
99 | enum mlx5_flow_namespace_type ns_type, |
100 | struct mlx5e_post_act *post_act); |
101 | void |
102 | mlx5_tc_ct_clean(struct mlx5_tc_ct_priv *ct_priv); |
103 | |
104 | void |
105 | mlx5_tc_ct_match_del(struct mlx5_tc_ct_priv *priv, struct mlx5_ct_attr *ct_attr); |
106 | |
107 | int |
108 | mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv *priv, |
109 | struct mlx5_flow_spec *spec, |
110 | struct flow_cls_offload *f, |
111 | struct mlx5_ct_attr *ct_attr, |
112 | struct netlink_ext_ack *extack); |
113 | int mlx5_tc_ct_add_no_trk_match(struct mlx5_flow_spec *spec); |
114 | int |
115 | mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv, |
116 | struct mlx5_flow_attr *attr, |
117 | const struct flow_action_entry *act, |
118 | struct netlink_ext_ack *extack); |
119 | |
120 | int |
121 | mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *priv, struct mlx5_flow_attr *attr); |
122 | |
123 | void |
124 | mlx5_tc_ct_delete_flow(struct mlx5_tc_ct_priv *priv, |
125 | struct mlx5_flow_attr *attr); |
126 | |
127 | bool |
128 | mlx5e_tc_ct_restore_flow(struct mlx5_tc_ct_priv *ct_priv, |
129 | struct sk_buff *skb, u8 zone_restore_id); |
130 | |
131 | #else /* CONFIG_MLX5_TC_CT */ |
132 | |
133 | static inline struct mlx5_tc_ct_priv * |
134 | mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains, |
135 | struct mod_hdr_tbl *mod_hdr, |
136 | enum mlx5_flow_namespace_type ns_type, |
137 | struct mlx5e_post_act *post_act) |
138 | { |
139 | return NULL; |
140 | } |
141 | |
142 | static inline void |
143 | mlx5_tc_ct_clean(struct mlx5_tc_ct_priv *ct_priv) |
144 | { |
145 | } |
146 | |
147 | static inline void |
148 | mlx5_tc_ct_match_del(struct mlx5_tc_ct_priv *priv, struct mlx5_ct_attr *ct_attr) {} |
149 | |
150 | static inline int |
151 | mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv *priv, |
152 | struct mlx5_flow_spec *spec, |
153 | struct flow_cls_offload *f, |
154 | struct mlx5_ct_attr *ct_attr, |
155 | struct netlink_ext_ack *extack) |
156 | { |
157 | struct flow_rule *rule = flow_cls_offload_flow_rule(f); |
158 | |
159 | if (!flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_CT)) |
160 | return 0; |
161 | |
162 | NL_SET_ERR_MSG_MOD(extack, "mlx5 tc ct offload isn't enabled." ); |
163 | return -EOPNOTSUPP; |
164 | } |
165 | |
166 | static inline int |
167 | mlx5_tc_ct_add_no_trk_match(struct mlx5_flow_spec *spec) |
168 | { |
169 | return 0; |
170 | } |
171 | |
172 | static inline int |
173 | mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv, |
174 | struct mlx5_flow_attr *attr, |
175 | const struct flow_action_entry *act, |
176 | struct netlink_ext_ack *extack) |
177 | { |
178 | NL_SET_ERR_MSG_MOD(extack, "mlx5 tc ct offload isn't enabled." ); |
179 | return -EOPNOTSUPP; |
180 | } |
181 | |
182 | static inline int |
183 | mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *priv, |
184 | struct mlx5_flow_attr *attr) |
185 | { |
186 | return -EOPNOTSUPP; |
187 | } |
188 | |
189 | static inline void |
190 | mlx5_tc_ct_delete_flow(struct mlx5_tc_ct_priv *priv, |
191 | struct mlx5_flow_attr *attr) |
192 | { |
193 | } |
194 | |
195 | static inline bool |
196 | mlx5e_tc_ct_restore_flow(struct mlx5_tc_ct_priv *ct_priv, |
197 | struct sk_buff *skb, u8 zone_restore_id) |
198 | { |
199 | if (!zone_restore_id) |
200 | return true; |
201 | |
202 | return false; |
203 | } |
204 | |
205 | #endif /* !IS_ENABLED(CONFIG_MLX5_TC_CT) */ |
206 | #endif /* __MLX5_EN_TC_CT_H__ */ |
207 | |