osaf/services/saf/amf/amfd/csiattr.cc | 2 + osaf/services/saf/amf/amfd/include/evt.h | 6 +++++ osaf/services/saf/amf/amfd/include/proc.h | 1 + osaf/services/saf/amf/amfd/main.cc | 13 ++++++++-- osaf/services/saf/amf/amfd/mds.cc | 30 +++++++++++++++--------- osaf/services/saf/amf/amfd/ndfsm.cc | 15 ++++++++++++ osaf/services/saf/amf/amfnd/comp.cc | 16 +++++++++++++ osaf/services/saf/amf/amfnd/evt.cc | 4 +++ osaf/services/saf/amf/amfnd/include/avnd_evt.h | 8 ++++++ osaf/services/saf/amf/amfnd/include/avnd_proc.h | 1 + osaf/services/saf/amf/amfnd/main.cc | 3 +- osaf/services/saf/amf/amfnd/mds.cc | 8 ++++-- 12 files changed, 89 insertions(+), 18 deletions(-)
Patch fixes the problem by posting local events to main process -In AMFD for nd version -In AMFND for amfa version. diff --git a/osaf/services/saf/amf/amfd/csiattr.cc b/osaf/services/saf/amf/amfd/csiattr.cc --- a/osaf/services/saf/amf/amfd/csiattr.cc +++ b/osaf/services/saf/amf/amfd/csiattr.cc @@ -509,6 +509,8 @@ static void csiattr_change_send_msg(AVD_ compcsi = compcsi->csi_csicomp_next) { auto it = nds_mds_ver_db.find(compcsi->comp->su->su_on_node->node_info.nodeId); + if (it == nds_mds_ver_db.end()) + continue; //Check if this amfnd is capable of this functionality. if (it->second < AVSV_AVD_AVND_MSG_FMT_VER_7) { TRACE_3("not sending to '%s' on :%x with mds version:'%u'", diff --git a/osaf/services/saf/amf/amfd/include/evt.h b/osaf/services/saf/amf/amfd/include/evt.h --- a/osaf/services/saf/amf/amfd/include/evt.h +++ b/osaf/services/saf/amf/amfd/include/evt.h @@ -70,14 +70,20 @@ typedef enum avd_evt_type { AVD_EVT_ASSIGN_SI_DEP_STATE, AVD_IMM_REINITIALIZED, AVD_EVT_UNASSIGN_SI_DEP_STATE, + AVD_EVT_ND_MDS_VER_INFO, AVD_EVT_MAX } AVD_EVT_TYPE; +struct AVD_EVT_ND_MDS_INFO { + SaClmNodeIdT node_id; + MDS_SVC_PVT_SUB_PART_VER mds_version; +}; union AVD_EVT_INFO { AVD_DND_MSG *avnd_msg; AVD_D2D_MSG *avd_msg; SaClmNodeIdT node_id; AVD_TMR tmr; + AVD_EVT_ND_MDS_INFO nd_mds_info; AVD_EVT_INFO() {new(&tmr) AVD_TMR();} ~AVD_EVT_INFO() {tmr.~AVD_TMR();} }; diff --git a/osaf/services/saf/amf/amfd/include/proc.h b/osaf/services/saf/amf/amfd/include/proc.h --- a/osaf/services/saf/amf/amfd/include/proc.h +++ b/osaf/services/saf/amf/amfd/include/proc.h @@ -79,6 +79,7 @@ void avd_node_down_mw_susi_failover(AVD_ void avd_node_down_func(AVD_CL_CB *cb, AVD_AVND *avnd); void avd_nd_sisu_state_info_evh(AVD_CL_CB *cb, struct AVD_EVT *evt); void avd_nd_compcsi_state_info_evh(AVD_CL_CB *cb, struct AVD_EVT *evt); +void avd_avnd_mds_info_evh(AVD_CL_CB *cb, AVD_EVT *evt); uint32_t avd_node_down(AVD_CL_CB *cb, SaClmNodeIdT node_id); AVD_AVND *avd_msg_sanity_chk(AVD_EVT *evt, SaClmNodeIdT node_id, AVSV_DND_MSG_TYPE msg_typ, uint32_t msg_id); diff --git a/osaf/services/saf/amf/amfd/main.cc b/osaf/services/saf/amf/amfd/main.cc --- a/osaf/services/saf/amf/amfd/main.cc +++ b/osaf/services/saf/amf/amfd/main.cc @@ -123,7 +123,8 @@ static const AVD_EVT_HDLR g_actv_list[AV avd_role_switch_ncs_su_evh, /* AVD_EVT_SWITCH_NCS_SU */ avd_sidep_assign_evh, /* AVD_EVT_ASSIGN_SI_DEP_STATE */ invalid_evh, /* AVD_EVT_INVALID */ - avd_sidep_unassign_evh /* AVD_EVT_UNASSIGN_SI_DEP_STATE */ + avd_sidep_unassign_evh, /* AVD_EVT_UNASSIGN_SI_DEP_STATE */ + avd_avnd_mds_info_evh, /* AVD_EVT_ND_MDS_VER_INFO*/ }; /* list of all the function pointers related to handling the events @@ -164,7 +165,10 @@ static const AVD_EVT_HDLR g_stndby_list[ /* Role change Event processing */ avd_role_change_evh, /* AVD_EVT_ROLE_CHANGE */ standby_invalid_evh, /* AVD_EVT_SWITCH_NCS_SU */ - standby_invalid_evh /* AVD_EVT_SI_DEP_STATE */ + standby_invalid_evh, /* AVD_EVT_ASSIGN_SI_DEP_STATE*/ + standby_invalid_evh, /* AVD_EVT_INVALID */ + standby_invalid_evh, /* AVD_EVT_UNASSIGN_SI_DEP_STATE*/ + avd_avnd_mds_info_evh /* AVD_EVT_ND_MDS_VER_INFO*/ }; /* list of all the function pointers related to handling the events @@ -205,7 +209,10 @@ static const AVD_EVT_HDLR g_quiesc_list[ /* Role change Event processing */ avd_role_change_evh, /* AVD_EVT_ROLE_CHANGE */ qsd_invalid_evh, /* AVD_EVT_SWITCH_NCS_SU */ - qsd_invalid_evh /* AVD_EVT_TMR_SI_DEP_TOL */ + qsd_invalid_evh, /* AVD_EVT_TMR_SI_DEP_TOL */ + qsd_invalid_evh, /* AVD_EVT_INVALID */ + qsd_invalid_evh, /* AVD_EVT_UNASSIGN_SI_DEP_STATE*/ + avd_avnd_mds_info_evh /* AVD_EVT_ND_MDS_VER_INFO*/ }; /***************************************************************************** diff --git a/osaf/services/saf/amf/amfd/mds.cc b/osaf/services/saf/amf/amfd/mds.cc --- a/osaf/services/saf/amf/amfd/mds.cc +++ b/osaf/services/saf/amf/amfd/mds.cc @@ -419,18 +419,27 @@ static uint32_t avd_mds_svc_evt(MDS_CALL break; case NCSMDS_SVC_ID_AVND: - if (evt_info->i_node_id == cb->node_id_avd) { - AVD_EVT *evt = new AVD_EVT(); - - evt->rcv_evt = AVD_EVT_MDS_AVND_UP; - cb->local_avnd_adest = evt_info->i_dest; - if (m_NCS_IPC_SEND(&cb->avd_mbx, evt, NCS_IPC_PRIORITY_HIGH) != NCSCC_RC_SUCCESS) { + { + if (evt_info->i_node_id == cb->node_id_avd) { + AVD_EVT *evt = new AVD_EVT(); + + evt->rcv_evt = AVD_EVT_MDS_AVND_UP; + cb->local_avnd_adest = evt_info->i_dest; + if (m_NCS_IPC_SEND(&cb->avd_mbx, evt, NCS_IPC_PRIORITY_HIGH) != NCSCC_RC_SUCCESS) { + LOG_ER("%s: ncs_ipc_send failed", __FUNCTION__); + delete evt; + } + } + //Post MDS version info to mailbox. + AVD_EVT *evt1 = new AVD_EVT(); + evt1->rcv_evt = AVD_EVT_ND_MDS_VER_INFO; + evt1->info.nd_mds_info.mds_version = evt_info->i_rem_svc_pvt_ver; + evt1->info.nd_mds_info.node_id = m_NCS_NODE_ID_FROM_MDS_DEST(evt_info->i_dest); + if (m_NCS_IPC_SEND(&cb->avd_mbx, evt1, NCS_IPC_PRIORITY_HIGH) != NCSCC_RC_SUCCESS) { LOG_ER("%s: ncs_ipc_send failed", __FUNCTION__); - delete evt; + delete evt1; } - } - nds_mds_ver_db[evt_info->i_node_id] = evt_info->i_rem_svc_pvt_ver; - + } break; default: @@ -451,7 +460,6 @@ static uint32_t avd_mds_svc_evt(MDS_CALL case NCSMDS_SVC_ID_AVND: { AVD_EVT *evt = new AVD_EVT(); - nds_mds_ver_db.erase(evt_info->i_node_id); evt->rcv_evt = AVD_EVT_MDS_AVND_DOWN; evt->info.node_id = m_NCS_NODE_ID_FROM_MDS_DEST(evt_info->i_dest); TRACE("avnd %" PRIx64 " down", evt_info->i_dest); diff --git a/osaf/services/saf/amf/amfd/ndfsm.cc b/osaf/services/saf/amf/amfd/ndfsm.cc --- a/osaf/services/saf/amf/amfd/ndfsm.cc +++ b/osaf/services/saf/amf/amfd/ndfsm.cc @@ -650,6 +650,9 @@ void avd_mds_avnd_down_evh(AVD_CL_CB *cb AVD_AVND *node = avd_node_find_nodeid(evt->info.node_id); TRACE_ENTER2("%x, %p", evt->info.node_id, node); + + //update MDS version db. + nds_mds_ver_db.erase(evt->info.node_id); if (node != nullptr) { // Do nothing if the local node goes down. Most likely due to system shutdown. @@ -1021,3 +1024,15 @@ void avd_tmr_snd_hb_evh(AVD_CL_CB *cb, A TRACE_LEAVE(); } +/** + * @brief This event is for remembering MDS version for AMFND. + * @param ptr to AVD_CL_CB + * @param ptr to AVD_EVT + */ +void avd_avnd_mds_info_evh(AVD_CL_CB *cb, AVD_EVT *evt) { + TRACE_ENTER2("MDS version:%d, nodeid:%x", + evt->info.nd_mds_info.mds_version, evt->info.nd_mds_info.node_id); + nds_mds_ver_db[evt->info.nd_mds_info.node_id] = evt->info.nd_mds_info.mds_version; + TRACE_LEAVE(); +} + 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 @@ -395,6 +395,8 @@ uint32_t avnd_evt_mds_ava_dn_evh(AVND_CB TRACE_ENTER(); + //update MDS version db. + agent_mds_ver_db.erase(mds_evt->mds_dest); /* get the matching registered comp (if any) */ for (comp = avnd_compdb_rec_get_next(cb->compdb, ""); comp != nullptr; @@ -3001,3 +3003,17 @@ void avnd_amf_pxied_comp_clean_cbk_fill( osaf_extended_name_alloc(cn.c_str(), &cbk->param.comp_term.comp_name); } +/** + * @brief This event is for remembering MDS dest and version of agent. + * @param ptr to AVND_CB + * @param ptr to AVND_EVT + * @return uint32_t + */ +uint32_t avnd_amfa_mds_info_evh(AVND_CB *cb, AVND_EVT *evt) { + TRACE_ENTER2("mds_dest :%lu, MDS version:%d", + evt->info.amfa_mds_info.mds_dest, evt->info.amfa_mds_info.mds_version); + agent_mds_ver_db[evt->info.amfa_mds_info.mds_dest] = evt->info.amfa_mds_info.mds_version; + TRACE_LEAVE(); + return NCSCC_RC_SUCCESS; +} + 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 @@ -183,6 +183,8 @@ AVND_EVT *avnd_evt_create(AVND_CB *cb, evt->info.pm_evt.pm_rec = (AVND_COMP_PM_REC *)info; break; + case AVND_EVT_AMFA_MDS_VER_INFO: + break; default: delete evt; evt = nullptr; @@ -312,6 +314,8 @@ void avnd_evt_destroy(AVND_EVT *evt) case AVND_EVT_IR: osaf_extended_name_free(&evt->info.ir_evt.su_name); break; + case AVND_EVT_AMFA_MDS_VER_INFO: + break; default: LOG_NO("%s: unknown event type %u", __FUNCTION__, type); 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 @@ -112,6 +112,7 @@ typedef enum avnd_evt_type { AVND_EVT_PID_EXIT, AVND_EVT_TMR_QSCING_CMPL, AVND_EVT_IR, + AVND_EVT_AMFA_MDS_VER_INFO, AVND_EVT_MAX } AVND_EVT_TYPE; @@ -164,6 +165,12 @@ typedef struct avnd_ir_evt { bool status; /* Result of Imm read, true is succ. */ } AVND_IR_EVT; +struct AVND_EVT_AMFA_MDS_INFO { + MDS_DEST mds_dest; + MDS_SVC_PVT_SUB_PART_VER mds_version; +}; + + /* AVND top-level event structure */ typedef struct avnd_evt_tag { struct avnd_evt_tag *next; @@ -183,6 +190,7 @@ typedef struct avnd_evt_tag { AVND_COMP_FSM_EVT comp_fsm; AVND_PM_MON_EVT pm_evt; AVND_IR_EVT ir_evt; + AVND_EVT_AMFA_MDS_INFO amfa_mds_info; } info; } AVND_EVT; diff --git a/osaf/services/saf/amf/amfnd/include/avnd_proc.h b/osaf/services/saf/amf/amfnd/include/avnd_proc.h --- a/osaf/services/saf/amf/amfnd/include/avnd_proc.h +++ b/osaf/services/saf/amf/amfnd/include/avnd_proc.h @@ -117,5 +117,6 @@ uint32_t avnd_evt_avd_hb_evh(struct avnd uint32_t avnd_evt_tmr_avd_hb_duration_evh(struct avnd_cb_tag *, struct avnd_evt_tag *); uint32_t avnd_evt_tmr_sc_absence_evh(struct avnd_cb_tag *, struct avnd_evt_tag *); uint32_t avnd_evt_avd_reboot_evh(struct avnd_cb_tag *, struct avnd_evt_tag *); +uint32_t avnd_amfa_mds_info_evh(struct avnd_cb_tag *, struct avnd_evt_tag *); #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 @@ -120,7 +120,8 @@ extern const AVND_EVT_HDLR g_avnd_func_l avnd_evt_last_step_term_evh, /* AVND_EVT_LAST_STEP_TERM */ avnd_evt_pid_exit_evh, /* AVND_EVT_PID_EXIT */ avnd_evt_tmr_qscing_cmpl_evh, /* AVND_EVT_TMR_QSCING_CMPL */ - avnd_evt_ir_evh /* AVND_EVT_IR */ + avnd_evt_ir_evh, /* AVND_EVT_IR */ + avnd_amfa_mds_info_evh /* AVND_EVT_AMFA_MDS_VER_INFO*/ }; extern struct ImmutilWrapperProfile immutilWrapperProfile; 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 @@ -557,8 +557,11 @@ uint32_t avnd_mds_svc_evt(AVND_CB *cb, M break; 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; + //Post MDS info of the agent. + evt = avnd_evt_create(cb, AVND_EVT_AMFA_MDS_VER_INFO, 0, &evt_info->i_dest, 0, 0, 0); + evt->info.amfa_mds_info.mds_dest = evt_info->i_dest; + evt->info.amfa_mds_info.mds_version= evt_info->i_rem_svc_pvt_ver; + break; case NCSMDS_SVC_ID_AVND: @@ -605,7 +608,6 @@ 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; ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel