* A callback that will be invoked by AMFA whenever a SC joins cluster and
  both SCs leaves cluster if SC Absence feature is enabled.

  Callback and its argument:

      void (*OsafAmfSCStatusChangeCallbackT)(OsafAmfSCStatusT state)
      where OsafAmfSCStatusT is defined as:
        typedef enum {
          OSAF_AMF_SC_PRESENT = 1,
          OSAF_AMF_SC_ABSENT = 2,
        } OsafAmfSCStatusT;

  This callback can be integrated
  with standard AMF component (even with legacy one also).
* An API to register/install above callback function:
   void osafAmfInstallSCStatusChangeCallback(
     void (*OsafAmfSCStatusChangeCallbackT)(OsafAmfSCStatusT status));
---
 src/amf/agent/ava_mds.cc      | 35 ++++++++++++++++++++++++++++++++++-
 src/amf/agent/ava_mds.h       |  6 ++++--
 src/amf/agent/ava_op.cc       |  5 +++++
 src/amf/amfnd/avnd_mds.h      |  2 +-
 src/amf/amfnd/di.cc           | 39 ++++++++++++++++++++++++++++++++++++++-
 src/amf/amfnd/mds.cc          |  5 ++++-
 src/amf/common/amf_amfparam.h |  7 +++++++
 src/amf/common/amf_n2avamsg.h |  1 +
 src/amf/saf/libSaAmf.map      |  1 +
 src/amf/saf/saAmf_B_04_02.h   |  8 ++++++++
 10 files changed, 103 insertions(+), 6 deletions(-)

diff --git a/src/amf/agent/ava_mds.cc b/src/amf/agent/ava_mds.cc
index 54a0cfa..42bc139 100644
--- a/src/amf/agent/ava_mds.cc
+++ b/src/amf/agent/ava_mds.cc
@@ -60,7 +60,8 @@ 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_2};
+        AVSV_AVND_AVA_MSG_FMT_VER_1, AVSV_AVND_AVA_MSG_FMT_VER_2,
+        AVSV_AVND_AVA_MSG_FMT_VER_3};
 
 /**
  * function called when MDS down for avnd (AMF) is received
@@ -68,6 +69,26 @@ static const MDS_CLIENT_MSG_FORMAT_VER
  */
 static void (*amf_down_cb)(void);
 
