uint32_t mds_register(smfd_cb_t * cb) { NCSMDS_INFO svc_info; MDS_SVC_ID smfnd_id[1] = { NCSMDS_SVC_ID_SMFND }; MDS_SVC_ID smfd_id[1] = { NCSMDS_SVC_ID_SMFD }; /* memset the svc_info */ memset(&svc_info, 0, sizeof(NCSMDS_INFO)); /* Install with MDS our service ID NCSMDS_SVC_ID_SMFD. */ svc_info.i_mds_hdl = cb->mds_handle; svc_info.i_svc_id = NCSMDS_SVC_ID_SMFD; svc_info.i_op = MDS_INSTALL; svc_info.info.svc_install.i_yr_svc_hdl = 0; svc_info.info.svc_install.i_install_scope = NCSMDS_SCOPE_NONE; /* node specific */ svc_info.info.svc_install.i_svc_cb = mds_callback; /* callback */ svc_info.info.svc_install.i_mds_q_ownership = false; svc_info.info.svc_install.i_mds_svc_pvt_ver = SMFD_MDS_PVT_SUBPART_VERSION; if (ncsmds_api(&svc_info) == NCSCC_RC_FAILURE) { LOG_ER("smfd_mds_register: mds install SMFD FAILED\n"); return NCSCC_RC_FAILURE; } /* Subscribe to SMFD for redundancy events, needed ?? */ memset(&svc_info, 0, sizeof(NCSMDS_INFO)); svc_info.i_mds_hdl = cb->mds_handle; svc_info.i_svc_id = NCSMDS_SVC_ID_SMFD; svc_info.i_op = MDS_RED_SUBSCRIBE; svc_info.info.svc_subscribe.i_num_svcs = 1; svc_info.info.svc_subscribe.i_scope = NCSMDS_SCOPE_NONE; svc_info.info.svc_subscribe.i_svc_ids = smfd_id; if (ncsmds_api(&svc_info) == NCSCC_RC_FAILURE) { LOG_ER ("smfd_mds_register: MDS Subscribe for redundancy Failed"); mds_unregister(cb); return NCSCC_RC_FAILURE; } /* Subscribe to SMFND up/down events */ memset(&svc_info, 0, sizeof(NCSMDS_INFO)); svc_info.i_mds_hdl = cb->mds_handle; svc_info.i_svc_id = NCSMDS_SVC_ID_SMFD; svc_info.i_op = MDS_SUBSCRIBE; svc_info.info.svc_subscribe.i_num_svcs = 1; svc_info.info.svc_subscribe.i_scope = NCSMDS_SCOPE_NONE; svc_info.info.svc_subscribe.i_svc_ids = smfnd_id; if (ncsmds_api(&svc_info) == NCSCC_RC_FAILURE) { LOG_ER("smfd_mds_register: mds subscribe SMFD FAILED\n"); mds_unregister(cb); return NCSCC_RC_FAILURE; } return NCSCC_RC_SUCCESS; }
/**************************************************************************** Name : lga_mds_init Description : This routine registers the LGA Service with MDS. Arguments : cb - ptr to the LGA control block Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ uint32_t lga_mds_init(lga_cb_t *cb) { NCSADA_INFO ada_info; NCSMDS_INFO mds_info; uint32_t rc = NCSCC_RC_SUCCESS; MDS_SVC_ID svc = NCSMDS_SVC_ID_LGS; TRACE_ENTER(); /** Create the ADEST for LGA and get the pwe hdl**/ memset(&ada_info, '\0', sizeof(ada_info)); ada_info.req = NCSADA_GET_HDLS; if (NCSCC_RC_SUCCESS != (rc = ncsada_api(&ada_info))) { TRACE("NCSADA_GET_HDLS failed, rc = %d", rc); return NCSCC_RC_FAILURE; } /** Store the info obtained from MDS ADEST creation **/ cb->mds_hdl = ada_info.info.adest_get_hdls.o_mds_pwe1_hdl; /** Now install into mds **/ memset(&mds_info, '\0', sizeof(NCSMDS_INFO)); mds_info.i_mds_hdl = cb->mds_hdl; mds_info.i_svc_id = NCSMDS_SVC_ID_LGA; mds_info.i_op = MDS_INSTALL; mds_info.info.svc_install.i_yr_svc_hdl = 0; mds_info.info.svc_install.i_install_scope = NCSMDS_SCOPE_NONE; /* PWE scope */ mds_info.info.svc_install.i_svc_cb = lga_mds_callback; /* callback */ mds_info.info.svc_install.i_mds_q_ownership = false; /* LGA doesn't own the mds queue */ mds_info.info.svc_install.i_mds_svc_pvt_ver = LGA_SVC_PVT_SUBPART_VERSION; if ((rc = ncsmds_api(&mds_info)) != NCSCC_RC_SUCCESS) { TRACE("mds api call failed"); return NCSCC_RC_FAILURE; } /* Now subscribe for events that will be generated by MDS */ memset(&mds_info, '\0', sizeof(NCSMDS_INFO)); mds_info.i_mds_hdl = cb->mds_hdl; mds_info.i_svc_id = NCSMDS_SVC_ID_LGA; mds_info.i_op = MDS_SUBSCRIBE; mds_info.info.svc_subscribe.i_scope = NCSMDS_SCOPE_NONE; mds_info.info.svc_subscribe.i_num_svcs = 1; mds_info.info.svc_subscribe.i_svc_ids = &svc; rc = ncsmds_api(&mds_info); if (rc != NCSCC_RC_SUCCESS) { TRACE("mds api call failed"); return rc; } TRACE_LEAVE(); return rc; }
uint32_t cpa_mds_register(CPA_CB *cb) { NCSMDS_INFO svc_info; MDS_SVC_ID subs_id[2] = { NCSMDS_SVC_ID_CPND, NCSMDS_SVC_ID_CPD }; uint32_t rc = NCSCC_RC_SUCCESS; TRACE_ENTER(); /* STEP1: Get the MDS Handle */ if (cpa_mds_get_handle(cb) != NCSCC_RC_SUCCESS) return NCSCC_RC_FAILURE; /* memset the svc_info */ memset(&svc_info, 0, sizeof(NCSMDS_INFO)); /* STEP 2 : Install on ADEST with MDS with service ID NCSMDS_SVC_ID_CPA. */ svc_info.i_mds_hdl = cb->cpa_mds_hdl; svc_info.i_svc_id = NCSMDS_SVC_ID_CPA; svc_info.i_op = MDS_INSTALL; svc_info.info.svc_install.i_yr_svc_hdl = cb->agent_handle_id; svc_info.info.svc_install.i_install_scope = NCSMDS_SCOPE_NONE; /* node specific */ svc_info.info.svc_install.i_svc_cb = cpa_mds_callback; /* callback */ svc_info.info.svc_install.i_mds_q_ownership = false; /* CPA owns the mds queue */ svc_info.info.svc_install.i_mds_svc_pvt_ver = CPA_MDS_PVT_SUBPART_VERSION; /* Private Subpart Version of CPA for Versioning infrastructure */ if ((rc = ncsmds_api(&svc_info)) != NCSCC_RC_SUCCESS) { TRACE_4("CPA MDS:INSTALL failed with return value:%d",rc); return rc; } cb->cpa_mds_dest = svc_info.info.svc_install.o_dest; /* STEP 3: Subscribe to CPND up/down events */ svc_info.i_op = MDS_SUBSCRIBE; svc_info.info.svc_subscribe.i_num_svcs = 1; svc_info.info.svc_subscribe.i_scope = NCSMDS_SCOPE_NONE; svc_info.info.svc_subscribe.i_svc_ids = &subs_id[0]; if ((rc = ncsmds_api(&svc_info)) != NCSCC_RC_SUCCESS) { TRACE_4("CPA MDS:SUBSCRIBE failed with return value:%d",rc); goto error; } return NCSCC_RC_SUCCESS; error: /* Uninstall with the mds */ cpa_mds_unregister(cb); TRACE_LEAVE2("retval = %u", rc); return NCSCC_RC_FAILURE; }
/***********************************************************************//** * @brief This routine registers the PLMA with MDS. * * @return NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE. ***************************************************************************/ uint32_t plma_mds_register() { uint32_t rc = NCSCC_RC_SUCCESS; NCSMDS_INFO svc_info; MDS_SVC_ID svc_id[1] = { NCSMDS_SVC_ID_PLMS}; PLMA_CB *plma_cb = plma_ctrlblk; TRACE_ENTER(); /* STEP 1: the MDS handle for PLMA*/ rc = plma_mds_get_handle(); if (NCSCC_RC_SUCCESS != rc) { LOG_ER("PLMA - mds get handle failed"); return rc; } /* STEP 2 : Install with MDS with service ID NCSMDS_SVC_ID_PLMA. */ memset(&svc_info, 0, sizeof(NCSMDS_INFO)); svc_info.i_mds_hdl = plma_cb->mds_hdl; svc_info.i_svc_id = NCSMDS_SVC_ID_PLMA; svc_info.i_op = MDS_INSTALL; svc_info.info.svc_install.i_yr_svc_hdl = 0; svc_info.info.svc_install.i_install_scope = NCSMDS_SCOPE_NONE; /*node specific */ svc_info.info.svc_install.i_svc_cb = plma_mds_callback; /* callback */ svc_info.info.svc_install.i_mds_q_ownership = false; /***************************FIXME : MDS svc private sub part ver no?.**/ svc_info.info.svc_install.i_mds_svc_pvt_ver = PLMA_MDS_PVT_SUBPART_VERSION; if (ncsmds_api(&svc_info) == NCSCC_RC_FAILURE) { LOG_ER("PLMA - MDS Install Failed"); return NCSCC_RC_FAILURE; } /* STEP 3 : Subscribe to PLMS up/down events */ memset(&svc_info, 0, sizeof(NCSMDS_INFO)); svc_info.i_mds_hdl = plma_cb->mds_hdl; svc_info.i_svc_id = NCSMDS_SVC_ID_PLMA; svc_info.i_op = MDS_SUBSCRIBE; svc_info.info.svc_subscribe.i_num_svcs = 1; svc_info.info.svc_subscribe.i_scope = NCSMDS_SCOPE_NONE; svc_info.info.svc_subscribe.i_svc_ids = svc_id; if (ncsmds_api(&svc_info) == NCSCC_RC_FAILURE) { LOG_ER("PLMA - MDS Subscribe for PLMS up/down Failed"); plma_mds_unregister(); return NCSCC_RC_FAILURE; } TRACE_LEAVE(); return rc; }
uns32 rde_mds_register(RDE_CONTROL_BLOCK *cb) { NCSADA_INFO ada_info; NCSMDS_INFO svc_info; MDS_SVC_ID svc_id[1] = { NCSMDS_SVC_ID_RDE }; MDS_DEST mds_adest; TRACE_ENTER(); ada_info.req = NCSADA_GET_HDLS; if (ncsada_api(&ada_info) != NCSCC_RC_SUCCESS) { LOG_ER("%s: NCSADA_GET_HDLS Failed", __FUNCTION__); return NCSCC_RC_FAILURE; } mds_hdl = ada_info.info.adest_get_hdls.o_mds_pwe1_hdl; mds_adest = ada_info.info.adest_get_hdls.o_adest; svc_info.i_mds_hdl = mds_hdl; svc_info.i_svc_id = NCSMDS_SVC_ID_RDE; svc_info.i_op = MDS_INSTALL; svc_info.info.svc_install.i_yr_svc_hdl = 0; svc_info.info.svc_install.i_install_scope = NCSMDS_SCOPE_NONE; /*node specific */ svc_info.info.svc_install.i_svc_cb = mds_callback; /* callback */ svc_info.info.svc_install.i_mds_q_ownership = FALSE; svc_info.info.svc_install.i_mds_svc_pvt_ver = RDE_MDS_PVT_SUBPART_VERSION; if (ncsmds_api(&svc_info) == NCSCC_RC_FAILURE) { LOG_ER("%s: MDS Install Failed", __FUNCTION__); return NCSCC_RC_FAILURE; } memset(&svc_info, 0, sizeof(NCSMDS_INFO)); svc_info.i_mds_hdl = mds_hdl; svc_info.i_svc_id = NCSMDS_SVC_ID_RDE; svc_info.i_op = MDS_RED_SUBSCRIBE; svc_info.info.svc_subscribe.i_num_svcs = 1; svc_info.info.svc_subscribe.i_scope = NCSMDS_SCOPE_NONE; svc_info.info.svc_subscribe.i_svc_ids = svc_id; if (ncsmds_api(&svc_info) == NCSCC_RC_FAILURE) { LOG_ER("MDS Subscribe for redundancy Failed"); return NCSCC_RC_FAILURE; } TRACE_LEAVE2("NodeId:%x, mds_adest:%llx", ncs_get_node_id(), mds_adest); return NCSCC_RC_SUCCESS; }
uns32 cpa_mds_register(CPA_CB *cb) { NCSMDS_INFO svc_info; MDS_SVC_ID subs_id[2] = { NCSMDS_SVC_ID_CPND, NCSMDS_SVC_ID_CPD }; uns32 rc = NCSCC_RC_SUCCESS; /* STEP1: Get the MDS Handle */ if (cpa_mds_get_handle(cb) != NCSCC_RC_SUCCESS) return NCSCC_RC_FAILURE; /* memset the svc_info */ memset(&svc_info, 0, sizeof(NCSMDS_INFO)); /* STEP 2 : Install on ADEST with MDS with service ID NCSMDS_SVC_ID_CPA. */ svc_info.i_mds_hdl = cb->cpa_mds_hdl; svc_info.i_svc_id = NCSMDS_SVC_ID_CPA; svc_info.i_op = MDS_INSTALL; svc_info.info.svc_install.i_yr_svc_hdl = cb->agent_handle_id; svc_info.info.svc_install.i_install_scope = NCSMDS_SCOPE_NONE; /* node specific */ svc_info.info.svc_install.i_svc_cb = cpa_mds_callback; /* callback */ svc_info.info.svc_install.i_mds_q_ownership = FALSE; /* CPA owns the mds queue */ svc_info.info.svc_install.i_mds_svc_pvt_ver = CPA_MDS_PVT_SUBPART_VERSION; /* Private Subpart Version of CPA for Versioning infrastructure */ if ((rc = ncsmds_api(&svc_info)) != NCSCC_RC_SUCCESS) { m_LOG_CPA_CCLL(CPA_API_FAILED, NCSFL_LC_CKPT_MGMT, NCSFL_SEV_ERROR, "MDS:INSTALL", __FILE__, __LINE__, rc); return rc; } cb->cpa_mds_dest = svc_info.info.svc_install.o_dest; /* STEP 3: Subscribe to CPND up/down events */ svc_info.i_op = MDS_SUBSCRIBE; svc_info.info.svc_subscribe.i_num_svcs = 1; svc_info.info.svc_subscribe.i_scope = NCSMDS_SCOPE_NONE; svc_info.info.svc_subscribe.i_svc_ids = &subs_id[0]; if ((rc = ncsmds_api(&svc_info)) != NCSCC_RC_SUCCESS) { m_LOG_CPA_CCLL(CPA_API_FAILED, NCSFL_LC_CKPT_MGMT, NCSFL_SEV_ERROR, "MDS:SUBSCRIBE", __FILE__, __LINE__, rc); goto error; } return NCSCC_RC_SUCCESS; error: /* Uninstall with the mds */ cpa_mds_unregister(cb); return NCSCC_RC_FAILURE; }
uns32 mqnd_mds_register(MQND_CB *cb) { uns32 rc = NCSCC_RC_SUCCESS; NCSMDS_INFO svc_info; MDS_SVC_ID svc_id[] = { NCSMDS_SVC_ID_MQD, NCSMDS_SVC_ID_MQA }; /* STEP1: Get the MDS Handle */ rc = mqnd_mds_get_handle(cb); if (rc != NCSCC_RC_SUCCESS) return rc; /* memset the svc_info */ memset(&svc_info, 0, sizeof(NCSMDS_INFO)); /* STEP 2 : Install on ADEST with MDS with service ID NCSMDS_SVC_ID_MQA. */ svc_info.i_mds_hdl = cb->my_mds_hdl; svc_info.i_svc_id = NCSMDS_SVC_ID_MQND; svc_info.i_op = MDS_INSTALL; svc_info.info.svc_install.i_yr_svc_hdl = cb->cb_hdl; svc_info.info.svc_install.i_install_scope = NCSMDS_SCOPE_NONE; /* node specific */ svc_info.info.svc_install.i_svc_cb = mqnd_mds_callback; /* callback */ svc_info.info.svc_install.i_mds_q_ownership = FALSE; /* MQND owns the mds queue */ svc_info.info.svc_install.i_mds_svc_pvt_ver = MQND_PVT_SUBPART_VERSION; if ((rc = ncsmds_api(&svc_info)) != NCSCC_RC_SUCCESS) { m_LOG_MQSV_ND(MQND_MDS_INSTALL_FAILED, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, rc, __FILE__, __LINE__); return NCSCC_RC_FAILURE; } m_LOG_MQSV_ND(MQND_MDS_INSTALL_SUCCESS, NCSFL_LC_MQSV_INIT, NCSFL_SEV_NOTICE, rc, __FILE__, __LINE__); cb->my_dest = svc_info.info.svc_install.o_dest; /* STEP 3: Subscribe to MQD/MQA up/down events */ svc_info.i_op = MDS_SUBSCRIBE; svc_info.info.svc_subscribe.i_num_svcs = 2; svc_info.info.svc_subscribe.i_scope = NCSMDS_SCOPE_NONE; svc_info.info.svc_subscribe.i_svc_ids = svc_id; if ((rc = ncsmds_api(&svc_info)) != NCSCC_RC_SUCCESS) { m_LOG_MQSV_ND(MQND_MDS_SUBSCRIBE_FAILED, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, rc, __FILE__, __LINE__); /* Uninstall with the mds */ svc_info.i_op = MDS_UNINSTALL; ncsmds_api(&svc_info); return NCSCC_RC_FAILURE; } m_LOG_MQSV_ND(MQND_MDS_SUBSCRIBE_SUCCESS, NCSFL_LC_MQSV_INIT, NCSFL_SEV_NOTICE, rc, __FILE__, __LINE__); return NCSCC_RC_SUCCESS; }
/*************************************************************************** @brief : Register with MDS and Subscribe to SMFND svc evts. @return : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE *****************************************************************************/ uint32_t smfa_mds_register() { NCSADA_INFO arg; NCSMDS_INFO svc_info; MDS_SVC_ID svc_id[1] = { NCSMDS_SVC_ID_SMFND }; SMFA_CB *cb = &_smfa_cb; /* Get MDS handle.*/ memset(&arg, 0, sizeof(NCSADA_INFO)); arg.req = NCSADA_GET_HDLS; if (NCSCC_RC_SUCCESS != ncsada_api(&arg)){ LOG_ER("SMFA: MDS get handle FAILED."); return NCSCC_RC_FAILURE; } cb->smfa_mds_hdl = arg.info.adest_get_hdls.o_mds_pwe1_hdl; /* Install with MDS. */ memset(&svc_info, 0, sizeof(NCSMDS_INFO)); svc_info.i_mds_hdl = cb->smfa_mds_hdl; svc_info.i_svc_id = NCSMDS_SVC_ID_SMFA; svc_info.i_op = MDS_INSTALL; svc_info.info.svc_install.i_yr_svc_hdl = 0; svc_info.info.svc_install.i_install_scope = NCSMDS_SCOPE_INTRANODE; svc_info.info.svc_install.i_svc_cb = smfa_mds_callback; svc_info.info.svc_install.i_mds_q_ownership = false; if (NCSCC_RC_SUCCESS != ncsmds_api(&svc_info)){ LOG_ER("SMFA: MDS Install FAILED."); return NCSCC_RC_FAILURE; } /* Subscribe for SMFND UP/DOWN evetns.*/ memset(&svc_info, 0, sizeof(NCSMDS_INFO)); svc_info.i_mds_hdl = cb->smfa_mds_hdl; svc_info.i_svc_id = NCSMDS_SVC_ID_SMFA; svc_info.i_op = MDS_SUBSCRIBE; svc_info.info.svc_subscribe.i_num_svcs = 1; svc_info.info.svc_subscribe.i_scope = NCSMDS_SCOPE_INTRANODE; svc_info.info.svc_subscribe.i_svc_ids = svc_id; if (NCSCC_RC_SUCCESS != ncsmds_api(&svc_info)){ LOG_ER("SMFA: MDS Subscription FAILED."); smfa_mds_unregister(); return NCSCC_RC_FAILURE; } return NCSCC_RC_SUCCESS; }
/**************************************************************************** Name : cpa_mds_msg_send Description : This routine sends the CPA message to CPND. Arguments : uint32_t cpa_mds_hdl Handle of CPA MDS_DEST *destination - destintion to send to CPSV_EVT *i_evt - CPSV_EVT pointer Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ uint32_t cpa_mds_msg_send(uint32_t cpa_mds_hdl, MDS_DEST *destination, CPSV_EVT *i_evt, uint32_t to_svc) { NCSMDS_INFO mds_info; uint32_t rc; TRACE_ENTER(); if (!i_evt) return NCSCC_RC_FAILURE; memset(&mds_info, 0, sizeof(NCSMDS_INFO)); mds_info.i_mds_hdl = cpa_mds_hdl; mds_info.i_svc_id = NCSMDS_SVC_ID_CPA; mds_info.i_op = MDS_SEND; /* fill the send structure */ mds_info.info.svc_send.i_msg = (NCSCONTEXT)i_evt; mds_info.info.svc_send.i_priority = MDS_SEND_PRIORITY_MEDIUM; mds_info.info.svc_send.i_to_svc = to_svc; mds_info.info.svc_send.i_sendtype = MDS_SENDTYPE_SND; /* fill the send rsp strcuture */ mds_info.info.svc_send.info.snd.i_to_dest = *destination; /* send the message */ rc = ncsmds_api(&mds_info); if (NCSCC_RC_SUCCESS != rc) TRACE_4("Cpa MDS send failed"); else TRACE_1("Cpa MDS send success"); TRACE_LEAVE(); return rc; }
/***************************************************************************** PROCEDURE NAME : gld_process_send_non_master_info DESCRIPTION : This function sends the corresponding resource nonmaster info to the master ARGUMENTS :gld_cb - ptr to the GLD control block glnd_rsc node_details status RETURNS :NCSCC_RC_FAILURE/NCSCC_RC_SUCCESS NOTES : None *****************************************************************************/ static uns32 gld_process_send_non_master_info(GLSV_GLD_CB *gld_cb, GLSV_GLD_GLND_RSC_REF *glnd_rsc, GLSV_GLD_GLND_DETAILS *node_details, uns32 status) { GLSV_GLND_EVT glnd_evt; NCSMDS_INFO snd_mds; uns32 res; if (glnd_rsc->rsc_info->node_list->node_id != node_details->node_id) { memset(&glnd_evt, '\0', sizeof(GLSV_GLND_EVT)); glnd_evt.type = GLSV_GLND_EVT_NON_MASTER_INFO; glnd_evt.info.non_master_info.dest_id = node_details->dest_id; glnd_evt.info.non_master_info.status = status; snd_mds.i_mds_hdl = gld_cb->mds_handle; snd_mds.i_svc_id = NCSMDS_SVC_ID_GLD; snd_mds.i_op = MDS_SEND; snd_mds.info.svc_send.i_msg = (NCSCONTEXT)&glnd_evt; snd_mds.info.svc_send.i_to_svc = NCSMDS_SVC_ID_GLND; snd_mds.info.svc_send.i_priority = MDS_SEND_PRIORITY_HIGH; snd_mds.info.svc_send.i_sendtype = MDS_SENDTYPE_SND; snd_mds.info.svc_send.info.snd.i_to_dest = glnd_rsc->rsc_info->node_list->dest_id; res = ncsmds_api(&snd_mds); if (res != NCSCC_RC_SUCCESS) { m_LOG_GLD_SVC_PRVDR(GLD_MDS_SEND_ERROR, NCSFL_SEV_ERROR, __FILE__, __LINE__); return NCSCC_RC_FAILURE; } } return NCSCC_RC_SUCCESS; }
/**************************************************************************** Name : cpa_mds_msg_sync_send Description : This routine sends the CPA message to CPND. Arguments : uint32_t cpa_mds_hdl Handle of CPA MDS_DEST *destination - destintion to send to CPSV_EVT *i_evt - CPSV_EVT pointer CPSV_EVT **o_evt - CPSV_EVT pointer to result data timeout - timeout value in 10 ms Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ uint32_t cpa_mds_msg_sync_send(uint32_t cpa_mds_hdl, MDS_DEST *destination, CPSV_EVT *i_evt, CPSV_EVT **o_evt, uint32_t timeout) { NCSMDS_INFO mds_info; uint32_t rc; TRACE_ENTER(); if (!i_evt) return NCSCC_RC_FAILURE; memset(&mds_info, 0, sizeof(NCSMDS_INFO)); mds_info.i_mds_hdl = cpa_mds_hdl; mds_info.i_svc_id = NCSMDS_SVC_ID_CPA; mds_info.i_op = MDS_SEND; /* fill the send structure */ mds_info.info.svc_send.i_msg = (NCSCONTEXT)i_evt; mds_info.info.svc_send.i_priority = MDS_SEND_PRIORITY_MEDIUM; mds_info.info.svc_send.i_to_svc = NCSMDS_SVC_ID_CPND; mds_info.info.svc_send.i_sendtype = MDS_SENDTYPE_SNDRSP; /* fill the send rsp strcuture */ mds_info.info.svc_send.info.sndrsp.i_time_to_wait = timeout; /* timeto wait in 10ms */ mds_info.info.svc_send.info.sndrsp.i_to_dest = *destination; /* send the message */ rc = ncsmds_api(&mds_info); if (rc == NCSCC_RC_SUCCESS) *o_evt = mds_info.info.svc_send.info.sndrsp.o_rsp; TRACE_LEAVE2("retval = %u",rc); return rc; }
/*************************************************************************** * Name : fm_mds_sync_send * * Description : Sends a message to destination in SYNC. * * Arguments : Control Block, Pointer to message, Priority, Send Type, * Pointer to MDS DEST, Context of the message. * * Return Values : NCSCC_RC_FAILURE/NCSCC_RC_SUCCESS * * Notes : None. ***************************************************************************/ uint32_t fm_mds_sync_send(FM_CB *fm_cb, NCSCONTEXT msg, NCSMDS_SVC_ID svc_id, MDS_SEND_PRIORITY_TYPE priority, MDS_SENDTYPES send_type, MDS_DEST *i_to_dest, MDS_SYNC_SND_CTXT *mds_ctxt) { NCSMDS_INFO info; uint32_t return_val; memset(&info, '\0', sizeof(NCSMDS_INFO)); info.i_mds_hdl = (MDS_HDL)fm_cb->adest_pwe1_hdl; info.i_svc_id = NCSMDS_SVC_ID_GFM; info.i_op = MDS_SEND; info.info.svc_send.i_msg = msg; info.info.svc_send.i_priority = priority; info.info.svc_send.i_to_svc = svc_id; if (mds_ctxt) { info.info.svc_send.i_sendtype = send_type; info.info.svc_send.info.rsp.i_sender_dest = *i_to_dest; info.info.svc_send.info.rsp.i_msg_ctxt = *mds_ctxt; } else { syslog(LOG_INFO, "fm_mds_sync_send: mds_ctxt NULL"); return NCSCC_RC_FAILURE; } return_val = ncsmds_api(&info); return return_val; }
/**************************************************************************** Name : cpa_mds_msg_send Description : This routine sends the CPA message to CPND. Arguments : uns32 cpa_mds_hdl Handle of CPA MDS_DEST *destination - destintion to send to CPSV_EVT *i_evt - CPSV_EVT pointer Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ uns32 cpa_mds_msg_send(uns32 cpa_mds_hdl, MDS_DEST *destination, CPSV_EVT *i_evt, uns32 to_svc) { NCSMDS_INFO mds_info; uns32 rc; if (!i_evt) return NCSCC_RC_FAILURE; memset(&mds_info, 0, sizeof(NCSMDS_INFO)); mds_info.i_mds_hdl = cpa_mds_hdl; mds_info.i_svc_id = NCSMDS_SVC_ID_CPA; mds_info.i_op = MDS_SEND; /* fill the send structure */ mds_info.info.svc_send.i_msg = (NCSCONTEXT)i_evt; mds_info.info.svc_send.i_priority = MDS_SEND_PRIORITY_MEDIUM; mds_info.info.svc_send.i_to_svc = to_svc; mds_info.info.svc_send.i_sendtype = MDS_SENDTYPE_SND; /* fill the send rsp strcuture */ mds_info.info.svc_send.info.snd.i_to_dest = *destination; /* send the message */ rc = ncsmds_api(&mds_info); return rc; }
/**************************************************************************** Name : ntfa_mds_msg_sync_send Description : This routine sends the NTFA message to NTFS. The send operation is a synchronous call that blocks until the response is received from NTFS. Arguments : cb - ptr to the NTFA CB i_msg - ptr to the NTFSv message o_msg - double ptr to NTFSv message response Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE/timeout Notes : None. ******************************************************************************/ uns32 ntfa_mds_msg_sync_send(ntfa_cb_t *cb, ntfsv_msg_t *i_msg, ntfsv_msg_t **o_msg, uns32 timeout) { NCSMDS_INFO mds_info; uns32 rc = NCSCC_RC_SUCCESS; TRACE_ENTER(); assert(cb != NULL && i_msg != NULL && o_msg != NULL); *o_msg = NULL; memset(&mds_info, '\0', sizeof(NCSMDS_INFO)); mds_info.i_mds_hdl = cb->mds_hdl; mds_info.i_svc_id = NCSMDS_SVC_ID_NTFA; mds_info.i_op = MDS_SEND; /* Fill the send structure */ mds_info.info.svc_send.i_msg = (NCSCONTEXT)i_msg; mds_info.info.svc_send.i_to_svc = NCSMDS_SVC_ID_NTFS; mds_info.info.svc_send.i_sendtype = MDS_SENDTYPE_SNDRSP; mds_info.info.svc_send.i_priority = MDS_SEND_PRIORITY_HIGH; /* fixme? */ /* fill the sub send rsp strcuture */ mds_info.info.svc_send.info.sndrsp.i_time_to_wait = timeout; /* timeto wait in 10ms FIX!!! */ mds_info.info.svc_send.info.sndrsp.i_to_dest = cb->ntfs_mds_dest; /* send the message */ if (NCSCC_RC_SUCCESS == (rc = ncsmds_api(&mds_info))) { /* Retrieve the response and take ownership of the memory */ *o_msg = (ntfsv_msg_t *)mds_info.info.svc_send.info.sndrsp.o_rsp; mds_info.info.svc_send.info.sndrsp.o_rsp = NULL; } else TRACE("ntfa_mds_msg_sync_send FAILED"); TRACE_LEAVE(); return rc; }
void plms_mds_unregister() { NCSMDS_INFO arg; uns32 rc; PLMS_CB * cb = plms_cb; /* NCSVDA_INFO vda_info; */ TRACE_ENTER(); /* Un-install your service into MDS. No need to cancel the services that are subscribed */ memset(&arg, 0, sizeof(NCSMDS_INFO)); arg.i_mds_hdl = cb->mds_hdl; arg.i_svc_id = NCSMDS_SVC_ID_PLMS; arg.i_op = MDS_UNINSTALL; if ((rc = ncsmds_api(&arg)) != NCSCC_RC_SUCCESS) { LOG_ER("PLMS - MDS Unregister Failed rc:%u", rc); goto done; } done: TRACE_LEAVE(); return; }
/**************************************************************************** Name : lga_mds_msg_sync_send Description : This routine sends the LGA message to LGS. The send operation is a synchronous call that blocks until the response is received from LGS. Arguments : cb - ptr to the LGA CB i_msg - ptr to the LGSv message o_msg - double ptr to LGSv message response Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE/timeout Notes : None. ******************************************************************************/ uint32_t lga_mds_msg_sync_send(lga_cb_t *cb, lgsv_msg_t *i_msg, lgsv_msg_t **o_msg, uint32_t timeout, uint32_t prio) { NCSMDS_INFO mds_info; uint32_t rc = NCSCC_RC_SUCCESS; TRACE_ENTER(); osafassert(cb != NULL && i_msg != NULL && o_msg != NULL); memset(&mds_info, '\0', sizeof(NCSMDS_INFO)); mds_info.i_mds_hdl = cb->mds_hdl; mds_info.i_svc_id = NCSMDS_SVC_ID_LGA; mds_info.i_op = MDS_SEND; /* Fill the send structure */ mds_info.info.svc_send.i_msg = (NCSCONTEXT)i_msg; mds_info.info.svc_send.i_to_svc = NCSMDS_SVC_ID_LGS; mds_info.info.svc_send.i_sendtype = MDS_SENDTYPE_SNDRSP; mds_info.info.svc_send.i_priority = prio; /* fixme? */ /* fill the sub send rsp strcuture */ mds_info.info.svc_send.info.sndrsp.i_time_to_wait = timeout; /* timeto wait in 10ms FIX!!! */ mds_info.info.svc_send.info.sndrsp.i_to_dest = cb->lgs_mds_dest; /* send the message */ if (NCSCC_RC_SUCCESS == (rc = ncsmds_api(&mds_info))) { /* Retrieve the response and take ownership of the memory */ *o_msg = (lgsv_msg_t *)mds_info.info.svc_send.info.sndrsp.o_rsp; mds_info.info.svc_send.info.sndrsp.o_rsp = NULL; } else TRACE("lga_mds_msg_sync_send FAILED: %u", rc); TRACE_LEAVE(); return rc; }
/**************************************************************************** Name : lga_mds_msg_async_send Description : This routine sends the LGA message to LGS. Arguments : cb - ptr to the LGA CB i_msg - ptr to the LGSv message Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ uint32_t lga_mds_msg_async_send(lga_cb_t *cb, struct lgsv_msg *i_msg, uint32_t prio) { NCSMDS_INFO mds_info; uint32_t rc = NCSCC_RC_SUCCESS; TRACE_ENTER(); osafassert(cb != NULL && i_msg != NULL); memset(&mds_info, '\0', sizeof(NCSMDS_INFO)); mds_info.i_mds_hdl = cb->mds_hdl; mds_info.i_svc_id = NCSMDS_SVC_ID_LGA; mds_info.i_op = MDS_SEND; /* fill the main send structure */ mds_info.info.svc_send.i_msg = (NCSCONTEXT)i_msg; mds_info.info.svc_send.i_priority = prio; mds_info.info.svc_send.i_to_svc = NCSMDS_SVC_ID_LGS; mds_info.info.svc_send.i_sendtype = MDS_SENDTYPE_SND; /* fill the sub send strcuture */ mds_info.info.svc_send.info.snd.i_to_dest = cb->lgs_mds_dest; /* send the message */ rc = ncsmds_api(&mds_info); if (rc != NCSCC_RC_SUCCESS) TRACE("failed"); TRACE_LEAVE(); return rc; }
/**************************************************************************** Name : avnd_mds_red_send Description : This routine sends the mds message to specified AvD. Arguments : cb - ptr to the AvND control block msg - ptr to the message dest - ptr to the MDS destination adest - ptr to the MDS adest(anchor) Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : This funtion as of now is only used to send the ACK-NACK msg to AvD. This funtion is introduced to overcome the problem of MDS dropping a msg when the role has changed but MDS in AvND has not updated its tables about the role change. Due to this problem MDS will try to send the msg to old active which may not be there in the system and hence the msg will be dropped. With this funtion we are sending msg to the new active AvD directly, without looking for its MDS role as seen by AvND. ******************************************************************************/ uns32 avnd_mds_red_send(AVND_CB *cb, AVND_MSG *msg, MDS_DEST *dest, MDS_DEST *adest) { NCSMDS_INFO mds_info; MDS_SEND_INFO *send_info = &mds_info.info.svc_send; MDS_SENDTYPE_RED_INFO *send = &send_info->info.red; uns32 rc = NCSCC_RC_SUCCESS; TRACE_ENTER2("Msg type '%u'", msg->type); /* populate the mds params */ memset(&mds_info, 0, sizeof(NCSMDS_INFO)); mds_info.i_mds_hdl = cb->mds_hdl; mds_info.i_svc_id = NCSMDS_SVC_ID_AVND; mds_info.i_op = MDS_SEND; send_info->i_msg = (NCSCONTEXT)msg; send_info->i_priority = MDS_SEND_PRIORITY_MEDIUM; /* this is be used only for ACK NACK for AVD */ if (msg->type != AVND_MSG_AVD) assert(0); send_info->i_to_svc = NCSMDS_SVC_ID_AVD; send_info->i_sendtype = MDS_SENDTYPE_RED; send->i_to_vdest = *dest; send->i_to_anc = *adest; /* assumption-:ADEST is same as anchor */ /* send the message */ rc = ncsmds_api(&mds_info); if (NCSCC_RC_SUCCESS != rc) LOG_CR("AVND MDS send failed: Msg type = %u, vdest = %llu, anchor = %llu",msg->type,send->i_to_vdest,send->i_to_anc); TRACE_LEAVE2("rc '%u'", rc); return rc; }
/**************************************************************************** Name : dts_mds_send_msg Description : This routine is use for sending the message to the DTA Arguments : cb - ptr to the DTScontrol block Return Values : NONE Notes : None. ******************************************************************************/ uns32 dts_mds_send_msg(DTSV_MSG *msg, MDS_DEST dta_dest, MDS_CLIENT_HDL mds_hdl) { NCSMDS_INFO mds_info; memset(&mds_info, 0, sizeof(mds_info)); mds_info.i_mds_hdl = mds_hdl; mds_info.i_svc_id = NCSMDS_SVC_ID_DTS; mds_info.i_op = MDS_SEND; mds_info.info.svc_send.i_msg = msg; mds_info.info.svc_send.i_to_svc = NCSMDS_SVC_ID_DTA; if (TRUE == msg->rsp_reqd) { mds_info.info.svc_send.i_priority = MDS_SEND_PRIORITY_HIGH; mds_info.info.svc_send.i_sendtype = MDS_SENDTYPE_RSP; mds_info.info.svc_send.info.rsp.i_msg_ctxt = msg->msg_ctxt; mds_info.info.svc_send.info.rsp.i_sender_dest = dta_dest; } else { mds_info.info.svc_send.i_priority = MDS_SEND_PRIORITY_LOW; mds_info.info.svc_send.i_sendtype = MDS_SENDTYPE_SND; mds_info.info.svc_send.info.snd.i_to_dest = dta_dest; } if (ncsmds_api(&mds_info) == NCSCC_RC_SUCCESS) { return NCSCC_RC_SUCCESS; } else { return m_DTS_DBG_SINK(NCSCC_RC_FAILURE, "dts_mds_send_msg : MDS send failed"); } }
/**************************************************************************** Name : mqnd_mds_msg_sync_send Description : This routine sends the Sinc requests from MQND Arguments : cb - ptr to the MQND CB i_evt - ptr to the MQSV message o_evt - ptr to the MQSV message returned timeout - timeout value in 10 ms Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ uns32 mqnd_mds_msg_sync_send(MQND_CB *cb, uns32 to_svc, MDS_DEST to_dest, MQSV_EVT *i_evt, MQSV_EVT **o_evt, uns32 timeout) { NCSMDS_INFO mds_info; uns32 rc; if (!i_evt) return NCSCC_RC_FAILURE; memset(&mds_info, 0, sizeof(NCSMDS_INFO)); mds_info.i_mds_hdl = cb->my_mds_hdl; mds_info.i_svc_id = NCSMDS_SVC_ID_MQND; mds_info.i_op = MDS_SEND; /* fill the send structure */ mds_info.info.svc_send.i_msg = (NCSCONTEXT)i_evt; mds_info.info.svc_send.i_priority = MDS_SEND_PRIORITY_MEDIUM; mds_info.info.svc_send.i_to_svc = to_svc; mds_info.info.svc_send.i_sendtype = MDS_SENDTYPE_SNDRSP; /* fill the send rsp strcuture */ mds_info.info.svc_send.info.sndrsp.i_time_to_wait = timeout; /* timeto wait in 10ms */ mds_info.info.svc_send.info.sndrsp.i_to_dest = to_dest; /* send the message */ rc = ncsmds_api(&mds_info); if (rc == NCSCC_RC_SUCCESS) *o_evt = mds_info.info.svc_send.info.sndrsp.o_rsp; else { m_LOG_MQSV_ND(MQND_MDS_SEND_FAIL, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, rc, __FILE__, __LINE__); } return rc; }
/***************************************************************************** PROCEDURE NAME : gld_process_send_non_master_info DESCRIPTION : This function sends the corresponding resource nonmaster info to the master ARGUMENTS :gld_cb - ptr to the GLD control block glnd_rsc node_details status RETURNS :NCSCC_RC_FAILURE/NCSCC_RC_SUCCESS NOTES : None *****************************************************************************/ static uint32_t gld_process_send_non_master_info(GLSV_GLD_CB *gld_cb, GLSV_GLD_GLND_RSC_REF *glnd_rsc, GLSV_GLD_GLND_DETAILS *node_details, uint32_t status) { GLSV_GLND_EVT glnd_evt; NCSMDS_INFO snd_mds; uint32_t res; TRACE_ENTER(); if (glnd_rsc->rsc_info->node_list->node_id != node_details->node_id) { memset(&glnd_evt, '\0', sizeof(GLSV_GLND_EVT)); glnd_evt.type = GLSV_GLND_EVT_NON_MASTER_INFO; glnd_evt.info.non_master_info.dest_id = node_details->dest_id; glnd_evt.info.non_master_info.status = status; snd_mds.i_mds_hdl = gld_cb->mds_handle; snd_mds.i_svc_id = NCSMDS_SVC_ID_GLD; snd_mds.i_op = MDS_SEND; snd_mds.info.svc_send.i_msg = (NCSCONTEXT)&glnd_evt; snd_mds.info.svc_send.i_to_svc = NCSMDS_SVC_ID_GLND; snd_mds.info.svc_send.i_priority = MDS_SEND_PRIORITY_HIGH; snd_mds.info.svc_send.i_sendtype = MDS_SENDTYPE_SND; snd_mds.info.svc_send.info.snd.i_to_dest = glnd_rsc->rsc_info->node_list->dest_id; res = ncsmds_api(&snd_mds); if (res != NCSCC_RC_SUCCESS) { LOG_ER("MDS Send failed"); goto end; } } end: TRACE_LEAVE(); return res; }
/***********************************************************************//** * @brief This function un-registers the PLMA Service with MDS. * * @return NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE. ***************************************************************************/ void plma_mds_unregister() { NCSMDS_INFO arg; uint32_t rc; PLMA_CB *plma_cb = plma_ctrlblk; TRACE_ENTER(); /** * Un-install your service into MDS. * No need to cancel the services that are subscribed */ memset(&arg, 0, sizeof(NCSMDS_INFO)); arg.i_mds_hdl = plma_cb->mds_hdl; arg.i_svc_id = NCSMDS_SVC_ID_PLMA; arg.i_op = MDS_UNINSTALL; if ((rc = ncsmds_api(&arg)) != NCSCC_RC_SUCCESS) { LOG_ER("PLMA - MDS Unregister Failed rc:%u", rc); goto done; } done: TRACE_LEAVE(); return; }
/**************************************************************************** Name : mqnd_mds_send Description : This routine sends the Events from MQND Arguments : cb - ptr to the MQND CB i_evt - ptr to the MQSV message o_evt - ptr to the MQSV message returned timeout - timeout value in 10 ms Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ uns32 mqnd_mds_send(MQND_CB *cb, uns32 to_svc, MDS_DEST to_dest, MQSV_EVT *evt) { NCSMDS_INFO mds_info; uns32 rc; if (!evt) return NCSCC_RC_FAILURE; memset(&mds_info, 0, sizeof(NCSMDS_INFO)); mds_info.i_mds_hdl = cb->my_mds_hdl; mds_info.i_svc_id = NCSMDS_SVC_ID_MQND; mds_info.i_op = MDS_SEND; /* fill the send structure */ mds_info.info.svc_send.i_msg = (NCSCONTEXT)evt; mds_info.info.svc_send.i_priority = MDS_SEND_PRIORITY_MEDIUM; mds_info.info.svc_send.i_to_svc = to_svc; mds_info.info.svc_send.i_sendtype = MDS_SENDTYPE_SND; mds_info.info.svc_send.info.snd.i_to_dest = to_dest; /* send the message */ rc = ncsmds_api(&mds_info); if (rc != NCSCC_RC_SUCCESS) { m_LOG_MQSV_ND(MQND_MDS_SEND_FAIL, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, rc, __FILE__, __LINE__); } return rc; }
uns32 mqnd_mds_send_rsp_direct(MQND_CB *cb, MQSV_DSEND_INFO *s_info, MQSV_DSEND_EVT *evt) { NCSMDS_INFO mds_info; uns32 rc; memset(&mds_info, 0, sizeof(NCSMDS_INFO)); mds_info.i_mds_hdl = cb->my_mds_hdl; mds_info.i_svc_id = NCSMDS_SVC_ID_MQND; mds_info.i_op = MDS_DIRECT_SEND; /* fill the send structure */ mds_info.info.svc_direct_send.i_direct_buff = (NCSCONTEXT)evt; mds_info.info.svc_direct_send.i_direct_buff_len = sizeof(MQSV_DSEND_EVT); mds_info.info.svc_direct_send.i_priority = MDS_SEND_PRIORITY_MEDIUM; mds_info.info.svc_direct_send.i_to_svc = s_info->to_svc; mds_info.info.svc_direct_send.i_msg_fmt_ver = evt->msg_fmt_version; mds_info.info.svc_direct_send.i_sendtype = s_info->stype; mds_info.info.svc_direct_send.info.rsp.i_msg_ctxt = s_info->ctxt; mds_info.info.svc_direct_send.info.rsp.i_sender_dest = s_info->dest; /* send the message */ rc = ncsmds_api(&mds_info); if (rc != NCSCC_RC_SUCCESS) { m_LOG_MQSV_ND(MQND_MDS_SND_RSP_DIRECT_FAILED, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, rc, __FILE__, __LINE__); } return rc; }
/**************************************************************************** Name : mqa_mds_msg_sync_reply_direct Description : This routine sends the MQA message to MQND. Arguments : uns32 mqa_mds_hdl Handle of MQA MDS_DEST *destination - destintion to send to MQSV_EVT *i_evt - MQSV_EVT pointer timeout - timeout value in 10 ms MDS_SYNC_SND_CTXT *context - context of MDS Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ uns32 mqa_mds_msg_sync_reply_direct(uns32 mqa_mds_hdl, MDS_DEST *destination, MQSV_DSEND_EVT *i_evt, uns32 timeout, MDS_SYNC_SND_CTXT *context, uns32 length) { NCSMDS_INFO mds_info; uns32 rc; MQA_CB *mqa_cb; 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, NCSCC_RC_FAILURE, __FILE__, __LINE__); mds_free_direct_buff((MDS_DIRECT_BUFF)i_evt); return NCSCC_RC_FAILURE; } /* Before entering any mds send function, the caller locks the control block with LOCK_WRITE. Unlock the control block before MDS send and lock it after we receive the reply * from MDS. */ 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_MQA; mds_info.info.svc_direct_send.i_msg_fmt_ver = i_evt->msg_fmt_version; mds_info.info.svc_direct_send.i_sendtype = MDS_SENDTYPE_SNDRACK; /* fill the sendinfo strcuture */ mds_info.info.svc_direct_send.info.sndrack.i_msg_ctxt = *context; mds_info.info.svc_direct_send.info.sndrack.i_sender_dest = *destination; mds_info.info.svc_direct_send.info.sndrack.i_time_to_wait = timeout; /* timeto wait in 10ms */ /* send the message. If MDS returns successfully, we assume that * the reply message has been successfully delivered to the sender. */ rc = ncsmds_api(&mds_info); if (rc != NCSCC_RC_SUCCESS) m_LOG_MQSV_A(MQA_MDS_SEND_FAILURE, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, rc, __FILE__, __LINE__); m_NCS_LOCK(&mqa_cb->cb_lock, NCS_LOCK_WRITE); m_MQSV_MQA_GIVEUP_MQA_CB; return rc; }
/**************************************************************************** Name : mqa_mds_msg_sync_send 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(uns32 mqa_mds_hdl, MDS_DEST *destination, MQSV_EVT *i_evt, MQSV_EVT **o_evt, uns32 timeout) { NCSMDS_INFO mds_info; uns32 rc; MQA_CB *mqa_cb; 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__); 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 */ /* get the client_info */ if (m_NCS_UNLOCK(&mqa_cb->cb_lock, NCS_LOCK_WRITE) != NCSCC_RC_SUCCESS) { m_MQSV_MQA_GIVEUP_MQA_CB; 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_SEND; /* fill the send structure */ mds_info.info.svc_send.i_msg = (NCSCONTEXT)i_evt; mds_info.info.svc_send.i_priority = MDS_SEND_PRIORITY_MEDIUM; mds_info.info.svc_send.i_to_svc = NCSMDS_SVC_ID_MQND; mds_info.info.svc_send.i_sendtype = MDS_SENDTYPE_SNDRSP; /* fill the send rsp strcuture */ mds_info.info.svc_send.info.sndrsp.i_time_to_wait = timeout; /* timeto wait in 10ms */ mds_info.info.svc_send.info.sndrsp.i_to_dest = *destination; /* send the message */ rc = ncsmds_api(&mds_info); m_NCS_LOCK(&mqa_cb->cb_lock, NCS_LOCK_WRITE); if (rc == NCSCC_RC_SUCCESS) *o_evt = mds_info.info.svc_send.info.sndrsp.o_rsp; 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; }
uns32 mqa_mds_msg_async_send_direct(uns32 mqa_mds_hdl, MDS_DEST *destination, MQSV_DSEND_EVT *i_evt, uns32 to_svc, MDS_SEND_PRIORITY_TYPE priority, uns32 length) { NCSMDS_INFO mds_info; uns32 rc; MQA_CB *mqa_cb; 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, NCSCC_RC_FAILURE, __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 = priority; mds_info.info.svc_direct_send.i_to_svc = to_svc; mds_info.info.svc_direct_send.i_msg_fmt_ver = i_evt->msg_fmt_version; mds_info.info.svc_direct_send.i_sendtype = MDS_SENDTYPE_SND; /* fill the sendinfo strcuture */ mds_info.info.svc_direct_send.info.snd.i_to_dest = *destination; /* send the message */ rc = ncsmds_api(&mds_info); if (rc != NCSCC_RC_SUCCESS) m_LOG_MQSV_A(MQA_MDS_SEND_FAILURE, NCSFL_LC_MQSV_INIT, NCSFL_SEV_ERROR, rc, __FILE__, __LINE__); m_NCS_LOCK(&mqa_cb->cb_lock, NCS_LOCK_WRITE); m_MQSV_MQA_GIVEUP_MQA_CB; return rc; }
/**************************************************************************** Name : avnd_mds_send Description : This routine sends the mds message to AvA or AvD or AvND. Arguments : cb - ptr to the AvND control block msg - ptr to the message dest - ptr to the MDS destination mds_ctxt - ptr to the MDS message context Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ uns32 avnd_mds_send(AVND_CB *cb, AVND_MSG *msg, MDS_DEST *dest, MDS_SYNC_SND_CTXT *mds_ctxt) { NCSMDS_INFO mds_info; MDS_SEND_INFO *send_info = &mds_info.info.svc_send; uns32 rc = NCSCC_RC_SUCCESS; TRACE_ENTER2("Msg type '%u'", msg->type); /* populate the mds params */ memset(&mds_info, 0, sizeof(NCSMDS_INFO)); mds_info.i_mds_hdl = cb->mds_hdl; mds_info.i_svc_id = NCSMDS_SVC_ID_AVND; mds_info.i_op = MDS_SEND; send_info->i_msg = (NCSCONTEXT)msg; send_info->i_priority = MDS_SEND_PRIORITY_MEDIUM; switch (msg->type) { case AVND_MSG_AVD: send_info->i_to_svc = NCSMDS_SVC_ID_AVD; break; case AVND_MSG_AVA: send_info->i_to_svc = NCSMDS_SVC_ID_AVA; break; default: assert(0); break; } if (!mds_ctxt) { /* regular send */ MDS_SENDTYPE_SND_INFO *send = &send_info->info.snd; send_info->i_sendtype = MDS_SENDTYPE_SND; send->i_to_dest = *dest; } else { /* response message (somebody is waiting for it) */ MDS_SENDTYPE_RSP_INFO *resp = &send_info->info.rsp; send_info->i_sendtype = MDS_SENDTYPE_RSP; resp->i_sender_dest = *dest; resp->i_msg_ctxt = *mds_ctxt; } /* send the message */ rc = ncsmds_api(&mds_info); if (NCSCC_RC_SUCCESS != rc) LOG_ER("ncsmds_api for %u FAILED, dest=%llx", send_info->i_sendtype, *dest); TRACE_LEAVE2("%u", rc); return rc; }
/**************************************************************************** * Name : fm_mds_finalize * * Description : Finalizes with MDS. * * Arguments : pointer to FMS control block. * * Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE * * Notes : None. *****************************************************************************/ uint32_t fm_mds_finalize(FM_CB *cb) { NCSMDS_INFO arg; uint32_t return_val; memset(&arg, 0, sizeof(NCSMDS_INFO)); arg.i_mds_hdl = (MDS_HDL)cb->adest_pwe1_hdl; arg.i_svc_id = NCSMDS_SVC_ID_GFM; arg.i_op = MDS_UNINSTALL; return_val = ncsmds_api(&arg); return return_val; }
/*************************************************************************** @brief : Unregister with MDS. @return : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE *****************************************************************************/ uint32_t smfa_mds_unregister() { NCSMDS_INFO svc_info; SMFA_CB *cb = &_smfa_cb; memset(&svc_info, 0, sizeof(NCSMDS_INFO)); svc_info.i_mds_hdl = cb->smfa_mds_hdl; svc_info.i_svc_id = NCSMDS_SVC_ID_SMFA; svc_info.i_op = MDS_UNINSTALL; if (NCSCC_RC_SUCCESS != ncsmds_api(&svc_info)){ LOG_ER("SMFA: MDS Unregistration FAILED."); return NCSCC_RC_FAILURE; } return NCSCC_RC_SUCCESS; }