@@ -1173,8 +1173,24 @@ static void cm_format_req(struct cm_req_msg *req_msg,
struct cm_id_private *cm_id_priv,
struct ib_cm_req_param *param)
{
- struct sa_path_rec *pri_path = param->primary_path;
- struct sa_path_rec *alt_path = param->alternate_path;
+ struct sa_path_rec *pri_path;
+ struct sa_path_rec *alt_path;
+ struct sa_path_rec conv_path;
+
+ if (param->primary_path->rec_type == SA_PATH_REC_TYPE_OPA) {
+ sa_convert_path_opa_to_ib(&conv_path, param->primary_path);
+ pri_path = &conv_path;
+ } else {
+ pri_path = param->primary_path;
+ }
+
+ if ((param->alternate_path) &&
+ (param->alternate_path->rec_type == SA_PATH_REC_TYPE_OPA)) {
+ sa_convert_path_opa_to_ib(&conv_path, param->alternate_path);
+ alt_path = &conv_path;
+ } else {
+ alt_path = param->alternate_path;
+ }
cm_format_mad_hdr(&req_msg->hdr, CM_REQ_ATTR_ID,
cm_form_tid(cm_id_priv, CM_MSG_SEQUENCE_REQ));
@@ -2843,6 +2859,9 @@ static void cm_format_lap(struct cm_lap_msg *lap_msg,
const void *private_data,
u8 private_data_len)
{
+ struct sa_path_rec conv_path;
+ struct sa_path_rec *path;
+
cm_format_mad_hdr(&lap_msg->hdr, CM_LAP_ATTR_ID,
cm_form_tid(cm_id_priv, CM_MSG_SEQUENCE_LAP));
lap_msg->local_comm_id = cm_id_priv->id.local_id;
@@ -2850,21 +2869,27 @@ static void cm_format_lap(struct cm_lap_msg *lap_msg,
cm_lap_set_remote_qpn(lap_msg, cm_id_priv->remote_qpn);
/* todo: need remote CM response timeout */
cm_lap_set_remote_resp_timeout(lap_msg, 0x1F);
+ if (alternate_path->rec_type == SA_PATH_REC_TYPE_OPA) {
+ sa_convert_path_opa_to_ib(&conv_path, alternate_path);
+ path = &conv_path;
+ } else {
+ path = alternate_path;
+ }
lap_msg->alt_local_lid =
- htons(ntohl(sa_path_get_slid(alternate_path)));
+ htons(ntohl(sa_path_get_slid(path)));
lap_msg->alt_remote_lid =
- htons(ntohl(sa_path_get_dlid(alternate_path)));
- lap_msg->alt_local_gid = alternate_path->sgid;
- lap_msg->alt_remote_gid = alternate_path->dgid;
- cm_lap_set_flow_label(lap_msg, alternate_path->flow_label);
- cm_lap_set_traffic_class(lap_msg, alternate_path->traffic_class);
- lap_msg->alt_hop_limit = alternate_path->hop_limit;
- cm_lap_set_packet_rate(lap_msg, alternate_path->rate);
- cm_lap_set_sl(lap_msg, alternate_path->sl);
+ htons(ntohl(sa_path_get_dlid(path)));
+ lap_msg->alt_local_gid = path->sgid;
+ lap_msg->alt_remote_gid = path->dgid;
+ cm_lap_set_flow_label(lap_msg, path->flow_label);
+ cm_lap_set_traffic_class(lap_msg, path->traffic_class);
+ lap_msg->alt_hop_limit = path->hop_limit;
+ cm_lap_set_packet_rate(lap_msg, path->rate);
+ cm_lap_set_sl(lap_msg, path->sl);
cm_lap_set_subnet_local(lap_msg, 1); /* local only... */
cm_lap_set_local_ack_timeout(lap_msg,
cm_ack_timeout(cm_id_priv->av.port->cm_dev->ack_delay,
- alternate_path->packet_life_time));
+ path->packet_life_time));
if (private_data && private_data_len)
memcpy(lap_msg->private_data, private_data, private_data_len);