Blob Blame History Raw
From: Petr Machata <petrm@mellanox.com>
Date: Tue, 27 Feb 2018 14:53:47 +0100
Subject: mlxsw: Move a mirroring check to mlxsw_sp_span_entry_create
Patch-mainline: v4.17-rc1
Git-commit: 52a6444cda7d1b6fc6f6ff84e2d23cdb71c84102
References: bsc#1112374

The check for whether a mirror port (which is a mlxsw front panel port)
belongs to the same mlxsw instance as the mirrored port, is currently
only done in spectrum_acl, even though it's applicable for the matchall
case as well. Thus move it to mlxsw_sp_span_entry_create().

Signed-off-by: Petr Machata <petrm@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>
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
---
 drivers/net/ethernet/mellanox/mlxsw/spectrum_acl.c  |    4 ----
 drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c |    6 +++++-
 2 files changed, 5 insertions(+), 5 deletions(-)

--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl.c
@@ -577,7 +577,6 @@ int mlxsw_sp_acl_rulei_act_mirror(struct
 				  struct net_device *out_dev)
 {
 	struct mlxsw_sp_acl_block_binding *binding;
-	struct mlxsw_sp_port *out_port;
 	struct mlxsw_sp_port *in_port;
 
 	if (!list_is_singular(&block->binding_list))
@@ -586,9 +585,6 @@ int mlxsw_sp_acl_rulei_act_mirror(struct
 	binding = list_first_entry(&block->binding_list,
 				   struct mlxsw_sp_acl_block_binding, list);
 	in_port = binding->mlxsw_sp_port;
-	out_port = netdev_priv(out_dev);
-	if (out_port->mlxsw_sp != mlxsw_sp)
-		return -EINVAL;
 
 	return mlxsw_afa_block_append_mirror(rulei->act_block,
 					     in_port->local_port,
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_span.c
@@ -164,7 +164,11 @@ mlxsw_sp_span_entry_configure(struct mlx
 			      struct mlxsw_sp_span_parms sparms)
 {
 	if (sparms.dest_port) {
-		if (span_entry->ops->configure(span_entry, sparms)) {
+		if (sparms.dest_port->mlxsw_sp != mlxsw_sp) {
+			netdev_err(span_entry->to_dev, "Cannot mirror to %s, which belongs to a different mlxsw instance",
+				   sparms.dest_port->dev->name);
+			sparms.dest_port = NULL;
+		} else if (span_entry->ops->configure(span_entry, sparms)) {
 			netdev_err(span_entry->to_dev, "Failed to offload mirror to %s",
 				   sparms.dest_port->dev->name);
 			sparms.dest_port = NULL;