Пример #1
0
/****************************************************************************
  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;
	}
}
Пример #2
0
/****************************************************************************
  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;
}
Пример #3
0
/****************************************************************************
  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;
}