|
@@ -340,7 +340,7 @@ static int cma_translate_addr(struct sockaddr *addr, struct rdma_dev_addr *dev_a
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
if (addr->sa_family != AF_IB) {
|
|
if (addr->sa_family != AF_IB) {
|
|
- ret = rdma_translate_ip(addr, dev_addr);
|
|
|
|
|
|
+ ret = rdma_translate_ip(addr, dev_addr, NULL);
|
|
} else {
|
|
} else {
|
|
cma_translate_ib((struct sockaddr_ib *) addr, dev_addr);
|
|
cma_translate_ib((struct sockaddr_ib *) addr, dev_addr);
|
|
ret = 0;
|
|
ret = 0;
|
|
@@ -603,6 +603,7 @@ static int cma_modify_qp_rtr(struct rdma_id_private *id_priv,
|
|
{
|
|
{
|
|
struct ib_qp_attr qp_attr;
|
|
struct ib_qp_attr qp_attr;
|
|
int qp_attr_mask, ret;
|
|
int qp_attr_mask, ret;
|
|
|
|
+ union ib_gid sgid;
|
|
|
|
|
|
mutex_lock(&id_priv->qp_mutex);
|
|
mutex_lock(&id_priv->qp_mutex);
|
|
if (!id_priv->id.qp) {
|
|
if (!id_priv->id.qp) {
|
|
@@ -625,6 +626,20 @@ static int cma_modify_qp_rtr(struct rdma_id_private *id_priv,
|
|
if (ret)
|
|
if (ret)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
|
|
+ ret = ib_query_gid(id_priv->id.device, id_priv->id.port_num,
|
|
|
|
+ qp_attr.ah_attr.grh.sgid_index, &sgid);
|
|
|
|
+ if (ret)
|
|
|
|
+ goto out;
|
|
|
|
+
|
|
|
|
+ if (rdma_node_get_transport(id_priv->cma_dev->device->node_type)
|
|
|
|
+ == RDMA_TRANSPORT_IB &&
|
|
|
|
+ rdma_port_get_link_layer(id_priv->id.device, id_priv->id.port_num)
|
|
|
|
+ == IB_LINK_LAYER_ETHERNET) {
|
|
|
|
+ ret = rdma_addr_find_smac_by_sgid(&sgid, qp_attr.smac, NULL);
|
|
|
|
+
|
|
|
|
+ if (ret)
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
if (conn_param)
|
|
if (conn_param)
|
|
qp_attr.max_dest_rd_atomic = conn_param->responder_resources;
|
|
qp_attr.max_dest_rd_atomic = conn_param->responder_resources;
|
|
ret = ib_modify_qp(id_priv->id.qp, &qp_attr, qp_attr_mask);
|
|
ret = ib_modify_qp(id_priv->id.qp, &qp_attr, qp_attr_mask);
|
|
@@ -725,6 +740,7 @@ int rdma_init_qp_attr(struct rdma_cm_id *id, struct ib_qp_attr *qp_attr,
|
|
else
|
|
else
|
|
ret = ib_cm_init_qp_attr(id_priv->cm_id.ib, qp_attr,
|
|
ret = ib_cm_init_qp_attr(id_priv->cm_id.ib, qp_attr,
|
|
qp_attr_mask);
|
|
qp_attr_mask);
|
|
|
|
+
|
|
if (qp_attr->qp_state == IB_QPS_RTR)
|
|
if (qp_attr->qp_state == IB_QPS_RTR)
|
|
qp_attr->rq_psn = id_priv->seq_num;
|
|
qp_attr->rq_psn = id_priv->seq_num;
|
|
break;
|
|
break;
|
|
@@ -1266,6 +1282,15 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
|
|
struct rdma_id_private *listen_id, *conn_id;
|
|
struct rdma_id_private *listen_id, *conn_id;
|
|
struct rdma_cm_event event;
|
|
struct rdma_cm_event event;
|
|
int offset, ret;
|
|
int offset, ret;
|
|
|
|
+ u8 smac[ETH_ALEN];
|
|
|
|
+ u8 alt_smac[ETH_ALEN];
|
|
|
|
+ u8 *psmac = smac;
|
|
|
|
+ u8 *palt_smac = alt_smac;
|
|
|
|
+ int is_iboe = ((rdma_node_get_transport(cm_id->device->node_type) ==
|
|
|
|
+ RDMA_TRANSPORT_IB) &&
|
|
|
|
+ (rdma_port_get_link_layer(cm_id->device,
|
|
|
|
+ ib_event->param.req_rcvd.port) ==
|
|
|
|
+ IB_LINK_LAYER_ETHERNET));
|
|
|
|
|
|
listen_id = cm_id->context;
|
|
listen_id = cm_id->context;
|
|
if (!cma_check_req_qp_type(&listen_id->id, ib_event))
|
|
if (!cma_check_req_qp_type(&listen_id->id, ib_event))
|
|
@@ -1310,12 +1335,29 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
|
|
if (ret)
|
|
if (ret)
|
|
goto err3;
|
|
goto err3;
|
|
|
|
|
|
|
|
+ if (is_iboe) {
|
|
|
|
+ if (ib_event->param.req_rcvd.primary_path != NULL)
|
|
|
|
+ rdma_addr_find_smac_by_sgid(
|
|
|
|
+ &ib_event->param.req_rcvd.primary_path->sgid,
|
|
|
|
+ psmac, NULL);
|
|
|
|
+ else
|
|
|
|
+ psmac = NULL;
|
|
|
|
+ if (ib_event->param.req_rcvd.alternate_path != NULL)
|
|
|
|
+ rdma_addr_find_smac_by_sgid(
|
|
|
|
+ &ib_event->param.req_rcvd.alternate_path->sgid,
|
|
|
|
+ palt_smac, NULL);
|
|
|
|
+ else
|
|
|
|
+ palt_smac = NULL;
|
|
|
|
+ }
|
|
/*
|
|
/*
|
|
* Acquire mutex to prevent user executing rdma_destroy_id()
|
|
* Acquire mutex to prevent user executing rdma_destroy_id()
|
|
* while we're accessing the cm_id.
|
|
* while we're accessing the cm_id.
|
|
*/
|
|
*/
|
|
mutex_lock(&lock);
|
|
mutex_lock(&lock);
|
|
- if (cma_comp(conn_id, RDMA_CM_CONNECT) && (conn_id->id.qp_type != IB_QPT_UD))
|
|
|
|
|
|
+ if (is_iboe)
|
|
|
|
+ ib_update_cm_av(cm_id, psmac, palt_smac);
|
|
|
|
+ if (cma_comp(conn_id, RDMA_CM_CONNECT) &&
|
|
|
|
+ (conn_id->id.qp_type != IB_QPT_UD))
|
|
ib_send_cm_mra(cm_id, CMA_CM_MRA_SETTING, NULL, 0);
|
|
ib_send_cm_mra(cm_id, CMA_CM_MRA_SETTING, NULL, 0);
|
|
mutex_unlock(&lock);
|
|
mutex_unlock(&lock);
|
|
mutex_unlock(&conn_id->handler_mutex);
|
|
mutex_unlock(&conn_id->handler_mutex);
|
|
@@ -1474,7 +1516,7 @@ static int iw_conn_req_handler(struct iw_cm_id *cm_id,
|
|
mutex_lock_nested(&conn_id->handler_mutex, SINGLE_DEPTH_NESTING);
|
|
mutex_lock_nested(&conn_id->handler_mutex, SINGLE_DEPTH_NESTING);
|
|
conn_id->state = RDMA_CM_CONNECT;
|
|
conn_id->state = RDMA_CM_CONNECT;
|
|
|
|
|
|
- ret = rdma_translate_ip(laddr, &conn_id->id.route.addr.dev_addr);
|
|
|
|
|
|
+ ret = rdma_translate_ip(laddr, &conn_id->id.route.addr.dev_addr, NULL);
|
|
if (ret) {
|
|
if (ret) {
|
|
mutex_unlock(&conn_id->handler_mutex);
|
|
mutex_unlock(&conn_id->handler_mutex);
|
|
rdma_destroy_id(new_cm_id);
|
|
rdma_destroy_id(new_cm_id);
|
|
@@ -1873,7 +1915,7 @@ static int cma_resolve_iboe_route(struct rdma_id_private *id_priv)
|
|
struct cma_work *work;
|
|
struct cma_work *work;
|
|
int ret;
|
|
int ret;
|
|
struct net_device *ndev = NULL;
|
|
struct net_device *ndev = NULL;
|
|
- u16 vid;
|
|
|
|
|
|
+
|
|
|
|
|
|
work = kzalloc(sizeof *work, GFP_KERNEL);
|
|
work = kzalloc(sizeof *work, GFP_KERNEL);
|
|
if (!work)
|
|
if (!work)
|
|
@@ -1897,10 +1939,14 @@ static int cma_resolve_iboe_route(struct rdma_id_private *id_priv)
|
|
goto err2;
|
|
goto err2;
|
|
}
|
|
}
|
|
|
|
|
|
- vid = rdma_vlan_dev_vlan_id(ndev);
|
|
|
|
|
|
+ route->path_rec->vlan_id = rdma_vlan_dev_vlan_id(ndev);
|
|
|
|
+ memcpy(route->path_rec->dmac, addr->dev_addr.dst_dev_addr, ETH_ALEN);
|
|
|
|
+ memcpy(route->path_rec->smac, ndev->dev_addr, ndev->addr_len);
|
|
|
|
|
|
- iboe_mac_vlan_to_ll(&route->path_rec->sgid, addr->dev_addr.src_dev_addr, vid);
|
|
|
|
- iboe_mac_vlan_to_ll(&route->path_rec->dgid, addr->dev_addr.dst_dev_addr, vid);
|
|
|
|
|
|
+ iboe_mac_vlan_to_ll(&route->path_rec->sgid, addr->dev_addr.src_dev_addr,
|
|
|
|
+ route->path_rec->vlan_id);
|
|
|
|
+ iboe_mac_vlan_to_ll(&route->path_rec->dgid, addr->dev_addr.dst_dev_addr,
|
|
|
|
+ route->path_rec->vlan_id);
|
|
|
|
|
|
route->path_rec->hop_limit = 1;
|
|
route->path_rec->hop_limit = 1;
|
|
route->path_rec->reversible = 1;
|
|
route->path_rec->reversible = 1;
|