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