opensaf.spec.in | 1 + osaf/libs/agents/saf/cpa/cpa_api.c | 538 ++++++++++++++++++++++++++++++- osaf/libs/agents/saf/cpa/cpa_proc.c | 6 +- osaf/libs/common/cpsv/cpsv_edu.c | 22 +- osaf/libs/common/cpsv/include/cpa_cb.h | 3 +- osaf/libs/common/cpsv/include/cpa_def.h | 2 +- osaf/libs/common/cpsv/include/cpa_proc.h | 2 +- osaf/libs/common/cpsv/include/cpsv.h | 7 + osaf/libs/common/cpsv/include/cpsv_evt.h | 8 +- osaf/libs/saf/include/Makefile.am | 1 + osaf/libs/saf/include/saCkpt_B_02_03.h | 66 +++ osaf/services/saf/cpsv/cpnd/cpnd_evt.c | 39 ++- 12 files changed, 677 insertions(+), 18 deletions(-)
diff --git a/opensaf.spec.in b/opensaf.spec.in --- a/opensaf.spec.in +++ b/opensaf.spec.in @@ -1398,6 +1398,7 @@ fi %{_includedir}/saAis.h %{_includedir}/saAmf.h %{_includedir}/saCkpt.h +%{_includedir}/saCkpt_B_02_03.h %{_includedir}/saClm.h %{_includedir}/saEvt.h %{_includedir}/saImm.h diff --git a/osaf/libs/agents/saf/cpa/cpa_api.c b/osaf/libs/agents/saf/cpa/cpa_api.c --- a/osaf/libs/agents/saf/cpa/cpa_api.c +++ b/osaf/libs/agents/saf/cpa/cpa_api.c @@ -119,8 +119,9 @@ SaAisErrorT saCkptInitialize(SaCkptHandl /* Store the callback functions, if set */ if (ckptCallbacks) { - cl_node->ckpt_callbk = *ckptCallbacks; - + cl_node->ckpt_callbk.saCkptCheckpointOpenCallback = ckptCallbacks->saCkptCheckpointOpenCallback; + cl_node->ckpt_callbk.saCkptCheckpointSynchronizeCallback = ckptCallbacks->saCkptCheckpointSynchronizeCallback; + cl_node->ckpt_callbk.saCkptCheckpointTrackCallback = NULL; } proc_rc = cpa_callback_ipc_init(cl_node); @@ -278,11 +279,266 @@ SaAisErrorT saCkptInitialize(SaCkptHandl } /**************************************************************************** - Name : saCkptSelectionObjectGet - - Description : This function returns the operating system handle - associated with the ckptHandle. - +Name : SaCkptInitialize_2 + +Description : This function initializes the Checkpoint Service for the +invoking process and registers the various callback functions. +The handle 'ckptHandle' is returned as the reference to this +association between the process and the Checkpoint Service. + + +Arguments : ckptHandle - A pointer to the handle designating this +particular initialization of the Checkpoint +service that it to be returned by the Checkpoint +Service. +callbacks - Pointer to a SaCkptCallbacksT_2 structure, +containing the callback functions of the process +that the Checkpoint Service may invoke. +version - Is a pointer to the version of the Checkpoint +Service that the invoking process is using. + +Return Values : Refer to SAI-AIS specification for various return values. + +Notes : + ******************************************************************************/ +SaAisErrorT saCkptInitialize_2(SaCkptHandleT *ckptHandle, const SaCkptCallbacksT_2 *ckptCallbacks, SaVersionT *version) +{ + CPA_CB *cb = NULL; + SaAisErrorT rc = SA_AIS_OK; + CPSV_EVT init_evt; + CPSV_EVT *out_evt = NULL; + uint32_t proc_rc = NCSCC_RC_SUCCESS; + CPA_CLIENT_NODE *cl_node = NULL; + bool locked = true; + SaVersionT client_version; + + TRACE_ENTER(); + proc_rc = ncs_agents_startup(); + if (NCSCC_RC_SUCCESS != proc_rc) { + TRACE_4("cpa CkptInit:agents_startup Api failed with return value:%d", proc_rc); + return SA_AIS_ERR_LIBRARY; + } + + proc_rc = ncs_cpa_startup(); + if (NCSCC_RC_SUCCESS != proc_rc) { + TRACE_4("cpa CkptInit:agents_startup Api failed with return value:%d" , proc_rc); + ncs_agents_shutdown(); + return SA_AIS_ERR_LIBRARY; + } + + if ((!ckptHandle) || (!version)) { + rc = SA_AIS_ERR_INVALID_PARAM; + TRACE_4("cpa CkptInit Api failed with return value :%d", rc); + goto end; + } + + *ckptHandle = 0; + + memcpy(&client_version, version, sizeof(SaVersionT)); + + if (m_CPA_VER_IS_BELOW_B_2_3(version)) { + rc = SA_AIS_ERR_VERSION; + TRACE_2("ERR_VERSION: saCkptInitialize_2 SHOULD BE A VERSION B.02.03 and above initialize but claims to be" + "%c %u %u", version->releaseCode, version->majorVersion, version->minorVersion); + goto end; + } + + /* Draft Validations : Version */ + rc = cpa_version_validate(version); + if (rc != SA_AIS_OK) { + TRACE_4("cpa CkptInit Api failed with return value:%d", rc); + goto end; + } + + /* retrieve CPA CB */ + m_CPA_RETRIEVE_CB(cb); + if (cb == NULL) { + TRACE_4("cpa CkptInit:HDL_TAKE"); + return SA_AIS_ERR_LIBRARY; + } + + /* Take the CB Lock */ + if (m_NCS_LOCK(&cb->cb_lock, NCS_LOCK_WRITE) != NCSCC_RC_SUCCESS) { + TRACE_4("cpa CkptInit:LOCK"); + rc = SA_AIS_ERR_LIBRARY; + goto lock_fail; + } + + /* Alloc the client info data structure & put it in the Pat tree */ + cl_node = (CPA_CLIENT_NODE *)m_MMGR_ALLOC_CPA_CLIENT_NODE; + if (cl_node == NULL) { + TRACE_4("cpa mem alloc CkptInit:CPA_CLIENT_NODE"); + rc = SA_AIS_ERR_NO_MEMORY; + goto cnode_alloc_fail; + } + memset(cl_node, 0, sizeof(CPA_CLIENT_NODE)); + + /* Store the callback functions, if set */ + if (ckptCallbacks) { + cl_node->ckpt_callbk = *ckptCallbacks; + } + + proc_rc = cpa_callback_ipc_init(cl_node); + if (proc_rc != NCSCC_RC_SUCCESS) { + /* Error handling */ + rc = SA_AIS_ERR_LIBRARY; + /* ALready looged by cpa_callback_ipc_init */ + goto ipc_init_fail; + } + + /* populate the EVT structure */ + memset(&init_evt, 0, sizeof(CPSV_EVT)); + init_evt.type = CPSV_EVT_TYPE_CPND; + init_evt.info.cpnd.type = CPND_EVT_A2ND_CKPT_INIT; + init_evt.info.cpnd.info.initReq.version = client_version; + + /* Release the CB lock Before MDS Send */ + if (locked) + m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE); + locked = false; + + /* CPND GOES DOWN */ + if (false == cb->is_cpnd_up) { + rc = SA_AIS_ERR_TRY_AGAIN; + TRACE_4("cpa: api failed in CkptInit:CPND_DOWN"); + goto mds_fail; + } + + /* send the request to the CPND */ + proc_rc = cpa_mds_msg_sync_send(cb->cpa_mds_hdl, &cb->cpnd_mds_dest, &init_evt, &out_evt, CPSV_WAIT_TIME); + + /* Error Handling */ + switch (proc_rc) { + case NCSCC_RC_SUCCESS: + break; + case NCSCC_RC_REQ_TIMOUT: + TRACE_4("cpa CkptInit:MDS Api failed with return value:%d,cpnd_mds_dest:%"PRIu64, proc_rc, cb->cpa_mds_dest); + rc = SA_AIS_ERR_TIMEOUT; + goto mds_fail; + default: + TRACE_4("cpa CkptInit:MDS Api failed with return value:%d,cpnd_mds_dest:%"PRIu64, proc_rc, cb->cpa_mds_dest); + rc = SA_AIS_ERR_TRY_AGAIN; + goto mds_fail; + } + + if (out_evt) { + rc = out_evt->info.cpa.info.initRsp.error; + if (rc != SA_AIS_OK) { + TRACE_4("cpa CkptInit:CPND_ERR Api failed with return value:%d",rc); + goto rsp_not_ok; + } + + if (m_CPA_VER_IS_ABOVE_B_1_1(version)) { + if (rc == SA_AIS_ERR_UNAVAILABLE) { + cb->is_cpnd_joined_clm = false; + if (locked) + m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE); + locked = false; + goto clm_left; + } else { + cb->is_cpnd_joined_clm = true; + } + } + /* Take the CB lock after MDS Send */ + if (m_NCS_LOCK(&cb->cb_lock, NCS_LOCK_WRITE) != NCSCC_RC_SUCCESS) { + TRACE_4("cpa CkptInit:LOCK"); + rc = SA_AIS_ERR_LIBRARY; + goto lock_fail1; + } else + locked = true; + + cl_node->cl_hdl = out_evt->info.cpa.info.initRsp.ckptHandle; + cl_node->stale = false; + proc_rc = cpa_client_node_add(&cb->client_tree, cl_node); + if (proc_rc != NCSCC_RC_SUCCESS) { + rc = SA_AIS_ERR_LIBRARY; + TRACE_4("cpa api processing failed in CkptInit:client_node_add Api failed with return value:%d,cl_hdl:%llx ", rc, cl_node->cl_hdl); + goto node_add_fail; + } + } else { + TRACE_4("cpa api processing failed in CkptInit Api failed with return value:%d", rc); + rc = SA_AIS_ERR_NO_RESOURCES; + } + + if (rc != SA_AIS_OK) { + TRACE_4("cpa CkptInit:CPND_ERR Api failed with return value:%d",rc); + goto cpnd_rsp_fail; + } + + /*Error handling */ +cpnd_rsp_fail: +node_add_fail: +lock_fail1: + if (rc != SA_AIS_OK) { + CPSV_EVT finalize_evt, *out_evt1; + + out_evt1 = NULL; + /* populate the structure */ + memset(&finalize_evt, 0, sizeof(CPSV_EVT)); + finalize_evt.type = CPSV_EVT_TYPE_CPND; + finalize_evt.info.cpnd.type = CPND_EVT_A2ND_CKPT_FINALIZE; + finalize_evt.info.cpnd.info.finReq.client_hdl = cl_node->cl_hdl; + + if (locked) + m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE); + locked = false; + + /* send the request to the CPND */ + proc_rc = cpa_mds_msg_sync_send(cb->cpa_mds_hdl, &(cb->cpnd_mds_dest), + &finalize_evt, &out_evt1, CPSV_WAIT_TIME); + if (out_evt1) + m_MMGR_FREE_CPSV_EVT(out_evt1, NCS_SERVICE_ID_CPA); + } + +rsp_not_ok: +mds_fail: + + /* Free the IPC initialized for this client */ + if (rc != SA_AIS_OK) + cpa_callback_ipc_destroy(cl_node); + +ipc_init_fail: + /* Free the Client NODE */ + if (rc != SA_AIS_OK) + m_MMGR_FREE_CPA_CLIENT_NODE(cl_node); + +cnode_alloc_fail: + /* Release the CB lock */ + if (locked) + m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE); + +lock_fail: +clm_left: + /* Release the CB handle */ + m_CPA_GIVEUP_CB; + + /* Free the Out Event */ + if (out_evt) + m_MMGR_FREE_CPSV_EVT(out_evt, NCS_SERVICE_ID_CPA); + + if (rc == SA_AIS_OK) { + memcpy(&(cl_node->version), &client_version, sizeof(SaVersionT)); + /* Went well, return ckptHandle to the application */ + *ckptHandle = cl_node->cl_hdl; + TRACE_1("cpa ckptInit Api success with return value:%d and cl_hdl:%llx", SA_AIS_OK, cl_node->cl_hdl); + } +end: + if (rc != SA_AIS_OK) { + ncs_cpa_shutdown(); + ncs_agents_shutdown(); + } + + TRACE_LEAVE2("API Return code = %u", rc); + return rc; +} + + +/**************************************************************************** +Name : saCkptSelectionObjectGet + +Description : This function returns the operating system handle +associated with the ckptHandle. + Arguments : ckptHandle - Checkpoint service handle. selectionObject - Pointer to the operating system handle. @@ -4166,7 +4422,7 @@ ncsCkptRegisterCkptArrivalCallback(SaCkp } if (ckptArrivalCallback) { - cl_node->ckptArrivalCallback = ckptArrivalCallback; + cl_node->ckpt_callbk.saCkptCheckpointTrackCallback = ckptArrivalCallback; if (cl_node->callbk_mbx == 0) proc_rc = cpa_callback_ipc_init(cl_node); else @@ -4226,3 +4482,269 @@ ncsCkptRegisterCkptArrivalCallback(SaCkp TRACE_LEAVE2("API return code = %u", rc); return rc; } + +/**************************************************************************** +Name : saCkptTrack + +Description : This function enable the Ckpt Track call back + +Arguments : ckptHandle - Checkpoint handle. + +Return Values : Refer to SAI-AIS specification for various return values. + +Notes : + ******************************************************************************/ +SaAisErrorT saCkptTrack(SaCkptHandleT ckptHandle) +{ + SaAisErrorT rc = SA_AIS_OK; + CPSV_EVT evt; + uint32_t proc_rc = NCSCC_RC_SUCCESS; + CPA_CLIENT_NODE *cl_node = NULL; + CPA_CB *cb = NULL; + bool is_locked = false; + + /* retrieve CPA CB */ + m_CPA_RETRIEVE_CB(cb); + if (!cb) { + rc = SA_AIS_ERR_BAD_HANDLE; + TRACE_4("cpa CkptArrivalCallback Api failed with return value:%d,ckptHandle:%llx",rc, ckptHandle); + goto done; + } + + /* get the CB Lock */ + if (m_NCS_LOCK(&cb->cb_lock, NCS_LOCK_WRITE) != NCSCC_RC_SUCCESS) { + rc = SA_AIS_ERR_LIBRARY; + TRACE_4("cpa CkptArrivalCallback:LOCK Api failed with return value:%d,ckptHandle:%llx", rc, ckptHandle); + goto lock_fail; + } + + is_locked = true; + + /* Get the Client info */ + rc = cpa_client_node_get(&cb->client_tree, &ckptHandle, &cl_node); + + if (!cl_node) { + rc = SA_AIS_ERR_BAD_HANDLE; + TRACE_4("cpa CkptArrivalCallback:client_node_get Api failed with return value:%d,ckptHandle:%llx", rc, ckptHandle); + goto proc_fail; + } + + if (m_CPA_VER_IS_BELOW_B_2_3(&cl_node->version)) { + rc = SA_AIS_ERR_VERSION; + TRACE_2("ERR_VERSION: saCkptTrack SHOULD BE A VERSION B.02.03 and above API but claims to be" + "%c %u %u", cl_node->version.releaseCode, cl_node->version.majorVersion, cl_node->version.minorVersion); + goto proc_fail; + } + + if (cl_node->ckpt_callbk.saCkptCheckpointTrackCallback) { + if (cl_node->callbk_mbx == 0) + proc_rc = cpa_callback_ipc_init(cl_node); + else + proc_rc = NCSCC_RC_SUCCESS; + } else { + rc = SA_AIS_ERR_INVALID_PARAM; + TRACE_4("cpa CkptArrivalCallback Api failed with return value:%d,ckptHandle:%llx", rc, ckptHandle); + goto proc_fail; + + } + + if (proc_rc != NCSCC_RC_SUCCESS) { + /* Error handling */ + rc = SA_AIS_ERR_LIBRARY; + TRACE_4("cpa CkptArrivalCallback Api failed with return value:%d,ckptHandle:%llx", rc, ckptHandle); + goto proc_fail; + } + /* Send it to CPND */ + memset(&evt, 0, sizeof(CPSV_EVT)); + evt.type = CPSV_EVT_TYPE_CPND; + evt.info.cpnd.type = CPND_EVT_A2ND_ARRIVAL_CB_REG; + evt.info.cpnd.info.arr_ntfy.client_hdl = ckptHandle; + + m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE); + is_locked = false; + /* IF CPND IS DOWN */ + if (false == cb->is_cpnd_up) { + rc = SA_AIS_ERR_TRY_AGAIN; + TRACE_4("cpa CkptArrivalCallback Api failed with return value:%d,ckptHandle:%llx", rc, ckptHandle); + goto lock_fail; + } + proc_rc = cpa_mds_msg_send(cb->cpa_mds_hdl, &cb->cpnd_mds_dest, &evt, NCSMDS_SVC_ID_CPND); + /* Generate rc from proc_rc */ + switch (proc_rc) { + case NCSCC_RC_SUCCESS: + break; + case NCSCC_RC_REQ_TIMOUT: + rc = SA_AIS_ERR_TIMEOUT; + TRACE_4("cpa CkptArrivalCallback:MDS Api failed with return value:%d,ckptHandle:%llx,cpnd_mds_dest:%"PRIu64, proc_rc, ckptHandle, cb->cpnd_mds_dest); + goto proc_fail; + default: + rc = SA_AIS_ERR_NO_RESOURCES; + TRACE_4("cpa CkptArrivalCallback:MDS Api failed with return value:%d,ckptHandle:%llx,cpnd_mds_dest:%"PRIu64, proc_rc, ckptHandle, cb->cpnd_mds_dest); + goto proc_fail; + } + +proc_fail: + if (is_locked) + m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE); +lock_fail: + m_CPA_GIVEUP_CB; + +done: + TRACE_LEAVE2("API return code = %u", rc); + return rc; +} + +/**************************************************************************** +Name : saCkptTrackStop + +Description : This function disable the Ckpt Track call back + +Arguments : ckptHandle - Checkpoint handle. + +Return Values : Refer to SAI-AIS specification for various return values. + +Notes : + ******************************************************************************/ +SaAisErrorT saCkptTrackStop(SaCkptHandleT ckptHandle) +{ + SaAisErrorT rc = SA_AIS_OK; + CPSV_EVT evt; + uint32_t proc_rc = NCSCC_RC_SUCCESS; + CPA_CLIENT_NODE *cl_node = NULL; + CPA_CB *cb = NULL; + bool is_locked = false; + + /* retrieve CPA CB */ + m_CPA_RETRIEVE_CB(cb); + if (!cb) { + rc = SA_AIS_ERR_BAD_HANDLE; + TRACE_4("cpa CkptArrivalCallback Api failed with return value:%d,ckptHandle:%llx",rc, ckptHandle); + goto done; + } + + /* get the CB Lock */ + if (m_NCS_LOCK(&cb->cb_lock, NCS_LOCK_WRITE) != NCSCC_RC_SUCCESS) { + rc = SA_AIS_ERR_LIBRARY; + TRACE_4("cpa CkptArrivalCallback:LOCK Api failed with return value:%d,ckptHandle:%llx", rc, ckptHandle); + goto lock_fail; + } + + is_locked = true; + + /* Get the Client info */ + rc = cpa_client_node_get(&cb->client_tree, &ckptHandle, &cl_node); + + if (!cl_node) { + rc = SA_AIS_ERR_BAD_HANDLE; + TRACE_4("cpa CkptArrivalCallback:client_node_get Api failed with return value:%d,ckptHandle:%llx", rc, ckptHandle); + goto proc_fail; + } + + if (m_CPA_VER_IS_BELOW_B_2_3(&cl_node->version)) { + rc = SA_AIS_ERR_VERSION; + TRACE_2("ERR_VERSION: saCkptTrackStop SHOULD BE A VERSION B.02.03 and above API but claims to be" + "%c %u %u", cl_node->version.releaseCode, cl_node->version.majorVersion, cl_node->version.minorVersion); + goto proc_fail; + } + + if (cl_node->ckpt_callbk.saCkptCheckpointTrackCallback) { + if (cl_node->callbk_mbx == 0) + proc_rc = cpa_callback_ipc_init(cl_node); + else + proc_rc = NCSCC_RC_SUCCESS; + } else { + rc = SA_AIS_ERR_INVALID_PARAM; + TRACE_4("cpa CkptArrivalCallback Api failed with return value:%d,ckptHandle:%llx", rc, ckptHandle); + goto proc_fail; + + } + + if (proc_rc != NCSCC_RC_SUCCESS) { + /* Error handling */ + rc = SA_AIS_ERR_LIBRARY; + TRACE_4("cpa CkptArrivalCallback Api failed with return value:%d,ckptHandle:%llx", rc, ckptHandle); + goto proc_fail; + } + + /* Send it to CPND */ + memset(&evt, 0, sizeof(CPSV_EVT)); + evt.type = CPSV_EVT_TYPE_CPND; + evt.info.cpnd.type = CPND_EVT_A2ND_ARRIVAL_CB_UNREG; + evt.info.cpnd.info.arr_ntfy.client_hdl = ckptHandle; + + m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE); + is_locked = false; + + /* IF CPND IS DOWN */ + if (false == cb->is_cpnd_up) { + rc = SA_AIS_ERR_TRY_AGAIN; + TRACE_4("cpa CkptArrivalCallback Api failed with return value:%d,ckptHandle:%llx", rc, ckptHandle); + goto lock_fail; + } + proc_rc = cpa_mds_msg_send(cb->cpa_mds_hdl, &cb->cpnd_mds_dest, &evt, NCSMDS_SVC_ID_CPND); + + /* Generate rc from proc_rc */ + switch (proc_rc) { + case NCSCC_RC_SUCCESS: + break; + case NCSCC_RC_REQ_TIMOUT: + rc = SA_AIS_ERR_TIMEOUT; + TRACE_4("cpa CkptArrivalCallback:MDS Api failed with return value:%d,ckptHandle:%llx,cpnd_mds_dest:%"PRIu64, proc_rc, ckptHandle, cb->cpnd_mds_dest); + goto proc_fail; + default: + rc = SA_AIS_ERR_NO_RESOURCES; + TRACE_4("cpa CkptArrivalCallback:MDS Api failed with return value:%d,ckptHandle:%llx,cpnd_mds_dest:%"PRIu64, proc_rc, ckptHandle, cb->cpnd_mds_dest); + goto proc_fail; + } + +proc_fail: + if (is_locked) + m_NCS_UNLOCK(&cb->cb_lock, NCS_LOCK_WRITE); +lock_fail: + m_CPA_GIVEUP_CB; + +done: + TRACE_LEAVE2("API return code = %u", rc); + return rc; +} + +/**************************************************************************** +Name : saCkptCheckpointTrack + +Description : This function enables the specific Checkpoint Track call back + +Arguments : checkpointHandle - The handle that designates the checkpoint +to enables Track. + +Return Values : Refer to SAI-AIS specification for various return values. + +Notes : + ******************************************************************************/ +SaAisErrorT saCkptCheckpointTrack(SaCkptCheckpointHandleT checkpointHandle) +{ + SaAisErrorT rc = SA_AIS_ERR_NOT_SUPPORTED; + TRACE_ENTER(); + TRACE_LEAVE2("API return code = %u", rc); + return rc; +} + +/**************************************************************************** +Name : saCkptCheckpointTrackStop + +Description : This function disables the specific Checkpoint Track call back + +Arguments : checkpointHandle - The handle that designates the checkpoint +to disables Track. + +Return Values : Refer to SAI-AIS specification for various return values. + +Notes : + ******************************************************************************/ +SaAisErrorT saCkptCheckpointTrackStop(SaCkptCheckpointHandleT checkpointHandle) +{ + SaAisErrorT rc = SA_AIS_ERR_NOT_SUPPORTED; + TRACE_ENTER(); + TRACE_LEAVE2("API return code = %u", rc); + return rc; +} + diff --git a/osaf/libs/agents/saf/cpa/cpa_proc.c b/osaf/libs/agents/saf/cpa/cpa_proc.c --- a/osaf/libs/agents/saf/cpa/cpa_proc.c +++ b/osaf/libs/agents/saf/cpa/cpa_proc.c @@ -1031,10 +1031,10 @@ static void cpa_process_callback_info(CP } break; case CPA_CALLBACK_TYPE_ARRIVAL_NTFY: - if (cl_node->ckptArrivalCallback) { + if (cl_node->ckpt_callbk.saCkptCheckpointTrackCallback) { uint32_t i = 0; - cl_node->ckptArrivalCallback(callback->lcl_ckpt_hdl, callback->ioVector, - callback->num_of_elmts); + cl_node->ckpt_callbk.saCkptCheckpointTrackCallback(callback->lcl_ckpt_hdl, callback->ioVector, + callback->num_of_elmts); for (i = 0; i < callback->num_of_elmts; i++) { if (callback->ioVector[i].sectionId.id != NULL && callback->ioVector[i].sectionId.idLen != 0) diff --git a/osaf/libs/common/cpsv/cpsv_edu.c b/osaf/libs/common/cpsv/cpsv_edu.c --- a/osaf/libs/common/cpsv/cpsv_edu.c +++ b/osaf/libs/common/cpsv/cpsv_edu.c @@ -87,7 +87,7 @@ FUNC_DECLARATION(CPD_EVT); FUNC_DECLARATION(CPA_EVT); FUNC_DECLARATION(CPSV_EVT); FUNC_DECLARATION(CPSV_A2ND_CKPT_LIST_UPDATE); - +FUNC_DECLARATION(CPSV_A2ND_ARRIVAL_UNREG); /* Test function declaration */ TEST_FUNC_DECLARATION(CPSV_EVT); TEST_FUNC_DECLARATION(CPA_EVT); @@ -1086,6 +1086,21 @@ FUNC_DECLARATION(DS) #undef DS +#define DS CPSV_A2ND_ARRIVAL_UNREG +FUNC_DECLARATION(DS) +{ + NCS_ENC_DEC_DECLARATION(DS); + NCS_ENC_DEC_ARRAY(DS) { + + { + EDU_START, FUNC_NAME(CPSV_A2ND_ARRIVAL_UNREG), 0, 0, 0, sizeof(DS), 0, NULL}, { + EDU_EXEC, ncs_edp_uns64, 0, 0, 0, (long)&((DS *) 0)->client_hdl, 0, NULL}, { + EDU_END, 0, 0, 0, 0, 0, 0, NULL},}; + NCS_ENC_DEC_REM_FLOW(DS) +} + +#undef DS + /* CPD --> CPND */ #define DS CPSV_CPND_DEST_INFO FUNC_DECLARATION(DS) @@ -1234,6 +1249,7 @@ FUNC_DECLARATION(DS) #undef DS + #define DS CPND_EVT TEST_FUNC_DECLARATION(DS) { @@ -1301,6 +1317,7 @@ TEST_FUNC_DECLARATION(DS) LCL_TEST_JUMP_OFFSET_CPND_EVT_D2ND_CKPT_NUM_SECTIONS, LCL_TEST_JUMP_OFFSET_CPND_EVT_A2ND_CKPT_LIST_UPDATE, + LCL_TEST_JUMP_OFFSET_CPND_EVT_A2ND_ARRIVAL_CB_UNREG, }; @@ -1416,6 +1433,8 @@ TEST_FUNC_DECLARATION(DS) return LCL_TEST_JUMP_OFFSET_CPSV_D2ND_RESTART_DONE; case CPND_EVT_A2ND_CKPT_LIST_UPDATE: return LCL_TEST_JUMP_OFFSET_CPND_EVT_A2ND_CKPT_LIST_UPDATE; + case CPND_EVT_A2ND_ARRIVAL_CB_UNREG: + return LCL_TEST_JUMP_OFFSET_CPND_EVT_A2ND_ARRIVAL_CB_UNREG; default: return EDU_FAIL; } @@ -1520,6 +1539,7 @@ FUNC_DECLARATION(DS) EDU_EXEC, FUNC_NAME(CPSV_CKPT_NUM_SECTIONS), 0, 0, EDU_EXIT, (long)&((DS *) 0)->info.ckpt_sections, 0, NULL}, { EDU_EXEC, FUNC_NAME(CPSV_A2ND_CKPT_LIST_UPDATE), 0, 0, EDU_EXIT, (long)&((DS *) 0)->info.ckptListUpdate, 0, NULL},{ + EDU_EXEC, FUNC_NAME(CPSV_A2ND_ARRIVAL_UNREG), 0, 0, EDU_EXIT, (long)&((DS *) 0)->info.arr_ntfy, 0, NULL},{ EDU_END, 0, 0, 0, 0, 0, 0, NULL},}; NCS_ENC_DEC_REM_FLOW(DS) } diff --git a/osaf/libs/common/cpsv/include/cpa_cb.h b/osaf/libs/common/cpsv/include/cpa_cb.h --- a/osaf/libs/common/cpsv/include/cpa_cb.h +++ b/osaf/libs/common/cpsv/include/cpa_cb.h @@ -28,9 +28,8 @@ typedef struct cpa_client_node { SaCkptHandleT cl_hdl; /* index for the tree */ uint8_t stale; /*Loss of connection with cpnd because of clm node left will set this to true for the connection. */ - SaCkptCallbacksT ckpt_callbk; + SaCkptCallbacksT_2 ckpt_callbk; SYSF_MBX callbk_mbx; /* Mailbox Queue for client messages */ - ncsCkptCkptArrivalCallbackT ckptArrivalCallback; /* NCS callback extention */ SaVersionT version; } CPA_CLIENT_NODE; diff --git a/osaf/libs/common/cpsv/include/cpa_def.h b/osaf/libs/common/cpsv/include/cpa_def.h --- a/osaf/libs/common/cpsv/include/cpa_def.h +++ b/osaf/libs/common/cpsv/include/cpa_def.h @@ -21,7 +21,7 @@ /* Macros for Validating Version */ #define CPA_RELEASE_CODE 'B' #define CPA_MAJOR_VERSION 0x02 -#define CPA_MINOR_VERSION 0x02 +#define CPA_MINOR_VERSION 0x03 #define CPA_BASE_MAJOR_VERSION 0x01 #define CPA_BASE_MINOR_VERSION 0x01 diff --git a/osaf/libs/common/cpsv/include/cpa_proc.h b/osaf/libs/common/cpsv/include/cpa_proc.h --- a/osaf/libs/common/cpsv/include/cpa_proc.h +++ b/osaf/libs/common/cpsv/include/cpa_proc.h @@ -23,7 +23,7 @@ typedef enum cpa_callback_type { CPA_CALLBACK_TYPE_OPEN = 1, CPA_CALLBACK_TYPE_SYNC, CPA_CALLBACK_TYPE_ARRIVAL_NTFY, - CPA_CALLBACK_TYPE_MAX = CPA_CALLBACK_TYPE_SYNC + CPA_CALLBACK_TYPE_MAX = CPA_CALLBACK_TYPE_ARRIVAL_NTFY } CPA_CALLBACK_TYPE; /* Info required for Call back */ diff --git a/osaf/libs/common/cpsv/include/cpsv.h b/osaf/libs/common/cpsv/include/cpsv.h --- a/osaf/libs/common/cpsv/include/cpsv.h +++ b/osaf/libs/common/cpsv/include/cpsv.h @@ -74,6 +74,13 @@ ((ver)->releaseCode > 'B') )&& \ ((ver)->majorVersion > 0x01 ) && \ ((ver)->minorVersion > 0x01 ) ) + +#define m_CPA_VER_IS_BELOW_B_2_3(ver) \ + (((ver)->releaseCode != 'B') || \ + ((ver)->majorVersion != 0x02 ) || \ + ((ver)->minorVersion < 0x03 ) ) + + #define m_IS_SA_CKPT_CHECKPOINT_COLLOCATED(attr) \ ((attr)->creationFlags & SA_CKPT_CHECKPOINT_COLLOCATED) diff --git a/osaf/libs/common/cpsv/include/cpsv_evt.h b/osaf/libs/common/cpsv/include/cpsv_evt.h --- a/osaf/libs/common/cpsv/include/cpsv_evt.h +++ b/osaf/libs/common/cpsv/include/cpsv_evt.h @@ -30,6 +30,7 @@ #define CPSV_EVT_H #include <saCkpt.h> +#include <saCkpt_B_02_03.h> #include "ncssysf_tmr.h" /***************************************************************************** @@ -115,7 +116,7 @@ typedef enum cpnd_evt_type { CPND_EVT_A2ND_CKPT_ITER_GETNEXT, /* Checkpoint Section Iternation Getnext Call */ - CPND_EVT_A2ND_ARRIVAL_CB_REG, /* Checkpoint Arrival Callback */ + CPND_EVT_A2ND_ARRIVAL_CB_REG, /* Checkpoint Arrival Callback Register*/ CPND_EVT_A2ND_CKPT_WRITE, /* Checkpoint Write And overwrite call */ CPND_EVT_A2ND_CKPT_READ, /* Checkpoint Read Call */ @@ -177,6 +178,7 @@ typedef enum cpnd_evt_type { CPND_EVT_D2ND_CKPT_NUM_SECTIONS, CPND_EVT_A2ND_CKPT_REFCNTSET, /* ref cont opener's set call */ CPND_EVT_A2ND_CKPT_LIST_UPDATE, /* Checkpoint ckpt list update Call */ + CPND_EVT_A2ND_ARRIVAL_CB_UNREG, /* Checkpoint Arrival Callback Un-Register*/ CPND_EVT_MAX }CPND_EVT_TYPE; @@ -394,6 +396,10 @@ typedef struct cpsv_a2nd_arrival_reg { SaCkptCheckpointHandleT client_hdl; } CPSV_A2ND_ARRIVAL_REG; +typedef struct cpsv_a2nd_arrival_unreg { + SaCkptCheckpointHandleT client_hdl; +} CPSV_A2ND_ARRIVAL_UNREG; + typedef struct cpsv_a2nd_sync_ckpt { SaCkptCheckpointHandleT ckpt_id; SaCkptCheckpointHandleT lcl_ckpt_hdl; diff --git a/osaf/libs/saf/include/Makefile.am b/osaf/libs/saf/include/Makefile.am --- a/osaf/libs/saf/include/Makefile.am +++ b/osaf/libs/saf/include/Makefile.am @@ -22,6 +22,7 @@ include_HEADERS = \ saAis.h \ saAmf.h \ saCkpt.h \ + saCkpt_B_02_03.h \ saClm.h \ saEvt.h \ saImm.h \ diff --git a/osaf/libs/saf/include/saCkpt_B_02_03.h b/osaf/libs/saf/include/saCkpt_B_02_03.h new file mode 100644 --- /dev/null +++ b/osaf/libs/saf/include/saCkpt_B_02_03.h @@ -0,0 +1,66 @@ +/* -*- OpenSAF -*- + * + * (C) Copyright 2008 The OpenSAF Foundation + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed + * under the GNU Lesser General Public License Version 2.1, February 1999. + * The complete license can be accessed from the following location: + * http://opensource.org/licenses/lgpl-license.php + * See the Copying file included with the OpenSAF distribution for full + * licensing terms. + * + * Author(s): Oracle + */ + +/* + * DESCRIPTION: + * This file provides the suggested additions to the C language binding for + * the Service Availability(TM) Forum Information Model Management Service (CKPT). + * It contains only the prototypes and type definitions that are part of this + * proposed addition. + * These additions are currently NON STANDARD. But the intention is to get these + * additions approved formally by SAF in the future. + * + */ + +#ifndef _SA_CKPT_B_02_03_H +#define _SA_CKPT_B_02_03_H + +#include "saAis.h" + +#ifdef __cplusplus +extern "C" { +#endif + typedef void + (*SaCkptCheckpointTrackCallbackT) (SaCkptCheckpointHandleT checkpointHandle, + SaCkptIOVectorElementT *ioVector, + SaUint32T numberOfElements); + + typedef struct { + SaCkptCheckpointOpenCallbackT saCkptCheckpointOpenCallback; + SaCkptCheckpointSynchronizeCallbackT saCkptCheckpointSynchronizeCallback; + SaCkptCheckpointTrackCallbackT saCkptCheckpointTrackCallback; + } SaCkptCallbacksT_2; + + extern SaAisErrorT + saCkptInitialize_2(SaCkptHandleT *ckptHandle, const SaCkptCallbacksT_2 *callbacks, SaVersionT *version); + + extern SaAisErrorT + saCkptTrack(SaCkptHandleT ckptHandle); + + extern SaAisErrorT + saCkptTrackStop(SaCkptHandleT ckptHandle); + + extern SaAisErrorT + saCkptCheckpointTrack(SaCkptCheckpointHandleT checkpointHandle); + + extern SaAisErrorT + saCkptCheckpointTrackStop(SaCkptCheckpointHandleT checkpointHandle); + +#ifdef __cplusplus +} +#endif + +#endif /* _SA_CKPT_H */ diff --git a/osaf/services/saf/cpsv/cpnd/cpnd_evt.c b/osaf/services/saf/cpsv/cpnd/cpnd_evt.c --- a/osaf/services/saf/cpsv/cpnd/cpnd_evt.c +++ b/osaf/services/saf/cpsv/cpnd/cpnd_evt.c @@ -59,6 +59,7 @@ static uint32_t cpnd_evt_proc_nd2nd_ckpt static uint32_t cpnd_evt_proc_nd2nd_ckpt_active_data_access_rsp(CPND_CB *cb, CPND_EVT *evt, CPSV_SEND_INFO *sinfo); static uint32_t cpnd_evt_proc_ckpt_sync(CPND_CB *cb, CPND_EVT *evt, CPSV_SEND_INFO *sinfo); static uint32_t cpnd_evt_proc_arrival_cbreg(CPND_CB *cb, CPND_EVT *evt, CPSV_SEND_INFO *sinfo); +static uint32_t cpnd_evt_proc_arrival_cbunreg(CPND_CB *cb, CPND_EVT *evt, CPSV_SEND_INFO *sinfo); static uint32_t cpnd_evt_proc_nd2nd_ckpt_sync_req(CPND_CB *cb, CPND_EVT *evt, CPSV_SEND_INFO *sinfo); static uint32_t cpnd_evt_proc_nd2nd_ckpt_active_sync(CPND_CB *cb, CPND_EVT *evt, CPSV_SEND_INFO *sinfo); static uint32_t cpnd_evt_proc_ckpt_read(CPND_CB *cb, CPND_EVT *evt, CPSV_SEND_INFO *sinfo); @@ -105,7 +106,7 @@ static char *cpnd_evt_str[] = { "CPND_EVT_A2ND_CKPT_READ", /* Checkpoint Read Call */ "CPND_EVT_A2ND_CKPT_SYNC", /* Checkpoint Synchronize call */ "CPND_EVT_A2ND_CKPT_READ_ACK", /* read ack */ - "CPND_EVT_A2ND_ARRIVAL_CB_REG", /* Arrival Callback Register */ + "CPND_EVT_A2ND_ARRIVAL_CB_REG", /* Track Callback Register */ "CPND_EVT_ND2ND_ACTIVE_STATUS", /* ckpt status info from active */ /* Not used Anywhere from 3.0.2 */ "CPND_EVT_ND2ND_ACTIVE_STATUS_ACK", /* ckpt status ack from active */ /*Not used Anywhere from 3.0.2 */ @@ -148,6 +149,7 @@ static char *cpnd_evt_str[] = { "CPND_EVT_D2ND_CKPT_NUM_SECTIONS", "CPND_EVT_A2ND_CKPT_REFCNTSET", "CPND_EVT_A2ND_CKPT_LIST_UPDATE", /* Checkpoint ckpt list update Call */ + "CPND_EVT_A2ND_ARRIVAL_CB_UNREG", /* Track Callback Un-Register */ "CPND_EVT_MAX" }; #endif @@ -264,6 +266,9 @@ void cpnd_process_evt(CPSV_EVT *evt) case CPND_EVT_A2ND_ARRIVAL_CB_REG: (void)cpnd_evt_proc_arrival_cbreg(cb, &evt->info.cpnd, &evt->sinfo); break; + case CPND_EVT_A2ND_ARRIVAL_CB_UNREG: + (void)cpnd_evt_proc_arrival_cbunreg(cb, &evt->info.cpnd, &evt->sinfo); + break; case CPND_EVT_D2ND_CKPT_ACTIVE_SET: /* broadcast message */ (void)cpnd_evt_proc_ckpt_active_set(cb, &evt->info.cpnd, &evt->sinfo); break; @@ -3312,6 +3317,38 @@ static uint32_t cpnd_evt_proc_arrival_cb return rc; } +/****************************************************************************** + * Name : cpnd_evt_proc_arrival_cbunreg + * + * Description : Function to process the arrival callback registration + * + * Arguments : CPND_CB *cb - CPND CB pointer + * CPSV_EVT *evt - Received Event structure + * CPSV_SEND_INFO *sinfo - Sender MDS information. + * + * Return Values : NCSCC_RC_SUCCESS/Error + * + *****************************************************************************/ +static uint32_t cpnd_evt_proc_arrival_cbunreg(CPND_CB *cb, CPND_EVT *evt, CPSV_SEND_INFO *sinfo) +{ + CPND_CKPT_CLIENT_NODE *cl_node = NULL; + uint32_t rc = NCSCC_RC_SUCCESS; + + TRACE_ENTER(); + cpnd_client_node_get(cb, evt->info.arr_ntfy.client_hdl, &cl_node); + if (cl_node == NULL) { + TRACE_4("cpnd client hdl get failed for client_hdl:%llx",evt->info.arr_ntfy.client_hdl); + rc = NCSCC_RC_FAILURE; + TRACE_LEAVE(); + return rc; + } + cl_node->arrival_cb_flag = false; + + cpnd_restart_set_arrcb(cb, cl_node); + TRACE_LEAVE(); + return rc; +} + /**************************************************************************** * Name : cpnd_evt_proc_nd2nd_ckpt_sync_req * ------------------------------------------------------------------------------ Rapidly troubleshoot problems before they affect your business. Most IT organizations don't have a clear picture of how application performance affects their revenue. With AppDynamics, you get 100% visibility into your Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro! http://pubads.g.doubleclick.net/gampad/clk?id=84349351&iu=/4140/ostg.clktrk _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel