net/mlx5e: IPoIB, Drop multicast packets that this interface sent

After enabled loopback packets for IPoIB, we need to drop these packets
that this HCA has replicated and came back to the same interface that
sent them.

Fixes: 4c6c615e3f ("net/mlx5e: IPoIB, Add PKEY child interface nic profile")
Signed-off-by: Erez Shitrit <erezsh@mellanox.com>
Reviewed-by: Alex Vesker <valex@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
Erez Shitrit 2020-05-04 11:46:25 +03:00 committed by Saeed Mahameed
parent 80639b199c
commit 8b46d424a7

View file

@ -1489,6 +1489,7 @@ int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget)
#ifdef CONFIG_MLX5_CORE_IPOIB #ifdef CONFIG_MLX5_CORE_IPOIB
#define MLX5_IB_GRH_SGID_OFFSET 8
#define MLX5_IB_GRH_DGID_OFFSET 24 #define MLX5_IB_GRH_DGID_OFFSET 24
#define MLX5_GID_SIZE 16 #define MLX5_GID_SIZE 16
@ -1502,6 +1503,7 @@ static inline void mlx5i_complete_rx_cqe(struct mlx5e_rq *rq,
struct net_device *netdev; struct net_device *netdev;
struct mlx5e_priv *priv; struct mlx5e_priv *priv;
char *pseudo_header; char *pseudo_header;
u32 flags_rqpn;
u32 qpn; u32 qpn;
u8 *dgid; u8 *dgid;
u8 g; u8 g;
@ -1523,7 +1525,8 @@ static inline void mlx5i_complete_rx_cqe(struct mlx5e_rq *rq,
tstamp = &priv->tstamp; tstamp = &priv->tstamp;
stats = &priv->channel_stats[rq->ix].rq; stats = &priv->channel_stats[rq->ix].rq;
g = (be32_to_cpu(cqe->flags_rqpn) >> 28) & 3; flags_rqpn = be32_to_cpu(cqe->flags_rqpn);
g = (flags_rqpn >> 28) & 3;
dgid = skb->data + MLX5_IB_GRH_DGID_OFFSET; dgid = skb->data + MLX5_IB_GRH_DGID_OFFSET;
if ((!g) || dgid[0] != 0xff) if ((!g) || dgid[0] != 0xff)
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
@ -1532,9 +1535,15 @@ static inline void mlx5i_complete_rx_cqe(struct mlx5e_rq *rq,
else else
skb->pkt_type = PACKET_MULTICAST; skb->pkt_type = PACKET_MULTICAST;
/* TODO: IB/ipoib: Allow mcast packets from other VFs /* Drop packets that this interface sent, ie multicast packets
* 68996a6e760e5c74654723eeb57bf65628ae87f4 * that the HCA has replicated.
*/ */
if (g && (qpn == (flags_rqpn & 0xffffff)) &&
(memcmp(netdev->dev_addr + 4, skb->data + MLX5_IB_GRH_SGID_OFFSET,
MLX5_GID_SIZE) == 0)) {
skb->dev = NULL;
return;
}
skb_pull(skb, MLX5_IB_GRH_BYTES); skb_pull(skb, MLX5_IB_GRH_BYTES);