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

Reply via email to