+/**
+ * @brief  SC status change callback. It is called when cluster becomes
+ *         without SCs and with SCs. It can be used by a client to know
+ *         when cluster runs without SCs and with SCs.
+ * @param  state.
+ */
+static void (*OsafAmfSCStatusChangeCallbackT)(OsafAmfSCStatusT state);
+
+//Wrapper function that AMFA uses to invoke SC status change callback.
+void osafAmfSCStatusChangeCallback_invoke(OsafAmfSCStatusT state) {
+  TRACE_ENTER();
+  if (OsafAmfSCStatusChangeCallbackT == nullptr) {
+     TRACE("Callback not registered");
+  } else {
+     TRACE("Invoking SC status change callback");
+    /* A client has installed a callback pointer, call it */
+    OsafAmfSCStatusChangeCallbackT(state);
+  }
+  TRACE_LEAVE();
+}
 /****************************************************************************
   Name          : ava_mds_reg
 
@@ -893,6 +914,8 @@ uint32_t ava_mds_flat_dec(AVA_CB *cb, 
MDS_CALLBACK_DEC_FLAT_INFO *dec_info) {
             osaf_decode_sanamet(dec_info->io_uba, 
&pxied_comp_clean->comp_name);
           }
         } break;
+        case AVSV_AMF_SC_STATUS_CHANGE: {
+        } break;
 
         default:
           osafassert(0);
@@ -1168,6 +1191,16 @@ extern "C" void ava_install_amf_down_cb(void 
(*cb)(void)) {
   TRACE_LEAVE();
 }
 
+/**
+ * @brief   API for client to install SC status change callback.
+ */
+void osafAmfInstallSCStatusChangeCallback(void (*cb)(OsafAmfSCStatusT status)) 
{
+  TRACE_ENTER();
+  OsafAmfSCStatusChangeCallbackT = cb;
+  TRACE_LEAVE();
+}
+
+
 void ava_fill_finalize_msg(AVSV_NDA_AVA_MSG *msg, MDS_DEST dst,
                            SaAmfHandleT hdl, SaNameT comp_name) {
   msg->type = AVSV_AVA_API_MSG;
diff --git a/src/amf/agent/ava_mds.h b/src/amf/agent/ava_mds.h
index e0f61dd..882f6a5 100644
--- a/src/amf/agent/ava_mds.h
+++ b/src/amf/agent/ava_mds.h
@@ -35,10 +35,10 @@ extern "C" {
 #endif
 
 /* In Service upgrade support */
-#define AVA_MDS_SUB_PART_VERSION 2
+#define AVA_MDS_SUB_PART_VERSION 3
 
 #define AVA_AVND_SUBPART_VER_MIN 1
-#define AVA_AVND_SUBPART_VER_MAX 2
+#define AVA_AVND_SUBPART_VER_MAX 3
 
 /*****************************************************************************
                  Function to fill the MDS message structure
@@ -101,6 +101,8 @@ uint32_t ava_mds_cbk(NCSMDS_CALLBACK_INFO*);
 uint32_t ava_mds_send(struct ava_cb_tag*, AVSV_NDA_AVA_MSG*,
                       AVSV_NDA_AVA_MSG**);
 
+void osafAmfSCStatusChangeCallback_invoke(OsafAmfSCStatusT state);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/amf/agent/ava_op.cc b/src/amf/agent/ava_op.cc
index c150b9f..e493955 100644
--- a/src/amf/agent/ava_op.cc
+++ b/src/amf/agent/ava_op.cc
@@ -83,6 +83,11 @@ uint32_t ava_avnd_msg_prc(AVA_CB *cb, AVSV_NDA_AVA_MSG *msg) 
{
     }
   }
 
+  if (cbk_info->type == AVSV_AMF_SC_STATUS_CHANGE) {
+    TRACE("SCs Status:%u",cbk_info->param.sc_status_change.sc_status);
+    
osafAmfSCStatusChangeCallback_invoke(cbk_info->param.sc_status_change.sc_status);
+    goto done;
+  }
   /* retrieve the handle record */
   hdl = cbk_info->hdl;
   hdl_rec = (AVA_HDL_REC *)ncshm_take_hdl(NCS_SERVICE_ID_AVA, hdl);
diff --git a/src/amf/amfnd/avnd_mds.h b/src/amf/amfnd/avnd_mds.h
index 70173ac..1f9753c 100644
--- a/src/amf/amfnd/avnd_mds.h
+++ b/src/amf/amfnd/avnd_mds.h
@@ -41,7 +41,7 @@
 #define AVND_AVND_SUBPART_VER_MAX 1
 
 #define AVND_AVA_SUBPART_VER_MIN 1
-#define AVND_AVA_SUBPART_VER_MAX 2
+#define AVND_AVA_SUBPART_VER_MAX 3
 
 #define AVND_CLA_SUBPART_VER_MIN 1
 #define AVND_CLA_SUBPART_VER_MAX 1
diff --git a/src/amf/amfnd/di.cc b/src/amf/amfnd/di.cc
index 6f0a76c..07b9b2e 100644
--- a/src/amf/amfnd/di.cc
+++ b/src/amf/amfnd/di.cc
@@ -516,6 +516,37 @@ done:
   TRACE_LEAVE();
 }
 
+/*
+ * @brief      Sends message to AMFA about SCs Absence and Presence.
+ * @param [in]  status
+ */
+void avnd_send_sc_status_message(OsafAmfSCStatusT status) {
+  TRACE_ENTER();
+  uint32_t rc = NCSCC_RC_SUCCESS;
+  AVND_MSG msg;
+  MDS_DEST mds_dest = 0;
+  memset(&msg, 0, sizeof(AVND_MSG));
+
+  for (auto& it: agent_mds_ver_db) {
+    if (it.second < AVSV_AVND_AVA_MSG_FMT_VER_3) {
+      TRACE("AMFA does not support the callback");
+      continue;
+    }
+    msg.info.ava =
+      static_cast<AVSV_NDA_AVA_MSG *>(calloc(1, sizeof(AVSV_NDA_AVA_MSG)));
+    msg.type = AVND_MSG_AVA;
+    msg.info.ava->type = AVSV_AVND_AMF_CBK_MSG;
+    msg.info.ava->info.cbk_info = static_cast<AVSV_AMF_CBK_INFO*>(calloc(1, 
sizeof(AVSV_AMF_CBK_INFO)));
+    msg.info.ava->info.cbk_info->param.sc_status_change.sc_status = status;
+    msg.info.ava->info.cbk_info->type = AVSV_AMF_SC_STATUS_CHANGE;
+    mds_dest = it.first;
+    rc = avnd_mds_send(avnd_cb, &msg, &mds_dest, 0);
+    if (rc != NCSCC_RC_SUCCESS)
+      LOG_WA("Message failed to dest");
+    avnd_msg_content_free(avnd_cb, &msg);
+  }
+  TRACE_LEAVE();
+}
 /****************************************************************************
   Name          : avnd_evt_mds_avd_up
 
@@ -600,11 +631,13 @@ uint32_t avnd_evt_mds_avd_up_evh(AVND_CB *cb, AVND_EVT 
*evt) {
       avnd_send_node_up_msg();
     }
     cb->is_avd_down = false;
+
+    //Inform AMFA about SCs presence now.
+    avnd_send_sc_status_message(OSAF_AMF_SC_PRESENT);
   }
 
   if (m_AVND_TMR_IS_ACTIVE(cb->sc_absence_tmr))
     avnd_stop_tmr(cb, &cb->sc_absence_tmr);
-
 done:
   TRACE_LEAVE();
   return NCSCC_RC_SUCCESS;
@@ -739,6 +772,10 @@ uint32_t avnd_evt_mds_avd_dn_evh(AVND_CB *cb, AVND_EVT 
*evt) {
   // reset msg_id counter
   cb->rcv_msg_id = 0;
   cb->snd_msg_id = 0;
+
+  //Inform AMFA about SCs absence now.
+  avnd_send_sc_status_message(OSAF_AMF_SC_ABSENT);
+
   TRACE_LEAVE();
   return rc;
 }
diff --git a/src/amf/amfnd/mds.cc b/src/amf/amfnd/mds.cc
index 6ef1239..1ee24cf 100644
--- a/src/amf/amfnd/mds.cc
+++ b/src/amf/amfnd/mds.cc
@@ -58,7 +58,8 @@ const MDS_CLIENT_MSG_FORMAT_VER avnd_avnd_msg_fmt_map_table[] 
= {
     AVSV_AVND_AVND_MSG_FMT_VER_1};
 
 const MDS_CLIENT_MSG_FORMAT_VER avnd_ava_msg_fmt_map_table[] = {
-    AVSV_AVND_AVA_MSG_FMT_VER_1, AVSV_AVND_AVA_MSG_FMT_VER_2};
+    AVSV_AVND_AVA_MSG_FMT_VER_1, AVSV_AVND_AVA_MSG_FMT_VER_2,
+    AVSV_AVND_AVA_MSG_FMT_VER_3};
 
 /* static function declarations */
 
@@ -1034,6 +1035,8 @@ uint32_t avnd_mds_flat_ava_enc(AVND_CB *cb, 
MDS_CALLBACK_ENC_INFO *enc_info) {
                                 &cbk_info->param.pxied_comp_clean.comp_name);
           }
           break;
