Exemplo n.º 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;
	}
}
Exemplo n.º 2
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 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;
	}
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
/****************************************************************************
 * 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;
}