| .. | .. |
|---|
| 8 | 8 | #include <linux/netdevice.h> |
|---|
| 9 | 9 | #include <linux/rhashtable.h> |
|---|
| 10 | 10 | #include <linux/bitops.h> |
|---|
| 11 | +#include <linux/if_bridge.h> |
|---|
| 11 | 12 | #include <linux/if_vlan.h> |
|---|
| 12 | 13 | #include <linux/list.h> |
|---|
| 13 | 14 | #include <linux/dcbnl.h> |
|---|
| 14 | 15 | #include <linux/in6.h> |
|---|
| 15 | 16 | #include <linux/notifier.h> |
|---|
| 17 | +#include <linux/net_namespace.h> |
|---|
| 16 | 18 | #include <net/psample.h> |
|---|
| 17 | 19 | #include <net/pkt_cls.h> |
|---|
| 18 | 20 | #include <net/red.h> |
|---|
| 21 | +#include <net/vxlan.h> |
|---|
| 22 | +#include <net/flow_offload.h> |
|---|
| 23 | +#include <net/inet_ecn.h> |
|---|
| 19 | 24 | |
|---|
| 20 | 25 | #include "port.h" |
|---|
| 21 | 26 | #include "core.h" |
|---|
| .. | .. |
|---|
| 23 | 28 | #include "core_acl_flex_actions.h" |
|---|
| 24 | 29 | #include "reg.h" |
|---|
| 25 | 30 | |
|---|
| 31 | +#define MLXSW_SP_DEFAULT_VID (VLAN_N_VID - 1) |
|---|
| 32 | + |
|---|
| 26 | 33 | #define MLXSW_SP_FID_8021D_MAX 1024 |
|---|
| 27 | 34 | |
|---|
| 28 | 35 | #define MLXSW_SP_MID_MAX 7000 |
|---|
| 29 | | - |
|---|
| 30 | | -#define MLXSW_SP_PORTS_PER_CLUSTER_MAX 4 |
|---|
| 31 | | - |
|---|
| 32 | | -#define MLXSW_SP_PORT_BASE_SPEED 25000 /* Mb/s */ |
|---|
| 33 | 36 | |
|---|
| 34 | 37 | #define MLXSW_SP_KVD_LINEAR_SIZE 98304 /* entries */ |
|---|
| 35 | 38 | #define MLXSW_SP_KVD_GRANULARITY 128 |
|---|
| .. | .. |
|---|
| 42 | 45 | #define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_CHUNKS "chunks" |
|---|
| 43 | 46 | #define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_LARGE_CHUNKS "large_chunks" |
|---|
| 44 | 47 | |
|---|
| 48 | +#define MLXSW_SP_RESOURCE_NAME_SPAN "span_agents" |
|---|
| 49 | + |
|---|
| 50 | +#define MLXSW_SP_RESOURCE_NAME_COUNTERS "counters" |
|---|
| 51 | +#define MLXSW_SP_RESOURCE_NAME_COUNTERS_FLOW "flow" |
|---|
| 52 | +#define MLXSW_SP_RESOURCE_NAME_COUNTERS_RIF "rif" |
|---|
| 53 | + |
|---|
| 45 | 54 | enum mlxsw_sp_resource_id { |
|---|
| 46 | 55 | MLXSW_SP_RESOURCE_KVD = 1, |
|---|
| 47 | 56 | MLXSW_SP_RESOURCE_KVD_LINEAR, |
|---|
| .. | .. |
|---|
| 50 | 59 | MLXSW_SP_RESOURCE_KVD_LINEAR_SINGLE, |
|---|
| 51 | 60 | MLXSW_SP_RESOURCE_KVD_LINEAR_CHUNKS, |
|---|
| 52 | 61 | MLXSW_SP_RESOURCE_KVD_LINEAR_LARGE_CHUNKS, |
|---|
| 62 | + MLXSW_SP_RESOURCE_SPAN, |
|---|
| 63 | + MLXSW_SP_RESOURCE_COUNTERS, |
|---|
| 64 | + MLXSW_SP_RESOURCE_COUNTERS_FLOW, |
|---|
| 65 | + MLXSW_SP_RESOURCE_COUNTERS_RIF, |
|---|
| 66 | + MLXSW_SP_RESOURCE_GLOBAL_POLICERS, |
|---|
| 67 | + MLXSW_SP_RESOURCE_SINGLE_RATE_POLICERS, |
|---|
| 53 | 68 | }; |
|---|
| 54 | 69 | |
|---|
| 55 | 70 | struct mlxsw_sp_port; |
|---|
| 56 | 71 | struct mlxsw_sp_rif; |
|---|
| 57 | 72 | struct mlxsw_sp_span_entry; |
|---|
| 73 | +enum mlxsw_sp_l3proto; |
|---|
| 74 | +union mlxsw_sp_l3addr; |
|---|
| 58 | 75 | |
|---|
| 59 | 76 | struct mlxsw_sp_upper { |
|---|
| 60 | 77 | struct net_device *dev; |
|---|
| .. | .. |
|---|
| 69 | 86 | MLXSW_SP_RIF_TYPE_MAX, |
|---|
| 70 | 87 | }; |
|---|
| 71 | 88 | |
|---|
| 89 | +struct mlxsw_sp_rif_ops; |
|---|
| 90 | + |
|---|
| 91 | +extern const struct mlxsw_sp_rif_ops *mlxsw_sp1_rif_ops_arr[]; |
|---|
| 92 | +extern const struct mlxsw_sp_rif_ops *mlxsw_sp2_rif_ops_arr[]; |
|---|
| 93 | + |
|---|
| 72 | 94 | enum mlxsw_sp_fid_type { |
|---|
| 73 | 95 | MLXSW_SP_FID_TYPE_8021Q, |
|---|
| 74 | 96 | MLXSW_SP_FID_TYPE_8021D, |
|---|
| 75 | 97 | MLXSW_SP_FID_TYPE_RFID, |
|---|
| 76 | 98 | MLXSW_SP_FID_TYPE_DUMMY, |
|---|
| 77 | 99 | MLXSW_SP_FID_TYPE_MAX, |
|---|
| 100 | +}; |
|---|
| 101 | + |
|---|
| 102 | +enum mlxsw_sp_nve_type { |
|---|
| 103 | + MLXSW_SP_NVE_TYPE_VXLAN, |
|---|
| 78 | 104 | }; |
|---|
| 79 | 105 | |
|---|
| 80 | 106 | struct mlxsw_sp_mid { |
|---|
| .. | .. |
|---|
| 86 | 112 | unsigned long *ports_in_mid; /* bits array */ |
|---|
| 87 | 113 | }; |
|---|
| 88 | 114 | |
|---|
| 89 | | -enum mlxsw_sp_port_mall_action_type { |
|---|
| 90 | | - MLXSW_SP_PORT_MALL_MIRROR, |
|---|
| 91 | | - MLXSW_SP_PORT_MALL_SAMPLE, |
|---|
| 92 | | -}; |
|---|
| 93 | | - |
|---|
| 94 | | -struct mlxsw_sp_port_mall_mirror_tc_entry { |
|---|
| 95 | | - int span_id; |
|---|
| 96 | | - bool ingress; |
|---|
| 97 | | -}; |
|---|
| 98 | | - |
|---|
| 99 | | -struct mlxsw_sp_port_mall_tc_entry { |
|---|
| 100 | | - struct list_head list; |
|---|
| 101 | | - unsigned long cookie; |
|---|
| 102 | | - enum mlxsw_sp_port_mall_action_type type; |
|---|
| 103 | | - union { |
|---|
| 104 | | - struct mlxsw_sp_port_mall_mirror_tc_entry mirror; |
|---|
| 105 | | - }; |
|---|
| 106 | | -}; |
|---|
| 107 | | - |
|---|
| 108 | 115 | struct mlxsw_sp_sb; |
|---|
| 109 | 116 | struct mlxsw_sp_bridge; |
|---|
| 110 | 117 | struct mlxsw_sp_router; |
|---|
| .. | .. |
|---|
| 113 | 120 | struct mlxsw_sp_counter_pool; |
|---|
| 114 | 121 | struct mlxsw_sp_fid_core; |
|---|
| 115 | 122 | struct mlxsw_sp_kvdl; |
|---|
| 123 | +struct mlxsw_sp_nve; |
|---|
| 116 | 124 | struct mlxsw_sp_kvdl_ops; |
|---|
| 117 | 125 | struct mlxsw_sp_mr_tcam_ops; |
|---|
| 126 | +struct mlxsw_sp_acl_rulei_ops; |
|---|
| 118 | 127 | struct mlxsw_sp_acl_tcam_ops; |
|---|
| 128 | +struct mlxsw_sp_nve_ops; |
|---|
| 129 | +struct mlxsw_sp_sb_ops; |
|---|
| 130 | +struct mlxsw_sp_sb_vals; |
|---|
| 131 | +struct mlxsw_sp_port_type_speed_ops; |
|---|
| 132 | +struct mlxsw_sp_ptp_state; |
|---|
| 133 | +struct mlxsw_sp_ptp_ops; |
|---|
| 134 | +struct mlxsw_sp_span_ops; |
|---|
| 135 | +struct mlxsw_sp_qdisc_state; |
|---|
| 136 | + |
|---|
| 137 | +struct mlxsw_sp_port_mapping { |
|---|
| 138 | + u8 module; |
|---|
| 139 | + u8 width; |
|---|
| 140 | + u8 lane; |
|---|
| 141 | +}; |
|---|
| 119 | 142 | |
|---|
| 120 | 143 | struct mlxsw_sp { |
|---|
| 121 | 144 | struct mlxsw_sp_port **ports; |
|---|
| 122 | 145 | struct mlxsw_core *core; |
|---|
| 123 | 146 | const struct mlxsw_bus_info *bus_info; |
|---|
| 124 | 147 | unsigned char base_mac[ETH_ALEN]; |
|---|
| 148 | + const unsigned char *mac_mask; |
|---|
| 125 | 149 | struct mlxsw_sp_upper *lags; |
|---|
| 126 | | - int *port_to_module; |
|---|
| 150 | + struct mlxsw_sp_port_mapping **port_mapping; |
|---|
| 127 | 151 | struct mlxsw_sp_sb *sb; |
|---|
| 128 | 152 | struct mlxsw_sp_bridge *bridge; |
|---|
| 129 | 153 | struct mlxsw_sp_router *router; |
|---|
| .. | .. |
|---|
| 131 | 155 | struct mlxsw_afa *afa; |
|---|
| 132 | 156 | struct mlxsw_sp_acl *acl; |
|---|
| 133 | 157 | struct mlxsw_sp_fid_core *fid_core; |
|---|
| 158 | + struct mlxsw_sp_policer_core *policer_core; |
|---|
| 134 | 159 | struct mlxsw_sp_kvdl *kvdl; |
|---|
| 160 | + struct mlxsw_sp_nve *nve; |
|---|
| 135 | 161 | struct notifier_block netdevice_nb; |
|---|
| 136 | | - |
|---|
| 162 | + struct mlxsw_sp_ptp_clock *clock; |
|---|
| 163 | + struct mlxsw_sp_ptp_state *ptp_state; |
|---|
| 137 | 164 | struct mlxsw_sp_counter_pool *counter_pool; |
|---|
| 138 | | - struct { |
|---|
| 139 | | - struct mlxsw_sp_span_entry *entries; |
|---|
| 140 | | - int entries_count; |
|---|
| 141 | | - } span; |
|---|
| 142 | | - const struct mlxsw_fw_rev *req_rev; |
|---|
| 143 | | - const char *fw_filename; |
|---|
| 165 | + struct mlxsw_sp_span *span; |
|---|
| 166 | + struct mlxsw_sp_trap *trap; |
|---|
| 144 | 167 | const struct mlxsw_sp_kvdl_ops *kvdl_ops; |
|---|
| 145 | 168 | const struct mlxsw_afa_ops *afa_ops; |
|---|
| 146 | 169 | const struct mlxsw_afk_ops *afk_ops; |
|---|
| 147 | 170 | const struct mlxsw_sp_mr_tcam_ops *mr_tcam_ops; |
|---|
| 171 | + const struct mlxsw_sp_acl_rulei_ops *acl_rulei_ops; |
|---|
| 148 | 172 | const struct mlxsw_sp_acl_tcam_ops *acl_tcam_ops; |
|---|
| 173 | + const struct mlxsw_sp_nve_ops **nve_ops_arr; |
|---|
| 174 | + const struct mlxsw_sp_rif_ops **rif_ops_arr; |
|---|
| 175 | + const struct mlxsw_sp_sb_vals *sb_vals; |
|---|
| 176 | + const struct mlxsw_sp_sb_ops *sb_ops; |
|---|
| 177 | + const struct mlxsw_sp_port_type_speed_ops *port_type_speed_ops; |
|---|
| 178 | + const struct mlxsw_sp_ptp_ops *ptp_ops; |
|---|
| 179 | + const struct mlxsw_sp_span_ops *span_ops; |
|---|
| 180 | + const struct mlxsw_sp_policer_core_ops *policer_core_ops; |
|---|
| 181 | + const struct mlxsw_sp_trap_ops *trap_ops; |
|---|
| 182 | + const struct mlxsw_listener *listeners; |
|---|
| 183 | + size_t listeners_count; |
|---|
| 184 | + u32 lowest_shaper_bs; |
|---|
| 185 | +}; |
|---|
| 186 | + |
|---|
| 187 | +struct mlxsw_sp_ptp_ops { |
|---|
| 188 | + struct mlxsw_sp_ptp_clock * |
|---|
| 189 | + (*clock_init)(struct mlxsw_sp *mlxsw_sp, struct device *dev); |
|---|
| 190 | + void (*clock_fini)(struct mlxsw_sp_ptp_clock *clock); |
|---|
| 191 | + |
|---|
| 192 | + struct mlxsw_sp_ptp_state *(*init)(struct mlxsw_sp *mlxsw_sp); |
|---|
| 193 | + void (*fini)(struct mlxsw_sp_ptp_state *ptp_state); |
|---|
| 194 | + |
|---|
| 195 | + /* Notify a driver that a packet that might be PTP was received. Driver |
|---|
| 196 | + * is responsible for freeing the passed-in SKB. |
|---|
| 197 | + */ |
|---|
| 198 | + void (*receive)(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb, |
|---|
| 199 | + u8 local_port); |
|---|
| 200 | + |
|---|
| 201 | + /* Notify a driver that a timestamped packet was transmitted. Driver |
|---|
| 202 | + * is responsible for freeing the passed-in SKB. |
|---|
| 203 | + */ |
|---|
| 204 | + void (*transmitted)(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb, |
|---|
| 205 | + u8 local_port); |
|---|
| 206 | + |
|---|
| 207 | + int (*hwtstamp_get)(struct mlxsw_sp_port *mlxsw_sp_port, |
|---|
| 208 | + struct hwtstamp_config *config); |
|---|
| 209 | + int (*hwtstamp_set)(struct mlxsw_sp_port *mlxsw_sp_port, |
|---|
| 210 | + struct hwtstamp_config *config); |
|---|
| 211 | + void (*shaper_work)(struct work_struct *work); |
|---|
| 212 | + int (*get_ts_info)(struct mlxsw_sp *mlxsw_sp, |
|---|
| 213 | + struct ethtool_ts_info *info); |
|---|
| 214 | + int (*get_stats_count)(void); |
|---|
| 215 | + void (*get_stats_strings)(u8 **p); |
|---|
| 216 | + void (*get_stats)(struct mlxsw_sp_port *mlxsw_sp_port, |
|---|
| 217 | + u64 *data, int data_index); |
|---|
| 149 | 218 | }; |
|---|
| 150 | 219 | |
|---|
| 151 | 220 | static inline struct mlxsw_sp_upper * |
|---|
| .. | .. |
|---|
| 164 | 233 | }; |
|---|
| 165 | 234 | |
|---|
| 166 | 235 | struct mlxsw_sp_port_sample { |
|---|
| 167 | | - struct psample_group __rcu *psample_group; |
|---|
| 236 | + struct psample_group *psample_group; |
|---|
| 168 | 237 | u32 trunc_size; |
|---|
| 169 | 238 | u32 rate; |
|---|
| 170 | 239 | bool truncate; |
|---|
| .. | .. |
|---|
| 177 | 246 | struct list_head list; |
|---|
| 178 | 247 | struct mlxsw_sp_port *mlxsw_sp_port; |
|---|
| 179 | 248 | struct mlxsw_sp_fid *fid; |
|---|
| 180 | | - unsigned int ref_count; |
|---|
| 181 | 249 | u16 vid; |
|---|
| 182 | 250 | struct mlxsw_sp_bridge_port *bridge_port; |
|---|
| 183 | 251 | struct list_head bridge_vlan_node; |
|---|
| .. | .. |
|---|
| 191 | 259 | u64 backlog[TC_MAX_QUEUE]; |
|---|
| 192 | 260 | u64 tx_bytes[IEEE_8021QAZ_MAX_TCS]; |
|---|
| 193 | 261 | u64 tx_packets[IEEE_8021QAZ_MAX_TCS]; |
|---|
| 262 | +}; |
|---|
| 263 | + |
|---|
| 264 | +struct mlxsw_sp_ptp_port_dir_stats { |
|---|
| 265 | + u64 packets; |
|---|
| 266 | + u64 timestamps; |
|---|
| 267 | +}; |
|---|
| 268 | + |
|---|
| 269 | +struct mlxsw_sp_ptp_port_stats { |
|---|
| 270 | + struct mlxsw_sp_ptp_port_dir_stats rx_gcd; |
|---|
| 271 | + struct mlxsw_sp_ptp_port_dir_stats tx_gcd; |
|---|
| 194 | 272 | }; |
|---|
| 195 | 273 | |
|---|
| 196 | 274 | struct mlxsw_sp_port { |
|---|
| .. | .. |
|---|
| 213 | 291 | struct ieee_pfc *pfc; |
|---|
| 214 | 292 | enum mlxsw_reg_qpts_trust_state trust_state; |
|---|
| 215 | 293 | } dcb; |
|---|
| 216 | | - struct { |
|---|
| 217 | | - u8 module; |
|---|
| 218 | | - u8 width; |
|---|
| 219 | | - u8 lane; |
|---|
| 220 | | - } mapping; |
|---|
| 221 | | - /* TC handles */ |
|---|
| 222 | | - struct list_head mall_tc_list; |
|---|
| 294 | + struct mlxsw_sp_port_mapping mapping; /* mapping is constant during the |
|---|
| 295 | + * mlxsw_sp_port lifetime, however |
|---|
| 296 | + * the same localport can have |
|---|
| 297 | + * different mapping. |
|---|
| 298 | + */ |
|---|
| 223 | 299 | struct { |
|---|
| 224 | 300 | #define MLXSW_HW_STATS_UPDATE_TIME HZ |
|---|
| 225 | 301 | struct rtnl_link_stats64 stats; |
|---|
| 226 | 302 | struct mlxsw_sp_port_xstats xstats; |
|---|
| 227 | 303 | struct delayed_work update_dw; |
|---|
| 228 | 304 | } periodic_hw_stats; |
|---|
| 229 | | - struct mlxsw_sp_port_sample *sample; |
|---|
| 305 | + struct mlxsw_sp_port_sample __rcu *sample; |
|---|
| 230 | 306 | struct list_head vlans_list; |
|---|
| 231 | | - struct mlxsw_sp_qdisc *root_qdisc; |
|---|
| 232 | | - struct mlxsw_sp_qdisc *tclass_qdiscs; |
|---|
| 307 | + struct mlxsw_sp_port_vlan *default_vlan; |
|---|
| 308 | + struct mlxsw_sp_qdisc_state *qdisc; |
|---|
| 233 | 309 | unsigned acl_rule_count; |
|---|
| 234 | | - struct mlxsw_sp_acl_block *ing_acl_block; |
|---|
| 235 | | - struct mlxsw_sp_acl_block *eg_acl_block; |
|---|
| 310 | + struct mlxsw_sp_flow_block *ing_flow_block; |
|---|
| 311 | + struct mlxsw_sp_flow_block *eg_flow_block; |
|---|
| 312 | + struct { |
|---|
| 313 | + struct delayed_work shaper_dw; |
|---|
| 314 | + struct hwtstamp_config hwtstamp_config; |
|---|
| 315 | + u16 ing_types; |
|---|
| 316 | + u16 egr_types; |
|---|
| 317 | + struct mlxsw_sp_ptp_port_stats stats; |
|---|
| 318 | + } ptp; |
|---|
| 319 | + u8 split_base_local_port; |
|---|
| 320 | + int max_mtu; |
|---|
| 321 | + u32 max_speed; |
|---|
| 322 | + struct mlxsw_sp_hdroom *hdroom; |
|---|
| 323 | + u64 module_overheat_initial_val; |
|---|
| 236 | 324 | }; |
|---|
| 325 | + |
|---|
| 326 | +struct mlxsw_sp_port_type_speed_ops { |
|---|
| 327 | + void (*from_ptys_supported_port)(struct mlxsw_sp *mlxsw_sp, |
|---|
| 328 | + u32 ptys_eth_proto, |
|---|
| 329 | + struct ethtool_link_ksettings *cmd); |
|---|
| 330 | + void (*from_ptys_link)(struct mlxsw_sp *mlxsw_sp, u32 ptys_eth_proto, |
|---|
| 331 | + u8 width, unsigned long *mode); |
|---|
| 332 | + u32 (*from_ptys_speed)(struct mlxsw_sp *mlxsw_sp, u32 ptys_eth_proto); |
|---|
| 333 | + void (*from_ptys_speed_duplex)(struct mlxsw_sp *mlxsw_sp, |
|---|
| 334 | + bool carrier_ok, u32 ptys_eth_proto, |
|---|
| 335 | + struct ethtool_link_ksettings *cmd); |
|---|
| 336 | + int (*ptys_max_speed)(struct mlxsw_sp_port *mlxsw_sp_port, u32 *p_max_speed); |
|---|
| 337 | + u32 (*to_ptys_advert_link)(struct mlxsw_sp *mlxsw_sp, u8 width, |
|---|
| 338 | + const struct ethtool_link_ksettings *cmd); |
|---|
| 339 | + u32 (*to_ptys_speed)(struct mlxsw_sp *mlxsw_sp, u8 width, u32 speed); |
|---|
| 340 | + void (*reg_ptys_eth_pack)(struct mlxsw_sp *mlxsw_sp, char *payload, |
|---|
| 341 | + u8 local_port, u32 proto_admin, bool autoneg); |
|---|
| 342 | + void (*reg_ptys_eth_unpack)(struct mlxsw_sp *mlxsw_sp, char *payload, |
|---|
| 343 | + u32 *p_eth_proto_cap, |
|---|
| 344 | + u32 *p_eth_proto_admin, |
|---|
| 345 | + u32 *p_eth_proto_oper); |
|---|
| 346 | + u32 (*ptys_proto_cap_masked_get)(u32 eth_proto_cap); |
|---|
| 347 | +}; |
|---|
| 348 | + |
|---|
| 349 | +static inline u8 mlxsw_sp_tunnel_ecn_decap(u8 outer_ecn, u8 inner_ecn, |
|---|
| 350 | + bool *trap_en) |
|---|
| 351 | +{ |
|---|
| 352 | + bool set_ce = false; |
|---|
| 353 | + |
|---|
| 354 | + *trap_en = !!__INET_ECN_decapsulate(outer_ecn, inner_ecn, &set_ce); |
|---|
| 355 | + if (set_ce) |
|---|
| 356 | + return INET_ECN_CE; |
|---|
| 357 | + else if (outer_ecn == INET_ECN_ECT_1 && inner_ecn == INET_ECN_ECT_0) |
|---|
| 358 | + return INET_ECN_ECT_1; |
|---|
| 359 | + else |
|---|
| 360 | + return inner_ecn; |
|---|
| 361 | +} |
|---|
| 362 | + |
|---|
| 363 | +static inline struct net_device * |
|---|
| 364 | +mlxsw_sp_bridge_vxlan_dev_find(struct net_device *br_dev) |
|---|
| 365 | +{ |
|---|
| 366 | + struct net_device *dev; |
|---|
| 367 | + struct list_head *iter; |
|---|
| 368 | + |
|---|
| 369 | + netdev_for_each_lower_dev(br_dev, dev, iter) { |
|---|
| 370 | + if (netif_is_vxlan(dev)) |
|---|
| 371 | + return dev; |
|---|
| 372 | + } |
|---|
| 373 | + |
|---|
| 374 | + return NULL; |
|---|
| 375 | +} |
|---|
| 376 | + |
|---|
| 377 | +static inline bool mlxsw_sp_bridge_has_vxlan(struct net_device *br_dev) |
|---|
| 378 | +{ |
|---|
| 379 | + return !!mlxsw_sp_bridge_vxlan_dev_find(br_dev); |
|---|
| 380 | +} |
|---|
| 381 | + |
|---|
| 382 | +static inline int |
|---|
| 383 | +mlxsw_sp_vxlan_mapped_vid(const struct net_device *vxlan_dev, u16 *p_vid) |
|---|
| 384 | +{ |
|---|
| 385 | + struct bridge_vlan_info vinfo; |
|---|
| 386 | + u16 vid = 0; |
|---|
| 387 | + int err; |
|---|
| 388 | + |
|---|
| 389 | + err = br_vlan_get_pvid(vxlan_dev, &vid); |
|---|
| 390 | + if (err || !vid) |
|---|
| 391 | + goto out; |
|---|
| 392 | + |
|---|
| 393 | + err = br_vlan_get_info(vxlan_dev, vid, &vinfo); |
|---|
| 394 | + if (err || !(vinfo.flags & BRIDGE_VLAN_INFO_UNTAGGED)) |
|---|
| 395 | + vid = 0; |
|---|
| 396 | + |
|---|
| 397 | +out: |
|---|
| 398 | + *p_vid = vid; |
|---|
| 399 | + return err; |
|---|
| 400 | +} |
|---|
| 237 | 401 | |
|---|
| 238 | 402 | static inline bool |
|---|
| 239 | 403 | mlxsw_sp_port_is_pause_en(const struct mlxsw_sp_port *mlxsw_sp_port) |
|---|
| .. | .. |
|---|
| 274 | 438 | MLXSW_SP_FLOOD_TYPE_MC, |
|---|
| 275 | 439 | }; |
|---|
| 276 | 440 | |
|---|
| 441 | +int mlxsw_sp_port_get_stats_raw(struct net_device *dev, int grp, |
|---|
| 442 | + int prio, char *ppcnt_pl); |
|---|
| 443 | +int mlxsw_sp_port_admin_status_set(struct mlxsw_sp_port *mlxsw_sp_port, |
|---|
| 444 | + bool is_up); |
|---|
| 445 | + |
|---|
| 277 | 446 | /* spectrum_buffers.c */ |
|---|
| 447 | +struct mlxsw_sp_hdroom_prio { |
|---|
| 448 | + /* Number of port buffer associated with this priority. This is the |
|---|
| 449 | + * actually configured value. |
|---|
| 450 | + */ |
|---|
| 451 | + u8 buf_idx; |
|---|
| 452 | + /* Value of buf_idx deduced from the DCB ETS configuration. */ |
|---|
| 453 | + u8 ets_buf_idx; |
|---|
| 454 | + /* Value of buf_idx taken from the dcbnl_setbuffer configuration. */ |
|---|
| 455 | + u8 set_buf_idx; |
|---|
| 456 | + bool lossy; |
|---|
| 457 | +}; |
|---|
| 458 | + |
|---|
| 459 | +struct mlxsw_sp_hdroom_buf { |
|---|
| 460 | + u32 thres_cells; |
|---|
| 461 | + u32 size_cells; |
|---|
| 462 | + /* Size requirement form dcbnl_setbuffer. */ |
|---|
| 463 | + u32 set_size_cells; |
|---|
| 464 | + bool lossy; |
|---|
| 465 | +}; |
|---|
| 466 | + |
|---|
| 467 | +enum mlxsw_sp_hdroom_mode { |
|---|
| 468 | + MLXSW_SP_HDROOM_MODE_DCB, |
|---|
| 469 | + MLXSW_SP_HDROOM_MODE_TC, |
|---|
| 470 | +}; |
|---|
| 471 | + |
|---|
| 472 | +#define MLXSW_SP_PB_COUNT 10 |
|---|
| 473 | + |
|---|
| 474 | +struct mlxsw_sp_hdroom { |
|---|
| 475 | + enum mlxsw_sp_hdroom_mode mode; |
|---|
| 476 | + |
|---|
| 477 | + struct { |
|---|
| 478 | + struct mlxsw_sp_hdroom_prio prio[IEEE_8021Q_MAX_PRIORITIES]; |
|---|
| 479 | + } prios; |
|---|
| 480 | + struct { |
|---|
| 481 | + struct mlxsw_sp_hdroom_buf buf[MLXSW_SP_PB_COUNT]; |
|---|
| 482 | + } bufs; |
|---|
| 483 | + struct { |
|---|
| 484 | + /* Size actually configured for the internal buffer. Equal to |
|---|
| 485 | + * reserve when internal buffer is enabled. |
|---|
| 486 | + */ |
|---|
| 487 | + u32 size_cells; |
|---|
| 488 | + /* Space reserved in the headroom for the internal buffer. Port |
|---|
| 489 | + * buffers are not allowed to grow into this space. |
|---|
| 490 | + */ |
|---|
| 491 | + u32 reserve_cells; |
|---|
| 492 | + bool enable; |
|---|
| 493 | + } int_buf; |
|---|
| 494 | + int delay_bytes; |
|---|
| 495 | + int mtu; |
|---|
| 496 | +}; |
|---|
| 497 | + |
|---|
| 278 | 498 | int mlxsw_sp_buffers_init(struct mlxsw_sp *mlxsw_sp); |
|---|
| 279 | 499 | void mlxsw_sp_buffers_fini(struct mlxsw_sp *mlxsw_sp); |
|---|
| 280 | 500 | int mlxsw_sp_port_buffers_init(struct mlxsw_sp_port *mlxsw_sp_port); |
|---|
| 501 | +void mlxsw_sp_port_buffers_fini(struct mlxsw_sp_port *mlxsw_sp_port); |
|---|
| 281 | 502 | int mlxsw_sp_sb_pool_get(struct mlxsw_core *mlxsw_core, |
|---|
| 282 | 503 | unsigned int sb_index, u16 pool_index, |
|---|
| 283 | 504 | struct devlink_sb_pool_info *pool_info); |
|---|
| 284 | 505 | int mlxsw_sp_sb_pool_set(struct mlxsw_core *mlxsw_core, |
|---|
| 285 | 506 | unsigned int sb_index, u16 pool_index, u32 size, |
|---|
| 286 | | - enum devlink_sb_threshold_type threshold_type); |
|---|
| 507 | + enum devlink_sb_threshold_type threshold_type, |
|---|
| 508 | + struct netlink_ext_ack *extack); |
|---|
| 287 | 509 | int mlxsw_sp_sb_port_pool_get(struct mlxsw_core_port *mlxsw_core_port, |
|---|
| 288 | 510 | unsigned int sb_index, u16 pool_index, |
|---|
| 289 | 511 | u32 *p_threshold); |
|---|
| 290 | 512 | int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port, |
|---|
| 291 | 513 | unsigned int sb_index, u16 pool_index, |
|---|
| 292 | | - u32 threshold); |
|---|
| 514 | + u32 threshold, struct netlink_ext_ack *extack); |
|---|
| 293 | 515 | int mlxsw_sp_sb_tc_pool_bind_get(struct mlxsw_core_port *mlxsw_core_port, |
|---|
| 294 | 516 | unsigned int sb_index, u16 tc_index, |
|---|
| 295 | 517 | enum devlink_sb_pool_type pool_type, |
|---|
| .. | .. |
|---|
| 297 | 519 | int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port, |
|---|
| 298 | 520 | unsigned int sb_index, u16 tc_index, |
|---|
| 299 | 521 | enum devlink_sb_pool_type pool_type, |
|---|
| 300 | | - u16 pool_index, u32 threshold); |
|---|
| 522 | + u16 pool_index, u32 threshold, |
|---|
| 523 | + struct netlink_ext_ack *extack); |
|---|
| 301 | 524 | int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core, |
|---|
| 302 | 525 | unsigned int sb_index); |
|---|
| 303 | 526 | int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core, |
|---|
| .. | .. |
|---|
| 311 | 534 | u32 *p_cur, u32 *p_max); |
|---|
| 312 | 535 | u32 mlxsw_sp_cells_bytes(const struct mlxsw_sp *mlxsw_sp, u32 cells); |
|---|
| 313 | 536 | u32 mlxsw_sp_bytes_cells(const struct mlxsw_sp *mlxsw_sp, u32 bytes); |
|---|
| 537 | +void mlxsw_sp_hdroom_prios_reset_buf_idx(struct mlxsw_sp_hdroom *hdroom); |
|---|
| 538 | +void mlxsw_sp_hdroom_bufs_reset_lossiness(struct mlxsw_sp_hdroom *hdroom); |
|---|
| 539 | +void mlxsw_sp_hdroom_bufs_reset_sizes(struct mlxsw_sp_port *mlxsw_sp_port, |
|---|
| 540 | + struct mlxsw_sp_hdroom *hdroom); |
|---|
| 541 | +int mlxsw_sp_hdroom_configure(struct mlxsw_sp_port *mlxsw_sp_port, |
|---|
| 542 | + const struct mlxsw_sp_hdroom *hdroom); |
|---|
| 543 | + |
|---|
| 544 | +extern const struct mlxsw_sp_sb_vals mlxsw_sp1_sb_vals; |
|---|
| 545 | +extern const struct mlxsw_sp_sb_vals mlxsw_sp2_sb_vals; |
|---|
| 546 | + |
|---|
| 547 | +extern const struct mlxsw_sp_sb_ops mlxsw_sp1_sb_ops; |
|---|
| 548 | +extern const struct mlxsw_sp_sb_ops mlxsw_sp2_sb_ops; |
|---|
| 549 | +extern const struct mlxsw_sp_sb_ops mlxsw_sp3_sb_ops; |
|---|
| 314 | 550 | |
|---|
| 315 | 551 | /* spectrum_switchdev.c */ |
|---|
| 316 | 552 | int mlxsw_sp_switchdev_init(struct mlxsw_sp *mlxsw_sp); |
|---|
| 317 | 553 | void mlxsw_sp_switchdev_fini(struct mlxsw_sp *mlxsw_sp); |
|---|
| 318 | | -void mlxsw_sp_port_switchdev_init(struct mlxsw_sp_port *mlxsw_sp_port); |
|---|
| 319 | | -void mlxsw_sp_port_switchdev_fini(struct mlxsw_sp_port *mlxsw_sp_port); |
|---|
| 320 | 554 | int mlxsw_sp_rif_fdb_op(struct mlxsw_sp *mlxsw_sp, const char *mac, u16 fid, |
|---|
| 321 | 555 | bool adding); |
|---|
| 322 | 556 | void |
|---|
| .. | .. |
|---|
| 330 | 564 | struct net_device *br_dev); |
|---|
| 331 | 565 | bool mlxsw_sp_bridge_device_is_offloaded(const struct mlxsw_sp *mlxsw_sp, |
|---|
| 332 | 566 | const struct net_device *br_dev); |
|---|
| 567 | +int mlxsw_sp_bridge_vxlan_join(struct mlxsw_sp *mlxsw_sp, |
|---|
| 568 | + const struct net_device *br_dev, |
|---|
| 569 | + const struct net_device *vxlan_dev, u16 vid, |
|---|
| 570 | + struct netlink_ext_ack *extack); |
|---|
| 571 | +void mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp, |
|---|
| 572 | + const struct net_device *vxlan_dev); |
|---|
| 573 | +extern struct notifier_block mlxsw_sp_switchdev_notifier; |
|---|
| 333 | 574 | |
|---|
| 334 | 575 | /* spectrum.c */ |
|---|
| 576 | +void mlxsw_sp_rx_listener_no_mark_func(struct sk_buff *skb, |
|---|
| 577 | + u8 local_port, void *priv); |
|---|
| 578 | +void mlxsw_sp_ptp_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb, |
|---|
| 579 | + u8 local_port); |
|---|
| 580 | +void mlxsw_sp_sample_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb, |
|---|
| 581 | + u8 local_port); |
|---|
| 582 | +int mlxsw_sp_port_speed_get(struct mlxsw_sp_port *mlxsw_sp_port, u32 *speed); |
|---|
| 335 | 583 | int mlxsw_sp_port_ets_set(struct mlxsw_sp_port *mlxsw_sp_port, |
|---|
| 336 | 584 | enum mlxsw_reg_qeec_hr hr, u8 index, u8 next_index, |
|---|
| 337 | 585 | bool dwrr, u8 dwrr_weight); |
|---|
| 338 | 586 | int mlxsw_sp_port_prio_tc_set(struct mlxsw_sp_port *mlxsw_sp_port, |
|---|
| 339 | 587 | u8 switch_prio, u8 tclass); |
|---|
| 340 | | -int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *mlxsw_sp_port, int mtu, |
|---|
| 341 | | - u8 *prio_tc, bool pause_en, |
|---|
| 342 | | - struct ieee_pfc *my_pfc); |
|---|
| 343 | 588 | int mlxsw_sp_port_ets_maxrate_set(struct mlxsw_sp_port *mlxsw_sp_port, |
|---|
| 344 | 589 | enum mlxsw_reg_qeec_hr hr, u8 index, |
|---|
| 345 | | - u8 next_index, u32 maxrate); |
|---|
| 590 | + u8 next_index, u32 maxrate, u8 burst_size); |
|---|
| 346 | 591 | enum mlxsw_reg_spms_state mlxsw_sp_stp_spms_state(u8 stp_state); |
|---|
| 347 | 592 | int mlxsw_sp_port_vid_stp_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid, |
|---|
| 348 | 593 | u8 state); |
|---|
| .. | .. |
|---|
| 351 | 596 | bool learn_enable); |
|---|
| 352 | 597 | int mlxsw_sp_port_pvid_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid); |
|---|
| 353 | 598 | struct mlxsw_sp_port_vlan * |
|---|
| 354 | | -mlxsw_sp_port_vlan_get(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid); |
|---|
| 355 | | -void mlxsw_sp_port_vlan_put(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan); |
|---|
| 599 | +mlxsw_sp_port_vlan_create(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid); |
|---|
| 600 | +void mlxsw_sp_port_vlan_destroy(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan); |
|---|
| 356 | 601 | int mlxsw_sp_port_vlan_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid_begin, |
|---|
| 357 | 602 | u16 vid_end, bool is_member, bool untagged); |
|---|
| 358 | 603 | int mlxsw_sp_flow_counter_get(struct mlxsw_sp *mlxsw_sp, |
|---|
| .. | .. |
|---|
| 383 | 628 | #endif |
|---|
| 384 | 629 | |
|---|
| 385 | 630 | /* spectrum_router.c */ |
|---|
| 386 | | -int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp); |
|---|
| 631 | +enum mlxsw_sp_l3proto { |
|---|
| 632 | + MLXSW_SP_L3_PROTO_IPV4, |
|---|
| 633 | + MLXSW_SP_L3_PROTO_IPV6, |
|---|
| 634 | +#define MLXSW_SP_L3_PROTO_MAX (MLXSW_SP_L3_PROTO_IPV6 + 1) |
|---|
| 635 | +}; |
|---|
| 636 | + |
|---|
| 637 | +union mlxsw_sp_l3addr { |
|---|
| 638 | + __be32 addr4; |
|---|
| 639 | + struct in6_addr addr6; |
|---|
| 640 | +}; |
|---|
| 641 | + |
|---|
| 642 | +int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp, |
|---|
| 643 | + struct netlink_ext_ack *extack); |
|---|
| 387 | 644 | void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp); |
|---|
| 388 | | -int mlxsw_sp_netdevice_router_port_event(struct net_device *dev); |
|---|
| 645 | +int mlxsw_sp_netdevice_router_port_event(struct net_device *dev, |
|---|
| 646 | + unsigned long event, void *ptr); |
|---|
| 389 | 647 | void mlxsw_sp_rif_macvlan_del(struct mlxsw_sp *mlxsw_sp, |
|---|
| 390 | 648 | const struct net_device *macvlan_dev); |
|---|
| 391 | | -int mlxsw_sp_inetaddr_event(struct notifier_block *unused, |
|---|
| 392 | | - unsigned long event, void *ptr); |
|---|
| 393 | 649 | int mlxsw_sp_inetaddr_valid_event(struct notifier_block *unused, |
|---|
| 394 | 650 | unsigned long event, void *ptr); |
|---|
| 395 | | -int mlxsw_sp_inet6addr_event(struct notifier_block *unused, |
|---|
| 396 | | - unsigned long event, void *ptr); |
|---|
| 397 | 651 | int mlxsw_sp_inet6addr_valid_event(struct notifier_block *unused, |
|---|
| 398 | 652 | unsigned long event, void *ptr); |
|---|
| 399 | 653 | int mlxsw_sp_netdevice_vrf_event(struct net_device *l3_dev, unsigned long event, |
|---|
| 400 | 654 | struct netdev_notifier_changeupper_info *info); |
|---|
| 401 | 655 | bool mlxsw_sp_netdev_is_ipip_ol(const struct mlxsw_sp *mlxsw_sp, |
|---|
| 402 | 656 | const struct net_device *dev); |
|---|
| 403 | | -bool mlxsw_sp_netdev_is_ipip_ul(const struct mlxsw_sp *mlxsw_sp, |
|---|
| 657 | +bool mlxsw_sp_netdev_is_ipip_ul(struct mlxsw_sp *mlxsw_sp, |
|---|
| 404 | 658 | const struct net_device *dev); |
|---|
| 405 | 659 | int mlxsw_sp_netdevice_ipip_ol_event(struct mlxsw_sp *mlxsw_sp, |
|---|
| 406 | 660 | struct net_device *l3_dev, |
|---|
| .. | .. |
|---|
| 413 | 667 | struct netdev_notifier_info *info); |
|---|
| 414 | 668 | void |
|---|
| 415 | 669 | mlxsw_sp_port_vlan_router_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan); |
|---|
| 416 | | -void mlxsw_sp_rif_destroy(struct mlxsw_sp_rif *rif); |
|---|
| 417 | 670 | void mlxsw_sp_rif_destroy_by_dev(struct mlxsw_sp *mlxsw_sp, |
|---|
| 418 | 671 | struct net_device *dev); |
|---|
| 672 | +bool mlxsw_sp_rif_exists(struct mlxsw_sp *mlxsw_sp, |
|---|
| 673 | + const struct net_device *dev); |
|---|
| 674 | +u16 mlxsw_sp_rif_vid(struct mlxsw_sp *mlxsw_sp, const struct net_device *dev); |
|---|
| 675 | +u8 mlxsw_sp_router_port(const struct mlxsw_sp *mlxsw_sp); |
|---|
| 676 | +int mlxsw_sp_router_nve_promote_decap(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id, |
|---|
| 677 | + enum mlxsw_sp_l3proto ul_proto, |
|---|
| 678 | + const union mlxsw_sp_l3addr *ul_sip, |
|---|
| 679 | + u32 tunnel_index); |
|---|
| 680 | +void mlxsw_sp_router_nve_demote_decap(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id, |
|---|
| 681 | + enum mlxsw_sp_l3proto ul_proto, |
|---|
| 682 | + const union mlxsw_sp_l3addr *ul_sip); |
|---|
| 683 | +int mlxsw_sp_router_tb_id_vr_id(struct mlxsw_sp *mlxsw_sp, u32 tb_id, |
|---|
| 684 | + u16 *vr_id); |
|---|
| 685 | +int mlxsw_sp_router_ul_rif_get(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id, |
|---|
| 686 | + u16 *ul_rif_index); |
|---|
| 687 | +void mlxsw_sp_router_ul_rif_put(struct mlxsw_sp *mlxsw_sp, u16 ul_rif_index); |
|---|
| 419 | 688 | |
|---|
| 420 | 689 | /* spectrum_kvdl.c */ |
|---|
| 421 | 690 | enum mlxsw_sp_kvdl_entry_type { |
|---|
| .. | .. |
|---|
| 423 | 692 | MLXSW_SP_KVDL_ENTRY_TYPE_ACTSET, |
|---|
| 424 | 693 | MLXSW_SP_KVDL_ENTRY_TYPE_PBS, |
|---|
| 425 | 694 | MLXSW_SP_KVDL_ENTRY_TYPE_MCRIGR, |
|---|
| 695 | + MLXSW_SP_KVDL_ENTRY_TYPE_TNUMT, |
|---|
| 426 | 696 | }; |
|---|
| 427 | 697 | |
|---|
| 428 | 698 | static inline unsigned int |
|---|
| 429 | 699 | mlxsw_sp_kvdl_entry_size(enum mlxsw_sp_kvdl_entry_type type) |
|---|
| 430 | 700 | { |
|---|
| 431 | 701 | switch (type) { |
|---|
| 432 | | - case MLXSW_SP_KVDL_ENTRY_TYPE_ADJ: /* fall through */ |
|---|
| 433 | | - case MLXSW_SP_KVDL_ENTRY_TYPE_ACTSET: /* fall through */ |
|---|
| 434 | | - case MLXSW_SP_KVDL_ENTRY_TYPE_PBS: /* fall through */ |
|---|
| 435 | | - case MLXSW_SP_KVDL_ENTRY_TYPE_MCRIGR: /* fall through */ |
|---|
| 702 | + case MLXSW_SP_KVDL_ENTRY_TYPE_ADJ: |
|---|
| 703 | + case MLXSW_SP_KVDL_ENTRY_TYPE_ACTSET: |
|---|
| 704 | + case MLXSW_SP_KVDL_ENTRY_TYPE_PBS: |
|---|
| 705 | + case MLXSW_SP_KVDL_ENTRY_TYPE_MCRIGR: |
|---|
| 706 | + case MLXSW_SP_KVDL_ENTRY_TYPE_TNUMT: |
|---|
| 436 | 707 | default: |
|---|
| 437 | 708 | return 1; |
|---|
| 438 | 709 | } |
|---|
| .. | .. |
|---|
| 479 | 750 | unsigned int priority; |
|---|
| 480 | 751 | struct mlxsw_afk_element_values values; |
|---|
| 481 | 752 | struct mlxsw_afa_block *act_block; |
|---|
| 753 | + u8 action_created:1, |
|---|
| 754 | + ingress_bind_blocker:1, |
|---|
| 755 | + egress_bind_blocker:1, |
|---|
| 756 | + counter_valid:1, |
|---|
| 757 | + policer_index_valid:1; |
|---|
| 482 | 758 | unsigned int counter_index; |
|---|
| 759 | + u16 policer_index; |
|---|
| 483 | 760 | }; |
|---|
| 484 | 761 | |
|---|
| 485 | | -struct mlxsw_sp_acl_block; |
|---|
| 486 | | -struct mlxsw_sp_acl_ruleset; |
|---|
| 762 | +/* spectrum_flow.c */ |
|---|
| 763 | +struct mlxsw_sp_flow_block { |
|---|
| 764 | + struct list_head binding_list; |
|---|
| 765 | + struct { |
|---|
| 766 | + struct list_head list; |
|---|
| 767 | + unsigned int min_prio; |
|---|
| 768 | + unsigned int max_prio; |
|---|
| 769 | + } mall; |
|---|
| 770 | + struct mlxsw_sp_acl_ruleset *ruleset_zero; |
|---|
| 771 | + struct mlxsw_sp *mlxsw_sp; |
|---|
| 772 | + unsigned int rule_count; |
|---|
| 773 | + unsigned int disable_count; |
|---|
| 774 | + unsigned int ingress_blocker_rule_count; |
|---|
| 775 | + unsigned int egress_blocker_rule_count; |
|---|
| 776 | + unsigned int ingress_binding_count; |
|---|
| 777 | + unsigned int egress_binding_count; |
|---|
| 778 | + struct net *net; |
|---|
| 779 | +}; |
|---|
| 780 | + |
|---|
| 781 | +struct mlxsw_sp_flow_block_binding { |
|---|
| 782 | + struct list_head list; |
|---|
| 783 | + struct mlxsw_sp_port *mlxsw_sp_port; |
|---|
| 784 | + bool ingress; |
|---|
| 785 | +}; |
|---|
| 786 | + |
|---|
| 787 | +static inline struct mlxsw_sp * |
|---|
| 788 | +mlxsw_sp_flow_block_mlxsw_sp(struct mlxsw_sp_flow_block *block) |
|---|
| 789 | +{ |
|---|
| 790 | + return block->mlxsw_sp; |
|---|
| 791 | +} |
|---|
| 792 | + |
|---|
| 793 | +static inline unsigned int |
|---|
| 794 | +mlxsw_sp_flow_block_rule_count(const struct mlxsw_sp_flow_block *block) |
|---|
| 795 | +{ |
|---|
| 796 | + return block ? block->rule_count : 0; |
|---|
| 797 | +} |
|---|
| 798 | + |
|---|
| 799 | +static inline void |
|---|
| 800 | +mlxsw_sp_flow_block_disable_inc(struct mlxsw_sp_flow_block *block) |
|---|
| 801 | +{ |
|---|
| 802 | + if (block) |
|---|
| 803 | + block->disable_count++; |
|---|
| 804 | +} |
|---|
| 805 | + |
|---|
| 806 | +static inline void |
|---|
| 807 | +mlxsw_sp_flow_block_disable_dec(struct mlxsw_sp_flow_block *block) |
|---|
| 808 | +{ |
|---|
| 809 | + if (block) |
|---|
| 810 | + block->disable_count--; |
|---|
| 811 | +} |
|---|
| 812 | + |
|---|
| 813 | +static inline bool |
|---|
| 814 | +mlxsw_sp_flow_block_disabled(const struct mlxsw_sp_flow_block *block) |
|---|
| 815 | +{ |
|---|
| 816 | + return block->disable_count; |
|---|
| 817 | +} |
|---|
| 818 | + |
|---|
| 819 | +static inline bool |
|---|
| 820 | +mlxsw_sp_flow_block_is_egress_bound(const struct mlxsw_sp_flow_block *block) |
|---|
| 821 | +{ |
|---|
| 822 | + return block->egress_binding_count; |
|---|
| 823 | +} |
|---|
| 824 | + |
|---|
| 825 | +static inline bool |
|---|
| 826 | +mlxsw_sp_flow_block_is_ingress_bound(const struct mlxsw_sp_flow_block *block) |
|---|
| 827 | +{ |
|---|
| 828 | + return block->ingress_binding_count; |
|---|
| 829 | +} |
|---|
| 830 | + |
|---|
| 831 | +static inline bool |
|---|
| 832 | +mlxsw_sp_flow_block_is_mixed_bound(const struct mlxsw_sp_flow_block *block) |
|---|
| 833 | +{ |
|---|
| 834 | + return block->ingress_binding_count && block->egress_binding_count; |
|---|
| 835 | +} |
|---|
| 836 | + |
|---|
| 837 | +struct mlxsw_sp_flow_block *mlxsw_sp_flow_block_create(struct mlxsw_sp *mlxsw_sp, |
|---|
| 838 | + struct net *net); |
|---|
| 839 | +void mlxsw_sp_flow_block_destroy(struct mlxsw_sp_flow_block *block); |
|---|
| 840 | +int mlxsw_sp_setup_tc_block_clsact(struct mlxsw_sp_port *mlxsw_sp_port, |
|---|
| 841 | + struct flow_block_offload *f, |
|---|
| 842 | + bool ingress); |
|---|
| 487 | 843 | |
|---|
| 488 | 844 | /* spectrum_acl.c */ |
|---|
| 845 | +struct mlxsw_sp_acl_ruleset; |
|---|
| 846 | + |
|---|
| 489 | 847 | enum mlxsw_sp_acl_profile { |
|---|
| 490 | 848 | MLXSW_SP_ACL_PROFILE_FLOWER, |
|---|
| 849 | + MLXSW_SP_ACL_PROFILE_MR, |
|---|
| 491 | 850 | }; |
|---|
| 492 | 851 | |
|---|
| 493 | 852 | struct mlxsw_afk *mlxsw_sp_acl_afk(struct mlxsw_sp_acl *acl); |
|---|
| 494 | | -struct mlxsw_sp *mlxsw_sp_acl_block_mlxsw_sp(struct mlxsw_sp_acl_block *block); |
|---|
| 495 | | -unsigned int mlxsw_sp_acl_block_rule_count(struct mlxsw_sp_acl_block *block); |
|---|
| 496 | | -void mlxsw_sp_acl_block_disable_inc(struct mlxsw_sp_acl_block *block); |
|---|
| 497 | | -void mlxsw_sp_acl_block_disable_dec(struct mlxsw_sp_acl_block *block); |
|---|
| 498 | | -bool mlxsw_sp_acl_block_disabled(struct mlxsw_sp_acl_block *block); |
|---|
| 499 | | -struct mlxsw_sp_acl_block *mlxsw_sp_acl_block_create(struct mlxsw_sp *mlxsw_sp, |
|---|
| 500 | | - struct net *net); |
|---|
| 501 | | -void mlxsw_sp_acl_block_destroy(struct mlxsw_sp_acl_block *block); |
|---|
| 502 | | -int mlxsw_sp_acl_block_bind(struct mlxsw_sp *mlxsw_sp, |
|---|
| 503 | | - struct mlxsw_sp_acl_block *block, |
|---|
| 504 | | - struct mlxsw_sp_port *mlxsw_sp_port, |
|---|
| 505 | | - bool ingress); |
|---|
| 506 | | -int mlxsw_sp_acl_block_unbind(struct mlxsw_sp *mlxsw_sp, |
|---|
| 507 | | - struct mlxsw_sp_acl_block *block, |
|---|
| 508 | | - struct mlxsw_sp_port *mlxsw_sp_port, |
|---|
| 509 | | - bool ingress); |
|---|
| 510 | | -bool mlxsw_sp_acl_block_is_egress_bound(struct mlxsw_sp_acl_block *block); |
|---|
| 853 | + |
|---|
| 854 | +int mlxsw_sp_acl_ruleset_bind(struct mlxsw_sp *mlxsw_sp, |
|---|
| 855 | + struct mlxsw_sp_flow_block *block, |
|---|
| 856 | + struct mlxsw_sp_flow_block_binding *binding); |
|---|
| 857 | +void mlxsw_sp_acl_ruleset_unbind(struct mlxsw_sp *mlxsw_sp, |
|---|
| 858 | + struct mlxsw_sp_flow_block *block, |
|---|
| 859 | + struct mlxsw_sp_flow_block_binding *binding); |
|---|
| 511 | 860 | struct mlxsw_sp_acl_ruleset * |
|---|
| 512 | 861 | mlxsw_sp_acl_ruleset_lookup(struct mlxsw_sp *mlxsw_sp, |
|---|
| 513 | | - struct mlxsw_sp_acl_block *block, u32 chain_index, |
|---|
| 862 | + struct mlxsw_sp_flow_block *block, u32 chain_index, |
|---|
| 514 | 863 | enum mlxsw_sp_acl_profile profile); |
|---|
| 515 | 864 | struct mlxsw_sp_acl_ruleset * |
|---|
| 516 | 865 | mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp, |
|---|
| 517 | | - struct mlxsw_sp_acl_block *block, u32 chain_index, |
|---|
| 866 | + struct mlxsw_sp_flow_block *block, u32 chain_index, |
|---|
| 518 | 867 | enum mlxsw_sp_acl_profile profile, |
|---|
| 519 | 868 | struct mlxsw_afk_element_usage *tmplt_elusage); |
|---|
| 520 | 869 | void mlxsw_sp_acl_ruleset_put(struct mlxsw_sp *mlxsw_sp, |
|---|
| 521 | 870 | struct mlxsw_sp_acl_ruleset *ruleset); |
|---|
| 522 | 871 | u16 mlxsw_sp_acl_ruleset_group_id(struct mlxsw_sp_acl_ruleset *ruleset); |
|---|
| 872 | +void mlxsw_sp_acl_ruleset_prio_get(struct mlxsw_sp_acl_ruleset *ruleset, |
|---|
| 873 | + unsigned int *p_min_prio, |
|---|
| 874 | + unsigned int *p_max_prio); |
|---|
| 523 | 875 | |
|---|
| 524 | 876 | struct mlxsw_sp_acl_rule_info * |
|---|
| 525 | | -mlxsw_sp_acl_rulei_create(struct mlxsw_sp_acl *acl); |
|---|
| 877 | +mlxsw_sp_acl_rulei_create(struct mlxsw_sp_acl *acl, |
|---|
| 878 | + struct mlxsw_afa_block *afa_block); |
|---|
| 526 | 879 | void mlxsw_sp_acl_rulei_destroy(struct mlxsw_sp_acl_rule_info *rulei); |
|---|
| 527 | 880 | int mlxsw_sp_acl_rulei_commit(struct mlxsw_sp_acl_rule_info *rulei); |
|---|
| 528 | 881 | void mlxsw_sp_acl_rulei_priority(struct mlxsw_sp_acl_rule_info *rulei, |
|---|
| .. | .. |
|---|
| 538 | 891 | int mlxsw_sp_acl_rulei_act_jump(struct mlxsw_sp_acl_rule_info *rulei, |
|---|
| 539 | 892 | u16 group_id); |
|---|
| 540 | 893 | int mlxsw_sp_acl_rulei_act_terminate(struct mlxsw_sp_acl_rule_info *rulei); |
|---|
| 541 | | -int mlxsw_sp_acl_rulei_act_drop(struct mlxsw_sp_acl_rule_info *rulei); |
|---|
| 894 | +int mlxsw_sp_acl_rulei_act_drop(struct mlxsw_sp_acl_rule_info *rulei, |
|---|
| 895 | + bool ingress, |
|---|
| 896 | + const struct flow_action_cookie *fa_cookie, |
|---|
| 897 | + struct netlink_ext_ack *extack); |
|---|
| 542 | 898 | int mlxsw_sp_acl_rulei_act_trap(struct mlxsw_sp_acl_rule_info *rulei); |
|---|
| 543 | 899 | int mlxsw_sp_acl_rulei_act_mirror(struct mlxsw_sp *mlxsw_sp, |
|---|
| 544 | 900 | struct mlxsw_sp_acl_rule_info *rulei, |
|---|
| 545 | | - struct mlxsw_sp_acl_block *block, |
|---|
| 901 | + struct mlxsw_sp_flow_block *block, |
|---|
| 546 | 902 | struct net_device *out_dev, |
|---|
| 547 | 903 | struct netlink_ext_ack *extack); |
|---|
| 548 | 904 | int mlxsw_sp_acl_rulei_act_fwd(struct mlxsw_sp *mlxsw_sp, |
|---|
| .. | .. |
|---|
| 553 | 909 | struct mlxsw_sp_acl_rule_info *rulei, |
|---|
| 554 | 910 | u32 action, u16 vid, u16 proto, u8 prio, |
|---|
| 555 | 911 | struct netlink_ext_ack *extack); |
|---|
| 912 | +int mlxsw_sp_acl_rulei_act_priority(struct mlxsw_sp *mlxsw_sp, |
|---|
| 913 | + struct mlxsw_sp_acl_rule_info *rulei, |
|---|
| 914 | + u32 prio, struct netlink_ext_ack *extack); |
|---|
| 915 | +int mlxsw_sp_acl_rulei_act_mangle(struct mlxsw_sp *mlxsw_sp, |
|---|
| 916 | + struct mlxsw_sp_acl_rule_info *rulei, |
|---|
| 917 | + enum flow_action_mangle_base htype, |
|---|
| 918 | + u32 offset, u32 mask, u32 val, |
|---|
| 919 | + struct netlink_ext_ack *extack); |
|---|
| 920 | +int mlxsw_sp_acl_rulei_act_police(struct mlxsw_sp *mlxsw_sp, |
|---|
| 921 | + struct mlxsw_sp_acl_rule_info *rulei, |
|---|
| 922 | + u32 index, u64 rate_bytes_ps, |
|---|
| 923 | + u32 burst, struct netlink_ext_ack *extack); |
|---|
| 556 | 924 | int mlxsw_sp_acl_rulei_act_count(struct mlxsw_sp *mlxsw_sp, |
|---|
| 557 | 925 | struct mlxsw_sp_acl_rule_info *rulei, |
|---|
| 558 | 926 | struct netlink_ext_ack *extack); |
|---|
| .. | .. |
|---|
| 566 | 934 | mlxsw_sp_acl_rule_create(struct mlxsw_sp *mlxsw_sp, |
|---|
| 567 | 935 | struct mlxsw_sp_acl_ruleset *ruleset, |
|---|
| 568 | 936 | unsigned long cookie, |
|---|
| 937 | + struct mlxsw_afa_block *afa_block, |
|---|
| 569 | 938 | struct netlink_ext_ack *extack); |
|---|
| 570 | 939 | void mlxsw_sp_acl_rule_destroy(struct mlxsw_sp *mlxsw_sp, |
|---|
| 571 | 940 | struct mlxsw_sp_acl_rule *rule); |
|---|
| .. | .. |
|---|
| 573 | 942 | struct mlxsw_sp_acl_rule *rule); |
|---|
| 574 | 943 | void mlxsw_sp_acl_rule_del(struct mlxsw_sp *mlxsw_sp, |
|---|
| 575 | 944 | struct mlxsw_sp_acl_rule *rule); |
|---|
| 945 | +int mlxsw_sp_acl_rule_action_replace(struct mlxsw_sp *mlxsw_sp, |
|---|
| 946 | + struct mlxsw_sp_acl_rule *rule, |
|---|
| 947 | + struct mlxsw_afa_block *afa_block); |
|---|
| 576 | 948 | struct mlxsw_sp_acl_rule * |
|---|
| 577 | 949 | mlxsw_sp_acl_rule_lookup(struct mlxsw_sp *mlxsw_sp, |
|---|
| 578 | 950 | struct mlxsw_sp_acl_ruleset *ruleset, |
|---|
| .. | .. |
|---|
| 581 | 953 | mlxsw_sp_acl_rule_rulei(struct mlxsw_sp_acl_rule *rule); |
|---|
| 582 | 954 | int mlxsw_sp_acl_rule_get_stats(struct mlxsw_sp *mlxsw_sp, |
|---|
| 583 | 955 | struct mlxsw_sp_acl_rule *rule, |
|---|
| 584 | | - u64 *packets, u64 *bytes, u64 *last_use); |
|---|
| 956 | + u64 *packets, u64 *bytes, u64 *drops, |
|---|
| 957 | + u64 *last_use, |
|---|
| 958 | + enum flow_action_hw_stats *used_hw_stats); |
|---|
| 585 | 959 | |
|---|
| 586 | 960 | struct mlxsw_sp_fid *mlxsw_sp_acl_dummy_fid(struct mlxsw_sp *mlxsw_sp); |
|---|
| 587 | 961 | |
|---|
| 962 | +static inline const struct flow_action_cookie * |
|---|
| 963 | +mlxsw_sp_acl_act_cookie_lookup(struct mlxsw_sp *mlxsw_sp, u32 cookie_index) |
|---|
| 964 | +{ |
|---|
| 965 | + return mlxsw_afa_cookie_lookup(mlxsw_sp->afa, cookie_index); |
|---|
| 966 | +} |
|---|
| 967 | + |
|---|
| 588 | 968 | int mlxsw_sp_acl_init(struct mlxsw_sp *mlxsw_sp); |
|---|
| 589 | 969 | void mlxsw_sp_acl_fini(struct mlxsw_sp *mlxsw_sp); |
|---|
| 970 | +u32 mlxsw_sp_acl_region_rehash_intrvl_get(struct mlxsw_sp *mlxsw_sp); |
|---|
| 971 | +int mlxsw_sp_acl_region_rehash_intrvl_set(struct mlxsw_sp *mlxsw_sp, u32 val); |
|---|
| 972 | + |
|---|
| 973 | +struct mlxsw_sp_acl_mangle_action; |
|---|
| 974 | + |
|---|
| 975 | +struct mlxsw_sp_acl_rulei_ops { |
|---|
| 976 | + int (*act_mangle_field)(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_acl_rule_info *rulei, |
|---|
| 977 | + struct mlxsw_sp_acl_mangle_action *mact, u32 val, |
|---|
| 978 | + struct netlink_ext_ack *extack); |
|---|
| 979 | +}; |
|---|
| 980 | + |
|---|
| 981 | +extern struct mlxsw_sp_acl_rulei_ops mlxsw_sp1_acl_rulei_ops; |
|---|
| 982 | +extern struct mlxsw_sp_acl_rulei_ops mlxsw_sp2_acl_rulei_ops; |
|---|
| 590 | 983 | |
|---|
| 591 | 984 | /* spectrum_acl_tcam.c */ |
|---|
| 592 | 985 | struct mlxsw_sp_acl_tcam; |
|---|
| .. | .. |
|---|
| 601 | 994 | size_t region_priv_size; |
|---|
| 602 | 995 | int (*region_init)(struct mlxsw_sp *mlxsw_sp, void *region_priv, |
|---|
| 603 | 996 | void *tcam_priv, |
|---|
| 604 | | - struct mlxsw_sp_acl_tcam_region *region); |
|---|
| 997 | + struct mlxsw_sp_acl_tcam_region *region, |
|---|
| 998 | + void *hints_priv); |
|---|
| 605 | 999 | void (*region_fini)(struct mlxsw_sp *mlxsw_sp, void *region_priv); |
|---|
| 606 | 1000 | int (*region_associate)(struct mlxsw_sp *mlxsw_sp, |
|---|
| 607 | 1001 | struct mlxsw_sp_acl_tcam_region *region); |
|---|
| 1002 | + void * (*region_rehash_hints_get)(void *region_priv); |
|---|
| 1003 | + void (*region_rehash_hints_put)(void *hints_priv); |
|---|
| 608 | 1004 | size_t chunk_priv_size; |
|---|
| 609 | 1005 | void (*chunk_init)(void *region_priv, void *chunk_priv, |
|---|
| 610 | 1006 | unsigned int priority); |
|---|
| .. | .. |
|---|
| 617 | 1013 | void (*entry_del)(struct mlxsw_sp *mlxsw_sp, |
|---|
| 618 | 1014 | void *region_priv, void *chunk_priv, |
|---|
| 619 | 1015 | void *entry_priv); |
|---|
| 1016 | + int (*entry_action_replace)(struct mlxsw_sp *mlxsw_sp, |
|---|
| 1017 | + void *region_priv, void *entry_priv, |
|---|
| 1018 | + struct mlxsw_sp_acl_rule_info *rulei); |
|---|
| 620 | 1019 | int (*entry_activity_get)(struct mlxsw_sp *mlxsw_sp, |
|---|
| 621 | 1020 | void *region_priv, void *entry_priv, |
|---|
| 622 | 1021 | bool *activity); |
|---|
| .. | .. |
|---|
| 636 | 1035 | extern const struct mlxsw_afk_ops mlxsw_sp1_afk_ops; |
|---|
| 637 | 1036 | extern const struct mlxsw_afk_ops mlxsw_sp2_afk_ops; |
|---|
| 638 | 1037 | |
|---|
| 1038 | +/* spectrum_matchall.c */ |
|---|
| 1039 | +enum mlxsw_sp_mall_action_type { |
|---|
| 1040 | + MLXSW_SP_MALL_ACTION_TYPE_MIRROR, |
|---|
| 1041 | + MLXSW_SP_MALL_ACTION_TYPE_SAMPLE, |
|---|
| 1042 | + MLXSW_SP_MALL_ACTION_TYPE_TRAP, |
|---|
| 1043 | +}; |
|---|
| 1044 | + |
|---|
| 1045 | +struct mlxsw_sp_mall_mirror_entry { |
|---|
| 1046 | + const struct net_device *to_dev; |
|---|
| 1047 | + int span_id; |
|---|
| 1048 | +}; |
|---|
| 1049 | + |
|---|
| 1050 | +struct mlxsw_sp_mall_trap_entry { |
|---|
| 1051 | + int span_id; |
|---|
| 1052 | +}; |
|---|
| 1053 | + |
|---|
| 1054 | +struct mlxsw_sp_mall_entry { |
|---|
| 1055 | + struct list_head list; |
|---|
| 1056 | + unsigned long cookie; |
|---|
| 1057 | + unsigned int priority; |
|---|
| 1058 | + enum mlxsw_sp_mall_action_type type; |
|---|
| 1059 | + bool ingress; |
|---|
| 1060 | + union { |
|---|
| 1061 | + struct mlxsw_sp_mall_mirror_entry mirror; |
|---|
| 1062 | + struct mlxsw_sp_mall_trap_entry trap; |
|---|
| 1063 | + struct mlxsw_sp_port_sample sample; |
|---|
| 1064 | + }; |
|---|
| 1065 | + struct rcu_head rcu; |
|---|
| 1066 | +}; |
|---|
| 1067 | + |
|---|
| 1068 | +int mlxsw_sp_mall_replace(struct mlxsw_sp *mlxsw_sp, |
|---|
| 1069 | + struct mlxsw_sp_flow_block *block, |
|---|
| 1070 | + struct tc_cls_matchall_offload *f); |
|---|
| 1071 | +void mlxsw_sp_mall_destroy(struct mlxsw_sp_flow_block *block, |
|---|
| 1072 | + struct tc_cls_matchall_offload *f); |
|---|
| 1073 | +int mlxsw_sp_mall_port_bind(struct mlxsw_sp_flow_block *block, |
|---|
| 1074 | + struct mlxsw_sp_port *mlxsw_sp_port); |
|---|
| 1075 | +void mlxsw_sp_mall_port_unbind(struct mlxsw_sp_flow_block *block, |
|---|
| 1076 | + struct mlxsw_sp_port *mlxsw_sp_port); |
|---|
| 1077 | +int mlxsw_sp_mall_prio_get(struct mlxsw_sp_flow_block *block, u32 chain_index, |
|---|
| 1078 | + unsigned int *p_min_prio, unsigned int *p_max_prio); |
|---|
| 1079 | + |
|---|
| 639 | 1080 | /* spectrum_flower.c */ |
|---|
| 640 | 1081 | int mlxsw_sp_flower_replace(struct mlxsw_sp *mlxsw_sp, |
|---|
| 641 | | - struct mlxsw_sp_acl_block *block, |
|---|
| 642 | | - struct tc_cls_flower_offload *f); |
|---|
| 1082 | + struct mlxsw_sp_flow_block *block, |
|---|
| 1083 | + struct flow_cls_offload *f); |
|---|
| 643 | 1084 | void mlxsw_sp_flower_destroy(struct mlxsw_sp *mlxsw_sp, |
|---|
| 644 | | - struct mlxsw_sp_acl_block *block, |
|---|
| 645 | | - struct tc_cls_flower_offload *f); |
|---|
| 1085 | + struct mlxsw_sp_flow_block *block, |
|---|
| 1086 | + struct flow_cls_offload *f); |
|---|
| 646 | 1087 | int mlxsw_sp_flower_stats(struct mlxsw_sp *mlxsw_sp, |
|---|
| 647 | | - struct mlxsw_sp_acl_block *block, |
|---|
| 648 | | - struct tc_cls_flower_offload *f); |
|---|
| 1088 | + struct mlxsw_sp_flow_block *block, |
|---|
| 1089 | + struct flow_cls_offload *f); |
|---|
| 649 | 1090 | int mlxsw_sp_flower_tmplt_create(struct mlxsw_sp *mlxsw_sp, |
|---|
| 650 | | - struct mlxsw_sp_acl_block *block, |
|---|
| 651 | | - struct tc_cls_flower_offload *f); |
|---|
| 1091 | + struct mlxsw_sp_flow_block *block, |
|---|
| 1092 | + struct flow_cls_offload *f); |
|---|
| 652 | 1093 | void mlxsw_sp_flower_tmplt_destroy(struct mlxsw_sp *mlxsw_sp, |
|---|
| 653 | | - struct mlxsw_sp_acl_block *block, |
|---|
| 654 | | - struct tc_cls_flower_offload *f); |
|---|
| 1094 | + struct mlxsw_sp_flow_block *block, |
|---|
| 1095 | + struct flow_cls_offload *f); |
|---|
| 1096 | +int mlxsw_sp_flower_prio_get(struct mlxsw_sp *mlxsw_sp, |
|---|
| 1097 | + struct mlxsw_sp_flow_block *block, |
|---|
| 1098 | + u32 chain_index, unsigned int *p_min_prio, |
|---|
| 1099 | + unsigned int *p_max_prio); |
|---|
| 655 | 1100 | |
|---|
| 656 | 1101 | /* spectrum_qdisc.c */ |
|---|
| 657 | 1102 | int mlxsw_sp_tc_qdisc_init(struct mlxsw_sp_port *mlxsw_sp_port); |
|---|
| .. | .. |
|---|
| 660 | 1105 | struct tc_red_qopt_offload *p); |
|---|
| 661 | 1106 | int mlxsw_sp_setup_tc_prio(struct mlxsw_sp_port *mlxsw_sp_port, |
|---|
| 662 | 1107 | struct tc_prio_qopt_offload *p); |
|---|
| 1108 | +int mlxsw_sp_setup_tc_ets(struct mlxsw_sp_port *mlxsw_sp_port, |
|---|
| 1109 | + struct tc_ets_qopt_offload *p); |
|---|
| 1110 | +int mlxsw_sp_setup_tc_tbf(struct mlxsw_sp_port *mlxsw_sp_port, |
|---|
| 1111 | + struct tc_tbf_qopt_offload *p); |
|---|
| 1112 | +int mlxsw_sp_setup_tc_fifo(struct mlxsw_sp_port *mlxsw_sp_port, |
|---|
| 1113 | + struct tc_fifo_qopt_offload *p); |
|---|
| 1114 | +int mlxsw_sp_setup_tc_block_qevent_early_drop(struct mlxsw_sp_port *mlxsw_sp_port, |
|---|
| 1115 | + struct flow_block_offload *f); |
|---|
| 663 | 1116 | |
|---|
| 664 | 1117 | /* spectrum_fid.c */ |
|---|
| 1118 | +bool mlxsw_sp_fid_is_dummy(struct mlxsw_sp *mlxsw_sp, u16 fid_index); |
|---|
| 1119 | +bool mlxsw_sp_fid_lag_vid_valid(const struct mlxsw_sp_fid *fid); |
|---|
| 1120 | +struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_index(struct mlxsw_sp *mlxsw_sp, |
|---|
| 1121 | + u16 fid_index); |
|---|
| 1122 | +int mlxsw_sp_fid_nve_ifindex(const struct mlxsw_sp_fid *fid, int *nve_ifindex); |
|---|
| 1123 | +int mlxsw_sp_fid_nve_type(const struct mlxsw_sp_fid *fid, |
|---|
| 1124 | + enum mlxsw_sp_nve_type *p_type); |
|---|
| 1125 | +struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_vni(struct mlxsw_sp *mlxsw_sp, |
|---|
| 1126 | + __be32 vni); |
|---|
| 1127 | +int mlxsw_sp_fid_vni(const struct mlxsw_sp_fid *fid, __be32 *vni); |
|---|
| 1128 | +int mlxsw_sp_fid_nve_flood_index_set(struct mlxsw_sp_fid *fid, |
|---|
| 1129 | + u32 nve_flood_index); |
|---|
| 1130 | +void mlxsw_sp_fid_nve_flood_index_clear(struct mlxsw_sp_fid *fid); |
|---|
| 1131 | +bool mlxsw_sp_fid_nve_flood_index_is_set(const struct mlxsw_sp_fid *fid); |
|---|
| 1132 | +int mlxsw_sp_fid_vni_set(struct mlxsw_sp_fid *fid, enum mlxsw_sp_nve_type type, |
|---|
| 1133 | + __be32 vni, int nve_ifindex); |
|---|
| 1134 | +void mlxsw_sp_fid_vni_clear(struct mlxsw_sp_fid *fid); |
|---|
| 1135 | +bool mlxsw_sp_fid_vni_is_set(const struct mlxsw_sp_fid *fid); |
|---|
| 1136 | +void mlxsw_sp_fid_fdb_clear_offload(const struct mlxsw_sp_fid *fid, |
|---|
| 1137 | + const struct net_device *nve_dev); |
|---|
| 665 | 1138 | int mlxsw_sp_fid_flood_set(struct mlxsw_sp_fid *fid, |
|---|
| 666 | 1139 | enum mlxsw_sp_flood_type packet_type, u8 local_port, |
|---|
| 667 | 1140 | bool member); |
|---|
| .. | .. |
|---|
| 669 | 1142 | struct mlxsw_sp_port *mlxsw_sp_port, u16 vid); |
|---|
| 670 | 1143 | void mlxsw_sp_fid_port_vid_unmap(struct mlxsw_sp_fid *fid, |
|---|
| 671 | 1144 | struct mlxsw_sp_port *mlxsw_sp_port, u16 vid); |
|---|
| 672 | | -enum mlxsw_sp_rif_type mlxsw_sp_fid_rif_type(const struct mlxsw_sp_fid *fid); |
|---|
| 673 | 1145 | u16 mlxsw_sp_fid_index(const struct mlxsw_sp_fid *fid); |
|---|
| 674 | 1146 | enum mlxsw_sp_fid_type mlxsw_sp_fid_type(const struct mlxsw_sp_fid *fid); |
|---|
| 675 | 1147 | void mlxsw_sp_fid_rif_set(struct mlxsw_sp_fid *fid, struct mlxsw_sp_rif *rif); |
|---|
| 1148 | +struct mlxsw_sp_rif *mlxsw_sp_fid_rif(const struct mlxsw_sp_fid *fid); |
|---|
| 676 | 1149 | enum mlxsw_sp_rif_type |
|---|
| 677 | 1150 | mlxsw_sp_fid_type_rif_type(const struct mlxsw_sp *mlxsw_sp, |
|---|
| 678 | 1151 | enum mlxsw_sp_fid_type type); |
|---|
| .. | .. |
|---|
| 680 | 1153 | struct mlxsw_sp_fid *mlxsw_sp_fid_8021q_get(struct mlxsw_sp *mlxsw_sp, u16 vid); |
|---|
| 681 | 1154 | struct mlxsw_sp_fid *mlxsw_sp_fid_8021d_get(struct mlxsw_sp *mlxsw_sp, |
|---|
| 682 | 1155 | int br_ifindex); |
|---|
| 1156 | +struct mlxsw_sp_fid *mlxsw_sp_fid_8021q_lookup(struct mlxsw_sp *mlxsw_sp, |
|---|
| 1157 | + u16 vid); |
|---|
| 1158 | +struct mlxsw_sp_fid *mlxsw_sp_fid_8021d_lookup(struct mlxsw_sp *mlxsw_sp, |
|---|
| 1159 | + int br_ifindex); |
|---|
| 683 | 1160 | struct mlxsw_sp_fid *mlxsw_sp_fid_rfid_get(struct mlxsw_sp *mlxsw_sp, |
|---|
| 684 | 1161 | u16 rif_index); |
|---|
| 685 | 1162 | struct mlxsw_sp_fid *mlxsw_sp_fid_dummy_get(struct mlxsw_sp *mlxsw_sp); |
|---|
| .. | .. |
|---|
| 725 | 1202 | /* spectrum2_mr_tcam.c */ |
|---|
| 726 | 1203 | extern const struct mlxsw_sp_mr_tcam_ops mlxsw_sp2_mr_tcam_ops; |
|---|
| 727 | 1204 | |
|---|
| 1205 | +/* spectrum_nve.c */ |
|---|
| 1206 | +struct mlxsw_sp_nve_params { |
|---|
| 1207 | + enum mlxsw_sp_nve_type type; |
|---|
| 1208 | + __be32 vni; |
|---|
| 1209 | + const struct net_device *dev; |
|---|
| 1210 | +}; |
|---|
| 1211 | + |
|---|
| 1212 | +extern const struct mlxsw_sp_nve_ops *mlxsw_sp1_nve_ops_arr[]; |
|---|
| 1213 | +extern const struct mlxsw_sp_nve_ops *mlxsw_sp2_nve_ops_arr[]; |
|---|
| 1214 | + |
|---|
| 1215 | +int mlxsw_sp_nve_learned_ip_resolve(struct mlxsw_sp *mlxsw_sp, u32 uip, |
|---|
| 1216 | + enum mlxsw_sp_l3proto proto, |
|---|
| 1217 | + union mlxsw_sp_l3addr *addr); |
|---|
| 1218 | +int mlxsw_sp_nve_flood_ip_add(struct mlxsw_sp *mlxsw_sp, |
|---|
| 1219 | + struct mlxsw_sp_fid *fid, |
|---|
| 1220 | + enum mlxsw_sp_l3proto proto, |
|---|
| 1221 | + union mlxsw_sp_l3addr *addr); |
|---|
| 1222 | +void mlxsw_sp_nve_flood_ip_del(struct mlxsw_sp *mlxsw_sp, |
|---|
| 1223 | + struct mlxsw_sp_fid *fid, |
|---|
| 1224 | + enum mlxsw_sp_l3proto proto, |
|---|
| 1225 | + union mlxsw_sp_l3addr *addr); |
|---|
| 1226 | +int mlxsw_sp_nve_fid_enable(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_fid *fid, |
|---|
| 1227 | + struct mlxsw_sp_nve_params *params, |
|---|
| 1228 | + struct netlink_ext_ack *extack); |
|---|
| 1229 | +void mlxsw_sp_nve_fid_disable(struct mlxsw_sp *mlxsw_sp, |
|---|
| 1230 | + struct mlxsw_sp_fid *fid); |
|---|
| 1231 | +int mlxsw_sp_port_nve_init(struct mlxsw_sp_port *mlxsw_sp_port); |
|---|
| 1232 | +void mlxsw_sp_port_nve_fini(struct mlxsw_sp_port *mlxsw_sp_port); |
|---|
| 1233 | +int mlxsw_sp_nve_init(struct mlxsw_sp *mlxsw_sp); |
|---|
| 1234 | +void mlxsw_sp_nve_fini(struct mlxsw_sp *mlxsw_sp); |
|---|
| 1235 | + |
|---|
| 1236 | +/* spectrum_nve_vxlan.c */ |
|---|
| 1237 | +int mlxsw_sp_nve_inc_parsing_depth_get(struct mlxsw_sp *mlxsw_sp); |
|---|
| 1238 | +void mlxsw_sp_nve_inc_parsing_depth_put(struct mlxsw_sp *mlxsw_sp); |
|---|
| 1239 | + |
|---|
| 1240 | +/* spectrum_trap.c */ |
|---|
| 1241 | +int mlxsw_sp_devlink_traps_init(struct mlxsw_sp *mlxsw_sp); |
|---|
| 1242 | +void mlxsw_sp_devlink_traps_fini(struct mlxsw_sp *mlxsw_sp); |
|---|
| 1243 | +int mlxsw_sp_trap_init(struct mlxsw_core *mlxsw_core, |
|---|
| 1244 | + const struct devlink_trap *trap, void *trap_ctx); |
|---|
| 1245 | +void mlxsw_sp_trap_fini(struct mlxsw_core *mlxsw_core, |
|---|
| 1246 | + const struct devlink_trap *trap, void *trap_ctx); |
|---|
| 1247 | +int mlxsw_sp_trap_action_set(struct mlxsw_core *mlxsw_core, |
|---|
| 1248 | + const struct devlink_trap *trap, |
|---|
| 1249 | + enum devlink_trap_action action, |
|---|
| 1250 | + struct netlink_ext_ack *extack); |
|---|
| 1251 | +int mlxsw_sp_trap_group_init(struct mlxsw_core *mlxsw_core, |
|---|
| 1252 | + const struct devlink_trap_group *group); |
|---|
| 1253 | +int mlxsw_sp_trap_group_set(struct mlxsw_core *mlxsw_core, |
|---|
| 1254 | + const struct devlink_trap_group *group, |
|---|
| 1255 | + const struct devlink_trap_policer *policer, |
|---|
| 1256 | + struct netlink_ext_ack *extack); |
|---|
| 1257 | +int |
|---|
| 1258 | +mlxsw_sp_trap_policer_init(struct mlxsw_core *mlxsw_core, |
|---|
| 1259 | + const struct devlink_trap_policer *policer); |
|---|
| 1260 | +void mlxsw_sp_trap_policer_fini(struct mlxsw_core *mlxsw_core, |
|---|
| 1261 | + const struct devlink_trap_policer *policer); |
|---|
| 1262 | +int |
|---|
| 1263 | +mlxsw_sp_trap_policer_set(struct mlxsw_core *mlxsw_core, |
|---|
| 1264 | + const struct devlink_trap_policer *policer, |
|---|
| 1265 | + u64 rate, u64 burst, struct netlink_ext_ack *extack); |
|---|
| 1266 | +int |
|---|
| 1267 | +mlxsw_sp_trap_policer_counter_get(struct mlxsw_core *mlxsw_core, |
|---|
| 1268 | + const struct devlink_trap_policer *policer, |
|---|
| 1269 | + u64 *p_drops); |
|---|
| 1270 | +int mlxsw_sp_trap_group_policer_hw_id_get(struct mlxsw_sp *mlxsw_sp, u16 id, |
|---|
| 1271 | + bool *p_enabled, u16 *p_hw_id); |
|---|
| 1272 | + |
|---|
| 1273 | +static inline struct net *mlxsw_sp_net(struct mlxsw_sp *mlxsw_sp) |
|---|
| 1274 | +{ |
|---|
| 1275 | + return mlxsw_core_net(mlxsw_sp->core); |
|---|
| 1276 | +} |
|---|
| 1277 | + |
|---|
| 1278 | +/* spectrum_ethtool.c */ |
|---|
| 1279 | +extern const struct ethtool_ops mlxsw_sp_port_ethtool_ops; |
|---|
| 1280 | +extern const struct mlxsw_sp_port_type_speed_ops mlxsw_sp1_port_type_speed_ops; |
|---|
| 1281 | +extern const struct mlxsw_sp_port_type_speed_ops mlxsw_sp2_port_type_speed_ops; |
|---|
| 1282 | + |
|---|
| 1283 | +/* spectrum_policer.c */ |
|---|
| 1284 | +extern const struct mlxsw_sp_policer_core_ops mlxsw_sp1_policer_core_ops; |
|---|
| 1285 | +extern const struct mlxsw_sp_policer_core_ops mlxsw_sp2_policer_core_ops; |
|---|
| 1286 | + |
|---|
| 1287 | +enum mlxsw_sp_policer_type { |
|---|
| 1288 | + MLXSW_SP_POLICER_TYPE_SINGLE_RATE, |
|---|
| 1289 | + |
|---|
| 1290 | + __MLXSW_SP_POLICER_TYPE_MAX, |
|---|
| 1291 | + MLXSW_SP_POLICER_TYPE_MAX = __MLXSW_SP_POLICER_TYPE_MAX - 1, |
|---|
| 1292 | +}; |
|---|
| 1293 | + |
|---|
| 1294 | +struct mlxsw_sp_policer_params { |
|---|
| 1295 | + u64 rate; |
|---|
| 1296 | + u64 burst; |
|---|
| 1297 | + bool bytes; |
|---|
| 1298 | +}; |
|---|
| 1299 | + |
|---|
| 1300 | +int mlxsw_sp_policer_add(struct mlxsw_sp *mlxsw_sp, |
|---|
| 1301 | + enum mlxsw_sp_policer_type type, |
|---|
| 1302 | + const struct mlxsw_sp_policer_params *params, |
|---|
| 1303 | + struct netlink_ext_ack *extack, u16 *p_policer_index); |
|---|
| 1304 | +void mlxsw_sp_policer_del(struct mlxsw_sp *mlxsw_sp, |
|---|
| 1305 | + enum mlxsw_sp_policer_type type, |
|---|
| 1306 | + u16 policer_index); |
|---|
| 1307 | +int mlxsw_sp_policer_drops_counter_get(struct mlxsw_sp *mlxsw_sp, |
|---|
| 1308 | + enum mlxsw_sp_policer_type type, |
|---|
| 1309 | + u16 policer_index, u64 *p_drops); |
|---|
| 1310 | +int mlxsw_sp_policers_init(struct mlxsw_sp *mlxsw_sp); |
|---|
| 1311 | +void mlxsw_sp_policers_fini(struct mlxsw_sp *mlxsw_sp); |
|---|
| 1312 | +int mlxsw_sp_policer_resources_register(struct mlxsw_core *mlxsw_core); |
|---|
| 1313 | + |
|---|
| 728 | 1314 | #endif |
|---|