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; }
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; }
/**************************************************************************** Name : cpa_destroy Description : This routine destroys the CPA control block. Arguments : destroy_info - ptr to the destroy info Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None ******************************************************************************/ static uint32_t cpa_destroy(NCS_LIB_DESTROY *destroy_info) { CPA_CB *cb = NULL; /* validate the CB */ m_CPA_RETRIEVE_CB(cb); if (!cb) return NCSCC_RC_FAILURE; /* MDS unregister. */ cpa_mds_unregister(cb); m_NCS_EDU_HDL_FLUSH(&cb->edu_hdl); /* Destroy the CPA database */ cpa_db_destroy(cb); /* destroy the lock */ m_NCS_LOCK_DESTROY(&cb->cb_lock); /* return CPA CB Handle */ ncshm_give_hdl(cb->agent_handle_id); /* remove the association with hdl-mngr */ ncshm_destroy_hdl(NCS_SERVICE_ID_CPA, cb->agent_handle_id); TRACE_2("cpa lib destroy success "); /* Memory leaks found in cpa_init.c */ m_MMGR_FREE_CPA_CB(cb); /* reset the global cb handle */ gl_cpa_hdl = 0; return NCSCC_RC_SUCCESS; }
/**************************************************************************** Name : cpa_create Description : This routine creates & initializes the CPA control block. Arguments : create_info - ptr to the create info Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None ******************************************************************************/ static uint32_t cpa_create(NCS_LIB_CREATE *create_info) { CPA_CB *cb = NULL; uint32_t rc; /* validate create info */ if (create_info == NULL) return NCSCC_RC_FAILURE; /* Malloc the CB for CPA */ cb = m_MMGR_ALLOC_CPA_CB; if (cb == NULL) { TRACE_4("cpa mem alloc failed for CPA_CB"); goto cb_alloc_fail; } memset(cb, 0, sizeof(CPA_CB)); /* assign the CPA pool-id (used by hdl-mngr) */ cb->pool_id = NCS_HM_POOL_ID_COMMON; /* create the association with hdl-mngr */ if (!(cb->agent_handle_id = ncshm_create_hdl(cb->pool_id, NCS_SERVICE_ID_CPA, (NCSCONTEXT)cb))) { TRACE_4("cpa create failed int ncsshm_create_hdl"); goto hm_create_fail; } /*store the hdl in the global variable */ gl_cpa_hdl = cb->agent_handle_id; /* get the process id */ cb->process_id = getpid(); /* initialize the cpa cb lock */ if (m_NCS_LOCK_INIT(&cb->cb_lock) != NCSCC_RC_SUCCESS) { TRACE_4("cpa create failed in LOCK_INIT "); goto lock_init_fail; } /* Initalize the CPA Trees & Linked lists */ rc = cpa_db_init(cb); if (rc != NCSCC_RC_SUCCESS) { /* No need to log here, already logged in cpa_db_init */ goto db_init_fail; } /* register with MDS */ if (cpa_mds_register(cb) != NCSCC_RC_SUCCESS) { /* No need to log here, already logged in cpa_mds_register */ goto mds_reg_fail; } cpa_sync_with_cpnd(cb); /* EDU initialisation */ if (m_NCS_EDU_HDL_INIT(&cb->edu_hdl) != NCSCC_RC_SUCCESS) { TRACE_4("cpa create failed in EDU_INIT:"); goto edu_init_fail; } TRACE_1("cpa create sucess,Lib init success"); return NCSCC_RC_SUCCESS; /* error8: m_NCS_EDU_HDL_FLUSH(&cb->edu_hdl); */ edu_init_fail: /* MDS unregister. */ cpa_mds_unregister(cb); mds_reg_fail: cb->is_cpnd_joined_clm = false; cpa_db_destroy(cb); db_init_fail: /* destroy the lock */ cb->is_cpnd_joined_clm = false; m_NCS_LOCK_DESTROY(&cb->cb_lock); lock_init_fail: /* remove the association with hdl-mngr */ ncshm_destroy_hdl(NCS_SERVICE_ID_CPA, cb->agent_handle_id); gl_cpa_hdl = 0; hm_create_fail: /* Free the CB */ m_MMGR_FREE_CPA_CB(cb); cb_alloc_fail: return NCSCC_RC_FAILURE; }