FILE
tc_priv.h
File preview with syntax highlighting.
linux-6.19.14/drivers/net/ethernet/mellanox/mlx5/core/en/tc_priv.h
1/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ 2/* Copyright (c) 2021 Mellanox Technologies. */ 3 4#ifndef __MLX5_EN_TC_PRIV_H__ 5#define __MLX5_EN_TC_PRIV_H__ 6 7#include "en_tc.h" 8#include "en/tc/act/act.h" 9 10#define MLX5E_TC_FLOW_BASE (MLX5E_TC_FLAG_LAST_EXPORTED_BIT + 1) 11 12#define MLX5E_TC_MAX_SPLITS 1 13 14 15enum { 16 MLX5E_TC_FLOW_FLAG_INGRESS = MLX5E_TC_FLAG_INGRESS_BIT, 17 MLX5E_TC_FLOW_FLAG_EGRESS = MLX5E_TC_FLAG_EGRESS_BIT, 18 MLX5E_TC_FLOW_FLAG_ESWITCH = MLX5E_TC_FLAG_ESW_OFFLOAD_BIT, 19 MLX5E_TC_FLOW_FLAG_FT = MLX5E_TC_FLAG_FT_OFFLOAD_BIT, 20 MLX5E_TC_FLOW_FLAG_NIC = MLX5E_TC_FLAG_NIC_OFFLOAD_BIT, 21 MLX5E_TC_FLOW_FLAG_OFFLOADED = MLX5E_TC_FLOW_BASE, 22 MLX5E_TC_FLOW_FLAG_HAIRPIN = MLX5E_TC_FLOW_BASE + 1, 23 MLX5E_TC_FLOW_FLAG_HAIRPIN_RSS = MLX5E_TC_FLOW_BASE + 2, 24 MLX5E_TC_FLOW_FLAG_SLOW = MLX5E_TC_FLOW_BASE + 3, 25 MLX5E_TC_FLOW_FLAG_DUP = MLX5E_TC_FLOW_BASE + 4, 26 MLX5E_TC_FLOW_FLAG_NOT_READY = MLX5E_TC_FLOW_BASE + 5, 27 MLX5E_TC_FLOW_FLAG_DELETED = MLX5E_TC_FLOW_BASE + 6, 28 MLX5E_TC_FLOW_FLAG_L3_TO_L2_DECAP = MLX5E_TC_FLOW_BASE + 7, 29 MLX5E_TC_FLOW_FLAG_TUN_RX = MLX5E_TC_FLOW_BASE + 8, 30 MLX5E_TC_FLOW_FLAG_FAILED = MLX5E_TC_FLOW_BASE + 9, 31 MLX5E_TC_FLOW_FLAG_SAMPLE = MLX5E_TC_FLOW_BASE + 10, 32 MLX5E_TC_FLOW_FLAG_USE_ACT_STATS = MLX5E_TC_FLOW_BASE + 11, 33}; 34 35struct mlx5e_tc_flow_parse_attr { 36 const struct ip_tunnel_info *tun_info[MLX5_MAX_FLOW_FWD_VPORTS]; 37 struct mlx5e_mpls_info mpls_info[MLX5_MAX_FLOW_FWD_VPORTS]; 38 struct net_device *filter_dev; 39 struct mlx5_flow_spec spec; 40 struct pedit_headers_action hdrs[__PEDIT_CMD_MAX]; 41 struct mlx5e_tc_mod_hdr_acts mod_hdr_acts; 42 int mirred_ifindex[MLX5_MAX_FLOW_FWD_VPORTS]; 43 struct mlx5e_tc_act_parse_state parse_state; 44}; 45 46struct mlx5_fs_chains *mlx5e_nic_chains(struct mlx5e_tc_table *tc); 47 48/* Helper struct for accessing a struct containing list_head array. 49 * Containing struct 50 * |- Helper array 51 * [0] Helper item 0 52 * |- list_head item 0 53 * |- index (0) 54 * [1] Helper item 1 55 * |- list_head item 1 56 * |- index (1) 57 * To access the containing struct from one of the list_head items: 58 * 1. Get the helper item from the list_head item using 59 * helper item = 60 * container_of(list_head item, helper struct type, list_head field) 61 * 2. Get the contining struct from the helper item and its index in the array: 62 * containing struct = 63 * container_of(helper item, containing struct type, helper field[index]) 64 */ 65struct encap_flow_item { 66 struct mlx5e_encap_entry *e; /* attached encap instance */ 67 struct list_head list; 68 int index; 69}; 70 71struct encap_route_flow_item { 72 struct mlx5e_route_entry *r; /* attached route instance */ 73 int index; 74}; 75 76struct mlx5e_tc_flow { 77 struct rhash_head node; 78 struct mlx5e_priv *priv; 79 u64 cookie; 80 unsigned long flags; 81 struct mlx5_flow_handle *rule[MLX5E_TC_MAX_SPLITS + 1]; 82 83 /* flows sharing the same reformat object - currently mpls decap */ 84 struct list_head l3_to_l2_reformat; 85 struct mlx5e_decap_entry *decap_reformat; 86 87 /* flows sharing same route entry */ 88 struct list_head decap_routes; 89 struct mlx5e_route_entry *decap_route; 90 struct encap_route_flow_item encap_routes[MLX5_MAX_FLOW_FWD_VPORTS]; 91 92 /* Flow can be associated with multiple encap IDs. 93 * The number of encaps is bounded by the number of supported 94 * destinations. 95 */ 96 struct encap_flow_item encaps[MLX5_MAX_FLOW_FWD_VPORTS]; 97 struct mlx5e_hairpin_entry *hpe; /* attached hairpin instance */ 98 struct list_head hairpin; /* flows sharing the same hairpin */ 99 struct list_head peer[MLX5_MAX_PORTS]; /* flows with peer flow */ 100 struct list_head unready; /* flows not ready to be offloaded (e.g 101 * due to missing route) 102 */ 103 struct list_head peer_flows; /* flows on peer */ 104 struct net_device *orig_dev; /* netdev adding flow first */ 105 int tmp_entry_index; 106 struct list_head tmp_list; /* temporary flow list used by neigh update */ 107 refcount_t refcnt; 108 struct rcu_head rcu_head; 109 struct completion init_done; 110 struct completion del_hw_done; 111 struct mlx5_flow_attr *attr; 112 struct mlx5_flow_attr *extra_split_attr; 113 struct list_head attrs; 114 u32 chain_mapping; 115}; 116 117struct mlx5_flow_handle * 118mlx5e_tc_rule_offload(struct mlx5e_priv *priv, 119 struct mlx5_flow_spec *spec, 120 struct mlx5_flow_attr *attr); 121 122void 123mlx5e_tc_rule_unoffload(struct mlx5e_priv *priv, 124 struct mlx5_flow_handle *rule, 125 struct mlx5_flow_attr *attr); 126 127u8 mlx5e_tc_get_ip_version(struct mlx5_flow_spec *spec, bool outer); 128 129struct mlx5_flow_handle * 130mlx5e_tc_offload_fdb_rules(struct mlx5_eswitch *esw, 131 struct mlx5e_tc_flow *flow, 132 struct mlx5_flow_spec *spec, 133 struct mlx5_flow_attr *attr); 134 135struct mlx5_flow_attr * 136mlx5e_tc_get_encap_attr(struct mlx5e_tc_flow *flow); 137 138void mlx5e_tc_unoffload_flow_post_acts(struct mlx5e_tc_flow *flow); 139int mlx5e_tc_offload_flow_post_acts(struct mlx5e_tc_flow *flow); 140 141bool mlx5e_is_eswitch_flow(struct mlx5e_tc_flow *flow); 142bool mlx5e_is_ft_flow(struct mlx5e_tc_flow *flow); 143bool mlx5e_is_offloaded_flow(struct mlx5e_tc_flow *flow); 144int mlx5e_get_flow_namespace(struct mlx5e_tc_flow *flow); 145bool mlx5e_same_hw_devs(struct mlx5e_priv *priv, struct mlx5e_priv *peer_priv); 146 147static inline void __flow_flag_set(struct mlx5e_tc_flow *flow, unsigned long flag) 148{ 149 /* Complete all memory stores before setting bit. */ 150 smp_mb__before_atomic(); 151 set_bit(flag, &flow->flags); 152} 153 154#define flow_flag_set(flow, flag) __flow_flag_set(flow, MLX5E_TC_FLOW_FLAG_##flag) 155 156static inline bool __flow_flag_test_and_set(struct mlx5e_tc_flow *flow, 157 unsigned long flag) 158{ 159 /* test_and_set_bit() provides all necessary barriers */ 160 return test_and_set_bit(flag, &flow->flags); 161} 162 163#define flow_flag_test_and_set(flow, flag) \ 164 __flow_flag_test_and_set(flow, \ 165 MLX5E_TC_FLOW_FLAG_##flag) 166 167static inline void __flow_flag_clear(struct mlx5e_tc_flow *flow, unsigned long flag) 168{ 169 /* Complete all memory stores before clearing bit. */ 170 smp_mb__before_atomic(); 171 clear_bit(flag, &flow->flags); 172} 173 174#define flow_flag_clear(flow, flag) __flow_flag_clear(flow, \ 175 MLX5E_TC_FLOW_FLAG_##flag) 176 177static inline bool __flow_flag_test(struct mlx5e_tc_flow *flow, unsigned long flag) 178{ 179 bool ret = test_bit(flag, &flow->flags); 180 181 /* Read fields of flow structure only after checking flags. */ 182 smp_mb__after_atomic(); 183 return ret; 184} 185 186#define flow_flag_test(flow, flag) __flow_flag_test(flow, \ 187 MLX5E_TC_FLOW_FLAG_##flag) 188 189void mlx5e_tc_unoffload_from_slow_path(struct mlx5_eswitch *esw, 190 struct mlx5e_tc_flow *flow); 191struct mlx5_flow_handle * 192mlx5e_tc_offload_to_slow_path(struct mlx5_eswitch *esw, 193 struct mlx5e_tc_flow *flow, 194 struct mlx5_flow_spec *spec); 195 196void mlx5e_tc_unoffload_fdb_rules(struct mlx5_eswitch *esw, 197 struct mlx5e_tc_flow *flow, 198 struct mlx5_flow_attr *attr); 199 200struct mlx5e_tc_flow *mlx5e_flow_get(struct mlx5e_tc_flow *flow); 201void mlx5e_flow_put(struct mlx5e_priv *priv, struct mlx5e_tc_flow *flow); 202 203struct mlx5_fc *mlx5e_tc_get_counter(struct mlx5e_tc_flow *flow); 204 205struct mlx5e_tc_int_port_priv * 206mlx5e_get_int_port_priv(struct mlx5e_priv *priv); 207 208struct mlx5e_flow_meters *mlx5e_get_flow_meters(struct mlx5_core_dev *dev); 209 210void *mlx5e_get_match_headers_value(u32 flags, struct mlx5_flow_spec *spec); 211void *mlx5e_get_match_headers_criteria(u32 flags, struct mlx5_flow_spec *spec); 212 213#endif /* __MLX5_EN_TC_PRIV_H__ */
~/
Read-only file preview.