/**************************************************************************** Name : mqnd_mds_dec Description : This function decodes an events sent to MQND. Arguments : cb : MQND control Block. info : Info for decoding Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ static uns32 mqnd_mds_dec(MQND_CB *cb, MDS_CALLBACK_DEC_INFO *dec_info) { MQSV_EVT *msg_ptr; EDU_ERR ederror = 0; uns32 rc = NCSCC_RC_SUCCESS; NCS_BOOL is_valid_msg_fmt; switch (dec_info->i_fr_svc_id) { case NCSMDS_SVC_ID_MQA: is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(dec_info->i_msg_fmt_ver, MQND_WRT_MQA_SUBPART_VER_AT_MIN_MSG_FMT, MQND_WRT_MQA_SUBPART_VER_AT_MAX_MSG_FMT, mqnd_mqa_msg_fmt_table); break; case NCSMDS_SVC_ID_MQND: is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(dec_info->i_msg_fmt_ver, MQND_WRT_MQND_SUBPART_VER_AT_MIN_MSG_FMT, MQND_WRT_MQND_SUBPART_VER_AT_MAX_MSG_FMT, mqnd_mqnd_msg_fmt_table); break; case NCSMDS_SVC_ID_MQD: is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(dec_info->i_msg_fmt_ver, MQND_WRT_MQD_SUBPART_VER_AT_MIN_MSG_FMT, MQND_WRT_MQD_SUBPART_VER_AT_MAX_MSG_FMT, mqnd_mqd_msg_fmt_table); break; default: return NCSCC_RC_FAILURE; } if (is_valid_msg_fmt && (dec_info->i_msg_fmt_ver != 1)) { msg_ptr = m_MMGR_ALLOC_MQSV_EVT(NCS_SERVICE_ID_MQND); if (!msg_ptr) { m_LOG_MQSV_ND(MQND_EVT_ALLOC_FAILED, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, NCSCC_RC_FAILURE, __FILE__, __LINE__); return NCSCC_RC_FAILURE; } memset(msg_ptr, 0, sizeof(MQSV_EVT)); dec_info->o_msg = (NCSCONTEXT)msg_ptr; rc = m_NCS_EDU_EXEC(&cb->edu_hdl, mqsv_edp_mqsv_evt, dec_info->io_uba, EDP_OP_TYPE_DEC, (MQSV_EVT **)&dec_info->o_msg, &ederror); if (rc != NCSCC_RC_SUCCESS) { m_LOG_MQSV_ND(MQND_MDS_DEC_FAILED, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, rc, __FILE__, __LINE__); m_MMGR_FREE_MQSV_EVT(dec_info->o_msg, NCS_SERVICE_ID_MQND); } return rc; } else { /* Drop The Message */ m_LOG_MQSV_ND(MQND_MSG_FRMT_VER_INVALID, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, is_valid_msg_fmt, __FILE__, __LINE__); TRACE("mqnd_mds_dec:INVALID MSG FORMAT %d", is_valid_msg_fmt); return NCSCC_RC_FAILURE; } }
/**************************************************************************** Name : cpa_mds_dec Description : This function decodes an events sent to CPA. Arguments : cb : CPA control Block. info : Info for decoding Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ static uint32_t cpa_mds_dec(CPA_CB *cb, MDS_CALLBACK_DEC_INFO *dec_info) { CPSV_EVT *msg_ptr = NULL; EDU_ERR ederror = 0; uint32_t rc = NCSCC_RC_SUCCESS; uint8_t local_data[20]; uint8_t *pstream; bool is_valid_msg_fmt = false; TRACE_ENTER(); if (dec_info->i_fr_svc_id == NCSMDS_SVC_ID_CPND) { is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(dec_info->i_msg_fmt_ver, CPA_WRT_CPND_SUBPART_VER_MIN, CPA_WRT_CPND_SUBPART_VER_MAX, cpa_cpnd_msg_fmt_table); } else if (dec_info->i_fr_svc_id == NCSMDS_SVC_ID_CPD) { is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(dec_info->i_msg_fmt_ver, CPA_WRT_CPD_SUBPART_VER_MIN, CPA_WRT_CPD_SUBPART_VER_MAX, cpa_cpd_msg_fmt_table); } if (is_valid_msg_fmt) { msg_ptr = m_MMGR_ALLOC_CPSV_EVT(NCS_SERVICE_ID_CPA); if (!msg_ptr) return NCSCC_RC_FAILURE; memset(msg_ptr, 0, sizeof(CPSV_EVT)); dec_info->o_msg = (NCSCONTEXT)msg_ptr; pstream = ncs_dec_flatten_space(dec_info->io_uba, local_data, 8); msg_ptr->type = ncs_decode_32bit(&pstream); if (msg_ptr->type == CPSV_EVT_TYPE_CPA) { /* For Events Write/Read Call EDU VER_EXEC*/ rc = m_NCS_EDU_VER_EXEC(&cb->edu_hdl, FUNC_NAME(CPSV_EVT), dec_info->io_uba, EDP_OP_TYPE_DEC, (CPSV_EVT **)&dec_info->o_msg, &ederror, dec_info->i_msg_fmt_ver); goto free; /* if(msg_ptr->info.cpa.type == CPA_EVT_ND2A_CKPT_DATA_RSP) */ } /* if( msg_ptr->type == CPSV_EVT_TYPE_CPA) */ /* For all Other Cases Other Than CPA( Read / Write Rsp Follow EDU rules */ rc = m_NCS_EDU_EXEC(&cb->edu_hdl, FUNC_NAME(CPSV_EVT), dec_info->io_uba, EDP_OP_TYPE_DEC, (CPSV_EVT **)&dec_info->o_msg, &ederror); free: if (rc != NCSCC_RC_SUCCESS) { m_MMGR_FREE_CPSV_EVT(dec_info->o_msg, NCS_SERVICE_ID_CPA); } TRACE_LEAVE(); return rc; } else { TRACE_4("CPA:Processing failed for mds_dec "); TRACE_LEAVE(); return NCSCC_RC_FAILURE; } }
/**************************************************************************** Name : cpa_mds_dec Description : This function decodes an events sent to CPA. Arguments : cb : CPA control Block. info : Info for decoding Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ static uns32 cpa_mds_dec(CPA_CB *cb, MDS_CALLBACK_DEC_INFO *dec_info) { CPSV_EVT *msg_ptr = NULL; EDU_ERR ederror = 0; uns32 rc = NCSCC_RC_SUCCESS; uns8 local_data[20]; uns8 *pstream; NCS_BOOL is_valid_msg_fmt = FALSE; if (dec_info->i_fr_svc_id == NCSMDS_SVC_ID_CPND) { is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(dec_info->i_msg_fmt_ver, CPA_WRT_CPND_SUBPART_VER_MIN, CPA_WRT_CPND_SUBPART_VER_MAX, cpa_cpnd_msg_fmt_table); } else if (dec_info->i_fr_svc_id == NCSMDS_SVC_ID_CPD) { is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(dec_info->i_msg_fmt_ver, CPA_WRT_CPD_SUBPART_VER_MIN, CPA_WRT_CPD_SUBPART_VER_MAX, cpa_cpd_msg_fmt_table); } if (is_valid_msg_fmt) { msg_ptr = m_MMGR_ALLOC_CPSV_EVT(NCS_SERVICE_ID_CPA); if (!msg_ptr) return NCSCC_RC_FAILURE; memset(msg_ptr, 0, sizeof(CPSV_EVT)); dec_info->o_msg = (NCSCONTEXT)msg_ptr; pstream = ncs_dec_flatten_space(dec_info->io_uba, local_data, 8); msg_ptr->type = ncs_decode_32bit(&pstream); if (msg_ptr->type == CPSV_EVT_TYPE_CPA) { msg_ptr->info.cpa.type = ncs_decode_32bit(&pstream); if (msg_ptr->info.cpa.type == CPA_EVT_ND2A_CKPT_DATA_RSP) { ncs_dec_skip_space(dec_info->io_uba, 8); rc = cpsv_data_access_rsp_decode(&msg_ptr->info.cpa.info.sec_data_rsp, dec_info->io_uba); goto free; } /* if(msg_ptr->info.cpa.type == CPA_EVT_ND2A_CKPT_DATA_RSP) */ } /* if( msg_ptr->type == CPSV_EVT_TYPE_CPA) */ /* For all Other Cases Other Than CPA( Read / Write Rsp Follow EDU rules */ rc = m_NCS_EDU_EXEC(&cb->edu_hdl, FUNC_NAME(CPSV_EVT), dec_info->io_uba, EDP_OP_TYPE_DEC, (CPSV_EVT **)&dec_info->o_msg, &ederror); free: if (rc != NCSCC_RC_SUCCESS) { m_MMGR_FREE_CPSV_EVT(dec_info->o_msg, NCS_SERVICE_ID_CPA); } return rc; } else { m_LOG_CPA_CCL(CPA_PROC_FAILED, NCSFL_LC_CKPT_MGMT, NCSFL_SEV_INFO, "mds_dec", __FILE__, __LINE__); return NCSCC_RC_FAILURE; } }
/**************************************************************************** Name : cpa_mds_dec_flat Description : This function decodes an events sent to CPA. Arguments : cb : CPA control Block. dec_info : Info for decoding Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ static uns32 cpa_mds_dec_flat(CPA_CB *cb, MDS_CALLBACK_DEC_FLAT_INFO *info) { CPSV_EVT *evt = NULL; NCS_UBAID *uba = info->io_uba; uns32 rc = NCSCC_RC_SUCCESS; NCS_BOOL is_valid_msg_fmt = FALSE; if (info->i_fr_svc_id == NCSMDS_SVC_ID_CPND) { is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(info->i_msg_fmt_ver, CPA_WRT_CPND_SUBPART_VER_MIN, CPA_WRT_CPND_SUBPART_VER_MAX, cpa_cpnd_msg_fmt_table); } else if (info->i_fr_svc_id == NCSMDS_SVC_ID_CPD) { is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(info->i_msg_fmt_ver, CPA_WRT_CPD_SUBPART_VER_MIN, CPA_WRT_CPD_SUBPART_VER_MAX, cpa_cpd_msg_fmt_table); } if (is_valid_msg_fmt) { if (info->i_fr_svc_id == NCSMDS_SVC_ID_CPND || info->i_fr_svc_id == NCSMDS_SVC_ID_CPD) { evt = (CPSV_EVT *)m_MMGR_ALLOC_CPSV_EVT(NCS_SERVICE_ID_CPA); if (evt == NULL) { m_LOG_CPA_CCLL(CPA_MEM_ALLOC_FAILED, NCSFL_LC_CKPT_MGMT, NCSFL_SEV_ERROR, "mds_dec_flat", __FILE__, __LINE__, NCSCC_RC_OUT_OF_MEM); return NCSCC_RC_OUT_OF_MEM; } info->o_msg = evt; rc = cpsv_evt_dec_flat(&cb->edu_hdl, uba, evt); return rc; } else { m_LOG_CPA_CCLL(CPA_PROC_FAILED, NCSFL_LC_CKPT_MGMT, NCSFL_SEV_INFO, "mds_dec_flat", __FILE__, __LINE__, rc); return NCSCC_RC_FAILURE; } } else { m_LOG_CPA_CCLL(CPA_PROC_FAILED, NCSFL_LC_CKPT_MGMT, NCSFL_SEV_INFO, "mds_dec_flat", __FILE__, __LINE__, rc); return NCSCC_RC_FAILURE; } }
/**************************************************************************** Name : cpa_mds_dec_flat Description : This function decodes an events sent to CPA. Arguments : cb : CPA control Block. dec_info : Info for decoding Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ static uint32_t cpa_mds_dec_flat(CPA_CB *cb, MDS_CALLBACK_DEC_FLAT_INFO *info) { CPSV_EVT *evt = NULL; NCS_UBAID *uba = info->io_uba; uint32_t rc = NCSCC_RC_SUCCESS; bool is_valid_msg_fmt = false; TRACE_ENTER(); if (info->i_fr_svc_id == NCSMDS_SVC_ID_CPND) { is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(info->i_msg_fmt_ver, CPA_WRT_CPND_SUBPART_VER_MIN, CPA_WRT_CPND_SUBPART_VER_MAX, cpa_cpnd_msg_fmt_table); } else if (info->i_fr_svc_id == NCSMDS_SVC_ID_CPD) { is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(info->i_msg_fmt_ver, CPA_WRT_CPD_SUBPART_VER_MIN, CPA_WRT_CPD_SUBPART_VER_MAX, cpa_cpd_msg_fmt_table); } if (is_valid_msg_fmt) { if (info->i_fr_svc_id == NCSMDS_SVC_ID_CPND || info->i_fr_svc_id == NCSMDS_SVC_ID_CPD) { evt = (CPSV_EVT *)m_MMGR_ALLOC_CPSV_EVT(NCS_SERVICE_ID_CPA); if (evt == NULL) { TRACE_4("cpa mem allocation failed in mds_dec_flat"); return NCSCC_RC_OUT_OF_MEM; } info->o_msg = evt; rc = cpsv_evt_dec_flat(&cb->edu_hdl, uba, evt); TRACE_LEAVE(); return rc; } else { TRACE_4("cpa api processing failed in mds_dec_flat with return value:%d",rc); return NCSCC_RC_FAILURE; } } else { TRACE_4("cpa api processing failed in mds_dec_flat with return value:%d",rc); return NCSCC_RC_FAILURE; } }
/**************************************************************************** * Name : mqnd_mds_direct_rcv * * Description : MDS will call this function on receiving MQND/ASAPi messages. * * Arguments : cb - MQND Control Block * direct_rcv_info - MDS Direct Receive information. * * Return Values : NCSCC_RC_SUCCESS/Error Code. * * Notes : None. *****************************************************************************/ static uns32 mqnd_mds_direct_rcv(MQND_CB *pMqnd, MDS_CALLBACK_DIRECT_RECEIVE_INFO *direct_rcv_info) { uns32 rc = NCSCC_RC_SUCCESS, is_valid_msg_fmt; MQSV_DSEND_EVT *pEvt = (MQSV_DSEND_EVT *)direct_rcv_info->i_direct_buff; NCS_BOOL endianness = machineEndianness(); is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(direct_rcv_info->i_msg_fmt_ver, MQND_WRT_MQA_SUBPART_VER_AT_MIN_MSG_FMT, MQND_WRT_MQA_SUBPART_VER_AT_MAX_MSG_FMT, mqnd_mqa_msg_fmt_table); if (!is_valid_msg_fmt || (direct_rcv_info->i_msg_fmt_ver == 1)) { /* Drop The Message */ m_LOG_MQSV_ND(MQND_MSG_FRMT_VER_INVALID, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, is_valid_msg_fmt, __FILE__, __LINE__); TRACE("mqnd_mds_direct_rcv:INVALID MSG FORMAT %d", is_valid_msg_fmt); return NCSCC_RC_FAILURE; } pEvt->sinfo.ctxt = direct_rcv_info->i_msg_ctxt; pEvt->sinfo.dest = direct_rcv_info->i_fr_dest; pEvt->sinfo.to_svc = direct_rcv_info->i_fr_svc_id; if (direct_rcv_info->i_rsp_reqd) { pEvt->sinfo.stype = MDS_SENDTYPE_RSP; } m_LOG_MQSV_ND(MQND_MDS_SNDDIRECT_RCV, NCSFL_LC_MQSV_INIT, NCSFL_SEV_INFO, endianness, __FILE__, __LINE__); /* If the endianess of the source is different, decode to host order */ if (pEvt->endianness != endianness) { pEvt->type.raw = m_MQSV_REVERSE_ENDIAN_L(&pEvt->type, endianness); switch (pEvt->type.req_type) { case MQP_EVT_SEND_MSG: { pEvt->agent_mds_dest = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->agent_mds_dest, endianness); pEvt->info.snd_msg.msgHandle = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.snd_msg.msgHandle, endianness); pEvt->info.snd_msg.queueHandle = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.snd_msg.queueHandle, endianness); pEvt->info.snd_msg.destination.length = m_MQSV_REVERSE_ENDIAN_S(&pEvt->info.snd_msg.destination.length, endianness); pEvt->info.snd_msg.ackFlags = m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.snd_msg.ackFlags, endianness); pEvt->info.snd_msg.messageInfo.sendTime = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.snd_msg.messageInfo.sendTime, endianness); pEvt->info.snd_msg.messageInfo.sendReceive = m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.snd_msg.messageInfo.sendReceive, endianness); if (pEvt->info.snd_msg.messageInfo.sendReceive == SA_FALSE) { pEvt->info.snd_msg.messageInfo.sender.senderId = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.snd_msg.messageInfo.sender.senderId, endianness); } else { pEvt->info.snd_msg.messageInfo.sender.sender_context.sender_dest = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.snd_msg.messageInfo.sender. sender_context.sender_dest, endianness); pEvt->info.snd_msg.messageInfo.sender.sender_context.reply_buffer_size = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.snd_msg.messageInfo.sender. sender_context.reply_buffer_size, endianness); } pEvt->info.snd_msg.message.type = m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.snd_msg.message.type, endianness); pEvt->info.snd_msg.message.version = m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.snd_msg.message.version, endianness); pEvt->info.snd_msg.message.size = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.snd_msg.message.size, endianness); pEvt->info.snd_msg.message.senderName.length = m_MQSV_REVERSE_ENDIAN_S(&pEvt->info.snd_msg.message.senderName.length, endianness); } break; case MQP_EVT_SEND_MSG_ASYNC: { pEvt->agent_mds_dest = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->agent_mds_dest, endianness); pEvt->info.sndMsgAsync.SendMsg.msgHandle = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.sndMsgAsync.SendMsg.msgHandle, endianness); pEvt->info.sndMsgAsync.SendMsg.queueHandle = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.sndMsgAsync.SendMsg.queueHandle, endianness); pEvt->info.sndMsgAsync.SendMsg.destination.length = m_MQSV_REVERSE_ENDIAN_S(&pEvt->info.sndMsgAsync.SendMsg.destination.length, endianness); pEvt->info.sndMsgAsync.SendMsg.ackFlags = m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.sndMsgAsync.SendMsg.ackFlags, endianness); pEvt->info.sndMsgAsync.SendMsg.messageInfo.sendTime = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.sndMsgAsync.SendMsg.messageInfo.sendTime, endianness); pEvt->info.sndMsgAsync.SendMsg.messageInfo.sendReceive = m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.sndMsgAsync.SendMsg.messageInfo.sendReceive, endianness); pEvt->info.sndMsgAsync.SendMsg.messageInfo.sender.senderId = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.sndMsgAsync.SendMsg.messageInfo.sender. senderId, endianness); pEvt->info.sndMsgAsync.SendMsg.message.type = m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.sndMsgAsync.SendMsg.message.type, endianness); pEvt->info.sndMsgAsync.SendMsg.message.version = m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.sndMsgAsync.SendMsg.message.version, endianness); pEvt->info.sndMsgAsync.SendMsg.message.size = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.sndMsgAsync.SendMsg.message.size, endianness); pEvt->info.sndMsgAsync.SendMsg.message.senderName.length = m_MQSV_REVERSE_ENDIAN_S(&pEvt->info.sndMsgAsync.SendMsg.message.senderName.length, endianness); pEvt->info.sndMsgAsync.invocation = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.sndMsgAsync.invocation, endianness); } break; case MQP_EVT_STAT_UPD_REQ: { pEvt->info.statsReq.qhdl = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.statsReq.qhdl, endianness); pEvt->info.statsReq.size = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.statsReq.size, endianness); } break; default: return NCSCC_RC_FAILURE; } } /* Put it in MQND's Event Queue */ rc = m_NCS_IPC_SEND(&pMqnd->mbx, (NCSCONTEXT)pEvt, NCS_IPC_PRIORITY_NORMAL); if (NCSCC_RC_SUCCESS != rc) { m_LOG_MQSV_ND(MQND_MDS_SND_TO_MAILBOX_FAILED, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, rc, __FILE__, __LINE__); } return rc; }
/**************************************************************************** Name : mqa_mds_msg_sync_send_direct Description : This routine sends the MQA message to MQND. Arguments : NCSCONTEXT mqa_mds_hdl Handle of MQA MDS_DEST *destination - destintion to send to MQSV_EVT *i_evt - MQSV_EVT pointer MQSV_EVT **o_evt - MQSV_EVT pointer to result data timeout - timeout value in 10 ms Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ uns32 mqa_mds_msg_sync_send_direct(uns32 mqa_mds_hdl, MDS_DEST *destination, MQSV_DSEND_EVT *i_evt, MQSV_DSEND_EVT **o_evt, uns32 timeout, uns32 length) { NCSMDS_INFO mds_info; uns32 rc; MQA_CB *mqa_cb; MQSV_DSEND_EVT *pEvt = NULL; NCS_BOOL endianness = machineEndianness(), is_valid_msg_fmt = FALSE; if (!i_evt) return NCSCC_RC_FAILURE; /* retrieve MQA CB */ mqa_cb = (MQA_CB *)m_MQSV_MQA_RETRIEVE_MQA_CB; if (!mqa_cb) { m_LOG_MQSV_A(MQA_CB_RETRIEVAL_FAILED, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, 0, __FILE__, __LINE__); mds_free_direct_buff((MDS_DIRECT_BUFF)i_evt); return NCSCC_RC_FAILURE; } /* Before entering any mds send function, the API locks the control block. * unlock the control block before send and lock it after we receive the reply */ if (m_NCS_UNLOCK(&mqa_cb->cb_lock, NCS_LOCK_WRITE) != NCSCC_RC_SUCCESS) { m_MQSV_MQA_GIVEUP_MQA_CB; mds_free_direct_buff((MDS_DIRECT_BUFF)i_evt); return NCSCC_RC_FAILURE; } memset(&mds_info, 0, sizeof(NCSMDS_INFO)); mds_info.i_mds_hdl = mqa_mds_hdl; mds_info.i_svc_id = NCSMDS_SVC_ID_MQA; mds_info.i_op = MDS_DIRECT_SEND; /* fill the send structure */ mds_info.info.svc_direct_send.i_direct_buff = (NCSCONTEXT)i_evt; mds_info.info.svc_direct_send.i_direct_buff_len = length; mds_info.info.svc_direct_send.i_priority = MDS_SEND_PRIORITY_MEDIUM; mds_info.info.svc_direct_send.i_to_svc = NCSMDS_SVC_ID_MQND; mds_info.info.svc_direct_send.i_sendtype = MDS_SENDTYPE_SNDRSP; mds_info.info.svc_direct_send.i_msg_fmt_ver = i_evt->msg_fmt_version; /* fill the sendinfo strcuture */ mds_info.info.svc_direct_send.info.sndrsp.i_to_dest = *destination; mds_info.info.svc_direct_send.info.sndrsp.i_time_to_wait = timeout; /* timeto wait in 10ms */ /* send the message */ rc = ncsmds_api(&mds_info); m_NCS_LOCK(&mqa_cb->cb_lock, NCS_LOCK_WRITE); if (rc == NCSCC_RC_SUCCESS) { is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(mds_info.info.svc_direct_send.i_msg_fmt_ver, MQA_WRT_MQND_SUBPART_VER_AT_MIN_MSG_FMT, MQA_WRT_MQND_SUBPART_VER_AT_MAX_MSG_FMT, mqa_mqnd_msg_fmt_table); if (!is_valid_msg_fmt || (mds_info.info.svc_direct_send.i_msg_fmt_ver == 1)) { /* Drop The Message */ m_LOG_MQSV_A(MQA_MSG_FRMT_VER_INVALID, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, is_valid_msg_fmt, __FILE__, __LINE__); m_MQSV_MQA_GIVEUP_MQA_CB; return NCSCC_RC_FAILURE; } pEvt = (MQSV_DSEND_EVT *)mds_info.info.svc_direct_send.info.sndrsp.buff; if (pEvt->endianness != endianness) { pEvt->type.rsp_type = m_MQSV_REVERSE_ENDIAN_L(&pEvt->type, endianness); if (pEvt->type.rsp_type == MQP_EVT_SEND_MSG_RSP) { /* saMsgMessageSend response from MQND */ pEvt->info.sendMsgRsp.error = m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.sendMsgRsp.error, endianness); pEvt->info.sendMsgRsp.msgHandle = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.sendMsgRsp.msgHandle, endianness); } else { /* Reply message from saMsgMessageReply/ReplyAsync */ pEvt->agent_mds_dest = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->agent_mds_dest, endianness); switch (pEvt->type.req_type) { case MQP_EVT_REPLY_MSG: { pEvt->info.replyMsg.ackFlags = m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.replyMsg.ackFlags, endianness); pEvt->info.replyMsg.message.type = m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.replyMsg.message.type, endianness); pEvt->info.replyMsg.message.version = m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.replyMsg.message.version, endianness); pEvt->info.replyMsg.message.size = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyMsg.message.size, endianness); pEvt->info.replyMsg.message.senderName.length = m_MQSV_REVERSE_ENDIAN_S(&pEvt->info.replyMsg.message.senderName. length, endianness); pEvt->info.replyMsg.msgHandle = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyMsg.msgHandle, endianness); pEvt->info.replyMsg.messageInfo.sendReceive = m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.replyMsg.messageInfo. sendReceive, endianness); pEvt->info.replyMsg.messageInfo.sender.senderId = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyMsg.messageInfo.sender. senderId, endianness); pEvt->info.replyMsg.messageInfo.sendTime = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyMsg.messageInfo.sendTime, endianness); } break; case MQP_EVT_REPLY_MSG_ASYNC: { pEvt->info.replyAsyncMsg.reply.ackFlags = m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.replyAsyncMsg.reply.ackFlags, endianness); pEvt->info.replyAsyncMsg.invocation = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyAsyncMsg.invocation, endianness); pEvt->info.replyAsyncMsg.reply.message.type = m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.replyAsyncMsg.reply.message. type, endianness); pEvt->info.replyAsyncMsg.reply.message.version = m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.replyAsyncMsg.reply.message. version, endianness); pEvt->info.replyAsyncMsg.reply.message.size = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyAsyncMsg.reply.message. size, endianness); pEvt->info.replyAsyncMsg.reply.message.senderName.length = m_MQSV_REVERSE_ENDIAN_S(&pEvt->info.replyAsyncMsg.reply.message. senderName.length, endianness); pEvt->info.replyAsyncMsg.reply.msgHandle = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyAsyncMsg.reply.msgHandle, endianness); pEvt->info.replyAsyncMsg.reply.messageInfo.sendReceive = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyAsyncMsg.reply. messageInfo.sendReceive, endianness); pEvt->info.replyAsyncMsg.reply.messageInfo.sender.senderId = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyAsyncMsg.reply. messageInfo.sender.senderId, endianness); pEvt->info.replyAsyncMsg.reply.messageInfo.sendTime = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyAsyncMsg.reply. messageInfo.sendTime, endianness); } break; default: return NCSCC_RC_FAILURE; } } } *o_evt = (MQSV_DSEND_EVT *)mds_info.info.svc_direct_send.info.sndrsp.buff; } else m_LOG_MQSV_A(MQA_MDS_SEND_FAILURE, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, rc, __FILE__, __LINE__); m_MQSV_MQA_GIVEUP_MQA_CB; return rc; }
/**************************************************************************** Name : avnd_mds_dec Description : This routine is invoked to decode AvD message. Arguments : cb - ptr to the AvND control block dec_info - ptr to the MDS decode info Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ uns32 avnd_mds_dec(AVND_CB *cb, MDS_CALLBACK_DEC_INFO *dec_info) { EDU_ERR ederror = 0; uns32 rc = NCSCC_RC_SUCCESS; switch (dec_info->i_fr_svc_id) { case NCSMDS_SVC_ID_AVD: if (!m_NCS_MSG_FORMAT_IS_VALID(dec_info->i_msg_fmt_ver, AVND_AVD_SUBPART_VER_MIN, AVND_AVD_SUBPART_VER_MAX, avnd_avd_msg_fmt_map_table)) { LOG_ER("%s,%u: wrong msg fmt not valid %u", __FUNCTION__, __LINE__, dec_info->i_msg_fmt_ver); return NCSCC_RC_FAILURE; } rc = m_NCS_EDU_VER_EXEC(&cb->edu_hdl, avsv_edp_dnd_msg, dec_info->io_uba, EDP_OP_TYPE_DEC, (AVSV_DND_MSG **)&dec_info->o_msg, &ederror, dec_info->i_msg_fmt_ver); if (rc != NCSCC_RC_SUCCESS) { if (dec_info->o_msg != NULL) { avsv_dnd_msg_free(dec_info->o_msg); dec_info->o_msg = NULL; } return rc; } break; case NCSMDS_SVC_ID_AVND: if (!m_NCS_MSG_FORMAT_IS_VALID(dec_info->i_msg_fmt_ver, AVND_AVND_SUBPART_VER_MIN, AVND_AVND_SUBPART_VER_MAX, avnd_avnd_msg_fmt_map_table)) { return NCSCC_RC_FAILURE; } rc = m_NCS_EDU_VER_EXEC(&cb->edu_hdl, avsv_edp_ndnd_msg, dec_info->io_uba, EDP_OP_TYPE_DEC, (AVSV_ND2ND_AVND_MSG **)&dec_info->o_msg, &ederror, dec_info->i_msg_fmt_ver); if (rc != NCSCC_RC_SUCCESS) { if (dec_info->o_msg != NULL) { avsv_nd2nd_avnd_msg_free(dec_info->o_msg); dec_info->o_msg = NULL; } return rc; } break; case NCSMDS_SVC_ID_AVA: if (!m_NCS_MSG_FORMAT_IS_VALID(dec_info->i_msg_fmt_ver, AVND_AVA_SUBPART_VER_MIN, AVND_AVA_SUBPART_VER_MAX, avnd_ava_msg_fmt_map_table)) { return NCSCC_RC_FAILURE; } rc = m_NCS_EDU_VER_EXEC(&cb->edu_hdl, avsv_edp_nda_msg, dec_info->io_uba, EDP_OP_TYPE_DEC, (AVSV_NDA_AVA_MSG **)&dec_info->o_msg, &ederror, dec_info->i_msg_fmt_ver); if (rc != NCSCC_RC_SUCCESS) { if (dec_info->o_msg != NULL) { avsv_nda_ava_msg_free(dec_info->o_msg); dec_info->o_msg = NULL; } return rc; } break; default: assert(0); break; } return rc; }
/**************************************************************************** Name : lga_mds_dec Description : This is a callback routine that is invoked to decode LGS messages. Arguments : pointer to struct ncsmds_callback_info Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ static uint32_t lga_mds_dec(struct ncsmds_callback_info *info) { uint8_t *p8; lgsv_msg_t *msg; NCS_UBAID *uba = info->info.dec.io_uba; uint8_t local_data[20]; uint32_t total_bytes = 0; TRACE_ENTER(); if (0 == m_NCS_MSG_FORMAT_IS_VALID(info->info.dec.i_msg_fmt_ver, LGA_WRT_LGS_SUBPART_VER_AT_MIN_MSG_FMT, LGA_WRT_LGS_SUBPART_VER_AT_MAX_MSG_FMT, LGA_WRT_LGS_MSG_FMT_ARRAY)) { TRACE("Invalid message format!!!\n"); TRACE_LEAVE(); return NCSCC_RC_FAILURE; } /** Allocate a new msg in both sync/async cases **/ if (NULL == (msg = calloc(1, sizeof(lgsv_msg_t)))) { TRACE("calloc failed\n"); return NCSCC_RC_FAILURE; } info->info.dec.o_msg = (uint8_t *)msg; p8 = ncs_dec_flatten_space(uba, local_data, 4); msg->type = ncs_decode_32bit(&p8); ncs_dec_skip_space(uba, 4); total_bytes += 4; switch (msg->type) { case LGSV_LGA_API_RESP_MSG: { p8 = ncs_dec_flatten_space(uba, local_data, 8); msg->info.api_resp_info.type = ncs_decode_32bit(&p8); msg->info.api_resp_info.rc = ncs_decode_32bit(&p8); ncs_dec_skip_space(uba, 8); total_bytes += 8; TRACE_2("LGSV_LGA_API_RESP_MSG"); switch (msg->info.api_resp_info.type) { case LGSV_INITIALIZE_RSP: total_bytes += lga_dec_initialize_rsp_msg(uba, msg); break; case LGSV_FINALIZE_RSP: total_bytes += lga_dec_finalize_rsp_msg(uba, msg); break; case LGSV_STREAM_OPEN_RSP: total_bytes += lga_dec_lstr_open_sync_rsp_msg(uba, msg); break; case LGSV_STREAM_CLOSE_RSP: total_bytes += lga_dec_lstr_close_rsp_msg(uba, msg); break; default: TRACE_2("Unknown API RSP type %d", msg->info.api_resp_info.type); break; } } break; case LGSV_LGS_CBK_MSG: { p8 = ncs_dec_flatten_space(uba, local_data, 16); msg->info.cbk_info.type = ncs_decode_32bit(&p8); msg->info.cbk_info.lgs_client_id = ncs_decode_32bit(&p8); msg->info.cbk_info.inv = ncs_decode_64bit(&p8); ncs_dec_skip_space(uba, 16); total_bytes += 16; TRACE_2("LGSV_LGS_CBK_MSG"); switch (msg->info.cbk_info.type) { case LGSV_WRITE_LOG_CALLBACK_IND: TRACE_2("decode writelog message"); total_bytes += lga_dec_write_cbk_msg(uba, msg); break; default: TRACE_2("Unknown callback type = %d!", msg->info.cbk_info.type); break; } } break; default: TRACE("Unknown MSG type %d", msg->type); break; } TRACE_LEAVE(); return NCSCC_RC_SUCCESS; }
/**************************************************************************** Name : ntfa_mds_dec Description : This is a callback routine that is invoked to decode NTFS messages. Arguments : pointer to struct ncsmds_callback_info Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ static uns32 ntfa_mds_dec(struct ncsmds_callback_info *info) { uns8 *p8; ntfsv_msg_t *msg; NCS_UBAID *uba = info->info.dec.io_uba; uns8 local_data[12]; uns32 total_bytes = 0; TRACE_ENTER(); if (0 == m_NCS_MSG_FORMAT_IS_VALID(info->info.dec.i_msg_fmt_ver, NTFA_WRT_NTFS_SUBPART_VER_AT_MIN_MSG_FMT, NTFA_WRT_NTFS_SUBPART_VER_AT_MAX_MSG_FMT, NTFA_WRT_NTFS_MSG_FMT_ARRAY)) { TRACE("Invalid message format!!!\n"); TRACE_LEAVE(); return NCSCC_RC_FAILURE; } /** Allocate a new msg in both sync/async cases **/ if (NULL == (msg = calloc(1, sizeof(ntfsv_msg_t)))) { TRACE("calloc failed\n"); return NCSCC_RC_FAILURE; } info->info.dec.o_msg = (uns8 *)msg; p8 = ncs_dec_flatten_space(uba, local_data, 4); msg->type = ncs_decode_32bit(&p8); ncs_dec_skip_space(uba, 4); total_bytes += 4; switch (msg->type) { case NTFSV_NTFA_API_RESP_MSG: { p8 = ncs_dec_flatten_space(uba, local_data, 8); msg->info.api_resp_info.type = ncs_decode_32bit(&p8); msg->info.api_resp_info.rc = ncs_decode_32bit(&p8); ncs_dec_skip_space(uba, 8); total_bytes += 8; TRACE_2("NTFSV_NTFA_API_RESP_MSG rc = %d", (int)msg->info.api_resp_info.rc); switch (msg->info.api_resp_info.type) { case NTFSV_INITIALIZE_RSP: total_bytes += ntfa_dec_initialize_rsp_msg(uba, msg); break; case NTFSV_SUBSCRIBE_RSP: total_bytes += ntfa_dec_subscribe_rsp_msg(uba, msg); break; case NTFSV_UNSUBSCRIBE_RSP: /* Only header sent from server */ break; case NTFSV_SEND_NOT_RSP: total_bytes += ntfa_dec_send_not_rsp_msg(uba, msg); break; case NTFSV_READER_INITIALIZE_RSP: total_bytes += ntfa_dec_reader_initialize_rsp_msg(uba, msg); break; case NTFSV_READER_FINALIZE_RSP: total_bytes += ntfa_dec_reader_finalize_rsp_msg(uba, msg); break; case NTFSV_READ_NEXT_RSP: total_bytes += ntfa_dec_read_next_rsp_msg(uba, msg); break; case NTFSV_FINALIZE_RSP: break; default: TRACE_2("Unknown API RSP type %d", msg->info.api_resp_info.type); break; } } break; case NTFSV_NTFS_CBK_MSG: { p8 = ncs_dec_flatten_space(uba, local_data, 12); msg->info.cbk_info.type = ncs_decode_32bit(&p8); msg->info.cbk_info.ntfs_client_id = ncs_decode_32bit(&p8); msg->info.cbk_info.subscriptionId = ncs_decode_32bit(&p8); ncs_dec_skip_space(uba, 12); total_bytes += 12; TRACE_2("NTFSV_NTFS_CBK_MSG"); switch (msg->info.cbk_info.type) { case NTFSV_NOTIFICATION_CALLBACK: /* TODO: use notificationAlloc here? */ msg->info.cbk_info.param.notification_cbk = calloc(1, sizeof(ntfsv_send_not_req_t)); if (NULL == msg->info.cbk_info.param.notification_cbk) { TRACE_1("could not allocate memory"); return 0; } TRACE_2("decode notification cbk message"); total_bytes += ntfa_dec_not_send_cbk_msg(uba, msg); break; case NTFSV_DISCARDED_CALLBACK: TRACE_2("decode discarded cbk message"); total_bytes += ntfa_dec_not_discard_cbk_msg(uba, msg); break; default: TRACE_2("Unknown callback type = %d!", msg->info.cbk_info.type); break; } } break; default: TRACE("Unknown MSG type %d", msg->type); break; } TRACE_LEAVE(); return NCSCC_RC_SUCCESS; }