.. | .. |
---|
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 |
---|