Example #1
0
/****************************************************************************
  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;
}
Example #2
0
/****************************************************************************
* 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;
}