/**************************************************************************** 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; } }
static uns32 cpa_mds_rcv(CPA_CB *cb, MDS_CALLBACK_RECEIVE_INFO *rcv_info) { uns32 rc = NCSCC_RC_SUCCESS; CPSV_EVT *evt = (CPSV_EVT *)rcv_info->i_msg; evt->sinfo.ctxt = rcv_info->i_msg_ctxt; evt->sinfo.dest = rcv_info->i_fr_dest; evt->sinfo.to_svc = rcv_info->i_fr_svc_id; /* Process the received event at CPA */ if (cpa_process_evt(cb, evt) != NCSCC_RC_SUCCESS) rc = NCSCC_RC_FAILURE; /* Free the Event */ m_MMGR_FREE_CPSV_EVT(evt, NCS_SERVICE_ID_CPA); return rc; }
/**************************************************************************** * Name : cpd_process_evt * * Description : This is the top level function to process the events posted * to CPD. * Arguments : * evt : Pointer to CPSV_EVT * Return Values : None * * Notes : None. *****************************************************************************/ void cpd_process_evt(CPSV_EVT *evt) { CPD_CB *cb; uns32 cb_hdl = m_CPD_GET_CB_HDL; uns32 rc = NCSCC_RC_SUCCESS; if (evt->type != CPSV_EVT_TYPE_CPD) { /*TBD Log the error BAD EVENT */ return; } /* Get the CB from the handle */ cb = ncshm_take_hdl(NCS_SERVICE_ID_CPD, cb_hdl); if (cb == NULL) { m_LOG_CPD_HEADLINE(CPD_CB_HDL_TAKE_FAILED, NCSFL_SEV_ERROR); return; } #if ( CPSV_DEBUG == 1) TRACE("%s", cpd_evt_str[evt->info.cpd.type]); #endif switch (evt->info.cpd.type) { case CPD_EVT_MDS_INFO: rc = cpd_evt_proc_mds_evt(cb, &evt->info.cpd); break; case CPD_EVT_TIME_OUT: rc = cpd_evt_proc_timer_expiry(cb, &evt->info.cpd); break; case CPD_EVT_ND2D_CKPT_CREATE: rc = cpd_evt_proc_ckpt_create(cb, &evt->info.cpd, &evt->sinfo); break; case CPD_EVT_ND2D_CKPT_USR_INFO: rc = cpd_evt_proc_ckpt_usr_info(cb, &evt->info.cpd, &evt->sinfo); break; case CPD_EVT_ND2D_CKPT_SEC_INFO_UPD: rc = cpd_evt_proc_ckpt_sec_info_upd(cb, &evt->info.cpd, &evt->sinfo); break; case CPD_EVT_ND2D_CKPT_UNLINK: rc = cpd_evt_proc_ckpt_unlink(cb, &evt->info.cpd, &evt->sinfo); break; case CPD_EVT_ND2D_CKPT_RDSET: rc = cpd_evt_proc_ckpt_rdset(cb, &evt->info.cpd, &evt->sinfo); break; case CPD_EVT_ND2D_ACTIVE_SET: rc = cpd_evt_proc_active_set(cb, &evt->info.cpd, &evt->sinfo); break; case CPD_EVT_ND2D_CKPT_DESTROY: rc = cpd_evt_proc_ckpt_destroy(cb, &evt->info.cpd, &evt->sinfo); break; case CPD_EVT_ND2D_CKPT_DESTROY_BYNAME: rc = cpd_evt_proc_ckpt_destroy_byname(cb, &evt->info.cpd, &evt->sinfo); break; case CPD_EVT_MDS_QUIESCED_ACK_RSP: rc = cpd_evt_mds_quiesced_ack_rsp(cb, &evt->info.cpd, &evt->sinfo); break; case CPD_EVT_CB_DUMP: rc = cpd_evt_proc_cb_dump(cb); break; default: /* Log the error TBD */ break; } /* if(rc != NCSCC_RC_SUCCESS) TBD Log the error */ /* Return the Handle */ ncshm_give_hdl(cb_hdl); /* Free the Event */ m_MMGR_FREE_CPSV_EVT(evt, NCS_SERVICE_ID_CPD); return; }