net/mlx5e: Duplicate offloaded TC eswitch rules under uplink LAG
authorAviv Heller <avivh@mellanox.com>
Tue, 2 Oct 2018 14:18:44 +0000 (17:18 +0300)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 14 Dec 2018 21:28:53 +0000 (13:28 -0800)
Under uplink LAG, packets that match a flow might arrive on both uplink
ports and transmitted through both as part of supporting aggregation and
high-availability.

When the netdevs representing the uplinks are set into LAG (bonding,
teaming), duplicate the TC flow offloading into each of the per-uplink
e-switches.

Duplication is not required if the source is the bond device, since in
this case it is assumed that the bond and the uplink netdevs share the
same TC block, and thus duplication will occur naturally by the stack.

Note that under encapsulation scheme, both flows will use the same
neighbour and hence both will contribute to the last-used feedback
towards the stack.

Signed-off-by: Aviv Heller <avivh@mellanox.com>
Signed-off-by: Rabie Loulou <rabiel@mellanox.com>
Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com>
Reviewed-by: Roi Dayan <roid@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

index cede77fd208f83d99acc41f18698d21b42f27267..864f3b00d09d8e4599cad2b3fb73695971543d1b 100644 (file)
@@ -2710,7 +2710,16 @@ static struct rhashtable *get_tc_ht(struct mlx5e_priv *priv)
 
 static bool is_peer_flow_needed(struct mlx5e_tc_flow *flow)
 {
-       return false;
+       struct mlx5_esw_flow_attr *attr = flow->esw_attr;
+       bool is_rep_ingress = attr->in_rep->vport != FDB_UPLINK_VPORT &&
+                             flow->flags & MLX5E_TC_FLOW_INGRESS;
+       bool act_is_encap = !!(attr->action &
+                              MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT);
+       bool esw_paired = mlx5_devcom_is_paired(attr->in_mdev->priv.devcom,
+                                               MLX5_DEVCOM_ESW_OFFLOADS);
+
+       return esw_paired && mlx5_lag_is_active(attr->in_mdev) &&
+              (is_rep_ingress || act_is_encap);
 }
 
 static int