IB/core: Add support for RoCEv2 multicast
authorNoa Osherovich <noaos@mellanox.com>
Mon, 12 Jun 2017 08:14:04 +0000 (11:14 +0300)
committerDoug Ledford <dledford@redhat.com>
Mon, 24 Jul 2017 14:40:23 +0000 (10:40 -0400)
When creating address handle from multicast GID, set MAC according to
the appropriate formula instead of searching for it in the GID table:
- For IPv4 multicast GID use ip_eth_mc_map().
- For IPv6 multicast GID use ipv6_eth_mc_map().

Signed-off-by: Noa Osherovich <noaos@mellanox.com>
Reviewed-by: Moni Shoua <monis@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/core/verbs.c

index 30fdc3a..e800667 100644 (file)
@@ -1244,6 +1244,18 @@ int ib_resolve_eth_dmac(struct ib_device *device,
        if (rdma_link_local_addr((struct in6_addr *)grh->dgid.raw)) {
                rdma_get_ll_mac((struct in6_addr *)grh->dgid.raw,
                                ah_attr->roce.dmac);
+               return 0;
+       }
+       if (rdma_is_multicast_addr((struct in6_addr *)ah_attr->grh.dgid.raw)) {
+               if (ipv6_addr_v4mapped((struct in6_addr *)ah_attr->grh.dgid.raw)) {
+                       __be32 addr = 0;
+
+                       memcpy(&addr, ah_attr->grh.dgid.raw + 12, 4);
+                       ip_eth_mc_map(addr, (char *)ah_attr->roce.dmac);
+               } else {
+                       ipv6_eth_mc_map((struct in6_addr *)ah_attr->grh.dgid.raw,
+                                       (char *)ah_attr->roce.dmac);
+               }
        } else {
                union ib_gid            sgid;
                struct ib_gid_attr      sgid_attr;