Nack.
Following points needs to be considered.
1. As there is a change in messaging change with the AVD, You should
bump up the AVD MDS Sub part version.
2. As there is no change in AVND messaging, its MDS sub part version
should not be changed.
Attached is modified patch.
I had tested 4.3 as active and 4.3+patch as standby and did couple of
switchovers and failovers(vice versa).
Can you also please run your tests with this patch and let me know the
results?
Regards
Surya
On Monday 07 April 2014 11:05 AM, Hans Feldt wrote:
osaf/libs/common/avsv/avsv_d2nedu.c | 35 ++++++++++-------
osaf/libs/common/avsv/include/avsv_d2nmsg.h | 5 +-
osaf/services/saf/avsv/avd/avd_mds.c | 11 +++--
osaf/services/saf/avsv/avd/avd_util.c | 1 +
osaf/services/saf/avsv/avd/include/avd_mds.h | 2 +-
osaf/services/saf/avsv/avnd/avnd_mds.c | 33 +++++++++++++---
osaf/services/saf/avsv/avnd/avnd_sidb.c | 42 +-------------------
osaf/services/saf/avsv/avnd/avnd_su.c | 51 ++++++++++++++++++++++++-
osaf/services/saf/avsv/avnd/include/avnd_evt.h | 1 +
osaf/services/saf/avsv/avnd/include/avnd_mds.h | 5 ++-
10 files changed, 114 insertions(+), 72 deletions(-)
amfnd process aborted in immutils and node rebooted by amf watchdog with the
following log:
2013-09-09 11:50:02 osafamfnd SC-2-1 err osafamfnd[5336]: saImmOmInitialize
FAILED, rc = 5
When the AMF node director receives a SUSI ASGN message, it reads SI rank
from IMM. If IMM does not respond in a timely manner the amfnd process will be
aborted and the node restarted by the AMF watchdog.
By including SI rank (an int) in the SUSI ASGN msg, the read from IMM can be
skipped/done conditionally based on the amfnd MDS version.
diff --git a/osaf/libs/common/avsv/avsv_d2nedu.c
b/osaf/libs/common/avsv/avsv_d2nedu.c
--- a/osaf/libs/common/avsv/avsv_d2nedu.c
+++ b/osaf/libs/common/avsv/avsv_d2nedu.c
@@ -56,6 +56,7 @@ uint32_t avsv_edp_dnd_msg(EDU_HDL *hdl,
uint32_t rc = NCSCC_RC_SUCCESS;
AVSV_DND_MSG *struct_ptr = NULL, **d_ptr = NULL;
uint16_t ver3 = AVSV_AVD_AVND_MSG_FMT_VER_3;
+ uint16_t ver5 = AVSV_AVD_AVND_MSG_FMT_VER_5;
EDU_INST_SET avsv_dnd_msg_rules[] = {
{EDU_START, avsv_edp_dnd_msg, 0, 0, 0,
@@ -217,6 +218,12 @@ uint32_t avsv_edp_dnd_msg(EDU_HDL *hdl,
(long)&((AVSV_DND_MSG *)0)->msg_info.d2n_su_si_assign.su_name,
0, NULL},
{EDU_EXEC, ncs_edp_sanamet, 0, 0, 0,
(long)&((AVSV_DND_MSG *)0)->msg_info.d2n_su_si_assign.si_name,
0, NULL},
+
+ /* Include SI rank in version 5 and higher */
+ {EDU_VER_GE, NULL, 0, 0, 2, 0, 0, (EDU_EXEC_RTINE)((uint16_t
*)(&(ver5)))},
+ {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
+ (long)&((AVSV_DND_MSG *)0)->msg_info.d2n_su_si_assign.si_rank,
0, NULL},
+
{EDU_EXEC, m_NCS_EDP_SAAMFHASTATET, 0, 0, 0,
(long)&((AVSV_DND_MSG
*)0)->msg_info.d2n_su_si_assign.ha_state, 0, NULL},
{EDU_VER_GE, NULL, 0, 0, 2, 0, 0, (EDU_EXEC_RTINE)((uint16_t
*)(&(ver3)))},
@@ -410,20 +417,20 @@ int avsv_dnd_msg_test_type_fnc(NCSCONTEX
LCL_JMP_OFFSET_AVSV_D2N_REG_SU_MSG = 48,
LCL_JMP_OFFSET_AVSV_D2N_REG_COMP_MSG = 53,
LCL_JMP_OFFSET_AVSV_D2N_INFO_SU_SI_ASSIGN_MSG = 58,
- LCL_JMP_OFFSET_AVSV_D2N_PG_TRACK_ACT_RSP_MSG = 68,
- LCL_JMP_OFFSET_AVSV_D2N_PG_UPD_MSG = 75,
- LCL_JMP_OFFSET_AVSV_D2N_OPERATION_REQUEST_MSG = 79,
- LCL_JMP_OFFSET_AVSV_D2N_PRESENCE_SU_MSG = 82,
- LCL_JMP_OFFSET_AVSV_D2N_DATA_VERIFY_MSG = 86,
- LCL_JMP_OFFSET_AVSV_D2N_DATA_ACK_MSG = 91,
- LCL_JMP_OFFSET_AVSV_D2N_SHUTDOWN_APP_SU_MSG = 93,
- LCL_JMP_OFFSET_AVSV_D2N_SET_LEDS_MSG = 95,
- LCL_JMP_OFFSET_AVSV_N2D_COMP_VALID_MSG = 97,
- LCL_JMP_OFFSET_AVSV_D2N_COMP_VALID_RESP_MSG = 105,
- LCL_JMP_OFFSET_AVSV_D2N_ROLE_CHANGE_MSG = 109,
- LCL_JMP_OFFSET_AVSV_D2N_ADMIN_OP_REQ_MSG = 112,
- LCL_JMP_OFFSET_AVSV_D2N_HEARTBEAT_MSG = 116,
- LCL_JMP_OFFSET_AVSV_D2N_REBOOT_MSG = 117
+ LCL_JMP_OFFSET_AVSV_D2N_PG_TRACK_ACT_RSP_MSG = 70,
+ LCL_JMP_OFFSET_AVSV_D2N_PG_UPD_MSG = 77,
+ LCL_JMP_OFFSET_AVSV_D2N_OPERATION_REQUEST_MSG = 81,
+ LCL_JMP_OFFSET_AVSV_D2N_PRESENCE_SU_MSG = 84,
+ LCL_JMP_OFFSET_AVSV_D2N_DATA_VERIFY_MSG = 88,
+ LCL_JMP_OFFSET_AVSV_D2N_DATA_ACK_MSG = 93,
+ LCL_JMP_OFFSET_AVSV_D2N_SHUTDOWN_APP_SU_MSG = 95,
+ LCL_JMP_OFFSET_AVSV_D2N_SET_LEDS_MSG = 97,
+ LCL_JMP_OFFSET_AVSV_N2D_COMP_VALID_MSG = 99,
+ LCL_JMP_OFFSET_AVSV_D2N_COMP_VALID_RESP_MSG = 107,
+ LCL_JMP_OFFSET_AVSV_D2N_ROLE_CHANGE_MSG = 111,
+ LCL_JMP_OFFSET_AVSV_D2N_ADMIN_OP_REQ_MSG = 114,
+ LCL_JMP_OFFSET_AVSV_D2N_HEARTBEAT_MSG = 118,
+ LCL_JMP_OFFSET_AVSV_D2N_REBOOT_MSG = 119
};
AVSV_DND_MSG_TYPE type;
diff --git a/osaf/libs/common/avsv/include/avsv_d2nmsg.h b/osaf/libs/common/avsv/include/avsv_d2nmsg.h
--- a/osaf/libs/common/avsv/include/avsv_d2nmsg.h
+++ b/osaf/libs/common/avsv/include/avsv_d2nmsg.h
@@ -39,14 +39,12 @@
#include <avsv_defs.h>
#include <stdbool.h>
-/* In Service upgrade support */
-#define AVND_MDS_SUB_PART_VERSION 4
-
/* Message format versions */
#define AVSV_AVD_AVND_MSG_FMT_VER_1 1
#define AVSV_AVD_AVND_MSG_FMT_VER_2 2
#define AVSV_AVD_AVND_MSG_FMT_VER_3 3
#define AVSV_AVD_AVND_MSG_FMT_VER_4 4
+#define AVSV_AVD_AVND_MSG_FMT_VER_5 5
/* Internode/External Components Validation result */
typedef enum {
@@ -470,6 +468,7 @@ typedef struct avsv_d2n_info_su_si_assig
bool single_csi; /* To differentiate single csi assignment from SI
assignment.*/
uint32_t num_assigns;
AVSV_SUSI_ASGN *list;
+ uint32_t si_rank;
} AVSV_D2N_INFO_SU_SI_ASSIGN_MSG_INFO;
typedef struct avsv_d2n_pg_track_act_rsp_msg_info_tag {
diff --git a/osaf/services/saf/avsv/avd/avd_mds.c
b/osaf/services/saf/avsv/avd/avd_mds.c
--- a/osaf/services/saf/avsv/avd/avd_mds.c
+++ b/osaf/services/saf/avsv/avd/avd_mds.c
@@ -42,14 +42,17 @@
#include <avd_msg.h>
#include "avd.h"
-const MDS_CLIENT_MSG_FORMAT_VER avd_avnd_msg_fmt_map_table[AVD_AVND_SUBPART_VER_MAX] = {
+const MDS_CLIENT_MSG_FORMAT_VER avd_avnd_msg_fmt_map_table[] = {
AVSV_AVD_AVND_MSG_FMT_VER_1, AVSV_AVD_AVND_MSG_FMT_VER_2,
- AVSV_AVD_AVND_MSG_FMT_VER_3, AVSV_AVD_AVND_MSG_FMT_VER_4};
+ AVSV_AVD_AVND_MSG_FMT_VER_3, AVSV_AVD_AVND_MSG_FMT_VER_4,
+ AVSV_AVD_AVND_MSG_FMT_VER_5
+};
-const MDS_CLIENT_MSG_FORMAT_VER avd_avd_msg_fmt_map_table[AVD_AVD_SUBPART_VER_MAX] = {
+const MDS_CLIENT_MSG_FORMAT_VER avd_avd_msg_fmt_map_table[] = {
AVD_AVD_MSG_FMT_VER_1, AVD_AVD_MSG_FMT_VER_2,
AVD_AVD_MSG_FMT_VER_3, AVD_AVD_MSG_FMT_VER_4,
- AVD_AVD_MSG_FMT_VER_5};
+ AVD_AVD_MSG_FMT_VER_5
+};
/* fwd decl */
diff --git a/osaf/services/saf/avsv/avd/avd_util.c b/osaf/services/saf/avsv/avd/avd_util.c
--- a/osaf/services/saf/avsv/avd/avd_util.c
+++ b/osaf/services/saf/avsv/avd/avd_util.c
@@ -930,6 +930,7 @@ uint32_t avd_snd_susi_msg(AVD_CL_CB *cb,
susi_msg->msg_info.d2n_su_si_assign.si_name = susi->si->name;
susi_msg->msg_info.d2n_su_si_assign.ha_state = susi->state;
+ susi_msg->msg_info.d2n_su_si_assign.si_rank =
susi->si->saAmfSIRank;
/* Fill the SU SI pointer to l_susi which will be used from now
* for information related to this SU SI
diff --git a/osaf/services/saf/avsv/avd/include/avd_mds.h
b/osaf/services/saf/avsv/avd/include/avd_mds.h
--- a/osaf/services/saf/avsv/avd/include/avd_mds.h
+++ b/osaf/services/saf/avsv/avd/include/avd_mds.h
@@ -36,7 +36,7 @@
#define AVD_MDS_SUB_PART_VERSION 5
#define AVD_AVND_SUBPART_VER_MIN 1
-#define AVD_AVND_SUBPART_VER_MAX 4
+#define AVD_AVND_SUBPART_VER_MAX 5
#define AVD_AVD_SUBPART_VER_MIN 1
#define AVD_AVD_SUBPART_VER_MAX 5
diff --git a/osaf/services/saf/avsv/avnd/avnd_mds.c
b/osaf/services/saf/avsv/avnd/avnd_mds.c
--- a/osaf/services/saf/avsv/avnd/avnd_mds.c
+++ b/osaf/services/saf/avsv/avnd/avnd_mds.c
@@ -37,11 +37,27 @@
#include "avsv_n2avaedu.h"
#include "ncsencdec_pub.h"
-const MDS_CLIENT_MSG_FORMAT_VER avnd_avd_msg_fmt_map_table[AVND_AVD_SUBPART_VER_MAX] =
- { AVSV_AVD_AVND_MSG_FMT_VER_1, AVSV_AVD_AVND_MSG_FMT_VER_2,
AVSV_AVD_AVND_MSG_FMT_VER_3, AVSV_AVD_AVND_MSG_FMT_VER_4};
-const MDS_CLIENT_MSG_FORMAT_VER
avnd_avnd_msg_fmt_map_table[AVND_AVND_SUBPART_VER_MAX] =
- { AVSV_AVND_AVND_MSG_FMT_VER_1 };
-const MDS_CLIENT_MSG_FORMAT_VER
avnd_ava_msg_fmt_map_table[AVND_AVA_SUBPART_VER_MAX] = {
AVSV_AVND_AVA_MSG_FMT_VER_1 };
+/* messages to director */
+const MDS_CLIENT_MSG_FORMAT_VER avnd_avd_msg_fmt_map_table[] = {
+ AVSV_AVD_AVND_MSG_FMT_VER_1, AVSV_AVD_AVND_MSG_FMT_VER_2,
+ AVSV_AVD_AVND_MSG_FMT_VER_3, AVSV_AVD_AVND_MSG_FMT_VER_4,
+ AVSV_AVD_AVND_MSG_FMT_VER_4
+};
+
+/* messages from director */
+const MDS_CLIENT_MSG_FORMAT_VER avd_avnd_msg_fmt_map_table[] = {
+ AVSV_AVD_AVND_MSG_FMT_VER_1, AVSV_AVD_AVND_MSG_FMT_VER_2,
+ AVSV_AVD_AVND_MSG_FMT_VER_3, AVSV_AVD_AVND_MSG_FMT_VER_4,
+ AVSV_AVD_AVND_MSG_FMT_VER_5
+};
+
+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
+};
/* static function declarations */
@@ -507,6 +523,9 @@ uint32_t avnd_mds_rcv(AVND_CB *cb, MDS_C
goto done;
}
+ /* save the msg version for possible later use in event handlers */
+ evt->msg_fmt_ver = rcv_info->i_msg_fmt_ver;
+
/* nullify the msg as it is used in the event */
memset(&msg, 0, sizeof(AVND_MSG));
@@ -971,7 +990,7 @@ uint32_t avnd_mds_dec(AVND_CB *cb, MDS_C
case NCSMDS_SVC_ID_AVD:
if (!m_NCS_MSG_FORMAT_IS_VALID(dec_info->i_msg_fmt_ver,
AVND_AVD_SUBPART_VER_MIN,
- AVND_AVD_SUBPART_VER_MAX,
avnd_avd_msg_fmt_map_table)) {
+ AVND_AVD_SUBPART_VER_MAX,
avd_avnd_msg_fmt_map_table)) {
LOG_ER("%s,%u: wrong msg fmt not valid %u",
__FUNCTION__, __LINE__,
dec_info->i_msg_fmt_ver);
return NCSCC_RC_FAILURE;
@@ -1067,7 +1086,7 @@ uint32_t avnd_mds_flat_dec(AVND_CB *cb,
case NCSMDS_SVC_ID_AVD:
if (!m_NCS_MSG_FORMAT_IS_VALID(dec_info->i_msg_fmt_ver,
AVND_AVD_SUBPART_VER_MIN,
- AVND_AVD_SUBPART_VER_MAX,
avnd_avd_msg_fmt_map_table)) {
+ AVND_AVD_SUBPART_VER_MAX,
avd_avnd_msg_fmt_map_table)) {
LOG_ER("%s,%u: wrong msg fmt not valid %u",
__FUNCTION__, __LINE__,
dec_info->i_msg_fmt_ver);
return NCSCC_RC_FAILURE;
diff --git a/osaf/services/saf/avsv/avnd/avnd_sidb.c
b/osaf/services/saf/avsv/avnd/avnd_sidb.c
--- a/osaf/services/saf/avsv/avnd/avnd_sidb.c
+++ b/osaf/services/saf/avsv/avnd/avnd_sidb.c
@@ -139,43 +139,6 @@ AVND_SU_SI_REC *avnd_silist_getlast(void
return NULL;
}
-/**
- * Return SI rank read from IMM
- *
- * @param dn DN of SI
- *
- * @return rank of SI or -1 if not configured for SI
- */
-static uint32_t get_sirank(const SaNameT *dn)
-{
- SaAisErrorT error;
- SaImmAccessorHandleT accessorHandle;
- const SaImmAttrValuesT_2 **attributes;
- SaImmAttrNameT attributeNames[2] = {"saAmfSIRank", NULL};
- SaImmHandleT immOmHandle;
- SaVersionT immVersion = {'A', 2, 1};
- uint32_t rank = -1; // lowest possible rank if uninitialized
-
- immutil_saImmOmInitialize(&immOmHandle, NULL, &immVersion);
- immutil_saImmOmAccessorInitialize(immOmHandle, &accessorHandle);
-
- osafassert((error = immutil_saImmOmAccessorGet_2(accessorHandle, dn,
- attributeNames, (SaImmAttrValuesT_2 ***)&attributes)) ==
SA_AIS_OK);
-
- osafassert((error = immutil_getAttr(attributeNames[0], attributes, 0,
&rank)) == SA_AIS_OK);
-
- // saAmfSIRank attribute has a default value of zero (returned by IMM)
- if (rank == 0) {
- // Unconfigured ranks are treated as lowest possible rank
- rank = -1;
- }
-
- immutil_saImmOmAccessorFinalize(accessorHandle);
- immutil_saImmOmFinalize(immOmHandle);
-
- return rank;
-}
-
/****************************************************************************
Name : avnd_su_si_rec_add
@@ -220,6 +183,7 @@ AVND_SU_SI_REC *avnd_su_si_rec_add(AVND_
*/
/* update the si-name (key) */
memcpy(&si_rec->name, ¶m->si_name, sizeof(SaNameT));
+ si_rec->rank = param->si_rank;
si_rec->curr_state = param->ha_state;
/*
@@ -247,7 +211,6 @@ AVND_SU_SI_REC *avnd_su_si_rec_add(AVND_
/* Add to global SI list sorted by rank if appl SU */
if (!su->is_ncs) {
uint32_t res;
- si_rec->rank = get_sirank(¶m->si_name);
si_rec->cb_dll_node.key = (uint8_t *)&si_rec->rank;
res = ncs_db_link_list_add(&cb->si_list, &si_rec->cb_dll_node);
osafassert(res == NCSCC_RC_SUCCESS);
@@ -268,7 +231,8 @@ AVND_SU_SI_REC *avnd_su_si_rec_add(AVND_
csi_param = csi_param->next;
}
- TRACE_1("SU-SI record added, SU= %s : SI=%s",param->su_name.value,param->si_name.value);
+ TRACE_1("SU-SI record added, '%s', '%s', rank:%u", param->su_name.value,
+ param->si_name.value, si_rec->rank);
return si_rec;
err:
diff --git a/osaf/services/saf/avsv/avnd/avnd_su.c
b/osaf/services/saf/avsv/avnd/avnd_su.c
--- a/osaf/services/saf/avsv/avnd/avnd_su.c
+++ b/osaf/services/saf/avsv/avnd/avnd_su.c
@@ -33,6 +33,7 @@
#include <logtrace.h>
#include <avnd.h>
+#include <immutil.h>
static uint32_t avnd_avd_su_update_on_fover(AVND_CB *cb, AVSV_D2N_REG_SU_MSG_INFO *info);
@@ -224,6 +225,47 @@ static void handle_su_si_assign_in_term_
}
}
+/**
+ * Return SI rank read from IMM
+ *
+ * @param dn DN of SI
+ *
+ * @return rank of SI or -1 if not configured for SI
+ */
+static uint32_t get_sirank(const SaNameT *dn)
+{
+ SaAisErrorT error;
+ SaImmAccessorHandleT accessorHandle;
+ const SaImmAttrValuesT_2 **attributes;
+ SaImmAttrNameT attributeNames[2] = {"saAmfSIRank", NULL};
+ SaImmHandleT immOmHandle;
+ SaVersionT immVersion = {'A', 2, 1};
+ uint32_t rank = -1; // lowest possible rank if uninitialized
+
+ // TODO remove, just for test
+ LOG_NO("get_sirank %s", dn->value);
+
+ TRACE_ENTER2("%s", dn->value);
+ immutil_saImmOmInitialize(&immOmHandle, NULL, &immVersion);
+ immutil_saImmOmAccessorInitialize(immOmHandle, &accessorHandle);
+
+ osafassert((error = immutil_saImmOmAccessorGet_2(accessorHandle, dn,
+ attributeNames, (SaImmAttrValuesT_2 ***)&attributes)) ==
SA_AIS_OK);
+
+ osafassert((error = immutil_getAttr(attributeNames[0], attributes, 0,
&rank)) == SA_AIS_OK);
+
+ // saAmfSIRank attribute has a default value of zero (returned by IMM)
+ if (rank == 0) {
+ // Unconfigured ranks are treated as lowest possible rank
+ rank = -1;
+ }
+
+ immutil_saImmOmAccessorFinalize(accessorHandle);
+ immutil_saImmOmFinalize(immOmHandle);
+
+ return rank;
+}
+
/****************************************************************************
Name : avnd_evt_avd_info_su_si_assign_msg
@@ -263,9 +305,12 @@ uint32_t avnd_evt_avd_info_su_si_assign_
avnd_msgid_assert(info->msg_id);
cb->rcv_msg_id = info->msg_id;
- if ((info->msg_act == AVSV_SUSI_ACT_DEL) ||
- (info->msg_act == AVSV_SUSI_ACT_MOD)) {
-
+ if (info->msg_act == AVSV_SUSI_ACT_ASGN) {
+ /* SI rank was introduced in version 5 of the amfnd protocol,
if the
+ * message version is older then that, read SI rank from IMM */
+ if (evt->msg_fmt_ver < 5)
+ info->si_rank = get_sirank(&info->si_name);
+ } else {
if (info->si_name.length > 0) {
if (avnd_su_si_rec_get(cb, &info->su_name,
&info->si_name) == NULL)
LOG_ER("susi_assign_evh: '%s' is not assigned to
'%s'",
diff --git a/osaf/services/saf/avsv/avnd/include/avnd_evt.h
b/osaf/services/saf/avsv/avnd/include/avnd_evt.h
--- a/osaf/services/saf/avsv/avnd/include/avnd_evt.h
+++ b/osaf/services/saf/avsv/avnd/include/avnd_evt.h
@@ -159,6 +159,7 @@ typedef struct avnd_pm_mon_evt {
typedef struct avnd_evt_tag {
struct avnd_evt_tag *next;
MDS_SYNC_SND_CTXT mds_ctxt;
+ MDS_CLIENT_MSG_FORMAT_VER msg_fmt_ver;
NCS_IPC_PRIORITY priority;
AVND_EVT_TYPE type;
diff --git a/osaf/services/saf/avsv/avnd/include/avnd_mds.h b/osaf/services/saf/avsv/avnd/include/avnd_mds.h
--- a/osaf/services/saf/avsv/avnd/include/avnd_mds.h
+++ b/osaf/services/saf/avsv/avnd/include/avnd_mds.h
@@ -30,8 +30,11 @@
#ifndef AVND_MDS_H
#define AVND_MDS_H
+/* In Service upgrade support */
+#define AVND_MDS_SUB_PART_VERSION 5
+
#define AVND_AVD_SUBPART_VER_MIN 1
-#define AVND_AVD_SUBPART_VER_MAX 4
+#define AVND_AVD_SUBPART_VER_MAX 5
#define AVND_AVND_SUBPART_VER_MIN 1
#define AVND_AVND_SUBPART_VER_MAX 1
------------------------------------------------------------------------------
Put Bad Developers to Shame
Dominate Development with Jenkins Continuous Integration
Continuously Automate Build, Test & Deployment
Start a new project now. Try Jenkins in the cloud.
http://p.sf.net/sfu/13600_Cloudbees_APR
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel
diff --git a/osaf/libs/common/avsv/avsv_d2nedu.c b/osaf/libs/common/avsv/avsv_d2nedu.c
--- a/osaf/libs/common/avsv/avsv_d2nedu.c
+++ b/osaf/libs/common/avsv/avsv_d2nedu.c
@@ -56,6 +56,7 @@ uint32_t avsv_edp_dnd_msg(EDU_HDL *hdl,
uint32_t rc = NCSCC_RC_SUCCESS;
AVSV_DND_MSG *struct_ptr = NULL, **d_ptr = NULL;
uint16_t ver3 = AVSV_AVD_AVND_MSG_FMT_VER_3;
+ uint16_t ver5 = AVSV_AVD_AVND_MSG_FMT_VER_5;
EDU_INST_SET avsv_dnd_msg_rules[] = {
{EDU_START, avsv_edp_dnd_msg, 0, 0, 0,
@@ -217,6 +218,12 @@ uint32_t avsv_edp_dnd_msg(EDU_HDL *hdl,
(long)&((AVSV_DND_MSG *)0)->msg_info.d2n_su_si_assign.su_name, 0, NULL},
{EDU_EXEC, ncs_edp_sanamet, 0, 0, 0,
(long)&((AVSV_DND_MSG *)0)->msg_info.d2n_su_si_assign.si_name, 0, NULL},
+
+ /* Include SI rank in version 5 and higher */
+ {EDU_VER_GE, NULL, 0, 0, 2, 0, 0, (EDU_EXEC_RTINE)((uint16_t *)(&(ver5)))},
+ {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
+ (long)&((AVSV_DND_MSG *)0)->msg_info.d2n_su_si_assign.si_rank, 0, NULL},
+
{EDU_EXEC, m_NCS_EDP_SAAMFHASTATET, 0, 0, 0,
(long)&((AVSV_DND_MSG *)0)->msg_info.d2n_su_si_assign.ha_state, 0, NULL},
{EDU_VER_GE, NULL, 0, 0, 2, 0, 0, (EDU_EXEC_RTINE)((uint16_t *)(&(ver3)))},
@@ -410,20 +417,20 @@ int avsv_dnd_msg_test_type_fnc(NCSCONTEX
LCL_JMP_OFFSET_AVSV_D2N_REG_SU_MSG = 48,
LCL_JMP_OFFSET_AVSV_D2N_REG_COMP_MSG = 53,
LCL_JMP_OFFSET_AVSV_D2N_INFO_SU_SI_ASSIGN_MSG = 58,
- LCL_JMP_OFFSET_AVSV_D2N_PG_TRACK_ACT_RSP_MSG = 68,
- LCL_JMP_OFFSET_AVSV_D2N_PG_UPD_MSG = 75,
- LCL_JMP_OFFSET_AVSV_D2N_OPERATION_REQUEST_MSG = 79,
- LCL_JMP_OFFSET_AVSV_D2N_PRESENCE_SU_MSG = 82,
- LCL_JMP_OFFSET_AVSV_D2N_DATA_VERIFY_MSG = 86,
- LCL_JMP_OFFSET_AVSV_D2N_DATA_ACK_MSG = 91,
- LCL_JMP_OFFSET_AVSV_D2N_SHUTDOWN_APP_SU_MSG = 93,
- LCL_JMP_OFFSET_AVSV_D2N_SET_LEDS_MSG = 95,
- LCL_JMP_OFFSET_AVSV_N2D_COMP_VALID_MSG = 97,
- LCL_JMP_OFFSET_AVSV_D2N_COMP_VALID_RESP_MSG = 105,
- LCL_JMP_OFFSET_AVSV_D2N_ROLE_CHANGE_MSG = 109,
- LCL_JMP_OFFSET_AVSV_D2N_ADMIN_OP_REQ_MSG = 112,
- LCL_JMP_OFFSET_AVSV_D2N_HEARTBEAT_MSG = 116,
- LCL_JMP_OFFSET_AVSV_D2N_REBOOT_MSG = 117
+ LCL_JMP_OFFSET_AVSV_D2N_PG_TRACK_ACT_RSP_MSG = 70,
+ LCL_JMP_OFFSET_AVSV_D2N_PG_UPD_MSG = 77,
+ LCL_JMP_OFFSET_AVSV_D2N_OPERATION_REQUEST_MSG = 81,
+ LCL_JMP_OFFSET_AVSV_D2N_PRESENCE_SU_MSG = 84,
+ LCL_JMP_OFFSET_AVSV_D2N_DATA_VERIFY_MSG = 88,
+ LCL_JMP_OFFSET_AVSV_D2N_DATA_ACK_MSG = 93,
+ LCL_JMP_OFFSET_AVSV_D2N_SHUTDOWN_APP_SU_MSG = 95,
+ LCL_JMP_OFFSET_AVSV_D2N_SET_LEDS_MSG = 97,
+ LCL_JMP_OFFSET_AVSV_N2D_COMP_VALID_MSG = 99,
+ LCL_JMP_OFFSET_AVSV_D2N_COMP_VALID_RESP_MSG = 107,
+ LCL_JMP_OFFSET_AVSV_D2N_ROLE_CHANGE_MSG = 111,
+ LCL_JMP_OFFSET_AVSV_D2N_ADMIN_OP_REQ_MSG = 114,
+ LCL_JMP_OFFSET_AVSV_D2N_HEARTBEAT_MSG = 118,
+ LCL_JMP_OFFSET_AVSV_D2N_REBOOT_MSG = 119
};
AVSV_DND_MSG_TYPE type;
@@ -568,6 +575,7 @@ uint32_t avsv_edp_su_info_msg(EDU_HDL *h
uint32_t rc = NCSCC_RC_SUCCESS;
AVSV_SU_INFO_MSG *struct_ptr = NULL, **d_ptr = NULL;
uint16_t ver2 = AVSV_AVD_AVND_MSG_FMT_VER_2;
+ uint16_t ver5 = AVSV_AVD_AVND_MSG_FMT_VER_5;
EDU_INST_SET avsv_su_info_msg_rules[] = {
{EDU_START, avsv_edp_su_info_msg, EDQ_LNKLIST, 0, 0,
@@ -588,11 +596,16 @@ uint32_t avsv_edp_su_info_msg(EDU_HDL *h
{EDU_EXEC, ncs_edp_ncs_bool, 0, 0, 0,
(long)&((AVSV_SU_INFO_MSG *)0)->is_ncs, 0, NULL},
+ /* Include su_is_external in version 2 and higher */
{EDU_VER_GE, NULL, 0, 0, 2, 0, 0, (EDU_EXEC_RTINE)((uint16_t *)(&(ver2)))},
-
{EDU_EXEC, ncs_edp_ncs_bool, 0, 0, 0,
(long)&((AVSV_SU_INFO_MSG *)0)->su_is_external, 0, NULL},
+ /* Include su_failover in version 5 and higher */
+ {EDU_VER_GE, NULL, 0, 0, 2, 0, 0, (EDU_EXEC_RTINE)((uint16_t *)(&(ver5)))},
+ {EDU_EXEC, ncs_edp_ncs_bool, 0, 0, 0,
+ (long)&((AVSV_SU_INFO_MSG *)0)->su_failover, 0, NULL},
+
{EDU_TEST_LL_PTR, avsv_edp_su_info_msg, 0, 0, 0,
(long)&((AVSV_SU_INFO_MSG *)0)->next, 0, NULL},
{EDU_END, 0, 0, 0, 0, 0, 0, NULL},
@@ -743,6 +756,7 @@ uint32_t avsv_edp_susi_asgn(EDU_HDL *hdl
{
uint32_t rc = NCSCC_RC_SUCCESS;
AVSV_SUSI_ASGN *struct_ptr = NULL, **d_ptr = NULL;
+ uint16_t ver5 = AVSV_AVD_AVND_MSG_FMT_VER_5;
EDU_INST_SET avsv_susi_asgn_rules[] = {
{EDU_START, avsv_edp_susi_asgn, EDQ_LNKLIST, 0, 0,
@@ -760,6 +774,12 @@ uint32_t avsv_edp_susi_asgn(EDU_HDL *hdl
(long)&((AVSV_SUSI_ASGN *)0)->stdby_rank, 0, NULL},
{EDU_EXEC, m_NCS_EDP_SAAMFCSITRANSITIONDESCRIPTORT, 0, 0, 0,
(long)&((AVSV_SUSI_ASGN *)0)->active_comp_dsc, 0, NULL},
+
+ /* Include comp capability in version 5 and higher */
+ {EDU_VER_GE, NULL, 0, 0, 2, 0, 0, (EDU_EXEC_RTINE)((uint16_t *)(&(ver5)))},
+ {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
+ (long)&((AVSV_SUSI_ASGN *)0)->capability, 0, NULL},
+
{EDU_EXEC, avsv_edp_csi_attr_info, 0, 0, 0,
(long)&((AVSV_SUSI_ASGN *)0)->attrs, 0, NULL},
diff --git a/osaf/libs/common/avsv/include/avsv_d2nmsg.h b/osaf/libs/common/avsv/include/avsv_d2nmsg.h
--- a/osaf/libs/common/avsv/include/avsv_d2nmsg.h
+++ b/osaf/libs/common/avsv/include/avsv_d2nmsg.h
@@ -39,14 +39,13 @@
#include <avsv_defs.h>
#include <stdbool.h>
-/* In Service upgrade support */
-#define AVND_MDS_SUB_PART_VERSION 4
-
/* Message format versions */
#define AVSV_AVD_AVND_MSG_FMT_VER_1 1
#define AVSV_AVD_AVND_MSG_FMT_VER_2 2
#define AVSV_AVD_AVND_MSG_FMT_VER_3 3
#define AVSV_AVD_AVND_MSG_FMT_VER_4 4
+#define AVSV_AVD_AVND_MSG_FMT_VER_5 5
+//#define AVSV_AVD_AVND_MSG_FMT_VER_6 6
/* Internode/External Components Validation result */
typedef enum {
@@ -115,6 +114,7 @@ typedef struct avsv_su_info_msg {
uint32_t su_restart_max;
bool is_ncs;
bool su_is_external; /*indicates if this SU is external */
+ bool su_failover;
struct avsv_su_info_msg *next;
} AVSV_SU_INFO_MSG;
@@ -292,6 +292,7 @@ typedef struct avsv_susi_asgn {
uint32_t csi_rank; /* The rank of the CSI in the SI */
uint32_t stdby_rank;
SaAmfCSITransitionDescriptorT active_comp_dsc;
+ SaAmfCompCapabilityModelT capability;
AVSV_CSI_ATTRS attrs; /* Inside the struct there is a
* array of param vals.*/
struct avsv_susi_asgn *next;
@@ -470,6 +471,7 @@ typedef struct avsv_d2n_info_su_si_assig
bool single_csi; /* To differentiate single csi assignment from SI assignment.*/
uint32_t num_assigns;
AVSV_SUSI_ASGN *list;
+ uint32_t si_rank;
} AVSV_D2N_INFO_SU_SI_ASSIGN_MSG_INFO;
typedef struct avsv_d2n_pg_track_act_rsp_msg_info_tag {
diff --git a/osaf/services/saf/avsv/avd/avd_mds.c b/osaf/services/saf/avsv/avd/avd_mds.c
--- a/osaf/services/saf/avsv/avd/avd_mds.c
+++ b/osaf/services/saf/avsv/avd/avd_mds.c
@@ -42,14 +42,17 @@
#include <avd_msg.h>
#include "avd.h"
-const MDS_CLIENT_MSG_FORMAT_VER avd_avnd_msg_fmt_map_table[AVD_AVND_SUBPART_VER_MAX] = {
+const MDS_CLIENT_MSG_FORMAT_VER avd_avnd_msg_fmt_map_table[] = {
AVSV_AVD_AVND_MSG_FMT_VER_1, AVSV_AVD_AVND_MSG_FMT_VER_2,
- AVSV_AVD_AVND_MSG_FMT_VER_3, AVSV_AVD_AVND_MSG_FMT_VER_4};
+ AVSV_AVD_AVND_MSG_FMT_VER_3, AVSV_AVD_AVND_MSG_FMT_VER_4,
+ AVSV_AVD_AVND_MSG_FMT_VER_5
+};
-const MDS_CLIENT_MSG_FORMAT_VER avd_avd_msg_fmt_map_table[AVD_AVD_SUBPART_VER_MAX] = {
+const MDS_CLIENT_MSG_FORMAT_VER avd_avd_msg_fmt_map_table[] = {
AVD_AVD_MSG_FMT_VER_1, AVD_AVD_MSG_FMT_VER_2,
AVD_AVD_MSG_FMT_VER_3, AVD_AVD_MSG_FMT_VER_4,
- AVD_AVD_MSG_FMT_VER_5};
+ AVD_AVD_MSG_FMT_VER_5
+};
/* fwd decl */
diff --git a/osaf/services/saf/avsv/avd/avd_util.c b/osaf/services/saf/avsv/avd/avd_util.c
--- a/osaf/services/saf/avsv/avd/avd_util.c
+++ b/osaf/services/saf/avsv/avd/avd_util.c
@@ -509,6 +509,7 @@ static uint32_t avd_prep_su_info(AVD_CL_
su_info->su_restart_prob = su->sg_of_su->saAmfSGSuRestartProb;
su_info->is_ncs = su->sg_of_su->sg_ncs_spec;
su_info->su_is_external = su->su_is_external;
+ su_info->su_failover = su->saAmfSUFailover;
su_info->next = su_msg->msg_info.d2n_reg_su.su_list;
su_msg->msg_info.d2n_reg_su.su_list = su_info;
@@ -770,6 +771,24 @@ static uint32_t avd_prep_csi_attr_info(A
return NCSCC_RC_SUCCESS;
}
+/**
+ * Get saAmfCtCompCapability from the SaAmfCtCsType instance associated with the
+ * types of csi and comp.
+ * @param csi
+ * @param comp
+ * @return SaAmfCompCapabilityModelT
+ */
+static SaAmfCompCapabilityModelT get_comp_capability(const AVD_CSI *csi,
+ const AVD_COMP *comp)
+{
+ SaNameT dn;
+ avsv_create_association_class_dn(&csi->cstype->name,
+ &comp->comp_type->name, "safSupportedCsType", &dn);
+ AVD_CTCS_TYPE *ctcs_type = avd_ctcstype_get(&dn);
+ osafassert(ctcs_type);
+ return ctcs_type->saAmfCtCompCapability;
+}
+
/*****************************************************************************
* Function: avd_snd_susi_msg
*
@@ -930,6 +949,7 @@ uint32_t avd_snd_susi_msg(AVD_CL_CB *cb,
susi_msg->msg_info.d2n_su_si_assign.si_name = susi->si->name;
susi_msg->msg_info.d2n_su_si_assign.ha_state = susi->state;
+ susi_msg->msg_info.d2n_su_si_assign.si_rank = susi->si->saAmfSIRank;
/* Fill the SU SI pointer to l_susi which will be used from now
* for information related to this SU SI
@@ -1000,6 +1020,8 @@ uint32_t avd_snd_susi_msg(AVD_CL_CB *cb,
compcsi_info->csi_name = l_compcsi->csi->name;
compcsi_info->csi_rank = l_compcsi->csi->rank;
compcsi_info->active_comp_dsc = trans_dsc;
+ compcsi_info->capability =
+ get_comp_capability(l_compcsi->csi, l_compcsi->comp);
/* fill the Attributes for the CSI if new. */
if (actn == AVSV_SUSI_ACT_ASGN) {
diff --git a/osaf/services/saf/avsv/avd/include/avd_mds.h b/osaf/services/saf/avsv/avd/include/avd_mds.h
--- a/osaf/services/saf/avsv/avd/include/avd_mds.h
+++ b/osaf/services/saf/avsv/avd/include/avd_mds.h
@@ -33,10 +33,10 @@
/* In Service upgrade support */
#define AVD_MDS_SUB_PART_VERSION_4 4
-#define AVD_MDS_SUB_PART_VERSION 5
+#define AVD_MDS_SUB_PART_VERSION 6
#define AVD_AVND_SUBPART_VER_MIN 1
-#define AVD_AVND_SUBPART_VER_MAX 4
+#define AVD_AVND_SUBPART_VER_MAX 5
#define AVD_AVD_SUBPART_VER_MIN 1
#define AVD_AVD_SUBPART_VER_MAX 5
diff --git a/osaf/services/saf/avsv/avnd/avnd_comp.c b/osaf/services/saf/avsv/avnd/avnd_comp.c
--- a/osaf/services/saf/avsv/avnd/avnd_comp.c
+++ b/osaf/services/saf/avsv/avnd/avnd_comp.c
@@ -876,54 +876,6 @@ uint32_t avnd_comp_unreg_prc(AVND_CB *cb
}
/****************************************************************************
- Name : avnd_comp_cap_x_act_or_1_act_check
-
- Description : This routine checks the capability of component wrt cs type.
-
- Arguments : comp - ptr to the comp
- csi - ptr to the csi
-
- Return Values : true if comp cap is either x_act or 1_act , else false.
-
-******************************************************************************/
-static bool avnd_comp_cap_x_act_or_1_act_check(SaNameT *comp_type, SaNameT *csi_type)
-{
- bool rc = false;
- SaAisErrorT error;
- SaNameT dn;
- SaImmAccessorHandleT accessorHandle;
- const SaImmAttrValuesT_2 **attributes;
- SaAmfCompCapabilityModelT comp_cap;
- SaImmAttrNameT attributeNames[2] = {"saAmfCtCompCapability", NULL};
- SaImmHandleT immOmHandle;
- SaVersionT immVersion = { 'A', 2, 1 };
-
- TRACE_ENTER2("comptype = '%s' : csitype = '%s'", comp_type->value, csi_type->value);
-
- avsv_create_association_class_dn(csi_type, comp_type, "safSupportedCsType", &dn);
-
- immutil_saImmOmInitialize(&immOmHandle, NULL, &immVersion);
- immutil_saImmOmAccessorInitialize(immOmHandle, &accessorHandle);
-
- if ((error = immutil_saImmOmAccessorGet_2(accessorHandle, &dn, attributeNames, (SaImmAttrValuesT_2 ***)&attributes)) != SA_AIS_OK) {
- LOG_ER("saImmOmAccessorGet FAILED %u for'%s'", error, dn.value);
- goto done;
- }
-
- if (immutil_getAttr("saAmfCtCompCapability", attributes, 0, &comp_cap) != SA_AIS_OK)
- osafassert(0);
-
- if((SA_AMF_COMP_X_ACTIVE == comp_cap) || (SA_AMF_COMP_1_ACTIVE == comp_cap))
- rc = true;
-done:
- immutil_saImmOmAccessorFinalize(accessorHandle);
- immutil_saImmOmFinalize(immOmHandle);
-
- TRACE_LEAVE2("%u", rc);
- return rc;
-}
-
-/****************************************************************************
Name : avnd_comp_csi_assign
Description : This routine assigns the CSI to the component. It is
@@ -1009,7 +961,8 @@ uint32_t avnd_comp_csi_assign(AVND_CB *c
/* skip standby assignment to x_active or 1_active capable comp */
curr_csi = (csi) ? csi : m_AVND_CSI_REC_FROM_COMP_DLL_NODE_GET(m_NCS_DBLIST_FIND_FIRST(&comp->csi_list));
if (curr_csi && (SA_AMF_HA_STANDBY == curr_csi->si->curr_state) &&
- (true == avnd_comp_cap_x_act_or_1_act_check(&comp->saAmfCompType, &curr_csi->saAmfCSType))) {
+ ((curr_csi->capability == SA_AMF_COMP_X_ACTIVE) ||
+ (curr_csi->capability == SA_AMF_COMP_1_ACTIVE))) {
m_AVND_COMP_CSI_CURR_ASSIGN_STATE_SET(curr_csi, AVND_COMP_CSI_ASSIGN_STATE_ASSIGNED);
m_AVND_SEND_CKPT_UPDT_ASYNC_UPDT(cb, curr_csi, AVND_CKPT_COMP_CSI_CURR_ASSIGN_STATE);
rc = avnd_comp_csi_assign_done(cb, comp, csi);
diff --git a/osaf/services/saf/avsv/avnd/avnd_mds.c b/osaf/services/saf/avsv/avnd/avnd_mds.c
--- a/osaf/services/saf/avsv/avnd/avnd_mds.c
+++ b/osaf/services/saf/avsv/avnd/avnd_mds.c
@@ -37,11 +37,27 @@
#include "avsv_n2avaedu.h"
#include "ncsencdec_pub.h"
-const MDS_CLIENT_MSG_FORMAT_VER avnd_avd_msg_fmt_map_table[AVND_AVD_SUBPART_VER_MAX] =
- { AVSV_AVD_AVND_MSG_FMT_VER_1, AVSV_AVD_AVND_MSG_FMT_VER_2, AVSV_AVD_AVND_MSG_FMT_VER_3, AVSV_AVD_AVND_MSG_FMT_VER_4};
-const MDS_CLIENT_MSG_FORMAT_VER avnd_avnd_msg_fmt_map_table[AVND_AVND_SUBPART_VER_MAX] =
- { AVSV_AVND_AVND_MSG_FMT_VER_1 };
-const MDS_CLIENT_MSG_FORMAT_VER avnd_ava_msg_fmt_map_table[AVND_AVA_SUBPART_VER_MAX] = { AVSV_AVND_AVA_MSG_FMT_VER_1 };
+/* messages to director */
+const MDS_CLIENT_MSG_FORMAT_VER avnd_avd_msg_fmt_map_table[] = {
+ AVSV_AVD_AVND_MSG_FMT_VER_1, AVSV_AVD_AVND_MSG_FMT_VER_2,
+ AVSV_AVD_AVND_MSG_FMT_VER_3, AVSV_AVD_AVND_MSG_FMT_VER_4,
+ AVSV_AVD_AVND_MSG_FMT_VER_5
+};
+
+/* messages from director
+const MDS_CLIENT_MSG_FORMAT_VER avd_avnd_msg_fmt_map_table[] = {
+ AVSV_AVD_AVND_MSG_FMT_VER_1, AVSV_AVD_AVND_MSG_FMT_VER_2,
+ AVSV_AVD_AVND_MSG_FMT_VER_3, AVSV_AVD_AVND_MSG_FMT_VER_4,
+ AVSV_AVD_AVND_MSG_FMT_VER_5
+};*/
+
+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
+};
/* static function declarations */
@@ -507,6 +523,9 @@ uint32_t avnd_mds_rcv(AVND_CB *cb, MDS_C
goto done;
}
+ /* save the msg version for possible later use in event handlers */
+ evt->msg_fmt_ver = rcv_info->i_msg_fmt_ver;
+
/* nullify the msg as it is used in the event */
memset(&msg, 0, sizeof(AVND_MSG));
diff --git a/osaf/services/saf/avsv/avnd/avnd_sidb.c b/osaf/services/saf/avsv/avnd/avnd_sidb.c
--- a/osaf/services/saf/avsv/avnd/avnd_sidb.c
+++ b/osaf/services/saf/avsv/avnd/avnd_sidb.c
@@ -139,43 +139,6 @@ AVND_SU_SI_REC *avnd_silist_getlast(void
return NULL;
}
-/**
- * Return SI rank read from IMM
- *
- * @param dn DN of SI
- *
- * @return rank of SI or -1 if not configured for SI
- */
-static uint32_t get_sirank(const SaNameT *dn)
-{
- SaAisErrorT error;
- SaImmAccessorHandleT accessorHandle;
- const SaImmAttrValuesT_2 **attributes;
- SaImmAttrNameT attributeNames[2] = {"saAmfSIRank", NULL};
- SaImmHandleT immOmHandle;
- SaVersionT immVersion = {'A', 2, 1};
- uint32_t rank = -1; // lowest possible rank if uninitialized
-
- immutil_saImmOmInitialize(&immOmHandle, NULL, &immVersion);
- immutil_saImmOmAccessorInitialize(immOmHandle, &accessorHandle);
-
- osafassert((error = immutil_saImmOmAccessorGet_2(accessorHandle, dn,
- attributeNames, (SaImmAttrValuesT_2 ***)&attributes)) == SA_AIS_OK);
-
- osafassert((error = immutil_getAttr(attributeNames[0], attributes, 0, &rank)) == SA_AIS_OK);
-
- // saAmfSIRank attribute has a default value of zero (returned by IMM)
- if (rank == 0) {
- // Unconfigured ranks are treated as lowest possible rank
- rank = -1;
- }
-
- immutil_saImmOmAccessorFinalize(accessorHandle);
- immutil_saImmOmFinalize(immOmHandle);
-
- return rank;
-}
-
/****************************************************************************
Name : avnd_su_si_rec_add
@@ -220,6 +183,7 @@ AVND_SU_SI_REC *avnd_su_si_rec_add(AVND_
*/
/* update the si-name (key) */
memcpy(&si_rec->name, ¶m->si_name, sizeof(SaNameT));
+ si_rec->rank = param->si_rank;
si_rec->curr_state = param->ha_state;
/*
@@ -247,7 +211,6 @@ AVND_SU_SI_REC *avnd_su_si_rec_add(AVND_
/* Add to global SI list sorted by rank if appl SU */
if (!su->is_ncs) {
uint32_t res;
- si_rec->rank = get_sirank(¶m->si_name);
si_rec->cb_dll_node.key = (uint8_t *)&si_rec->rank;
res = ncs_db_link_list_add(&cb->si_list, &si_rec->cb_dll_node);
osafassert(res == NCSCC_RC_SUCCESS);
@@ -268,7 +231,8 @@ AVND_SU_SI_REC *avnd_su_si_rec_add(AVND_
csi_param = csi_param->next;
}
- TRACE_1("SU-SI record added, SU= %s : SI=%s",param->su_name.value,param->si_name.value);
+ TRACE_1("SU-SI record added, '%s', '%s', rank:%u", param->su_name.value,
+ param->si_name.value, si_rec->rank);
return si_rec;
err:
@@ -282,6 +246,68 @@ AVND_SU_SI_REC *avnd_su_si_rec_add(AVND_
return 0;
}
+static void get_cstype(SaImmHandleT immOmHandle,
+ SaImmAccessorHandleT accessorHandle,
+ const SaNameT *csi_name, SaNameT *cstype)
+{
+ SaAisErrorT error;
+ const SaImmAttrValuesT_2 **attributes;
+ SaImmAttrNameT attributeNames[2] = {"saAmfCSType", NULL};
+
+ // TODO remove, just for test
+ LOG_NO("get_cstype: csi = '%s'", csi_name->value);
+
+ if ((error = immutil_saImmOmAccessorGet_2(accessorHandle, csi_name,
+ attributeNames, (SaImmAttrValuesT_2 ***)&attributes)) != SA_AIS_OK) {
+ LOG_ER("saImmOmAccessorGet FAILED %u for %s", error, csi_name->value);
+ osafassert(0);
+ }
+
+ if (immutil_getAttr("saAmfCSType", attributes, 0, cstype) != SA_AIS_OK)
+ osafassert(0);
+}
+
+static SaAmfCompCapabilityModelT get_comp_capability(const SaNameT *comp_type,
+ const SaNameT *csi_name)
+{
+ SaAisErrorT error;
+ SaNameT dn;
+ SaImmAccessorHandleT accessorHandle = 0;
+ const SaImmAttrValuesT_2 **attributes;
+ SaAmfCompCapabilityModelT comp_cap;
+ SaImmAttrNameT attributeNames[2] = {"saAmfCtCompCapability", NULL};
+ SaImmHandleT immOmHandle = 0;
+ SaVersionT immVersion = { 'A', 2, 1 };
+ SaNameT cs_type;
+
+ // TODO remove, just for test
+ LOG_NO("get_comp_capability: comptype = '%s' : csi = '%s'", comp_type->value, csi_name->value);
+
+ TRACE_ENTER2("comptype = '%s' : csi = '%s'", comp_type->value, csi_name->value);
+
+ immutil_saImmOmInitialize(&immOmHandle, NULL, &immVersion);
+ immutil_saImmOmAccessorInitialize(immOmHandle, &accessorHandle);
+
+ get_cstype(immOmHandle, accessorHandle, csi_name, &cs_type);
+ avsv_create_association_class_dn(&cs_type, comp_type, "safSupportedCsType", &dn);
+
+ if ((error = immutil_saImmOmAccessorGet_2(accessorHandle, &dn, attributeNames,
+ (SaImmAttrValuesT_2 ***)&attributes)) != SA_AIS_OK) {
+ LOG_ER("saImmOmAccessorGet FAILED %u for'%s'", error, dn.value);
+ goto done;
+ }
+
+ if (immutil_getAttr("saAmfCtCompCapability", attributes, 0, &comp_cap) != SA_AIS_OK)
+ osafassert(0);
+
+done:
+ immutil_saImmOmAccessorFinalize(accessorHandle);
+ immutil_saImmOmFinalize(immOmHandle);
+
+ TRACE_LEAVE2("%u", comp_cap);
+ return comp_cap;
+}
+
/****************************************************************************
Name : avnd_su_si_csi_rec_add
@@ -351,30 +377,12 @@ AVND_COMP_CSI_REC *avnd_su_si_csi_rec_ad
memcpy(&csi_rec->name, ¶m->csi_name, sizeof(SaNameT));
csi_rec->rank = param->csi_rank;
- {
- /* Fill the cs type param from imm db, it will be used in finding comp capability */
- SaAisErrorT error;
- SaImmAccessorHandleT accessorHandle;
- const SaImmAttrValuesT_2 **attributes;
- SaImmAttrNameT attributeNames[2] = {"saAmfCSType", NULL};
- SaImmHandleT immOmHandle;
- SaVersionT immVersion = { 'A', 2, 1 };
-
- immutil_saImmOmInitialize(&immOmHandle, NULL, &immVersion);
- immutil_saImmOmAccessorInitialize(immOmHandle, &accessorHandle);
-
- if ((error = immutil_saImmOmAccessorGet_2(accessorHandle, ¶m->csi_name, attributeNames,
- (SaImmAttrValuesT_2 ***)&attributes)) != SA_AIS_OK) {
- LOG_ER("saImmOmAccessorGet FAILED %u for %s", error, param->csi_name.value);
- osafassert(0);
- }
-
- if (immutil_getAttr("saAmfCSType", attributes, 0, &csi_rec->saAmfCSType) != SA_AIS_OK)
- osafassert(0);
-
- immutil_saImmOmAccessorFinalize(accessorHandle);
- immutil_saImmOmFinalize(immOmHandle);
- }
+ /* If CSI capability is not valid, read it from IMM */
+ if (param->capability == ~0)
+ csi_rec->capability =
+ get_comp_capability(&comp->saAmfCompType, &csi_rec->name);
+ else
+ csi_rec->capability = param->capability;
/* update the assignment related parameters */
memcpy(&csi_rec->act_comp_name, ¶m->active_comp_name, sizeof(SaNameT));
diff --git a/osaf/services/saf/avsv/avnd/avnd_su.c b/osaf/services/saf/avsv/avnd/avnd_su.c
--- a/osaf/services/saf/avsv/avnd/avnd_su.c
+++ b/osaf/services/saf/avsv/avnd/avnd_su.c
@@ -33,6 +33,7 @@
#include <logtrace.h>
#include <avnd.h>
+#include <immutil.h>
static uint32_t avnd_avd_su_update_on_fover(AVND_CB *cb, AVSV_D2N_REG_SU_MSG_INFO *info);
@@ -224,6 +225,47 @@ static void handle_su_si_assign_in_term_
}
}
+/**
+ * Return SI rank read from IMM
+ *
+ * @param dn DN of SI
+ *
+ * @return rank of SI or -1 if not configured for SI
+ */
+static uint32_t get_sirank(const SaNameT *dn)
+{
+ SaAisErrorT error;
+ SaImmAccessorHandleT accessorHandle;
+ const SaImmAttrValuesT_2 **attributes;
+ SaImmAttrNameT attributeNames[2] = {"saAmfSIRank", NULL};
+ SaImmHandleT immOmHandle;
+ SaVersionT immVersion = {'A', 2, 1};
+ uint32_t rank = -1; // lowest possible rank if uninitialized
+
+ // TODO remove, just for test
+ LOG_NO("get_sirank %s", dn->value);
+
+ TRACE_ENTER2("%s", dn->value);
+ immutil_saImmOmInitialize(&immOmHandle, NULL, &immVersion);
+ immutil_saImmOmAccessorInitialize(immOmHandle, &accessorHandle);
+
+ osafassert((error = immutil_saImmOmAccessorGet_2(accessorHandle, dn,
+ attributeNames, (SaImmAttrValuesT_2 ***)&attributes)) == SA_AIS_OK);
+
+ osafassert((error = immutil_getAttr(attributeNames[0], attributes, 0, &rank)) == SA_AIS_OK);
+
+ // saAmfSIRank attribute has a default value of zero (returned by IMM)
+ if (rank == 0) {
+ // Unconfigured ranks are treated as lowest possible rank
+ rank = -1;
+ }
+
+ immutil_saImmOmAccessorFinalize(accessorHandle);
+ immutil_saImmOmFinalize(immOmHandle);
+
+ return rank;
+}
+
/****************************************************************************
Name : avnd_evt_avd_info_su_si_assign_msg
@@ -263,9 +305,22 @@ uint32_t avnd_evt_avd_info_su_si_assign_
avnd_msgid_assert(info->msg_id);
cb->rcv_msg_id = info->msg_id;
- if ((info->msg_act == AVSV_SUSI_ACT_DEL) ||
- (info->msg_act == AVSV_SUSI_ACT_MOD)) {
+ if (info->msg_act == AVSV_SUSI_ACT_ASGN) {
+ /* SI rank and CSI capability (originally from SaAmfCtCsType) was
+ * introduced in version 5 of the amfnd protocol. If the
+ * message version is older, take action. */
+ if (evt->msg_fmt_ver < 6) {
+ AVSV_SUSI_ASGN *csi;
+ /* indicate that capability is invalid for later use when
+ * creating CSI_REC */
+ for (csi = info->list; csi != NULL; csi = csi->next) {
+ csi->capability = ~0;
+ }
+
+ info->si_rank = get_sirank(&info->si_name);
+ }
+ } else {
if (info->si_name.length > 0) {
if (avnd_su_si_rec_get(cb, &info->su_name, &info->si_name) == NULL)
LOG_ER("susi_assign_evh: '%s' is not assigned to '%s'",
diff --git a/osaf/services/saf/avsv/avnd/include/avnd_comp.h b/osaf/services/saf/avsv/avnd/include/avnd_comp.h
--- a/osaf/services/saf/avsv/avnd/include/avnd_comp.h
+++ b/osaf/services/saf/avsv/avnd/include/avnd_comp.h
@@ -164,7 +164,7 @@ typedef struct avnd_comp_csi_rec {
NCS_DB_LINK_LIST_NODE si_dll_node; /* node in the si dll */
NCS_DB_LINK_LIST_NODE comp_dll_node; /* node in the comp-csi dll */
SaNameT name; /* csi name */
- SaNameT saAmfCSType; /* cs type name */
+ SaAmfCompCapabilityModelT capability; /* capability for this CSI */
uint32_t rank; /* csi rank */
/* state info */
diff --git a/osaf/services/saf/avsv/avnd/include/avnd_evt.h b/osaf/services/saf/avsv/avnd/include/avnd_evt.h
--- a/osaf/services/saf/avsv/avnd/include/avnd_evt.h
+++ b/osaf/services/saf/avsv/avnd/include/avnd_evt.h
@@ -159,6 +159,7 @@ typedef struct avnd_pm_mon_evt {
typedef struct avnd_evt_tag {
struct avnd_evt_tag *next;
MDS_SYNC_SND_CTXT mds_ctxt;
+ MDS_CLIENT_MSG_FORMAT_VER msg_fmt_ver;
NCS_IPC_PRIORITY priority;
AVND_EVT_TYPE type;
diff --git a/osaf/services/saf/avsv/avnd/include/avnd_mds.h b/osaf/services/saf/avsv/avnd/include/avnd_mds.h
--- a/osaf/services/saf/avsv/avnd/include/avnd_mds.h
+++ b/osaf/services/saf/avsv/avnd/include/avnd_mds.h
@@ -30,6 +30,9 @@
#ifndef AVND_MDS_H
#define AVND_MDS_H
+/* In Service upgrade support */
+#define AVND_MDS_SUB_PART_VERSION 4
+
#define AVND_AVD_SUBPART_VER_MIN 1
#define AVND_AVD_SUBPART_VER_MAX 4
------------------------------------------------------------------------------
Put Bad Developers to Shame
Dominate Development with Jenkins Continuous Integration
Continuously Automate Build, Test & Deployment
Start a new project now. Try Jenkins in the cloud.
http://p.sf.net/sfu/13600_Cloudbees_APR
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel