mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 18:09:57 +00:00
IB/ipoib: Allow mcast packets from other VFs
With SRIOV enabled, two VFs on the same HCA which have the same port LID and may have the same QP number. To enable receiving multicasts from such VFs, further qualify the check: ignore the receive only if, in addition, the packet source gid equals the receiving VF's source gid. Signed-off-by: Eli Cohen <eli@mellanox.com> Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
eff901d30e
commit
68996a6e76
1 changed files with 20 additions and 7 deletions
|
@ -180,6 +180,7 @@ static void ipoib_ib_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
|
|||
struct sk_buff *skb;
|
||||
u64 mapping[IPOIB_UD_RX_SG];
|
||||
union ib_gid *dgid;
|
||||
union ib_gid *sgid;
|
||||
|
||||
ipoib_dbg_data(priv, "recv completion: id %d, status: %d\n",
|
||||
wr_id, wc->status);
|
||||
|
@ -203,13 +204,6 @@ static void ipoib_ib_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
|
|||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Drop packets that this interface sent, ie multicast packets
|
||||
* that the HCA has replicated.
|
||||
*/
|
||||
if (wc->slid == priv->local_lid && wc->src_qp == priv->qp->qp_num)
|
||||
goto repost;
|
||||
|
||||
memcpy(mapping, priv->rx_ring[wr_id].mapping,
|
||||
IPOIB_UD_RX_SG * sizeof *mapping);
|
||||
|
||||
|
@ -239,6 +233,25 @@ static void ipoib_ib_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
|
|||
else
|
||||
skb->pkt_type = PACKET_MULTICAST;
|
||||
|
||||
sgid = &((struct ib_grh *)skb->data)->sgid;
|
||||
|
||||
/*
|
||||
* Drop packets that this interface sent, ie multicast packets
|
||||
* that the HCA has replicated.
|
||||
*/
|
||||
if (wc->slid == priv->local_lid && wc->src_qp == priv->qp->qp_num) {
|
||||
int need_repost = 1;
|
||||
|
||||
if ((wc->wc_flags & IB_WC_GRH) &&
|
||||
sgid->global.interface_id != priv->local_gid.global.interface_id)
|
||||
need_repost = 0;
|
||||
|
||||
if (need_repost) {
|
||||
dev_kfree_skb_any(skb);
|
||||
goto repost;
|
||||
}
|
||||
}
|
||||
|
||||
skb_pull(skb, IB_GRH_BYTES);
|
||||
|
||||
skb->protocol = ((struct ipoib_header *) skb->data)->proto;
|
||||
|
|
Loading…
Reference in a new issue