/**************************************************************************** Name : avnd_mds_svc_evt Description : This routine is invoked to inform AvND of MDS events. AvND had subscribed to these events during MDS registration. Arguments : cb - ptr to the AvND control block evt_info - ptr to the MDS event info Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE Notes : None. ******************************************************************************/ uns32 avnd_mds_svc_evt(AVND_CB *cb, MDS_CALLBACK_SVC_EVENT_INFO *evt_info) { AVND_EVT *evt = 0; uns32 rc = NCSCC_RC_SUCCESS; /* assign mds-dest for AVD, AVND & AVA as per the MDS event */ switch (evt_info->i_change) { case NCSMDS_UP: switch (evt_info->i_svc_id) { case NCSMDS_SVC_ID_AVD: /* create the mds event */ evt = avnd_evt_create(cb, AVND_EVT_MDS_AVD_UP, 0, &evt_info->i_dest, 0, 0, 0); break; case NCSMDS_SVC_ID_AVA: /* New AvA has come up. Dont do anything now */ break; case NCSMDS_SVC_ID_AVND: /* New AVND has come up. Update NODE_ID to MDS_DEST */ /* Validate whether this is a ADEST or VDEST */ if (!m_MDS_DEST_IS_AN_ADEST(evt_info->i_dest)) { return rc; } /* Create the mds event. if(evt_info->i_dest != cb->avnd_dest) Store its own dest id also. This is useful in Proxy at Ctrl registering external component. */ evt = avnd_evt_create(cb, AVND_EVT_MDS_AVND_UP, 0, &evt_info->i_dest, 0, 0, 0); break; case NCSMDS_SVC_ID_AVND_CNTLR: /* This is a VDEST. Store it for use in sending ext comp req to this Vdest. This Vdest is of Contr AvND hosting ext comp. */ /* Validate whether this is a ADEST or VDEST */ if (m_MDS_DEST_IS_AN_ADEST(evt_info->i_dest)) { return rc; } cb->cntlr_avnd_vdest = evt_info->i_dest; return rc; break; default: assert(0); } break; case NCSMDS_DOWN: switch (evt_info->i_svc_id) { case NCSMDS_SVC_ID_AVD: /* Supervise our node local director */ if (evt_info->i_node_id == ncs_get_node_id()) opensaf_reboot(avnd_cb->node_info.nodeId, (char *)avnd_cb->node_info.executionEnvironment.value, "AMF director unexpectedly crasched"); /* Validate whether this is a ADEST or VDEST */ if (m_MDS_DEST_IS_AN_ADEST(evt_info->i_dest)) return rc; /* reset the avd mds-dest */ memset(&cb->avd_dest, 0, sizeof(MDS_DEST)); /* create the mds event */ evt = avnd_evt_create(cb, AVND_EVT_MDS_AVD_DN, 0, &evt_info->i_dest, 0, 0, 0); LOG_ER("Controller node not available"); break; case NCSMDS_SVC_ID_AVA: /* create the mds event */ evt = avnd_evt_create(cb, AVND_EVT_MDS_AVA_DN, 0, &evt_info->i_dest, 0, 0, 0); break; case NCSMDS_SVC_ID_AVND: /* New AVND has come up. Update NODE_ID to MDS_DEST */ /* Validate whether this is a ADEST or VDEST */ if (!m_MDS_DEST_IS_AN_ADEST(evt_info->i_dest)) return rc; /* Create the mds event. if(evt_info->i_dest != cb->avnd_dest) Store its own dest id also. This is useful in Proxy at Ctrl registering external component. */ evt = avnd_evt_create(cb, AVND_EVT_MDS_AVND_DN, 0, &evt_info->i_dest, 0, 0, 0); break; case NCSMDS_SVC_ID_AVND_CNTLR: break; default: assert(0); } break; default: break; } /* send the event */ if (evt) rc = avnd_evt_send(cb, evt); /* if failure, free the event */ if (NCSCC_RC_SUCCESS != rc && evt) avnd_evt_destroy(evt); return rc; }
/**************************************************************************** * Name : fm_mds_svc_evt * * Description : Function to process MDS service/control events. * * Arguments : pointer to FM CB & MDS_CALLBACK_SVC_EVENT_INFO * * Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE * * Notes : None. *****************************************************************************/ static uint32_t fm_mds_svc_evt(FM_CB *cb, MDS_CALLBACK_SVC_EVENT_INFO *svc_evt) { uint32_t return_val = NCSCC_RC_SUCCESS; FM_EVT *fm_evt; TRACE_ENTER(); if (NULL == svc_evt) { syslog(LOG_INFO, "fm_mds_svc_evt: svc_evt NULL."); return NCSCC_RC_FAILURE; } switch (svc_evt->i_change) { case NCSMDS_DOWN: switch(svc_evt->i_svc_id) { /* Depend on service downs if OpenSAF is not controling TIPC */ case NCSMDS_SVC_ID_GFM: if (svc_evt->i_node_id == cb->peer_node_id) { cb->peer_adest = 0; if (!cb->control_tipc) { fm_send_svc_down_to_mbx(cb, svc_evt->i_node_id, svc_evt->i_svc_id); } } break; case NCSMDS_SVC_ID_IMMND: if (svc_evt->i_node_id == cb->peer_node_id && !cb->control_tipc) { fm_send_svc_down_to_mbx(cb, svc_evt->i_node_id, svc_evt->i_svc_id); } break; case NCSMDS_SVC_ID_AVND: if (svc_evt->i_node_id == cb->peer_node_id && !cb->control_tipc) { fm_send_svc_down_to_mbx(cb, svc_evt->i_node_id, svc_evt->i_svc_id); } break; default: TRACE("Not interested in service down of other services"); break; } break; case NCSMDS_RED_DOWN: switch (svc_evt->i_svc_id) { /* Depend on service downs if OpenSAF is not controling TIPC */ case NCSMDS_SVC_ID_IMMD: if (svc_evt->i_node_id == cb->peer_node_id && !cb->control_tipc) { fm_send_svc_down_to_mbx(cb, svc_evt->i_node_id, svc_evt->i_svc_id); } break; case NCSMDS_SVC_ID_AVD: if (svc_evt->i_node_id == cb->peer_node_id && !cb->control_tipc) { fm_send_svc_down_to_mbx(cb, svc_evt->i_node_id, svc_evt->i_svc_id); } break; default: TRACE("Not interested in service down of other services"); break; } break; case NCSMDS_UP: switch (svc_evt->i_svc_id) { case NCSMDS_SVC_ID_GFM: if ((svc_evt->i_node_id != cb->node_id) && (m_MDS_DEST_IS_AN_ADEST(svc_evt->i_dest) == true)) { fm_evt = m_MMGR_ALLOC_FM_EVT; if (NULL == fm_evt) { syslog(LOG_INFO, "fm_mds_svc_evt: fm_evt allocation FAILED."); return NCSCC_RC_FAILURE; } cb->peer_adest = svc_evt->i_dest; cb->peer_node_id = svc_evt->i_node_id; return_val = fm_fill_mds_evt_post_fm_mbx(cb, fm_evt, cb->peer_node_id, FM_EVT_PEER_UP); if (NCSCC_RC_FAILURE == return_val) { m_MMGR_FREE_FM_EVT(fm_evt); fm_evt = NULL; } } break; case NCSMDS_SVC_ID_IMMND: if (svc_evt->i_node_id == cb->peer_node_id && !cb->control_tipc) cb->immnd_down = false; /* Only IMMND is restartable */ break; default: break; } break; default: syslog(LOG_INFO, "Wrong MDS event"); break; } TRACE_LEAVE(); return return_val; }