IB/core: Add support for RoCEv2 multicast
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>
This commit is contained in:
parent
be1d325a33
commit
9636a56fa8
|
@ -1244,6 +1244,18 @@ int ib_resolve_eth_dmac(struct ib_device *device,
|
||||||
if (rdma_link_local_addr((struct in6_addr *)grh->dgid.raw)) {
|
if (rdma_link_local_addr((struct in6_addr *)grh->dgid.raw)) {
|
||||||
rdma_get_ll_mac((struct in6_addr *)grh->dgid.raw,
|
rdma_get_ll_mac((struct in6_addr *)grh->dgid.raw,
|
||||||
ah_attr->roce.dmac);
|
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 {
|
} else {
|
||||||
union ib_gid sgid;
|
union ib_gid sgid;
|
||||||
struct ib_gid_attr sgid_attr;
|
struct ib_gid_attr sgid_attr;
|
||||||
|
|
Loading…
Reference in New Issue