osaf/libs/common/amf/d2nedu.c                |  311 ++++++++++++++++++++++++--
 osaf/libs/common/amf/d2nmsg.c                |  266 +++++++++++++++++++++++
 osaf/libs/common/amf/include/Makefile.am     |    1 +
 osaf/libs/common/amf/include/amf_d2nedu.h    |   16 +
 osaf/libs/common/amf/include/amf_d2nmsg.h    |   61 +++++
 osaf/libs/common/amf/include/amf_defs.h      |    3 +
 osaf/libs/common/amf/include/amf_si_assign.h |   49 ++++
 7 files changed, 680 insertions(+), 27 deletions(-)


Outlined changes:
. Introduce messages sisu_state_info and csicomp_state_info
to carry sync information which are sent to amfd to recover
from headless
. Some encode/decode functions for these 2 new messages

diff --git a/osaf/libs/common/amf/d2nedu.c b/osaf/libs/common/amf/d2nedu.c
--- a/osaf/libs/common/amf/d2nedu.c
+++ b/osaf/libs/common/amf/d2nedu.c
@@ -57,6 +57,7 @@ uint32_t avsv_edp_dnd_msg(EDU_HDL *hdl, 
        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;
+       uint16_t ver6 = AVSV_AVD_AVND_MSG_FMT_VER_6;
 
        EDU_INST_SET avsv_dnd_msg_rules[] = {
                {EDU_START, avsv_edp_dnd_msg, 0, 0, 0,
@@ -71,8 +72,14 @@ uint32_t avsv_edp_dnd_msg(EDU_HDL *hdl, 
                /* AVSV_N2D_NODE_UP_MSG_INFO */
                {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
                 (long)&((AVSV_DND_MSG *)0)->msg_info.n2d_node_up.msg_id, 0, 
NULL},
+               {EDU_VER_GE, NULL, 0, 0, 2, 0, 0, (EDU_EXEC_RTINE)((uint16_t 
*)(&(ver6)))},
+               {EDU_EXEC, ncs_edp_ncs_bool, 0, 0, 0,
+                (long)&((AVSV_DND_MSG *)0)->msg_info.n2d_node_up.leds_set, 0, 
NULL},
                {EDU_EXEC, m_NCS_EDP_SACLMNODEIDT, 0, 0, 0,
                 (long)&((AVSV_DND_MSG *)0)->msg_info.n2d_node_up.node_id, 0, 
NULL},
+               {EDU_VER_GE, NULL, 0, 0, 2, 0, 0, (EDU_EXEC_RTINE)((uint16_t 
*)(&(ver6)))},
+               {EDU_EXEC, ncs_edp_sanamet, 0, 0, 0,
+                (long)&((AVSV_DND_MSG *)0)->msg_info.n2d_node_up.node_name, 0, 
NULL},
                {EDU_EXEC, ncs_edp_mds_dest, 0, 0, EDU_EXIT,
                 (long)&((AVSV_DND_MSG 
*)0)->msg_info.n2d_node_up.adest_address, 0, NULL},
 
@@ -365,6 +372,34 @@ uint32_t avsv_edp_dnd_msg(EDU_HDL *hdl, 
                {EDU_EXEC, m_NCS_EDP_SACLMNODEIDT, 0, 0, EDU_EXIT,
                        (long)&((AVSV_DND_MSG 
*)0)->msg_info.d2n_reboot_info.node_id, 0, NULL},
 
+               /* AVSV_N2D_ND_SISU_STATE_INFO_MSG */
+               {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
+                       (long)&((AVSV_DND_MSG 
*)0)->msg_info.n2d_nd_sisu_state_info.msg_id, 0, NULL},
+               {EDU_EXEC, m_NCS_EDP_SACLMNODEIDT, 0, 0, 0,
+                       (long)&((AVSV_DND_MSG 
*)0)->msg_info.n2d_nd_sisu_state_info.node_id, 0, NULL},
+               {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
+               
(long)&((AVSV_DND_MSG*)0)->msg_info.n2d_nd_sisu_state_info.num_sisu, 0, NULL},
+               {EDU_EXEC, avsv_edp_sisu_state_info_msg, EDQ_POINTER, 0, 0,
+                        (long)&((AVSV_DND_MSG 
*)0)->msg_info.n2d_nd_sisu_state_info.sisu_list, 0, NULL},
+               {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
+                       
(long)&((AVSV_DND_MSG*)0)->msg_info.n2d_nd_sisu_state_info.num_su, 0, NULL},
+               {EDU_EXEC, avsv_edp_su_state_info_msg, EDQ_POINTER, 0, EDU_EXIT,
+                        (long)&((AVSV_DND_MSG 
*)0)->msg_info.n2d_nd_sisu_state_info.su_list, 0, NULL},
+
+               /* AVSV_N2D_ND_CSICOMP_STATE_INFO_MSG */
+               {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
+                       (long)&((AVSV_DND_MSG 
*)0)->msg_info.n2d_nd_csicomp_state_info.msg_id, 0, NULL},
+               {EDU_EXEC, m_NCS_EDP_SACLMNODEIDT, 0, 0, 0,
+                       (long)&((AVSV_DND_MSG 
*)0)->msg_info.n2d_nd_csicomp_state_info.node_id, 0, NULL},
+               {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
+                       
(long)&((AVSV_DND_MSG*)0)->msg_info.n2d_nd_csicomp_state_info.num_csicomp, 0, 
NULL},
+               {EDU_EXEC, avsv_edp_csicomp_state_info_msg, EDQ_POINTER, 0, 0,
+                        (long)&((AVSV_DND_MSG 
*)0)->msg_info.n2d_nd_csicomp_state_info.csicomp_list, 0, NULL},
+               {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
+                       
(long)&((AVSV_DND_MSG*)0)->msg_info.n2d_nd_csicomp_state_info.num_comp, 0, 
NULL},
+               {EDU_EXEC, avsv_edp_comp_state_info_msg, EDQ_POINTER, 0, 
EDU_EXIT,
+                        (long)&((AVSV_DND_MSG 
*)0)->msg_info.n2d_nd_csicomp_state_info.comp_list, 0, NULL},
+
                {EDU_END, 0, 0, 0, 0, 0, 0, NULL},
        };
 
@@ -404,33 +439,35 @@ int avsv_dnd_msg_test_type_fnc(NCSCONTEX
 {
        enum {
                LCL_JMP_OFFSET_AVSV_N2D_NODE_UP_MSG = 1,
-               LCL_JMP_OFFSET_AVSV_N2D_REG_SU_MSG = 4,
-               LCL_JMP_OFFSET_AVSV_N2D_REG_COMP_MSG = 8,
-               LCL_JMP_OFFSET_AVSV_N2D_OPERATION_STATE_MSG = 12,
-               LCL_JMP_OFFSET_AVSV_N2D_INFO_SU_SI_ASSIGN_MSG = 18,
-               LCL_JMP_OFFSET_AVSV_N2D_PG_TRACK_ACT_MSG = 27,
-               LCL_JMP_OFFSET_AVSV_N2D_OPERATION_REQUEST_MSG = 32,
-               LCL_JMP_OFFSET_AVSV_N2D_DATA_REQUEST_MSG = 36,
-               LCL_JMP_OFFSET_AVSV_N2D_SHUTDOWN_APP_SU_MSG = 39,
-               LCL_JMP_OFFSET_AVSV_N2D_VERIFY_ACK_NACK_MSG = 41,
-               LCL_JMP_OFFSET_AVSV_D2N_CLM_NODE_UP_MSG = 44,
-               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 = 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
+               LCL_JMP_OFFSET_AVSV_N2D_REG_SU_MSG = 8,
+               LCL_JMP_OFFSET_AVSV_N2D_REG_COMP_MSG = 12,
+               LCL_JMP_OFFSET_AVSV_N2D_OPERATION_STATE_MSG = 16,
+               LCL_JMP_OFFSET_AVSV_N2D_INFO_SU_SI_ASSIGN_MSG = 22,
+               LCL_JMP_OFFSET_AVSV_N2D_PG_TRACK_ACT_MSG = 31,
+               LCL_JMP_OFFSET_AVSV_N2D_OPERATION_REQUEST_MSG = 36,
+               LCL_JMP_OFFSET_AVSV_N2D_DATA_REQUEST_MSG = 40,
+               LCL_JMP_OFFSET_AVSV_N2D_SHUTDOWN_APP_SU_MSG = 43,
+               LCL_JMP_OFFSET_AVSV_N2D_VERIFY_ACK_NACK_MSG = 45,
+               LCL_JMP_OFFSET_AVSV_D2N_CLM_NODE_UP_MSG = 48,
+               LCL_JMP_OFFSET_AVSV_D2N_REG_SU_MSG = 52,
+               LCL_JMP_OFFSET_AVSV_D2N_REG_COMP_MSG = 57,
+               LCL_JMP_OFFSET_AVSV_D2N_INFO_SU_SI_ASSIGN_MSG = 62,
+               LCL_JMP_OFFSET_AVSV_D2N_PG_TRACK_ACT_RSP_MSG = 74,
+               LCL_JMP_OFFSET_AVSV_D2N_PG_UPD_MSG = 81,
+               LCL_JMP_OFFSET_AVSV_D2N_OPERATION_REQUEST_MSG = 85,
+               LCL_JMP_OFFSET_AVSV_D2N_PRESENCE_SU_MSG = 88,
+               LCL_JMP_OFFSET_AVSV_D2N_DATA_VERIFY_MSG = 92,
+               LCL_JMP_OFFSET_AVSV_D2N_DATA_ACK_MSG = 97,
+               LCL_JMP_OFFSET_AVSV_D2N_SHUTDOWN_APP_SU_MSG = 99,
+               LCL_JMP_OFFSET_AVSV_D2N_SET_LEDS_MSG = 101,
+               LCL_JMP_OFFSET_AVSV_N2D_COMP_VALID_MSG = 103,
+               LCL_JMP_OFFSET_AVSV_D2N_COMP_VALID_RESP_MSG = 111,
+               LCL_JMP_OFFSET_AVSV_D2N_ROLE_CHANGE_MSG = 115,
+               LCL_JMP_OFFSET_AVSV_D2N_ADMIN_OP_REQ_MSG = 118,
+               LCL_JMP_OFFSET_AVSV_D2N_HEARTBEAT_MSG = 122,
+               LCL_JMP_OFFSET_AVSV_D2N_REBOOT_MSG = 123,
+               LCL_JMP_OFFSET_AVSV_N2D_ND_SISU_STATE_INFO_MSG = 125,
+               LCL_JMP_OFFSET_AVSV_N2D_ND_CSICOMP_STATE_INFO_MSG = 131
        };
        AVSV_DND_MSG_TYPE type;
 
@@ -496,6 +533,11 @@ int avsv_dnd_msg_test_type_fnc(NCSCONTEX
                return LCL_JMP_OFFSET_AVSV_D2N_HEARTBEAT_MSG;
        case AVSV_D2N_REBOOT_MSG:
                return LCL_JMP_OFFSET_AVSV_D2N_REBOOT_MSG;
+       case AVSV_N2D_ND_SISU_STATE_INFO_MSG:
+               return LCL_JMP_OFFSET_AVSV_N2D_ND_SISU_STATE_INFO_MSG ;
+       case AVSV_N2D_ND_CSICOMP_STATE_INFO_MSG:
+               return LCL_JMP_OFFSET_AVSV_N2D_ND_CSICOMP_STATE_INFO_MSG ;
+
        default:
                break;
        }
@@ -807,3 +849,218 @@ uint32_t avsv_edp_susi_asgn(EDU_HDL *hdl
        rc = m_NCS_EDU_RUN_RULES(hdl, edu_tkn, avsv_susi_asgn_rules, 
struct_ptr, ptr_data_len, buf_env, op, o_err);
        return rc;
 }
+/*****************************************************************************
+
+  PROCEDURE NAME:   avsv_edp_sisu_state_info_msg
+
+  DESCRIPTION:      EDU program handler for "AVSV_SISU_STATE_MSG" data. This 
function
+                    is invoked by EDU for performing encode/decode operation
+                    on "AVSV_SISU_STATE_MSG" data.
+
+  RETURNS:          NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
+
+*****************************************************************************/
+uint32_t avsv_edp_sisu_state_info_msg(EDU_HDL *hdl, EDU_TKN *edu_tkn,
+                          NCSCONTEXT ptr, uint32_t *ptr_data_len, EDU_BUF_ENV 
*buf_env, EDP_OP_TYPE op, EDU_ERR *o_err)
+{
+       uint32_t rc = NCSCC_RC_SUCCESS;
+       AVSV_SISU_STATE_MSG *struct_ptr = NULL, **d_ptr = NULL;
+
+       EDU_INST_SET avsv_sisu_state_msg_rules[] = {
+               {EDU_START, avsv_edp_sisu_state_info_msg, EDQ_LNKLIST, 0, 0,
+                sizeof(AVSV_SISU_STATE_MSG), 0, NULL},
+
+               {EDU_EXEC, ncs_edp_sanamet, 0, 0, 0,
+                (long)&((AVSV_SISU_STATE_MSG *)0)->safSU, 0, NULL},
+               {EDU_EXEC, ncs_edp_sanamet, 0, 0, 0,
+                (long)&((AVSV_SISU_STATE_MSG *)0)->safSI, 0, NULL},
+               {EDU_EXEC, m_NCS_EDP_SAAMFHASTATET, 0, 0, 0,
+                (long)&((AVSV_SISU_STATE_MSG *)0)->saAmfSISUHAState, 0, NULL},
+
+               {EDU_TEST_LL_PTR, avsv_edp_sisu_state_info_msg, 0, 0, 0,
+                (long)&((AVSV_SISU_STATE_MSG *)0)->next, 0, NULL},
+               {EDU_END, 0, 0, 0, 0, 0, 0, NULL},
+       };
+
+       if (op == EDP_OP_TYPE_ENC) {
+               struct_ptr = (AVSV_SISU_STATE_MSG *)ptr;
+       } else if (op == EDP_OP_TYPE_DEC) {
+               d_ptr = (AVSV_SISU_STATE_MSG **)ptr;
+               if (*d_ptr == NULL) {
+                       *d_ptr = malloc(sizeof(AVSV_SISU_STATE_MSG));
+                       if (*d_ptr == NULL) {
+                               *o_err = EDU_ERR_MEM_FAIL;
+                               return NCSCC_RC_FAILURE;
+                       }
+               }
+               memset(*d_ptr, '\0', sizeof(AVSV_SISU_STATE_MSG));
+               struct_ptr = *d_ptr;
+       } else {
+               struct_ptr = ptr;
+       }
+       rc = m_NCS_EDU_RUN_RULES(hdl, edu_tkn, avsv_sisu_state_msg_rules, 
struct_ptr, ptr_data_len, buf_env, op, o_err);
+       return rc;
+}
+/*****************************************************************************
+
+  PROCEDURE NAME:   avsv_edp_su_state_info_msg
+
+  DESCRIPTION:      EDU program handler for "AVSV_SU_STATE_MSG" data. This 
function
+                    is invoked by EDU for performing encode/decode operation
+                    on "AVSV_SU_STATE_MSG" data.
+
+  RETURNS:          NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
+
+*****************************************************************************/
+uint32_t avsv_edp_su_state_info_msg(EDU_HDL *hdl, EDU_TKN *edu_tkn,
+                          NCSCONTEXT ptr, uint32_t *ptr_data_len, EDU_BUF_ENV 
*buf_env, EDP_OP_TYPE op, EDU_ERR *o_err)
+{
+       uint32_t rc = NCSCC_RC_SUCCESS;
+       AVSV_SU_STATE_MSG *struct_ptr = NULL, **d_ptr = NULL;
+
+       EDU_INST_SET avsv_su_state_msg_rules[] = {
+               {EDU_START, avsv_edp_su_state_info_msg, EDQ_LNKLIST, 0, 0,
+                sizeof(AVSV_SU_STATE_MSG), 0, NULL},
+
+               {EDU_EXEC, ncs_edp_sanamet, 0, 0, 0,
+                (long)&((AVSV_SU_STATE_MSG *)0)->safSU, 0, NULL},
+               {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
+                (long)&((AVSV_SU_STATE_MSG *)0)->su_restart_cnt, 0, NULL},
+               {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
+                (long)&((AVSV_SU_STATE_MSG *)0)->su_pres_state, 0, NULL},
+               {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
+                (long)&((AVSV_SU_STATE_MSG *)0)->su_oper_state, 0, NULL},
+
+               {EDU_TEST_LL_PTR, avsv_edp_su_state_info_msg, 0, 0, 0,
+                (long)&((AVSV_SU_STATE_MSG *)0)->next, 0, NULL},
+               {EDU_END, 0, 0, 0, 0, 0, 0, NULL},
+       };
+
+       if (op == EDP_OP_TYPE_ENC) {
+               struct_ptr = (AVSV_SU_STATE_MSG *)ptr;
+       } else if (op == EDP_OP_TYPE_DEC) {
+               d_ptr = (AVSV_SU_STATE_MSG **)ptr;
+               if (*d_ptr == NULL) {
+                       *d_ptr = malloc(sizeof(AVSV_SU_STATE_MSG));
+                       if (*d_ptr == NULL) {
+                               *o_err = EDU_ERR_MEM_FAIL;
+                               return NCSCC_RC_FAILURE;
+                       }
+               }
+               memset(*d_ptr, '\0', sizeof(AVSV_SU_STATE_MSG));
+               struct_ptr = *d_ptr;
+       } else {
+               struct_ptr = ptr;
+       }
+       rc = m_NCS_EDU_RUN_RULES(hdl, edu_tkn, avsv_su_state_msg_rules, 
struct_ptr, ptr_data_len, buf_env, op, o_err);
+       return rc;
+}
+/*****************************************************************************
+
+  PROCEDURE NAME:   avsv_edp_csicomp_state_info_msg
+
+  DESCRIPTION:      EDU program handler for "AVSV_CSICOMP_STATE_MSG" data. 
This function
+                    is invoked by EDU for performing encode/decode operation
+                    on "AVSV_CSICOMP_STATE_MSG" data.
+
+  RETURNS:          NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
+
+*****************************************************************************/
+uint32_t avsv_edp_csicomp_state_info_msg(EDU_HDL *hdl, EDU_TKN *edu_tkn,
+                          NCSCONTEXT ptr, uint32_t *ptr_data_len, EDU_BUF_ENV 
*buf_env, EDP_OP_TYPE op, EDU_ERR *o_err)
+{
+       uint32_t rc = NCSCC_RC_SUCCESS;
+       AVSV_CSICOMP_STATE_MSG *struct_ptr = NULL, **d_ptr = NULL;
+
+       EDU_INST_SET avsv_csicomp_state_msg_rules[] = {
+               {EDU_START, avsv_edp_csicomp_state_info_msg, EDQ_LNKLIST, 0, 0,
+                sizeof(AVSV_CSICOMP_STATE_MSG), 0, NULL},
+
+               {EDU_EXEC, ncs_edp_sanamet, 0, 0, 0,
+                (long)&((AVSV_CSICOMP_STATE_MSG *)0)->safComp, 0, NULL},
+               {EDU_EXEC, ncs_edp_sanamet, 0, 0, 0,
+                (long)&((AVSV_CSICOMP_STATE_MSG *)0)->safCSI, 0, NULL},
+               {EDU_EXEC, m_NCS_EDP_SAAMFHASTATET, 0, 0, 0,
+                (long)&((AVSV_CSICOMP_STATE_MSG *)0)->saAmfCSICompHAState, 0, 
NULL},
+
+               {EDU_TEST_LL_PTR, avsv_edp_csicomp_state_info_msg, 0, 0, 0,
+                (long)&((AVSV_CSICOMP_STATE_MSG *)0)->next, 0, NULL},
+               {EDU_END, 0, 0, 0, 0, 0, 0, NULL},
+       };
+
+       if (op == EDP_OP_TYPE_ENC) {
+               struct_ptr = (AVSV_CSICOMP_STATE_MSG *)ptr;
+       } else if (op == EDP_OP_TYPE_DEC) {
+               d_ptr = (AVSV_CSICOMP_STATE_MSG **)ptr;
+               if (*d_ptr == NULL) {
+                       *d_ptr = malloc(sizeof(AVSV_CSICOMP_STATE_MSG));
+                       if (*d_ptr == NULL) {
+                               *o_err = EDU_ERR_MEM_FAIL;
+                               return NCSCC_RC_FAILURE;
+                       }
+               }
+               memset(*d_ptr, '\0', sizeof(AVSV_CSICOMP_STATE_MSG));
+               struct_ptr = *d_ptr;
+       } else {
+               struct_ptr = ptr;
+       }
+       rc = m_NCS_EDU_RUN_RULES(hdl, edu_tkn, avsv_csicomp_state_msg_rules, 
struct_ptr, ptr_data_len, buf_env, op, o_err);
+       return rc;
+
+}
+/*****************************************************************************
+
+  PROCEDURE NAME:   avsv_edp_comp_state_info_msg
+
+  DESCRIPTION:      EDU program handler for "AVSV_COMP_STATE_MSG" data. This 
function
+                    is invoked by EDU for performing encode/decode operation
+                    on "AVSV_COMP_STATE_MSG" data.
+
+  RETURNS:          NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
+
+*****************************************************************************/
+uint32_t avsv_edp_comp_state_info_msg(EDU_HDL *hdl, EDU_TKN *edu_tkn,
+                          NCSCONTEXT ptr, uint32_t *ptr_data_len, EDU_BUF_ENV 
*buf_env, EDP_OP_TYPE op, EDU_ERR *o_err)
+{
+       uint32_t rc = NCSCC_RC_SUCCESS;
+       AVSV_COMP_STATE_MSG *struct_ptr = NULL, **d_ptr = NULL;
+
+       EDU_INST_SET avsv_comp_state_msg_rules[] = {
+               {EDU_START, avsv_edp_comp_state_info_msg, EDQ_LNKLIST, 0, 0,
+                sizeof(AVSV_COMP_STATE_MSG), 0, NULL},
+
+               {EDU_EXEC, ncs_edp_sanamet, 0, 0, 0,
+                (long)&((AVSV_COMP_STATE_MSG *)0)->safComp, 0, NULL},
+               {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
+                (long)&((AVSV_COMP_STATE_MSG *)0)->comp_restart_cnt, 0, NULL},
+               {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
+                (long)&((AVSV_COMP_STATE_MSG *)0)->comp_pres_state, 0, NULL},
+               {EDU_EXEC, ncs_edp_uns32, 0, 0, 0,
+                (long)&((AVSV_COMP_STATE_MSG *)0)->comp_oper_state, 0, NULL},
+
+               {EDU_TEST_LL_PTR, avsv_edp_comp_state_info_msg, 0, 0, 0,
+                (long)&((AVSV_COMP_STATE_MSG *)0)->next, 0, NULL},
+               {EDU_END, 0, 0, 0, 0, 0, 0, NULL},
+       };
+
+       if (op == EDP_OP_TYPE_ENC) {
+               struct_ptr = (AVSV_COMP_STATE_MSG *)ptr;
+       } else if (op == EDP_OP_TYPE_DEC) {
+               d_ptr = (AVSV_COMP_STATE_MSG **)ptr;
+               if (*d_ptr == NULL) {
+                       *d_ptr = malloc(sizeof(AVSV_COMP_STATE_MSG));
+                       if (*d_ptr == NULL) {
+                               *o_err = EDU_ERR_MEM_FAIL;
+                               return NCSCC_RC_FAILURE;
+                       }
+               }
+               memset(*d_ptr, '\0', sizeof(AVSV_COMP_STATE_MSG));
+               struct_ptr = *d_ptr;
+       } else {
+               struct_ptr = ptr;
+       }
+       rc = m_NCS_EDU_RUN_RULES(hdl, edu_tkn, avsv_comp_state_msg_rules, 
struct_ptr, ptr_data_len, buf_env, op, o_err);
+       return rc;
+
+}
+
diff --git a/osaf/libs/common/amf/d2nmsg.c b/osaf/libs/common/amf/d2nmsg.c
--- a/osaf/libs/common/amf/d2nmsg.c
+++ b/osaf/libs/common/amf/d2nmsg.c
@@ -250,6 +250,127 @@ static uint32_t cpy_d2n_pg_msg(AVSV_DND_
        return NCSCC_RC_SUCCESS;
 }
 
+/*****************************************************************************
+ * Function: cpy_n2d_nd_sisu_state_info
+ *
+ * Purpose:  This function makes a copy of the n2d SI SU message contents.
+ *
+ * Input: dst - Pointer to the SU SI message to be copied to.
+ *        src - Pointer to the SU SI message to be copied.
+ *
+ * Returns: NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
+ *
+ * NOTES: It also allocates and copies the array of attributes, which are 
separately
+ * allocated and pointed to by AVSV_SISU_STATE_MSG structure.
+ *
+ **************************************************************************/
+static uint32_t cpy_n2d_nd_sisu_state_info(AVSV_DND_MSG *dst, const 
AVSV_DND_MSG *src)
+{
+       const AVSV_SISU_STATE_MSG *src_sisu;
+       AVSV_SISU_STATE_MSG *dst_sisu;
+
+       const AVSV_SU_STATE_MSG *src_su;
+       AVSV_SU_STATE_MSG *dst_su;
+
+       memset(dst, '\0', sizeof(AVSV_DND_MSG));
+
+       memcpy(dst, src, sizeof(AVSV_DND_MSG));
+       dst->msg_info.n2d_nd_sisu_state_info.sisu_list = NULL;
+       dst->msg_info.n2d_nd_sisu_state_info.su_list = NULL;
+
+       // copy SISU stuff
+       src_sisu = src->msg_info.n2d_nd_sisu_state_info.sisu_list;
+       while (src_sisu != NULL) {
+               dst_sisu = malloc(sizeof(AVSV_SISU_STATE_MSG));
+               osafassert(dst_sisu);
+
+               memcpy(dst_sisu, src_sisu, sizeof(AVSV_SISU_STATE_MSG));
+               // insert at the start
+               dst_sisu->next = dst->msg_info.n2d_nd_sisu_state_info.sisu_list;
+               dst->msg_info.n2d_nd_sisu_state_info.sisu_list = dst_sisu;
+
+               // now go to the next sisu info in source
+               src_sisu = src_sisu->next;
+       }
+
+       // copy SU stuff
+       src_su = src->msg_info.n2d_nd_sisu_state_info.su_list;
+       while (src_su != NULL) {
+               dst_su = malloc(sizeof(AVSV_SU_STATE_MSG));
+               osafassert(dst_su);
+
+               memcpy(dst_su, src_su, sizeof(AVSV_SU_STATE_MSG));
+               // insert at the start
+               dst_su->next = dst->msg_info.n2d_nd_sisu_state_info.su_list;
+               dst->msg_info.n2d_nd_sisu_state_info.su_list = dst_su;
+
+               // now go to the next su info in source
+               src_su = src_su->next;
+       }
+
+       return NCSCC_RC_SUCCESS;
+}
+/*****************************************************************************
+ * Function: cpy_n2d_nd_csicomp_state_info
+ *
+ * Purpose:  This function makes a copy of the n2d csi comp message contents.
+ *
+ * Input: dst - Pointer to the COMPCSI message to be copied to.
+ *        src - Pointer to the COMPCSI message to be copied.
+ *
+ * Returns: NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
+ *
+ * NOTES: It also allocates and copies the array of attributes, which are 
separately
+ * allocated and pointed to by AVSV_CSICOMP_STATE_MSG structure.
+ *
+ **************************************************************************/
+static uint32_t cpy_n2d_nd_csicomp_state_info(AVSV_DND_MSG *dst, const 
AVSV_DND_MSG *src)
+{
+       const AVSV_CSICOMP_STATE_MSG *src_csicomp;
+       AVSV_CSICOMP_STATE_MSG *dst_csicomp;
+
+       const AVSV_COMP_STATE_MSG *src_comp;
+       AVSV_COMP_STATE_MSG *dst_comp;
+
+       memset(dst, '\0', sizeof(AVSV_DND_MSG));
+
+       memcpy(dst, src, sizeof(AVSV_DND_MSG));
+       dst->msg_info.n2d_nd_csicomp_state_info.csicomp_list = NULL;
+       dst->msg_info.n2d_nd_csicomp_state_info.comp_list = NULL;
+
+       // CSICOMP
+       src_csicomp = src->msg_info.n2d_nd_csicomp_state_info.csicomp_list;
+       while (src_csicomp != NULL) {
+               dst_csicomp = malloc(sizeof(AVSV_CSICOMP_STATE_MSG));
+               osafassert(dst_csicomp);
+
+               memcpy(dst_csicomp, src_csicomp, 
sizeof(AVSV_CSICOMP_STATE_MSG));
+               // insert at the start
+               dst_csicomp->next = 
dst->msg_info.n2d_nd_csicomp_state_info.csicomp_list;
+               dst->msg_info.n2d_nd_csicomp_state_info.csicomp_list = 
dst_csicomp;
+
+               // now go to the next csicomp info in source
+               src_csicomp = src_csicomp->next;
+       }
+
+       // COMP
+       src_comp = src->msg_info.n2d_nd_csicomp_state_info.comp_list;
+       while (src_comp != NULL) {
+               dst_comp = malloc(sizeof(AVSV_COMP_STATE_MSG));
+               osafassert(dst_comp);
+
+               memcpy(dst_comp, src_comp, sizeof(AVSV_COMP_STATE_MSG));
+               // insert at the start
+               dst_comp->next = 
dst->msg_info.n2d_nd_csicomp_state_info.comp_list;
+               dst->msg_info.n2d_nd_csicomp_state_info.comp_list = dst_comp;
+
+               // now go to the next comp info in source
+               src_comp = src_comp->next;
+       }
+
+       return NCSCC_RC_SUCCESS;
+}
+
 /****************************************************************************
   Name          : avsv_dnd_msg_free
  
@@ -283,6 +404,12 @@ void avsv_dnd_msg_free(AVSV_DND_MSG *msg
        case AVSV_D2N_PG_TRACK_ACT_RSP_MSG:
                free_d2n_pg_msg_info(msg);
                break;
+       case AVSV_N2D_ND_SISU_STATE_INFO_MSG:
+               avsv_free_n2d_nd_sisu_state_info(msg);
+               break;
+       case AVSV_N2D_ND_CSICOMP_STATE_INFO_MSG:
+               avsv_free_n2d_nd_csicomp_state_info(msg);
+               break;
        default:
                break;
        }
@@ -323,6 +450,10 @@ uint32_t avsv_dnd_msg_copy(AVSV_DND_MSG 
                return cpy_d2n_susi_msg(dmsg, smsg);
        case AVSV_D2N_PG_TRACK_ACT_RSP_MSG:
                return cpy_d2n_pg_msg(dmsg, smsg);
+       case AVSV_N2D_ND_SISU_STATE_INFO_MSG:
+               return cpy_n2d_nd_sisu_state_info(dmsg, smsg);
+       case AVSV_N2D_ND_CSICOMP_STATE_INFO_MSG:
+               return cpy_n2d_nd_csicomp_state_info(dmsg, smsg);
        default:
                /* copy only the contents */
                memcpy(dmsg, smsg, sizeof(AVSV_DND_MSG));
@@ -331,3 +462,138 @@ uint32_t avsv_dnd_msg_copy(AVSV_DND_MSG 
 
        return NCSCC_RC_SUCCESS;
 }
+/*****************************************************************************
+ * Function: avsv_free_n2d_nd_csicomp_state_info
+ *
+ * Purpose:  This function frees the n2d csi comp message contents.
+ *
+ * Input: msg - Pointer to the message contents to be freed.
+ *
+ * Returns: None
+ *
+ * NOTES: None
+ *
+ *
+ **************************************************************************/
+void avsv_free_n2d_nd_csicomp_state_info(AVSV_DND_MSG *msg)
+{
+       TRACE_ENTER();
+
+       AVSV_N2D_ND_CSICOMP_STATE_MSG_INFO *info = NULL;
+       AVSV_CSICOMP_STATE_MSG *csicomp_ptr = NULL;
+       AVSV_CSICOMP_STATE_MSG *next_csicomp_ptr = NULL;
+
+       AVSV_COMP_STATE_MSG *comp_ptr = NULL;
+       AVSV_COMP_STATE_MSG *next_comp_ptr = NULL;
+
+       if (msg == NULL)
+               goto done;
+
+       osafassert(msg->msg_type == AVSV_N2D_ND_CSICOMP_STATE_INFO_MSG);
+
+       info = &msg->msg_info.n2d_nd_csicomp_state_info;
+       osafassert(info);
+
+       // free CSICOMP stuff
+       csicomp_ptr = info->csicomp_list;
+
+       TRACE("%u CSICOMP records to free", info->num_csicomp);
+
+       while (csicomp_ptr != NULL) {
+               TRACE("freeing %s:%s", (char*)csicomp_ptr->safCSI.value, 
(char*)csicomp_ptr->safComp.value);
+               next_csicomp_ptr = csicomp_ptr->next;
+               free(csicomp_ptr);
+               csicomp_ptr = next_csicomp_ptr;
+       }
+
+       info->num_csicomp = 0;
+       info->csicomp_list = NULL;
+
+       // free COMP stuff
+       comp_ptr = info->comp_list;
+
+       TRACE("%u COMP records to free", info->num_comp);
+
+       while (comp_ptr != NULL) {
+               TRACE("freeing %s", (char*)comp_ptr->safComp.value);
+               next_comp_ptr = comp_ptr->next;
+               free(comp_ptr);
+               comp_ptr = next_comp_ptr;
+       }
+
+       info->num_comp = 0;
+       info->comp_list = NULL;
+
+done:
+       TRACE_LEAVE();
+
+}
+
+/*****************************************************************************
+ * Function: avsv_free_n2d_nd_sisu_state_info
+ *
+ * Purpose:  This function frees the n2d si su message contents.
+ *
+ * Input: msg - Pointer to the message contents to be freed.
+ *
+ * Returns: None
+ *
+ * NOTES: None
+ *
+ *
+ **************************************************************************/
+void avsv_free_n2d_nd_sisu_state_info(AVSV_DND_MSG *msg)
+{
+       TRACE_ENTER();
+
+       AVSV_N2D_ND_SISU_STATE_MSG_INFO *info = 
&msg->msg_info.n2d_nd_sisu_state_info;
+
+       AVSV_SISU_STATE_MSG *sisu_ptr = info->sisu_list;
+       AVSV_SISU_STATE_MSG *next_sisu_ptr = NULL;
+
+       AVSV_SU_STATE_MSG *su_ptr = info->su_list;
+       AVSV_SU_STATE_MSG *next_su_ptr = NULL;
+
+       if (msg == NULL)
+               goto done;
+
+       osafassert(msg->msg_type == AVSV_N2D_ND_SISU_STATE_INFO_MSG);
+
+       info = &msg->msg_info.n2d_nd_sisu_state_info;
+       osafassert(info);
+
+       // free SISU stuff
+       sisu_ptr = info->sisu_list;
+
+       TRACE("%u SISU records to free", info->num_sisu);
+
+       while (sisu_ptr != NULL) {
+               TRACE("freeing %s:%s", (char*)sisu_ptr->safSI.value, 
(char*)sisu_ptr->safSU.value);
+               next_sisu_ptr = sisu_ptr->next;
+               free(sisu_ptr);
+               sisu_ptr = next_sisu_ptr;
+       }
+
+       info->num_sisu = 0;
+       info->sisu_list = NULL;
+
+       // free SU stuff
+       su_ptr = info->su_list;
+
+       TRACE("%u SU records to free", info->num_su);
+
+       while (su_ptr != NULL) {
+               TRACE("freeing %s", (char*)su_ptr->safSU.value);
+               next_su_ptr = su_ptr->next;
+               free(su_ptr);
+               su_ptr = next_su_ptr;
+       }
+
+       info->num_su = 0;
+       info->su_list = NULL;
+
+done:
+       TRACE_LEAVE();
+}
+
+
diff --git a/osaf/libs/common/amf/include/Makefile.am 
b/osaf/libs/common/amf/include/Makefile.am
--- a/osaf/libs/common/amf/include/Makefile.am
+++ b/osaf/libs/common/amf/include/Makefile.am
@@ -27,5 +27,6 @@ noinst_HEADERS = \
    amf.h \
    amf_n2avaedu.h \
    amf_n2avamsg.h \
+   amf_si_assign.h \
    amf_util.h \
    amf_nd2ndmsg.h 
diff --git a/osaf/libs/common/amf/include/amf_d2nedu.h 
b/osaf/libs/common/amf/include/amf_d2nedu.h
--- a/osaf/libs/common/amf/include/amf_d2nedu.h
+++ b/osaf/libs/common/amf/include/amf_d2nedu.h
@@ -60,6 +60,22 @@ uint32_t avsv_edp_susi_asgn(EDU_HDL *hdl
                                  NCSCONTEXT ptr, uint32_t *ptr_data_len,
                                  EDU_BUF_ENV *buf_env, EDP_OP_TYPE op, EDU_ERR 
*o_err);
 
+uint32_t avsv_edp_sisu_state_info_msg(EDU_HDL *hdl, EDU_TKN *edu_tkn,
+                                  NCSCONTEXT ptr, uint32_t *ptr_data_len,
+                                  EDU_BUF_ENV *buf_env, EDP_OP_TYPE op, 
EDU_ERR *o_err);
+
+uint32_t avsv_edp_su_state_info_msg(EDU_HDL *hdl, EDU_TKN *edu_tkn,
+                                  NCSCONTEXT ptr, uint32_t *ptr_data_len,
+                                  EDU_BUF_ENV *buf_env, EDP_OP_TYPE op, 
EDU_ERR *o_err);
+
+uint32_t avsv_edp_csicomp_state_info_msg(EDU_HDL *hdl, EDU_TKN *edu_tkn,
+                                  NCSCONTEXT ptr, uint32_t *ptr_data_len,
+                                  EDU_BUF_ENV *buf_env, EDP_OP_TYPE op, 
EDU_ERR *o_err);
+
+uint32_t avsv_edp_comp_state_info_msg(EDU_HDL *hdl, EDU_TKN *edu_tkn,
+                                  NCSCONTEXT ptr, uint32_t *ptr_data_len,
+                                  EDU_BUF_ENV *buf_env, EDP_OP_TYPE op, 
EDU_ERR *o_err);
+
 int avsv_dnd_msg_test_type_fnc(NCSCONTEXT arg);
 
 #ifdef __cplusplus
diff --git a/osaf/libs/common/amf/include/amf_d2nmsg.h 
b/osaf/libs/common/amf/include/amf_d2nmsg.h
--- a/osaf/libs/common/amf/include/amf_d2nmsg.h
+++ b/osaf/libs/common/amf/include/amf_d2nmsg.h
@@ -49,6 +49,7 @@ extern "C" {
 #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 {
@@ -89,6 +90,10 @@ typedef enum {
        AVSV_D2N_ADMIN_OP_REQ_MSG,
        AVSV_D2N_HEARTBEAT_MSG,
        AVSV_D2N_REBOOT_MSG,
+       AVSV_D2D_CHANGE_ROLE_REQ, // to maintain backwards compatibility
+       AVSV_D2D_CHANGE_ROLE_RSP, // to maintain backwards compatibility
+       AVSV_N2D_ND_SISU_STATE_INFO_MSG,
+       AVSV_N2D_ND_CSICOMP_STATE_INFO_MSG,
        AVSV_DND_MSG_MAX
 } AVSV_DND_MSG_TYPE;
 
@@ -337,8 +342,10 @@ typedef enum {
 
 typedef struct avsv_n2d_node_up_msg_info_tag {
        uint32_t msg_id;
+       bool leds_set;
        SaClmNodeIdT node_id;
        MDS_DEST adest_address;
+       SaNameT node_name;
 } AVSV_N2D_NODE_UP_MSG_INFO;
 
 typedef struct avsv_n2d_comp_validation_msg_info_tag {
@@ -427,6 +434,54 @@ typedef struct avsv_n2d_verify_ack_nack_
        bool ack;
 } AVSV_N2D_VERIFY_ACK_NACK_MSG_INFO;
 
+typedef struct avsv_sisu_state_msg_tag {
+       SaNameT safSU;
+       SaNameT safSI;
+       SaAmfHAStateT saAmfSISUHAState;
+       struct avsv_sisu_state_msg_tag *next;
+} AVSV_SISU_STATE_MSG;
+
+typedef struct avsv_su_state_msg_tag {
+       SaNameT safSU;
+       uint32_t su_restart_cnt;
+       uint32_t su_pres_state;
+       uint32_t su_oper_state;
+       struct avsv_su_state_msg_tag *next;
+} AVSV_SU_STATE_MSG;
+
+typedef struct avsv_n2d_nd_sisu_state_msg_info_tag {
+       uint32_t msg_id;
+       SaClmNodeIdT node_id;
+       uint32_t num_sisu;
+       AVSV_SISU_STATE_MSG *sisu_list;
+       uint32_t num_su;
+       AVSV_SU_STATE_MSG *su_list;
+} AVSV_N2D_ND_SISU_STATE_MSG_INFO;
+
+typedef struct avsv_csicomp_state_msg_tag {
+       SaNameT safComp;
+       SaNameT safCSI;
+       SaAmfHAStateT saAmfCSICompHAState;
+       struct avsv_csicomp_state_msg_tag *next;
+} AVSV_CSICOMP_STATE_MSG;
+
+typedef struct avsv_comp_state_msg_tag {
+       SaNameT safComp;
+       uint32_t comp_restart_cnt;
+       uint32_t comp_pres_state;
+       uint32_t comp_oper_state;
+       struct avsv_comp_state_msg_tag *next;
+} AVSV_COMP_STATE_MSG;
+
+typedef struct avsv_n2d_nd_csicomp_state_msg_info_tag {
+       uint32_t msg_id;
+       SaClmNodeIdT node_id;
+       uint32_t num_csicomp;
+       AVSV_CSICOMP_STATE_MSG *csicomp_list;
+       uint32_t num_comp;
+       AVSV_COMP_STATE_MSG *comp_list;
+} AVSV_N2D_ND_CSICOMP_STATE_MSG_INFO;
+
 typedef struct avsv_d2n_node_up_msg_info_tag {
        SaClmNodeIdT node_id;
        AVSV_AVND_CARD node_type;
@@ -575,6 +630,8 @@ typedef struct avsv_dnd_msg {
                AVSV_N2D_VERIFY_ACK_NACK_MSG_INFO n2d_ack_nack_info;
                AVSV_N2D_SHUTDOWN_APP_SU_MSG_INFO n2d_shutdown_app_su;
                AVSV_N2D_COMP_VALIDATION_INFO n2d_comp_valid_info;
+               AVSV_N2D_ND_SISU_STATE_MSG_INFO n2d_nd_sisu_state_info;
+               AVSV_N2D_ND_CSICOMP_STATE_MSG_INFO n2d_nd_csicomp_state_info;
                AVSV_D2N_NODE_UP_MSG_INFO d2n_node_up;
                AVSV_D2N_REG_SU_MSG_INFO d2n_reg_su;
                AVSV_D2N_REG_COMP_MSG_INFO d2n_reg_comp;
@@ -622,6 +679,10 @@ typedef uint32_t (*AVSV_COPY_DND_MSG) (A
 void avsv_dnd_msg_free(AVSV_DND_MSG *);
 uint32_t avsv_dnd_msg_copy(AVSV_DND_MSG *, AVSV_DND_MSG *);
 
+void avsv_free_n2d_nd_csicomp_state_info(AVSV_DND_MSG *msg);
+void avsv_free_n2d_nd_sisu_state_info(AVSV_DND_MSG *msg);
+
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/osaf/libs/common/amf/include/amf_defs.h 
b/osaf/libs/common/amf/include/amf_defs.h
--- a/osaf/libs/common/amf/include/amf_defs.h
+++ b/osaf/libs/common/amf/include/amf_defs.h
@@ -60,6 +60,9 @@
 /* Default Heart beat duration */
 #define AVSV_DEF_HB_DURATION (60 * SA_TIME_ONE_SECOND)
 
+/* Default sync node duration */
+#define AVSV_DEF_NODE_SYNC_PERIOD (10 * SA_TIME_ONE_SECOND)
+
 typedef enum {
        AVSV_COMP_TYPE_INVALID,
        AVSV_COMP_TYPE_SA_AWARE,
diff --git a/osaf/libs/common/amf/include/amf_si_assign.h 
b/osaf/libs/common/amf/include/amf_si_assign.h
new file mode 100644
--- /dev/null
+++ b/osaf/libs/common/amf/include/amf_si_assign.h
@@ -0,0 +1,49 @@
+/*      -*- OpenSAF  -*-
+ *
+ * (C) Copyright 2016 The OpenSAF Foundation
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+/*****************************************************************************
+
+  DESCRIPTION:
+
+
+******************************************************************************
+*/
+
+#ifndef AMF_SI_ASSIGN_H
+#define AMF_SI_ASSIGN_H
+
+#include <string>
+#include <saAmf.h>
+
+struct SaAmfSIAssignment {
+       public:
+               SaNameT su;
+               SaNameT si;
+               SaAmfHAStateT saAmfSISUHAState;
+               uint32_t saAmfSISUHAReadinessState;
+};
+
+struct SaAmfCSIAssignment {
+       public:
+               SaNameT csi;
+               SaNameT comp;
+               SaAmfHAStateT saAmfCSICompHAState;
+               uint32_t saAmfCSICompHAReadinessState;
+};
+
+#endif /* AMF_SI_ASSIGN_H */
+

------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to