+        case AVSV_AMF_SC_STATUS_CHANGE:
+          break;
 
         default:
           osafassert(0);
diff --git a/src/amf/common/amf_amfparam.h b/src/amf/common/amf_amfparam.h
index e18d3fe..a46b297 100644
--- a/src/amf/common/amf_amfparam.h
+++ b/src/amf/common/amf_amfparam.h
@@ -65,6 +65,7 @@ typedef enum avsv_amf_cbk_type {
   AVSV_AMF_PXIED_COMP_INST,
   AVSV_AMF_PXIED_COMP_CLEAN,
   AVSV_AMF_CSI_ATTR_CHANGE,
+  AVSV_AMF_SC_STATUS_CHANGE,
   AVSV_AMF_CBK_MAX
 } AVSV_AMF_CBK_TYPE;
 
@@ -252,6 +253,11 @@ typedef struct avsv_amf_csi_attr_change_param_tag {
   SaAmfCSIAttributeListT csiAttr; /* contains the csi-attr list SAF compliant*/
 } AVSV_AMF_CSI_ATTR_CHANGE_PARAM;
 
+//SC status change callback msg structure from AMFND to AMF agent.
+typedef struct avsv_amf_sc_status_param_tag {
+  OsafAmfSCStatusT sc_status;
+} AVSV_AMF_SC_STATUS_CHANGE_PARAM;
+
 /* csi remove */
 typedef struct avsv_amf_csi_rem_param_tag {
   SaNameT comp_name;        /* comp name */
@@ -291,6 +297,7 @@ typedef struct avsv_amf_cbk_info_tag {
     AVSV_AMF_PXIED_COMP_INST_PARAM pxied_comp_inst;
     AVSV_AMF_PXIED_COMP_CLEAN_PARAM pxied_comp_clean;
     AVSV_AMF_CSI_ATTR_CHANGE_PARAM csi_attr_change;
+    AVSV_AMF_SC_STATUS_CHANGE_PARAM sc_status_change;
   } param;
 } AVSV_AMF_CBK_INFO;
 
