1071 id_priv->state = CMA_CONNECT;
1072 return id_priv;
1073err:
1074 rdma_destroy_id(id);
1075 return NULL;
1076}
1077
1078static void cma_set_req_event_data(struct rdma_cm_event *event,
1079 struct ib_cm_req_event_param *req_data,
1080 void *private_data, int offset)
1081{
1082 event->param.conn.private_data = private_data + offset;
1083 event->param.conn.private_data_len = IB_CM_REQ_PRIVATE_DATA_SIZE - offset;
1084 event->param.conn.responder_resources = req_data->responder_resources;
1085 event->param.conn.initiator_depth = req_data->initiator_depth;
1086 event->param.conn.flow_control = req_data->flow_control;
1087 event->param.conn.retry_count = req_data->retry_count;
1088 event->param.conn.rnr_retry_count = req_data->rnr_retry_count;
1089 event->param.conn.srq = req_data->srq;
1090 event->param.conn.qp_num = req_data->remote_qpn;
1091}
1092
1093static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
1094{
1095 struct rdma_id_private *listen_id, *conn_id;
1096 struct rdma_cm_event event;
1097 int offset, ret;
1098
1099 listen_id = cm_id->context;
1100 if (cma_disable_callback(listen_id, CMA_LISTEN))
1101 return -ECONNABORTED;
1102
1103 memset(&event, 0, sizeof event);
1104 offset = cma_user_data_offset(listen_id->id.ps);
1105 event.event = RDMA_CM_EVENT_CONNECT_REQUEST;
1106 if (cma_is_ud_ps(listen_id->id.ps)) {
1107 conn_id = cma_new_udp_id(&listen_id->id, ib_event);
1108 event.param.ud.private_data = ib_event->private_data + offset;
1109 event.param.ud.private_data_len =
1110 IB_CM_SIDR_REQ_PRIVATE_DATA_SIZE - offset;
1111 } else {