mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-28 21:45:01 +08:00
IB/CM: Create appropriate path records when handling CM request
When handling an incoming conection request, ib_cm creates either an IB or an OPA path record based on the gid field in the request. Signed-off-by: Dasaratharaman Chandramouli <dasaratharaman.chandramouli@intel.com> Reviewed-by: Don Hiatt <don.hiatt@intel.com> Reviewed-by: Ira Weiny <ira.weiny@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
e92aa00a51
commit
6b3c0e6e6d
@ -1428,6 +1428,21 @@ static inline int cm_is_active_peer(__be64 local_ca_guid, __be64 remote_ca_guid,
|
||||
(be32_to_cpu(local_qpn) > be32_to_cpu(remote_qpn))));
|
||||
}
|
||||
|
||||
static bool cm_req_has_alt_path(struct cm_req_msg *req_msg)
|
||||
{
|
||||
return ((req_msg->alt_local_lid) ||
|
||||
(ib_is_opa_gid(&req_msg->alt_local_gid)));
|
||||
}
|
||||
|
||||
static void cm_path_set_rec_type(struct ib_device *ib_device, u8 port_num,
|
||||
struct sa_path_rec *path, union ib_gid *gid)
|
||||
{
|
||||
if (ib_is_opa_gid(gid) && rdma_cap_opa_ah(ib_device, port_num))
|
||||
path->rec_type = SA_PATH_REC_TYPE_OPA;
|
||||
else
|
||||
path->rec_type = SA_PATH_REC_TYPE_IB;
|
||||
}
|
||||
|
||||
static void cm_format_paths_from_req(struct cm_req_msg *req_msg,
|
||||
struct sa_path_rec *primary_path,
|
||||
struct sa_path_rec *alt_path)
|
||||
@ -1807,9 +1822,12 @@ static int cm_req_handler(struct cm_work *work)
|
||||
dev_net(gid_attr.ndev));
|
||||
dev_put(gid_attr.ndev);
|
||||
} else {
|
||||
work->path[0].rec_type = SA_PATH_REC_TYPE_IB;
|
||||
cm_path_set_rec_type(work->port->cm_dev->ib_device,
|
||||
work->port->port_num,
|
||||
&work->path[0],
|
||||
&req_msg->primary_local_gid);
|
||||
}
|
||||
if (req_msg->alt_local_lid)
|
||||
if (cm_req_has_alt_path(req_msg))
|
||||
work->path[1].rec_type = work->path[0].rec_type;
|
||||
cm_format_paths_from_req(req_msg, &work->path[0],
|
||||
&work->path[1]);
|
||||
@ -1834,16 +1852,19 @@ static int cm_req_handler(struct cm_work *work)
|
||||
dev_net(gid_attr.ndev));
|
||||
dev_put(gid_attr.ndev);
|
||||
} else {
|
||||
work->path[0].rec_type = SA_PATH_REC_TYPE_IB;
|
||||
cm_path_set_rec_type(work->port->cm_dev->ib_device,
|
||||
work->port->port_num,
|
||||
&work->path[0],
|
||||
&req_msg->primary_local_gid);
|
||||
}
|
||||
if (req_msg->alt_local_lid)
|
||||
if (cm_req_has_alt_path(req_msg))
|
||||
work->path[1].rec_type = work->path[0].rec_type;
|
||||
ib_send_cm_rej(cm_id, IB_CM_REJ_INVALID_GID,
|
||||
&work->path[0].sgid, sizeof work->path[0].sgid,
|
||||
NULL, 0);
|
||||
goto rejected;
|
||||
}
|
||||
if (req_msg->alt_local_lid) {
|
||||
if (cm_req_has_alt_path(req_msg)) {
|
||||
ret = cm_init_av_by_path(&work->path[1], &cm_id_priv->alt_av,
|
||||
cm_id_priv);
|
||||
if (ret) {
|
||||
@ -2962,8 +2983,6 @@ static void cm_format_path_from_lap(struct cm_id_private *cm_id_priv,
|
||||
struct sa_path_rec *path,
|
||||
struct cm_lap_msg *lap_msg)
|
||||
{
|
||||
memset(path, 0, sizeof *path);
|
||||
path->rec_type = SA_PATH_REC_TYPE_IB;
|
||||
path->dgid = lap_msg->alt_local_gid;
|
||||
path->sgid = lap_msg->alt_remote_gid;
|
||||
sa_path_set_dlid(path, htonl(ntohs(lap_msg->alt_local_lid)));
|
||||
@ -2999,6 +3018,11 @@ static int cm_lap_handler(struct cm_work *work)
|
||||
return -EINVAL;
|
||||
|
||||
param = &work->cm_event.param.lap_rcvd;
|
||||
memset(&work->path[0], 0, sizeof(work->path[1]));
|
||||
cm_path_set_rec_type(work->port->cm_dev->ib_device,
|
||||
work->port->port_num,
|
||||
&work->path[0],
|
||||
&lap_msg->alt_local_gid);
|
||||
param->alternate_path = &work->path[0];
|
||||
cm_format_path_from_lap(cm_id_priv, param->alternate_path, lap_msg);
|
||||
work->cm_event.private_data = &lap_msg->private_data;
|
||||
|
Loading…
Reference in New Issue
Block a user