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; }
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); }
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; }