/**************************************************************************** Name : mqnd_mds_enc Description : This function encodes an events sent from MQND. Arguments : cb : MQND control Block. info : Info for encoding Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ static uns32 mqnd_mds_enc(MQND_CB *cb, MDS_CALLBACK_ENC_INFO *enc_info) { MQSV_EVT *msg_ptr; EDU_ERR ederror = 0; uns32 rc = NCSCC_RC_SUCCESS; msg_ptr = (MQSV_EVT *)enc_info->i_msg; /* Get the Msg Format version from the SERVICE_ID & RMT_SVC_PVT_SUBPART_VERSION */ switch (enc_info->i_to_svc_id) { case NCSMDS_SVC_ID_MQA: enc_info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(enc_info->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); break; case NCSMDS_SVC_ID_MQND: enc_info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(enc_info->i_rem_svc_pvt_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: enc_info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(enc_info->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); break; default: return NCSCC_RC_FAILURE; } if (enc_info->o_msg_fmt_ver) { rc = (m_NCS_EDU_EXEC(&cb->edu_hdl, mqsv_edp_mqsv_evt, enc_info->io_uba, EDP_OP_TYPE_ENC, msg_ptr, &ederror)); if (rc != NCSCC_RC_SUCCESS) { m_LOG_MQSV_ND(MQND_MDS_ENC_FAILED, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, rc, __FILE__, __LINE__); } return rc; } else { /* Drop The Message */ m_LOG_MQSV_ND(MQND_MSG_FRMT_VER_INVALID, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, enc_info->o_msg_fmt_ver, __FILE__, __LINE__); TRACE("mqnd_mds_enc:INVALID MSG FORMAT %d", enc_info->o_msg_fmt_ver); return NCSCC_RC_FAILURE; } }
/**************************************************************************** Name : cpa_mds_enc_flat Description : This function encodes an events sent from CPA. Arguments : cb : CPA control Block. enc_info : Info for encoding Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ static uint32_t cpa_mds_enc_flat(CPA_CB *cb, MDS_CALLBACK_ENC_FLAT_INFO *info) { CPSV_EVT *evt = NULL; NCS_UBAID *uba = info->io_uba; uint32_t rc = NCSCC_RC_SUCCESS; TRACE_ENTER(); /* Get the Msg Format version from the SERVICE_ID & RMT_SVC_PVT_SUBPART_VERSION */ if (info->i_to_svc_id == NCSMDS_SVC_ID_CPND) { info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(info->i_rem_svc_pvt_ver, CPA_WRT_CPND_SUBPART_VER_MIN, CPA_WRT_CPND_SUBPART_VER_MAX, cpa_cpnd_msg_fmt_table); } if (info->o_msg_fmt_ver) { if (info->i_to_svc_id == NCSMDS_SVC_ID_CPND) { /* as all the event structures are flat */ evt = (CPSV_EVT *)info->i_msg; rc = cpsv_evt_enc_flat(&cb->edu_hdl, evt, uba); if (rc != NCSCC_RC_SUCCESS) TRACE_4("CPA mds_enc_flat failed with return value:%d",rc); TRACE_LEAVE(); return rc; } else { TRACE_4("CPA mds_enc_flat failed with return value:%d",rc); return NCSCC_RC_FAILURE; } } else { /* Drop The Message */ TRACE_4("CPA mds_enc_flat failed with return value:%d",rc); return NCSCC_RC_FAILURE; } }
/**************************************************************************** Name : cpa_mds_enc_flat Description : This function encodes an events sent from CPA. Arguments : cb : CPA control Block. enc_info : Info for encoding Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ static uns32 cpa_mds_enc_flat(CPA_CB *cb, MDS_CALLBACK_ENC_FLAT_INFO *info) { CPSV_EVT *evt = NULL; NCS_UBAID *uba = info->io_uba; uns32 rc = NCSCC_RC_SUCCESS; /* Get the Msg Format version from the SERVICE_ID & RMT_SVC_PVT_SUBPART_VERSION */ if (info->i_to_svc_id == NCSMDS_SVC_ID_CPND) { info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(info->i_rem_svc_pvt_ver, CPA_WRT_CPND_SUBPART_VER_MIN, CPA_WRT_CPND_SUBPART_VER_MAX, cpa_cpnd_msg_fmt_table); } if (info->o_msg_fmt_ver) { if (info->i_to_svc_id == NCSMDS_SVC_ID_CPND) { /* as all the event structures are flat */ evt = (CPSV_EVT *)info->i_msg; rc = cpsv_evt_enc_flat(&cb->edu_hdl, evt, uba); if (rc != NCSCC_RC_SUCCESS) m_LOG_CPA_CCLL(CPA_PROC_FAILED, NCSFL_LC_CKPT_MGMT, NCSFL_SEV_ERROR, "mds_enc_flat", __FILE__, __LINE__, rc); return rc; } else { m_LOG_CPA_CCLL(CPA_PROC_FAILED, NCSFL_LC_CKPT_MGMT, NCSFL_SEV_ERROR, "mds_enc_flat", __FILE__, __LINE__, rc); return NCSCC_RC_FAILURE; } } else { /* Drop The Message */ m_LOG_CPA_CCLL(CPA_PROC_FAILED, NCSFL_LC_CKPT_MGMT, NCSFL_SEV_ERROR, "mds_enc_flat", __FILE__, __LINE__, rc); return NCSCC_RC_FAILURE; } }
/**************************************************************************** Name : immnd_mds_enc_flat Description : This function encodes an events sent from IMMA/IMMD. Arguments : cb : IMMND control Block. enc_info : Info for encoding Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ static uint32_t immnd_mds_enc_flat(IMMND_CB *cb, MDS_CALLBACK_ENC_FLAT_INFO *info) { IMMSV_EVT *evt; uint32_t rc = NCSCC_RC_SUCCESS; NCS_UBAID *uba = info->io_uba; /* as all the event structures are flat */ /* Get the Msg Format version from the SERVICE_ID & RMT_SVC_PVT_SUBPART_VERSION */ if (info->i_to_svc_id == NCSMDS_SVC_ID_IMMA_OM) { /* info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(info->i_rem_svc_pvt_ver, IMMND_WRT_IMMA_OM_SUBPART_VER_MIN, IMMND_WRT_IMMA_OM_SUBPART_VER_MAX, immnd_imma_msg_fmt_table); */ } else if (info->i_to_svc_id == NCSMDS_SVC_ID_IMMA_OI) { /* info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(info->i_rem_svc_pvt_ver, IMMND_WRT_IMMA_OI_SUBPART_VER_MIN, IMMND_WRT_IMMA_OI_SUBPART_VER_MAX, immnd_imma_msg_fmt_table); */ } else if (info->i_to_svc_id == NCSMDS_SVC_ID_IMMND) { /* info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(info->i_rem_svc_pvt_ver, IMMND_WRT_IMMND_SUBPART_VER_MIN, IMMND_WRT_IMMND_SUBPART_VER_MAX, immnd_immnd_msg_fmt_table); */ } else if (info->i_to_svc_id == NCSMDS_SVC_ID_IMMD) { info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(info->i_rem_svc_pvt_ver, IMMND_WRT_IMMD_SUBPART_VER_MIN, IMMND_WRT_IMMD_SUBPART_VER_MAX, immnd_immd_msg_fmt_table); } if (1 /*info->o_msg_fmt_ver */ ) { /* TODO: ABT Does not work */ evt = (IMMSV_EVT *)info->i_msg; rc = immsv_evt_enc_flat( /*&cb->immnd_edu_hdl, */ evt, uba); if (rc != NCSCC_RC_SUCCESS) { LOG_WA("MDS Encode Flat Failed"); } return rc; } /* Drop The Message Incompatible Message Format Version */ LOG_WA("INVALID MSG FORMAT IN ENCODE FLAT"); return NCSCC_RC_FAILURE; }
/**************************************************************************** Name : immnd_mds_enc Description : This function encodes an events sent from IMMND. Arguments : cb : IMMND control Block. info : Info for encoding Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ static uint32_t immnd_mds_enc(IMMND_CB *cb, MDS_CALLBACK_ENC_INFO *enc_info) { IMMSV_EVT *evt; /* Get the Msg Format version from the SERVICE_ID & RMT_SVC_PVT_SUBPART_VERSION */ if (enc_info->i_to_svc_id == NCSMDS_SVC_ID_IMMA_OM) { /* enc_info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(enc_info->i_rem_svc_pvt_ver, IMMND_WRT_IMMA_OM_SUBPART_VER_MIN, IMMND_WRT_IMMA_OM_SUBPART_VER_MAX, immnd_imma_msg_fmt_table); */ } else if (enc_info->i_to_svc_id == NCSMDS_SVC_ID_IMMA_OI) { /* enc_info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(enc_info->i_rem_svc_pvt_ver, IMMND_WRT_IMMA_OI_SUBPART_VER_MIN, IMMND_WRT_IMMA_OI_SUBPART_VER_MAX, immnd_imma_msg_fmt_table); */ } else if (enc_info->i_to_svc_id == NCSMDS_SVC_ID_IMMND) { /* enc_info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(enc_info->i_rem_svc_pvt_ver, IMMND_WRT_IMMND_SUBPART_VER_MIN, IMND_WRT_IMMND_SUBPART_VER_MAX, immnd_immnd_msg_fmt_table); */ } else if (enc_info->i_to_svc_id == NCSMDS_SVC_ID_IMMD) { enc_info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(enc_info->i_rem_svc_pvt_ver, IMMND_WRT_IMMD_SUBPART_VER_MIN, IMMND_WRT_IMMD_SUBPART_VER_MAX, immnd_immd_msg_fmt_table); } if (1 /*enc_info->o_msg_fmt_ver */ ) { /*TODO: ABT Does not work */ evt = (IMMSV_EVT *)enc_info->i_msg; return immsv_evt_enc( /*&cb->immnd_edu_hdl, */ evt, enc_info->io_uba); } /* Drop The Message - Incompatible Message Format Version */ LOG_WA("INVALID MSG FORMAT IN ENCODE FULL"); return NCSCC_RC_FAILURE; }
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; }
static uns32 mqa_mds_svc_evt(MQA_CB *cb, MDS_CALLBACK_SVC_EVENT_INFO *svc_evt) { uns32 to_dest_slotid, o_msg_fmt_ver; /* TBD: The MQND and MQD restarts are to be implemented post April release */ switch (svc_evt->i_change) { case NCSMDS_DOWN: switch (svc_evt->i_svc_id) { case NCSMDS_SVC_ID_MQND: cb->ver_mqnd[mqsv_get_phy_slot_id(svc_evt->i_dest)] = 0; m_LOG_MQSV_A(MQA_MQND_DOWN, NCSFL_LC_MQSV_INIT, NCSFL_SEV_NOTICE, m_NCS_NODE_ID_FROM_MDS_DEST(svc_evt->i_dest), __FILE__, __LINE__); if (m_NCS_NODE_ID_FROM_MDS_DEST(cb->mqa_mds_dest) == m_NCS_NODE_ID_FROM_MDS_DEST(svc_evt->i_dest)) { cb->is_mqnd_up = FALSE; } break; case NCSMDS_SVC_ID_MQD: cb->is_mqd_up = FALSE; m_LOG_MQSV_A(MQA_MQD_DOWN, NCSFL_LC_MQSV_INIT, NCSFL_SEV_NOTICE, 0, __FILE__, __LINE__); break; default: break; } break; case NCSMDS_UP: switch (svc_evt->i_svc_id) { case NCSMDS_SVC_ID_MQND: to_dest_slotid = mqsv_get_phy_slot_id(svc_evt->i_dest); cb->ver_mqnd[to_dest_slotid] = svc_evt->i_rem_svc_pvt_ver; o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(svc_evt->i_rem_svc_pvt_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 (!o_msg_fmt_ver) /*Log informing the existence of Non compatible MQND version, Slot id being logged */ m_LOG_MQSV_A(MQA_MSG_FRMT_VER_INVALID, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, to_dest_slotid, __FILE__, __LINE__); if (m_NCS_NODE_ID_FROM_MDS_DEST(cb->mqa_mds_dest) == m_NCS_NODE_ID_FROM_MDS_DEST(svc_evt->i_dest)) { m_NCS_LOCK(&cb->mqnd_sync_lock, NCS_LOCK_WRITE); cb->mqnd_mds_dest = svc_evt->i_dest; cb->is_mqnd_up = TRUE; if (cb->mqnd_sync_awaited == TRUE) { m_NCS_SEL_OBJ_IND(cb->mqnd_sync_sel); } m_NCS_UNLOCK(&cb->mqnd_sync_lock, NCS_LOCK_WRITE); } m_LOG_MQSV_A(MQA_MQND_UP, NCSFL_LC_MQSV_INIT, NCSFL_SEV_NOTICE, m_NCS_NODE_ID_FROM_MDS_DEST(svc_evt->i_dest), __FILE__, __LINE__); break; case NCSMDS_SVC_ID_MQD: m_NCS_LOCK(&cb->mqd_sync_lock, NCS_LOCK_WRITE); 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, MQA_WRT_MQD_SUBPART_VER_AT_MIN_MSG_FMT, MQA_WRT_MQD_SUBPART_VER_AT_MAX_MSG_FMT, mqa_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_A(MQA_MSG_FRMT_VER_INVALID, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, to_dest_slotid, __FILE__, __LINE__); cb->mqd_mds_dest = svc_evt->i_dest; cb->is_mqd_up = TRUE; if (cb->mqd_sync_awaited == TRUE) { m_NCS_SEL_OBJ_IND(cb->mqd_sync_sel); } m_LOG_MQSV_A(MQA_MQD_UP, NCSFL_LC_MQSV_INIT, NCSFL_SEV_NOTICE, 0, __FILE__, __LINE__); m_NCS_UNLOCK(&cb->mqd_sync_lock, NCS_LOCK_WRITE); break; default: break; } break; default: break; } return NCSCC_RC_SUCCESS; }
/**************************************************************************** Name : cpa_mds_enc Description : This function encodes an events sent from CPA to remote CPND. Arguments : cb : CPA control Block. info : Info for encoding Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ static uint32_t cpa_mds_enc(CPA_CB *cb, MDS_CALLBACK_ENC_INFO *enc_info) { CPSV_EVT *pevt = NULL; EDU_ERR ederror = 0; NCS_UBAID *io_uba = enc_info->io_uba; uint32_t rc = NCSCC_RC_SUCCESS; uint8_t *pstream = NULL; TRACE_ENTER(); /* Get the Msg Format version from the SERVICE_ID & RMT_SVC_PVT_SUBPART_VERSION */ if (enc_info->i_to_svc_id == NCSMDS_SVC_ID_CPND) { /* This is special case to handle the 4.2 deployed node upgrade , the 4.2 has inconsistency between `enc_info->i_rem_svc_pvt_ver` ( CPND_MDS_PVT_SUBPART_VERSION /CPA_MDS_PVT_SUBPART_VERSION ) and `cpa_cpnd_msg_fmt_table` ( CPND_WRT_CPND_SUBPART_VER_RANGE / CPND_WRT_CPA_SUBPART_VER_RANGE) For all other up coming version `m_NCS_ENC_MSG_FMT_GET` logic works fine */ if (enc_info->i_rem_svc_pvt_ver <= 3) /* opensaf 4.2 CPND_MDS_PVT_SUBPART_VERSION was 3 but CPND_WRT_CPND_SUBPART_VER_RANGE was 2 */ enc_info->o_msg_fmt_ver = cpa_cpnd_msg_fmt_table[enc_info->i_rem_svc_pvt_ver - 2]; else /* m_NCS_ENC_MSG_FMT_GET call is equal to cpa_cpnd_msg_fmt_table[enc_info->i_rem_svc_pvt_ver - 1] */ enc_info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(enc_info->i_rem_svc_pvt_ver, CPA_WRT_CPND_SUBPART_VER_MIN, CPA_WRT_CPND_SUBPART_VER_MAX, cpa_cpnd_msg_fmt_table); } if (enc_info->o_msg_fmt_ver) { pevt = (CPSV_EVT *)enc_info->i_msg; if (pevt->type == CPSV_EVT_TYPE_CPND) { if (pevt->info.cpnd.type == CPND_EVT_A2ND_CKPT_WRITE) { pstream = ncs_enc_reserve_space(io_uba, 12); if (!pstream) return m_CPSV_DBG_SINK(NCSCC_RC_FAILURE, "Memory alloc failed in cpa_mds_enc \n"); ncs_encode_32bit(&pstream, pevt->type); /* CPSV_EVT Type */ ncs_encode_32bit(&pstream, pevt->info.cpnd.error); /* cpnd_evt error This is for backword compatible purpose with EDU enc/dec with 3.0.2 */ ncs_encode_32bit(&pstream, pevt->info.cpnd.type); /* cpnd_evt SubType */ ncs_enc_claim_space(io_uba, 12); rc = cpsv_ckpt_access_encode(&pevt->info.cpnd.info.ckpt_write, io_uba); TRACE_LEAVE(); return rc; } else if (pevt->info.cpnd.type == CPND_EVT_A2ND_CKPT_READ) { pstream = ncs_enc_reserve_space(io_uba, 12); if (!pstream) return m_CPSV_DBG_SINK(NCSCC_RC_FAILURE, "Memory alloc failed in cpa_mds_enc \n"); ncs_encode_32bit(&pstream, pevt->type); /* CPSV_EVT Type */ ncs_encode_32bit(&pstream, pevt->info.cpnd.error); /* cpnd_evt error This is for backword compatible purpose with EDU enc/dec with 3.0.2 */ ncs_encode_32bit(&pstream, pevt->info.cpnd.type); /* cpnd_evt SubType */ ncs_enc_claim_space(io_uba, 12); rc = cpsv_ckpt_access_encode(&pevt->info.cpnd.info.ckpt_read, io_uba); TRACE_LEAVE(); return rc; } else if(pevt->info.cpnd.type == CPND_EVT_A2ND_CKPT_REFCNTSET) { if(enc_info->o_msg_fmt_ver < 2) { TRACE_LEAVE(); return NCSCC_RC_FAILURE; } else { pstream = ncs_enc_reserve_space(io_uba, 12); if(!pstream) return m_CPSV_DBG_SINK(NCSCC_RC_FAILURE,"Memory alloc failed in cpa_mds_enc \n"); ncs_encode_32bit(&pstream , pevt->type); ncs_encode_32bit(&pstream , pevt->info.cpnd.error); ncs_encode_32bit(&pstream , pevt->info.cpnd.type); ncs_enc_claim_space(io_uba, 12); rc = cpsv_ref_cnt_encode(io_uba,&pevt->info.cpnd.info.refCntsetReq); TRACE_LEAVE(); return rc; } } } /* For all other cases call EDU othen than Write/Read API's */ rc = m_NCS_EDU_EXEC(&cb->edu_hdl, FUNC_NAME(CPSV_EVT), enc_info->io_uba, EDP_OP_TYPE_ENC, pevt, &ederror); TRACE_LEAVE(); return rc; } else { /* Drop The Message As Msg Fmt Version Not understandable */ TRACE_4("cpa api processing failed in mds_enc "); return NCSCC_RC_FAILURE; } }
/**************************************************************************** Name : cpa_mds_enc Description : This function encodes an events sent from CPA to remote CPND. Arguments : cb : CPA control Block. info : Info for encoding Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ static uns32 cpa_mds_enc(CPA_CB *cb, MDS_CALLBACK_ENC_INFO *enc_info) { CPSV_EVT *pevt = NULL; EDU_ERR ederror = 0; NCS_UBAID *io_uba = enc_info->io_uba; uns32 rc = NCSCC_RC_SUCCESS; uns8 *pstream = NULL; /* Get the Msg Format version from the SERVICE_ID & RMT_SVC_PVT_SUBPART_VERSION */ if (enc_info->i_to_svc_id == NCSMDS_SVC_ID_CPND) { enc_info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(enc_info->i_rem_svc_pvt_ver, CPA_WRT_CPND_SUBPART_VER_MIN, CPA_WRT_CPND_SUBPART_VER_MAX, cpa_cpnd_msg_fmt_table); } if (enc_info->o_msg_fmt_ver) { pevt = (CPSV_EVT *)enc_info->i_msg; if (pevt->type == CPSV_EVT_TYPE_CPND) { if (pevt->info.cpnd.type == CPND_EVT_A2ND_CKPT_WRITE) { pstream = ncs_enc_reserve_space(io_uba, 12); if (!pstream) return m_CPSV_DBG_SINK(NCSCC_RC_FAILURE, "Memory alloc failed in cpa_mds_enc \n"); ncs_encode_32bit(&pstream, pevt->type); /* CPSV_EVT Type */ ncs_encode_32bit(&pstream, pevt->info.cpnd.error); /* cpnd_evt error This is for backword compatible purpose with EDU enc/dec with 3.0.2 */ ncs_encode_32bit(&pstream, pevt->info.cpnd.type); /* cpnd_evt SubType */ ncs_enc_claim_space(io_uba, 12); rc = cpsv_ckpt_access_encode(&pevt->info.cpnd.info.ckpt_write, io_uba); return rc; } else if (pevt->info.cpnd.type == CPND_EVT_A2ND_CKPT_READ) { pstream = ncs_enc_reserve_space(io_uba, 12); if (!pstream) return m_CPSV_DBG_SINK(NCSCC_RC_FAILURE, "Memory alloc failed in cpa_mds_enc \n"); ncs_encode_32bit(&pstream, pevt->type); /* CPSV_EVT Type */ ncs_encode_32bit(&pstream, pevt->info.cpnd.error); /* cpnd_evt error This is for backword compatible purpose with EDU enc/dec with 3.0.2 */ ncs_encode_32bit(&pstream, pevt->info.cpnd.type); /* cpnd_evt SubType */ ncs_enc_claim_space(io_uba, 12); rc = cpsv_ckpt_access_encode(&pevt->info.cpnd.info.ckpt_read, io_uba); return rc; } else if(pevt->info.cpnd.type == CPND_EVT_A2ND_CKPT_REFCNTSET) { if(enc_info->o_msg_fmt_ver < 2) return NCSCC_RC_FAILURE; else { pstream = ncs_enc_reserve_space(io_uba, 12); if(!pstream) return m_CPSV_DBG_SINK(NCSCC_RC_FAILURE,"Memory alloc failed in cpa_mds_enc \n"); ncs_encode_32bit(&pstream , pevt->type); ncs_encode_32bit(&pstream , pevt->info.cpnd.error); ncs_encode_32bit(&pstream , pevt->info.cpnd.type); ncs_enc_claim_space(io_uba, 12); rc = cpsv_ref_cnt_encode(io_uba,&pevt->info.cpnd.info.refCntsetReq); return rc; } } } /* For all other cases call EDU othen than Write/Read API's */ rc = m_NCS_EDU_EXEC(&cb->edu_hdl, FUNC_NAME(CPSV_EVT), enc_info->io_uba, EDP_OP_TYPE_ENC, pevt, &ederror); return rc; } else { /* Drop The Message As Msg Fmt Version Not understandable */ m_LOG_CPA_CCL(CPA_PROC_FAILED, NCSFL_LC_CKPT_MGMT, NCSFL_SEV_ERROR, "mds_enc", __FILE__, __LINE__); return NCSCC_RC_FAILURE; } }
/**************************************************************************** Name : avnd_mds_flat_enc Description : This routine is invoked to (flat) encode AvA messages. Arguments : cb - ptr to the AvND control block enc_info - ptr to the MDS encode info Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : This routine also frees the message after encoding it in the userbuf. ******************************************************************************/ uns32 avnd_mds_flat_enc(AVND_CB *cb, MDS_CALLBACK_ENC_INFO *enc_info) { AVND_MSG *msg; uns32 rc = NCSCC_RC_SUCCESS; EDU_ERR ederror = 0; msg = (AVND_MSG *)enc_info->i_msg; switch (msg->type) { case AVND_MSG_AVA: enc_info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(enc_info->i_rem_svc_pvt_ver, AVND_AVA_SUBPART_VER_MIN, AVND_AVA_SUBPART_VER_MAX, avnd_ava_msg_fmt_map_table); if (enc_info->o_msg_fmt_ver < AVSV_AVND_AVA_MSG_FMT_VER_1) { return NCSCC_RC_FAILURE; } rc = avnd_mds_flat_ava_enc(cb, enc_info); break; case AVND_MSG_AVD: enc_info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(enc_info->i_rem_svc_pvt_ver, AVND_AVD_SUBPART_VER_MIN, AVND_AVD_SUBPART_VER_MAX, avnd_avd_msg_fmt_map_table); if (enc_info->o_msg_fmt_ver < AVSV_AVD_AVND_MSG_FMT_VER_1) { LOG_ER("%s,%u: wrong msg fmt not valid %u, res'%u'", __FUNCTION__, __LINE__, enc_info->i_rem_svc_pvt_ver, enc_info->o_msg_fmt_ver); return NCSCC_RC_FAILURE; } rc = m_NCS_EDU_VER_EXEC(&cb->edu_hdl, avsv_edp_dnd_msg, enc_info->io_uba, EDP_OP_TYPE_ENC, msg->info.avd, &ederror, enc_info->o_msg_fmt_ver); break; case AVND_MSG_AVND: enc_info->o_msg_fmt_ver = m_NCS_ENC_MSG_FMT_GET(enc_info->i_rem_svc_pvt_ver, AVND_AVND_SUBPART_VER_MIN, AVND_AVND_SUBPART_VER_MAX, avnd_avnd_msg_fmt_map_table); if (enc_info->o_msg_fmt_ver < AVSV_AVND_AVND_MSG_FMT_VER_1) { return NCSCC_RC_FAILURE; } rc = m_NCS_EDU_VER_EXEC(&cb->edu_hdl, avsv_edp_ndnd_msg, enc_info->io_uba, EDP_OP_TYPE_ENC, msg->info.avnd, &ederror, enc_info->o_msg_fmt_ver); break; default: assert(0); break; } /* switch */ if (rc != NCSCC_RC_SUCCESS) { /* Encode failed!!! */ return rc; } /* free the message */ avnd_msg_content_free(cb, msg); return rc; }
/**************************************************************************** Name : lga_mds_enc Description : This is a callback routine that is invoked to encode LGS messages. Arguments : pointer to struct ncsmds_callback_info Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ static uint32_t lga_mds_enc(struct ncsmds_callback_info *info) { lgsv_msg_t *msg; NCS_UBAID *uba; uint8_t *p8; uint32_t total_bytes = 0; MDS_CLIENT_MSG_FORMAT_VER msg_fmt_version; TRACE_ENTER(); msg_fmt_version = m_NCS_ENC_MSG_FMT_GET(info->info.enc.i_rem_svc_pvt_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); if (0 == msg_fmt_version) { TRACE("Wrong msg_fmt_version!!\n"); TRACE_LEAVE(); return NCSCC_RC_FAILURE; } info->info.enc.o_msg_fmt_ver = msg_fmt_version; msg = (lgsv_msg_t *)info->info.enc.i_msg; uba = info->info.enc.io_uba; if (uba == NULL) { TRACE("uba=NULL"); TRACE_LEAVE(); return NCSCC_RC_FAILURE; } /** encode the type of message **/ p8 = ncs_enc_reserve_space(uba, 4); if (!p8) { TRACE("NULL pointer"); TRACE_LEAVE(); return NCSCC_RC_FAILURE; } ncs_encode_32bit(&p8, msg->type); ncs_enc_claim_space(uba, 4); total_bytes += 4; TRACE_2("msgtype: %d", msg->type); if (LGSV_LGA_API_MSG == msg->type) { /** encode the API msg subtype **/ p8 = ncs_enc_reserve_space(uba, 4); if (!p8) { TRACE("encode API msg subtype FAILED"); TRACE_LEAVE(); /* fixme: ok to do return fail?? */ return NCSCC_RC_FAILURE; } ncs_encode_32bit(&p8, msg->info.api_info.type); ncs_enc_claim_space(uba, 4); total_bytes += 4; TRACE_2("api_info.type: %d\n", msg->info.api_info.type); switch (msg->info.api_info.type) { case LGSV_INITIALIZE_REQ: total_bytes += lga_enc_initialize_msg(uba, msg); break; case LGSV_FINALIZE_REQ: total_bytes += lga_enc_finalize_msg(uba, msg); break; case LGSV_STREAM_OPEN_REQ: total_bytes += lga_enc_lstr_open_sync_msg(uba, msg); break; case LGSV_STREAM_CLOSE_REQ: total_bytes += lga_enc_lstr_close_msg(uba, msg); break; case LGSV_WRITE_LOG_ASYNC_REQ: total_bytes += lga_enc_write_log_async_msg(uba, msg); break; default: TRACE("Unknown API type = %d", msg->info.api_info.type); break; } } TRACE_LEAVE(); return NCSCC_RC_SUCCESS; }
/**************************************************************************** Name : ntfa_mds_enc Description : This is a callback routine that is invoked to encode NTFS messages. Arguments : pointer to struct ncsmds_callback_info Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ static uns32 ntfa_mds_enc(struct ncsmds_callback_info *info) { ntfsv_msg_t *msg; NCS_UBAID *uba; uns8 *p8; uns32 total_bytes = 0; MDS_CLIENT_MSG_FORMAT_VER msg_fmt_version; TRACE_ENTER(); msg_fmt_version = m_NCS_ENC_MSG_FMT_GET(info->info.enc.i_rem_svc_pvt_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); if (0 == msg_fmt_version) { TRACE("Wrong msg_fmt_version!!\n"); TRACE_LEAVE(); return NCSCC_RC_FAILURE; } info->info.enc.o_msg_fmt_ver = msg_fmt_version; msg = (ntfsv_msg_t *)info->info.enc.i_msg; uba = info->info.enc.io_uba; if (uba == NULL) { TRACE("uba=NULL"); TRACE_LEAVE(); return NCSCC_RC_FAILURE; } /** encode the type of message **/ p8 = ncs_enc_reserve_space(uba, 4); if (!p8) { TRACE("NULL pointer"); TRACE_LEAVE(); return NCSCC_RC_FAILURE; } ncs_encode_32bit(&p8, msg->type); ncs_enc_claim_space(uba, 4); total_bytes += 4; TRACE_2("msgtype: %d", msg->type); if (NTFSV_NTFA_API_MSG == msg->type) { /** encode the API msg subtype **/ p8 = ncs_enc_reserve_space(uba, 4); if (!p8) { TRACE("encode API msg subtype FAILED"); TRACE_LEAVE(); /* fixme: ok to do return fail?? */ return NCSCC_RC_FAILURE; } ncs_encode_32bit(&p8, msg->info.api_info.type); ncs_enc_claim_space(uba, 4); total_bytes += 4; TRACE_2("api_info.type: %d\n", msg->info.api_info.type); switch (msg->info.api_info.type) { case NTFSV_INITIALIZE_REQ: total_bytes += ntfa_enc_initialize_msg(uba, msg); break; case NTFSV_FINALIZE_REQ: total_bytes += ntfa_enc_finalize_msg(uba, msg); break; case NTFSV_SUBSCRIBE_REQ: total_bytes += ntfa_enc_subscribe_msg(uba, msg); break; case NTFSV_UNSUBSCRIBE_REQ: total_bytes += ntfa_enc_unsubscribe_msg(uba, msg); break; case NTFSV_SEND_NOT_REQ: total_bytes += ntfa_enc_send_not_msg(uba, msg); break; case NTFSV_READER_INITIALIZE_REQ: total_bytes += ntfa_enc_reader_initialize_msg(uba, msg); break; case NTFSV_READER_FINALIZE_REQ: total_bytes += ntfa_enc_reader_finalize_msg(uba, msg); break; case NTFSV_READ_NEXT_REQ: total_bytes += ntfa_enc_read_next_msg(uba, msg); break; default: TRACE("Unknown API type = %d", msg->info.api_info.type); break; } } TRACE_LEAVE(); return NCSCC_RC_SUCCESS; }