Esempio n. 1
0
/****************************************************************************
  Name          : mqnd_mds_dec
 
  Description   : This function decodes an events sent to MQND.
 
  Arguments     : cb    : MQND control Block.
                  info  : Info for decoding
  
  Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
 
  Notes         : None.
******************************************************************************/
static uns32 mqnd_mds_dec(MQND_CB *cb, MDS_CALLBACK_DEC_INFO *dec_info)
{

	MQSV_EVT *msg_ptr;
	EDU_ERR ederror = 0;
	uns32 rc = NCSCC_RC_SUCCESS;
	NCS_BOOL is_valid_msg_fmt;
	switch (dec_info->i_fr_svc_id) {
	case NCSMDS_SVC_ID_MQA:
		is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(dec_info->i_msg_fmt_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:
		is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(dec_info->i_msg_fmt_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:
		is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(dec_info->i_msg_fmt_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 (is_valid_msg_fmt && (dec_info->i_msg_fmt_ver != 1)) {
		msg_ptr = m_MMGR_ALLOC_MQSV_EVT(NCS_SERVICE_ID_MQND);
		if (!msg_ptr) {
			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(msg_ptr, 0, sizeof(MQSV_EVT));
		dec_info->o_msg = (NCSCONTEXT)msg_ptr;

		rc = m_NCS_EDU_EXEC(&cb->edu_hdl, mqsv_edp_mqsv_evt,
				    dec_info->io_uba, EDP_OP_TYPE_DEC, (MQSV_EVT **)&dec_info->o_msg, &ederror);
		if (rc != NCSCC_RC_SUCCESS) {
			m_LOG_MQSV_ND(MQND_MDS_DEC_FAILED, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, rc, __FILE__, __LINE__);
			m_MMGR_FREE_MQSV_EVT(dec_info->o_msg, NCS_SERVICE_ID_MQND);
		}
		return rc;
	} else {
		/* Drop The Message */
		m_LOG_MQSV_ND(MQND_MSG_FRMT_VER_INVALID, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR,
			      is_valid_msg_fmt, __FILE__, __LINE__);
		TRACE("mqnd_mds_dec:INVALID MSG FORMAT %d", is_valid_msg_fmt);
		return NCSCC_RC_FAILURE;
	}
}
Esempio 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 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;
	}
}
Esempio n. 3
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;
	}
}
Esempio n. 4
0
/****************************************************************************
  Name          : cpa_mds_dec_flat
 
  Description   : This function decodes an events sent to CPA.
 
  Arguments     : cb    : CPA control Block.
                  dec_info  : Info for decoding
  
  Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
 
  Notes         : None.
******************************************************************************/
static uns32 cpa_mds_dec_flat(CPA_CB *cb, MDS_CALLBACK_DEC_FLAT_INFO *info)
{
	CPSV_EVT *evt = NULL;
	NCS_UBAID *uba = info->io_uba;
	uns32 rc = NCSCC_RC_SUCCESS;
	NCS_BOOL is_valid_msg_fmt = FALSE;

	if (info->i_fr_svc_id == NCSMDS_SVC_ID_CPND) {
		is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(info->i_msg_fmt_ver,
							     CPA_WRT_CPND_SUBPART_VER_MIN,
							     CPA_WRT_CPND_SUBPART_VER_MAX, cpa_cpnd_msg_fmt_table);
	} else if (info->i_fr_svc_id == NCSMDS_SVC_ID_CPD) {
		is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(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) {

		if (info->i_fr_svc_id == NCSMDS_SVC_ID_CPND || info->i_fr_svc_id == NCSMDS_SVC_ID_CPD) {
			evt = (CPSV_EVT *)m_MMGR_ALLOC_CPSV_EVT(NCS_SERVICE_ID_CPA);
			if (evt == NULL) {
				m_LOG_CPA_CCLL(CPA_MEM_ALLOC_FAILED, NCSFL_LC_CKPT_MGMT,
					       NCSFL_SEV_ERROR, "mds_dec_flat", __FILE__, __LINE__,
					       NCSCC_RC_OUT_OF_MEM);
				return NCSCC_RC_OUT_OF_MEM;
			}
			info->o_msg = evt;
			rc = cpsv_evt_dec_flat(&cb->edu_hdl, uba, evt);
			return rc;
		} else {
			m_LOG_CPA_CCLL(CPA_PROC_FAILED, NCSFL_LC_CKPT_MGMT, NCSFL_SEV_INFO, "mds_dec_flat", __FILE__,
				       __LINE__, rc);
			return NCSCC_RC_FAILURE;
		}
	} else {
		m_LOG_CPA_CCLL(CPA_PROC_FAILED, NCSFL_LC_CKPT_MGMT, NCSFL_SEV_INFO, "mds_dec_flat", __FILE__, __LINE__,
			       rc);
		return NCSCC_RC_FAILURE;
	}
}
Esempio n. 5
0
/****************************************************************************
  Name          : cpa_mds_dec_flat
 
  Description   : This function decodes an events sent to CPA.
 
  Arguments     : cb    : CPA control Block.
                  dec_info  : Info for decoding
  
  Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
 
  Notes         : None.
******************************************************************************/
static uint32_t cpa_mds_dec_flat(CPA_CB *cb, MDS_CALLBACK_DEC_FLAT_INFO *info)
{
	CPSV_EVT *evt = NULL;
	NCS_UBAID *uba = info->io_uba;
	uint32_t rc = NCSCC_RC_SUCCESS;
	bool is_valid_msg_fmt = false;

	TRACE_ENTER();

	if (info->i_fr_svc_id == NCSMDS_SVC_ID_CPND) {
		is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(info->i_msg_fmt_ver,
							     CPA_WRT_CPND_SUBPART_VER_MIN,
							     CPA_WRT_CPND_SUBPART_VER_MAX, cpa_cpnd_msg_fmt_table);
	} else if (info->i_fr_svc_id == NCSMDS_SVC_ID_CPD) {
		is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(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) {

		if (info->i_fr_svc_id == NCSMDS_SVC_ID_CPND || info->i_fr_svc_id == NCSMDS_SVC_ID_CPD) {
			evt = (CPSV_EVT *)m_MMGR_ALLOC_CPSV_EVT(NCS_SERVICE_ID_CPA);
			if (evt == NULL) {
				TRACE_4("cpa mem allocation failed in mds_dec_flat");
				return NCSCC_RC_OUT_OF_MEM;
			}
			info->o_msg = evt;
			rc = cpsv_evt_dec_flat(&cb->edu_hdl, uba, evt);
			TRACE_LEAVE();
			return rc;
		} else {
			TRACE_4("cpa api processing failed in mds_dec_flat with return value:%d",rc);
			return NCSCC_RC_FAILURE;
		}
	} else {
		TRACE_4("cpa api processing failed in mds_dec_flat with return value:%d",rc);
		return NCSCC_RC_FAILURE;
	}
}
Esempio n. 6
0
/****************************************************************************
 * Name          : mqnd_mds_direct_rcv
 *
 * Description   : MDS will call this function on receiving MQND/ASAPi messages.
 *
 * Arguments     : cb - MQND Control Block
 *                 direct_rcv_info - MDS Direct Receive information.
 *
 * Return Values : NCSCC_RC_SUCCESS/Error Code.
 *
 * Notes         : None.
 *****************************************************************************/
static uns32 mqnd_mds_direct_rcv(MQND_CB *pMqnd, MDS_CALLBACK_DIRECT_RECEIVE_INFO *direct_rcv_info)
{
	uns32 rc = NCSCC_RC_SUCCESS, is_valid_msg_fmt;
	MQSV_DSEND_EVT *pEvt = (MQSV_DSEND_EVT *)direct_rcv_info->i_direct_buff;
	NCS_BOOL endianness = machineEndianness();

	is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(direct_rcv_info->i_msg_fmt_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 (!is_valid_msg_fmt || (direct_rcv_info->i_msg_fmt_ver == 1)) {
		/* Drop The Message */
		m_LOG_MQSV_ND(MQND_MSG_FRMT_VER_INVALID, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR,
			      is_valid_msg_fmt, __FILE__, __LINE__);
		TRACE("mqnd_mds_direct_rcv:INVALID MSG FORMAT %d", is_valid_msg_fmt);
		return NCSCC_RC_FAILURE;
	}

	pEvt->sinfo.ctxt = direct_rcv_info->i_msg_ctxt;
	pEvt->sinfo.dest = direct_rcv_info->i_fr_dest;
	pEvt->sinfo.to_svc = direct_rcv_info->i_fr_svc_id;
	if (direct_rcv_info->i_rsp_reqd) {
		pEvt->sinfo.stype = MDS_SENDTYPE_RSP;
	}
	m_LOG_MQSV_ND(MQND_MDS_SNDDIRECT_RCV, NCSFL_LC_MQSV_INIT, NCSFL_SEV_INFO, endianness, __FILE__, __LINE__);

	/* If the endianess of the source is different, decode to host order */
	if (pEvt->endianness != endianness) {

		pEvt->type.raw = m_MQSV_REVERSE_ENDIAN_L(&pEvt->type, endianness);

		switch (pEvt->type.req_type) {

		case MQP_EVT_SEND_MSG:
			{
				pEvt->agent_mds_dest = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->agent_mds_dest, endianness);

				pEvt->info.snd_msg.msgHandle =
				    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.snd_msg.msgHandle, endianness);

				pEvt->info.snd_msg.queueHandle =
				    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.snd_msg.queueHandle, endianness);

				pEvt->info.snd_msg.destination.length =
				    m_MQSV_REVERSE_ENDIAN_S(&pEvt->info.snd_msg.destination.length, endianness);

				pEvt->info.snd_msg.ackFlags =
				    m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.snd_msg.ackFlags, endianness);

				pEvt->info.snd_msg.messageInfo.sendTime =
				    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.snd_msg.messageInfo.sendTime, endianness);

				pEvt->info.snd_msg.messageInfo.sendReceive =
				    m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.snd_msg.messageInfo.sendReceive, endianness);

				if (pEvt->info.snd_msg.messageInfo.sendReceive == SA_FALSE) {
					pEvt->info.snd_msg.messageInfo.sender.senderId =
					    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.snd_msg.messageInfo.sender.senderId,
								     endianness);
				} else {
					pEvt->info.snd_msg.messageInfo.sender.sender_context.sender_dest =
					    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.snd_msg.messageInfo.sender.
								     sender_context.sender_dest, endianness);

					pEvt->info.snd_msg.messageInfo.sender.sender_context.reply_buffer_size =
					    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.snd_msg.messageInfo.sender.
								     sender_context.reply_buffer_size, endianness);
				}

				pEvt->info.snd_msg.message.type =
				    m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.snd_msg.message.type, endianness);

				pEvt->info.snd_msg.message.version =
				    m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.snd_msg.message.version, endianness);

				pEvt->info.snd_msg.message.size =
				    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.snd_msg.message.size, endianness);

				pEvt->info.snd_msg.message.senderName.length =
				    m_MQSV_REVERSE_ENDIAN_S(&pEvt->info.snd_msg.message.senderName.length, endianness);
			}
			break;

		case MQP_EVT_SEND_MSG_ASYNC:
			{
				pEvt->agent_mds_dest = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->agent_mds_dest, endianness);

				pEvt->info.sndMsgAsync.SendMsg.msgHandle =
				    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.sndMsgAsync.SendMsg.msgHandle, endianness);

				pEvt->info.sndMsgAsync.SendMsg.queueHandle =
				    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.sndMsgAsync.SendMsg.queueHandle, endianness);

				pEvt->info.sndMsgAsync.SendMsg.destination.length =
				    m_MQSV_REVERSE_ENDIAN_S(&pEvt->info.sndMsgAsync.SendMsg.destination.length,
							    endianness);

				pEvt->info.sndMsgAsync.SendMsg.ackFlags =
				    m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.sndMsgAsync.SendMsg.ackFlags, endianness);

				pEvt->info.sndMsgAsync.SendMsg.messageInfo.sendTime =
				    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.sndMsgAsync.SendMsg.messageInfo.sendTime,
							     endianness);

				pEvt->info.sndMsgAsync.SendMsg.messageInfo.sendReceive =
				    m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.sndMsgAsync.SendMsg.messageInfo.sendReceive,
							    endianness);

				pEvt->info.sndMsgAsync.SendMsg.messageInfo.sender.senderId =
				    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.sndMsgAsync.SendMsg.messageInfo.sender.
							     senderId, endianness);

				pEvt->info.sndMsgAsync.SendMsg.message.type =
				    m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.sndMsgAsync.SendMsg.message.type, endianness);

				pEvt->info.sndMsgAsync.SendMsg.message.version =
				    m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.sndMsgAsync.SendMsg.message.version,
							    endianness);

				pEvt->info.sndMsgAsync.SendMsg.message.size =
				    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.sndMsgAsync.SendMsg.message.size, endianness);

				pEvt->info.sndMsgAsync.SendMsg.message.senderName.length =
				    m_MQSV_REVERSE_ENDIAN_S(&pEvt->info.sndMsgAsync.SendMsg.message.senderName.length,
							    endianness);

				pEvt->info.sndMsgAsync.invocation =
				    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.sndMsgAsync.invocation, endianness);
			}
			break;

		case MQP_EVT_STAT_UPD_REQ:
			{
				pEvt->info.statsReq.qhdl =
				    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.statsReq.qhdl, endianness);

				pEvt->info.statsReq.size =
				    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.statsReq.size, endianness);
			}
			break;
		default:
			return NCSCC_RC_FAILURE;
		}
	}

	/* Put it in MQND's Event Queue */
	rc = m_NCS_IPC_SEND(&pMqnd->mbx, (NCSCONTEXT)pEvt, NCS_IPC_PRIORITY_NORMAL);

	if (NCSCC_RC_SUCCESS != rc) {
		m_LOG_MQSV_ND(MQND_MDS_SND_TO_MAILBOX_FAILED, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, rc, __FILE__,
			      __LINE__);
	}
	return rc;
}
Esempio n. 7
0
/****************************************************************************
  Name          : mqa_mds_msg_sync_send_direct
 
  Description   : This routine sends the MQA message to MQND.
 
  Arguments     :
                  NCSCONTEXT mqa_mds_hdl Handle of MQA
                  MDS_DEST  *destination - destintion to send to
                  MQSV_EVT   *i_evt - MQSV_EVT pointer
                  MQSV_EVT   **o_evt - MQSV_EVT pointer to result data
                  timeout - timeout value in 10 ms 
 
  Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
 
  Notes         : None.
******************************************************************************/
uns32 mqa_mds_msg_sync_send_direct(uns32 mqa_mds_hdl,
				   MDS_DEST *destination,
				   MQSV_DSEND_EVT *i_evt, MQSV_DSEND_EVT **o_evt, uns32 timeout, uns32 length)
{
	NCSMDS_INFO mds_info;
	uns32 rc;
	MQA_CB *mqa_cb;
	MQSV_DSEND_EVT *pEvt = NULL;
	NCS_BOOL endianness = machineEndianness(), is_valid_msg_fmt = FALSE;

	if (!i_evt)
		return NCSCC_RC_FAILURE;

	/* retrieve MQA CB */
	mqa_cb = (MQA_CB *)m_MQSV_MQA_RETRIEVE_MQA_CB;

	if (!mqa_cb) {
		m_LOG_MQSV_A(MQA_CB_RETRIEVAL_FAILED, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, 0, __FILE__, __LINE__);
		mds_free_direct_buff((MDS_DIRECT_BUFF)i_evt);
		return NCSCC_RC_FAILURE;
	}

	/* Before entering any mds send function, the API locks the control block.
	 * unlock the control block before send and lock it after we receive the reply */
	if (m_NCS_UNLOCK(&mqa_cb->cb_lock, NCS_LOCK_WRITE) != NCSCC_RC_SUCCESS) {
		m_MQSV_MQA_GIVEUP_MQA_CB;
		mds_free_direct_buff((MDS_DIRECT_BUFF)i_evt);
		return NCSCC_RC_FAILURE;
	}

	memset(&mds_info, 0, sizeof(NCSMDS_INFO));
	mds_info.i_mds_hdl = mqa_mds_hdl;
	mds_info.i_svc_id = NCSMDS_SVC_ID_MQA;
	mds_info.i_op = MDS_DIRECT_SEND;

	/* fill the send structure */
	mds_info.info.svc_direct_send.i_direct_buff = (NCSCONTEXT)i_evt;
	mds_info.info.svc_direct_send.i_direct_buff_len = length;

	mds_info.info.svc_direct_send.i_priority = MDS_SEND_PRIORITY_MEDIUM;
	mds_info.info.svc_direct_send.i_to_svc = NCSMDS_SVC_ID_MQND;
	mds_info.info.svc_direct_send.i_sendtype = MDS_SENDTYPE_SNDRSP;
	mds_info.info.svc_direct_send.i_msg_fmt_ver = i_evt->msg_fmt_version;
	/* fill the sendinfo  strcuture */
	mds_info.info.svc_direct_send.info.sndrsp.i_to_dest = *destination;
	mds_info.info.svc_direct_send.info.sndrsp.i_time_to_wait = timeout;	/* timeto wait in 10ms */

	/* send the message */
	rc = ncsmds_api(&mds_info);

	m_NCS_LOCK(&mqa_cb->cb_lock, NCS_LOCK_WRITE);

	if (rc == NCSCC_RC_SUCCESS) {

		is_valid_msg_fmt = m_NCS_MSG_FORMAT_IS_VALID(mds_info.info.svc_direct_send.i_msg_fmt_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 (!is_valid_msg_fmt || (mds_info.info.svc_direct_send.i_msg_fmt_ver == 1)) {
			/* Drop The Message */
			m_LOG_MQSV_A(MQA_MSG_FRMT_VER_INVALID, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR,
				     is_valid_msg_fmt, __FILE__, __LINE__);
			m_MQSV_MQA_GIVEUP_MQA_CB;
			return NCSCC_RC_FAILURE;
		}

		pEvt = (MQSV_DSEND_EVT *)mds_info.info.svc_direct_send.info.sndrsp.buff;

		if (pEvt->endianness != endianness) {

			pEvt->type.rsp_type = m_MQSV_REVERSE_ENDIAN_L(&pEvt->type, endianness);
			if (pEvt->type.rsp_type == MQP_EVT_SEND_MSG_RSP) {
				/* saMsgMessageSend response from MQND */
				pEvt->info.sendMsgRsp.error =
				    m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.sendMsgRsp.error, endianness);
				pEvt->info.sendMsgRsp.msgHandle =
				    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.sendMsgRsp.msgHandle, endianness);
			} else {
				/* Reply message from saMsgMessageReply/ReplyAsync */

				pEvt->agent_mds_dest = m_MQSV_REVERSE_ENDIAN_LL(&pEvt->agent_mds_dest, endianness);

				switch (pEvt->type.req_type) {

				case MQP_EVT_REPLY_MSG:
					{
						pEvt->info.replyMsg.ackFlags =
						    m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.replyMsg.ackFlags, endianness);

						pEvt->info.replyMsg.message.type =
						    m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.replyMsg.message.type,
									    endianness);

						pEvt->info.replyMsg.message.version =
						    m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.replyMsg.message.version,
									    endianness);

						pEvt->info.replyMsg.message.size =
						    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyMsg.message.size,
									     endianness);

						pEvt->info.replyMsg.message.senderName.length =
						    m_MQSV_REVERSE_ENDIAN_S(&pEvt->info.replyMsg.message.senderName.
									    length, endianness);

						pEvt->info.replyMsg.msgHandle =
						    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyMsg.msgHandle,
									     endianness);

						pEvt->info.replyMsg.messageInfo.sendReceive =
						    m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.replyMsg.messageInfo.
									    sendReceive, endianness);

						pEvt->info.replyMsg.messageInfo.sender.senderId =
						    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyMsg.messageInfo.sender.
									     senderId, endianness);

						pEvt->info.replyMsg.messageInfo.sendTime =
						    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyMsg.messageInfo.sendTime,
									     endianness);
					}
					break;

				case MQP_EVT_REPLY_MSG_ASYNC:
					{
						pEvt->info.replyAsyncMsg.reply.ackFlags =
						    m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.replyAsyncMsg.reply.ackFlags,
									    endianness);

						pEvt->info.replyAsyncMsg.invocation =
						    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyAsyncMsg.invocation,
									     endianness);

						pEvt->info.replyAsyncMsg.reply.message.type =
						    m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.replyAsyncMsg.reply.message.
									    type, endianness);

						pEvt->info.replyAsyncMsg.reply.message.version =
						    m_MQSV_REVERSE_ENDIAN_L(&pEvt->info.replyAsyncMsg.reply.message.
									    version, endianness);

						pEvt->info.replyAsyncMsg.reply.message.size =
						    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyAsyncMsg.reply.message.
									     size, endianness);

						pEvt->info.replyAsyncMsg.reply.message.senderName.length =
						    m_MQSV_REVERSE_ENDIAN_S(&pEvt->info.replyAsyncMsg.reply.message.
									    senderName.length, endianness);

						pEvt->info.replyAsyncMsg.reply.msgHandle =
						    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyAsyncMsg.reply.msgHandle,
									     endianness);

						pEvt->info.replyAsyncMsg.reply.messageInfo.sendReceive =
						    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyAsyncMsg.reply.
									     messageInfo.sendReceive, endianness);

						pEvt->info.replyAsyncMsg.reply.messageInfo.sender.senderId =
						    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyAsyncMsg.reply.
									     messageInfo.sender.senderId, endianness);

						pEvt->info.replyAsyncMsg.reply.messageInfo.sendTime =
						    m_MQSV_REVERSE_ENDIAN_LL(&pEvt->info.replyAsyncMsg.reply.
									     messageInfo.sendTime, endianness);
					}
					break;
				default:
					return NCSCC_RC_FAILURE;
				}
			}
		}

		*o_evt = (MQSV_DSEND_EVT *)mds_info.info.svc_direct_send.info.sndrsp.buff;
	} else
		m_LOG_MQSV_A(MQA_MDS_SEND_FAILURE, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, rc, __FILE__, __LINE__);

	m_MQSV_MQA_GIVEUP_MQA_CB;
	return rc;
}
Esempio n. 8
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;
}
Esempio n. 9
0
/****************************************************************************
  Name          : lga_mds_dec
 
  Description   : This is a callback routine that is invoked to decode LGS
                  messages.
 
  Arguments     : pointer to struct ncsmds_callback_info
 
  Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
 
  Notes         : None.
******************************************************************************/
static uint32_t lga_mds_dec(struct ncsmds_callback_info *info)
{
	uint8_t *p8;
	lgsv_msg_t *msg;
	NCS_UBAID *uba = info->info.dec.io_uba;
	uint8_t local_data[20];
	uint32_t total_bytes = 0;
	TRACE_ENTER();

	if (0 == m_NCS_MSG_FORMAT_IS_VALID(info->info.dec.i_msg_fmt_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)) {
		TRACE("Invalid message format!!!\n");
		TRACE_LEAVE();
		return NCSCC_RC_FAILURE;
	}

    /** Allocate a new msg in both sync/async cases 
     **/
	if (NULL == (msg = calloc(1, sizeof(lgsv_msg_t)))) {
		TRACE("calloc failed\n");
		return NCSCC_RC_FAILURE;
	}

	info->info.dec.o_msg = (uint8_t *)msg;

	p8 = ncs_dec_flatten_space(uba, local_data, 4);
	msg->type = ncs_decode_32bit(&p8);
	ncs_dec_skip_space(uba, 4);
	total_bytes += 4;

	switch (msg->type) {
	case LGSV_LGA_API_RESP_MSG:
		{
			p8 = ncs_dec_flatten_space(uba, local_data, 8);
			msg->info.api_resp_info.type = ncs_decode_32bit(&p8);
			msg->info.api_resp_info.rc = ncs_decode_32bit(&p8);
			ncs_dec_skip_space(uba, 8);
			total_bytes += 8;
			TRACE_2("LGSV_LGA_API_RESP_MSG");

			switch (msg->info.api_resp_info.type) {
			case LGSV_INITIALIZE_RSP:
				total_bytes += lga_dec_initialize_rsp_msg(uba, msg);
				break;
			case LGSV_FINALIZE_RSP:
				total_bytes += lga_dec_finalize_rsp_msg(uba, msg);
				break;
			case LGSV_STREAM_OPEN_RSP:
				total_bytes += lga_dec_lstr_open_sync_rsp_msg(uba, msg);
				break;
			case LGSV_STREAM_CLOSE_RSP:
				total_bytes += lga_dec_lstr_close_rsp_msg(uba, msg);
				break;
			default:
				TRACE_2("Unknown API RSP type %d", msg->info.api_resp_info.type);
				break;
			}
		}
		break;
	case LGSV_LGS_CBK_MSG:
		{
			p8 = ncs_dec_flatten_space(uba, local_data, 16);
			msg->info.cbk_info.type = ncs_decode_32bit(&p8);
			msg->info.cbk_info.lgs_client_id = ncs_decode_32bit(&p8);
			msg->info.cbk_info.inv = ncs_decode_64bit(&p8);
			ncs_dec_skip_space(uba, 16);
			total_bytes += 16;
			TRACE_2("LGSV_LGS_CBK_MSG");
			switch (msg->info.cbk_info.type) {
			case LGSV_WRITE_LOG_CALLBACK_IND:
				TRACE_2("decode writelog message");
				total_bytes += lga_dec_write_cbk_msg(uba, msg);
				break;
			default:
				TRACE_2("Unknown callback type = %d!", msg->info.cbk_info.type);
				break;
			}
		}
		break;
	default:
		TRACE("Unknown MSG type %d", msg->type);
		break;
	}
	TRACE_LEAVE();
	return NCSCC_RC_SUCCESS;
}
Esempio n. 10
0
/****************************************************************************
  Name          : ntfa_mds_dec
 
  Description   : This is a callback routine that is invoked to decode NTFS
                  messages.
 
  Arguments     : pointer to struct ncsmds_callback_info
 
  Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
 
  Notes         : None.
******************************************************************************/
static uns32 ntfa_mds_dec(struct ncsmds_callback_info *info)
{
	uns8 *p8;
	ntfsv_msg_t *msg;
	NCS_UBAID *uba = info->info.dec.io_uba;
	uns8 local_data[12];
	uns32 total_bytes = 0;
	TRACE_ENTER();

	if (0 == m_NCS_MSG_FORMAT_IS_VALID(info->info.dec.i_msg_fmt_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)) {
		TRACE("Invalid message format!!!\n");
		TRACE_LEAVE();
		return NCSCC_RC_FAILURE;
	}

    /** Allocate a new msg in both sync/async cases 
     **/
	if (NULL == (msg = calloc(1, sizeof(ntfsv_msg_t)))) {
		TRACE("calloc failed\n");
		return NCSCC_RC_FAILURE;
	}

	info->info.dec.o_msg = (uns8 *)msg;

	p8 = ncs_dec_flatten_space(uba, local_data, 4);
	msg->type = ncs_decode_32bit(&p8);
	ncs_dec_skip_space(uba, 4);
	total_bytes += 4;

	switch (msg->type) {
	case NTFSV_NTFA_API_RESP_MSG:
		{
			p8 = ncs_dec_flatten_space(uba, local_data, 8);
			msg->info.api_resp_info.type = ncs_decode_32bit(&p8);
			msg->info.api_resp_info.rc = ncs_decode_32bit(&p8);
			ncs_dec_skip_space(uba, 8);
			total_bytes += 8;
			TRACE_2("NTFSV_NTFA_API_RESP_MSG rc = %d", (int)msg->info.api_resp_info.rc);

			switch (msg->info.api_resp_info.type) {
			case NTFSV_INITIALIZE_RSP:
				total_bytes += ntfa_dec_initialize_rsp_msg(uba, msg);
				break;
			case NTFSV_SUBSCRIBE_RSP:
				total_bytes += ntfa_dec_subscribe_rsp_msg(uba, msg);
				break;
			case NTFSV_UNSUBSCRIBE_RSP:	/* Only header sent from server */
				break;
			case NTFSV_SEND_NOT_RSP:
				total_bytes += ntfa_dec_send_not_rsp_msg(uba, msg);
				break;
			case NTFSV_READER_INITIALIZE_RSP:
				total_bytes += ntfa_dec_reader_initialize_rsp_msg(uba, msg);
				break;
			case NTFSV_READER_FINALIZE_RSP:
				total_bytes += ntfa_dec_reader_finalize_rsp_msg(uba, msg);
				break;
			case NTFSV_READ_NEXT_RSP:
				total_bytes += ntfa_dec_read_next_rsp_msg(uba, msg);
				break;
			case NTFSV_FINALIZE_RSP:
				break;
			default:
				TRACE_2("Unknown API RSP type %d", msg->info.api_resp_info.type);
				break;
			}
		}
		break;
	case NTFSV_NTFS_CBK_MSG:
		{
			p8 = ncs_dec_flatten_space(uba, local_data, 12);
			msg->info.cbk_info.type = ncs_decode_32bit(&p8);
			msg->info.cbk_info.ntfs_client_id = ncs_decode_32bit(&p8);
			msg->info.cbk_info.subscriptionId = ncs_decode_32bit(&p8);
			ncs_dec_skip_space(uba, 12);
			total_bytes += 12;
			TRACE_2("NTFSV_NTFS_CBK_MSG");
			switch (msg->info.cbk_info.type) {
			case NTFSV_NOTIFICATION_CALLBACK:
				/* TODO: use notificationAlloc here? */
				msg->info.cbk_info.param.notification_cbk = calloc(1, sizeof(ntfsv_send_not_req_t));
				if (NULL == msg->info.cbk_info.param.notification_cbk) {
					TRACE_1("could not allocate memory");
					return 0;
				}
				TRACE_2("decode notification cbk message");
				total_bytes += ntfa_dec_not_send_cbk_msg(uba, msg);
				break;
			case NTFSV_DISCARDED_CALLBACK:
				TRACE_2("decode discarded cbk message");
				total_bytes += ntfa_dec_not_discard_cbk_msg(uba, msg);
				break;
			default:
				TRACE_2("Unknown callback type = %d!", msg->info.cbk_info.type);
				break;
			}
		}
		break;
	default:
		TRACE("Unknown MSG type %d", msg->type);
		break;
	}
	TRACE_LEAVE();
	return NCSCC_RC_SUCCESS;
}