Beispiel #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);
}
Beispiel #2
0
static
void pscom_mxm_handshake(pscom_con_t *con, int type, void *data, unsigned size)
{
	switch (type) {
	case PSCOM_INFO_ARCH_REQ: {
		psmxm_info_msg_t msg;
		psmxm_con_info_t *ci = psmxm_con_create();

		con->arch.mxm.ci = ci;
		con->arch.mxm.reading = 0;
		con->arch.mxm.sreq = NULL;

		if (psmxm_con_init(ci)) goto error_con_init;

		/* send my connection id's */
		psmxm_con_get_info_msg(ci, &msg);

		pscom_precon_send(con->precon, PSCOM_INFO_MXM_ID, &msg, sizeof(msg));
		break; /* Next is PSCOM_INFO_MXM_ID or PSCOM_INFO_ARCH_NEXT */
	}
	case PSCOM_INFO_MXM_ID: {
		psmxm_info_msg_t *msg = data;
		assert(sizeof(*msg) == size);

		if (psmxm_con_connect(con->arch.mxm.ci, msg, con)) 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_NEXT:
		/* Something failed. Cleanup. */
		pscom_mxm_con_cleanup(con);
		break; /* Done. Mxm failed */
	case PSCOM_INFO_EOF:
		pscom_mxm_init_con(con);
		break; /* Done. Use Mxm */
	}
	return;
	/* --- */
error_con_connect:
error_con_init:
	pscom_mxm_con_cleanup(con);
	pscom_precon_send_PSCOM_INFO_ARCH_NEXT(con->precon);
}
Beispiel #3
0
static
void pscom_tcp_handshake(pscom_con_t *con, int type, void *data, unsigned size)
{
	precon_t *pre = con->precon;
	switch (type) {
	case PSCOM_INFO_ARCH_REQ:
		pre->closefd_on_cleanup = 0; // Keep fd after usage
		pscom_precon_send(pre, PSCOM_INFO_ARCH_OK, NULL, 0);
		break;
	case PSCOM_INFO_ARCH_OK:
		if (pre) {
			tcp_set_fd(con, pre->ufd_info.fd);
		}
		break;
	case PSCOM_INFO_EOF:
		tcp_init_con(con);
		break;
	}
}