osaf/libs/agents/saf/amfa/amf_agent.cc      |  145 +++++++++++++++++++++++++++-
 osaf/libs/agents/saf/amfa/ava_hdl.cc        |   39 ++++--
 osaf/libs/agents/saf/amfa/ava_mds.cc        |   54 ++++++++++-
 osaf/libs/agents/saf/amfa/ava_op.cc         |   61 +++++++++++
 osaf/libs/agents/saf/amfa/include/ava_cb.h  |    6 +
 osaf/libs/agents/saf/amfa/include/ava_hdl.h |   22 +++-
 osaf/libs/agents/saf/amfa/include/ava_mds.h |    4 +-
 7 files changed, 309 insertions(+), 22 deletions(-)


1)Because of different AMF callback struture correponding to each of B.01.01
  B.04.01, this patch introduces an internal callback structure 
OsafAmfCallbacksT.
  It consists of callback from each AMF version. Callback for each
  intialization needs to be maintained internally in AVA_HDL_REC. With this
  internal structure, same handle can used interanlly for any 
saAmfInitialize_<*>
  of AMF service.
  Also added utility functions to copy callbacks from AMF callbacks structure 
to this internal one.
  AMF agent will use OsafAmfCallbacksT internally instead of 
SaAmfCallbacksT_<*>.
2)Implementation of saAmfInitialize_5() in ava_api.c.
3)Now saAmfRegister() also sends SAF version to AMFND.