diff --git a/src/amf/common/amf_n2avamsg.h b/src/amf/common/amf_n2avamsg.h
index 80ebc84..738966b 100644
--- a/src/amf/common/amf_n2avamsg.h
+++ b/src/amf/common/amf_n2avamsg.h
@@ -41,6 +41,7 @@ extern "C" {
 /* Message format versions */
 #define AVSV_AVND_AVA_MSG_FMT_VER_1 1
 #define AVSV_AVND_AVA_MSG_FMT_VER_2 2
+#define AVSV_AVND_AVA_MSG_FMT_VER_3 3
 
 /* AMF API enums */
 typedef enum avsv_nda_ava_msg_type {
diff --git a/src/amf/saf/libSaAmf.map b/src/amf/saf/libSaAmf.map
index cac34ce..dfb6a16 100644
--- a/src/amf/saf/libSaAmf.map
+++ b/src/amf/saf/libSaAmf.map
@@ -5,6 +5,7 @@
                saAis*;
                saAmf*;
                ava_install_amf_down_cb;        # FIXME ava* should be 
local-only
+               osafAmfInstallSCStatusChangeCallback;
 
        local:
                *;
diff --git a/src/amf/saf/saAmf_B_04_02.h b/src/amf/saf/saAmf_B_04_02.h
index b083031..28ec3fc 100644
--- a/src/amf/saf/saAmf_B_04_02.h
+++ b/src/amf/saf/saAmf_B_04_02.h
@@ -59,6 +59,14 @@ saAmfInitialize_o4(
     const SaAmfCallbacksT_o4 *amfCallbacks,
     SaVersionT *version);
 
+typedef enum {
+    OSAF_AMF_SC_PRESENT = 1,
+    OSAF_AMF_SC_ABSENT = 2,
+} OsafAmfSCStatusT;
+
+extern void osafAmfInstallSCStatusChangeCallback(
+    void (*OsafAmfSCStatusChangeCallbackT)(OsafAmfSCStatusT status));
+
 #ifdef  __cplusplus
 }
 #endif
-- 
1.9.1


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to