net/mlx5: Bridge, Enable mcast in smfs steering mode
authorErez Shitrit <erezsh@nvidia.com>
Mon, 28 Aug 2023 11:20:00 +0000 (14:20 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Feb 2024 00:19:02 +0000 (16:19 -0800)
[ Upstream commit 653b7eb9d74426397c95061fd57da3063625af65 ]

In order to have mcast offloads the driver needs the following:
It should know if that mcast comes from wire port, in addition the flow
should not be marked as any specific source, that way it will give the
flexibility for the driver not to be depended on the way iterator
implemented in the FW.

Signed-off-by: Erez Shitrit <erezsh@nvidia.com>
Reviewed-by: Moshe Shemesh <moshe@nvidia.com>
Reviewed-by: Vlad Buslov <vladbu@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Stable-dep-of: ec7cc38ef9f8 ("net/mlx5: Bridge, fix multicast packets sent to uplink")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/esw/bridge_mcast.c
include/linux/mlx5/fs.h

index 7a01714..a7ed87e 100644 (file)
@@ -78,6 +78,8 @@ mlx5_esw_bridge_mdb_flow_create(u16 esw_owner_vhca_id, struct mlx5_esw_bridge_md
        xa_for_each(&entry->ports, idx, port) {
                dests[i].type = MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE;
                dests[i].ft = port->mcast.ft;
+               if (port->vport_num == MLX5_VPORT_UPLINK)
+                       dests[i].ft->flags |= MLX5_FLOW_TABLE_UPLINK_VPORT;
                i++;
        }
 
@@ -585,10 +587,6 @@ mlx5_esw_bridge_mcast_vlan_flow_create(u16 vlan_proto, struct mlx5_esw_bridge_po
        if (!rule_spec)
                return ERR_PTR(-ENOMEM);
 
-       if (MLX5_CAP_ESW_FLOWTABLE(bridge->br_offloads->esw->dev, flow_source) &&
-           port->vport_num == MLX5_VPORT_UPLINK)
-               rule_spec->flow_context.flow_source =
-                       MLX5_FLOW_CONTEXT_FLOW_SOURCE_LOCAL_VPORT;
        rule_spec->match_criteria_enable = MLX5_MATCH_OUTER_HEADERS;
 
        flow_act.action |= MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT;
@@ -660,11 +658,6 @@ mlx5_esw_bridge_mcast_fwd_flow_create(struct mlx5_esw_bridge_port *port)
        if (!rule_spec)
                return ERR_PTR(-ENOMEM);
 
-       if (MLX5_CAP_ESW_FLOWTABLE(bridge->br_offloads->esw->dev, flow_source) &&
-           port->vport_num == MLX5_VPORT_UPLINK)
-               rule_spec->flow_context.flow_source =
-                       MLX5_FLOW_CONTEXT_FLOW_SOURCE_LOCAL_VPORT;
-
        if (MLX5_CAP_ESW(bridge->br_offloads->esw->dev, merged_eswitch)) {
                dest.vport.flags = MLX5_FLOW_DEST_VPORT_VHCA_ID;
                dest.vport.vhca_id = port->esw_owner_vhca_id;
index 1e00c24..6f77252 100644 (file)
@@ -67,6 +67,7 @@ enum {
        MLX5_FLOW_TABLE_TERMINATION = BIT(2),
        MLX5_FLOW_TABLE_UNMANAGED = BIT(3),
        MLX5_FLOW_TABLE_OTHER_VPORT = BIT(4),
+       MLX5_FLOW_TABLE_UPLINK_VPORT = BIT(5),
 };
 
 #define LEFTOVERS_RULE_NUM      2