/***********************************************************************//** * @brief This routine destroys the PLMA Control block. * * @param[in] destroy_info - A pointer to the NCS_LIB_DESTROY structure. * * @return NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE. ***************************************************************************/ uns32 plma_destroy(NCS_LIB_DESTROY *destroy_info) { PLMA_CB *plma_cb = plma_ctrlblk; TRACE_ENTER(); /* MDS unregister. */ plma_mds_unregister(); /** flush the EDU handle */ m_NCS_EDU_HDL_FLUSH(&plma_cb->edu_hdl); /** destroy the client tree */ plma_client_tree_destroy(); /** destroy the lock */ m_NCS_LOCK_DESTROY(&plma_cb->cb_lock); /** make reference to plma_cb obsolete */ plma_ctrlblk = NULL; TRACE_LEAVE(); return NCSCC_RC_SUCCESS; }
/***********************************************************************//** * @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; }
/***********************************************************************//** * @brief This routine creates and initializes the PLMA Control block. * * @param[in] create_info - A pointer to the structure that has creation * parameters, if any, are provided to libraries * in a command-line arguments style. * * @return NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE. ***************************************************************************/ uns32 plma_create(NCS_LIB_CREATE *create_info) { PLMA_CB *plma_cb; uns32 rc = NCSCC_RC_SUCCESS; if(!plma_ctrlblk){ plma_ctrlblk = &_plma_cb; } plma_cb = plma_ctrlblk; TRACE_ENTER(); /** validate create info */ if (create_info == NULL){ LOG_ER("PLMA : INVALID create_info RECEIVED"); rc = NCSCC_RC_FAILURE; goto end; } memset(plma_cb, 0, sizeof(PLMA_CB)); /** Initialize the PLMA_CB lock */ if (m_NCS_LOCK_INIT(&plma_cb->cb_lock) != NCSCC_RC_SUCCESS) { LOG_ER("PLMA: cb_lock INIT FAILED"); rc = NCSCC_RC_FAILURE; goto lock_fail; } /** initialize the client tree */ if (plma_client_tree_init() != NCSCC_RC_SUCCESS) { LOG_ER("PLMA: CLIENT TREE INIT FAILED"); rc = NCSCC_RC_FAILURE; goto cl_tree_init_fail; } /** initialize the group tree */ if (plma_group_tree_init() != NCSCC_RC_SUCCESS) { LOG_ER("PLMA: GROUP INFO TREE INIT FAILED"); rc = NCSCC_RC_FAILURE; goto gr_tree_init_fail; } /** register with MDS */ if (plma_mds_register() != NCSCC_RC_SUCCESS) { LOG_ER("PLMA: MDS REGISTER FAILED"); rc = NCSCC_RC_FAILURE; goto mds_reg_fail; } /** EDU initialisation */ if (m_NCS_EDU_HDL_INIT(&plma_cb->edu_hdl) != NCSCC_RC_SUCCESS) { LOG_ER("PLMA: EDU HDL INIT FAILED"); rc = NCSCC_RC_FAILURE; goto edu_init_fail; } plma_sync_with_plms(); TRACE_LEAVE(); return NCSCC_RC_SUCCESS; edu_init_fail: plma_mds_unregister(); mds_reg_fail: plma_group_tree_destroy(); gr_tree_init_fail: plma_client_tree_destroy(); cl_tree_init_fail: /** destroy the lock */ m_NCS_LOCK_DESTROY(&plma_cb->cb_lock); lock_fail: /** make reference to plma_cb obsolete */ plma_ctrlblk = NULL; end: TRACE_LEAVE(); return rc; }