On Mon, Feb 10, 2020 at 3:19 PM Dennis Dalessandro <dennis.dalessandro@xxxxxxxxx> wrote: > > From: Gary Leshner <Gary.S.Leshner@xxxxxxxxx> > > When in connected mode ipoib sent broadcast pings which exceeded the mtu > size for broadcast addresses. But this broadcast done via the UD QP and not via the connected mode, please explain > > Add an mtu attribute to the rdma_netdev structure which ipoib sets to its > mcast mtu size. > > The RDMA netdev uses this value to determine if the skb length is too long > for the mtu specified and if it is, drops the packet and logs an error > about the errant packet. > > Reviewed-by: Mike Marciniszyn <mike.marciniszyn@xxxxxxxxx> > Reviewed-by: Dennis Dalessandro <dennis.alessandro@xxxxxxxxx> > Signed-off-by: Gary Leshner <Gary.S.Leshner@xxxxxxxxx> > Signed-off-by: Kaike Wan <kaike.wan@xxxxxxxxx> > Signed-off-by: Dennis Dalessandro <dennis.dalessandro@xxxxxxxxx> > --- > drivers/infiniband/ulp/ipoib/ipoib_main.c | 2 ++ > drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 1 + > drivers/infiniband/ulp/ipoib/ipoib_vlan.c | 3 +++ > 3 files changed, 6 insertions(+) > > diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c > index 5c1cf68..ddb896f 100644 > --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c > +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c > @@ -1906,6 +1906,7 @@ static int ipoib_ndo_init(struct net_device *ndev) > { > struct ipoib_dev_priv *priv = ipoib_priv(ndev); > int rc; > + struct rdma_netdev *rn = netdev_priv(ndev); > > if (priv->parent) { > ipoib_child_init(ndev); > @@ -1918,6 +1919,7 @@ static int ipoib_ndo_init(struct net_device *ndev) > /* MTU will be reset when mcast join happens */ > ndev->mtu = IPOIB_UD_MTU(priv->max_ib_mtu); > priv->mcast_mtu = priv->admin_mtu = ndev->mtu; > + rn->mtu = priv->mcast_mtu; If this is something specific for your lower driver (opa_vnic etc.) you don't need to do that here, you can use the rn->clnt_priv member in order to get the mcast_mtu > ndev->max_mtu = IPOIB_CM_MTU; > > ndev->neigh_priv_len = sizeof(struct ipoib_neigh); > diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c > index 7166ee9b..3d5f6b8 100644 > --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c > +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c > @@ -246,6 +246,7 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast, > if (priv->mcast_mtu == priv->admin_mtu) > priv->admin_mtu = IPOIB_UD_MTU(mtu); > priv->mcast_mtu = IPOIB_UD_MTU(mtu); > + rn->mtu = priv->mcast_mtu; > > priv->qkey = be32_to_cpu(priv->broadcast->mcmember.qkey); > spin_unlock_irq(&priv->lock); > diff --git a/drivers/infiniband/ulp/ipoib/ipoib_vlan.c b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c > index 8ac8e18..3086560 100644 > --- a/drivers/infiniband/ulp/ipoib/ipoib_vlan.c > +++ b/drivers/infiniband/ulp/ipoib/ipoib_vlan.c > @@ -97,6 +97,7 @@ int __ipoib_vlan_add(struct ipoib_dev_priv *ppriv, struct ipoib_dev_priv *priv, > { > struct net_device *ndev = priv->dev; > int result; > + struct rdma_netdev *rn = netdev_priv(ndev); > > ASSERT_RTNL(); > > @@ -117,6 +118,8 @@ int __ipoib_vlan_add(struct ipoib_dev_priv *ppriv, struct ipoib_dev_priv *priv, > goto out_early; > } > > + rn->mtu = priv->mcast_mtu; > + > priv->parent = ppriv->dev; > priv->pkey = pkey; > priv->child_type = type; >