mirror of
https://github.com/ukui/kernel.git
synced 2026-03-09 10:07:04 -07:00
mlxsw: spectrum: Add support in matchall mirror TC offloading
This patch offloads port mirroring directives to hw using the matchall TC with action mirror. It includes both the implementation of the ndo_setup_tc function for the spectrum driver and the spectrum hardware offload configuration code. The hardware offload code is basically two new functions which are capable of adding and removing a new mirror ports pair. It is done using the MPAT, MPAR and SBIB registers: - A new Switch-Port Analyzer (SPAN) entry is added using MPAT to the 'to' port. - The 'to' port is bound to the SPAN entry using MPAR register. - In case of egress SPAN, the 'to' port gets a new internal shared buffer using SBIB register. In addition, a new database was added to the mlxsw_sp struct to store all the SPAN entries and their bound ports list. The number of supported SPAN entries is determined by resource query. Signed-off-by: Yotam Gigi <yotamg@mellanox.com> Reviewed-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
56a20680f7
commit
763b4b70af
File diff suppressed because it is too large
Load Diff
@@ -214,6 +214,43 @@ struct mlxsw_sp_vr {
|
||||
struct mlxsw_sp_fib *fib;
|
||||
};
|
||||
|
||||
enum mlxsw_sp_span_type {
|
||||
MLXSW_SP_SPAN_EGRESS,
|
||||
MLXSW_SP_SPAN_INGRESS
|
||||
};
|
||||
|
||||
struct mlxsw_sp_span_inspected_port {
|
||||
struct list_head list;
|
||||
enum mlxsw_sp_span_type type;
|
||||
u8 local_port;
|
||||
};
|
||||
|
||||
struct mlxsw_sp_span_entry {
|
||||
u8 local_port;
|
||||
bool used;
|
||||
struct list_head bound_ports_list;
|
||||
int ref_count;
|
||||
int id;
|
||||
};
|
||||
|
||||
enum mlxsw_sp_port_mall_action_type {
|
||||
MLXSW_SP_PORT_MALL_MIRROR,
|
||||
};
|
||||
|
||||
struct mlxsw_sp_port_mall_mirror_tc_entry {
|
||||
u8 to_local_port;
|
||||
bool ingress;
|
||||
};
|
||||
|
||||
struct mlxsw_sp_port_mall_tc_entry {
|
||||
struct list_head list;
|
||||
unsigned long cookie;
|
||||
enum mlxsw_sp_port_mall_action_type type;
|
||||
union {
|
||||
struct mlxsw_sp_port_mall_mirror_tc_entry mirror;
|
||||
};
|
||||
};
|
||||
|
||||
struct mlxsw_sp_router {
|
||||
struct mlxsw_sp_lpm_tree lpm_trees[MLXSW_SP_LPM_TREE_COUNT];
|
||||
struct mlxsw_sp_vr vrs[MLXSW_SP_VIRTUAL_ROUTER_MAX];
|
||||
@@ -260,6 +297,11 @@ struct mlxsw_sp {
|
||||
struct {
|
||||
DECLARE_BITMAP(usage, MLXSW_SP_KVD_LINEAR_SIZE);
|
||||
} kvdl;
|
||||
|
||||
struct {
|
||||
struct mlxsw_sp_span_entry *entries;
|
||||
int entries_count;
|
||||
} span;
|
||||
};
|
||||
|
||||
static inline struct mlxsw_sp_upper *
|
||||
@@ -316,6 +358,8 @@ struct mlxsw_sp_port {
|
||||
unsigned long *untagged_vlans;
|
||||
/* VLAN interfaces */
|
||||
struct list_head vports_list;
|
||||
/* TC handles */
|
||||
struct list_head mall_tc_list;
|
||||
};
|
||||
|
||||
struct mlxsw_sp_port *mlxsw_sp_port_lower_dev_hold(struct net_device *dev);
|
||||
|
||||
Reference in New Issue
Block a user