File Index
Files and directories
Sign in
FILE

bridge_priv.h

File preview with syntax highlighting.

linux-6.19.14/drivers/net/ethernet/mellanox/mlx5/core/esw/bridge_priv.h C
  1/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
  2/* Copyright (c) 2021 Mellanox Technologies. */
  3
  4#ifndef _MLX5_ESW_BRIDGE_PRIVATE_
  5#define _MLX5_ESW_BRIDGE_PRIVATE_
  6
  7#include <linux/netdevice.h>
  8#include <linux/if_bridge.h>
  9#include <linux/if_vlan.h>
 10#include <linux/if_ether.h>
 11#include <linux/rhashtable.h>
 12#include <linux/xarray.h>
 13#include "fs_core.h"
 14
 15#define MLX5_ESW_BRIDGE_INGRESS_TABLE_IGMP_GRP_SIZE 1
 16#define MLX5_ESW_BRIDGE_INGRESS_TABLE_MLD_GRP_SIZE 3
 17#define MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_GRP_SIZE 131072
 18#define MLX5_ESW_BRIDGE_INGRESS_TABLE_UNTAGGED_GRP_SIZE			\
 19	(524288 - MLX5_ESW_BRIDGE_INGRESS_TABLE_IGMP_GRP_SIZE -		\
 20	 MLX5_ESW_BRIDGE_INGRESS_TABLE_MLD_GRP_SIZE)
 21
 22#define MLX5_ESW_BRIDGE_INGRESS_TABLE_IGMP_GRP_IDX_FROM 0
 23#define MLX5_ESW_BRIDGE_INGRESS_TABLE_IGMP_GRP_IDX_TO		\
 24	(MLX5_ESW_BRIDGE_INGRESS_TABLE_IGMP_GRP_SIZE - 1)
 25#define MLX5_ESW_BRIDGE_INGRESS_TABLE_MLD_GRP_IDX_FROM	\
 26	(MLX5_ESW_BRIDGE_INGRESS_TABLE_IGMP_GRP_IDX_TO + 1)
 27#define MLX5_ESW_BRIDGE_INGRESS_TABLE_MLD_GRP_IDX_TO		\
 28	(MLX5_ESW_BRIDGE_INGRESS_TABLE_MLD_GRP_IDX_FROM +	\
 29	 MLX5_ESW_BRIDGE_INGRESS_TABLE_MLD_GRP_SIZE - 1)
 30#define MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_GRP_IDX_FROM			\
 31	(MLX5_ESW_BRIDGE_INGRESS_TABLE_MLD_GRP_IDX_TO + 1)
 32#define MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_GRP_IDX_TO			\
 33	(MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_GRP_IDX_FROM +		\
 34	 MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_GRP_SIZE - 1)
 35#define MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_FILTER_GRP_IDX_FROM	\
 36	(MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_GRP_IDX_TO + 1)
 37#define MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_FILTER_GRP_IDX_TO		\
 38	(MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_FILTER_GRP_IDX_FROM +	\
 39	 MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_GRP_SIZE - 1)
 40#define MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_GRP_IDX_FROM			\
 41	(MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_FILTER_GRP_IDX_TO + 1)
 42#define MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_GRP_IDX_TO			\
 43	(MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_GRP_IDX_FROM +		\
 44	 MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_GRP_SIZE - 1)
 45#define MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_FILTER_GRP_IDX_FROM	\
 46	(MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_GRP_IDX_TO + 1)
 47#define MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_FILTER_GRP_IDX_TO		\
 48	(MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_FILTER_GRP_IDX_FROM +	\
 49	 MLX5_ESW_BRIDGE_INGRESS_TABLE_VLAN_GRP_SIZE - 1)
 50#define MLX5_ESW_BRIDGE_INGRESS_TABLE_MAC_GRP_IDX_FROM			\
 51	(MLX5_ESW_BRIDGE_INGRESS_TABLE_QINQ_FILTER_GRP_IDX_TO + 1)
 52#define MLX5_ESW_BRIDGE_INGRESS_TABLE_MAC_GRP_IDX_TO			\
 53	(MLX5_ESW_BRIDGE_INGRESS_TABLE_MAC_GRP_IDX_FROM +		\
 54	 MLX5_ESW_BRIDGE_INGRESS_TABLE_UNTAGGED_GRP_SIZE - 1)
 55#define MLX5_ESW_BRIDGE_INGRESS_TABLE_SIZE			\
 56	(MLX5_ESW_BRIDGE_INGRESS_TABLE_MAC_GRP_IDX_TO + 1)
 57static_assert(MLX5_ESW_BRIDGE_INGRESS_TABLE_SIZE == 1048576);
 58
 59#define MLX5_ESW_BRIDGE_EGRESS_TABLE_VLAN_GRP_SIZE 131072
 60#define MLX5_ESW_BRIDGE_EGRESS_TABLE_MAC_GRP_SIZE (262144 - 1)
 61#define MLX5_ESW_BRIDGE_EGRESS_TABLE_VLAN_GRP_IDX_FROM 0
 62#define MLX5_ESW_BRIDGE_EGRESS_TABLE_VLAN_GRP_IDX_TO		\
 63	(MLX5_ESW_BRIDGE_EGRESS_TABLE_VLAN_GRP_SIZE - 1)
 64#define MLX5_ESW_BRIDGE_EGRESS_TABLE_QINQ_GRP_IDX_FROM		\
 65	(MLX5_ESW_BRIDGE_EGRESS_TABLE_VLAN_GRP_IDX_TO + 1)
 66#define MLX5_ESW_BRIDGE_EGRESS_TABLE_QINQ_GRP_IDX_TO			\
 67	(MLX5_ESW_BRIDGE_EGRESS_TABLE_QINQ_GRP_IDX_FROM +		\
 68	 MLX5_ESW_BRIDGE_EGRESS_TABLE_VLAN_GRP_SIZE - 1)
 69#define MLX5_ESW_BRIDGE_EGRESS_TABLE_MAC_GRP_IDX_FROM \
 70	(MLX5_ESW_BRIDGE_EGRESS_TABLE_QINQ_GRP_IDX_TO + 1)
 71#define MLX5_ESW_BRIDGE_EGRESS_TABLE_MAC_GRP_IDX_TO			\
 72	(MLX5_ESW_BRIDGE_EGRESS_TABLE_MAC_GRP_IDX_FROM +		\
 73	 MLX5_ESW_BRIDGE_EGRESS_TABLE_MAC_GRP_SIZE - 1)
 74#define MLX5_ESW_BRIDGE_EGRESS_TABLE_MISS_GRP_IDX_FROM \
 75	(MLX5_ESW_BRIDGE_EGRESS_TABLE_MAC_GRP_IDX_TO + 1)
 76#define MLX5_ESW_BRIDGE_EGRESS_TABLE_MISS_GRP_IDX_TO	\
 77	MLX5_ESW_BRIDGE_EGRESS_TABLE_MISS_GRP_IDX_FROM
 78#define MLX5_ESW_BRIDGE_EGRESS_TABLE_SIZE			\
 79	(MLX5_ESW_BRIDGE_EGRESS_TABLE_MISS_GRP_IDX_TO + 1)
 80static_assert(MLX5_ESW_BRIDGE_EGRESS_TABLE_SIZE == 524288);
 81
 82#define MLX5_ESW_BRIDGE_SKIP_TABLE_SIZE 0
 83
 84#define MLX5_ESW_BRIDGE_MCAST_TABLE_FILTER_GRP_SIZE 1
 85#define MLX5_ESW_BRIDGE_MCAST_TABLE_FWD_GRP_SIZE 1
 86#define MLX5_ESW_BRIDGE_MCAST_TABLE_VLAN_GRP_SIZE 4095
 87#define MLX5_ESW_BRIDGE_MCAST_TABLE_QINQ_GRP_SIZE MLX5_ESW_BRIDGE_MCAST_TABLE_VLAN_GRP_SIZE
 88#define MLX5_ESW_BRIDGE_MCAST_TABLE_FILTER_GRP_IDX_FROM 0
 89#define MLX5_ESW_BRIDGE_MCAST_TABLE_FILTER_GRP_IDX_TO		\
 90	(MLX5_ESW_BRIDGE_MCAST_TABLE_FILTER_GRP_SIZE - 1)
 91#define MLX5_ESW_BRIDGE_MCAST_TABLE_VLAN_GRP_IDX_FROM		\
 92	(MLX5_ESW_BRIDGE_MCAST_TABLE_FILTER_GRP_IDX_TO + 1)
 93#define MLX5_ESW_BRIDGE_MCAST_TABLE_VLAN_GRP_IDX_TO			\
 94	(MLX5_ESW_BRIDGE_MCAST_TABLE_VLAN_GRP_IDX_FROM +		\
 95	 MLX5_ESW_BRIDGE_MCAST_TABLE_VLAN_GRP_SIZE - 1)
 96#define MLX5_ESW_BRIDGE_MCAST_TABLE_QINQ_GRP_IDX_FROM		\
 97	(MLX5_ESW_BRIDGE_MCAST_TABLE_VLAN_GRP_IDX_TO + 1)
 98#define MLX5_ESW_BRIDGE_MCAST_TABLE_QINQ_GRP_IDX_TO			\
 99	(MLX5_ESW_BRIDGE_MCAST_TABLE_QINQ_GRP_IDX_FROM +		\
100	 MLX5_ESW_BRIDGE_MCAST_TABLE_QINQ_GRP_SIZE - 1)
101#define MLX5_ESW_BRIDGE_MCAST_TABLE_FWD_GRP_IDX_FROM		\
102	(MLX5_ESW_BRIDGE_MCAST_TABLE_QINQ_GRP_IDX_TO + 1)
103#define MLX5_ESW_BRIDGE_MCAST_TABLE_FWD_GRP_IDX_TO			\
104	(MLX5_ESW_BRIDGE_MCAST_TABLE_FWD_GRP_IDX_FROM +			\
105	 MLX5_ESW_BRIDGE_MCAST_TABLE_FWD_GRP_SIZE - 1)
106
107#define MLX5_ESW_BRIDGE_MCAST_TABLE_SIZE			\
108	(MLX5_ESW_BRIDGE_MCAST_TABLE_FWD_GRP_IDX_TO + 1)
109static_assert(MLX5_ESW_BRIDGE_MCAST_TABLE_SIZE == 8192);
110
111enum {
112	MLX5_ESW_BRIDGE_LEVEL_INGRESS_TABLE,
113	MLX5_ESW_BRIDGE_LEVEL_EGRESS_TABLE,
114	MLX5_ESW_BRIDGE_LEVEL_MCAST_TABLE,
115	MLX5_ESW_BRIDGE_LEVEL_SKIP_TABLE,
116};
117
118enum {
119	MLX5_ESW_BRIDGE_VLAN_FILTERING_FLAG = BIT(0),
120	MLX5_ESW_BRIDGE_MCAST_FLAG = BIT(1),
121};
122
123struct mlx5_esw_bridge_fdb_key {
124	unsigned char addr[ETH_ALEN];
125	u16 vid;
126};
127
128struct mlx5_esw_bridge_mdb_key {
129	unsigned char addr[ETH_ALEN];
130	u16 vid;
131};
132
133enum {
134	MLX5_ESW_BRIDGE_FLAG_ADDED_BY_USER = BIT(0),
135	MLX5_ESW_BRIDGE_FLAG_PEER = BIT(1),
136	MLX5_ESW_BRIDGE_FLAG_DELETED = BIT(2),
137};
138
139enum {
140	MLX5_ESW_BRIDGE_PORT_FLAG_PEER = BIT(0),
141};
142
143struct mlx5_esw_bridge_fdb_entry {
144	struct mlx5_esw_bridge_fdb_key key;
145	struct rhash_head ht_node;
146	struct net_device *dev;
147	struct list_head list;
148	struct list_head vlan_list;
149	u16 vport_num;
150	u16 esw_owner_vhca_id;
151	u16 flags;
152
153	struct mlx5_flow_handle *ingress_handle;
154	struct mlx5_fc *ingress_counter;
155	unsigned long lastuse;
156	struct mlx5_flow_handle *egress_handle;
157	struct mlx5_flow_handle *filter_handle;
158};
159
160struct mlx5_esw_bridge_mdb_entry {
161	struct mlx5_esw_bridge_mdb_key key;
162	struct rhash_head ht_node;
163	struct list_head list;
164	struct xarray ports;
165	int num_ports;
166
167	struct mlx5_flow_handle *egress_handle;
168};
169
170struct mlx5_esw_bridge_vlan {
171	u16 vid;
172	u16 flags;
173	struct list_head fdb_list;
174	struct mlx5_pkt_reformat *pkt_reformat_push;
175	struct mlx5_pkt_reformat *pkt_reformat_pop;
176	struct mlx5_modify_hdr *pkt_mod_hdr_push_mark;
177	struct mlx5_flow_handle *mcast_handle;
178};
179
180struct mlx5_esw_bridge_port {
181	u16 vport_num;
182	u16 esw_owner_vhca_id;
183	u16 flags;
184	struct mlx5_esw_bridge *bridge;
185	struct xarray vlans;
186	struct {
187		struct mlx5_flow_table *ft;
188		struct mlx5_flow_group *filter_fg;
189		struct mlx5_flow_group *vlan_fg;
190		struct mlx5_flow_group *qinq_fg;
191		struct mlx5_flow_group *fwd_fg;
192
193		struct mlx5_flow_handle *filter_handle;
194		struct mlx5_flow_handle *fwd_handle;
195	} mcast;
196};
197
198struct mlx5_esw_bridge {
199	int ifindex;
200	int refcnt;
201	struct list_head list;
202	struct mlx5_esw_bridge_offloads *br_offloads;
203	struct dentry *debugfs_dir;
204
205	struct list_head fdb_list;
206	struct rhashtable fdb_ht;
207
208	struct list_head mdb_list;
209	struct rhashtable mdb_ht;
210
211	struct mlx5_flow_table *egress_ft;
212	struct mlx5_flow_group *egress_vlan_fg;
213	struct mlx5_flow_group *egress_qinq_fg;
214	struct mlx5_flow_group *egress_mac_fg;
215	struct mlx5_flow_group *egress_miss_fg;
216	struct mlx5_pkt_reformat *egress_miss_pkt_reformat;
217	struct mlx5_flow_handle *egress_miss_handle;
218	unsigned long ageing_time;
219	u32 flags;
220	u16 vlan_proto;
221};
222
223struct mlx5_flow_table *mlx5_esw_bridge_table_create(int max_fte, u32 level,
224						     struct mlx5_eswitch *esw);
225unsigned long mlx5_esw_bridge_port_key(struct mlx5_esw_bridge_port *port);
226
227int mlx5_esw_bridge_port_mcast_init(struct mlx5_esw_bridge_port *port);
228void mlx5_esw_bridge_port_mcast_cleanup(struct mlx5_esw_bridge_port *port);
229int mlx5_esw_bridge_vlan_mcast_init(u16 vlan_proto, struct mlx5_esw_bridge_port *port,
230				    struct mlx5_esw_bridge_vlan *vlan);
231void mlx5_esw_bridge_vlan_mcast_cleanup(struct mlx5_esw_bridge_vlan *vlan);
232
233int mlx5_esw_bridge_mcast_enable(struct mlx5_esw_bridge *bridge);
234void mlx5_esw_bridge_mcast_disable(struct mlx5_esw_bridge *bridge);
235
236int mlx5_esw_bridge_mdb_init(struct mlx5_esw_bridge *bridge);
237void mlx5_esw_bridge_mdb_cleanup(struct mlx5_esw_bridge *bridge);
238int mlx5_esw_bridge_port_mdb_attach(struct net_device *dev, struct mlx5_esw_bridge_port *port,
239				    const unsigned char *addr, u16 vid);
240void mlx5_esw_bridge_port_mdb_detach(struct net_device *dev, struct mlx5_esw_bridge_port *port,
241				     const unsigned char *addr, u16 vid);
242void mlx5_esw_bridge_port_mdb_vlan_flush(struct mlx5_esw_bridge_port *port,
243					 struct mlx5_esw_bridge_vlan *vlan);
244void mlx5_esw_bridge_mdb_flush(struct mlx5_esw_bridge *bridge);
245
246void mlx5_esw_bridge_debugfs_offloads_init(struct mlx5_esw_bridge_offloads *br_offloads);
247void mlx5_esw_bridge_debugfs_offloads_cleanup(struct mlx5_esw_bridge_offloads *br_offloads);
248void mlx5_esw_bridge_debugfs_init(struct net_device *br_netdev, struct mlx5_esw_bridge *bridge);
249void mlx5_esw_bridge_debugfs_cleanup(struct mlx5_esw_bridge *bridge);
250
251#endif /* _MLX5_ESW_BRIDGE_PRIVATE_ */
~/ Read-only file preview.