OpenSS7
SS7 for the
Common Man

© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved.
Last modified:

Home Overview Status News Documentation Resources About
   
 Overview
 Status
 News
 Documentation
 Resources
 About

   
Home Index Prev Next More Download Info FAQ Mail   Home -> Resources -> Browse Source -> strss7/drivers/slsi/sls_hmdc.h


File /code/strss7/drivers/slsi/sls_hmdc.h



#ident "@(#) $Id: sls_hmdc.h,v 0.8.2.1 2002/10/18 02:40:37 brian Exp $"

#ifndef __SLS_HMDC_H__
#define __SLS_HMDC_H__

/*
 *  This is the Signalling Link Set version of the HMDC state machine.  If the
 *  message is a management message which can be handled by the link set state
 *  machines it is handled here.  Otherwise, the message is forwarded to the
 *  MTP state machines.  In any case, the message is decoded to the extent
 *  that it can be determined whether the message is a management or user part
 *  message.  No other parsing of the received message is necessary.  If the
 *  message is passed on to the MTP for further discrimination, it is passed
 *  already parsed.
 */

static inline void mtp_hmdt_message_for_distribution(ls_t * ls, mblk_t * mp)
{
	mp->b_data->db_type = M_PROTO;
	*((ls_ulong *) mp->b_rptr) = LS_HMDT_MESSAGE_FOR_DISTRIBUTION_IND;
	putq(ls->rq, mp);
	return;
}

static inline void ls_hmrt_message_for_routing(ls_t * ls, mblk_t * mp)
{
	mp->b_data->db_type = M_PROTO;
	*((ls_ulong *) mp->b_rptr) = LS_HMRT_MESSAGE_FOR_ROUTING_IND;
	putq(ls->rq, mp);
	return;
}

