/**************************************************************************** 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; } }
/****************************************************************************\ PROCEDURE NAME : mqd_evt_process DESCRIPTION : This is the function which is called when MQD receives any event. Depending on the MQD events it received, the corresponding callback will be called. ARGUMENTS : evt - This is the pointer which holds the event structure. RETURNS : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE \*****************************************************************************/ uint32_t mqd_evt_process(MQSV_EVT *pEvt) { MQD_EVT_HANDLER hdlr = 0; MQD_CB *pMqd = 0; uint32_t rc = NCSCC_RC_SUCCESS; TRACE_ENTER(); /* Get the Controll block */ pMqd = ncshm_take_hdl(NCS_SERVICE_ID_MQD, gl_mqdinfo.inst_hdl); if (!pMqd) { LOG_ER("%s:%u: Instance Doesn't Exist", __FILE__, __LINE__); return NCSCC_RC_FAILURE; } /* Get the Event Handler */ hdlr = mqd_evt_tbl[pEvt->type - 1]; if (hdlr) { if ((pEvt->type == MQSV_EVT_MQD_CTRL) && (SA_AMF_HA_QUIESCED == pMqd->ha_state)) { rc = hdlr(pEvt, pMqd); } else if (SA_AMF_HA_ACTIVE == pMqd->ha_state) { rc = hdlr(pEvt, pMqd); } else if (SA_AMF_HA_STANDBY == pMqd->ha_state && (MQD_ND_STATUS_INFO_TYPE == pEvt->msg.mqd_ctrl.type || MQD_MSG_TMR_EXPIRY == pEvt->msg.mqd_ctrl.type)) { rc = hdlr(pEvt, pMqd); } } /* Destroy the event */ if ((MQSV_EVT_ASAPI == pEvt->type) && (pEvt->msg.asapi)) { asapi_msg_free(&pEvt->msg.asapi); } m_MMGR_FREE_MQSV_EVT(pEvt, pMqd->my_svc_id); ncshm_give_hdl(pMqd->hdl); TRACE_LEAVE(); return rc; } /* End of mqd_evt_process() */
static uns32 mqnd_mds_svc_evt(MQND_CB *cb, MDS_CALLBACK_SVC_EVENT_INFO *svc_evt) { uns32 rc = NCSCC_RC_SUCCESS, to_dest_slotid, o_msg_fmt_ver; switch (svc_evt->i_change) { case NCSMDS_DOWN: if (svc_evt->i_svc_id == NCSMDS_SVC_ID_MQD) { if (cb->is_mqd_up == TRUE) { /* If MQD is already UP */ cb->is_mqd_up = FALSE; m_LOG_MQSV_ND(MQND_MQD_SERVICE_WENT_DOWN, NCSFL_LC_MQSV_INIT, NCSFL_SEV_NOTICE, rc, __FILE__, __LINE__); return NCSCC_RC_SUCCESS; } } else if (svc_evt->i_svc_id == NCSMDS_SVC_ID_MQA) { MQSV_EVT *evt = NULL; /* Post the event to Clean all the Queues opened by applications on this agent */ evt = m_MMGR_ALLOC_MQSV_EVT(NCS_SERVICE_ID_MQND); if (evt == NULL) { m_LOG_MQSV_ND(MQND_EVT_ALLOC_FAILED, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, NCSCC_RC_FAILURE, __FILE__, __LINE__); return NCSCC_RC_FAILURE; } evt->evt_type = MQSV_NOT_DSEND_EVENT; evt->type = MQSV_EVT_MQND_CTRL; evt->msg.mqnd_ctrl.type = MQND_CTRL_EVT_MDS_INFO; evt->msg.mqnd_ctrl.info.mds_info.change = svc_evt->i_change; evt->msg.mqnd_ctrl.info.mds_info.dest = svc_evt->i_dest; evt->msg.mqnd_ctrl.info.mds_info.svc_id = svc_evt->i_svc_id; m_LOG_MQSV_ND(MQND_MQA_SERVICE_WENT_DOWN, NCSFL_LC_MQSV_INIT, NCSFL_SEV_NOTICE, m_NCS_NODE_ID_FROM_MDS_DEST(svc_evt->i_dest), __FILE__, __LINE__); /* Post the event to MQND Thread */ rc = m_NCS_IPC_SEND(&cb->mbx, evt, NCS_IPC_PRIORITY_HIGH); if (rc != NCSCC_RC_SUCCESS) { m_LOG_MQSV_ND(MQND_MDS_SND_TO_MAILBOX_FAILED, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, rc, __FILE__, __LINE__); } /* mqnd_proc_mqa_down(cb, &svc_evt->i_dest); */ } else return NCSCC_RC_SUCCESS; break; case NCSMDS_UP: switch (svc_evt->i_svc_id) { case NCSMDS_SVC_ID_MQD: { cb->is_mqd_up = TRUE; cb->mqd_dest = svc_evt->i_dest; m_LOG_MQSV_ND(MQND_MQD_SERVICE_CAME_UP, NCSFL_LC_MQSV_INIT, NCSFL_SEV_NOTICE, rc, __FILE__, __LINE__); to_dest_slotid = mqsv_get_phy_slot_id(svc_evt->i_dest); o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(svc_evt->i_rem_svc_pvt_ver, MQND_WRT_MQD_SUBPART_VER_AT_MIN_MSG_FMT, MQND_WRT_MQD_SUBPART_VER_AT_MAX_MSG_FMT, mqnd_mqd_msg_fmt_table); if (!o_msg_fmt_ver) /*Log informing the existence of Non compatible MQD version, Slot id being logged */ m_LOG_MQSV_ND(MQND_MSG_FRMT_VER_INVALID, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, to_dest_slotid, __FILE__, __LINE__); } break; case NCSMDS_SVC_ID_MQA: { MQSV_EVT *evt = NULL; to_dest_slotid = mqsv_get_phy_slot_id(svc_evt->i_dest); o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(svc_evt->i_rem_svc_pvt_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 (!o_msg_fmt_ver) /*Log informing the existence of Non compatible MQA version, Slot id being logged */ m_LOG_MQSV_ND(MQND_MSG_FRMT_VER_INVALID, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, to_dest_slotid, __FILE__, __LINE__); /* Post the event to Update the MQA list */ evt = m_MMGR_ALLOC_MQSV_EVT(NCS_SERVICE_ID_MQND); if (evt == NULL) { m_LOG_MQSV_ND(MQND_EVT_ALLOC_FAILED, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, NCSCC_RC_FAILURE, __FILE__, __LINE__); return NCSCC_RC_FAILURE; } evt->evt_type = MQSV_NOT_DSEND_EVENT; evt->type = MQSV_EVT_MQND_CTRL; evt->msg.mqnd_ctrl.type = MQND_CTRL_EVT_MDS_MQA_UP_INFO; evt->msg.mqnd_ctrl.info.mqa_up_info.mqa_up_dest = svc_evt->i_dest; m_LOG_MQSV_ND(MQND_MQA_CAME_UP, NCSFL_LC_MQSV_INIT, NCSFL_SEV_NOTICE, m_NCS_NODE_ID_FROM_MDS_DEST(svc_evt->i_dest), __FILE__, __LINE__); /* Post the event to MQND Thread */ rc = m_NCS_IPC_SEND(&cb->mbx, evt, NCS_IPC_PRIORITY_HIGH); if (rc != NCSCC_RC_SUCCESS) { m_LOG_MQSV_ND(MQND_MDS_SND_TO_MAILBOX_FAILED, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, rc, __FILE__, __LINE__); m_MMGR_FREE_MQSV_EVT(evt, NCS_SERVICE_ID_MQND); return rc; } } break; default: break; } break; case NCSMDS_NO_ACTIVE: cb->is_mqd_up = FALSE; break; case NCSMDS_NEW_ACTIVE: cb->is_mqd_up = TRUE; { MQSV_EVT *evt = NULL; evt = m_MMGR_ALLOC_MQSV_EVT(NCS_SERVICE_ID_MQND); if (evt == NULL) { cb->is_mqd_up = TRUE; 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(evt, 0, sizeof(MQSV_EVT)); evt->evt_type = MQSV_NOT_DSEND_EVENT; evt->type = MQSV_EVT_MQND_CTRL; evt->msg.mqnd_ctrl.type = MQND_CTRL_EVT_DEFERRED_MQA_RSP; /* Post the event to MQND Thread */ rc = m_NCS_IPC_SEND(&cb->mbx, evt, NCS_IPC_PRIORITY_HIGH); if (rc != NCSCC_RC_SUCCESS) { m_LOG_MQSV_ND(MQND_MDS_SND_TO_MAILBOX_FAILED, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, rc, __FILE__, __LINE__); } } break; default: break; } return NCSCC_RC_SUCCESS; }