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 mlx5_ct_flow *ct_flow; 29 struct nf_flowtable *nf_ft; 30 u32 ct_labels_id; 31 }; 32 33 #define zone_to_reg_ct {\ 34 .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_2,\ 35 .moffset = 0,\ 36 .mlen = 16,\ 37 .soffset = MLX5_BYTE_OFF(fte_match_param,\ 38 misc_parameters_2.metadata_reg_c_2),\ 39 } 40 41 #define ctstate_to_reg_ct {\ 42 .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_2,\ 43 .moffset = 16,\ 44 .mlen = 16,\ 45 .soffset = MLX5_BYTE_OFF(fte_match_param,\ 46 misc_parameters_2.metadata_reg_c_2),\ 47 } 48 49 #define mark_to_reg_ct {\ 50 .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_3,\ 51 .moffset = 0,\ 52 .mlen = 32,\ 53 .soffset = MLX5_BYTE_OFF(fte_match_param,\ 54 misc_parameters_2.metadata_reg_c_3),\ 55 } 56 57 #define labels_to_reg_ct {\ 58 .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_4,\ 59 .moffset = 0,\ 60 .mlen = 32,\ 61 .soffset = MLX5_BYTE_OFF(fte_match_param,\ 62 misc_parameters_2.metadata_reg_c_4),\ 63 } 64 65 #define fteid_to_reg_ct {\ 66 .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_5,\ 67 .moffset = 0,\ 68 .mlen = 32,\ 69 .soffset = MLX5_BYTE_OFF(fte_match_param,\ 70 misc_parameters_2.metadata_reg_c_5),\ 71 } 72 73 #define zone_restore_to_reg_ct {\ 74 .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_C_1,\ 75 .moffset = 0,\ 76 .mlen = ESW_ZONE_ID_BITS,\ 77 .soffset = MLX5_BYTE_OFF(fte_match_param,\ 78 misc_parameters_2.metadata_reg_c_1),\ 79 } 80 81 #define nic_zone_restore_to_reg_ct {\ 82 .mfield = MLX5_ACTION_IN_FIELD_METADATA_REG_B,\ 83 .moffset = 16,\ 84 .mlen = ESW_ZONE_ID_BITS,\ 85 } 86 87 #define REG_MAPPING_MLEN(reg) (mlx5e_tc_attr_to_reg_mappings[reg].mlen) 88 #define REG_MAPPING_MOFFSET(reg) (mlx5e_tc_attr_to_reg_mappings[reg].moffset) 89 #define MLX5_CT_ZONE_BITS (mlx5e_tc_attr_to_reg_mappings[ZONE_TO_REG].mlen) 90 #define MLX5_CT_ZONE_MASK GENMASK(MLX5_CT_ZONE_BITS - 1, 0) 91 92 #if IS_ENABLED(CONFIG_MLX5_TC_CT) 93 94 struct mlx5_tc_ct_priv * 95 mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains, 96 struct mod_hdr_tbl *mod_hdr, 97 enum mlx5_flow_namespace_type ns_type, 98 struct mlx5e_post_act *post_act); 99 void 100 mlx5_tc_ct_clean(struct mlx5_tc_ct_priv *ct_priv); 101 102 void 103 mlx5_tc_ct_match_del(struct mlx5_tc_ct_priv *priv, struct mlx5_ct_attr *ct_attr); 104 105 int 106 mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv *priv, 107 struct mlx5_flow_spec *spec, 108 struct flow_cls_offload *f, 109 struct mlx5_ct_attr *ct_attr, 110 struct netlink_ext_ack *extack); 111 int mlx5_tc_ct_add_no_trk_match(struct mlx5_flow_spec *spec); 112 int 113 mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv, 114 struct mlx5_flow_attr *attr, 115 struct mlx5e_tc_mod_hdr_acts *mod_acts, 116 const struct flow_action_entry *act, 117 struct netlink_ext_ack *extack); 118 119 struct mlx5_flow_handle * 120 mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *priv, 121 struct mlx5_flow_spec *spec, 122 struct mlx5_flow_attr *attr, 123 struct mlx5e_tc_mod_hdr_acts *mod_hdr_acts); 124 void 125 mlx5_tc_ct_delete_flow(struct mlx5_tc_ct_priv *priv, 126 struct mlx5_flow_attr *attr); 127 128 bool 129 mlx5e_tc_ct_restore_flow(struct mlx5_tc_ct_priv *ct_priv, 130 struct sk_buff *skb, u8 zone_restore_id); 131 132 #else /* CONFIG_MLX5_TC_CT */ 133 134 static inline struct mlx5_tc_ct_priv * 135 mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains, 136 struct mod_hdr_tbl *mod_hdr, 137 enum mlx5_flow_namespace_type ns_type, 138 struct mlx5e_post_act *post_act) 139 { 140 return NULL; 141 } 142 143 static inline void 144 mlx5_tc_ct_clean(struct mlx5_tc_ct_priv *ct_priv) 145 { 146 } 147 148 static inline void 149 mlx5_tc_ct_match_del(struct mlx5_tc_ct_priv *priv, struct mlx5_ct_attr *ct_attr) {} 150 151 static inline int 152 mlx5_tc_ct_match_add(struct mlx5_tc_ct_priv *priv, 153 struct mlx5_flow_spec *spec, 154 struct flow_cls_offload *f, 155 struct mlx5_ct_attr *ct_attr, 156 struct netlink_ext_ack *extack) 157 { 158 struct flow_rule *rule = flow_cls_offload_flow_rule(f); 159 160 if (!flow_rule_match_key(rule, FLOW_DISSECTOR_KEY_CT)) 161 return 0; 162 163 NL_SET_ERR_MSG_MOD(extack, "mlx5 tc ct offload isn't enabled."); 164 return -EOPNOTSUPP; 165 } 166 167 static inline int 168 mlx5_tc_ct_add_no_trk_match(struct mlx5_flow_spec *spec) 169 { 170 return 0; 171 } 172 173 static inline int 174 mlx5_tc_ct_parse_action(struct mlx5_tc_ct_priv *priv, 175 struct mlx5_flow_attr *attr, 176 struct mlx5e_tc_mod_hdr_acts *mod_acts, 177 const struct flow_action_entry *act, 178 struct netlink_ext_ack *extack) 179 { 180 NL_SET_ERR_MSG_MOD(extack, "mlx5 tc ct offload isn't enabled."); 181 return -EOPNOTSUPP; 182 } 183 184 static inline struct mlx5_flow_handle * 185 mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *priv, 186 struct mlx5_flow_spec *spec, 187 struct mlx5_flow_attr *attr, 188 struct mlx5e_tc_mod_hdr_acts *mod_hdr_acts) 189 { 190 return ERR_PTR(-EOPNOTSUPP); 191 } 192 193 static inline void 194 mlx5_tc_ct_delete_flow(struct mlx5_tc_ct_priv *priv, 195 struct mlx5_flow_attr *attr) 196 { 197 } 198 199 static inline bool 200 mlx5e_tc_ct_restore_flow(struct mlx5_tc_ct_priv *ct_priv, 201 struct sk_buff *skb, u8 zone_restore_id) 202 { 203 if (!zone_restore_id) 204 return true; 205 206 return false; 207 } 208 209 #endif /* !IS_ENABLED(CONFIG_MLX5_TC_CT) */ 210 #endif /* __MLX5_EN_TC_CT_H__ */ 211