/**************************************************************************** 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 : 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 : 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; }