static inline void ls_hmdt_message_for_distribution(lk_t * lk, mblk_t * mp)
{
	ls_t *ls = lk->module;
	union LS_primitives *p = (union LS_primitives *) mp->b_rptr;
	if (ls->statem.own_sp_restart) {
		swtich(p->sig.signal) {
case LS_SIGNAL_TFP:
case LS_SIGNAL_TFR:
case LS_SIGNAL_TFA:
case LS_SIGNAL_TRA:
case LS_SIGNAL_SLTM:
case LS_SIGNAL_SLTA:
case LS_SIGNAL_SSLTM:
case LS_SIGNAL_SSLTA:
			break;
default:
			/* discard all other messages while restarting */
			freemsg(mp);
			return;
		}
	}
	switch (p->sig.signal) {
	case LS_SIGNAL_COO:
	case LS_SIGNAL_COA:
	case LS_SIGNAL_CBD:
	case LS_SIGNAL_CBA:
	case LS_SIGNAL_ECO:
	case LS_SIGNAL_ECA:
		if (p->sig.mh.opc != ls->config.apc) {
			/* sender is not adjacent, not for us, for another linkset */
			mtp_hmdt_message_for_distribution(ls, mp);
			return;
		}
		switch (p->sig.signal) {
		case LS_SIGNAL_COO:
			ls_tcoc_changeover_order(ls, mp);
			break;
		case LS_SIGNAL_COA:
			ls_tcoc_changeover_ack(ls, mp);
			break;
		case LS_SIGNAL_CBD:
			lk_tcbc_changeback_declaration(ls, mp);
			break;
		case LS_SIGNAL_CBA:
			lk_tcbc_changeback_ack(ls, mp);
			break;
		case LS_SIGNAL_ECO:
			ls_tcoc_emergency_changeover_order(ls, mp);
			break;
		case LS_SIGNAL_ECA:
			ls_tcoc_emergency_changeover_ack(ls, mp);
			break;
		}
		break;
	case LS_SIGNAL_SLTM:
	case LS_SIGNAL_SLTA:
	case LS_SIGNAL_SSLTM:
	case LS_SIGNAL_SSLTA:
		if (p->sig.mh.opc != ls->config.apc) {
			/* sender is not adjacent, not for us, for another linkset */
			/* this is an error, perhaps we should log it */
			freemsg(mp);
			return;
		}
		switch (p->sig.signal) {
		case LS_SIGNAL_SLTM:
			lk_sltc_signalling_link_test_msg(lk, mp);
			break;
		case LS_SIGNAL_SLTA:
			lk_sltc_signalling_link_test_ack(lk, mp);
			break;
		case LS_SIGNAL_SSLTM:
			lk_sltc_signalling_link_test_msg_special(lk, mp);
			break;
		case LS_SIGNAL_SSLTA:
			lk_sltc_signalling_link_test_ack_special(lk, mp);
			break;
		}
		break;
	case LS_SIGNAL_LIN:
	case LS_SIGNAL_LIA:
	case LS_SIGNAL_LUN:
	case LS_SIGNAL_LUA:
	case LS_SIGNAL_LID:
	case LS_SIGNAL_LFU:
	case LS_SIGNAL_LLI:
	case LS_SIGNAL_LRI:
		if (p->sig.mh.opc != ls->config.apc) {
			/* sender is not adjacent, not for us, for another linkset */
			mtp_hmdt_message_for_distribution(ls, mp);
			return;
		}
		switch (p->sig.signal) {
		case LS_SIGNAL_LIN:
			lk_tlac_remote_inhibit_signalling_link(lk, mp);
			break;
		case LS_SIGNAL_LIA:
			lk_tlac_inhibit_ack(lk, mp);
			break;
		case LS_SIGNAL_LUN:
			lk_tlac_remote_uninhibit_signalling_link(lk, mp);
			break;
		case LS_SIGNAL_LUA:
			lk_tlac_unihibit_ack(lk, mp);
			break;
		case LS_SIGNAL_LID:
			lk_tlac_local_inhibit_denied(lk, mp);
			break;
		case LS_SIGNAL_LFU:
			lk_tlac_force_unihibit_signalling_link(lk, mp);
			break;
		case LS_SIGNAL_LLI:
			lk_tlac_local_inhibit_test(lk, mp);
			break;
		case LS_SIGNAL_LRI:
			lk_tlac_remote_inhibit_test(lk, mp);
			break;
		}
		break;
	case LS_SIGNAL_DLC:
	case LS_SIGNAL_CSS:
	case LS_SIGNAL_CNS:
	case LS_SIGNAL_CNP:
		if (p->sig.mh.opc != ls->config.apc) {
			/* sender is not adjacent, not for us, for another linkset */
			mtp_hmdt_message_for_distribution(ls, mp);
			return;
		}
		switch (p->sig.signal) {
		case LS_SIGNAL_DLC:
			lk_lsda_signalling_data_link_connection_order(lk, mp);
			break;
		case LS_SIGNAL_CSS:
			lk_lsda_connection_successful(lk, mp);
			break;
		case LS_SIGNAL_CNS:
			lk_lsda_connection_not_successful(lk, mp);
			break;
		case LS_SIGNAL_CNP:
			lk_lsda_connection_not_possible(lk, mp);
			break;
		}
		break;
	case LS_SIGNAL_TFC:
	case LS_SIGNAL_RCT:
	case LS_SIGNAL_TFP:
	case LS_SIGNAL_TFR:
	case LS_SIGNAL_TFA:
	case LS_SIGNAL_RSP:
	case LS_SIGNAL_RSR:
	case LS_SIGNAL_RCP:
	case LS_SIGNAL_RCR:
	case LS_SIGNAL_UPU:
	case LS_SIGNAL_TRA:
	case LS_SIGNAL_TRW:
	case LS_SIGNAL_USER:
		mtp_hmdt_message_for_distribution(ls, mp);
		break;
	default:
		freemsg(mp);	/* should be logged */
		return;
	}
}

/*
 *  Consistent with:
 *
 *      Signalling Message Handling (SMH)
 *      Message Discrimination (HMDC)
 *      Figure 24/Q.704
 *      Figure 24/T1.111.4
 */

static inline void ls_hmdc_received_message(lk_t * lk, mblk_t * mp)
{
	union LS_primitives *p;
	ls_t *ls = lk->module;

	if (ls_parse_msu(ls, mp)) {	/* completely parses management messages */
		/* discard if parse fails - we may want to log or report this later */
		freemsg(mp);
		return;
	}
	p = (union LS_primitives *) mp->b_rptr;
	if (ls->config.lpc == p->sig.mh.dpc)
		ls_hmdt_message_for_distribution(lk, mp);
	else {
		if (ls->statem.own_sp_restart) {
			/* discard message during sp restart */
			freemsg(mp);
			return;
		} else
			ls_hmrt_message_for_routing(ls, mp);
	}

}

#endif				/* __SLS_HMDC_H__ */


Home Index Prev Next More Download Info FAQ Mail   Home -> Resources -> Browse Source -> strss7/drivers/slsi/sls_hmdc.h

OpenSS7
SS7 for the
Common Man
Home Overview Status News Documentation Resources About

© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved.
Last modified: