* 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