1fe6d86b3SSaeed Mahameed /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
2fe6d86b3SSaeed Mahameed /* Copyright (c) 2018 Mellanox Technologies. */
3fe6d86b3SSaeed Mahameed 
4fe6d86b3SSaeed Mahameed #ifndef __MLX5E_FLOW_STEER_H__
5fe6d86b3SSaeed Mahameed #define __MLX5E_FLOW_STEER_H__
6fe6d86b3SSaeed Mahameed 
7b2fdf3d0SPaul Blakey #include "mod_hdr.h"
8371cf74eSMaor Gottlieb #include "lib/fs_ttc.h"
9b2fdf3d0SPaul Blakey 
10*f0da4daaSChris Mi struct mlx5e_post_act;
11*f0da4daaSChris Mi 
1244f68ae0SSaeed Mahameed enum {
1344f68ae0SSaeed Mahameed 	MLX5E_TC_FT_LEVEL = 0,
1444f68ae0SSaeed Mahameed 	MLX5E_TC_TTC_FT_LEVEL,
1544f68ae0SSaeed Mahameed };
1644f68ae0SSaeed Mahameed 
1744f68ae0SSaeed Mahameed struct mlx5e_tc_table {
186a064674SAriel Levkovich 	/* Protects the dynamic assignment of the t parameter
196a064674SAriel Levkovich 	 * which is the nic tc root table.
206a064674SAriel Levkovich 	 */
21b6fac0b4SVlad Buslov 	struct mutex			t_lock;
2244f68ae0SSaeed Mahameed 	struct mlx5_flow_table		*t;
236a064674SAriel Levkovich 	struct mlx5_fs_chains           *chains;
24*f0da4daaSChris Mi 	struct mlx5e_post_act		*post_act;
2544f68ae0SSaeed Mahameed 
2644f68ae0SSaeed Mahameed 	struct rhashtable               ht;
2744f68ae0SSaeed Mahameed 
28dd58edc3SVlad Buslov 	struct mod_hdr_tbl mod_hdr;
29b32accdaSVlad Buslov 	struct mutex hairpin_tbl_lock; /* protects hairpin_tbl */
3044f68ae0SSaeed Mahameed 	DECLARE_HASHTABLE(hairpin_tbl, 8);
314d8fcf21SAlaa Hleihel 
324d8fcf21SAlaa Hleihel 	struct notifier_block     netdevice_nb;
33d48834f9SJiri Pirko 	struct netdev_net_notifier	netdevice_nn;
34aedd133dSAriel Levkovich 
35aedd133dSAriel Levkovich 	struct mlx5_tc_ct_priv         *ct;
36c9355682SChris Mi 	struct mapping_ctx             *mapping;
3744f68ae0SSaeed Mahameed };
3844f68ae0SSaeed Mahameed 
39ec080045SSaeed Mahameed struct mlx5e_flow_table {
40ec080045SSaeed Mahameed 	int num_groups;
41ec080045SSaeed Mahameed 	struct mlx5_flow_table *t;
42ec080045SSaeed Mahameed 	struct mlx5_flow_group **g;
43ec080045SSaeed Mahameed };
44ec080045SSaeed Mahameed 
4544f68ae0SSaeed Mahameed struct mlx5e_l2_rule {
4644f68ae0SSaeed Mahameed 	u8  addr[ETH_ALEN + 2];
4744f68ae0SSaeed Mahameed 	struct mlx5_flow_handle *rule;
4844f68ae0SSaeed Mahameed };
4944f68ae0SSaeed Mahameed 
5044f68ae0SSaeed Mahameed #define MLX5E_L2_ADDR_HASH_SIZE BIT(BITS_PER_BYTE)
5144f68ae0SSaeed Mahameed 
521c46d740SAya Levin struct mlx5e_promisc_table {
531c46d740SAya Levin 	struct mlx5e_flow_table	ft;
541c46d740SAya Levin 	struct mlx5_flow_handle	*rule;
551c46d740SAya Levin };
561c46d740SAya Levin 
576783f0a2SVu Pham /* Forward declaration and APIs to get private fields of vlan_table */
586783f0a2SVu Pham struct mlx5e_vlan_table;
596783f0a2SVu Pham unsigned long *mlx5e_vlan_get_active_svlans(struct mlx5e_vlan_table *vlan);
606783f0a2SVu Pham struct mlx5_flow_table *mlx5e_vlan_get_flowtable(struct mlx5e_vlan_table *vlan);
6144f68ae0SSaeed Mahameed 
6244f68ae0SSaeed Mahameed struct mlx5e_l2_table {
6344f68ae0SSaeed Mahameed 	struct mlx5e_flow_table    ft;
6444f68ae0SSaeed Mahameed 	struct hlist_head          netdev_uc[MLX5E_L2_ADDR_HASH_SIZE];
6544f68ae0SSaeed Mahameed 	struct hlist_head          netdev_mc[MLX5E_L2_ADDR_HASH_SIZE];
6644f68ae0SSaeed Mahameed 	struct mlx5e_l2_rule	   broadcast;
6744f68ae0SSaeed Mahameed 	struct mlx5e_l2_rule	   allmulti;
68ceef1b66SAya Levin 	struct mlx5_flow_handle    *trap_rule;
6944f68ae0SSaeed Mahameed 	bool                       broadcast_enabled;
7044f68ae0SSaeed Mahameed 	bool                       allmulti_enabled;
7144f68ae0SSaeed Mahameed 	bool                       promisc_enabled;
7244f68ae0SSaeed Mahameed };
7344f68ae0SSaeed Mahameed 
74d443c6f6SMaor Gottlieb #define MLX5E_NUM_INDIR_TIRS (MLX5_NUM_TT - 1)
75d443c6f6SMaor Gottlieb 
76d930ac79SAya Levin #define MLX5_HASH_IP		(MLX5_HASH_FIELD_SEL_SRC_IP   |\
77d930ac79SAya Levin 				 MLX5_HASH_FIELD_SEL_DST_IP)
78d930ac79SAya Levin #define MLX5_HASH_IP_L4PORTS	(MLX5_HASH_FIELD_SEL_SRC_IP   |\
79d930ac79SAya Levin 				 MLX5_HASH_FIELD_SEL_DST_IP   |\
80d930ac79SAya Levin 				 MLX5_HASH_FIELD_SEL_L4_SPORT |\
81d930ac79SAya Levin 				 MLX5_HASH_FIELD_SEL_L4_DPORT)
82d930ac79SAya Levin #define MLX5_HASH_IP_IPSEC_SPI	(MLX5_HASH_FIELD_SEL_SRC_IP   |\
83d930ac79SAya Levin 				 MLX5_HASH_FIELD_SEL_DST_IP   |\
84d930ac79SAya Levin 				 MLX5_HASH_FIELD_SEL_IPSEC_SPI)
85d930ac79SAya Levin 
8644f68ae0SSaeed Mahameed /* NIC prio FTS */
8744f68ae0SSaeed Mahameed enum {
881c46d740SAya Levin 	MLX5E_PROMISC_FT_LEVEL,
891c46d740SAya Levin 	MLX5E_VLAN_FT_LEVEL,
9044f68ae0SSaeed Mahameed 	MLX5E_L2_FT_LEVEL,
9144f68ae0SSaeed Mahameed 	MLX5E_TTC_FT_LEVEL,
9244f68ae0SSaeed Mahameed 	MLX5E_INNER_TTC_FT_LEVEL,
931c80bd68SAya Levin 	MLX5E_FS_TT_UDP_FT_LEVEL = MLX5E_INNER_TTC_FT_LEVEL + 1,
940f575c20SAya Levin 	MLX5E_FS_TT_ANY_FT_LEVEL = MLX5E_INNER_TTC_FT_LEVEL + 1,
95c062d52aSBoris Pismenny #ifdef CONFIG_MLX5_EN_TLS
96c809cf66SAya Levin 	MLX5E_ACCEL_FS_TCP_FT_LEVEL = MLX5E_INNER_TTC_FT_LEVEL + 1,
97c062d52aSBoris Pismenny #endif
9844f68ae0SSaeed Mahameed #ifdef CONFIG_MLX5_EN_ARFS
99c809cf66SAya Levin 	MLX5E_ARFS_FT_LEVEL = MLX5E_INNER_TTC_FT_LEVEL + 1,
1005e466345SHuy Nguyen #endif
1015e466345SHuy Nguyen #ifdef CONFIG_MLX5_EN_IPSEC
1025e466345SHuy Nguyen 	MLX5E_ACCEL_FS_ESP_FT_LEVEL = MLX5E_INNER_TTC_FT_LEVEL + 1,
1035e466345SHuy Nguyen 	MLX5E_ACCEL_FS_ESP_FT_ERR_LEVEL,
10444f68ae0SSaeed Mahameed #endif
10544f68ae0SSaeed Mahameed };
10644f68ae0SSaeed Mahameed 
1073f22d6c7SMaxim Mikityanskiy struct mlx5e_priv;
1083f22d6c7SMaxim Mikityanskiy 
109fe6d86b3SSaeed Mahameed #ifdef CONFIG_MLX5_EN_RXNFC
110fe6d86b3SSaeed Mahameed 
111fe6d86b3SSaeed Mahameed struct mlx5e_ethtool_table {
112fe6d86b3SSaeed Mahameed 	struct mlx5_flow_table *ft;
113fe6d86b3SSaeed Mahameed 	int                    num_rules;
114fe6d86b3SSaeed Mahameed };
115fe6d86b3SSaeed Mahameed 
116fe6d86b3SSaeed Mahameed #define ETHTOOL_NUM_L3_L4_FTS 7
117fe6d86b3SSaeed Mahameed #define ETHTOOL_NUM_L2_FTS 4
118fe6d86b3SSaeed Mahameed 
119fe6d86b3SSaeed Mahameed struct mlx5e_ethtool_steering {
120fe6d86b3SSaeed Mahameed 	struct mlx5e_ethtool_table      l3_l4_ft[ETHTOOL_NUM_L3_L4_FTS];
121fe6d86b3SSaeed Mahameed 	struct mlx5e_ethtool_table      l2_ft[ETHTOOL_NUM_L2_FTS];
122fe6d86b3SSaeed Mahameed 	struct list_head                rules;
123fe6d86b3SSaeed Mahameed 	int                             tot_num_rules;
124fe6d86b3SSaeed Mahameed };
125fe6d86b3SSaeed Mahameed 
126fe6d86b3SSaeed Mahameed void mlx5e_ethtool_init_steering(struct mlx5e_priv *priv);
127fe6d86b3SSaeed Mahameed void mlx5e_ethtool_cleanup_steering(struct mlx5e_priv *priv);
12879ce39beSSaeed Mahameed int mlx5e_ethtool_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd);
12979ce39beSSaeed Mahameed int mlx5e_ethtool_get_rxnfc(struct net_device *dev,
130fe6d86b3SSaeed Mahameed 			    struct ethtool_rxnfc *info, u32 *rule_locs);
131fe6d86b3SSaeed Mahameed #else
132fe6d86b3SSaeed Mahameed static inline void mlx5e_ethtool_init_steering(struct mlx5e_priv *priv)    { }
133fe6d86b3SSaeed Mahameed static inline void mlx5e_ethtool_cleanup_steering(struct mlx5e_priv *priv) { }
13479ce39beSSaeed Mahameed static inline int mlx5e_ethtool_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd)
13579ce39beSSaeed Mahameed { return -EOPNOTSUPP; }
13679ce39beSSaeed Mahameed static inline int mlx5e_ethtool_get_rxnfc(struct net_device *dev,
13779ce39beSSaeed Mahameed 					  struct ethtool_rxnfc *info, u32 *rule_locs)
13879ce39beSSaeed Mahameed { return -EOPNOTSUPP; }
139fe6d86b3SSaeed Mahameed #endif /* CONFIG_MLX5_EN_RXNFC */
140fe6d86b3SSaeed Mahameed 
141ec080045SSaeed Mahameed #ifdef CONFIG_MLX5_EN_ARFS
142f6755b80SVu Pham struct mlx5e_arfs_tables;
143ec080045SSaeed Mahameed 
144ec080045SSaeed Mahameed int mlx5e_arfs_create_tables(struct mlx5e_priv *priv);
145ec080045SSaeed Mahameed void mlx5e_arfs_destroy_tables(struct mlx5e_priv *priv);
146ec080045SSaeed Mahameed int mlx5e_arfs_enable(struct mlx5e_priv *priv);
147ec080045SSaeed Mahameed int mlx5e_arfs_disable(struct mlx5e_priv *priv);
148ec080045SSaeed Mahameed int mlx5e_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,
149ec080045SSaeed Mahameed 			u16 rxq_index, u32 flow_id);
150ec080045SSaeed Mahameed #else
151ec080045SSaeed Mahameed static inline int mlx5e_arfs_create_tables(struct mlx5e_priv *priv) { return 0; }
152ec080045SSaeed Mahameed static inline void mlx5e_arfs_destroy_tables(struct mlx5e_priv *priv) {}
153ec080045SSaeed Mahameed static inline int mlx5e_arfs_enable(struct mlx5e_priv *priv) { return -EOPNOTSUPP; }
154ec080045SSaeed Mahameed static inline int mlx5e_arfs_disable(struct mlx5e_priv *priv) {	return -EOPNOTSUPP; }
155ec080045SSaeed Mahameed #endif
156ec080045SSaeed Mahameed 
157c062d52aSBoris Pismenny #ifdef CONFIG_MLX5_EN_TLS
158c062d52aSBoris Pismenny struct mlx5e_accel_fs_tcp;
159c062d52aSBoris Pismenny #endif
160c062d52aSBoris Pismenny 
1611c80bd68SAya Levin struct mlx5e_fs_udp;
1620f575c20SAya Levin struct mlx5e_fs_any;
163e5fe4946SAya Levin struct mlx5e_ptp_fs;
1641c80bd68SAya Levin 
16544f68ae0SSaeed Mahameed struct mlx5e_flow_steering {
16644f68ae0SSaeed Mahameed 	struct mlx5_flow_namespace      *ns;
167ee92e4f1SHuy Nguyen 	struct mlx5_flow_namespace      *egress_ns;
16844f68ae0SSaeed Mahameed #ifdef CONFIG_MLX5_EN_RXNFC
16944f68ae0SSaeed Mahameed 	struct mlx5e_ethtool_steering   ethtool;
17044f68ae0SSaeed Mahameed #endif
17144f68ae0SSaeed Mahameed 	struct mlx5e_tc_table           tc;
1721c46d740SAya Levin 	struct mlx5e_promisc_table      promisc;
1736783f0a2SVu Pham 	struct mlx5e_vlan_table         *vlan;
17444f68ae0SSaeed Mahameed 	struct mlx5e_l2_table           l2;
175f4b45940SMaor Gottlieb 	struct mlx5_ttc_table           *ttc;
176f4b45940SMaor Gottlieb 	struct mlx5_ttc_table           *inner_ttc;
17744f68ae0SSaeed Mahameed #ifdef CONFIG_MLX5_EN_ARFS
178f6755b80SVu Pham 	struct mlx5e_arfs_tables       *arfs;
17944f68ae0SSaeed Mahameed #endif
180c062d52aSBoris Pismenny #ifdef CONFIG_MLX5_EN_TLS
181c062d52aSBoris Pismenny 	struct mlx5e_accel_fs_tcp      *accel_tcp;
182c062d52aSBoris Pismenny #endif
1831c80bd68SAya Levin 	struct mlx5e_fs_udp            *udp;
1840f575c20SAya Levin 	struct mlx5e_fs_any            *any;
185e5fe4946SAya Levin 	struct mlx5e_ptp_fs            *ptp_fs;
18644f68ae0SSaeed Mahameed };
18744f68ae0SSaeed Mahameed 
188bc29764eSMaor Gottlieb void mlx5e_set_ttc_params(struct mlx5e_priv *priv,
189bc29764eSMaor Gottlieb 			  struct ttc_params *ttc_params, bool tunnel);
19044f68ae0SSaeed Mahameed 
191f4b45940SMaor Gottlieb void mlx5e_destroy_ttc_table(struct mlx5e_priv *priv);
192f4b45940SMaor Gottlieb int mlx5e_create_ttc_table(struct mlx5e_priv *priv);
193f4b45940SMaor Gottlieb 
19444f68ae0SSaeed Mahameed void mlx5e_destroy_flow_table(struct mlx5e_flow_table *ft);
19544f68ae0SSaeed Mahameed 
19644f68ae0SSaeed Mahameed void mlx5e_enable_cvlan_filter(struct mlx5e_priv *priv);
19744f68ae0SSaeed Mahameed void mlx5e_disable_cvlan_filter(struct mlx5e_priv *priv);
19844f68ae0SSaeed Mahameed 
19944f68ae0SSaeed Mahameed int mlx5e_create_flow_steering(struct mlx5e_priv *priv);
20044f68ae0SSaeed Mahameed void mlx5e_destroy_flow_steering(struct mlx5e_priv *priv);
20144f68ae0SSaeed Mahameed 
202e2a1a004SAya Levin int mlx5e_add_vlan_trap(struct mlx5e_priv *priv, int  trap_id, int tir_num);
203e2a1a004SAya Levin void mlx5e_remove_vlan_trap(struct mlx5e_priv *priv);
204ceef1b66SAya Levin int mlx5e_add_mac_trap(struct mlx5e_priv *priv, int  trap_id, int tir_num);
205ceef1b66SAya Levin void mlx5e_remove_mac_trap(struct mlx5e_priv *priv);
206e3a53bc5SMarina Varshaver 
207fe6d86b3SSaeed Mahameed #endif /* __MLX5E_FLOW_STEER_H__ */
208fe6d86b3SSaeed Mahameed 
209