static void pscom_openib_handshake(pscom_con_t *con, int type, void *data, unsigned size) { switch (type) { case PSCOM_INFO_ARCH_REQ: { psoib_con_info_t *mcon = psoib_con_create(); con->arch.openib.mcon = mcon; if (!mcon) goto error_con_create; if (psoib_con_init(mcon, NULL, NULL)) goto error_con_init; psoib_info_msg_t msg; psoib_con_get_info_msg(mcon, &msg); pscom_precon_send(con->precon, PSCOM_INFO_OIB_ID, &msg, sizeof(msg)); break; /* Next is OIB_ID or ARCH_NEXT */ } case PSCOM_INFO_OIB_ID: { psoib_info_msg_t *msg = data; assert(sizeof(*msg) == size); if (psoib_con_connect(con->arch.openib.mcon, msg)) goto error_con_connect; pscom_precon_send(con->precon, PSCOM_INFO_ARCH_OK, NULL, 0); break; /* Next is EOF or ARCH_NEXT */ } case PSCOM_INFO_ARCH_OK: pscom_con_guard_start(con); break; case PSCOM_INFO_ARCH_NEXT: /* Cleanup con */ pscom_openib_con_cleanup(con); break; /* Done (this one failed) */ case PSCOM_INFO_EOF: pscom_openib_init_con(con); break; /* Done (use this one) */ } return; /* --- */ error_con_create: error_con_init: error_con_connect: pscom_openib_con_cleanup(con); pscom_precon_send_PSCOM_INFO_ARCH_NEXT(con->precon); }
static void pscom_openib_init(FILE *peer) { psoib_info_msg_t lmsg, rmsg; int rc; pscom.env.debug = arg_verbose; pscom_env_get_int(&pscom.env.debug, ENV_DEBUG); psoib_debug = pscom.env.debug; pscom_env_get_str(&psoib_hca, ENV_OPENIB_HCA); pscom_env_get_uint(&psoib_port, ENV_OPENIB_PORT); pscom_env_get_uint(&psoib_path_mtu, ENV_OPENIB_PATH_MTU); pscom_env_get_uint(&psoib_sendq_size, ENV_OPENIB_SENDQ_SIZE); pscom_env_get_uint(&psoib_recvq_size, ENV_OPENIB_RECVQ_SIZE); pscom_env_get_uint(&psoib_compq_size, ENV_OPENIB_COMPQ_SIZE); psoib_pending_tokens = psoib_pending_tokens_suggestion(); pscom_env_get_uint(&psoib_pending_tokens, ENV_OPENIB_PENDING_TOKENS); rc = psoib_init(); psoib_rc_check("psoib_init()", rc); mcon = psoib_con_create(); assert(mcon); rc = psoib_con_init(mcon, NULL, NULL); psoib_rc_check("psoib_con_init()", rc); psoib_con_get_info_msg(mcon, &lmsg); if (is_client) { info_write(peer, &lmsg); info_read(peer, &rmsg); } else { info_read(peer, &rmsg); info_write(peer, &lmsg); } rc = psoib_con_connect(mcon, &rmsg); psoib_rc_check("psoib_con_connect()", rc); }