|
@@ -3998,7 +3998,8 @@ static void iboe_mcast_work_handler(struct work_struct *work)
|
|
|
kfree(mw);
|
|
|
}
|
|
|
|
|
|
-static void cma_iboe_set_mgid(struct sockaddr *addr, union ib_gid *mgid)
|
|
|
+static void cma_iboe_set_mgid(struct sockaddr *addr, union ib_gid *mgid,
|
|
|
+ enum ib_gid_type gid_type)
|
|
|
{
|
|
|
struct sockaddr_in *sin = (struct sockaddr_in *)addr;
|
|
|
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr;
|
|
@@ -4008,8 +4009,8 @@ static void cma_iboe_set_mgid(struct sockaddr *addr, union ib_gid *mgid)
|
|
|
} else if (addr->sa_family == AF_INET6) {
|
|
|
memcpy(mgid, &sin6->sin6_addr, sizeof *mgid);
|
|
|
} else {
|
|
|
- mgid->raw[0] = 0xff;
|
|
|
- mgid->raw[1] = 0x0e;
|
|
|
+ mgid->raw[0] = (gid_type == IB_GID_TYPE_IB) ? 0xff : 0;
|
|
|
+ mgid->raw[1] = (gid_type == IB_GID_TYPE_IB) ? 0x0e : 0;
|
|
|
mgid->raw[2] = 0;
|
|
|
mgid->raw[3] = 0;
|
|
|
mgid->raw[4] = 0;
|
|
@@ -4050,7 +4051,9 @@ static int cma_iboe_join_multicast(struct rdma_id_private *id_priv,
|
|
|
goto out1;
|
|
|
}
|
|
|
|
|
|
- cma_iboe_set_mgid(addr, &mc->multicast.ib->rec.mgid);
|
|
|
+ gid_type = id_priv->cma_dev->default_gid_type[id_priv->id.port_num -
|
|
|
+ rdma_start_port(id_priv->cma_dev->device)];
|
|
|
+ cma_iboe_set_mgid(addr, &mc->multicast.ib->rec.mgid, gid_type);
|
|
|
|
|
|
mc->multicast.ib->rec.pkey = cpu_to_be16(0xffff);
|
|
|
if (id_priv->id.ps == RDMA_PS_UDP)
|
|
@@ -4066,8 +4069,6 @@ static int cma_iboe_join_multicast(struct rdma_id_private *id_priv,
|
|
|
mc->multicast.ib->rec.hop_limit = 1;
|
|
|
mc->multicast.ib->rec.mtu = iboe_get_mtu(ndev->mtu);
|
|
|
|
|
|
- gid_type = id_priv->cma_dev->default_gid_type[id_priv->id.port_num -
|
|
|
- rdma_start_port(id_priv->cma_dev->device)];
|
|
|
if (addr->sa_family == AF_INET) {
|
|
|
if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) {
|
|
|
mc->multicast.ib->rec.hop_limit = IPV6_DEFAULT_HOPLIMIT;
|