Commit c0348eb0 authored by Parav Pandit's avatar Parav Pandit Committed by Doug Ledford

IB: Let ib_core resolve destination mac address

Since IB/core resolves the destination mac address for user and kernel
consumers, avoid resolving in multiple provider drivers.

Only ib_core resolves DMAC now, therefore resolve_eth_dmac is removed as
exported symbol.
Signed-off-by: default avatarParav Pandit <parav@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 5cda6587
...@@ -53,6 +53,9 @@ ...@@ -53,6 +53,9 @@
#include "core_priv.h" #include "core_priv.h"
static int ib_resolve_eth_dmac(struct ib_device *device,
struct rdma_ah_attr *ah_attr);
static const char * const ib_events[] = { static const char * const ib_events[] = {
[IB_EVENT_CQ_ERR] = "CQ error", [IB_EVENT_CQ_ERR] = "CQ error",
[IB_EVENT_QP_FATAL] = "QP fatal error", [IB_EVENT_QP_FATAL] = "QP fatal error",
...@@ -1257,8 +1260,8 @@ int ib_modify_qp_is_ok(enum ib_qp_state cur_state, enum ib_qp_state next_state, ...@@ -1257,8 +1260,8 @@ int ib_modify_qp_is_ok(enum ib_qp_state cur_state, enum ib_qp_state next_state,
} }
EXPORT_SYMBOL(ib_modify_qp_is_ok); EXPORT_SYMBOL(ib_modify_qp_is_ok);
int ib_resolve_eth_dmac(struct ib_device *device, static int ib_resolve_eth_dmac(struct ib_device *device,
struct rdma_ah_attr *ah_attr) struct rdma_ah_attr *ah_attr)
{ {
int ret = 0; int ret = 0;
struct ib_global_route *grh; struct ib_global_route *grh;
...@@ -1317,7 +1320,6 @@ int ib_resolve_eth_dmac(struct ib_device *device, ...@@ -1317,7 +1320,6 @@ int ib_resolve_eth_dmac(struct ib_device *device,
out: out:
return ret; return ret;
} }
EXPORT_SYMBOL(ib_resolve_eth_dmac);
/** /**
* ib_modify_qp_with_udata - Modifies the attributes for the specified QP. * ib_modify_qp_with_udata - Modifies the attributes for the specified QP.
......
...@@ -729,14 +729,6 @@ struct ib_ah *bnxt_re_create_ah(struct ib_pd *ib_pd, ...@@ -729,14 +729,6 @@ struct ib_ah *bnxt_re_create_ah(struct ib_pd *ib_pd,
ah->qplib_ah.nw_type = CMDQ_CREATE_AH_TYPE_V1; ah->qplib_ah.nw_type = CMDQ_CREATE_AH_TYPE_V1;
break; break;
} }
rc = rdma_addr_find_l2_eth_by_grh(&sgid, &grh->dgid,
ah_attr->roce.dmac, &vlan_tag,
&sgid_attr.ndev->ifindex,
NULL);
if (rc) {
dev_err(rdev_to_dev(rdev), "Failed to get dmac\n");
goto fail;
}
} }
memcpy(ah->qplib_ah.dmac, ah_attr->roce.dmac, ETH_ALEN); memcpy(ah->qplib_ah.dmac, ah_attr->roce.dmac, ETH_ALEN);
......
...@@ -48,7 +48,6 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd, ...@@ -48,7 +48,6 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd,
struct ib_gid_attr gid_attr; struct ib_gid_attr gid_attr;
struct hns_roce_ah *ah; struct hns_roce_ah *ah;
u16 vlan_tag = 0xffff; u16 vlan_tag = 0xffff;
struct in6_addr in6;
const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr); const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr);
union ib_gid sgid; union ib_gid sgid;
int ret; int ret;
...@@ -58,18 +57,7 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd, ...@@ -58,18 +57,7 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd,
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
/* Get mac address */ /* Get mac address */
memcpy(&in6, grh->dgid.raw, sizeof(grh->dgid.raw)); memcpy(ah->av.mac, ah_attr->roce.dmac, ETH_ALEN);
if (rdma_is_multicast_addr(&in6)) {
rdma_get_mcast_mac(&in6, ah->av.mac);
} else {
u8 *dmac = rdma_ah_retrieve_dmac(ah_attr);
if (!dmac) {
kfree(ah);
return ERR_PTR(-EINVAL);
}
memcpy(ah->av.mac, dmac, ETH_ALEN);
}
/* Get source gid */ /* Get source gid */
ret = ib_get_cached_gid(ibpd->device, rdma_ah_get_port_num(ah_attr), ret = ib_get_cached_gid(ibpd->device, rdma_ah_get_port_num(ah_attr),
......
...@@ -92,12 +92,10 @@ static struct ib_ah *create_iboe_ah(struct ib_pd *pd, ...@@ -92,12 +92,10 @@ static struct ib_ah *create_iboe_ah(struct ib_pd *pd,
int ret; int ret;
memcpy(&in6, grh->dgid.raw, sizeof(in6)); memcpy(&in6, grh->dgid.raw, sizeof(in6));
if (rdma_is_multicast_addr(&in6)) { if (rdma_is_multicast_addr(&in6))
is_mcast = 1; is_mcast = 1;
rdma_get_mcast_mac(&in6, ah->av.eth.mac);
} else { memcpy(ah->av.eth.mac, ah_attr->roce.dmac, ETH_ALEN);
memcpy(ah->av.eth.mac, ah_attr->roce.dmac, ETH_ALEN);
}
ret = ib_get_cached_gid(pd->device, rdma_ah_get_port_num(ah_attr), ret = ib_get_cached_gid(pd->device, rdma_ah_get_port_num(ah_attr),
grh->sgid_index, &sgid, &gid_attr); grh->sgid_index, &sgid, &gid_attr);
if (ret) if (ret)
......
...@@ -89,10 +89,6 @@ struct ib_ah *mlx5_ib_create_ah(struct ib_pd *pd, struct rdma_ah_attr *ah_attr, ...@@ -89,10 +89,6 @@ struct ib_ah *mlx5_ib_create_ah(struct ib_pd *pd, struct rdma_ah_attr *ah_attr,
resp.response_length = min_resp_len; resp.response_length = min_resp_len;
err = ib_resolve_eth_dmac(pd->device, ah_attr);
if (err)
return ERR_PTR(err);
memcpy(resp.dmac, ah_attr->roce.dmac, ETH_ALEN); memcpy(resp.dmac, ah_attr->roce.dmac, ETH_ALEN);
err = ib_copy_to_udata(udata, &resp, resp.response_length); err = ib_copy_to_udata(udata, &resp, resp.response_length);
if (err) if (err)
......
...@@ -201,21 +201,6 @@ struct ib_ah *ocrdma_create_ah(struct ib_pd *ibpd, struct rdma_ah_attr *attr, ...@@ -201,21 +201,6 @@ struct ib_ah *ocrdma_create_ah(struct ib_pd *ibpd, struct rdma_ah_attr *attr,
/* Get network header type for this GID */ /* Get network header type for this GID */
ah->hdr_type = ib_gid_to_network_type(sgid_attr.gid_type, &sgid); ah->hdr_type = ib_gid_to_network_type(sgid_attr.gid_type, &sgid);
if ((pd->uctx) &&
(!rdma_is_multicast_addr((struct in6_addr *)grh->dgid.raw)) &&
(!rdma_link_local_addr((struct in6_addr *)grh->dgid.raw))) {
status = rdma_addr_find_l2_eth_by_grh(&sgid, &grh->dgid,
attr->roce.dmac,
&vlan_tag,
&sgid_attr.ndev->ifindex,
NULL);
if (status) {
pr_err("%s(): Failed to resolve dmac from gid."
"status = %d\n", __func__, status);
goto av_conf_err;
}
}
status = set_av_attr(dev, ah, attr, &sgid, pd->id, &isvlan, vlan_tag); status = set_av_attr(dev, ah, attr, &sgid, pd->id, &isvlan, vlan_tag);
if (status) if (status)
goto av_conf_err; goto av_conf_err;
......
...@@ -3622,8 +3622,6 @@ void ib_drain_rq(struct ib_qp *qp); ...@@ -3622,8 +3622,6 @@ void ib_drain_rq(struct ib_qp *qp);
void ib_drain_sq(struct ib_qp *qp); void ib_drain_sq(struct ib_qp *qp);
void ib_drain_qp(struct ib_qp *qp); void ib_drain_qp(struct ib_qp *qp);
int ib_resolve_eth_dmac(struct ib_device *device,
struct rdma_ah_attr *ah_attr);
int ib_get_eth_speed(struct ib_device *dev, u8 port_num, u8 *speed, u8 *width); int ib_get_eth_speed(struct ib_device *dev, u8 port_num, u8 *speed, u8 *width);
static inline u8 *rdma_ah_retrieve_dmac(struct rdma_ah_attr *attr) static inline u8 *rdma_ah_retrieve_dmac(struct rdma_ah_attr *attr)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment