-kibnal_listen_callback(IB_HANDLE cep, CM_CONN_INFO *info, void *arg)
-{
- IB_CA_ATTRIBUTES *ca_attr = &kibnal_data.kib_hca_attrs;
- IB_QP_ATTRIBUTES_QUERY *query;
- CM_REQUEST_INFO *req;
- CM_CONN_INFO *rep = NULL, *rcv = NULL;
- kib_wire_connreq_t *wcr;
- kib_conn_t *conn = NULL;
- uint16_t reason = 0;
- FSTATUS frc;
- int rc = 0;
-
- LASSERT(cep);
- LASSERT(info);
- LASSERT(arg == NULL); /* no conn yet for passive */
-
- CDEBUG(D_NET, "status 0x%x\n", info->Status);
-
- req = &info->Info.Request;
- wcr = (kib_wire_connreq_t *)req->PrivateData;
-
- CDEBUG(D_NET, "%d from "LPX64"\n", info->Status,
- le64_to_cpu(wcr->wcr_nid));
-
- if (info->Status == FCM_CONNECT_CANCEL)
- return;
-
- LASSERT (info->Status == FCM_CONNECT_REQUEST);
-
- if (wcr->wcr_magic != cpu_to_le32(IBNAL_MSG_MAGIC)) {
- CERROR ("Can't accept: bad magic %08x\n",
- le32_to_cpu(wcr->wcr_magic));
- GOTO(out, reason = RC_USER_REJ);
- }
-
- if (wcr->wcr_version != cpu_to_le16(IBNAL_MSG_VERSION)) {
- CERROR ("Can't accept: bad version %d\n",
- le16_to_cpu(wcr->wcr_magic));
- GOTO(out, reason = RC_USER_REJ);
- }
-
- rc = kibnal_accept(&conn, cep,
- le64_to_cpu(wcr->wcr_nid),
- le64_to_cpu(wcr->wcr_incarnation),
- le16_to_cpu(wcr->wcr_queue_depth));
- if (rc != 0) {
- CERROR ("Can't accept "LPX64": %d\n",
- le64_to_cpu(wcr->wcr_nid), rc);
- GOTO(out, reason = RC_NO_RESOURCES);
- }
-
- frc = kibnal_qp_rts(conn->ibc_qp, req->CEPInfo.QPN,
- min_t(__u8, req->CEPInfo.OfferedInitiatorDepth,
- ca_attr->MaxQPResponderResources),
- &req->PathInfo.Path,
- min_t(__u8, req->CEPInfo.OfferedResponderResources,
- ca_attr->MaxQPInitiatorDepth),
- req->CEPInfo.StartingPSN);
-
- if (frc != FSUCCESS) {
- CERROR ("Can't mark QP RTS/RTR "LPX64": %d\n",
- le64_to_cpu(wcr->wcr_nid), frc);
- GOTO(out, reason = RC_NO_QP);
- }
-
- frc = iibt_qp_query(conn->ibc_qp, &conn->ibc_qp_attrs, NULL);
- if (frc != FSUCCESS) {
- CERROR ("Couldn't query qp attributes "LPX64": %d\n",
- le64_to_cpu(wcr->wcr_nid), frc);
- GOTO(out, reason = RC_NO_QP);
- }
- query = &conn->ibc_qp_attrs;
-
- PORTAL_ALLOC(rep, sizeof(*rep));
- PORTAL_ALLOC(rcv, sizeof(*rcv));
- if (rep == NULL || rcv == NULL) {
- if (rep) PORTAL_FREE(rep, sizeof(*rep));
- if (rcv) PORTAL_FREE(rcv, sizeof(*rcv));
- CERROR ("can't allocate reply and receive buffers\n");
- GOTO(out, reason = RC_INSUFFICIENT_RESP_RES);
- }
-
- /* don't try to deref this into the incoming wcr :) */
- wcr = (kib_wire_connreq_t *)rep->Info.Reply.PrivateData;
-
- rep->Info.Reply = (CM_REPLY_INFO) {
- .QPN = query->QPNumber,
- .QKey = query->Qkey,
- .StartingPSN = query->RecvPSN,
- .EndToEndFlowControl = query->FlowControl,
- /* XXX Hmm. */
- .ArbInitiatorDepth = query->InitiatorDepth,
- .ArbResponderResources = query->ResponderResources,
- .TargetAckDelay = 0,
- .FailoverAccepted = 0,
- .RnRRetryCount = req->CEPInfo.RnrRetryCount,
- };
-
- *wcr = (kib_wire_connreq_t) {
- .wcr_magic = cpu_to_le32(IBNAL_MSG_MAGIC),
- .wcr_version = cpu_to_le16(IBNAL_MSG_VERSION),
- .wcr_queue_depth = cpu_to_le32(IBNAL_MSG_QUEUE_SIZE),
- .wcr_nid = cpu_to_le64(kibnal_data.kib_nid),
- .wcr_incarnation = cpu_to_le64(kibnal_data.kib_incarnation),
- };
-
- frc = iibt_cm_accept(cep, rep, rcv, kibnal_cm_callback, conn,
- &conn->ibc_cep);
-
- PORTAL_FREE(rep, sizeof(*rep));
- PORTAL_FREE(rcv, sizeof(*rcv));
-
- if (frc != FCM_CONNECT_ESTABLISHED) {
- /* XXX it seems we don't call reject after this point? */
- CERROR("iibt_cm_accept() failed: %d, aborting\n", frc);
- rc = -ECONNABORTED;
- goto out;
- }
-
- if (kibnal_set_cm_flags(conn->ibc_cep)) {
- rc = -ECONNABORTED;
- goto out;
- }
-
- CWARN("Connection %p -> "LPX64" ESTABLISHED.\n",
- conn, conn->ibc_peer->ibp_nid);
-
-out:
- if (reason) {
- kibnal_reject(cep, reason);
- rc = -ECONNABORTED;
- }
- if (conn != NULL)
- kibnal_connreq_done(conn, 0, rc);
-
- return;
-}
-
-static void