On Tue, Mar 01, 2016 at 06:52:22PM +0200, Eli Cohen wrote: > 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@xxxxxxxxxxxx> > --- > drivers/infiniband/ulp/ipoib/ipoib_ib.c | 29 ++++++++++++++++++++++------- > 1 file changed, 22 insertions(+), 7 deletions(-) > > diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c > index fa9c42ff1fb0..e0b953cdab50 100644 > --- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c > +++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c > @@ -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,27 @@ 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) && > + memcmp(&sgid->global.interface_id, > + &priv->local_gid.global.interface_id, > + sizeof(sgid->global.interface_id))) 1. Why can't we do sgid->global.interface_id != priv->local_gid.global.interface_id 2. Don't we need also to check subnet_prefix? i.e. is it possible to have same interface_id on different networks? > + 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; > -- > 1.8.3.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-rdma" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html