RDMA/ipoib: Handle user-supplied address when creating child
authorMichael Guralnik <michaelgur@mellanox.com>
Tue, 23 Jun 2020 11:01:05 +0000 (14:01 +0300)
committerJason Gunthorpe <jgg@nvidia.com>
Mon, 6 Jul 2020 15:57:58 +0000 (12:57 -0300)
Use the address supplied by user when creating a child interface.

Previously, the address requested by the user was ignored and overridden
with parent's GID and the random QP number assigned to the child.

Link: https://lore.kernel.org/r/20200623110105.1225750-3-leon@kernel.org
Signed-off-by: Michael Guralnik <michaelgur@mellanox.com>
Reviewed-by: Feras Daoud <ferasda@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/ulp/ipoib/ipoib_main.c

index 3cfb682b91b0a155a39527f057ea82e0ccb0bce5..a9f1174f7320a20187c495a3793a61f18639533a 100644 (file)
@@ -1892,8 +1892,15 @@ static void ipoib_child_init(struct net_device *ndev)
 
        priv->max_ib_mtu = ppriv->max_ib_mtu;
        set_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags);
-       memcpy(priv->dev->dev_addr, ppriv->dev->dev_addr, INFINIBAND_ALEN);
-       memcpy(&priv->local_gid, &ppriv->local_gid, sizeof(priv->local_gid));
+       if (memchr_inv(priv->dev->dev_addr, 0, INFINIBAND_ALEN))
+               memcpy(&priv->local_gid, priv->dev->dev_addr + 4,
+                      sizeof(priv->local_gid));
+       else {
+               memcpy(priv->dev->dev_addr, ppriv->dev->dev_addr,
+                      INFINIBAND_ALEN);
+               memcpy(&priv->local_gid, &ppriv->local_gid,
+                      sizeof(priv->local_gid));
+       }
 }
 
 static int ipoib_ndo_init(struct net_device *ndev)