Ejemplo n.º 1
0
int _tmain(int argc, _TCHAR* argv[])
{
	std::vector<int> msg_old = {
		0, 0, 1, 0, 0, 1, 0, 1,
		0, 0, 0, 0, 1, 1, 0, 1,
		0, 1, 0, 0, 1, 0, 1, 0, 1, 1 };

	std::vector<int> msg = { 0, 2, 5, 0, 13, 4, 10, 15, 4 };
	std::vector<int> bmsg = convertMessageToBinary(msg);
	std::vector<int> msg_decode(bmsg.begin() + 4, bmsg.end());

	decode_ext(msg_decode, msg_old);

	return 0;
}
Ejemplo n.º 2
0
int
qdevice_net_msg_received(struct qdevice_net_instance *instance)
{
	struct msg_decoded msg;
	int res;
	int ret_val;
	int msg_processed;

	msg_decoded_init(&msg);

	res = msg_decode(&instance->receive_buffer, &msg);
	if (res != 0) {
		/*
		 * Error occurred. Disconnect.
		 */
		qdevice_net_msg_received_log_msg_decode_error(res);
		qdevice_log(LOG_ERR, "Disconnecting from server");
		instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_MSG_DECODE_ERROR;

		return (-1);
	}

	ret_val = 0;

	msg_processed = 0;

	switch (msg.type) {
	case MSG_TYPE_INIT:
		msg_processed = 1;
		ret_val = qdevice_net_msg_received_init(instance, &msg);
		break;
	case MSG_TYPE_PREINIT:
		msg_processed = 1;
		ret_val = qdevice_net_msg_received_preinit(instance, &msg);
		break;
	case MSG_TYPE_PREINIT_REPLY:
		msg_processed = 1;
		ret_val = qdevice_net_msg_received_preinit_reply(instance, &msg);
		break;
	case MSG_TYPE_STARTTLS:
		msg_processed = 1;
		ret_val = qdevice_net_msg_received_starttls(instance, &msg);
		break;
	case MSG_TYPE_SERVER_ERROR:
		msg_processed = 1;
		ret_val = qdevice_net_msg_received_server_error(instance, &msg);
		break;
	case MSG_TYPE_INIT_REPLY:
		msg_processed = 1;
		ret_val = qdevice_net_msg_received_init_reply(instance, &msg);
		break;
	case MSG_TYPE_SET_OPTION:
		msg_processed = 1;
		ret_val = qdevice_net_msg_received_set_option(instance, &msg);
		break;
	case MSG_TYPE_SET_OPTION_REPLY:
		msg_processed = 1;
		ret_val = qdevice_net_msg_received_set_option_reply(instance, &msg);
		break;
	case MSG_TYPE_ECHO_REQUEST:
		msg_processed = 1;
		ret_val = qdevice_net_msg_received_echo_request(instance, &msg);
		break;
	case MSG_TYPE_ECHO_REPLY:
		msg_processed = 1;
		ret_val = qdevice_net_msg_received_echo_reply(instance, &msg);
		break;
	case MSG_TYPE_NODE_LIST:
		msg_processed = 1;
		ret_val = qdevice_net_msg_received_node_list(instance, &msg);
		break;
	case MSG_TYPE_NODE_LIST_REPLY:
		msg_processed = 1;
		ret_val = qdevice_net_msg_received_node_list_reply(instance, &msg);
		break;
	case MSG_TYPE_ASK_FOR_VOTE:
		msg_processed = 1;
		ret_val = qdevice_net_msg_received_ask_for_vote(instance, &msg);
		break;
	case MSG_TYPE_ASK_FOR_VOTE_REPLY:
		msg_processed = 1;
		ret_val = qdevice_net_msg_received_ask_for_vote_reply(instance, &msg);
		break;
	case MSG_TYPE_VOTE_INFO:
		msg_processed = 1;
		ret_val = qdevice_net_msg_received_vote_info(instance, &msg);
		break;
	case MSG_TYPE_VOTE_INFO_REPLY:
		msg_processed = 1;
		ret_val = qdevice_net_msg_received_vote_info_reply(instance, &msg);
		break;
	/*
	 * Default is not defined intentionally. Compiler shows warning when msg type is added
	 */
	}

	if (!msg_processed) {
		qdevice_log(LOG_ERR, "Received unsupported message %u. "
		    "Disconnecting from server", msg.type);
		instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_UNEXPECTED_MSG;

		ret_val = -1;
	}

	msg_decoded_destroy(&msg);

	return (ret_val);
}
Ejemplo n.º 3
0
static uns32 mds_callback(struct ncsmds_callback_info *info)
{
	struct rde_msg *msg;
	uns32 rc = NCSCC_RC_SUCCESS;
	RDE_CONTROL_BLOCK *cb = rde_get_control_block();

	switch (info->i_op) {
	case MDS_CALLBACK_COPY:
		rc = NCSCC_RC_FAILURE;
		break;
	case MDS_CALLBACK_ENC:
		rc = msg_encode(&info->info.enc);
		break;
	case MDS_CALLBACK_DEC:
		rc = msg_decode(&info->info.dec);
		break;
	case MDS_CALLBACK_ENC_FLAT:
		break;
	case MDS_CALLBACK_DEC_FLAT:
		break;
	case MDS_CALLBACK_RECEIVE:
		if (!peer_dest) {
			/* Sometimes a message from peer is received before MDS_UP, simulate MDS_UP */
			TRACE("generating up msg from rec event!");
			rc = mbx_send(RDE_MSG_PEER_UP, info->info.receive.i_fr_dest, info->info.receive.i_node_id);
		}

		msg = (struct rde_msg*)info->info.receive.i_msg;
		msg->fr_dest = info->info.receive.i_fr_dest;
		msg->fr_node_id = info->info.receive.i_node_id;
		if (ncs_ipc_send(&cb->mbx, (NCS_IPC_MSG *)info->info.receive.i_msg, NCS_IPC_PRIORITY_NORMAL) != NCSCC_RC_SUCCESS) {
			LOG_ER("ncs_ipc_send FAILED");
			free(msg);
			rc = NCSCC_RC_FAILURE;
			goto done;
		}
		break;
	case MDS_CALLBACK_SVC_EVENT:
		if (rde_my_node_id == info->info.svc_evt.i_node_id)
			goto done;

		if (info->info.svc_evt.i_change == NCSMDS_DOWN) {
			TRACE("MDS DOWN dest: %llx, node ID: %x, svc_id: %d",
				info->info.svc_evt.i_dest, info->info.svc_evt.i_node_id, info->info.svc_evt.i_svc_id);
			peer_dest = 0;
			rc = mbx_send(RDE_MSG_PEER_DOWN, info->info.svc_evt.i_dest, info->info.svc_evt.i_node_id);
		} else if (info->info.svc_evt.i_change == NCSMDS_UP) {
			TRACE("MDS UP dest: %llx, node ID: %x, svc_id: %d",
				info->info.svc_evt.i_dest, info->info.svc_evt.i_node_id, info->info.svc_evt.i_svc_id);
			peer_dest = info->info.svc_evt.i_dest;
			rc = mbx_send(RDE_MSG_PEER_UP, info->info.svc_evt.i_dest, info->info.svc_evt.i_node_id);
		} else {
			TRACE("MDS %u dest: %llx, node ID: %x, svc_id: %d", info->info.svc_evt.i_change,
				info->info.svc_evt.i_dest, info->info.svc_evt.i_node_id, info->info.svc_evt.i_svc_id);
		}

		break;
	case MDS_CALLBACK_QUIESCED_ACK:
		break;
	case MDS_CALLBACK_DIRECT_RECEIVE:
		break;
	default:
		break;
	}
done:
	return rc;
}