TODO:In saAmf_B_04_02, rename saAmfInitialize_5(0 to saAmfInitialize_o4().

diff --git a/osaf/libs/agents/saf/amfa/amf_agent.cc 
b/osaf/libs/agents/saf/amfa/amf_agent.cc
--- a/osaf/libs/agents/saf/amfa/amf_agent.cc
+++ b/osaf/libs/agents/saf/amfa/amf_agent.cc
@@ -63,6 +63,7 @@ SaAisErrorT AmfAgent::Initialize(SaAmfHa
   AVA_HDL_DB *hdl_db = 0;
   AVA_HDL_REC *hdl_rec = 0;
   SaAisErrorT rc = SA_AIS_OK;
+  OsafAmfCallbacksT osaf_cbks;
   TRACE_ENTER();
 
   if (!o_hdl || !io_ver) {
@@ -115,9 +116,12 @@ SaAisErrorT AmfAgent::Initialize(SaAmfHa
 
   /* get the ptr to the hdl db */
   hdl_db = &cb->hdl_db;
+  memset(&osaf_cbks, 0, sizeof(OsafAmfCallbacksT));
+  if (reg_cbks != NULL)
+         amf_copy_from_SaAmfCallbacksT_to_OsafAmfCallbacksT(&osaf_cbks, 
reg_cbks);
 
   /* create the hdl record & store the callbacks */
-  if (!(hdl_rec = ava_hdl_rec_add(cb, hdl_db, reg_cbks))) {
+  if (!(hdl_rec = ava_hdl_rec_add(cb, hdl_db, &osaf_cbks))) {
     rc = SA_AIS_ERR_NO_MEMORY;
     goto done;
   }
@@ -513,10 +517,28 @@ SaAisErrorT AmfAgent::ComponentRegister(
     goto done;
   }
 
+  if (!m_AVA_HDL_ARE_REG_CBKS_PRESENT(hdl_rec, proxy_comp_name)) {
+    TRACE("Required callbacks were not specified in saAmfInitialize");
+    rc = SA_AIS_ERR_INIT;
+    goto done;
+  }
+
+  /* For B.04.02 init, check OsafCsiAttributeChangeCallbackT was supplied 
during saAmfInitialize_5 */
+  if ((cb->version.releaseCode == 'B') &&
+         (cb->version.majorVersion == 0x04) && (cb->version.minorVersion == 
0x02) &&
+         (hdl_rec->reg_cbk.osafCsiAttributeChangeCallback == NULL)) {
+    TRACE("Required osafCsiAttributeChangeCallback was not specified in 
saAmfInitialize_5");
+    rc = SA_AIS_ERR_INIT;
+    goto done;
+  }
+
   /* populate & send the register message */
   if (proxy_comp_name)
     pcomp_name = *proxy_comp_name;
   m_AVA_COMP_REG_MSG_FILL(msg, cb->ava_dest, hdl, *comp_name, pcomp_name);
+  //Fill SAF version of component.
+  msg.info.api_info.param.reg.version = cb->version;
+
   rc = static_cast<SaAisErrorT>(ava_mds_send(cb, &msg, &msg_rsp));
   if (NCSCC_RC_SUCCESS == rc) {
     osafassert(AVSV_AVND_AMF_API_RESP_MSG == msg_rsp->type);
@@ -2090,6 +2112,7 @@ SaAisErrorT AmfAgent::Initialize_4(SaAmf
   AVA_HDL_DB *hdl_db = 0;
   AVA_HDL_REC *hdl_rec = 0;
   SaAisErrorT rc = SA_AIS_OK;
+  OsafAmfCallbacksT osaf_cbks;
   TRACE_ENTER();
 
   /* TODO: check cluster membership, if node is not a member answer back with 
SA_AIS_ERR_UNAVAILABLE */
@@ -2161,8 +2184,11 @@ SaAisErrorT AmfAgent::Initialize_4(SaAmf
     goto done;
   }
 
+  memset(&osaf_cbks, 0, sizeof(OsafAmfCallbacksT));
+  if (reg_cbks != NULL)
+    amf_copy_from_SaAmfCallbacksT_4_to_OsafAmfCallbacksT(&osaf_cbks, reg_cbks);
   /* create the hdl record & store the callbacks */
-  if (!(hdl_rec = ava_hdl_rec_add(cb, hdl_db, (SaAmfCallbacksT*)reg_cbks))) {
+  if (!(hdl_rec = ava_hdl_rec_add(cb, hdl_db, &osaf_cbks))) {
     rc = SA_AIS_ERR_NO_MEMORY;
     goto done;
   }
@@ -2764,3 +2790,118 @@ done:
   TRACE_LEAVE2("rc:%u", rc);
   return rc;
 }
+
+/**
+ * @brief: Implements new version of saAmfInitialize to enable application to 
+ *        register for new callback OsafCsiAttributeChangeCallbackT along with 
+ *         old ones. This version of initialize API implements 
saAmfInitialize_5()
+ *        with SAF version updated to B.04.02.
+ *
+ * @param  o_hdl (ptr to SaAmfHandleT).
+ * @param  reg_cbks (ptr to SaAmfCallbacksT_5)
+ * @param  io_ver (ptr to SaVersionT).
+ *
+ * Return Values : Refer to SAI-AIS specification for various return values.
+ */
+SaAisErrorT saAmfInitialize_5(SaAmfHandleT *o_hdl, const SaAmfCallbacksT_5 
*reg_cbks, SaVersionT *io_ver)
+{
+  AVA_CB *cb = 0;
+  AVA_HDL_DB *hdl_db = 0;
+  AVA_HDL_REC *hdl_rec = 0;
+  SaAisErrorT rc = SA_AIS_OK;
+  OsafAmfCallbacksT osaf_cbks;
+  TRACE_ENTER();
+
+  if (!o_hdl || !io_ver) {
+    TRACE_2("NULL arguments being passed: SaAmfHandleT and SaVersionT 
arguments should be non NULL");
+    rc = SA_AIS_ERR_INVALID_PARAM;
+    goto done;
+  }
+
+  if((io_ver->releaseCode != 'B') || (io_ver->majorVersion != 0x04) || 
(io_ver->minorVersion != 0x02)) {
+    TRACE_2("Invalid AMF version specified, supported version is: ReleaseCode 
= 'B', \
+                                               majorVersion = 0x04, 
minorVersion = 0x02");
+    rc = SA_AIS_ERR_VERSION;
+  }
+
+  io_ver->releaseCode = 'B';
+  io_ver->majorVersion = 4;
+  io_ver->minorVersion = 2;
+
+  if (SA_AIS_OK != rc)
+    goto done;
+
+  /* Initialize the environment */
+  if (ncs_agents_startup() != NCSCC_RC_SUCCESS) {
+    TRACE_2("Agents startup failed");
+    rc = SA_AIS_ERR_LIBRARY;
+    goto done;
+  }
+
+  /* Create AVA/CLA  CB */
+  if (ncs_ava_startup() != NCSCC_RC_SUCCESS) {
+    ncs_agents_shutdown();
+    rc = SA_AIS_ERR_LIBRARY;
+    goto done;
+  }
+
+  /* retrieve AvA CB */
+  if (!(cb = (AVA_CB *)ncshm_take_hdl(NCS_SERVICE_ID_AVA, gl_ava_hdl))) {
+    TRACE_4("SA_AIS_ERR_LIBRARY: Unable to retrieve cb handle");
+    rc = SA_AIS_ERR_LIBRARY;
+    goto done;
+  }
+  m_NCS_LOCK(&cb->lock, NCS_LOCK_WRITE);
+
+  cb->version.releaseCode = io_ver->releaseCode;
+  cb->version.majorVersion = io_ver->majorVersion;
+  cb->version.minorVersion = io_ver->minorVersion;
+
+  hdl_db = &cb->hdl_db;
+
+  if ((reg_cbks != NULL) &&
+      ((reg_cbks->saAmfContainedComponentCleanupCallback != 0) ||
+       (reg_cbks->saAmfContainedComponentInstantiateCallback != 0))) {
+    TRACE_4("SA_AIS_ERR_NOT_SUPPORTED: unsupported callbacks");
+    rc = SA_AIS_ERR_NOT_SUPPORTED;
+    goto done;
+  }
+
+  memset(&osaf_cbks, 0, sizeof(OsafAmfCallbacksT));
+  if (reg_cbks != NULL)
+         amf_copy_from_SaAmfCallbacksT_5_to_OsafAmfCallbacksT(&osaf_cbks, 
reg_cbks);
+  /* create the hdl record & store the callbacks */
+  if (!(hdl_rec = ava_hdl_rec_add(cb, hdl_db, &osaf_cbks))) {
+    rc = SA_AIS_ERR_NO_MEMORY;
+    goto done;
+  }
+
+  /* Initialize the ipc mailbox for the client for processing pending 
callbacks */
+  if (NCSCC_RC_SUCCESS != ava_callback_ipc_init(hdl_rec)) {
+    rc = SA_AIS_ERR_LIBRARY;
+    goto done;
+  }
+
+  /* pass the handle value to the appl */
+  if (SA_AIS_OK == rc) {
+    TRACE_1("saAmfHandle returned to application is: %llx", *o_hdl);
+    *o_hdl = hdl_rec->hdl;
+  }
+
+done:
+  if (hdl_rec && SA_AIS_OK != rc)
+    ava_hdl_rec_del(cb, hdl_db, &hdl_rec);
+
+  if (cb) {
+    m_NCS_UNLOCK(&cb->lock, NCS_LOCK_WRITE);
+    ncshm_give_hdl(gl_ava_hdl);
+  }
+
+  if (SA_AIS_OK != rc) {
+    ncs_ava_shutdown();
+    ncs_agents_shutdown();
+  }
+
+  TRACE_LEAVE2("rc:%u", rc);
+  return rc;
+}
diff --git a/osaf/libs/agents/saf/amfa/ava_hdl.cc 
b/osaf/libs/agents/saf/amfa/ava_hdl.cc
--- a/osaf/libs/agents/saf/amfa/ava_hdl.cc
+++ b/osaf/libs/agents/saf/amfa/ava_hdl.cc
@@ -37,7 +37,7 @@ static uint32_t ava_hdl_cbk_dispatch_one
 static uint32_t ava_hdl_cbk_dispatch_all(AVA_CB **, AVA_HDL_REC **);
 static uint32_t ava_hdl_cbk_dispatch_block(AVA_CB **, AVA_HDL_REC **);
 
-static void ava_hdl_cbk_rec_prc(AVSV_AMF_CBK_INFO *, SaAmfCallbacksT *);
+static void ava_hdl_cbk_rec_prc(AVSV_AMF_CBK_INFO *, OsafAmfCallbacksT *);
 
 static void ava_hdl_pend_resp_list_del(AVA_CB *, AVA_PEND_RESP *);
 static bool ava_hdl_cbk_ipc_mbx_del(NCSCONTEXT arg, NCSCONTEXT msg);
@@ -216,7 +216,7 @@ static bool ava_hdl_cbk_ipc_mbx_del(NCSC
  
   Notes         : None
 ******************************************************************************/
-AVA_HDL_REC *ava_hdl_rec_add(AVA_CB *cb, AVA_HDL_DB *hdl_db, const 
SaAmfCallbacksT *reg_cbks)
+AVA_HDL_REC *ava_hdl_rec_add(AVA_CB *cb, AVA_HDL_DB *hdl_db, const 
OsafAmfCallbacksT *reg_cbks)
 {
        AVA_HDL_REC *rec = 0;
        TRACE_ENTER();
@@ -235,8 +235,7 @@ AVA_HDL_REC *ava_hdl_rec_add(AVA_CB *cb,
 
        /* store the registered callbacks */
        if (reg_cbks)
-               memcpy((void *)&rec->reg_cbk, (void *)reg_cbks, 
sizeof(SaAmfCallbacksT));
-
+               memcpy((void *)&rec->reg_cbk, (void *)reg_cbks, 
sizeof(OsafAmfCallbacksT));
        /* add the record to the hdl db */
        rec->hdl_node.key_info = (uint8_t *)&rec->hdl;
        if (ncs_patricia_tree_add(&hdl_db->hdl_db_anchor, &rec->hdl_node)
@@ -350,12 +349,12 @@ uint32_t ava_hdl_cbk_dispatch_one(AVA_CB
        AVA_PEND_RESP *list_resp = &(*hdl_rec)->pend_resp;
        AVA_PEND_CBK_REC *rec = 0;
        uint32_t hdl = (*hdl_rec)->hdl;
-       SaAmfCallbacksT reg_cbk;
+       OsafAmfCallbacksT reg_cbk;
        uint32_t rc = SA_AIS_OK;
        TRACE_ENTER();
 
-       memset(&reg_cbk, 0, sizeof(SaAmfCallbacksT));
-       memcpy(&reg_cbk, &(*hdl_rec)->reg_cbk, sizeof(SaAmfCallbacksT));
+       memset(&reg_cbk, 0, sizeof(OsafAmfCallbacksT));
+       memcpy(&reg_cbk, &(*hdl_rec)->reg_cbk, sizeof(OsafAmfCallbacksT));
 
        /* pop the rec from the mailbox queue */
        rec = (AVA_PEND_CBK_REC 
*)m_NCS_IPC_NON_BLK_RECEIVE(&(*hdl_rec)->callbk_mbx, NULL);
@@ -420,12 +419,12 @@ uint32_t ava_hdl_cbk_dispatch_all(AVA_CB
        AVA_PEND_RESP *list_resp = &(*hdl_rec)->pend_resp;
        AVA_PEND_CBK_REC *rec = 0;
        uint32_t hdl = (*hdl_rec)->hdl;
-       SaAmfCallbacksT reg_cbk;
+       OsafAmfCallbacksT reg_cbk;
        uint32_t rc = SA_AIS_OK;
        TRACE_ENTER();
 
-       memset(&reg_cbk, 0, sizeof(SaAmfCallbacksT));
-       memcpy(&reg_cbk, &(*hdl_rec)->reg_cbk, sizeof(SaAmfCallbacksT));
+       memset(&reg_cbk, 0, sizeof(OsafAmfCallbacksT));
+       memcpy(&reg_cbk, &(*hdl_rec)->reg_cbk, sizeof(OsafAmfCallbacksT));
 
        /* pop all the records from the mailbox & process them */
        do {
@@ -491,12 +490,12 @@ uint32_t ava_hdl_cbk_dispatch_block(AVA_
        AVA_PEND_RESP *list_resp = &(*hdl_rec)->pend_resp;
        uint32_t hdl = (*hdl_rec)->hdl;
        AVA_PEND_CBK_REC *rec = 0;
-       SaAmfCallbacksT reg_cbk;
+       OsafAmfCallbacksT reg_cbk;
        uint32_t rc = SA_AIS_OK;
        TRACE_ENTER();
 
-       memset(&reg_cbk, 0, sizeof(SaAmfCallbacksT));
-       memcpy(&reg_cbk, &(*hdl_rec)->reg_cbk, sizeof(SaAmfCallbacksT));
+       memset(&reg_cbk, 0, sizeof(OsafAmfCallbacksT));
+       memcpy(&reg_cbk, &(*hdl_rec)->reg_cbk, sizeof(OsafAmfCallbacksT));
 
        /* release all lock and handle - we are abt to go into deep sleep */
        m_NCS_UNLOCK(&(*cb)->lock, NCS_LOCK_WRITE);
@@ -582,7 +581,7 @@ uint32_t ava_hdl_cbk_dispatch_block(AVA_
                   manager before dispatching. Else Finalize blocks while 
                   destroying the association with handle manager.
 ******************************************************************************/
-void ava_hdl_cbk_rec_prc(AVSV_AMF_CBK_INFO *info, SaAmfCallbacksT *reg_cbk)
+void ava_hdl_cbk_rec_prc(AVSV_AMF_CBK_INFO *info, OsafAmfCallbacksT *reg_cbk)
 {
        TRACE_ENTER2("CallbackType = %d",info->type);
 
@@ -613,7 +612,17 @@ void ava_hdl_cbk_rec_prc(AVSV_AMF_CBK_IN
                        }
                }
                break;
-
+       case AVSV_AMF_CSI_ATTR_CHANGE:
+               {
+                       AVSV_AMF_CSI_ATTR_CHANGE_PARAM *csi_attr_change = 
&info->param.csi_attr_change;
+                       if (reg_cbk->osafCsiAttributeChangeCallback) {
+                               
avsv_attrs_to_amf_attrs(&csi_attr_change->csiAttr, &csi_attr_change->attrs);
+                               TRACE("Invoking osafCsiAttributeChangeCallback 
: InvocationId = %llx,\
+                                        csi = %s",info->inv, 
csi_attr_change->csi_name.value);
+                               
reg_cbk->osafCsiAttributeChangeCallback(info->inv, &csi_attr_change->csi_name, 
csi_attr_change->csiAttr);
+                       }
+               }
+               break;
        case AVSV_AMF_CSI_SET:
                {
                        AVSV_AMF_CSI_SET_PARAM *csi_set = &info->param.csi_set;
diff --git a/osaf/libs/agents/saf/amfa/ava_mds.cc 
b/osaf/libs/agents/saf/amfa/ava_mds.cc
--- a/osaf/libs/agents/saf/amfa/ava_mds.cc
+++ b/osaf/libs/agents/saf/amfa/ava_mds.cc
@@ -53,8 +53,10 @@ static uint32_t ava_mds_enc(AVA_CB *cb, 
 
 static uint32_t ava_mds_dec(AVA_CB *cb, MDS_CALLBACK_DEC_INFO *dec_info);
 
+static uint32_t dec_csi_attr_change_msg(NCS_UBAID *uba, AVSV_NDA_AVA_MSG *msg);
+
 static const MDS_CLIENT_MSG_FORMAT_VER 
ava_avnd_msg_fmt_map_table[AVA_AVND_SUBPART_VER_MAX] =
-    { AVSV_AVND_AVA_MSG_FMT_VER_1 };
+    { AVSV_AVND_AVA_MSG_FMT_VER_1, AVSV_AVND_AVA_MSG_FMT_VER_2};
 
 /**
  * function called when MDS down for avnd (AMF) is received
@@ -565,6 +567,11 @@ uint32_t ava_mds_flat_dec(AVA_CB *cb, MD
                        }
 
                        switch (msg->info.cbk_info->type) {
+                       case AVSV_AMF_CSI_ATTR_CHANGE:
+                               {
+                                       rc = 
dec_csi_attr_change_msg(dec_info->io_uba, msg);
+                               }
+                               break;
                        case AVSV_AMF_CSI_SET:
                                {
                                        AVSV_AMF_CSI_SET_PARAM *csi_set = 
&msg->info.cbk_info->param.csi_set;
@@ -900,3 +907,48 @@ extern "C" void ava_install_amf_down_cb(
 
        TRACE_LEAVE();
 }
+/**
+ * @brief  Decodes CSI attribute change callback msg.
+ *
+ * @param  uba (ptr to NCS_UBAID).
+ * @param  msg (ptr to AVSV_NDA_AVA_MSG).
+ *
+ * @return NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE.
+ */
+static uint32_t dec_csi_attr_change_msg(NCS_UBAID *uba, AVSV_NDA_AVA_MSG *msg)
+{
+        AVSV_AMF_CSI_ATTR_CHANGE_PARAM *csi_attr_change = 
&msg->info.cbk_info->param.csi_attr_change;
+       uint32_t rc = NCSCC_RC_SUCCESS;
+       uint16_t len, i;
+       uint8_t *p8;
+       if (csi_attr_change->attrs.number == 0) 
+               goto done;
+       csi_attr_change->attrs.list = 0;
+       csi_attr_change->attrs.list = 
static_cast<AVSV_ATTR_NAME_VAL*>(calloc(1, csi_attr_change->attrs.number * 
sizeof(AVSV_ATTR_NAME_VAL)));
+       if (!csi_attr_change->attrs.list) {
+               rc = NCSCC_RC_FAILURE;
+               LOG_CR("Calloc failed");
+               goto done;
+       }
+       for(i=0; i<csi_attr_change->attrs.number; i++) {
+               rc = ncs_decode_n_octets_from_uba(uba,
+                       (uint8_t *)&csi_attr_change->attrs.list[i].name, 
sizeof(SaNameT));
+               if (NCSCC_RC_SUCCESS != rc) {
+                       LOG_CR("ncs_decode_n_octets_from_uba failed with rc= 
%d", rc);
+                       goto done;
+               }
+               p8 = ncs_dec_flatten_space(uba, (uint8_t *)&len, 2);
+               len = ncs_decode_16bit(&p8);
+               ncs_dec_skip_space(uba, 2);
+               csi_attr_change->attrs.list[i].string_ptr =  
static_cast<SaStringT>(calloc(1, len+1));
+               osafassert(csi_attr_change->attrs.list[i].string_ptr);
+               rc = ncs_decode_n_octets_from_uba(uba,
+                               (uint8_t 
*)csi_attr_change->attrs.list[i].string_ptr, (len+1));
+               if (NCSCC_RC_SUCCESS != rc) {
+                       LOG_CR("ncs_decode_n_octets_from_uba failed with rc = 
%d", rc);
+                       goto done;
+               }
+       }
+done:
+       return rc;
+}
diff --git a/osaf/libs/agents/saf/amfa/ava_op.cc 
b/osaf/libs/agents/saf/amfa/ava_op.cc
--- a/osaf/libs/agents/saf/amfa/ava_op.cc
+++ b/osaf/libs/agents/saf/amfa/ava_op.cc
@@ -157,3 +157,64 @@ void ava_cpy_protection_group_ntf(SaAmfP
        }
 }
 
+/**
+ * @brief  Copies callbacks passed by application in saAmfInitialize() API into
+          AMF internal callback strucutre OsafAmfCallbacksT.
+ *
+ * @param  osaf_cbk  (ptr to OsafAmfCallbacksT).
+ * @param  cbk (ptr to SaAmfCallbacksT).
+ *
+ */
+void amf_copy_from_SaAmfCallbacksT_to_OsafAmfCallbacksT(OsafAmfCallbacksT 
*osaf_cbk, const SaAmfCallbacksT *cbk)
+{
+       osaf_cbk->saAmfHealthcheckCallback = cbk->saAmfHealthcheckCallback;
+       osaf_cbk->saAmfComponentTerminateCallback = 
cbk->saAmfComponentTerminateCallback;
+       osaf_cbk->saAmfCSISetCallback = cbk->saAmfCSISetCallback;
+       osaf_cbk->saAmfCSIRemoveCallback = cbk->saAmfCSIRemoveCallback;
+       osaf_cbk->saAmfProtectionGroupTrackCallback = 
cbk->saAmfProtectionGroupTrackCallback;
+       osaf_cbk->saAmfProxiedComponentInstantiateCallback = 
cbk->saAmfProxiedComponentInstantiateCallback;
+       osaf_cbk->saAmfProxiedComponentCleanupCallback = 
cbk->saAmfProxiedComponentCleanupCallback; 
+}
+
+/*
+ * @brief  Copies callbacks passed by application in saAmfInitialize_4() API 
into
+           AMF internal callback strucutre OsafAmfCallbacksT.
+ *
+ * @param  osaf_cbk  (ptr to OsafAmfCallbacksT).
+ * @param  cbk (ptr to SaAmfCallbacksT_4).
+ */
+void amf_copy_from_SaAmfCallbacksT_4_to_OsafAmfCallbacksT(OsafAmfCallbacksT 
*osaf_cbk, const SaAmfCallbacksT_4 *cbk)
+{
+       osaf_cbk->saAmfHealthcheckCallback = cbk->saAmfHealthcheckCallback;
+       osaf_cbk->saAmfComponentTerminateCallback = 
cbk->saAmfComponentTerminateCallback;
+       osaf_cbk->saAmfCSISetCallback = cbk->saAmfCSISetCallback;
+       osaf_cbk->saAmfCSIRemoveCallback = cbk->saAmfCSIRemoveCallback;
+       osaf_cbk->saAmfProtectionGroupTrackCallback_4 = 
cbk->saAmfProtectionGroupTrackCallback;
+       osaf_cbk->saAmfProxiedComponentInstantiateCallback = 
cbk->saAmfProxiedComponentInstantiateCallback;
+       osaf_cbk->saAmfProxiedComponentCleanupCallback = 
cbk->saAmfProxiedComponentCleanupCallback; 
+       osaf_cbk->saAmfContainedComponentInstantiateCallback = 
cbk->saAmfContainedComponentInstantiateCallback; 
+       osaf_cbk->saAmfContainedComponentInstantiateCallback = 
cbk->saAmfContainedComponentInstantiateCallback; 
+}
+
+/*
+ * @brief  Copies callbacks passed by application in saAmfInitialize_5() API 
into
+           AMF internal callback strucutre OsafAmfCallbacksT.
+ *
+ * @param  osaf_cbk  (ptr to OsafAmfCallbacksT).
+ * @param  cbk (ptr to SaAmfCallbacksT_5).
+ */
+void amf_copy_from_SaAmfCallbacksT_5_to_OsafAmfCallbacksT(OsafAmfCallbacksT 
*osaf_cbk, const SaAmfCallbacksT_5 *cbk)
+{
+       osaf_cbk->saAmfHealthcheckCallback = cbk->saAmfHealthcheckCallback;
+       osaf_cbk->saAmfComponentTerminateCallback = 
cbk->saAmfComponentTerminateCallback;
+       osaf_cbk->saAmfCSISetCallback = cbk->saAmfCSISetCallback;
+       osaf_cbk->saAmfCSIRemoveCallback = cbk->saAmfCSIRemoveCallback;
+       osaf_cbk->saAmfProtectionGroupTrackCallback_4 = 
cbk->saAmfProtectionGroupTrackCallback;
+       osaf_cbk->saAmfProxiedComponentInstantiateCallback = 
cbk->saAmfProxiedComponentInstantiateCallback;
+       osaf_cbk->saAmfProxiedComponentCleanupCallback = 
cbk->saAmfProxiedComponentCleanupCallback; 
+       osaf_cbk->saAmfContainedComponentInstantiateCallback = 
cbk->saAmfContainedComponentInstantiateCallback; 
+       osaf_cbk->saAmfContainedComponentInstantiateCallback = 
cbk->saAmfContainedComponentInstantiateCallback; 
+       osaf_cbk->saAmfContainedComponentInstantiateCallback = 
cbk->saAmfContainedComponentInstantiateCallback; 
+       osaf_cbk->osafCsiAttributeChangeCallback = 
cbk->osafCsiAttributeChangeCallback;
+
+}
diff --git a/osaf/libs/agents/saf/amfa/include/ava_cb.h 
b/osaf/libs/agents/saf/amfa/include/ava_cb.h
--- a/osaf/libs/agents/saf/amfa/include/ava_cb.h
+++ b/osaf/libs/agents/saf/amfa/include/ava_cb.h
@@ -113,6 +113,12 @@ void ava_cpy_protection_group_ntf(SaAmfP
                                const SaAmfProtectionGroupNotificationT 
*from_ntf,
                                SaUint32T items,
                                SaAmfHAReadinessStateT ha_read_state);
+void amf_copy_from_SaAmfCallbacksT_to_OsafAmfCallbacksT(OsafAmfCallbacksT 
*osaf_cbk,
+                                const SaAmfCallbacksT *cbk);
+void amf_copy_from_SaAmfCallbacksT_4_to_OsafAmfCallbacksT(OsafAmfCallbacksT 
*osaf_cbk,
+               const SaAmfCallbacksT_4 *cbk);
+void amf_copy_from_SaAmfCallbacksT_5_to_OsafAmfCallbacksT(OsafAmfCallbacksT 
*osaf_cbk,
+               const SaAmfCallbacksT_5 *cbk);
 
 #ifdef  __cplusplus
 }
diff --git a/osaf/libs/agents/saf/amfa/include/ava_hdl.h 
b/osaf/libs/agents/saf/amfa/include/ava_hdl.h
--- a/osaf/libs/agents/saf/amfa/include/ava_hdl.h
+++ b/osaf/libs/agents/saf/amfa/include/ava_hdl.h
@@ -62,13 +62,31 @@ typedef struct ava_resp_cbk {
        AVA_PEND_RESP_REC *tail;
 } AVA_PEND_RESP;
 
+/*
+  Common structure for different initialize API versions(B.01.01, B.04.01 and 
B.04.2) 
+  to remember callbacks passed by user application. This is for internal use 
only.
+*/
+typedef struct osaf_amf_cbk {
+        SaAmfHealthcheckCallbackT                   saAmfHealthcheckCallback;
+        SaAmfComponentTerminateCallbackT            
saAmfComponentTerminateCallback;
+        SaAmfCSISetCallbackT                        saAmfCSISetCallback;
+        SaAmfCSIRemoveCallbackT                     saAmfCSIRemoveCallback;
+        SaAmfProtectionGroupTrackCallbackT          
saAmfProtectionGroupTrackCallback;
+        SaAmfProtectionGroupTrackCallbackT_4        
saAmfProtectionGroupTrackCallback_4; //Only in B.04.01
+        SaAmfProxiedComponentInstantiateCallbackT   
saAmfProxiedComponentInstantiateCallback;
+        SaAmfProxiedComponentCleanupCallbackT       
saAmfProxiedComponentCleanupCallback;
+        SaAmfContainedComponentInstantiateCallbackT 
saAmfContainedComponentInstantiateCallback;
+        SaAmfContainedComponentCleanupCallbackT     
saAmfContainedComponentCleanupCallback;
+        OsafCsiAttributeChangeCallbackT             
osafCsiAttributeChangeCallback; //OpenSAF implementation and not from any spec.
+} OsafAmfCallbacksT;
+
 /* AvA handle database records */
 typedef struct ava_hdl_rec_tag {
        NCS_PATRICIA_NODE hdl_node;     /* hdl-db tree node */
 
        uint32_t hdl;           /* AMF handle (derived from hdl-mngr) */
 
-       SaAmfCallbacksT reg_cbk;        /* callbacks registered by the 
application */
+       struct osaf_amf_cbk reg_cbk;    /* callbacks registered by the 
application */
 
        SYSF_MBX callbk_mbx;       /* mailbox to hold the callback messages */ 
        AVA_PEND_RESP pend_resp;        /* list of pending AvSv Response */
@@ -189,7 +207,7 @@ void ava_hdl_del(struct ava_cb_tag *);
 
 void ava_hdl_rec_del(struct ava_cb_tag *, AVA_HDL_DB *, AVA_HDL_REC **);
 
-AVA_HDL_REC *ava_hdl_rec_add(struct ava_cb_tag *, AVA_HDL_DB *, const 
SaAmfCallbacksT *);
+AVA_HDL_REC *ava_hdl_rec_add(struct ava_cb_tag *, AVA_HDL_DB *, const 
OsafAmfCallbacksT *);
 
 uint32_t ava_hdl_cbk_dispatch(struct ava_cb_tag **, AVA_HDL_REC **, 
SaDispatchFlagsT);
 
diff --git a/osaf/libs/agents/saf/amfa/include/ava_mds.h 
b/osaf/libs/agents/saf/amfa/include/ava_mds.h
--- a/osaf/libs/agents/saf/amfa/include/ava_mds.h
+++ b/osaf/libs/agents/saf/amfa/include/ava_mds.h
@@ -35,10 +35,10 @@ extern "C" {
 #endif
 
 /* In Service upgrade support */
-#define AVA_MDS_SUB_PART_VERSION   1
+#define AVA_MDS_SUB_PART_VERSION   2
 
 #define AVA_AVND_SUBPART_VER_MIN   1
-#define AVA_AVND_SUBPART_VER_MAX   1
+#define AVA_AVND_SUBPART_VER_MAX   2
 
 /*****************************************************************************
                  Macros to fill the MDS message structure

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to