osaf/services/saf/amf/amfnd/amfnd.cc | 2 +
osaf/services/saf/amf/amfnd/cbq.cc | 23 +++-
osaf/services/saf/amf/amfnd/comp.cc | 44 +++++++
osaf/services/saf/amf/amfnd/compdb.cc | 4 +
osaf/services/saf/amf/amfnd/err.cc | 4 +-
osaf/services/saf/amf/amfnd/evt.cc | 2 +
osaf/services/saf/amf/amfnd/include/avnd_cb.h | 2 +
osaf/services/saf/amf/amfnd/include/avnd_comp.h | 2 +-
osaf/services/saf/amf/amfnd/include/avnd_err.h | 2 +
osaf/services/saf/amf/amfnd/include/avnd_evt.h | 1 +
osaf/services/saf/amf/amfnd/include/avnd_mds.h | 2 +-
osaf/services/saf/amf/amfnd/include/avnd_su.h | 2 +
osaf/services/saf/amf/amfnd/main.cc | 1 +
osaf/services/saf/amf/amfnd/mds.cc | 52 ++++++++-
osaf/services/saf/amf/amfnd/su.cc | 142 ++++++++++++++++++++++++
osaf/services/saf/amf/amfnd/util.cc | 38 ++++++-
16 files changed, 315 insertions(+), 8 deletions(-)
Contains changes related to:
1)Upong receving CSI attribute list, update own databae with modified
information.
If compoent has registered with new callback OsafCsiAttributeChangeCallbackT,
then send callback OsafCsiAttributeChangeCallbackT to AMF agent. For
Non Proxied NPI component run INSTANTIATE command.
2)AMFND now maintains MDS install version of AMF AGENTs in
std::map<MDS_DEST, MDS_SVC_PVT_SUB_PART_VER> agent_mds_ver_db.
It will be updated whenever AMFND gets MDS_UP and MDS_DOWN for AMF Agent.
3)AMFND maintains now SAF version for each registered component.
AMFND will get it from Agent thorugh existing component registeration message.
diff --git a/osaf/services/saf/amf/amfnd/amfnd.cc
b/osaf/services/saf/amf/amfnd/amfnd.cc
--- a/osaf/services/saf/amf/amfnd/amfnd.cc
+++ b/osaf/services/saf/amf/amfnd/amfnd.cc
@@ -24,6 +24,8 @@
****************************************************************************/
#include "avnd.h"
+//Remember MDS install version of Agents. It can be used to send msg to Agent
based on their versions.
+std::map<MDS_DEST, MDS_SVC_PVT_SUB_PART_VER> agent_mds_ver_db;
extern const AVND_EVT_HDLR g_avnd_func_list[AVND_EVT_MAX];
static uint32_t avnd_evt_avnd_avnd_api_msg_hdl(AVND_CB *cb, AVND_EVT *evt);
diff --git a/osaf/services/saf/amf/amfnd/cbq.cc
b/osaf/services/saf/amf/amfnd/cbq.cc
--- a/osaf/services/saf/amf/amfnd/cbq.cc
+++ b/osaf/services/saf/amf/amfnd/cbq.cc
@@ -398,6 +398,22 @@ uint32_t avnd_evt_ava_resp_evh(AVND_CB *
}
break;
+ case AVSV_AMF_CSI_ATTR_CHANGE:
+ csi = m_AVND_COMPDB_REC_CSI_GET(*comp,
cbk_rec->cbk_info->param.csi_attr_change.csi_name);
+ if (!csi)
+ LOG_ER("'%s', not found",
cbk_rec->cbk_info->param.csi_attr_change.csi_name.value);
+ avnd_comp_cbq_rec_pop_and_del(cb, comp, cbk_rec, false);
+ if (m_AVND_TMR_IS_ACTIVE(cbk_rec->resp_tmr)) {
+ m_AVND_TMR_COMP_CBK_RESP_STOP(cb, *cbk_rec)
+ }
+ if (SA_AIS_OK != resp->err) {
+ //generate a failure report.
+ err_info.src = AVND_ERR_SRC_CBK_CSI_ATTR_CHANGE_FAILED;
+ err_info.rec_rcvr.avsv_ext =
static_cast<AVSV_ERR_RCVR>(comp->err_info.def_rec);
+ rc = avnd_err_process(cb, comp, &err_info);
+ }
+
+ break;
case AVSV_AMF_CSI_SET:
if (m_AVND_COMP_TYPE_IS_PROXIED(comp) &&
!m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(comp)) {
@@ -592,6 +608,9 @@ uint32_t avnd_evt_tmr_cbk_resp_evh(AVND_
case AVSV_AMF_CSI_REM:
err_info.src = AVND_ERR_SRC_CBK_CSI_REM_TIMEOUT;
break;
+ case AVSV_AMF_CSI_ATTR_CHANGE:
+ err_info.src = AVND_ERR_SRC_CBK_CSI_ATTR_CHANGE_TIMEOUT;
+ break;
default:
LOG_ER("%s,%u,type=%u",__FUNCTION__,__LINE__,rec->cbk_info->type);
err_info.src = AVND_ERR_SRC_CBK_CSI_SET_TIMEOUT;
@@ -1033,7 +1052,9 @@ void avnd_comp_cbq_csi_rec_del(AVND_CB *
if (((AVSV_AMF_CSI_SET == info->type) &&
(0 ==
m_CMP_HORDER_SANAMET(info->param.csi_set.csi_desc.csiName, *csi_name))) ||
((AVSV_AMF_CSI_REM == info->type) &&
- (0 ==
m_CMP_HORDER_SANAMET(info->param.csi_rem.csi_name, *csi_name))))
+ (0 ==
m_CMP_HORDER_SANAMET(info->param.csi_rem.csi_name, *csi_name))) ||
+ ((AVSV_AMF_CSI_ATTR_CHANGE == info->type) &&
+ (0 ==
m_CMP_HORDER_SANAMET(info->param.csi_attr_change.csi_name, *csi_name))))
to_del = true;
}
diff --git a/osaf/services/saf/amf/amfnd/comp.cc
b/osaf/services/saf/amf/amfnd/comp.cc
--- a/osaf/services/saf/amf/amfnd/comp.cc
+++ b/osaf/services/saf/amf/amfnd/comp.cc
@@ -721,6 +721,11 @@ uint32_t avnd_comp_reg_prc(AVND_CB *cb,
/* update the comp reg params */
comp->reg_hdl = reg->hdl;
comp->reg_dest = *dest;
+ comp->version.releaseCode = reg->version.releaseCode;
+ comp->version.majorVersion = reg->version.majorVersion;
+ comp->version.minorVersion = reg->version.minorVersion;
+ TRACE("SAF version '%c'.'%u'.'%u'",comp->version.releaseCode,
+ comp->version.majorVersion, comp->version.minorVersion);
m_AVND_COMP_REG_SET(comp);
/* if proxied comp, do add to the pxied_list of pxy */
@@ -1893,6 +1898,41 @@ uint32_t avnd_comp_curr_info_del(AVND_CB
return rc;
}
+/**
+ * @brief Prepares CSI attribute change callback message for amfa with updated
values.
+ * Values are updated in csi_rec when AMFND gets it from AMFD.
+ *
+ * @param cbk_info (ptr to AVSV_AMF_CBK_INFO)
+ * @param comp (ptr to AVND_COMP)
+ * @param csi_rec(ptr to AVND_COMP_CSI_REC)
+ *
+ * @return true/false
+ */
+static void set_params_for_csi_attr_change_cbk(AVSV_AMF_CBK_INFO *cbk_info,
AVND_COMP *comp, AVND_COMP_CSI_REC *csi_rec)
+{
+ AVSV_CSI_ATTRS attr;
+
+ /* copy the attributes */
+ memset(&attr, 0, sizeof(AVSV_CSI_ATTRS));
+ if (csi_rec->attrs.number != 0) {
+ //Keeping consistency. Why AMFND is using malloc and calloc at
some places instead new?
+ attr.list = static_cast<AVSV_ATTR_NAME_VAL*>
+ (calloc(csi_rec->attrs.number,
sizeof(AVSV_ATTR_NAME_VAL)));
+ osafassert(attr.list != nullptr);
+
+ memcpy(attr.list, csi_rec->attrs.list,
+ sizeof(AVSV_ATTR_NAME_VAL)
*csi_rec->attrs.number);
+ attr.number = csi_rec->attrs.number;
+ }
+ /* fill the callback params */
+ cbk_info->type = AVSV_AMF_CSI_ATTR_CHANGE;
+ cbk_info->param.csi_attr_change.csi_name = csi_rec->name;
+ cbk_info->param.csi_attr_change.attrs = attr;
+ /* reset the attr */
+ attr.number = 0;
+ attr.list = 0;
+}
+
/****************************************************************************
Name : avnd_comp_cbk_send
@@ -2046,6 +2086,10 @@ uint32_t avnd_comp_cbk_send(AVND_CB *cb,
m_AVND_AMF_PXIED_COMP_CLEAN_CBK_FILL(*cbk_info, comp->name);
per = comp->pxied_clean_cbk_timeout;
break;
+ case AVSV_AMF_CSI_ATTR_CHANGE:
+ set_params_for_csi_attr_change_cbk(cbk_info, comp, csi_rec);
+ per = comp->csi_set_cbk_timeout;
+ break;
case AVSV_AMF_PG_TRACK:
default:
osafassert(0);
diff --git a/osaf/services/saf/amf/amfnd/compdb.cc
b/osaf/services/saf/amf/amfnd/compdb.cc
--- a/osaf/services/saf/amf/amfnd/compdb.cc
+++ b/osaf/services/saf/amf/amfnd/compdb.cc
@@ -1773,6 +1773,10 @@ static AVND_COMP *avnd_comp_create(const
comp->su = su;
comp->error_report_sent = false;
comp->admin_oper = false;
+ //Default SAF version.
+ comp->version.releaseCode = 'B';
+ comp->version.majorVersion = 0x01;
+ comp->version.minorVersion = 0x01;
if (true == su->su_is_external) {
m_AVND_COMP_TYPE_SET_EXT_CLUSTER(comp);
diff --git a/osaf/services/saf/amf/amfnd/err.cc
b/osaf/services/saf/amf/amfnd/err.cc
--- a/osaf/services/saf/amf/amfnd/err.cc
+++ b/osaf/services/saf/amf/amfnd/err.cc
@@ -96,7 +96,9 @@ static const char *g_comp_err[] = {
"csiRemovecallbackTimeout",
"csiSetcallbackFailed",
"csiRemovecallbackFailed",
- "qscingCompleteTimeout"
+ "qscingCompleteTimeout",
+ "csiAttributeChangeCallbackTimeout",
+ "csiAttributeChangeCallbackFailed"
};
static const char *g_comp_rcvr[] = {
diff --git a/osaf/services/saf/amf/amfnd/evt.cc
b/osaf/services/saf/amf/amfnd/evt.cc
--- a/osaf/services/saf/amf/amfnd/evt.cc
+++ b/osaf/services/saf/amf/amfnd/evt.cc
@@ -88,6 +88,7 @@ AVND_EVT *avnd_evt_create(AVND_CB *cb,
case AVND_EVT_AVD_ROLE_CHANGE_MSG:
case AVND_EVT_AVD_ADMIN_OP_REQ_MSG:
case AVND_EVT_AVD_REBOOT_MSG:
+ case AVND_EVT_AVD_COMPCSI_ASSIGN_MSG:
evt->info.avd = (AVSV_DND_MSG *)info;
break;
@@ -227,6 +228,7 @@ void avnd_evt_destroy(AVND_EVT *evt)
case AVND_EVT_AVD_ADMIN_OP_REQ_MSG:
case AVND_EVT_AVD_HEARTBEAT_MSG:
case AVND_EVT_AVD_REBOOT_MSG:
+ case AVND_EVT_AVD_COMPCSI_ASSIGN_MSG:
if (evt->info.avd)
avsv_dnd_msg_free(evt->info.avd);
break;
diff --git a/osaf/services/saf/amf/amfnd/include/avnd_cb.h
b/osaf/services/saf/amf/amfnd/include/avnd_cb.h
--- a/osaf/services/saf/amf/amfnd/include/avnd_cb.h
+++ b/osaf/services/saf/amf/amfnd/include/avnd_cb.h
@@ -32,6 +32,7 @@
*/
#ifndef AVND_CB_H
#define AVND_CB_H
+#include <map>
typedef struct avnd_cb_tag {
@@ -146,5 +147,6 @@ typedef struct avnd_cb_tag {
void cb_increment_su_failover_count(AVND_CB& cb, const AVND_SU& su);
extern AVND_CB *avnd_cb;
+extern std::map<MDS_DEST, MDS_SVC_PVT_SUB_PART_VER> agent_mds_ver_db;
#endif
diff --git a/osaf/services/saf/amf/amfnd/include/avnd_comp.h
b/osaf/services/saf/amf/amfnd/include/avnd_comp.h
--- a/osaf/services/saf/amf/amfnd/include/avnd_comp.h
+++ b/osaf/services/saf/amf/amfnd/include/avnd_comp.h
@@ -401,7 +401,7 @@ typedef struct avnd_comp_tag {
std::bitset<NumAttrs> *use_comptype_attr;
SaInvocationT term_cbq_inv_value; /* invocation value for termination
callback. */
-
+ SaVersionT version; //SAF version of comp.
} AVND_COMP;
#define AVND_COMP_NULL ((AVND_COMP *)0)
diff --git a/osaf/services/saf/amf/amfnd/include/avnd_err.h
b/osaf/services/saf/amf/amfnd/include/avnd_err.h
--- a/osaf/services/saf/amf/amfnd/include/avnd_err.h
+++ b/osaf/services/saf/amf/amfnd/include/avnd_err.h
@@ -68,6 +68,8 @@ typedef enum avnd_err_src {
AVND_ERR_SRC_CBK_CSI_REM_FAILED, /* AMF callback failed */
/* Add other sources of error detection */
AVND_ERR_SRC_QSCING_COMPL_TIMEOUT, /* AMF qscing complete times
out */
+ AVND_ERR_SRC_CBK_CSI_ATTR_CHANGE_TIMEOUT,/* CSI attr change callback
times out.*/
+ AVND_ERR_SRC_CBK_CSI_ATTR_CHANGE_FAILED, /* CSI attr change
callback failed.*/
AVND_ERR_SRC_MAX
} AVND_ERR_SRC;
diff --git a/osaf/services/saf/amf/amfnd/include/avnd_evt.h
b/osaf/services/saf/amf/amfnd/include/avnd_evt.h
--- a/osaf/services/saf/amf/amfnd/include/avnd_evt.h
+++ b/osaf/services/saf/amf/amfnd/include/avnd_evt.h
@@ -52,6 +52,7 @@ typedef enum avnd_evt_type {
AVND_EVT_AVD_ADMIN_OP_REQ_MSG,
AVND_EVT_AVD_HEARTBEAT_MSG,
AVND_EVT_AVD_REBOOT_MSG,
+ AVND_EVT_AVD_COMPCSI_ASSIGN_MSG,
AVND_EVT_AVD_MAX,
/* AvA event types */
diff --git a/osaf/services/saf/amf/amfnd/include/avnd_mds.h
b/osaf/services/saf/amf/amfnd/include/avnd_mds.h
--- a/osaf/services/saf/amf/amfnd/include/avnd_mds.h
+++ b/osaf/services/saf/amf/amfnd/include/avnd_mds.h
@@ -40,7 +40,7 @@
#define AVND_AVND_SUBPART_VER_MAX 1
#define AVND_AVA_SUBPART_VER_MIN 1
-#define AVND_AVA_SUBPART_VER_MAX 1
+#define AVND_AVA_SUBPART_VER_MAX 2
#define AVND_CLA_SUBPART_VER_MIN 1
#define AVND_CLA_SUBPART_VER_MAX 1
diff --git a/osaf/services/saf/amf/amfnd/include/avnd_su.h
b/osaf/services/saf/amf/amfnd/include/avnd_su.h
--- a/osaf/services/saf/amf/amfnd/include/avnd_su.h
+++ b/osaf/services/saf/amf/amfnd/include/avnd_su.h
@@ -49,6 +49,7 @@ struct avnd_cb_tag;
* not a part of SU-SI parameters. Concealing those params thru this typedef.
*/
typedef AVSV_D2N_INFO_SU_SI_ASSIGN_MSG_INFO AVND_SU_SI_PARAM;
+typedef AVSV_D2N_COMPCSI_ASSIGN_MSG_INFO AVND_COMP_CSI_PARAMS_INFO;
/* declaration clc event handler */
typedef uint32_t (*AVND_SU_PRES_FSM_FN) (struct avnd_cb_tag *, struct
avnd_su_tag *, AVND_COMP *);
@@ -422,4 +423,5 @@ bool all_csis_in_assigned_state(const AV
bool isAdminRestarted(const AVND_SU *su);
bool isFailed(const AVND_SU *su);
bool isRestartSet(const AVND_SU *su);
+uint32_t avnd_evt_avd_compcsi_evh(struct avnd_cb_tag *cb, struct avnd_evt_tag
*evt);
#endif
diff --git a/osaf/services/saf/amf/amfnd/main.cc
b/osaf/services/saf/amf/amfnd/main.cc
--- a/osaf/services/saf/amf/amfnd/main.cc
+++ b/osaf/services/saf/amf/amfnd/main.cc
@@ -68,6 +68,7 @@ extern const AVND_EVT_HDLR g_avnd_func_l
avnd_evt_avd_admin_op_req_evh, /* AVND_EVT_AVD_ADMIN_OP_REQ_MSG */
avnd_evt_avd_hb_evh, /* AVND_EVT_AVD_HEARTBEAT_MSG */
avnd_evt_avd_reboot_evh, /* /AVND_EVT_AVD_REBOOT_MSG */
+ avnd_evt_avd_compcsi_evh, //AVND_EVT_AVD_COMPCSI_ASSIGN_MSG
/* AvA event types */
avnd_evt_ava_finalize_evh, /* AVND_EVT_AVA_AMF_FINALIZE */
diff --git a/osaf/services/saf/amf/amfnd/mds.cc
b/osaf/services/saf/amf/amfnd/mds.cc
--- a/osaf/services/saf/amf/amfnd/mds.cc
+++ b/osaf/services/saf/amf/amfnd/mds.cc
@@ -56,7 +56,7 @@ const MDS_CLIENT_MSG_FORMAT_VER avnd_avn
};
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_1, AVSV_AVND_AVA_MSG_FMT_VER_2
};
/* static function declarations */
@@ -399,8 +399,11 @@ uint32_t avnd_mds_rcv(AVND_CB *cb, MDS_C
/* determine the event type */
switch (msg.type) {
case AVND_MSG_AVD:
- type = static_cast<AVND_EVT_TYPE>((msg.info.avd->msg_type -
AVSV_D2N_NODE_UP_MSG) + AVND_EVT_AVD_NODE_UP_MSG);
+ if (msg.info.avd->msg_type == AVSV_D2N_COMPCSI_ASSIGN_MSG)
+ type = AVND_EVT_AVD_COMPCSI_ASSIGN_MSG;
+ else
+ type =
static_cast<AVND_EVT_TYPE>((msg.info.avd->msg_type - AVSV_D2N_NODE_UP_MSG) +
AVND_EVT_AVD_NODE_UP_MSG);
break;
case AVND_MSG_AVA:
@@ -537,6 +540,7 @@ uint32_t avnd_mds_svc_evt(AVND_CB *cb, M
case NCSMDS_SVC_ID_AVA:
/* New AvA has come up. Dont do anything now */
+ agent_mds_ver_db[evt_info->i_dest] =
(MDS_SVC_PVT_SUB_PART_VER)evt_info->i_rem_svc_pvt_ver;
break;
case NCSMDS_SVC_ID_AVND:
@@ -583,6 +587,7 @@ uint32_t avnd_mds_svc_evt(AVND_CB *cb, M
break;
case NCSMDS_SVC_ID_AVA:
+ agent_mds_ver_db.erase(evt_info->i_dest);
evt = avnd_evt_create(cb, AVND_EVT_MDS_AVA_DN, 0,
&evt_info->i_dest, 0, 0, 0);
break;
@@ -779,7 +784,45 @@ uint32_t avnd_mds_flat_enc(AVND_CB *cb,
return rc;
}
-
+/**
+ * @brief Encodes 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 enc_csi_attr_change_cbk(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;
+ uint8_t *p8;
+ uint16_t len;
+ uint32_t rc = NCSCC_RC_SUCCESS, i;
+ SaStringT value = nullptr;
+ if (csi_attr_change->attrs.number == 0)
+ goto done;
+ for(i=0; i<csi_attr_change->attrs.number; i++) {
+ rc = ncs_encode_n_octets_in_uba(uba,
+ (uint8_t *)&csi_attr_change->attrs.list[i].name,
sizeof(SaNameT));
+ if (NCSCC_RC_SUCCESS != rc)
+ goto done;
+ if(!csi_attr_change->attrs.list[i].string_ptr) {
+ value = new
char[csi_attr_change->attrs.list[i].value.length+1]();
+ strcpy(value, (char
*)csi_attr_change->attrs.list[i].value.value);
+ } else {
+ value = csi_attr_change->attrs.list[i].string_ptr;
+ }
+ len = strlen(value);
+ p8 = ncs_enc_reserve_space(uba, 2);
+ ncs_encode_16bit(&p8, len);
+ ncs_enc_claim_space(uba, 2);
+ rc = ncs_encode_n_octets_in_uba(uba, (uint8_t *)value, (len +
1));
+ if (NCSCC_RC_SUCCESS != rc)
+ goto done;
+ }
+done:
+ return rc;
+}
/****************************************************************************
Name : avnd_mds_flat_ava_enc
@@ -820,6 +863,9 @@ uint32_t avnd_mds_flat_ava_enc(AVND_CB *
goto done;
switch (cbk_info->type) {
+ case AVSV_AMF_CSI_ATTR_CHANGE:
+ rc = enc_csi_attr_change_cbk(enc_info->io_uba,
ava);
+ break;
case AVSV_AMF_CSI_SET:
if (cbk_info->param.csi_set.attrs.number) {
for(i=0;
i<cbk_info->param.csi_set.attrs.number; i++) {
diff --git a/osaf/services/saf/amf/amfnd/su.cc
b/osaf/services/saf/amf/amfnd/su.cc
--- a/osaf/services/saf/amf/amfnd/su.cc
+++ b/osaf/services/saf/amf/amfnd/su.cc
@@ -869,3 +869,145 @@ bool isRestartSet(const AVND_SU *su)
{
return (m_AVND_SU_IS_RESTART(su));
}
+
+/**
+ * @brief Processes compcsi msg based on the action (msg_type).
+ * As of now only try to send csi attribute change callback.
+ * @param comp (ptr to AVND_COMP)
+ * @param csi_rec (ptr to AVND_COMP_CSI_REC)
+ * @param param (ptr to AVND_COMP_CSI_PARAMS_INFO)
+ *
+ * @return NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE.
+ */
+static uint32_t avnd_process_comp_csi_msg (AVND_COMP *comp, AVND_COMP_CSI_REC
*csi_rec,
+ AVND_COMP_CSI_PARAMS_INFO *param)
+{
+ uint32_t rc = NCSCC_RC_SUCCESS;
+ std::map<MDS_DEST, MDS_SVC_PVT_SUB_PART_VER>::iterator iter;
+
+ /*
+ Callback is sent in the following cases:
+ -a PI comp: CSI is assigned to this component.
+ -a proxied PI comp: callback is sent to its proxy.
+ -a proxied NPI:callback is sent to its proxy.
+ For a Non-proxied NPI comp, INSANTIATE command (CLC-CLI) will be
invoked.
+ Callback can be sent only when Agent version is B.04.02 in which
case
+ minimum MDS install version must be AVSV_AVND_AVA_MSG_FMT_VER_2.
+ */
+ if ((m_AVND_COMP_TYPE_IS_SAAWARE(comp)) ||
+ (m_AVND_COMP_TYPE_IS_PROXIED(comp) &&
+ m_AVND_COMP_TYPE_IS_PREINSTANTIABLE(comp))) {
+ iter = agent_mds_ver_db.find(csi_rec->comp->reg_dest);
+ if (iter == agent_mds_ver_db.end()) {
+ TRACE("Component is not registered");
+ rc = NCSCC_RC_FAILURE;
+ goto done;
+ }
+ if ((iter->second < AVSV_AVND_AVA_MSG_FMT_VER_2) ||
+ (comp->version.releaseCode != 'B') ||
+ (comp->version.majorVersion != 0x04) ||
+ (comp->version.minorVersion != 0x02)) {
+ TRACE("Component version is not B.04.02");
+ rc = NCSCC_RC_SUCCESS;
+ goto done;
+ }
+ }
+
+ switch (param->msg_act) {
+ case AVSV_COMPCSI_ATTR_CHANGE_AND_NO_ACK:
+ csi_rec->attrs.number = param->info.attrs.number;
+ csi_rec->attrs.list = param->info.attrs.list;
+ //do not take any action if comp is failed.
+ if (m_AVND_COMP_IS_FAILED(comp)) {
+ TRACE_2("Failed comp, not sending csi attrbute change
cbk.");
+ goto done;
+ }
+ //Do not issue callback if csi is being removed.
+ if (m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_REMOVING(csi_rec) ||
+ m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_REMOVED(csi_rec)) {
+ TRACE_2("CSI removing or removed, not sending csi
attrbute change cbk.");
+ goto done;
+ }
+
+ if (m_AVND_COMP_TYPE_IS_PROXIED(comp) ||
m_AVND_COMP_TYPE_IS_SAAWARE(comp)) {
+ TRACE_2("Proxied (NPI or PI) or a SA-Aware component.");
+ rc = avnd_comp_cbk_send(avnd_cb, comp,
AVSV_AMF_CSI_ATTR_CHANGE, 0, csi_rec);
+ } else {
+ //A NPI comp is terminated in quiesced and quiecing
state.
+ if
(!m_AVND_COMP_CSI_CURR_ASSIGN_STATE_IS_ASSIGNED(csi_rec) &&
+ (csi_rec->si->curr_state !=
SA_AMF_HA_ACTIVE)) {
+ TRACE_2("NPI comp in improper state, not
running inst command.");
+ goto done;
+ }
+ //ToDo for a NonProxied NPI component: Fine tuning of
success case and failure handling..
+ rc = avnd_comp_clc_cmd_execute(avnd_cb, comp,
AVND_COMP_CLC_CMD_TYPE_INSTANTIATE);
+ if (NCSCC_RC_SUCCESS == rc)
+ m_GET_TIME_STAMP(comp->clc_info.inst_cmd_ts);
+ }
+ if (NCSCC_RC_SUCCESS != rc)
+ goto done;
+ break;
+ default:
+ TRACE_LEAVE();
+ return NCSCC_RC_FAILURE;
+ break;
+ }
+done:
+ return rc;
+}
+
+/**
+ * @brief Processes compcsi message from AMFD.
+ * As of now expects only message for CSI attribute change.
+ * @param cb (ptr to AVND_CB)
+ * @param evt(ptr to AVND_EVT)
+ *
+ * @return NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE.
+ */
+uint32_t avnd_evt_avd_compcsi_evh(AVND_CB *cb, AVND_EVT *evt)
+{
+ AVND_COMP_CSI_PARAMS_INFO *compcsi_info =
&evt->info.avd->msg_info.d2n_compcsi_assign_msg_info;
+ AVND_COMP_CSI_REC *csi_rec = nullptr;
+ AVND_COMP *comp = nullptr;
+ //AVND_SU_SIQ_REC *siq = 0;
+ uint32_t rc = NCSCC_RC_SUCCESS;
+
+ TRACE_ENTER2("'%s', '%s', act:%u", compcsi_info->comp_name.value,
compcsi_info->csi_name.value,
+ compcsi_info->msg_act);
+ comp = m_AVND_COMPDB_REC_GET(cb->compdb, compcsi_info->comp_name);
+ if (!comp) {
+ LOG_ER("compcsi_evh: '%s' not found, action:%u",
+ compcsi_info->comp_name.value,
compcsi_info->msg_act);
+ goto done;
+ }
+
+ if ((cb->term_state == AVND_TERM_STATE_OPENSAF_SHUTDOWN_INITIATED) ||
+ (cb->term_state ==
AVND_TERM_STATE_OPENSAF_SHUTDOWN_STARTED)) {
+ LOG_NO("Shutting started : Ignoring re-assignment for
comp'%s'", comp->name.value);
+ goto done;
+ }
+
+ avnd_msgid_assert(compcsi_info->msg_id);
+ cb->rcv_msg_id = compcsi_info->msg_id;
+
+ csi_rec = avnd_compdb_csi_rec_get(cb, &compcsi_info->comp_name,
&compcsi_info->csi_name);
+ if (csi_rec == nullptr) {
+ TRACE("csi rec get Failed.");
+ rc = NCSCC_RC_FAILURE;
+ goto done;
+ }
+ if (cb->term_state == AVND_TERM_STATE_NODE_FAILOVER_TERMINATED) {
+ if (compcsi_info->msg_act ==
AVSV_COMPCSI_ATTR_CHANGE_AND_NO_ACK)
+ //A message witn no ack, no need to respond to AFMD.
+ TRACE_2("AVND is in failover escalation, not sending
csi attrbute change cbk.");
+ goto done;
+ } else {
+ rc = avnd_process_comp_csi_msg(comp, csi_rec, compcsi_info);
+ }
+
+done:
+ TRACE_LEAVE2("%u", rc);
+ return rc;
+}
+
+
diff --git a/osaf/services/saf/amf/amfnd/util.cc
b/osaf/services/saf/amf/amfnd/util.cc
--- a/osaf/services/saf/amf/amfnd/util.cc
+++ b/osaf/services/saf/amf/amfnd/util.cc
@@ -564,6 +564,33 @@ uint32_t amf_cbk_copy(AVSV_AMF_CBK_INFO
}
break;
+ case AVSV_AMF_CSI_ATTR_CHANGE:
+ memset(&(*o_dcbk)->param.csi_attr_change.csi_name, 0,
sizeof(SaNameT));
+ /* memset avsv & amf csi attr lists */
+ memset(&(*o_dcbk)->param.csi_attr_change.attrs, 0,
sizeof(AVSV_CSI_ATTRS));
+ memset(&(*o_dcbk)->param.csi_attr_change.csiAttr, 0,
sizeof(SaAmfCSIAttributeListT));
+ memcpy(&(*o_dcbk)->param.csi_attr_change.csi_name.value,
+
scbk->param.csi_attr_change.csi_name.value,scbk->param.csi_attr_change.csi_name.length);
+ /* copy the avsv csi attr list */
+ if (scbk->param.csi_attr_change.attrs.number > 0) {
+ (*o_dcbk)->param.csi_attr_change.attrs.list =
static_cast<AVSV_ATTR_NAME_VAL*>
+
(calloc(scbk->param.csi_attr_change.attrs.number, sizeof(AVSV_ATTR_NAME_VAL)));
+ osafassert((*o_dcbk)->param.csi_attr_change.attrs.list
!= nullptr);
+
+ for (uint32_t i = 0; i <
scbk->param.csi_attr_change.attrs.number; ++i) {
+ (*o_dcbk)->param.csi_attr_change.attrs.list[i] =
+
scbk->param.csi_attr_change.attrs.list[i];
+ }
+ (*o_dcbk)->param.csi_attr_change.attrs.number =
scbk->param.csi_attr_change.attrs.number;
+ }
+
+ /* copy the amf csi attr list */
+ if (scbk->param.csi_attr_change.csiAttr.number > 0) {
+
amf_csi_attr_list_copy(&(*o_dcbk)->param.csi_attr_change.csiAttr,
+ &scbk->param.csi_attr_change.csiAttr);
+ }
+ break;
+
case AVSV_AMF_CSI_SET:
/* memset avsv & amf csi attr lists */
memset(&(*o_dcbk)->param.csi_set.attrs, 0,
sizeof(AVSV_CSI_ATTRS));
@@ -637,7 +664,16 @@ void amf_cbk_free(AVSV_AMF_CBK_INFO *cbk
/* free the amf csi attr list */
amf_csi_attr_list_free(&cbk_info->param.csi_set.csi_desc.csiAttr);
break;
-
+ case AVSV_AMF_CSI_ATTR_CHANGE:
+ /* free the avsv csi attr list */
+ if (cbk_info->param.csi_attr_change.attrs.number > 0) {
+ // AVSV_ATTR_NAME_VAL variables
+ // are malloc'ed, use free()
+ free(cbk_info->param.csi_attr_change.attrs.list);
+ }
+ /* free the amf csi attr list */
+
amf_csi_attr_list_free(&cbk_info->param.csi_attr_change.csiAttr);
+ break;
default:
break;
}
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel