Пример #1
0
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);
}
Пример #2
0
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);
}